<?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-30166624</id><updated>2012-01-20T08:37:38.481-08:00</updated><category term='Python'/><category term='information economics'/><category term='Twitter'/><category term='Hosting'/><category term='Programmable web'/><category term='Visualization'/><category term='Ruby'/><category term='Javascript'/><category term='ORM'/><category term='AIR'/><category term='Mac'/><category term='Processing'/><category term='Databases'/><category term='Windows'/><category term='SQLite'/><category term='Google Gears'/><category term='Middleware'/><category term='Postgres'/><category term='API'/><category term='Widgets'/><category term='HealthVault'/><title type='text'>Julian @ Thales</title><subtitle type='html'>My thoughts and experiments on various computing topics. Thales used to be my domain name, I might yet resurrect it someday.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://connectedsystems.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30166624/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://connectedsystems.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/30166624/posts/default?start-index=101&amp;max-results=100'/><author><name>Razvan</name><uri>http://www.blogger.com/profile/01478237694157411648</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp1.blogger.com/_oKO4lXYJzFQ/SD-O3vBCSZI/AAAAAAAAACw/rLUH4XNTr8A/S220/rjp.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>136</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-30166624.post-7092399043528936580</id><published>2012-01-20T07:00:00.000-08:00</published><updated>2012-01-20T08:37:38.495-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Programmable web'/><category scheme='http://www.blogger.com/atom/ns#' term='API'/><category scheme='http://www.blogger.com/atom/ns#' term='Databases'/><title type='text'>Database.com</title><content type='html'>&lt;span style="font-family:georgia;"&gt;I have started using &lt;/span&gt;&lt;a style="font-family: georgia;" href="http://www.database.com/"&gt;database.com&lt;/a&gt;&lt;span style="font-family:georgia;"&gt;. Although the authentication (from Apex Data Loader) is a pain, I have to say I am quite impressed with how powerful the platform is. A couple of quick thoughts, and I will soon have more I hope, as I just started developing an application using it:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;ul style="font-family: georgia;"&gt;&lt;li&gt;interesting to see how many of the features (value and display lists, row id references) are similar to (for example) Cach&lt;!--[if gte mso 9]&gt;&lt;xml&gt;  &lt;w:worddocument&gt;   &lt;w:view&gt;Normal&lt;/w:View&gt;   &lt;w:zoom&gt;0&lt;/w:Zoom&gt;   &lt;w:trackmoves/&gt;   &lt;w:trackformatting/&gt;   &lt;w:punctuationkerning/&gt;   &lt;w:validateagainstschemas/&gt;   &lt;w:saveifxmlinvalid&gt;false&lt;/w:SaveIfXMLInvalid&gt;   &lt;w:ignoremixedcontent&gt;false&lt;/w:IgnoreMixedContent&gt;   &lt;w:alwaysshowplaceholdertext&gt;false&lt;/w:AlwaysShowPlaceholderText&gt;   &lt;w:donotpromoteqf/&gt;   &lt;w:lidthemeother&gt;EN-US&lt;/w:LidThemeOther&gt;   &lt;w:lidthemeasian&gt;X-NONE&lt;/w:LidThemeAsian&gt;   &lt;w:lidthemecomplexscript&gt;X-NONE&lt;/w:LidThemeComplexScript&gt;   &lt;w:compatibility&gt;    &lt;w:breakwrappedtables/&gt;    &lt;w:snaptogridincell/&gt;    &lt;w:wraptextwithpunct/&gt;    &lt;w:useasianbreakrules/&gt;    &lt;w:dontgrowautofit/&gt;    &lt;w:splitpgbreakandparamark/&gt;    &lt;w:dontvertaligncellwithsp/&gt;    &lt;w:dontbreakconstrainedforcedtables/&gt;    &lt;w:dontvertalignintxbx/&gt;    &lt;w:word11kerningpairs/&gt;    &lt;w:cachedcolbalance/&gt;   &lt;/w:Compatibility&gt;   &lt;w:browserlevel&gt;MicrosoftInternetExplorer4&lt;/w:BrowserLevel&gt;   &lt;m:mathpr&gt;    &lt;m:mathfont val="Cambria Math"&gt;    &lt;m:brkbin val="before"&gt;    &lt;m:brkbinsub val="&amp;#45;-"&gt;    &lt;m:smallfrac val="off"&gt;    &lt;m:dispdef/&gt;    &lt;m:lmargin val="0"&gt;    &lt;m:rmargin val="0"&gt;    &lt;m:defjc val="centerGroup"&gt;    &lt;m:wrapindent val="1440"&gt;    &lt;m:intlim val="subSup"&gt;    &lt;m:narylim val="undOvr"&gt;   &lt;/m:mathPr&gt;&lt;/w:WordDocument&gt; &lt;/xml&gt;&lt;![endif]--&gt;&lt;!--[if gte mso 9]&gt;&lt;xml&gt;  &lt;w:latentstyles deflockedstate="false" defunhidewhenused="true" defsemihidden="true" defqformat="false" defpriority="99" latentstylecount="267"&gt;   &lt;w:lsdexception locked="false" priority="0" semihidden="false" unhidewhenused="false" qformat="true" name="Normal"&gt;   &lt;w:lsdexception locked="false" priority="9" semihidden="false" unhidewhenused="false" qformat="true" name="heading 1"&gt;   &lt;w:lsdexception locked="false" priority="9" qformat="true" name="heading 2"&gt;   &lt;w:lsdexception locked="false" priority="9" qformat="true" name="heading 3"&gt;   &lt;w:lsdexception locked="false" priority="9" qformat="true" name="heading 4"&gt;   &lt;w:lsdexception locked="false" priority="9" qformat="true" name="heading 5"&gt;   &lt;w:lsdexception locked="false" priority="9" qformat="true" name="heading 6"&gt;   &lt;w:lsdexception locked="false" priority="9" qformat="true" name="heading 7"&gt;   &lt;w:lsdexception locked="false" priority="9" qformat="true" name="heading 8"&gt;   &lt;w:lsdexception locked="false" priority="9" qformat="true" name="heading 9"&gt;   &lt;w:lsdexception locked="false" priority="39" name="toc 1"&gt;   &lt;w:lsdexception locked="false" priority="39" name="toc 2"&gt;   &lt;w:lsdexception locked="false" priority="39" name="toc 3"&gt;   &lt;w:lsdexception locked="false" priority="39" name="toc 4"&gt;   &lt;w:lsdexception locked="false" priority="39" name="toc 5"&gt;   &lt;w:lsdexception locked="false" priority="39" name="toc 6"&gt;   &lt;w:lsdexception locked="false" priority="39" name="toc 7"&gt;   &lt;w:lsdexception locked="false" priority="39" name="toc 8"&gt;   &lt;w:lsdexception locked="false" priority="39" name="toc 9"&gt;   &lt;w:lsdexception locked="false" priority="35" qformat="true" name="caption"&gt;   &lt;w:lsdexception locked="false" priority="10" semihidden="false" unhidewhenused="false" qformat="true" name="Title"&gt;   &lt;w:lsdexception locked="false" priority="1" name="Default Paragraph Font"&gt;   &lt;w:lsdexception locked="false" priority="11" semihidden="false" unhidewhenused="false" qformat="true" name="Subtitle"&gt;   &lt;w:lsdexception locked="false" priority="22" semihidden="false" unhidewhenused="false" qformat="true" name="Strong"&gt;   &lt;w:lsdexception locked="false" priority="20" semihidden="false" unhidewhenused="false" qformat="true" name="Emphasis"&gt;   &lt;w:lsdexception locked="false" priority="59" semihidden="false" unhidewhenused="false" name="Table Grid"&gt;   &lt;w:lsdexception locked="false" unhidewhenused="false" name="Placeholder Text"&gt;   &lt;w:lsdexception locked="false" priority="1" semihidden="false" unhidewhenused="false" qformat="true" name="No Spacing"&gt;   &lt;w:lsdexception locked="false" priority="60" semihidden="false" unhidewhenused="false" name="Light Shading"&gt;   &lt;w:lsdexception locked="false" priority="61" semihidden="false" unhidewhenused="false" name="Light List"&gt;   &lt;w:lsdexception locked="false" priority="62" semihidden="false" unhidewhenused="false" name="Light Grid"&gt;   &lt;w:lsdexception locked="false" priority="63" semihidden="false" unhidewhenused="false" name="Medium Shading 1"&gt;   &lt;w:lsdexception locked="false" priority="64" semihidden="false" unhidewhenused="false" name="Medium Shading 2"&gt;   &lt;w:lsdexception locked="false" priority="65" semihidden="false" unhidewhenused="false" name="Medium List 1"&gt;   &lt;w:lsdexception locked="false" priority="66" semihidden="false" unhidewhenused="false" name="Medium List 2"&gt;   &lt;w:lsdexception locked="false" priority="67" semihidden="false" unhidewhenused="false" name="Medium Grid 1"&gt;   &lt;w:lsdexception locked="false" priority="68" semihidden="false" unhidewhenused="false" name="Medium Grid 2"&gt;   &lt;w:lsdexception locked="false" priority="69" semihidden="false" unhidewhenused="false" name="Medium Grid 3"&gt;   &lt;w:lsdexception locked="false" priority="70" semihidden="false" unhidewhenused="false" name="Dark List"&gt;   &lt;w:lsdexception locked="false" priority="71" semihidden="false" unhidewhenused="false" name="Colorful Shading"&gt;   &lt;w:lsdexception locked="false" priority="72" semihidden="false" unhidewhenused="false" name="Colorful List"&gt;   &lt;w:lsdexception locked="false" priority="73" semihidden="false" unhidewhenused="false" name="Colorful Grid"&gt;   &lt;w:lsdexception locked="false" priority="60" semihidden="false" unhidewhenused="false" name="Light Shading Accent 1"&gt;   &lt;w:lsdexception locked="false" priority="61" semihidden="false" unhidewhenused="false" name="Light List Accent 1"&gt;   &lt;w:lsdexception locked="false" priority="62" semihidden="false" unhidewhenused="false" name="Light Grid Accent 1"&gt;   &lt;w:lsdexception locked="false" priority="63" semihidden="false" unhidewhenused="false" name="Medium Shading 1 Accent 1"&gt;   &lt;w:lsdexception locked="false" priority="64" semihidden="false" unhidewhenused="false" name="Medium Shading 2 Accent 1"&gt;   &lt;w:lsdexception locked="false" priority="65" semihidden="false" unhidewhenused="false" name="Medium List 1 Accent 1"&gt;   &lt;w:lsdexception locked="false" unhidewhenused="false" name="Revision"&gt;   &lt;w:lsdexception locked="false" priority="34" semihidden="false" unhidewhenused="false" qformat="true" name="List Paragraph"&gt;   &lt;w:lsdexception locked="false" priority="29" semihidden="false" unhidewhenused="false" qformat="true" name="Quote"&gt;   &lt;w:lsdexception locked="false" priority="30" semihidden="false" unhidewhenused="false" qformat="true" name="Intense Quote"&gt;   &lt;w:lsdexception locked="false" priority="66" semihidden="false" unhidewhenused="false" name="Medium List 2 Accent 1"&gt;   &lt;w:lsdexception locked="false" priority="67" semihidden="false" unhidewhenused="false" name="Medium Grid 1 Accent 1"&gt;   &lt;w:lsdexception locked="false" priority="68" semihidden="false" unhidewhenused="false" name="Medium Grid 2 Accent 1"&gt;   &lt;w:lsdexception locked="false" priority="69" semihidden="false" unhidewhenused="false" name="Medium Grid 3 Accent 1"&gt;   &lt;w:lsdexception locked="false" priority="70" semihidden="false" unhidewhenused="false" name="Dark List Accent 1"&gt;   &lt;w:lsdexception locked="false" priority="71" semihidden="false" unhidewhenused="false" name="Colorful Shading Accent 1"&gt;   &lt;w:lsdexception locked="false" priority="72" semihidden="false" unhidewhenused="false" name="Colorful List Accent 1"&gt;   &lt;w:lsdexception locked="false" priority="73" semihidden="false" unhidewhenused="false" name="Colorful Grid Accent 1"&gt;   &lt;w:lsdexception locked="false" priority="60" semihidden="false" unhidewhenused="false" name="Light Shading Accent 2"&gt;   &lt;w:lsdexception locked="false" priority="61" semihidden="false" unhidewhenused="false" name="Light List Accent 2"&gt;   &lt;w:lsdexception locked="false" priority="62" semihidden="false" unhidewhenused="false" name="Light Grid Accent 2"&gt;   &lt;w:lsdexception locked="false" priority="63" semihidden="false" unhidewhenused="false" name="Medium Shading 1 Accent 2"&gt;   &lt;w:lsdexception locked="false" priority="64" semihidden="false" unhidewhenused="false" name="Medium Shading 2 Accent 2"&gt;   &lt;w:lsdexception locked="false" priority="65" semihidden="false" unhidewhenused="false" name="Medium List 1 Accent 2"&gt;   &lt;w:lsdexception locked="false" priority="66" semihidden="false" unhidewhenused="false" name="Medium List 2 Accent 2"&gt;   &lt;w:lsdexception locked="false" priority="67" semihidden="false" unhidewhenused="false" name="Medium Grid 1 Accent 2"&gt;   &lt;w:lsdexception locked="false" priority="68" semihidden="false" unhidewhenused="false" name="Medium Grid 2 Accent 2"&gt;   &lt;w:lsdexception locked="false" priority="69" semihidden="false" unhidewhenused="false" name="Medium Grid 3 Accent 2"&gt;   &lt;w:lsdexception locked="false" priority="70" semihidden="false" unhidewhenused="false" name="Dark List Accent 2"&gt;   &lt;w:lsdexception locked="false" priority="71" semihidden="false" unhidewhenused="false" name="Colorful Shading Accent 2"&gt;   &lt;w:lsdexception locked="false" priority="72" semihidden="false" unhidewhenused="false" name="Colorful List Accent 2"&gt;   &lt;w:lsdexception locked="false" priority="73" semihidden="false" unhidewhenused="false" name="Colorful Grid Accent 2"&gt;   &lt;w:lsdexception locked="false" priority="60" semihidden="false" unhidewhenused="false" name="Light Shading Accent 3"&gt;   &lt;w:lsdexception locked="false" priority="61" semihidden="false" unhidewhenused="false" name="Light List Accent 3"&gt;   &lt;w:lsdexception locked="false" priority="62" semihidden="false" unhidewhenused="false" name="Light Grid Accent 3"&gt;   &lt;w:lsdexception locked="false" priority="63" semihidden="false" unhidewhenused="false" name="Medium Shading 1 Accent 3"&gt;   &lt;w:lsdexception locked="false" priority="64" semihidden="false" unhidewhenused="false" name="Medium Shading 2 Accent 3"&gt;   &lt;w:lsdexception locked="false" priority="65" semihidden="false" unhidewhenused="false" name="Medium List 1 Accent 3"&gt;   &lt;w:lsdexception locked="false" priority="66" semihidden="false" unhidewhenused="false" name="Medium List 2 Accent 3"&gt;   &lt;w:lsdexception locked="false" priority="67" semihidden="false" unhidewhenused="false" name="Medium Grid 1 Accent 3"&gt;   &lt;w:lsdexception locked="false" priority="68" semihidden="false" unhidewhenused="false" name="Medium Grid 2 Accent 3"&gt;   &lt;w:lsdexception locked="false" priority="69" semihidden="false" unhidewhenused="false" name="Medium Grid 3 Accent 3"&gt;   &lt;w:lsdexception locked="false" priority="70" semihidden="false" unhidewhenused="false" name="Dark List Accent 3"&gt;   &lt;w:lsdexception locked="false" priority="71" semihidden="false" unhidewhenused="false" name="Colorful Shading Accent 3"&gt;   &lt;w:lsdexception locked="false" priority="72" semihidden="false" unhidewhenused="false" name="Colorful List Accent 3"&gt;   &lt;w:lsdexception locked="false" priority="73" semihidden="false" unhidewhenused="false" name="Colorful Grid Accent 3"&gt;   &lt;w:lsdexception locked="false" priority="60" semihidden="false" unhidewhenused="false" name="Light Shading Accent 4"&gt;   &lt;w:lsdexception locked="false" priority="61" semihidden="false" unhidewhenused="false" name="Light List Accent 4"&gt;   &lt;w:lsdexception locked="false" priority="62" semihidden="false" unhidewhenused="false" name="Light Grid Accent 4"&gt;   &lt;w:lsdexception locked="false" priority="63" semihidden="false" unhidewhenused="false" name="Medium Shading 1 Accent 4"&gt;   &lt;w:lsdexception locked="false" priority="64" semihidden="false" unhidewhenused="false" name="Medium Shading 2 Accent 4"&gt;   &lt;w:lsdexception locked="false" priority="65" semihidden="false" unhidewhenused="false" name="Medium List 1 Accent 4"&gt;   &lt;w:lsdexception locked="false" priority="66" semihidden="false" unhidewhenused="false" name="Medium List 2 Accent 4"&gt;   &lt;w:lsdexception locked="false" priority="67" semihidden="false" unhidewhenused="false" name="Medium Grid 1 Accent 4"&gt;   &lt;w:lsdexception locked="false" priority="68" semihidden="false" unhidewhenused="false" name="Medium Grid 2 Accent 4"&gt;   &lt;w:lsdexception locked="false" priority="69" semihidden="false" unhidewhenused="false" name="Medium Grid 3 Accent 4"&gt;   &lt;w:lsdexception locked="false" priority="70" semihidden="false" unhidewhenused="false" name="Dark List Accent 4"&gt;   &lt;w:lsdexception locked="false" priority="71" semihidden="false" unhidewhenused="false" name="Colorful Shading Accent 4"&gt;   &lt;w:lsdexception locked="false" priority="72" semihidden="false" unhidewhenused="false" name="Colorful List Accent 4"&gt;   &lt;w:lsdexception locked="false" priority="73" semihidden="false" unhidewhenused="false" name="Colorful Grid Accent 4"&gt;   &lt;w:lsdexception locked="false" priority="60" semihidden="false" unhidewhenused="false" name="Light Shading Accent 5"&gt;   &lt;w:lsdexception locked="false" priority="61" semihidden="false" unhidewhenused="false" name="Light List Accent 5"&gt;   &lt;w:lsdexception locked="false" priority="62" semihidden="false" unhidewhenused="false" name="Light Grid Accent 5"&gt;   &lt;w:lsdexception locked="false" priority="63" semihidden="false" unhidewhenused="false" name="Medium Shading 1 Accent 5"&gt;   &lt;w:lsdexception locked="false" priority="64" semihidden="false" unhidewhenused="false" name="Medium Shading 2 Accent 5"&gt;   &lt;w:lsdexception locked="false" priority="65" semihidden="false" unhidewhenused="false" name="Medium List 1 Accent 5"&gt;   &lt;w:lsdexception locked="false" priority="66" semihidden="false" unhidewhenused="false" name="Medium List 2 Accent 5"&gt;   &lt;w:lsdexception locked="false" priority="67" semihidden="false" unhidewhenused="false" name="Medium Grid 1 Accent 5"&gt;   &lt;w:lsdexception locked="false" priority="68" semihidden="false" unhidewhenused="false" name="Medium Grid 2 Accent 5"&gt;   &lt;w:lsdexception locked="false" priority="69" semihidden="false" unhidewhenused="false" name="Medium Grid 3 Accent 5"&gt;   &lt;w:lsdexception locked="false" priority="70" semihidden="false" unhidewhenused="false" name="Dark List Accent 5"&gt;   &lt;w:lsdexception locked="false" priority="71" semihidden="false" unhidewhenused="false" name="Colorful Shading Accent 5"&gt;   &lt;w:lsdexception locked="false" priority="72" semihidden="false" unhidewhenused="false" name="Colorful List Accent 5"&gt;   &lt;w:lsdexception locked="false" priority="73" semihidden="false" unhidewhenused="false" name="Colorful Grid Accent 5"&gt;   &lt;w:lsdexception locked="false" priority="60" semihidden="false" unhidewhenused="false" name="Light Shading Accent 6"&gt;   &lt;w:lsdexception locked="false" priority="61" semihidden="false" unhidewhenused="false" name="Light List Accent 6"&gt;   &lt;w:lsdexception locked="false" priority="62" semihidden="false" unhidewhenused="false" name="Light Grid Accent 6"&gt;   &lt;w:lsdexception locked="false" priority="63" semihidden="false" unhidewhenused="false" name="Medium Shading 1 Accent 6"&gt;   &lt;w:lsdexception locked="false" priority="64" semihidden="false" unhidewhenused="false" name="Medium Shading 2 Accent 6"&gt;   &lt;w:lsdexception locked="false" priority="65" semihidden="false" unhidewhenused="false" name="Medium List 1 Accent 6"&gt;   &lt;w:lsdexception locked="false" priority="66" semihidden="false" unhidewhenused="false" name="Medium List 2 Accent 6"&gt;   &lt;w:lsdexception locked="false" priority="67" semihidden="false" unhidewhenused="false" name="Medium Grid 1 Accent 6"&gt;   &lt;w:lsdexception locked="false" priority="68" semihidden="false" unhidewhenused="false" name="Medium Grid 2 Accent 6"&gt;   &lt;w:lsdexception locked="false" priority="69" semihidden="false" unhidewhenused="false" name="Medium Grid 3 Accent 6"&gt;   &lt;w:lsdexception locked="false" priority="70" semihidden="false" unhidewhenused="false" name="Dark List Accent 6"&gt;   &lt;w:lsdexception locked="false" priority="71" semihidden="false" unhidewhenused="false" name="Colorful Shading Accent 6"&gt;   &lt;w:lsdexception locked="false" priority="72" semihidden="false" unhidewhenused="false" name="Colorful List Accent 6"&gt;   &lt;w:lsdexception locked="false" priority="73" semihidden="false" unhidewhenused="false" name="Colorful Grid Accent 6"&gt;   &lt;w:lsdexception locked="false" priority="19" semihidden="false" unhidewhenused="false" qformat="true" name="Subtle Emphasis"&gt;   &lt;w:lsdexception locked="false" priority="21" semihidden="false" unhidewhenused="false" qformat="true" name="Intense Emphasis"&gt;   &lt;w:lsdexception locked="false" priority="31" semihidden="false" unhidewhenused="false" qformat="true" name="Subtle Reference"&gt;   &lt;w:lsdexception locked="false" priority="32" semihidden="false" unhidewhenused="false" qformat="true" name="Intense Reference"&gt;   &lt;w:lsdexception locked="false" priority="33" semihidden="false" unhidewhenused="false" qformat="true" name="Book Title"&gt;   &lt;w:lsdexception locked="false" priority="37" name="Bibliography"&gt;   &lt;w:lsdexception locked="false" priority="39" qformat="true" name="TOC Heading"&gt;  &lt;/w:LatentStyles&gt; &lt;/xml&gt;&lt;![endif]--&gt;&lt;!--[if gte mso 10]&gt; &lt;style&gt;  /* Style Definitions */  table.MsoNormalTable  {mso-style-name:"Table Normal";  mso-tstyle-rowband-size:0;  mso-tstyle-colband-size:0;  mso-style-noshow:yes;  mso-style-priority:99;  mso-style-qformat:yes;  mso-style-parent:"";  mso-padding-alt:0in 5.4pt 0in 5.4pt;  mso-para-margin-top:0in;  mso-para-margin-right:0in;  mso-para-margin-bottom:10.0pt;  mso-para-margin-left:0in;  line-height:115%;  mso-pagination:widow-orphan;  font-size:11.0pt;  font-family:"Calibri","sans-serif";  mso-ascii-font-family:Calibri;  mso-ascii-theme-font:minor-latin;  mso-fareast-font-family:"Times New Roman";  mso-fareast-theme-font:minor-fareast;  mso-hansi-font-family:Calibri;  mso-hansi-theme-font:minor-latin;  mso-bidi-font-family:"Times New Roman";  mso-bidi-theme-font:minor-bidi;} &lt;/style&gt; &lt;![endif]--&gt;&lt;span style="mso-bidi-mso-bidi-theme-font: minor-latin;font-family:Calibri;" &gt;é&lt;/span&gt;  's: basically nothing is ever new in computing it seems&lt;/li&gt;&lt;li&gt;its usability would be greatly increased I guess if it supported disconnected recordsets so that a client application can use it even without access to the cloud&lt;/li&gt;&lt;/ul&gt;This also proves that &lt;span style="font-style: italic;"&gt;it does make sense&lt;/span&gt; in certain instance to maintain one's own platform/language/database stack.&lt;br /&gt;&lt;br /&gt;More soon.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30166624-7092399043528936580?l=connectedsystems.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://connectedsystems.blogspot.com/feeds/7092399043528936580/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30166624&amp;postID=7092399043528936580' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30166624/posts/default/7092399043528936580'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30166624/posts/default/7092399043528936580'/><link rel='alternate' type='text/html' href='http://connectedsystems.blogspot.com/2012/01/databasecom.html' title='Database.com'/><author><name>Razvan</name><uri>http://www.blogger.com/profile/01478237694157411648</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp1.blogger.com/_oKO4lXYJzFQ/SD-O3vBCSZI/AAAAAAAAACw/rLUH4XNTr8A/S220/rjp.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30166624.post-851615962424929994</id><published>2011-01-12T04:25:00.000-08:00</published><updated>2011-01-12T04:27:12.669-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='API'/><title type='text'>Yahoo + Koprol != Love</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_oKO4lXYJzFQ/TS2eA4f2iVI/AAAAAAAAAJk/EzuodXSDvg4/s1600/koproy.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 132px;" src="http://1.bp.blogspot.com/_oKO4lXYJzFQ/TS2eA4f2iVI/AAAAAAAAAJk/EzuodXSDvg4/s320/koproy.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5561274852875602258" /&gt;&lt;/a&gt;&lt;br /&gt;You would think that it would be easy to link your Yahoo and Koprol accounts.&lt;br /&gt;If only.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30166624-851615962424929994?l=connectedsystems.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://connectedsystems.blogspot.com/feeds/851615962424929994/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30166624&amp;postID=851615962424929994' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30166624/posts/default/851615962424929994'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30166624/posts/default/851615962424929994'/><link rel='alternate' type='text/html' href='http://connectedsystems.blogspot.com/2011/01/yahoo-koprol-love.html' title='Yahoo + Koprol != Love'/><author><name>Razvan</name><uri>http://www.blogger.com/profile/01478237694157411648</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp1.blogger.com/_oKO4lXYJzFQ/SD-O3vBCSZI/AAAAAAAAACw/rLUH4XNTr8A/S220/rjp.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_oKO4lXYJzFQ/TS2eA4f2iVI/AAAAAAAAAJk/EzuodXSDvg4/s72-c/koproy.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30166624.post-7279543143204297445</id><published>2011-01-06T05:01:00.000-08:00</published><updated>2011-01-10T12:36:34.409-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Databases'/><category scheme='http://www.blogger.com/atom/ns#' term='Hosting'/><title type='text'>Running Cache on a Linux VM</title><content type='html'>&lt;a href="http://mirrorhosts.com/downloads/vmplanet/VMplanet-openSUSE11.3"&gt;Download&lt;/a&gt; SUSE.&lt;br /&gt;• Login: vmplanet&lt;br /&gt;• Pass: vmplanet.net&lt;br /&gt;• RootPass: vmplanet.net&lt;br /&gt;&lt;br /&gt;&lt;a href="http://download.intersystems.com/download/register.csp"&gt;Download&lt;/a&gt; the SUSE Cache install from InterSystems.&lt;br /&gt;Install is rather easy with the RPM sw management system on SUSE.&lt;br /&gt;Set the network connection on the VM to "Bridged" to allow the VM to use the host's network.&lt;br /&gt;The ports have to be enabled on the Linux VM:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;su root&lt;br /&gt;iptables -F INPUT (Delete all the INPUT rules)&lt;br /&gt;iptables -P INPUT ACCEPT&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;To enable remote access from the Cache toolset:&lt;br /&gt;• port: 1972&lt;br /&gt;• web port: 57772&lt;br /&gt;• login: ... the usual, _system or SuperUser&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;To connect from Terminal:&lt;br /&gt;• enable telnet service on VM&lt;br /&gt;• create a .session.sh script to launch Cache session, chmod +x&lt;br /&gt;Cache must already be running (su ccontrol start cache if it is not)&lt;br /&gt;• in .profile for vmplanet user add line to invoke session.sh&lt;br /&gt;&lt;br /&gt;More useful &lt;a href= "http://www.vmware.com/appliances/directory/cat/508?page=4"&gt;appliances&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Studio connected to Cache running on a SUSE VM:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/_oKO4lXYJzFQ/TSW_gtbnWII/AAAAAAAAAJM/5lizcDOHNnk/s1600/lnx1.jpg"&gt;&lt;img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 320px; DISPLAY: block; HEIGHT: 200px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5559059883730884738" border="0" alt="" src="http://1.bp.blogspot.com/_oKO4lXYJzFQ/TSW_gtbnWII/AAAAAAAAAJM/5lizcDOHNnk/s320/lnx1.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;A view from the Linux VM: &lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/_oKO4lXYJzFQ/TSXABJTQJqI/AAAAAAAAAJc/_3TXNoX4aRY/s1600/lnx3.jpg"&gt;&lt;img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 320px; DISPLAY: block; HEIGHT: 200px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5559060440967816866" border="0" alt="" src="http://4.bp.blogspot.com/_oKO4lXYJzFQ/TSXABJTQJqI/AAAAAAAAAJc/_3TXNoX4aRY/s320/lnx3.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Remote terminal connection:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/_oKO4lXYJzFQ/TSXABPat_0I/AAAAAAAAAJU/R5ck8SRpLuU/s1600/lnx2.jpg"&gt;&lt;img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 320px; DISPLAY: block; HEIGHT: 175px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5559060442609745730" border="0" alt="" src="http://1.bp.blogspot.com/_oKO4lXYJzFQ/TSXABPat_0I/AAAAAAAAAJU/R5ck8SRpLuU/s320/lnx2.jpg" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30166624-7279543143204297445?l=connectedsystems.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://connectedsystems.blogspot.com/feeds/7279543143204297445/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30166624&amp;postID=7279543143204297445' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30166624/posts/default/7279543143204297445'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30166624/posts/default/7279543143204297445'/><link rel='alternate' type='text/html' href='http://connectedsystems.blogspot.com/2011/01/running-cache-on-linux-vm.html' title='Running Cache on a Linux VM'/><author><name>Razvan</name><uri>http://www.blogger.com/profile/01478237694157411648</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp1.blogger.com/_oKO4lXYJzFQ/SD-O3vBCSZI/AAAAAAAAACw/rLUH4XNTr8A/S220/rjp.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_oKO4lXYJzFQ/TSW_gtbnWII/AAAAAAAAAJM/5lizcDOHNnk/s72-c/lnx1.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30166624.post-7678804456831684578</id><published>2010-09-26T10:55:00.000-07:00</published><updated>2010-09-26T10:57:05.023-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Databases'/><category scheme='http://www.blogger.com/atom/ns#' term='ORM'/><title type='text'>Caché Data Access Modes</title><content type='html'>Since I have joined InterSystems a while ago, I thought a Caché post might be appropriate, especially since it illustrates quite nicely the various data access modes offered by the platform.&lt;br /&gt;Below is a routine called TestModes.mac, invoked by a &gt;do ^TestModes. The SQLCompile macro is necessary because the SQL code references objects which do not exist compile time, before CreateTable is run (InsertData). The multi-dimensional sparse arrays created as SQL tables (by CreateTable) are accessed in multi-value mode by ReadMV and deleted by DropMV (which also uses the DeleteExtent method of the data objects to perform a ‘table truncation’ on the data objects).&lt;br /&gt;Another nice feature is the extraction of the list items from the arrays (table data rows are stored as array items, whereby each field is stored in a string list created by $LISTBUILD) back to strings by the $LISTTOSTRING function.&lt;br /&gt;Some legacy features are visible (the need to declare SQLCODE as a public variable and make it NEW to restrict it to the current scope). I don’t think that this kind of mix would make sense in an application, where it would make sense to use one access metaphor and only one for a given data item; but this is still a valuable example which ties the data architecture(s) of Caché together nicely.&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;TestModes&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;    ; shows the different data access types&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;    ; SQL, MV, class&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;    #SQLCompile Mode = DEFERRED&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;    DO CreateTable&lt;/span&gt;&lt;/span&gt;        &lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;    DO InsertData(1000)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;    DO ReadMV&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;    DO DropMV&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;    WRITE $$ReadData()&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;    QUIT&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;    ;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;CreateTable()&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;    {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;        &amp;amp;sql( DROP TABLE items)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;        &amp;amp;sql( CREATE TABLE items(id INT, data VARCHAR(50)))&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;        QUIT&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;    }&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;InsertData(upto)[SQLCODE]&lt;/span&gt;&lt;/span&gt;    &lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;    {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;        #DIM x as %String&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;        #DIM i as %Integer&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;        NEW SQLCODE&lt;/span&gt;&lt;/span&gt;                &lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;        FOR i = 1:1:upto&lt;/span&gt;&lt;/span&gt;        &lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;        {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;            SET x = i _ " DataItem"&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;            &amp;amp;sql( INSERT INTO SQLUser.items(id, data) VALUES( :i, :x))&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;            IF (SQLCODE '= 0 ) &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;            {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;                WRITE "SQL error:", $ZERROR, !&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;            }&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;        }&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;        QUIT&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;    }&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;ReadMV() &lt;/span&gt;&lt;/span&gt;    &lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;    {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;        #DIM ky AS %String&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;        #DIM extr AS %String&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;        WRITE "Navigating the data", !&lt;/span&gt;&lt;/span&gt;        &lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;        SET ky = $ORDER(^User.itemsD(""))&lt;/span&gt;&lt;/span&gt;        &lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;        WHILE( ky '= "")&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;        {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;            ; WRITE ky, ^User.itemsD(ky), !&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;            SET ky = $ORDER(^User.itemsD(ky))&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;            IF ( ky '= "" )&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;            {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;                SET extr = $LISTTOSTRING(^User.itemsD(ky))&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;                WRITE ?5, extr, !&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;            }&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;        }&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;        QUIT&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;    }&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;DropMV()&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;    {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;        DO ##class(User.items).%DeleteExtent()&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;        KILL ^User.itemsD&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;        QUIT&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;    }&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;ReadData() [SQLCODE]&lt;/span&gt;&lt;/span&gt;    &lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;    {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;        #Dim result AS %String&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;        NEW SQLCODE&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;        &amp;amp;sql(SELECT COUNT(*) INTO :result FROM SQLUser.items )&lt;/span&gt;&lt;/span&gt;        &lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;        ; the table is still there, but empty&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;        IF (SQLCODE '= 0) SET result = "Error " _ $ZERROR&lt;/span&gt;&lt;/span&gt;        &lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;        Q result&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;    }&lt;/span&gt;&lt;/span&gt;        &lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30166624-7678804456831684578?l=connectedsystems.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://connectedsystems.blogspot.com/feeds/7678804456831684578/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30166624&amp;postID=7678804456831684578' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30166624/posts/default/7678804456831684578'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30166624/posts/default/7678804456831684578'/><link rel='alternate' type='text/html' href='http://connectedsystems.blogspot.com/2010/09/cache-data-access-modes.html' title='Caché Data Access Modes'/><author><name>Razvan</name><uri>http://www.blogger.com/profile/01478237694157411648</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp1.blogger.com/_oKO4lXYJzFQ/SD-O3vBCSZI/AAAAAAAAACw/rLUH4XNTr8A/S220/rjp.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30166624.post-6055168704373762042</id><published>2010-06-29T21:53:00.000-07:00</published><updated>2010-06-29T21:57:51.132-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Visualization'/><title type='text'>Tableau Public</title><content type='html'>My first attempt!&lt;br /&gt;&lt;iframe height="500" src="http://public.tableausoftware.com/views/Report1/Sheet1" width="100%"&gt;Powered by Tableau&lt;/iframe&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30166624-6055168704373762042?l=connectedsystems.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://connectedsystems.blogspot.com/feeds/6055168704373762042/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30166624&amp;postID=6055168704373762042' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30166624/posts/default/6055168704373762042'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30166624/posts/default/6055168704373762042'/><link rel='alternate' type='text/html' href='http://connectedsystems.blogspot.com/2010/06/tableau-public.html' title='Tableau Public'/><author><name>Razvan</name><uri>http://www.blogger.com/profile/01478237694157411648</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp1.blogger.com/_oKO4lXYJzFQ/SD-O3vBCSZI/AAAAAAAAACw/rLUH4XNTr8A/S220/rjp.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30166624.post-7293577472912292124</id><published>2010-06-29T03:44:00.001-07:00</published><updated>2010-06-29T03:50:07.051-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Databases'/><title type='text'>MySQL and SQL Server</title><content type='html'>...actually, how to make the two talk.&lt;br /&gt;&lt;br /&gt;&lt;div&gt;Create a Linked Server in SQL Server (using ODBC): &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;a href="http://4.bp.blogspot.com/_oKO4lXYJzFQ/TCnPCkNiBVI/AAAAAAAAAIs/piarN3Mdjac/s1600/sqls-mysql.jpg"&gt;&lt;img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 320px; DISPLAY: block; HEIGHT: 180px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5488145263914779986" border="0" alt="" src="http://4.bp.blogspot.com/_oKO4lXYJzFQ/TCnPCkNiBVI/AAAAAAAAAIs/piarN3Mdjac/s320/sqls-mysql.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;To query (from SQL Server):&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;select top 5 * from mysqlanalytics...analytics;&lt;br /&gt;&lt;br /&gt;select * from mysqlanalytics...session;&lt;/pre&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;Stored procedures aren't available, but you can get around this by writing a view in MySQL to return the data from the stored procedure (and perhaps use a table to get any parameters the stored procedure might need).&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;mysql&gt; create view ViewSession as&lt;br /&gt;    -&gt; select GetSession() as CurrentSession;&lt;br /&gt;Query OK, 0 rows affected (0.06 sec)&lt;br /&gt;&lt;br /&gt;mysql&gt; select * from viewsession;&lt;br /&gt;+----------------+&lt;br /&gt; CurrentSession&lt;br /&gt;+----------------+&lt;br /&gt;              1&lt;br /&gt;+----------------+&lt;br /&gt;&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;And ViewSession is now available in SQL Server:&lt;pre&gt;&lt;br /&gt;select * from mysqlanalytics...ViewSession&lt;/pre&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30166624-7293577472912292124?l=connectedsystems.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://connectedsystems.blogspot.com/feeds/7293577472912292124/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30166624&amp;postID=7293577472912292124' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30166624/posts/default/7293577472912292124'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30166624/posts/default/7293577472912292124'/><link rel='alternate' type='text/html' href='http://connectedsystems.blogspot.com/2010/06/mysql-and-sql-server.html' title='MySQL and SQL Server'/><author><name>Razvan</name><uri>http://www.blogger.com/profile/01478237694157411648</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp1.blogger.com/_oKO4lXYJzFQ/SD-O3vBCSZI/AAAAAAAAACw/rLUH4XNTr8A/S220/rjp.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_oKO4lXYJzFQ/TCnPCkNiBVI/AAAAAAAAAIs/piarN3Mdjac/s72-c/sqls-mysql.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30166624.post-2435031690999995931</id><published>2010-06-25T03:33:00.000-07:00</published><updated>2010-06-25T03:34:27.185-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Programmable web'/><category scheme='http://www.blogger.com/atom/ns#' term='API'/><category scheme='http://www.blogger.com/atom/ns#' term='Hosting'/><title type='text'>Google Analytics API</title><content type='html'>Very basic GA API &lt;a href="http://designstudio.checkoutmypage.com/GA.htm"&gt;project&lt;/a&gt; (very poorly hosted too!)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30166624-2435031690999995931?l=connectedsystems.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://connectedsystems.blogspot.com/feeds/2435031690999995931/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30166624&amp;postID=2435031690999995931' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30166624/posts/default/2435031690999995931'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30166624/posts/default/2435031690999995931'/><link rel='alternate' type='text/html' href='http://connectedsystems.blogspot.com/2010/06/google-analytics-api.html' title='Google Analytics API'/><author><name>Razvan</name><uri>http://www.blogger.com/profile/01478237694157411648</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp1.blogger.com/_oKO4lXYJzFQ/SD-O3vBCSZI/AAAAAAAAACw/rLUH4XNTr8A/S220/rjp.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30166624.post-6160871940288149606</id><published>2010-06-16T06:03:00.000-07:00</published><updated>2010-06-16T06:04:40.410-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Windows'/><title type='text'>Adobe Forms</title><content type='html'>Adobe Forms &lt;a href="https://docs.google.com/Doc?docid=0AcYR9bjZeZ66ZGM0aHhqMnpfOTlkN3R4d2Znaw&amp;amp;hl=en"&gt;review&lt;/a&gt;. A test run of XForms, later.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30166624-6160871940288149606?l=connectedsystems.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://connectedsystems.blogspot.com/feeds/6160871940288149606/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30166624&amp;postID=6160871940288149606' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30166624/posts/default/6160871940288149606'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30166624/posts/default/6160871940288149606'/><link rel='alternate' type='text/html' href='http://connectedsystems.blogspot.com/2010/06/adobe-forms.html' title='Adobe Forms'/><author><name>Razvan</name><uri>http://www.blogger.com/profile/01478237694157411648</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp1.blogger.com/_oKO4lXYJzFQ/SD-O3vBCSZI/AAAAAAAAACw/rLUH4XNTr8A/S220/rjp.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30166624.post-3886055806307649815</id><published>2010-06-14T01:06:00.000-07:00</published><updated>2010-06-14T01:10:09.164-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Programmable web'/><category scheme='http://www.blogger.com/atom/ns#' term='API'/><title type='text'>EMC xProc Designer</title><content type='html'>Yet one more &lt;a href="http://xmldemo.emc.com:8080/designer/"&gt;visual designer&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30166624-3886055806307649815?l=connectedsystems.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://connectedsystems.blogspot.com/feeds/3886055806307649815/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30166624&amp;postID=3886055806307649815' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30166624/posts/default/3886055806307649815'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30166624/posts/default/3886055806307649815'/><link rel='alternate' type='text/html' href='http://connectedsystems.blogspot.com/2010/06/emc-xproc-designer.html' title='EMC xProc Designer'/><author><name>Razvan</name><uri>http://www.blogger.com/profile/01478237694157411648</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp1.blogger.com/_oKO4lXYJzFQ/SD-O3vBCSZI/AAAAAAAAACw/rLUH4XNTr8A/S220/rjp.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30166624.post-5145549432990121901</id><published>2010-06-09T00:54:00.001-07:00</published><updated>2010-06-17T02:54:22.784-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Databases'/><category scheme='http://www.blogger.com/atom/ns#' term='Hosting'/><category scheme='http://www.blogger.com/atom/ns#' term='Middleware'/><title type='text'>CMS everywhere</title><content type='html'>This is old news, but it is interesting to see how ASP.MVC follows the same principles as, for example, Django or Zope; it contains the building blocks for a CMS, and supersedes the ASP.NET paradigm.&lt;br /&gt;&lt;br /&gt;That being said, there are conceptual differences - Zope is middleware-centric (the database is customized for it), Django is database-centric (you start with the db definition, even if it is done at the ORM level: you start with the classes in Python which then get mapped to relational tables) and ASP.MVC is purely database centric (using LINQ to SQL - the classes are generated from the relational tables).&lt;br /&gt;&lt;br /&gt;Finally you have something like eZ Publish where objects exist somewhere between PHP and the CMS, and are stored in a bit bucket (relational database, but with no relational features per se, so they might be better off using Mongo or Cache for speed).&lt;br /&gt;&lt;br /&gt;Other than that, same features - URL mapping, templates, etc.&lt;br /&gt;&lt;br /&gt;Next, I'll delve into ZODB, it would be interesting to see how much is actually stored there and how much in &lt;em&gt;/var&lt;/em&gt;.&lt;br /&gt;&lt;br /&gt;&lt;hr /&gt;&lt;br /&gt;&lt;p&gt;Speaking of ASP.MVC, here are a couple of links on SEO, relevant to other CMS as well (especially to migrations!):&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://weblogs.asp.net/scottgu/archive/2010/01/05/asp-net-4-seo-improvements-vs-2010-and-net-4-0-series.aspx"&gt;SEO features of ASP.MVC&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://weblogs.asp.net/scottgu/archive/2009/12/15/search-engine-optimization-seo-toolkit.aspx"&gt;SEO Toolkit&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://weblogs.asp.net/scottgu/archive/2009/10/13/url-routing-with-asp-net-4-web-forms-vs-2010-and-net-4-0-series.aspx"&gt;URL routing in ASP.MVC&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30166624-5145549432990121901?l=connectedsystems.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://connectedsystems.blogspot.com/feeds/5145549432990121901/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30166624&amp;postID=5145549432990121901' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30166624/posts/default/5145549432990121901'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30166624/posts/default/5145549432990121901'/><link rel='alternate' type='text/html' href='http://connectedsystems.blogspot.com/2010/06/cms-everywhere.html' title='CMS everywhere'/><author><name>Razvan</name><uri>http://www.blogger.com/profile/01478237694157411648</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp1.blogger.com/_oKO4lXYJzFQ/SD-O3vBCSZI/AAAAAAAAACw/rLUH4XNTr8A/S220/rjp.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30166624.post-2733666525782012170</id><published>2010-06-08T07:23:00.001-07:00</published><updated>2010-06-09T00:54:16.866-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Python'/><title type='text'>Python classes</title><content type='html'>&lt;span xmlns=''&gt;&lt;p&gt;&lt;span style='text-decoration:underline'&gt;Old-style: &lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style='font-family:Courier New; font-size:9pt'&gt;class OldClass:&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style='font-family:Courier New; font-size:9pt'&gt;    def method(self):&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style='font-family:Courier New; font-size:9pt'&gt;        ….&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;Characterized by:&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style='font-family:Courier New; font-size:9pt'&gt;P = OlcClass()&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style='font-family:Courier New; font-size:9pt'&gt;p.__class__ &lt;/span&gt;&lt;span style='font-family:Wingdings'&gt;à&lt;/span&gt; 'OldClass'&lt;span style='font-family:Courier New; font-size:9pt'&gt;&lt;br /&gt;    &lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style='font-family:Courier New; font-size:9pt'&gt;type(p) &lt;/span&gt;&lt;span style='font-family:Wingdings'&gt;à&lt;/span&gt; 'instance'&lt;span style='font-family:Courier New; font-size:9pt'&gt;&lt;br /&gt;    &lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt; &lt;/p&gt;&lt;p&gt;&lt;span style='font-family:Courier New; font-size:9pt'&gt;&amp;gt;&amp;gt;&amp;gt; class Test:&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style='font-family:Courier New; font-size:9pt'&gt;    def __init__(self):&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style='font-family:Courier New; font-size:9pt'&gt;        print 'Test initialized'&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style='font-family:Courier New; font-size:9pt'&gt;    def meth(self):&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style='font-family:Courier New; font-size:9pt'&gt;        self.member = 1&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style='font-family:Courier New; font-size:9pt'&gt;        print 'Test.member = ' + str(self.member)&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt; &lt;/p&gt;&lt;p&gt;&lt;span style='font-family:Courier New; font-size:9pt'&gt;&amp;gt;&amp;gt;&amp;gt; class TestKid(Test):&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style='font-family:Courier New; font-size:9pt'&gt;    "This is derived from Kid, meth is overriden and so is member"&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style='font-family:Courier New; font-size:9pt'&gt;    def __init__(self):&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style='font-family:Courier New; font-size:9pt'&gt;        print 'Kid initialized'&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style='font-family:Courier New; font-size:9pt'&gt;    def meth(self):&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style='font-family:Courier New; font-size:9pt'&gt;        self.member = 2&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style='font-family:Courier New; font-size:9pt'&gt;              Test.meth(self)&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style='font-family:Courier New; font-size:9pt'&gt;              print 'Kid.member = ' + str(self.member)&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt; &lt;/p&gt;&lt;p&gt;Above is shown how to override a method, call its parent implementation; the member attribute is shared between the parent and child classes and hence calling a function in parent which references it will modify it in the child as well. The parent constructor (or any other overridden function) is not called by default.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style='text-decoration:underline'&gt;New-style:&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style='font-family:Courier New; font-size:9pt'&gt;&amp;gt;&amp;gt;&amp;gt; class Test(object):&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style='font-family:Courier New; font-size:9pt'&gt;Type(p)&lt;/span&gt; would return 'Test'. Unifies types and classes.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;It &lt;a href='http://stackoverflow.com/questions/136097/what-is-the-difference-between-staticmethod-and-classmethod-in-python'&gt;has&lt;/a&gt; classmethods and staticmethods.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Also (for both old and new):&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style='font-family:Courier New; font-size:9pt'&gt;P = Test() ; &lt;/span&gt;calling a &lt;em&gt;class object&lt;/em&gt; yields a &lt;em&gt;class instance&lt;/em&gt;&lt;span style='font-family:Courier New; font-size:9pt'&gt;&lt;br /&gt;    &lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style='font-size:9pt'&gt;&lt;span style='font-family:Courier New'&gt;p.__dict__ &lt;/span&gt;&lt;span style='font-family:Wingdings'&gt;à&lt;/span&gt;&lt;span style='font-family:Courier New'&gt; {'member':1}&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style='font-family:Courier New; font-size:9pt'&gt;p.__dict__['member'] = 1 ; &lt;/span&gt;same as&lt;span style='font-family:Courier New; font-size:9pt'&gt; p.member&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt; &lt;/p&gt;&lt;p&gt;You can use properties (almost .NET-style) to access class attributes with new classes.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;a href='http://www.python.org/doc/newstyle/'&gt;More&lt;/a&gt;.&lt;/p&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30166624-2733666525782012170?l=connectedsystems.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://connectedsystems.blogspot.com/feeds/2733666525782012170/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30166624&amp;postID=2733666525782012170' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30166624/posts/default/2733666525782012170'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30166624/posts/default/2733666525782012170'/><link rel='alternate' type='text/html' href='http://connectedsystems.blogspot.com/2010/06/python-classes.html' title='Python classes'/><author><name>Razvan</name><uri>http://www.blogger.com/profile/01478237694157411648</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp1.blogger.com/_oKO4lXYJzFQ/SD-O3vBCSZI/AAAAAAAAACw/rLUH4XNTr8A/S220/rjp.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30166624.post-7666950610521264471</id><published>2010-05-27T01:56:00.000-07:00</published><updated>2010-06-15T09:34:11.107-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Databases'/><category scheme='http://www.blogger.com/atom/ns#' term='Windows'/><category scheme='http://www.blogger.com/atom/ns#' term='Python'/><title type='text'>Images in SQL Server</title><content type='html'>A simple .NET &lt;a href="http://bit.ly/9mtAoI"&gt;class&lt;/a&gt; to dump image data into/from SQL Server. I'd like to explore a potential alternative to this using FILESTREAM.&lt;br /&gt;&lt;br /&gt;In T-SQL:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;span style="color:#660000;"&gt;update version set [file] = BulkColumn from&lt;br /&gt;openrowset(bulk 'e:\....jpg', single_blob) as [file]&lt;br /&gt;where ...;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;hr /&gt;&lt;br /&gt;&lt;br /&gt;In Python/MySQL, this is done like this: (the image column, image_data, is defined as BLOB in MySQL)&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;span style="color:#3333ff;"&gt;&gt;&gt;&gt; import MySQLdb&lt;br /&gt;&gt;&gt;&gt; connection = MySQLdb.connect('','root','','RTest')&lt;br /&gt;&gt;&gt;&gt; blob = open('d:\\pic1.jpg', 'rb').read()&lt;br /&gt;&gt;&gt;&gt; sql = 'INSERT INTO rtest.mm_image(image_data, mm_person_id_mm_person) VALUES(%s, 1)'&lt;br /&gt;&gt;&gt;&gt; args = (blob,)&lt;br /&gt;&gt;&gt;&gt; cursor = connection.cursor()&lt;br /&gt;&gt;&gt;&gt; cursor.execute(sql, args)&lt;br /&gt;&gt;&gt;&gt; connection.commit()&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;blob is a string type.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30166624-7666950610521264471?l=connectedsystems.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://connectedsystems.blogspot.com/feeds/7666950610521264471/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30166624&amp;postID=7666950610521264471' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30166624/posts/default/7666950610521264471'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30166624/posts/default/7666950610521264471'/><link rel='alternate' type='text/html' href='http://connectedsystems.blogspot.com/2010/05/images-in-sql-server.html' title='Images in SQL Server'/><author><name>Razvan</name><uri>http://www.blogger.com/profile/01478237694157411648</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp1.blogger.com/_oKO4lXYJzFQ/SD-O3vBCSZI/AAAAAAAAACw/rLUH4XNTr8A/S220/rjp.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30166624.post-3768852703294218120</id><published>2010-05-26T04:45:00.000-07:00</published><updated>2010-06-04T05:49:36.675-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Databases'/><category scheme='http://www.blogger.com/atom/ns#' term='Hosting'/><category scheme='http://www.blogger.com/atom/ns#' term='Middleware'/><title type='text'>CMSRDBMSWT..?</title><content type='html'>There seems to be precious little information on data management in the context of CMS (Content Management Systems). To me, this would seem very important - data admin, modeling, etc, all should be hugely important, and yet some of the CMS I come across are little more than bit buckets with a data dictionary. While web-based CMS have certainly driven the development of NoSQL (due to performance reasons, given the underoptimal use of the RDBMS by the CMS), certainly some thought has gone into the data layer of the CMS... where is it at?&lt;br /&gt;&lt;hr /&gt;&lt;br /&gt;Speaking of CMS: Here's Plone, which is running on a NoSQL incidentally.&lt;br /&gt;&lt;br /&gt;&lt;iframe src="http://plone.org/countries/conosur/articulos/Plone-Infrastructure.EN.svg/view" width="100%" height="350"&gt;&lt;/iframe&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30166624-3768852703294218120?l=connectedsystems.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://connectedsystems.blogspot.com/feeds/3768852703294218120/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30166624&amp;postID=3768852703294218120' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30166624/posts/default/3768852703294218120'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30166624/posts/default/3768852703294218120'/><link rel='alternate' type='text/html' href='http://connectedsystems.blogspot.com/2010/05/cmsrbmdswt.html' title='CMSRDBMSWT..?'/><author><name>Razvan</name><uri>http://www.blogger.com/profile/01478237694157411648</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp1.blogger.com/_oKO4lXYJzFQ/SD-O3vBCSZI/AAAAAAAAACw/rLUH4XNTr8A/S220/rjp.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30166624.post-5302354241063273287</id><published>2010-05-20T06:46:00.000-07:00</published><updated>2010-05-21T09:59:29.010-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Databases'/><category scheme='http://www.blogger.com/atom/ns#' term='Python'/><title type='text'>Python ORM</title><content type='html'>A &lt;a href="http://bit.ly/9RBNjG"&gt;first shot&lt;/a&gt; at ORMing in Python.&lt;br /&gt;&lt;br /&gt;The second, improved &lt;a href="http://bit.ly/db6UAC"&gt;shot&lt;/a&gt;. Inheritance/polymorphism in weakly-typed languages such as Python is a bit hard to grasp at first. Anyway, this seems quite cool.&lt;br /&gt;&lt;br /&gt;Class diagram: (I am not an expert @ UML)&lt;br /&gt;&lt;br /&gt;&lt;script src="http://www.gliffy.com/diagramEmbed.js" type="text/javascript"&gt; &lt;/script&gt;&lt;br /&gt;&lt;script type="text/javascript"&gt; gliffy_did = "2119884"; embedGliffy(); &lt;/script&gt;&lt;br /&gt;&lt;br /&gt;Existing solutions:&lt;br /&gt;- for &lt;a href="http://www.doctrine-project.org/projects/orm/2.0/docs/cookbook/getting-started-xml-edition/en#getting-started-xml-edition"&gt;PHP&lt;/a&gt;&lt;br /&gt;- for &lt;a href="http://www.sqlalchemy.org/"&gt;Python&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30166624-5302354241063273287?l=connectedsystems.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://connectedsystems.blogspot.com/feeds/5302354241063273287/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30166624&amp;postID=5302354241063273287' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30166624/posts/default/5302354241063273287'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30166624/posts/default/5302354241063273287'/><link rel='alternate' type='text/html' href='http://connectedsystems.blogspot.com/2010/05/python-orm.html' title='Python ORM'/><author><name>Razvan</name><uri>http://www.blogger.com/profile/01478237694157411648</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp1.blogger.com/_oKO4lXYJzFQ/SD-O3vBCSZI/AAAAAAAAACw/rLUH4XNTr8A/S220/rjp.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30166624.post-3804519016087265640</id><published>2010-05-18T22:53:00.000-07:00</published><updated>2010-05-18T22:59:32.937-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Hosting'/><category scheme='http://www.blogger.com/atom/ns#' term='information economics'/><title type='text'>Collaboration tools</title><content type='html'>Great info:&lt;br /&gt;&lt;br /&gt;&lt;iframe height="400" src="http://www.mindmeister.com/12213323" width="100%"&gt;&lt;br /&gt;&lt;/iframe&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30166624-3804519016087265640?l=connectedsystems.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://connectedsystems.blogspot.com/feeds/3804519016087265640/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30166624&amp;postID=3804519016087265640' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30166624/posts/default/3804519016087265640'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30166624/posts/default/3804519016087265640'/><link rel='alternate' type='text/html' href='http://connectedsystems.blogspot.com/2010/05/collaboration-tools.html' title='Collaboration tools'/><author><name>Razvan</name><uri>http://www.blogger.com/profile/01478237694157411648</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp1.blogger.com/_oKO4lXYJzFQ/SD-O3vBCSZI/AAAAAAAAACw/rLUH4XNTr8A/S220/rjp.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30166624.post-3516137826623912673</id><published>2010-05-10T09:16:00.001-07:00</published><updated>2010-05-10T09:27:37.257-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Databases'/><category scheme='http://www.blogger.com/atom/ns#' term='Python'/><title type='text'>BLOBing in Mongo</title><content type='html'>SQL Server, Oracle, Cache, etc, all have &lt;em&gt;binary streams, &lt;/em&gt;and offer various ways of storing binary data (such as images) directly into the database. I was curious to see how this would work with Mongo, and here is the result:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;import pymongo&lt;br /&gt;import urllib2&lt;br /&gt;import wx&lt;br /&gt;import sys&lt;br /&gt;from pymongo import Connection&lt;br /&gt;&lt;br /&gt;class Image:&lt;br /&gt;&lt;br /&gt;    def __init__(self):&lt;br /&gt;        self.connection = pymongo.Connection()&lt;br /&gt;        self.database = self.connection.newStore&lt;br /&gt;        self.collection = self.database.newColl&lt;br /&gt;        self.imageName = "Uninitialized"&lt;br /&gt;        self.imageData = ""&lt;br /&gt;&lt;br /&gt;    def loadImage(self, imageUrl, imageTitle = "Undefined"):&lt;br /&gt;        try:&lt;br /&gt;            ptrImg = urllib2.Request(imageUrl)&lt;br /&gt;            ptrImgReq = urllib2.urlopen(ptrImg)&lt;br /&gt;            imageFeed = ptrImgReq.read()&lt;br /&gt;            self.imageData = pymongo.binary.Binary(imageFeed, pymongo.binary.BINARY_SUBTYPE)&lt;br /&gt;            self.imageName = imageTitle&lt;br /&gt;            ptrImgReq.close()&lt;br /&gt;       &lt;br /&gt;        except:&lt;br /&gt;            self.imageName = "Error " + str(sys.exc_info())&lt;br /&gt;            self.imageData = None&lt;br /&gt;&lt;br /&gt;    def persistImage(self):&lt;br /&gt;        if self.imageData == None:&lt;br /&gt;            print 'No data to persist'&lt;br /&gt;        else:&lt;br /&gt;            print 'Persisting ' + self.imageName&lt;br /&gt;            self.collection.insert({"name":self.imageName, "data":self.imageData})&lt;br /&gt;            self.imageData = None&lt;br /&gt;   &lt;br /&gt;    def renderImage(self, parm = None):&lt;br /&gt;        if parm == None:&lt;br /&gt;            self.imageData = self.collection.find_one({"name":self.imageName})&lt;br /&gt;        else:&lt;br /&gt;            self.imageName = parm&lt;br /&gt;            self.imageData = self.collection.find_one({"name":self.imageName})&lt;br /&gt;   &lt;br /&gt;        ptrApp = wx.PySimpleApp()&lt;br /&gt;        fout = file('d:/tmp.jpg', 'wb')&lt;br /&gt;        fout.write(self.imageData["data"])&lt;br /&gt;        fout.flush()&lt;br /&gt;        fout.close()&lt;br /&gt;        wximg = wx.Image('d:/tmp.jpg',wx.BITMAP_TYPE_JPEG)&lt;br /&gt;        wxbmp = wximg.ConvertToBitmap()&lt;br /&gt;        ptrFrame = wx.Frame(None, -1, "Show JPEG demo")&lt;br /&gt;        ptrFrame.SetSize(wxbmp.GetSize())&lt;br /&gt;        wx.StaticBitmap(ptrFrame, -1, wxbmp, (0,0))&lt;br /&gt;        ptrFrame.Show(True)&lt;br /&gt;        ptrApp.MainLoop()&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;img = Image()&lt;br /&gt;img.loadImage('http://i208.photobucket.com/albums/bb82/julianzzkj/Acapulco/e614.jpg', 'Acapulco at night')&lt;br /&gt;img.persistImage()&lt;br /&gt;img.renderImage('Acapulco at night')&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;I have had some problems with installing &lt;a href="http://www.pythonware.com/products/pil/"&gt;PIL&lt;/a&gt;, so this is certainly not optimal (I have to use &lt;a href="http://www.wxpython.org/"&gt;wx&lt;/a&gt; for image rendering instead, and I have not found a way of feeding a JPG datastream to an image constructor, hence the ugly recourse to a temporary file). However, the idea was to test how the database can store an image, which seems to work quite well, despite taking a few seconds to load a 300kb file.&lt;br /&gt;&lt;br /&gt;A &lt;span style="font-family:courier new;"&gt;findOne&lt;/span&gt; query returns:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;span style="color:#006600;"&gt;&gt; db.newColl.findOne()&lt;br /&gt;{&lt;br /&gt;        "_id" : ObjectId("4be82f74c7ccc11908000000"),&lt;br /&gt;        "data" : BinData type: 2 len: 345971,&lt;br /&gt;        "name" : "Acapulco at night"&lt;br /&gt;}&lt;br /&gt;&gt;&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Thanks are &lt;a href="http://www.velocityreviews.com/forums/t353096-display-of-jpeg-images-from-python.html"&gt;due&lt;/a&gt; for some of the wx code.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30166624-3516137826623912673?l=connectedsystems.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://connectedsystems.blogspot.com/feeds/3516137826623912673/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30166624&amp;postID=3516137826623912673' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30166624/posts/default/3516137826623912673'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30166624/posts/default/3516137826623912673'/><link rel='alternate' type='text/html' href='http://connectedsystems.blogspot.com/2010/05/blobing-in-mongo.html' title='BLOBing in Mongo'/><author><name>Razvan</name><uri>http://www.blogger.com/profile/01478237694157411648</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp1.blogger.com/_oKO4lXYJzFQ/SD-O3vBCSZI/AAAAAAAAACw/rLUH4XNTr8A/S220/rjp.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30166624.post-7446503167099110849</id><published>2010-04-29T09:41:00.000-07:00</published><updated>2010-06-02T02:25:33.056-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Databases'/><title type='text'>Some thoughts on NoSQL</title><content type='html'>So I have been playing with various database systems, many pertaining to the NoSQL category. Here are some thoughts:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Mongo is cool. I definitely like it. However, it differs from Cache in one important way: JSON objects are native to JavaScript. To everything else, they are just a text format (that Python can understand easily, true) not necessarily any more efficient than XML. Cache objects are more or less portable across languages and the impedance mismatch between the consumer and the database is definitely much less significant than in the case of Mongo;&lt;/li&gt;&lt;li&gt;Mongo is fast, and easy enough to understand for perhaps a dozen or two 'collections'. I am not sure how well it would support (or perform) with a 3000-table schema, which is not at all unlikely in an enterprise application. While the proliferation of tables is a perverse effect of relational normalization, the fact is that the relational model is easy to understand. Complex text representations of object hierarchies, which Mogo really allows for, might quickly spin out of control (assuming that the schema is kept under control by restricting access to the database through the front end, and object collections to not degenerate to the point of being simple bit buckets);&lt;/li&gt;&lt;li&gt;so Mongo might be best appropriate in an environment with a few deep entities with loose connections: e.g. 12-25 'tables' with million+ rows, especially for client apps that can read JSON (or derivatives: such as Python's collection objects) more or less natively.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;More on this:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;VoltDB @ &lt;a href="http://bit.ly/bePRVY"&gt;InformationWeek&lt;/a&gt;&lt;/li&gt;&lt;li&gt;and @ &lt;a href="http://bit.ly/dwI6IK"&gt;RWW&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30166624-7446503167099110849?l=connectedsystems.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://connectedsystems.blogspot.com/feeds/7446503167099110849/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30166624&amp;postID=7446503167099110849' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30166624/posts/default/7446503167099110849'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30166624/posts/default/7446503167099110849'/><link rel='alternate' type='text/html' href='http://connectedsystems.blogspot.com/2010/04/some-thoughts-on-nosql.html' title='Some thoughts on NoSQL'/><author><name>Razvan</name><uri>http://www.blogger.com/profile/01478237694157411648</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp1.blogger.com/_oKO4lXYJzFQ/SD-O3vBCSZI/AAAAAAAAACw/rLUH4XNTr8A/S220/rjp.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30166624.post-6667394433384885873</id><published>2010-04-29T05:11:00.001-07:00</published><updated>2010-04-29T05:13:43.750-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Programmable web'/><category scheme='http://www.blogger.com/atom/ns#' term='API'/><category scheme='http://www.blogger.com/atom/ns#' term='Databases'/><category scheme='http://www.blogger.com/atom/ns#' term='Python'/><title type='text'>Twitter Python Mongo</title><content type='html'>...or how many buzzwords can you get in one title. Here is a shortish piece of code that pulls data from Twitter and inserts it into Mongo. Other than the shortness of the code (given what it accomplishes!), what is remarkable is the ease of use of the data that is passed around, with a minimum amount of marshalling: Twitter can return data in JSON which is the native Mongo format and Python can use with a minimum of tweaking (mostly to reduce the response from Twitter).&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;import urllib&lt;br /&gt;import json&lt;br /&gt;import string&lt;br /&gt;from pymongo import Connection&lt;br /&gt;&lt;br /&gt;def runQuery(query, pp, pages):&lt;br /&gt; ret = []&lt;br /&gt; for pg in range(1, pages+1):&lt;br /&gt;  print 'page...' + str(pg)&lt;br /&gt;  p = urllib.urlopen('http://search.twitter.com/search.json?q=' + query + '&amp;rpp=' + str(pp) + '&amp;page=' + str(pg))&lt;br /&gt;  s = json.load(p)&lt;br /&gt;  dic = json.dumps(s)&lt;br /&gt;  dic = string.replace(dic, 'null', '"none"')&lt;br /&gt;  dx = eval(dic)&lt;br /&gt;  listOfResults = dx['results']&lt;br /&gt;  for result in listOfResults:&lt;br /&gt;   ret.append( { 'id':result['id'], 'from_user':result['from_user'], 'created_at':result['created_at'], 'text': result['text'] } )&lt;br /&gt;  completeRet = {"results": ret}&lt;br /&gt; return completeRet&lt;br /&gt;  &lt;br /&gt;c = Connection()&lt;br /&gt;d = c.twitterdb&lt;br /&gt;coll = d.postbucket&lt;br /&gt;res = runQuery('Iran', 100, 15)&lt;br /&gt;ptrData = res.get('results')&lt;br /&gt;for item in ptrData:&lt;br /&gt; coll.save(item)&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/30166624-6667394433384885873?l=connectedsystems.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://connectedsystems.blogspot.com/feeds/6667394433384885873/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30166624&amp;postID=6667394433384885873' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30166624/posts/default/6667394433384885873'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30166624/posts/default/6667394433384885873'/><link rel='alternate' type='text/html' href='http://connectedsystems.blogspot.com/2010/04/twitter-python-mongo.html' title='Twitter Python Mongo'/><author><name>Razvan</name><uri>http://www.blogger.com/profile/01478237694157411648</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp1.blogger.com/_oKO4lXYJzFQ/SD-O3vBCSZI/AAAAAAAAACw/rLUH4XNTr8A/S220/rjp.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30166624.post-7362804456397266650</id><published>2010-04-29T02:17:00.000-07:00</published><updated>2010-04-29T02:22:03.259-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Programmable web'/><category scheme='http://www.blogger.com/atom/ns#' term='API'/><category scheme='http://www.blogger.com/atom/ns#' term='Python'/><title type='text'>A Twitter Python web service</title><content type='html'>Taking the code from the previous post: here is a Python web service that reads the Twitter feed for a given query and returns a subset of the results in JSON:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;import urllib&lt;br /&gt;import json&lt;br /&gt;import string&lt;br /&gt;import SimpleXMLRPCServer&lt;br /&gt;from SimpleXMLRPCServer import SimpleXMLRPCServer&lt;br /&gt;from SimpleXMLRPCServer import SimpleXMLRPCRequestHandler&lt;br /&gt;&lt;br /&gt;def runQuery(query, pp, pages):&lt;br /&gt; p = urllib.urlopen('http://search.twitter.com/search.json?q=' + query + '&amp;rpp=' + str(pp) + '&amp;page=' + str(pages))&lt;br /&gt; s = json.load(p)&lt;br /&gt; dic = json.dumps(s)&lt;br /&gt; dic = string.replace(dic, 'null', '"none"')&lt;br /&gt; dx = eval(dic)&lt;br /&gt; listOfResults = dx['results']&lt;br /&gt; ret = []&lt;br /&gt; for result in listOfResults:&lt;br /&gt;  ret.append( { 'id':result['id'], 'from_user':result['from_user'], 'created_at':result['created_at'], 'text': result['text'] } )&lt;br /&gt; completeRet = {"results": json.dumps(str(ret))}&lt;br /&gt; return str(completeRet)&lt;br /&gt;  &lt;br /&gt;class RequestHandler(SimpleXMLRPCRequestHandler):&lt;br /&gt; rpc_paths=('/RPC2')&lt;br /&gt; &lt;br /&gt;server=SimpleXMLRPCServer(("localhost", 8000), requestHandler=RequestHandler)&lt;br /&gt;server.register_introspection_functions()&lt;br /&gt;server.register_function(runQuery, 'qry')&lt;br /&gt;server.serve_forever()&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;More potential uses of this (including Google Apps, Mongo, or Processing) later. And here is how to use it (from Python):&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&gt;&gt;&gt; import xmlrpclib&lt;br /&gt;&gt;&gt;&gt; s = xmlrpclib.ServerProxy('http://localhost:8000')&lt;br /&gt;&gt;&gt;&gt; print s.qry('Bumrungrad', 10, 1)&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Where the first numeric parameter is the number of records per page and the second, the number of page (max 100/15).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30166624-7362804456397266650?l=connectedsystems.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://connectedsystems.blogspot.com/feeds/7362804456397266650/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30166624&amp;postID=7362804456397266650' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30166624/posts/default/7362804456397266650'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30166624/posts/default/7362804456397266650'/><link rel='alternate' type='text/html' href='http://connectedsystems.blogspot.com/2010/04/twitter-python-web-service.html' title='A Twitter Python web service'/><author><name>Razvan</name><uri>http://www.blogger.com/profile/01478237694157411648</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp1.blogger.com/_oKO4lXYJzFQ/SD-O3vBCSZI/AAAAAAAAACw/rLUH4XNTr8A/S220/rjp.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30166624.post-8544220910271576471</id><published>2010-04-28T00:46:00.000-07:00</published><updated>2010-04-28T00:48:30.728-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Programmable web'/><category scheme='http://www.blogger.com/atom/ns#' term='Python'/><title type='text'>Twitter API</title><content type='html'>A bit of topical coding.... getting tweets regarding the situation in Bangkok:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&gt;&gt;&gt; import urllib&lt;br /&gt;&gt;&gt;&gt; from xml.dom import minidom&lt;br /&gt;&gt;&gt;&gt; p=urllib.urlopen('http://search.twitter.com/search.atom?q=Bangkok')&lt;br /&gt;&gt;&gt;&gt; xml=minidom.parse(p)&lt;br /&gt;&gt;&gt;&gt; p.close()&lt;br /&gt;&gt;&gt;&gt; nodes=xml.getElementsByTagName('title')&lt;br /&gt;&gt;&gt;&gt; for node in nodes:&lt;br /&gt; print node.firstChild.NodeValue&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br/&gt;It's the first time I try the Twitter API, and it seems simple enough!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30166624-8544220910271576471?l=connectedsystems.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://connectedsystems.blogspot.com/feeds/8544220910271576471/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30166624&amp;postID=8544220910271576471' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30166624/posts/default/8544220910271576471'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30166624/posts/default/8544220910271576471'/><link rel='alternate' type='text/html' href='http://connectedsystems.blogspot.com/2010/04/twitter-api.html' title='Twitter API'/><author><name>Razvan</name><uri>http://www.blogger.com/profile/01478237694157411648</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp1.blogger.com/_oKO4lXYJzFQ/SD-O3vBCSZI/AAAAAAAAACw/rLUH4XNTr8A/S220/rjp.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30166624.post-5144997344263109694</id><published>2010-04-27T05:28:00.000-07:00</published><updated>2010-04-29T04:30:37.553-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Databases'/><category scheme='http://www.blogger.com/atom/ns#' term='Python'/><title type='text'>Mongo and Cache</title><content type='html'>Some similarities:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;the system-generated row id: (&lt;em&gt;_id&lt;/em&gt; for Mongo)&lt;/li&gt;&lt;li&gt;object references, and a kind of relationship definition in Mongo:&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&gt; x = {name:'Lab test'}&lt;br /&gt;{ "name" : "Lab test" }&lt;br /&gt;&gt; db.second.save(x)&lt;br /&gt;&gt; pat = {name:'Amornrakot', test:[new  DBRef('second', x._id)]}&lt;br /&gt;{&lt;br /&gt;        "name" : "Amornrakot",&lt;br /&gt;        "test" : [&lt;br /&gt;                {&lt;br /&gt;                        "$ref" : "second",&lt;br /&gt;                        "$id" : ObjectId("4bd6d7c64e660000000f665a")&lt;br /&gt;                }&lt;br /&gt;        ]&lt;br /&gt;}&lt;br /&gt;&gt; pat.test[0].fetch()&lt;br /&gt;{ "_id" : ObjectId("4bd6d7c64e660000000f665a"), "name" : "Lab test" }&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;The similarities aren't surprising perhaps; it is the &lt;i&gt;differences&lt;/i&gt; that trouble me (in this case, Mongo's looseness - lack of structure); although SQLite was the first one to go down that path, by not enforcing strict data typing, and now Mongo doesn't even enforce schemas. A discussion on Mongo database design principles &lt;a href="http://www.mongodb.org/display/DOCS/Schema+Design"&gt;here&lt;/a&gt;.&lt;/p&gt;&lt;br /&gt;For now I have a couple of other questions:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;is there a reporting tool that binds to JSON/Mongo natively?&lt;/li&gt;&lt;li&gt;how do you update an existing JSON entry? just one tuple, not the entire record; some notes:&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:courier new;"&gt;var p = db.coll.findOne();&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:courier new;"&gt;p.member&lt;/span&gt; (notation supported, p is an object already and there is no need to &lt;span style="font-family:courier new;"&gt;eval()&lt;/span&gt; it; originally, say &lt;span style="font-family:courier new;"&gt;p{member:"y"}&lt;/span&gt; )&lt;span style="font-family:courier new;"&gt; = "x"&lt;/span&gt; and now p is disconnected from the collection, but &lt;span style="font-family:courier new;"&gt;db.coll.save(p)&lt;/span&gt; &lt;em&gt;does&lt;/em&gt; update it in place&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;What is cool is that you can save JS objects (declared using the JS object notation): &lt;/p&gt;&lt;p&gt;&lt;span style="font-family:courier new;"&gt;function pobj(param){this.p1=param;}&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:courier new;"&gt;var newObj = new pobj("test");&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:courier new;"&gt;db.coll.save(newObj);&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:courier new;"&gt;db.coll.find();&lt;/span&gt; returns { "_id" : ObjectId("4bd722a6eb29000000007ac4"), "p1" : "test" }. You can even 'serialize' objects' methods, and then call the method for the objects deserialized using &lt;span style="font-family:courier new;"&gt;findOne&lt;/span&gt;. All of this might be JS-specific candy, I am curious how this ports over to other language drivers.&lt;/p&gt;&lt;p&gt;So you can view Mongo as a (JS) object-oriented database, with &lt;em&gt;nothing&lt;/em&gt; in the way of SQL facilities though; a tuple serialization mechanism; a key-value pair list; a 'document'/hierarchical database using JSON as the document format (as opposed to xDB's XML), all of which are correct.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;strike&gt;Another question: when you have an embedded object, &lt;span style="font-family:courier new;"&gt;var ptrUser = {name : "Mr Iwata", address : { city : "Tokyo }},&lt;/span&gt; how do you search by the inner object properties? &lt;span style="font-family:courier new;"&gt;db.coll.find({address:{ city : "criteria" }}&lt;/span&gt; does not seem to work.&lt;/strike&gt;&lt;a href="http://www.mongodb.org/display/DOCS/Updating+Data+in+Mongo"&gt;RTfM&lt;/a&gt;&lt;/p&gt;&lt;br /&gt;Also, if you store objects with different structures in one collection, they can be inspected:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;from pymongo import Connection&lt;br /&gt;c = Connection()&lt;br /&gt;d = c.clinical&lt;br /&gt;coll = d.physician&lt;br /&gt;for item in coll.find():&lt;br /&gt; itmkeys = []&lt;br /&gt; print item.get("_id")&lt;br /&gt; for ky in item.iterkeys():&lt;br /&gt;  itmkeys.append(ky)&lt;br /&gt; print itmkeys&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;a href="http://en.wikipedia.org/wiki/JSON"&gt;Lots&lt;/a&gt; of interesting info at the Wikipedia JSON page.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30166624-5144997344263109694?l=connectedsystems.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://connectedsystems.blogspot.com/feeds/5144997344263109694/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30166624&amp;postID=5144997344263109694' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30166624/posts/default/5144997344263109694'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30166624/posts/default/5144997344263109694'/><link rel='alternate' type='text/html' href='http://connectedsystems.blogspot.com/2010/04/mongo-and-cache.html' title='Mongo and Cache'/><author><name>Razvan</name><uri>http://www.blogger.com/profile/01478237694157411648</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp1.blogger.com/_oKO4lXYJzFQ/SD-O3vBCSZI/AAAAAAAAACw/rLUH4XNTr8A/S220/rjp.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30166624.post-3375062264340125955</id><published>2010-04-26T21:07:00.000-07:00</published><updated>2010-05-05T23:00:56.859-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Processing'/><category scheme='http://www.blogger.com/atom/ns#' term='Widgets'/><category scheme='http://www.blogger.com/atom/ns#' term='Visualization'/><category scheme='http://www.blogger.com/atom/ns#' term='information economics'/><title type='text'>Data visualization</title><content type='html'>Some resources:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.tableausoftware.com/data-visualization-software"&gt;Tableau Software&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://smartdatacollective.com/"&gt;Smart Data Collective&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.itoworld.com/"&gt;ITO World&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://vis.stanford.edu/protovis/"&gt;Protovis&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30166624-3375062264340125955?l=connectedsystems.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://connectedsystems.blogspot.com/feeds/3375062264340125955/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30166624&amp;postID=3375062264340125955' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30166624/posts/default/3375062264340125955'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30166624/posts/default/3375062264340125955'/><link rel='alternate' type='text/html' href='http://connectedsystems.blogspot.com/2010/04/data-visualization.html' title='Data visualization'/><author><name>Razvan</name><uri>http://www.blogger.com/profile/01478237694157411648</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp1.blogger.com/_oKO4lXYJzFQ/SD-O3vBCSZI/AAAAAAAAACw/rLUH4XNTr8A/S220/rjp.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30166624.post-5526507557400701316</id><published>2010-04-26T05:30:00.001-07:00</published><updated>2010-04-26T21:09:51.794-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Programmable web'/><category scheme='http://www.blogger.com/atom/ns#' term='Visualization'/><category scheme='http://www.blogger.com/atom/ns#' term='Python'/><title type='text'>Very basic Google Chart</title><content type='html'>&lt;ul&gt;&lt;li&gt;create the URL&lt;/li&gt;&lt;li&gt;you can then pull it in Python:&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;pre&gt;&lt;br /&gt;&gt;&gt;&gt; import urllib&lt;br /&gt;&gt;&gt;&gt; p=urlopen('http://chart.apis.google.com/chart?chs=250x100&amp;amp;chd=t:60,40,90,20&amp;amp;cht=p3')&lt;br /&gt;&gt;&gt;&gt; data = p.read()&lt;br /&gt;&gt;&gt;&gt; f = file('d:\\file.png', 'wb')&lt;br /&gt;&gt;&gt;&gt; f.write(data)&lt;br /&gt;&gt;&gt;&gt; f.close()&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;p&gt;&lt;br /&gt;&lt;iframe height="100%" src="http://chart.apis.google.com/chart?chs=250x100&amp;amp;chd=t:60,40,90,20&amp;amp;cht=p3" width="100%"&gt;&lt;br /&gt;&lt;/iframe&gt;&lt;/p&gt;&lt;p&gt;It's quite easy to build the URL based on the data in a Googledoc spreadsheet: (code modified from Google's own documentation)&lt;/p&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;try:&lt;br /&gt;  from xml.etree import ElementTree&lt;br /&gt;except ImportError: &lt;br /&gt;  from elementtree import ElementTree&lt;br /&gt;import gdata.spreadsheet.service&lt;br /&gt;import gdata.service&lt;br /&gt;import atom.service&lt;br /&gt;import gdata.spreadsheet&lt;br /&gt;import atom&lt;br /&gt;import string&lt;br /&gt;&lt;br /&gt;def main():&lt;br /&gt; gd_client = gdata.spreadsheet.service.SpreadsheetsService()&lt;br /&gt; gd_client.email = '______________@gmail.com'&lt;br /&gt; gd_client.password = '________'&lt;br /&gt; gd_client.source = 'SpreadSheet data source'&lt;br /&gt; gd_client.ProgrammaticLogin()&lt;br /&gt;&lt;br /&gt; print 'List of spreadsheets'&lt;br /&gt; feed = gd_client.GetSpreadsheetsFeed()&lt;br /&gt; PrintFeed(feed)&lt;br /&gt;&lt;br /&gt; key = feed.entry[string.atoi('0')].id.text.rsplit('/', 1)[1]&lt;br /&gt;&lt;br /&gt; print 'Worksheets for spreadsheet 0'&lt;br /&gt; feed = gd_client.GetWorksheetsFeed(key)&lt;br /&gt; PrintFeed(feed)&lt;br /&gt;&lt;br /&gt; key_w = feed.entry[string.atoi('0')].id.text.rsplit('/', 1)[1]&lt;br /&gt;&lt;br /&gt; print 'Contents of worksheet'&lt;br /&gt; feed = gd_client.GetListFeed(key, key_w)&lt;br /&gt; PrintFeed(feed)&lt;br /&gt;&lt;br /&gt; return&lt;br /&gt;&lt;br /&gt;def PrintFeed(feed):&lt;br /&gt; for i, entry in enumerate(feed.entry):&lt;br /&gt;     if isinstance(feed, gdata.spreadsheet.SpreadsheetsCellsFeed):&lt;br /&gt;  print 'Cells Feed: %s %s\n' % (entry.title.text, entry.content.text)&lt;br /&gt;     elif isinstance(feed, gdata.spreadsheet.SpreadsheetsListFeed):&lt;br /&gt;  print 'List Feed: %s %s %s' % (i, entry.title.text, entry.content.text)&lt;br /&gt;  print ' Contents:'&lt;br /&gt;  for key in entry.custom:&lt;br /&gt;      print '  %s: %s' % (key, entry.custom[key].text)&lt;br /&gt;      print '\n',&lt;br /&gt;     else:&lt;br /&gt;  print 'Other Feed: %s. %s\n' % (i, entry.title.text)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;if __name__ == "__main__":&lt;br /&gt;    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/30166624-5526507557400701316?l=connectedsystems.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://connectedsystems.blogspot.com/feeds/5526507557400701316/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30166624&amp;postID=5526507557400701316' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30166624/posts/default/5526507557400701316'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30166624/posts/default/5526507557400701316'/><link rel='alternate' type='text/html' href='http://connectedsystems.blogspot.com/2010/04/very-basic-google-chart.html' title='Very basic Google Chart'/><author><name>Razvan</name><uri>http://www.blogger.com/profile/01478237694157411648</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp1.blogger.com/_oKO4lXYJzFQ/SD-O3vBCSZI/AAAAAAAAACw/rLUH4XNTr8A/S220/rjp.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30166624.post-222012167342480111</id><published>2010-04-23T07:08:00.000-07:00</published><updated>2010-04-23T07:30:47.692-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='HealthVault'/><category scheme='http://www.blogger.com/atom/ns#' term='Programmable web'/><category scheme='http://www.blogger.com/atom/ns#' term='API'/><category scheme='http://www.blogger.com/atom/ns#' term='Hosting'/><category scheme='http://www.blogger.com/atom/ns#' term='Python'/><title type='text'>NHS Choices on GoogleApps</title><content type='html'>&lt;br/&gt;&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/_oKO4lXYJzFQ/S9GumGE_DsI/AAAAAAAAAIk/YVmX_2fOE6U/s1600/nhschoice.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 298px;" src="http://3.bp.blogspot.com/_oKO4lXYJzFQ/S9GumGE_DsI/AAAAAAAAAIk/YVmX_2fOE6U/s320/nhschoice.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5463339792466906818" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;&lt;a href="http://nhschoice1.appspot.com/"&gt;Here&lt;/a&gt; is the Google Apps version of the (Python) NHS Choices application I discussed in the previous posts.&lt;br /&gt;&lt;br /&gt;I can't even begin to say how cool this is. 3 hours in Notepad (hence the crudeness) and we get the hospitals in the UK, from anywhere. This is really amazing.&lt;br /&gt;&lt;br /&gt;The &lt;a href="http://bit.ly/brefci"&gt;source code&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30166624-222012167342480111?l=connectedsystems.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://connectedsystems.blogspot.com/feeds/222012167342480111/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30166624&amp;postID=222012167342480111' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30166624/posts/default/222012167342480111'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30166624/posts/default/222012167342480111'/><link rel='alternate' type='text/html' href='http://connectedsystems.blogspot.com/2010/04/nhs-choices-on-googleapps.html' title='NHS Choices on GoogleApps'/><author><name>Razvan</name><uri>http://www.blogger.com/profile/01478237694157411648</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp1.blogger.com/_oKO4lXYJzFQ/SD-O3vBCSZI/AAAAAAAAACw/rLUH4XNTr8A/S220/rjp.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_oKO4lXYJzFQ/S9GumGE_DsI/AAAAAAAAAIk/YVmX_2fOE6U/s72-c/nhschoice.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30166624.post-2641510125309611932</id><published>2010-04-11T23:21:00.001-07:00</published><updated>2010-04-17T00:14:37.985-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Python'/><title type='text'>Searching in Python</title><content type='html'>&lt;span xmlns=""&gt; &lt;p&gt;There is perhaps a more Pyhton-specific way of storing the data to be loaded into the Mongo database: a list of dictionaries. In this case, a dictionary is defined as &lt;span style="font-family:Courier New;font-size:9;color:#1f497d;"&gt;{'name':__name__, 'service':__service__, 'web':__web__}&lt;/span&gt;.To add an element to the holding list (say, NHS&lt;span style="color:#1f497d;"&gt;): &lt;span style="font-family:Courier New;font-size:9;"&gt;NHS.append({'name':'Wigan General', 'service':5, 'web':None})&lt;/span&gt;&lt;/span&gt;. Then, a function can be defined which will return the index of the list containing the element matching its parameter; i.e.:&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;font-size:9;color:#1f497d;"&gt;&amp;gt;&amp;gt;&amp;gt; def idx(ky, val):&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;font-size:9;color:#1f497d;"&gt;    for item in NHS:&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;font-size:9;color:#1f497d;"&gt;        if item[ky] == val:&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;font-size:9;color:#1f497d;"&gt;            return NHS.index(item)&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt; &lt;/p&gt;&lt;p&gt;Usage:&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;font-size:9;"&gt;&lt;span style="color:#1f497d;"&gt;&amp;gt;&amp;gt;&amp;gt; print idx('name', 'Wigan General')&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;will yield Wigan's index in the list. I'm quite curious how fast this is with several thousand records! But Python's ability to easily make sense of a complex data structure is impressive.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt; &lt;/p&gt;&lt;p&gt;Another way of searching, using list comprehensions:&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt; &lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;font-size:9;color:#1f497d;"&gt;&amp;gt;&amp;gt;&amp;gt; def idx2(ky, val):&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;font-size:9;color:#1f497d;"&gt;    lstIdx = [item[ky] == val for item in NHS]&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;font-size:9;color:#1f497d;"&gt;    return lstIdx.index(True)&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt; &lt;/p&gt;&lt;p&gt;It would also be interesting to know if the bytecode generated by Python is different between the two.&lt;br /&gt;&lt;/p&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30166624-2641510125309611932?l=connectedsystems.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://connectedsystems.blogspot.com/feeds/2641510125309611932/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30166624&amp;postID=2641510125309611932' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30166624/posts/default/2641510125309611932'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30166624/posts/default/2641510125309611932'/><link rel='alternate' type='text/html' href='http://connectedsystems.blogspot.com/2010/04/searching-in-python.html' title='Searching in Python'/><author><name>Razvan</name><uri>http://www.blogger.com/profile/01478237694157411648</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp1.blogger.com/_oKO4lXYJzFQ/SD-O3vBCSZI/AAAAAAAAACw/rLUH4XNTr8A/S220/rjp.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30166624.post-7938403420910054702</id><published>2010-04-10T04:46:00.001-07:00</published><updated>2010-04-22T04:59:22.342-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='HealthVault'/><category scheme='http://www.blogger.com/atom/ns#' term='Programmable web'/><category scheme='http://www.blogger.com/atom/ns#' term='API'/><category scheme='http://www.blogger.com/atom/ns#' term='Databases'/><category scheme='http://www.blogger.com/atom/ns#' term='Python'/><title type='text'>Mongo, Python, and NHS Choices</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.nhs.uk/nhscwebservices/documents/logo1.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 170px; height: 40px;" src="http://www.nhs.uk/nhscwebservices/documents/logo1.jpg" border="0" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span xmlns=""&gt; &lt;p&gt;Using Python, &lt;a href="http://www.nhs.uk/aboutNHSChoices/professionals/syndication/Pages/Webservices.aspx"&gt;NHS open data&lt;/a&gt; (&lt;em&gt;NHS Choices&lt;/em&gt;), and Mongo: for example, getting the name and the web sites of all the providers in the Wigan area (why Wigan? No idea, just that their football team &lt;del&gt;seems to be pretty bad&lt;/del&gt; recently defeated Arsenal, and the name stuck with me).&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Start the database&lt;/strong&gt;: go to the bin subdirectory of the install directory, and type &lt;span style="font-family:Courier New;"&gt;mongod –dbpath .\&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;I will connect to the database using the Python API (&lt;em&gt;&lt;a href="http://api.mongodb.org/python/1.5.2%2B/tutorial.html"&gt;pymongo&lt;/a&gt;&lt;/em&gt;).&lt;br /&gt;&lt;/p&gt;&lt;p&gt;NHS choices offers several health data feeds:&lt;br /&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;News&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Find Services&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Live Well&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Health A-Z (Conditions)&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Common Health Questions&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;As mentioned, I will use the second; to access it, you need to get a password and a login (apply for one &lt;a href="http://www.nhs.uk/aboutNHSChoices/professionals/syndication/Pages/Webservices.aspx"&gt;here&lt;/a&gt;).&lt;br /&gt;&lt;/p&gt;&lt;p&gt;The &lt;strong&gt;basic Python code&lt;/strong&gt; to query for providers and extract their names and web addresses is this:&lt;br /&gt;&lt;/p&gt;&lt;p&gt;First, build a list of services, as per the NHS documentation (the service code and the location are two required parameters):&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;font-size:9;color:#1f497d;"&gt;services = [[1, 'GPs'], [2,'Dentists'], etc]&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;Then, query the web service:&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;font-size:9;color:#1f497d;"&gt;for x in range(0, len(services)):&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;font-size:9;color:#1f497d;"&gt;endpoint='http://www.nhs.uk/NHSCWS/Services/ServicesSearch.aspx?user=__login__&amp;amp;pwd=__password__&amp;amp;q=Wigan&amp;amp;type=' + str(x)&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;font-size:9;color:#1f497d;"&gt;usock=urllib.urlopen(endpoint)&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;font-size:9;color:#1f497d;"&gt;xmldoc=minidom.parse(usock)&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;font-size:9;color:#1f497d;"&gt;usock.close()&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;font-size:9;color:#1f497d;"&gt;nodes = xmldoc.getElementsByTagName("Service")&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;font-size:9;color:#1f497d;"&gt;for node in nodes:&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;font-size:9;color:#1f497d;"&gt;website = node.getElementsByTagName("Website")&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;font-size:9;color:#1f497d;"&gt;name = node.getElementsByTagName("Name")&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;font-size:9;color:#1f497d;"&gt;&lt;br /&gt;&lt;/span&gt; &lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;font-size:9;color:#1f497d;"&gt;if website[0].firstChild &amp;lt;&amp;gt; None:&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;font-size:9;color:#1f497d;"&gt;xmldoc.unlink()&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;The response will have a 3-item dataset, the service type, the provider name, and the web site (if one exists).&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Mongo is a bit different in that the 'server' does not create a database physically until something is written to that database, so from the console client (launch, in \bin\: &lt;span style="font-family:Courier New;"&gt;mongo&lt;/span&gt;) you can connect to a database that does not exist yet (&lt;span style="font-family:Courier New;"&gt;use NHS&lt;/span&gt; in this case will create the NHS database - in effect, it will create files named NHS in the current directory).&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Creating the 'table' from the console client&lt;/strong&gt;: &lt;span style="font-family:Courier New;"&gt;NHS = { service : "service", name : "name", website : "website" };&lt;/span&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;"&gt;db.data.save(NHS);&lt;/span&gt; will create a collection (similar to SQL namespaces) and save the NHS table into it. The mongo client uses JavaScript as language and JSON notation to define the tables.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;To access this collection in Python:&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;font-size:9;color:#1f497d;"&gt;&amp;gt;&amp;gt;&amp;gt; from pymongo import Connection&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;font-size:9;color:#1f497d;"&gt;&amp;gt;&amp;gt;&amp;gt; connection = Connection()&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;font-size:9;color:#1f497d;"&gt;&amp;gt;&amp;gt;&amp;gt; db=connection.NHS&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;font-size:9;color:#1f497d;"&gt;&amp;gt;&amp;gt;&amp;gt; storage=db.data&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;font-size:9;color:#1f497d;"&gt;&amp;gt;&amp;gt;&amp;gt; post={"service" : 1, "name" : "python", "website" : "mongo" }&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;font-size:9;color:#1f497d;"&gt;&amp;gt;&amp;gt;&amp;gt; storage.insert(post)&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Here is the &lt;strong&gt;full code in Python&lt;/strong&gt; to populate the database:&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;font-size:9;color:#1f497d;"&gt;import urllib&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;font-size:9;color:#1f497d;"&gt;from xml.dom import minidom&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;font-size:9;color:#1f497d;"&gt;from pymongo import Connection&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;font-size:9;color:#1f497d;"&gt;print "Building list of services..."&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;font-size:9;color:#1f497d;"&gt;services = [[1, 'GPs'], [2,'Dentists'], [3, 'Pharmacists'], [4, 'Opticians'], [5, 'Hospitals'], [7, 'Walk-in centres'],[9, 'Stop-smoking services'], [10, 'NHS trusts'], [11, 'Sexual health services'], [12,' DISABLED (Maternity units)'], [13, 'Sport and fitness services'], [15, 'Parenting &amp;amp; Childcare services'], [17, 'Alcohol services'], [19, 'Services for carers'], [20, 'Renal Services'], [21, 'Minor injuries units'], [22, 'Mental health services'], [23, 'Breast cancer screening'], [24, 'Support for independent living'], [26, 'Memory problems'], [27, 'Termination of pregnancy (abortion) clinics'], [28, 'Foot services'], [29, 'Diabetes clinics'], [30, 'Asthma clinics'], [31,' Midwifery teams'], [32, 'Community clinics']]&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;font-size:9;color:#1f497d;"&gt;print "Connecting to the database..."&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;font-size:9;color:#1f497d;"&gt;connection = Connection()&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;font-size:9;color:#1f497d;"&gt;db = connection.NHS&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;font-size:9;color:#1f497d;"&gt;storage = db.data&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;font-size:9;color:#1f497d;"&gt;print "Scanning the web service..."&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;font-size:9;color:#1f497d;"&gt;for x in range(0, len(services)):&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;font-size:9;color:#1f497d;"&gt;print '*** ' + services[x][1] + ' ***'&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;font-size:9;color:#1f497d;"&gt;endpoint='http://www.nhs.uk/NHSCWS/Services/ServicesSearch.aspx?user=__login__&amp;amp;pwd=__password__&amp;amp;q=Wigan&amp;amp;type=' + str(x)&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;font-size:9;color:#1f497d;"&gt;usock=urllib.urlopen(endpoint)&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;font-size:9;color:#1f497d;"&gt;xmldoc=minidom.parse(usock)&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;font-size:9;color:#1f497d;"&gt;usock.close()&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;font-size:9;color:#1f497d;"&gt;nodes = xmldoc.getElementsByTagName("Service")&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;font-size:9;color:#1f497d;"&gt;for node in nodes:&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;font-size:9;color:#1f497d;"&gt;website = node.getElementsByTagName("Website")&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;font-size:9;color:#1f497d;"&gt;name = node.getElementsByTagName("Name")&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;font-size:9;color:#1f497d;"&gt;namei = name[0].firstChild.nodeValue&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;font-size:9;color:#1f497d;"&gt;if website[0].firstChild &amp;lt;&amp;gt; None:&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;font-size:9;color:#1f497d;"&gt;websitei = ' ' + website[0].firstChild.nodeValue&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;font-size:9;color:#1f497d;"&gt;else:&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;font-size:9;color:#1f497d;"&gt;websitei = 'none'&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;font-size:9;color:#1f497d;"&gt;post = { "service" : x, "name" : namei, "website" : websitei }&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;font-size:9;color:#1f497d;"&gt;storage.insert(post)&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;font-size:9;color:#1f497d;"&gt;xmldoc.unlink()&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color:black;"&gt;To &lt;strong&gt;see the results&lt;/strong&gt; from the Mongo client:&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;font-size:9;color:#1f497d;"&gt;&amp;gt; db.data.find({service:5}).forEach(function(x){print(tojson(x));});&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color:black;"&gt;Will return all the hospitals inserted in the database (service for hospitals = 5); the response looks like this:&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;font-size:9;color:#00b050;"&gt;{&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;font-size:9;color:#00b050;"&gt;"_id" : ObjectId("4bc062dbc7ccc10428000032"),&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;font-size:9;color:#00b050;"&gt;"website" : " http://www.wiganleigh.nhs.uk/Internet/Home/Hospitals/tlc.asp",&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;font-size:9;color:#00b050;"&gt;"name" : "Thomas Linacre Outpatient Centre",&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;font-size:9;color:#00b050;"&gt;"service" : 5&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;font-size:9;color:#00b050;"&gt;}&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Next, it might be interesting to try this using Mongo's REST API, and perhaps to build a GoogleApp to do so.&lt;/p&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30166624-7938403420910054702?l=connectedsystems.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://connectedsystems.blogspot.com/feeds/7938403420910054702/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30166624&amp;postID=7938403420910054702' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30166624/posts/default/7938403420910054702'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30166624/posts/default/7938403420910054702'/><link rel='alternate' type='text/html' href='http://connectedsystems.blogspot.com/2010/04/mongo-python-and-nhs-choices.html' title='Mongo, Python, and NHS Choices'/><author><name>Razvan</name><uri>http://www.blogger.com/profile/01478237694157411648</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp1.blogger.com/_oKO4lXYJzFQ/SD-O3vBCSZI/AAAAAAAAACw/rLUH4XNTr8A/S220/rjp.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30166624.post-8240282073983094124</id><published>2010-04-09T10:55:00.000-07:00</published><updated>2010-04-09T10:58:35.800-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Hosting'/><title type='text'>Internet, 247</title><content type='html'>&lt;a href="http://4.bp.blogspot.com/_oKO4lXYJzFQ/S79qwoPgfVI/AAAAAAAAAIc/lmI6Z2PhM6k/s1600/error.jpg"&gt;&lt;img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 320px; DISPLAY: block; HEIGHT: 166px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5458198657065057618" border="0" alt="" src="http://4.bp.blogspot.com/_oKO4lXYJzFQ/S79qwoPgfVI/AAAAAAAAAIc/lmI6Z2PhM6k/s320/error.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div&gt;This is tiresome. I've complained about it before. Until there is a seamless Internet experience, where things work most of the time, I won't buy into the Internet platform. It's unreliable.&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30166624-8240282073983094124?l=connectedsystems.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://connectedsystems.blogspot.com/feeds/8240282073983094124/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30166624&amp;postID=8240282073983094124' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30166624/posts/default/8240282073983094124'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30166624/posts/default/8240282073983094124'/><link rel='alternate' type='text/html' href='http://connectedsystems.blogspot.com/2010/04/internet-247.html' title='Internet, 247'/><author><name>Razvan</name><uri>http://www.blogger.com/profile/01478237694157411648</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp1.blogger.com/_oKO4lXYJzFQ/SD-O3vBCSZI/AAAAAAAAACw/rLUH4XNTr8A/S220/rjp.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_oKO4lXYJzFQ/S79qwoPgfVI/AAAAAAAAAIc/lmI6Z2PhM6k/s72-c/error.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30166624.post-5129458073572478762</id><published>2010-04-09T01:41:00.000-07:00</published><updated>2010-04-09T07:55:29.451-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Databases'/><title type='text'>Mongo</title><content type='html'>&lt;a href="http://2.bp.blogspot.com/_oKO4lXYJzFQ/S78_0kciwTI/AAAAAAAAAIU/BB_Waji3a-4/s1600/Mongo.jpg"&gt;&lt;img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 320px; DISPLAY: block; HEIGHT: 148px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5458151445765472562" border="0" alt="" src="http://2.bp.blogspot.com/_oKO4lXYJzFQ/S78_0kciwTI/AAAAAAAAAIU/BB_Waji3a-4/s320/Mongo.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div&gt;Yet &lt;a href="http://www.mongodb.org/display/DOCS/Home"&gt;another &lt;/a&gt;non-relational database. There definitely seems to be a trend in that direction, a market corner that the RDBMS's do not address convincingly. I would guess that for a general purpose system, which might have power users/report writers, a full-fledged database makes sense, but for a turnkey system where speed is important and there is no need to expose too much of the internals to the users, this type of offering is useful.&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30166624-5129458073572478762?l=connectedsystems.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://connectedsystems.blogspot.com/feeds/5129458073572478762/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30166624&amp;postID=5129458073572478762' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30166624/posts/default/5129458073572478762'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30166624/posts/default/5129458073572478762'/><link rel='alternate' type='text/html' href='http://connectedsystems.blogspot.com/2010/04/mongo.html' title='Mongo'/><author><name>Razvan</name><uri>http://www.blogger.com/profile/01478237694157411648</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp1.blogger.com/_oKO4lXYJzFQ/SD-O3vBCSZI/AAAAAAAAACw/rLUH4XNTr8A/S220/rjp.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_oKO4lXYJzFQ/S78_0kciwTI/AAAAAAAAAIU/BB_Waji3a-4/s72-c/Mongo.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30166624.post-6153683588610684915</id><published>2010-04-03T07:54:00.001-07:00</published><updated>2010-04-03T07:58:23.579-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Databases'/><title type='text'>More Cache-specific features</title><content type='html'>&lt;span xmlns=""&gt; &lt;p&gt;&lt;span style="font-size:12;"&gt;Using &lt;strong&gt;dates&lt;/strong&gt; in Cache: (an alternative to &lt;a href="http://connectedsystems.blogspot.com/2010/03/cache-dates.html"&gt;this&lt;/a&gt;)&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="color:#1f497d;"&gt;Class Person…. { DOB As %Date }&lt;br /&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="color:#1f497d;"&gt;INSERT INTO Person(… DOB) VALUES(…, TO_DATE('12 Jan 1989')&lt;br /&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;span style="font-size:12;"&gt;Using &lt;strong&gt;queries&lt;/strong&gt; in Cache:&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color:navy;"&gt;Class HIS.Patient Extends %Persistent&lt;/span&gt;&lt;br /&gt;&lt;span style="color:black;"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color:navy;"&gt;Property &lt;/span&gt;&lt;span style="color:black;"&gt;Name &lt;/span&gt;&lt;span style="color:navy;"&gt;As %String&lt;/span&gt;&lt;span style="color:black;"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color:navy;"&gt;Property &lt;/span&gt;&lt;span style="color:black;"&gt;DOB &lt;/span&gt;&lt;span style="color:navy;"&gt;As %Date&lt;/span&gt;&lt;span style="color:black;"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color:navy;"&gt;Property &lt;/span&gt;&lt;span style="color:black;"&gt;Inpatient &lt;/span&gt;&lt;span style="color:navy;"&gt;As %Boolean&lt;/span&gt;&lt;span style="color:black;"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color:navy;"&gt;/// Class query&lt;/span&gt;&lt;br /&gt;&lt;span style="color:navy;"&gt;Query &lt;/span&gt;&lt;span style="color:black;"&gt;GetInpatients(&lt;/span&gt;&lt;span style="color:fuchsia;"&gt;Inpatient &lt;/span&gt;&lt;span style="color:navy;"&gt;As %Boolean&lt;/span&gt;&lt;span style="color:black;"&gt;=&lt;/span&gt;&lt;span style="color:navy;"&gt;1&lt;/span&gt;&lt;span style="color:black;"&gt;) &lt;/span&gt;&lt;span style="color:navy;"&gt;As %SQLQuery&lt;/span&gt;&lt;span style="color:black;"&gt;(&lt;/span&gt;&lt;span style="color:navy;"&gt;SELECTMODE&lt;/span&gt;&lt;span style="color:black;"&gt;=&lt;/span&gt;&lt;span style="color:purple;"&gt;"RUNTIME"&lt;/span&gt;&lt;span style="color:black;"&gt;)&lt;/span&gt;&lt;br /&gt;&lt;span style="color:black;"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;span style="color:blue;"&gt;SELECT &lt;/span&gt;&lt;span style="color:navy;"&gt;* FROM &lt;/span&gt;&lt;span style="color:green;"&gt;Patient&lt;/span&gt;&lt;br /&gt;&lt;span style="color:navy;"&gt;WHERE &lt;/span&gt;&lt;span style="color:green;"&gt;Inpatient &lt;/span&gt;&lt;span style="color:black;"&gt;= &lt;/span&gt;&lt;span style="color:maroon;"&gt;:Inpatient&lt;/span&gt;&lt;br /&gt;&lt;span style="color:navy;"&gt;ORDER BY &lt;/span&gt;&lt;span style="color:green;"&gt;Name&lt;/span&gt;&lt;br /&gt;&lt;span style="color:black;"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color:black;"&gt;}&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size:12;color:black;"&gt;Insert some data in SQL, then:&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="color:#1f497d;"&gt;S rset=##class(%RecordSet).%New()&lt;br /&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="color:#1f497d;"&gt;S rset.ClassName="HIS.Patient"&lt;br /&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="color:#1f497d;"&gt;S rset.QueryName="GetInpatients"&lt;br /&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="color:#1f497d;"&gt;Do rset.Execute(1)&lt;br /&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="color:#1f497d;"&gt;W rset.Next()&lt;br /&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;If result is 1, &lt;span style="color:#1f497d;"&gt;w rset.Data("Name")&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30166624-6153683588610684915?l=connectedsystems.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://connectedsystems.blogspot.com/feeds/6153683588610684915/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30166624&amp;postID=6153683588610684915' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30166624/posts/default/6153683588610684915'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30166624/posts/default/6153683588610684915'/><link rel='alternate' type='text/html' href='http://connectedsystems.blogspot.com/2010/04/more-cache-specific-features.html' title='More Cache-specific features'/><author><name>Razvan</name><uri>http://www.blogger.com/profile/01478237694157411648</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp1.blogger.com/_oKO4lXYJzFQ/SD-O3vBCSZI/AAAAAAAAACw/rLUH4XNTr8A/S220/rjp.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30166624.post-4280661484532088103</id><published>2010-04-03T07:53:00.001-07:00</published><updated>2010-04-21T03:04:21.695-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Databases'/><title type='text'>Cache Streams</title><content type='html'>&lt;span xmlns=""&gt; &lt;p&gt;Used to store large (&amp;gt;32k) amounts of data:&lt;br /&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;binary&lt;br /&gt;&lt;/li&gt;&lt;li&gt;character&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Hence, streams are supersized binary (%Binary) or character (%String) types. The difference with other databases systems is that streams in Cache can be stored in external files or database global variables.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;The following code:&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color:navy;"&gt;Class CM.Patient Extends %Persistent&lt;/span&gt;&lt;br /&gt;&lt;span style="color:black;"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color:navy;"&gt;Property &lt;/span&gt;&lt;span style="color:black;"&gt;PatientName &lt;/span&gt;&lt;span style="color:navy;"&gt;As %String&lt;/span&gt;&lt;span style="color:black;"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color:navy;"&gt;Property &lt;/span&gt;&lt;span style="color:black;"&gt;PatientData &lt;/span&gt;&lt;span style="color:navy;"&gt;As %FileCharacterStream&lt;/span&gt;&lt;span style="color:black;"&gt;(&lt;/span&gt;&lt;span style="color:navy;"&gt;LOCATION &lt;/span&gt;&lt;span style="color:black;"&gt;= &lt;/span&gt;&lt;span style="color:purple;"&gt;"D:/"&lt;/span&gt;&lt;span style="color:black;"&gt;);&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color:black;"&gt;}&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color:black;"&gt;Executed in Terminal:&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color:#1f497d;"&gt;&amp;gt; DO %^CD&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color:#1f497d;"&gt;&amp;gt; S p = ##class(CM.Patient).%New()&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color:#1f497d;"&gt;&amp;gt; DO p.PatientData.Write("Test")&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Will create a temporary file on drive D: where the "Test" string will be written to; when the Terminal session ends, the file will be deleted as the object is garbage-collected. In the order for the stream to persist, you have to %Save() the object.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;SQL Server just recently started &lt;a href="http://www.simple-talk.com/sql/learn-sql-server/an-introduction-to-sql-server-filestream/"&gt;offering&lt;/a&gt; FILESTREAMs.&lt;/p&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30166624-4280661484532088103?l=connectedsystems.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://connectedsystems.blogspot.com/feeds/4280661484532088103/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30166624&amp;postID=4280661484532088103' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30166624/posts/default/4280661484532088103'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30166624/posts/default/4280661484532088103'/><link rel='alternate' type='text/html' href='http://connectedsystems.blogspot.com/2010/04/cache-streams.html' title='Cache Streams'/><author><name>Razvan</name><uri>http://www.blogger.com/profile/01478237694157411648</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp1.blogger.com/_oKO4lXYJzFQ/SD-O3vBCSZI/AAAAAAAAACw/rLUH4XNTr8A/S220/rjp.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30166624.post-7749692527811485740</id><published>2010-04-03T04:15:00.001-07:00</published><updated>2010-04-03T04:15:45.418-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Programmable web'/><category scheme='http://www.blogger.com/atom/ns#' term='information economics'/><title type='text'>O'Reilly's take on the IOS</title><content type='html'>Interesting, the &lt;a href="http://radar.oreilly.com/2010/03/state-of-internet-operating-system.html"&gt;Internet Operating System&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30166624-7749692527811485740?l=connectedsystems.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://connectedsystems.blogspot.com/feeds/7749692527811485740/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30166624&amp;postID=7749692527811485740' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30166624/posts/default/7749692527811485740'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30166624/posts/default/7749692527811485740'/><link rel='alternate' type='text/html' href='http://connectedsystems.blogspot.com/2010/04/oreillys-take-on-ios.html' title='O&apos;Reilly&apos;s take on the IOS'/><author><name>Razvan</name><uri>http://www.blogger.com/profile/01478237694157411648</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp1.blogger.com/_oKO4lXYJzFQ/SD-O3vBCSZI/AAAAAAAAACw/rLUH4XNTr8A/S220/rjp.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30166624.post-8871030190129651326</id><published>2010-03-31T04:53:00.000-07:00</published><updated>2010-03-31T06:00:24.486-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Programmable web'/><category scheme='http://www.blogger.com/atom/ns#' term='API'/><category scheme='http://www.blogger.com/atom/ns#' term='Databases'/><title type='text'>Everything is searchable</title><content type='html'>Interesting things happening while I wasn't watching. Not only the previously mentioned Data.gov, or the &lt;a href="http://www.guardian.co.uk/news/datablog"&gt;newspapers&lt;/a&gt; moving in the same direction, but also ...&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.freebase.com/docs/data/constraints_and_joins"&gt;Freebase&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Wolfram Alpha &lt;a href="http://products.wolframalpha.com/api/"&gt;Data&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;I'm really curious what effect will this have on databases. In theory, with the right authentication in place, everything could be exposed online and EDI would be vastly simplified, from sneakernet to HL7, everything would be replaced by REST calls.&lt;/p&gt;&lt;p&gt;At any rate, Freebase's attempt to organize everything is ambitious/stunning.&lt;/p&gt;&lt;p&gt;Wikipedia's own API, &lt;a href="http://wikipedia-lab.org/en/index.php/Wikipedia_API"&gt;here&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;Related: &lt;a href="http://n2.talis.com/wiki/Platform_API"&gt;Talis&lt;/a&gt;.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30166624-8871030190129651326?l=connectedsystems.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://connectedsystems.blogspot.com/feeds/8871030190129651326/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30166624&amp;postID=8871030190129651326' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30166624/posts/default/8871030190129651326'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30166624/posts/default/8871030190129651326'/><link rel='alternate' type='text/html' href='http://connectedsystems.blogspot.com/2010/03/everything-is-searchable.html' title='Everything is searchable'/><author><name>Razvan</name><uri>http://www.blogger.com/profile/01478237694157411648</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp1.blogger.com/_oKO4lXYJzFQ/SD-O3vBCSZI/AAAAAAAAACw/rLUH4XNTr8A/S220/rjp.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30166624.post-7552751308071607523</id><published>2010-03-31T00:41:00.001-07:00</published><updated>2010-03-31T05:53:17.120-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Programmable web'/><category scheme='http://www.blogger.com/atom/ns#' term='API'/><category scheme='http://www.blogger.com/atom/ns#' term='information economics'/><title type='text'>Data.gov</title><content type='html'>US Government's &lt;a href="http://data.gov/"&gt;open data&lt;/a&gt; initiative. Interesting, have to find out more about what's there. The potential for mashups and visualizations is great... if the data is trusted and current.&lt;br /&gt;&lt;a href="http://data.gov.uk/data/all"&gt;Here &lt;/a&gt;is the equivalent UK site.&lt;br /&gt;I need to look into this some more, for now a lot of the data seems to be Excel files that can be downloaded. No universal REST/JSON access?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30166624-7552751308071607523?l=connectedsystems.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://connectedsystems.blogspot.com/feeds/7552751308071607523/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30166624&amp;postID=7552751308071607523' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30166624/posts/default/7552751308071607523'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30166624/posts/default/7552751308071607523'/><link rel='alternate' type='text/html' href='http://connectedsystems.blogspot.com/2010/03/datagov.html' title='Data.gov'/><author><name>Razvan</name><uri>http://www.blogger.com/profile/01478237694157411648</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp1.blogger.com/_oKO4lXYJzFQ/SD-O3vBCSZI/AAAAAAAAACw/rLUH4XNTr8A/S220/rjp.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30166624.post-5455536922672564345</id><published>2010-03-27T06:20:00.000-07:00</published><updated>2010-03-27T06:22:43.187-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='API'/><category scheme='http://www.blogger.com/atom/ns#' term='Databases'/><category scheme='http://www.blogger.com/atom/ns#' term='Windows'/><category scheme='http://www.blogger.com/atom/ns#' term='Middleware'/><title type='text'>Oracle objects vs Cache objects in .NET</title><content type='html'>&lt;a title="View Oracle Objects vs Cache Objects on Scribd" href="http://www.scribd.com/doc/29018871/Oracle-Objects-vs-Cache-Objects" style="margin: 12px auto 6px auto; font-family: Helvetica,Arial,Sans-serif; font-style: normal; font-variant: normal; font-weight: normal; font-size: 14px; line-height: normal; font-size-adjust: none; font-stretch: normal; -x-system-font: none; display: block; text-decoration: underline;"&gt;Oracle Objects vs Cache Objects&lt;/a&gt; &lt;object id="doc_763040411554361" name="doc_763040411554361" height="600" width="100%" type="application/x-shockwave-flash" data="http://d1.scribdassets.com/ScribdViewer.swf" style="outline:none;" &gt;  &lt;param name="movie" value="http://d1.scribdassets.com/ScribdViewer.swf"&gt;  &lt;param name="wmode" value="opaque"&gt;   &lt;param name="bgcolor" value="#ffffff"&gt;   &lt;param name="allowFullScreen" value="true"&gt;   &lt;param name="allowScriptAccess" value="always"&gt;   &lt;param name="FlashVars" value="document_id=29018871&amp;access_key=key-14vydgn8v30o1go0hw9n&amp;page=1&amp;viewMode=list"&gt;   &lt;embed id="doc_763040411554361" name="doc_763040411554361" src="http://d1.scribdassets.com/ScribdViewer.swf?document_id=29018871&amp;access_key=key-14vydgn8v30o1go0hw9n&amp;page=1&amp;viewMode=list" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" height="600" width="100%" wmode="opaque" bgcolor="#ffffff"&gt;&lt;/embed&gt;  &lt;/object&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30166624-5455536922672564345?l=connectedsystems.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://connectedsystems.blogspot.com/feeds/5455536922672564345/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30166624&amp;postID=5455536922672564345' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30166624/posts/default/5455536922672564345'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30166624/posts/default/5455536922672564345'/><link rel='alternate' type='text/html' href='http://connectedsystems.blogspot.com/2010/03/oracle-objects-vs-cache-objects.html' title='Oracle objects vs Cache objects in .NET'/><author><name>Razvan</name><uri>http://www.blogger.com/profile/01478237694157411648</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp1.blogger.com/_oKO4lXYJzFQ/SD-O3vBCSZI/AAAAAAAAACw/rLUH4XNTr8A/S220/rjp.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30166624.post-7691850348844889167</id><published>2010-03-21T06:39:00.001-07:00</published><updated>2010-03-21T06:47:26.065-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Databases'/><category scheme='http://www.blogger.com/atom/ns#' term='Middleware'/><title type='text'>Interface engines</title><content type='html'>&lt;div&gt;&lt;span xmlns=""&gt;&lt;br /&gt;&lt;p&gt;Unbeknownst to myself, in a previous job I wrote an interface engine. It was a (initially) simple VB application which was reading files from a directory and copying them to another directory, then deleting them from the source. Then more source directories were added. Then, file endings had to determine the destination. Then, &lt;em&gt;file contents&lt;/em&gt; (i.e., header or template-based triggers) had to determine which files were copied and which not. Finally, database tables became source/destinations. The thing had grown immensely since the beginning and it was running 24/7, with a 30 second polling interval, and a large number of customers were relying in fact on a rickety PC running a hopelessly spaghetti-coded application with manually-installed DLLs. If only they knew.&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;I did not know at the time that this was an interface engine. Somewhat restricted to healthcare and financial IT, one wonders why this concept hasn't taken off in mainstream computing more significantly. I.e., in databases, interfaces could provide a strong and pervasive (cross-platform, even) replication/synchronization mechanism.&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Or perhaps the concept has been folded into workflow engines and transaction-based orchestration systems; Biztalk or Oracle Fusion can presumably do what interface engines do, and much more – but at a hefty footprint.&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;a href="http://www.mirthcorp.com/"&gt;Mirthcorp&lt;/a&gt;'s Java-based interface engine, below, running against a Cache database over JDBC/ODBC.&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Message passing:&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/_oKO4lXYJzFQ/S6YipAF6x1I/AAAAAAAAAH8/tyyttWnj7E0/s1600-h/ifeng1.jpg"&gt;&lt;img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 320px; DISPLAY: block; HEIGHT: 185px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5451082486773368658" border="0" alt="" src="http://3.bp.blogspot.com/_oKO4lXYJzFQ/S6YipAF6x1I/AAAAAAAAAH8/tyyttWnj7E0/s320/ifeng1.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Channel definition:&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;a href="http://1.bp.blogspot.com/_oKO4lXYJzFQ/S6YjVexf8XI/AAAAAAAAAIM/_jIT0yc-PPA/s1600-h/ifeng2.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 185px;" src="http://1.bp.blogspot.com/_oKO4lXYJzFQ/S6YjVexf8XI/AAAAAAAAAIM/_jIT0yc-PPA/s320/ifeng2.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5451083250923467122" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;A web-based interface engine? Perhaps using technology similar to YQL. Monitoring a queue of some kind and updating your Facebook status? Have to think about this one.&lt;br /&gt;&lt;/p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30166624-7691850348844889167?l=connectedsystems.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://connectedsystems.blogspot.com/feeds/7691850348844889167/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30166624&amp;postID=7691850348844889167' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30166624/posts/default/7691850348844889167'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30166624/posts/default/7691850348844889167'/><link rel='alternate' type='text/html' href='http://connectedsystems.blogspot.com/2010/03/interface-engines.html' title='Interface engines'/><author><name>Razvan</name><uri>http://www.blogger.com/profile/01478237694157411648</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp1.blogger.com/_oKO4lXYJzFQ/SD-O3vBCSZI/AAAAAAAAACw/rLUH4XNTr8A/S220/rjp.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_oKO4lXYJzFQ/S6YipAF6x1I/AAAAAAAAAH8/tyyttWnj7E0/s72-c/ifeng1.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30166624.post-880635139998021120</id><published>2010-03-20T01:41:00.001-07:00</published><updated>2010-04-25T05:33:53.652-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Databases'/><title type='text'>Cache dates</title><content type='html'>&lt;span xmlns=""&gt; &lt;p&gt;&lt;span style="color:black;"&gt;Cache's multiple interfaces (RDMBS, OO) can cause confusion even for simple operations, such as inserting dates. Here is how that is done:&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color:black;"&gt;In &lt;strong&gt;SQL&lt;/strong&gt;:&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color:black;"&gt;&lt;span style="font-family:Courier New;"&gt;insert into CM.StrmClass(PatientAddress, PatientName, PatientDateOfBirth)&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;color:black;"&gt;values('5 Soi Rangnam Bangkok, Thailand', 'TG', {d '1990-03-17'})&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color:black;"&gt;Rather ugly ODBC formatting for the date field. In &lt;strong&gt;Object Script&lt;/strong&gt;:&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;color:black;"&gt;Set p.PatientDateOfBirth = $ZDateh("12/21/1977")&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color:black;"&gt;By the way, if a %Save fails (does not make the results commit to the database), then there is a problem with the data validation. Running the container from the Terminal should show the result (e.g. &lt;span style="font-family:Courier New;"&gt;W p.%Save()&lt;/span&gt;)&lt;/span&gt;&lt;/p&gt;&lt;/span&gt;&lt;br /&gt;&lt;hr /&gt;&lt;br /&gt;Another interesting feature of Cache, which accounts for its performance:&lt;em&gt; &lt;span style="font-size:85%;"&gt;'Using a unique feature known as “subscript mapping,” you can specify how the data within one or more arrays is mapped to a physical database file. Such mapping is a database administration task and requires no change to class/table definitions or application logic. Moreover, mapping can be done within a specific sparse array; you can map one range of values to one physical location while mapping another to another file, disk drive, or even to another database server. This makes it possible to reconfigure Caché applications (such as for scaling) with little effort.'&lt;/span&gt; &lt;/em&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30166624-880635139998021120?l=connectedsystems.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://connectedsystems.blogspot.com/feeds/880635139998021120/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30166624&amp;postID=880635139998021120' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30166624/posts/default/880635139998021120'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30166624/posts/default/880635139998021120'/><link rel='alternate' type='text/html' href='http://connectedsystems.blogspot.com/2010/03/cache-dates.html' title='Cache dates'/><author><name>Razvan</name><uri>http://www.blogger.com/profile/01478237694157411648</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp1.blogger.com/_oKO4lXYJzFQ/SD-O3vBCSZI/AAAAAAAAACw/rLUH4XNTr8A/S220/rjp.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30166624.post-155392160475953435</id><published>2010-03-15T23:43:00.001-07:00</published><updated>2010-03-21T06:42:29.435-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='information economics'/><title type='text'>New media uselessness</title><content type='html'>&lt;span xmlns=""&gt; &lt;p&gt;I'm not a new media expert but even I know that…&lt;br /&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Calling an ad a 'welcome screen' is a pointless trickery. I understand you need to pay for content somehow, no need to sugarcoat it&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Sometimes, more media is bad: if there is an article that lists the top 10 cities to live, 14 most troubled real estate markets, 10 top moments in British TV history, etc, well, I take that as information. I can just read it, I don't need photos to go with it, or if there are photos, they should be optional. Making me scroll through 10 or 14 screens, each heavy on images but low on info, that will result in me simply leaving an otherwise potentially interesting article&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;So maybe the death of print is largely exaggerated.&lt;/p&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30166624-155392160475953435?l=connectedsystems.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://connectedsystems.blogspot.com/feeds/155392160475953435/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30166624&amp;postID=155392160475953435' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30166624/posts/default/155392160475953435'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30166624/posts/default/155392160475953435'/><link rel='alternate' type='text/html' href='http://connectedsystems.blogspot.com/2010/03/new-media-uselessness.html' title='New media uselessness'/><author><name>Razvan</name><uri>http://www.blogger.com/profile/01478237694157411648</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp1.blogger.com/_oKO4lXYJzFQ/SD-O3vBCSZI/AAAAAAAAACw/rLUH4XNTr8A/S220/rjp.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30166624.post-3307679376685294787</id><published>2010-03-15T07:22:00.001-07:00</published><updated>2010-03-15T07:23:51.216-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='API'/><category scheme='http://www.blogger.com/atom/ns#' term='Databases'/><title type='text'>Updating Cache from Excel</title><content type='html'>&lt;span xmlns=""&gt; &lt;p&gt;Excel (2007) is great as a quick database front end tool – reasonably versatile and easy to set up. This ease of use might make many want to be able to update a database from Excel, and that is not so easy.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;It has to be done in code. One way would be through linking the Excel file to the database server (there are different mechanisms for doing this, e.g. OPENROWSET in SQL Server or the SQL Gateway in Cache). However, if you're running Office in 64-bit mode you soon discover that there is no 64-bit compliant Excel ODBC driver.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;A quick and more natural solution is to embed the database update code in Excel itself; in the case of a Cache backend, there are two ways to write this code:&lt;br /&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;div&gt;&lt;strong&gt;Using ADO/ODBC&lt;br /&gt;&lt;/strong&gt;&lt;/div&gt;&lt;p&gt;&lt;span style="font-family:Courier New;font-size:9;color:#1f497d;"&gt;Dim cm As Command&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;font-size:9;color:#1f497d;"&gt;Dim cn As Connection&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;font-size:9;color:#1f497d;"&gt;Dim cns As String&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt; &lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;font-size:9;color:#1f497d;"&gt;cns = "DSN=CacheWeb User"&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt; &lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;font-size:9;color:#1f497d;"&gt;Set cn = New Connection&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;font-size:9;color:#1f497d;"&gt;cn.Open cns&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt; &lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;font-size:9;color:#1f497d;"&gt;Set cm = New Command&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;font-size:9;color:#1f497d;"&gt;cm.ActiveConnection = cn&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;font-size:9;color:#1f497d;"&gt;cm.CommandType = adCmdText&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;font-size:9;color:#1f497d;"&gt;cm.CommandText = "INSERT INTO Income(UserId, Income, Country) VALUES('@u', @i, '@c')"&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;font-size:9;color:#1f497d;"&gt;cm.Execute&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt; &lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Using Cache ActiveX&lt;br /&gt;&lt;/strong&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;A bit more interesting since it gets into some Cache internals:&lt;br /&gt;&lt;/p&gt;&lt;p style="MARGIN-LEFT: 36pt"&gt;&lt;span style="font-family:Courier New;font-size:9;color:#1f497d;"&gt;Dim Factory As CacheObject.Factory&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="MARGIN-LEFT: 36pt"&gt;&lt;span style="font-family:Courier New;font-size:9;color:#1f497d;"&gt;Set Factory = New CacheObject.Factory&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="MARGIN-LEFT: 36pt"&gt;&lt;br /&gt; &lt;/p&gt;&lt;p style="MARGIN-LEFT: 36pt"&gt;&lt;span style="font-family:Courier New;font-size:9;color:#1f497d;"&gt;If Factory.Connect("cn_iptcp:127.0.0.1[1972]:TESTDBNS") = False Then&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="MARGIN-LEFT: 36pt"&gt;&lt;span style="font-family:Courier New;font-size:9;color:#1f497d;"&gt;MsgBox "Failed to connect"&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="MARGIN-LEFT: 36pt"&gt;&lt;span style="font-family:Courier New;font-size:9;color:#1f497d;"&gt;Exit Function&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="MARGIN-LEFT: 36pt"&gt;&lt;span style="font-family:Courier New;font-size:9;color:#1f497d;"&gt;End If&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="MARGIN-LEFT: 36pt"&gt;&lt;br /&gt; &lt;/p&gt;&lt;p style="MARGIN-LEFT: 36pt"&gt;&lt;span style="font-family:Courier New;font-size:9;color:#1f497d;"&gt;Dim Income As Object&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="MARGIN-LEFT: 36pt"&gt;&lt;span style="font-family:Courier New;font-size:9;color:#1f497d;"&gt;Set Income = Factory.New("Income")&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="MARGIN-LEFT: 36pt"&gt;&lt;span style="font-family:Courier New;font-size:9;color:#1f497d;"&gt;Income.UserId = "2"&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="MARGIN-LEFT: 36pt"&gt;&lt;span style="font-family:Courier New;font-size:9;color:#1f497d;"&gt;Income.Income = 120&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="MARGIN-LEFT: 36pt"&gt;&lt;span style="font-family:Courier New;font-size:9;color:#1f497d;"&gt;Income.country = "PAK"&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="MARGIN-LEFT: 36pt"&gt;&lt;span style="font-family:Courier New;font-size:9;color:#1f497d;"&gt;Income.sys_Save&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="MARGIN-LEFT: 36pt"&gt;&lt;span style="font-family:Courier New;font-size:9;color:#1f497d;"&gt;Income.sys_Close&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="MARGIN-LEFT: 36pt"&gt;&lt;br /&gt; &lt;/p&gt;&lt;p style="MARGIN-LEFT: 36pt"&gt;&lt;span style="font-family:Courier New;font-size:9;color:#1f497d;"&gt;Set Income = Nothing&lt;/span&gt;&lt;/p&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30166624-3307679376685294787?l=connectedsystems.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://connectedsystems.blogspot.com/feeds/3307679376685294787/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30166624&amp;postID=3307679376685294787' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30166624/posts/default/3307679376685294787'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30166624/posts/default/3307679376685294787'/><link rel='alternate' type='text/html' href='http://connectedsystems.blogspot.com/2010/03/updating-cache-from-excel.html' title='Updating Cache from Excel'/><author><name>Razvan</name><uri>http://www.blogger.com/profile/01478237694157411648</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp1.blogger.com/_oKO4lXYJzFQ/SD-O3vBCSZI/AAAAAAAAACw/rLUH4XNTr8A/S220/rjp.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30166624.post-279219762688382261</id><published>2010-03-13T02:21:00.001-08:00</published><updated>2010-03-13T02:23:02.088-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='HealthVault'/><title type='text'>HealthSpace</title><content type='html'>It seems there is a government-run GoogleHealth-like &lt;a href="https://www.healthspace.nhs.uk/visitor/default.aspx"&gt;service&lt;/a&gt; in the UK.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;I am still miffed by the resistance people show to this type of project. After all, they bank online. Why not keep track of their health info online?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30166624-279219762688382261?l=connectedsystems.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://connectedsystems.blogspot.com/feeds/279219762688382261/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30166624&amp;postID=279219762688382261' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30166624/posts/default/279219762688382261'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30166624/posts/default/279219762688382261'/><link rel='alternate' type='text/html' href='http://connectedsystems.blogspot.com/2010/03/healthspace.html' title='HealthSpace'/><author><name>Razvan</name><uri>http://www.blogger.com/profile/01478237694157411648</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp1.blogger.com/_oKO4lXYJzFQ/SD-O3vBCSZI/AAAAAAAAACw/rLUH4XNTr8A/S220/rjp.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30166624.post-5887026627187043014</id><published>2010-01-21T06:19:00.000-08:00</published><updated>2010-01-21T06:24:07.034-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Programmable web'/><category scheme='http://www.blogger.com/atom/ns#' term='Python'/><title type='text'>Google App Engine and Python</title><content type='html'>Quick steps to develop with &lt;em&gt;Google App Engine&lt;/em&gt;:&lt;br /&gt;&lt;br /&gt;- download the SDK&lt;br /&gt;- this will place a Google App Launcher shortcut on your desktop&lt;br /&gt;- click on it&lt;br /&gt;- File &gt; Create New Application and choose the directory (a subdirectory with the app name will be created there)&lt;br /&gt;- Edit and change the name of the main *.py file you'll be using (say, myapp.py)&lt;br /&gt;- create your myapp.py file and save it in the subdirectory created 2 steps ago&lt;br /&gt;- select the app in the Google App Launcher main window and click Run&lt;br /&gt;- open a browser: &lt;a href="http://localhost:808x"&gt;http://localhost:808x&lt;/a&gt; (this is the default value, check in your application settings as defined in Google App Launcher)&lt;br /&gt;- then you have to deploy it to your applications in your Google profile&lt;br /&gt;&lt;br /&gt;More, later, this is just a quick &lt;em&gt;vade mecum.&lt;/em&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30166624-5887026627187043014?l=connectedsystems.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://connectedsystems.blogspot.com/feeds/5887026627187043014/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30166624&amp;postID=5887026627187043014' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30166624/posts/default/5887026627187043014'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30166624/posts/default/5887026627187043014'/><link rel='alternate' type='text/html' href='http://connectedsystems.blogspot.com/2010/01/google-app-engine-and-python.html' title='Google App Engine and Python'/><author><name>Razvan</name><uri>http://www.blogger.com/profile/01478237694157411648</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp1.blogger.com/_oKO4lXYJzFQ/SD-O3vBCSZI/AAAAAAAAACw/rLUH4XNTr8A/S220/rjp.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30166624.post-4435289460212954391</id><published>2010-01-19T09:03:00.000-08:00</published><updated>2010-01-19T09:05:22.137-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Databases'/><title type='text'>MySQL errno 150</title><content type='html'>InnoDb &lt;a href="http://dev.mysql.com/doc/refman/5.1/en/innodb-foreign-key-constraints.html"&gt;needs&lt;/a&gt; an index to exist on the column referenced by a FKey. Interesting, I have to check if this is a requirement of the relational model, I don't remember seeing that before although I seem to recall that this might be one of those auto/hidden indexes created by SQL Server (__________ix#122200_____________, etc).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30166624-4435289460212954391?l=connectedsystems.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://connectedsystems.blogspot.com/feeds/4435289460212954391/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30166624&amp;postID=4435289460212954391' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30166624/posts/default/4435289460212954391'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30166624/posts/default/4435289460212954391'/><link rel='alternate' type='text/html' href='http://connectedsystems.blogspot.com/2010/01/mysql-errno-150.html' title='MySQL errno 150'/><author><name>Razvan</name><uri>http://www.blogger.com/profile/01478237694157411648</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp1.blogger.com/_oKO4lXYJzFQ/SD-O3vBCSZI/AAAAAAAAACw/rLUH4XNTr8A/S220/rjp.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30166624.post-2126655658269513427</id><published>2010-01-04T05:23:00.000-08:00</published><updated>2010-01-06T02:48:11.916-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Databases'/><title type='text'>Interesting SQL</title><content type='html'>&lt;span style="font-family:courier new;"&gt;select * from #t1&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;can also be written as....&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;select * from #t1 t1 left join #t2 t2&lt;br /&gt;on 1 = 2&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;While:&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;select * from #t1 t1 left join #t2 t2&lt;br /&gt;on 1 = 1 &lt;/span&gt;&lt;br /&gt;... is really a cross join.&lt;br /&gt;&lt;br /&gt;This is acceptable:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;select * from&lt;br /&gt;(select 1 a, 2 b, 3 c) t1&lt;br /&gt;full outer join&lt;br /&gt;(select 2 a, 4 b, 5 c) t2&lt;br /&gt;on t1.a = t2.a&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;&lt;span style="font-family:georgia;"&gt;Perhaps not very useful, but interesting to know nonetheless as they are available. And, I really do like (T-SQL's new) MERGE statement.&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:courier new;"&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30166624-2126655658269513427?l=connectedsystems.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://connectedsystems.blogspot.com/feeds/2126655658269513427/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30166624&amp;postID=2126655658269513427' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30166624/posts/default/2126655658269513427'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30166624/posts/default/2126655658269513427'/><link rel='alternate' type='text/html' href='http://connectedsystems.blogspot.com/2010/01/interesting-sql.html' title='Interesting SQL'/><author><name>Razvan</name><uri>http://www.blogger.com/profile/01478237694157411648</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp1.blogger.com/_oKO4lXYJzFQ/SD-O3vBCSZI/AAAAAAAAACw/rLUH4XNTr8A/S220/rjp.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30166624.post-8752723578353093713</id><published>2009-12-05T21:37:00.001-08:00</published><updated>2009-12-05T21:38:31.880-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Programmable web'/><category scheme='http://www.blogger.com/atom/ns#' term='Python'/><title type='text'>Google App Engine</title><content type='html'>The Python dev environment. A very basic sample &lt;a href="http://zzkjpython.appspot.com/"&gt;app&lt;/a&gt; that comes with the SDK - and which I managed to deploy without a lot of headache (and without having read the documentation!).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30166624-8752723578353093713?l=connectedsystems.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://connectedsystems.blogspot.com/feeds/8752723578353093713/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30166624&amp;postID=8752723578353093713' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30166624/posts/default/8752723578353093713'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30166624/posts/default/8752723578353093713'/><link rel='alternate' type='text/html' href='http://connectedsystems.blogspot.com/2009/12/google-app-engine.html' title='Google App Engine'/><author><name>Razvan</name><uri>http://www.blogger.com/profile/01478237694157411648</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp1.blogger.com/_oKO4lXYJzFQ/SD-O3vBCSZI/AAAAAAAAACw/rLUH4XNTr8A/S220/rjp.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30166624.post-8276097906317178640</id><published>2009-12-05T03:34:00.000-08:00</published><updated>2009-12-05T03:41:01.063-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Python'/><title type='text'>Python confusion</title><content type='html'>...at least for a newbie.&lt;br /&gt;&lt;ul&gt;&lt;li&gt;lists: &lt;span style="font-family: courier new;"&gt;L = ['a', 'b', 'this is another element', 1, [1, 2, 3]]&lt;/span&gt;. Can do a &lt;span style="font-family: courier new;"&gt;L.append()&lt;/span&gt;, &lt;span style="font-family: courier new;"&gt;len(L)&lt;/span&gt;, &lt;span style="font-family: courier new;"&gt;L.pop()&lt;/span&gt;, etc&lt;br /&gt;&lt;/li&gt;&lt;li&gt;tuples: &lt;span style="font-family: courier new;"&gt;T = 1, 2, 3, 4, 'this is a tuple element'&lt;/span&gt;. Or &lt;span style="font-family: courier new;"&gt;T1 = ()&lt;/span&gt; for an empty tuple, &lt;span style="font-family: courier new;"&gt;T2= 'one element tuple',&lt;/span&gt; . None of the functions listed above apply.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;sets: &lt;span style="font-family: courier new;"&gt;S = {1, 2, 3, 'set element'}&lt;/span&gt;. The items must be unique and set functions are available. &lt;span style="font-family: courier new;"&gt;S = set(L)&lt;/span&gt; converts list to set (removes duplicates in the process).&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30166624-8276097906317178640?l=connectedsystems.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://connectedsystems.blogspot.com/feeds/8276097906317178640/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30166624&amp;postID=8276097906317178640' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30166624/posts/default/8276097906317178640'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30166624/posts/default/8276097906317178640'/><link rel='alternate' type='text/html' href='http://connectedsystems.blogspot.com/2009/12/python-confusion.html' title='Python confusion'/><author><name>Razvan</name><uri>http://www.blogger.com/profile/01478237694157411648</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp1.blogger.com/_oKO4lXYJzFQ/SD-O3vBCSZI/AAAAAAAAACw/rLUH4XNTr8A/S220/rjp.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30166624.post-5685220322951014177</id><published>2009-11-08T03:03:00.000-08:00</published><updated>2009-11-08T03:05:06.111-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Databases'/><title type='text'>Quick note on ORM</title><content type='html'>So it would appear that Cache uses the &lt;em&gt;active record&lt;/em&gt; ORM. But combined with a &lt;em&gt;unit of work&lt;/em&gt; for related objects (swishing, I believe they call it). I really need the time to look at Cache, the Entity Framework, and Python's ORM in more detail. Interesting stuff.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30166624-5685220322951014177?l=connectedsystems.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://connectedsystems.blogspot.com/feeds/5685220322951014177/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30166624&amp;postID=5685220322951014177' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30166624/posts/default/5685220322951014177'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30166624/posts/default/5685220322951014177'/><link rel='alternate' type='text/html' href='http://connectedsystems.blogspot.com/2009/11/quick-note-on-orm.html' title='Quick note on ORM'/><author><name>Razvan</name><uri>http://www.blogger.com/profile/01478237694157411648</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp1.blogger.com/_oKO4lXYJzFQ/SD-O3vBCSZI/AAAAAAAAACw/rLUH4XNTr8A/S220/rjp.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30166624.post-2154629009662578811</id><published>2009-10-31T00:07:00.001-07:00</published><updated>2009-10-31T00:08:47.550-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='AIR'/><category scheme='http://www.blogger.com/atom/ns#' term='SQLite'/><category scheme='http://www.blogger.com/atom/ns#' term='Javascript'/><category scheme='http://www.blogger.com/atom/ns#' term='HealthVault'/><category scheme='http://www.blogger.com/atom/ns#' term='Programmable web'/><title type='text'>Cloud, AIR, GoogleHealth</title><content type='html'>My new article is &lt;a href="http://www.developer.com/services/article.php/3845826/Creating-a-Cloud-Client-with-Adobe-AIR-JavaScript-and-Google-Health.htm"&gt;online&lt;/a&gt; at developer.com. Wish I would have added a few more images though. What to write about next?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30166624-2154629009662578811?l=connectedsystems.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://connectedsystems.blogspot.com/feeds/2154629009662578811/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30166624&amp;postID=2154629009662578811' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30166624/posts/default/2154629009662578811'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30166624/posts/default/2154629009662578811'/><link rel='alternate' type='text/html' href='http://connectedsystems.blogspot.com/2009/10/cloud-air-googlehealth.html' title='Cloud, AIR, GoogleHealth'/><author><name>Razvan</name><uri>http://www.blogger.com/profile/01478237694157411648</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp1.blogger.com/_oKO4lXYJzFQ/SD-O3vBCSZI/AAAAAAAAACw/rLUH4XNTr8A/S220/rjp.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30166624.post-7462936638982172664</id><published>2009-10-26T02:09:00.001-07:00</published><updated>2009-10-26T02:11:26.689-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Programmable web'/><category scheme='http://www.blogger.com/atom/ns#' term='Databases'/><title type='text'>Wither SQL?</title><content type='html'>&lt;a href="http://gigaom.com/2009/10/25/the-future-is-big-data-in-the-cloud/"&gt;More&lt;/a&gt; on the rise of non-relational databases. Maybe it is time for me to do another 'strategy' post... something to tie Cache, CouchDb and all the others together.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30166624-7462936638982172664?l=connectedsystems.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://connectedsystems.blogspot.com/feeds/7462936638982172664/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30166624&amp;postID=7462936638982172664' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30166624/posts/default/7462936638982172664'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30166624/posts/default/7462936638982172664'/><link rel='alternate' type='text/html' href='http://connectedsystems.blogspot.com/2009/10/wither-sql.html' title='Wither SQL?'/><author><name>Razvan</name><uri>http://www.blogger.com/profile/01478237694157411648</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp1.blogger.com/_oKO4lXYJzFQ/SD-O3vBCSZI/AAAAAAAAACw/rLUH4XNTr8A/S220/rjp.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30166624.post-2531213916345055511</id><published>2009-10-23T03:32:00.000-07:00</published><updated>2009-10-23T03:34:39.346-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Databases'/><title type='text'>Under the, err... hood?</title><content type='html'>Just love it when unsuspecting users are exposed to the gory details of their favorite web sites.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/_oKO4lXYJzFQ/SuGGp6yv0BI/AAAAAAAAAGw/HKwBO8pUaiU/s1600-h/db-error.jpg"&gt;&lt;img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 320px; DISPLAY: block; HEIGHT: 129px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5395741883281428498" border="0" alt="" src="http://2.bp.blogspot.com/_oKO4lXYJzFQ/SuGGp6yv0BI/AAAAAAAAAGw/HKwBO8pUaiU/s320/db-error.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div&gt; &lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30166624-2531213916345055511?l=connectedsystems.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://connectedsystems.blogspot.com/feeds/2531213916345055511/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30166624&amp;postID=2531213916345055511' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30166624/posts/default/2531213916345055511'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30166624/posts/default/2531213916345055511'/><link rel='alternate' type='text/html' href='http://connectedsystems.blogspot.com/2009/10/under-err-hood.html' title='Under the, err... hood?'/><author><name>Razvan</name><uri>http://www.blogger.com/profile/01478237694157411648</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp1.blogger.com/_oKO4lXYJzFQ/SD-O3vBCSZI/AAAAAAAAACw/rLUH4XNTr8A/S220/rjp.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_oKO4lXYJzFQ/SuGGp6yv0BI/AAAAAAAAAGw/HKwBO8pUaiU/s72-c/db-error.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30166624.post-8090233333937678367</id><published>2009-10-14T23:50:00.000-07:00</published><updated>2009-10-14T23:51:20.489-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Databases'/><title type='text'>CouchDb</title><content type='html'>Yet &lt;a href="http://couchdb.apache.org/"&gt;another thing&lt;/a&gt; to look at.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30166624-8090233333937678367?l=connectedsystems.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://connectedsystems.blogspot.com/feeds/8090233333937678367/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30166624&amp;postID=8090233333937678367' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30166624/posts/default/8090233333937678367'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30166624/posts/default/8090233333937678367'/><link rel='alternate' type='text/html' href='http://connectedsystems.blogspot.com/2009/10/couchdb.html' title='CouchDb'/><author><name>Razvan</name><uri>http://www.blogger.com/profile/01478237694157411648</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp1.blogger.com/_oKO4lXYJzFQ/SD-O3vBCSZI/AAAAAAAAACw/rLUH4XNTr8A/S220/rjp.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30166624.post-6489336774271834256</id><published>2009-10-02T10:20:00.000-07:00</published><updated>2009-10-02T10:30:50.595-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Databases'/><category scheme='http://www.blogger.com/atom/ns#' term='information economics'/><category scheme='http://www.blogger.com/atom/ns#' term='ORM'/><title type='text'>More on ORM; optimization?</title><content type='html'>Thinking about Cache and its 'native' objects, I wonder if when those are persisted to disk, only the data is actually saved, or any functions as well - i.e., &lt;em&gt;p-Code&lt;/em&gt; compiled ObjectScript or Cache Basic member functions. Or perhaps even (class-query) SQL. All this code could be optimized for the given state (properties) of the object.&lt;br /&gt;&lt;br /&gt;Then the question becomes, where is this data saved - perhaps in some raw extensions of the sparse arrays that hold the object member data.&lt;br /&gt;&lt;br /&gt;Another interesting aspect (related to the sparse array storage system) is the kind of optimization, if any, that occurs at the SQL relational engine level. If there is optimization of any kind done at the I/O-sparse array level, this might conflict with the SQL optimization. Interesting stuff.&lt;br /&gt;&lt;br /&gt;Which brings into question, is the optimization cottage industry a by product of the relational model? I have always found Oracle's optimization 'strategies' (the thick books dealing with that) somewhat ludicrous and antiquated. In order to do that really well, you need a deep understanding both of data and of sorting algorithms; with so many intervening layers (physical design, I/O patterns), even that understanding is corrupted. So if you can avoid a couple of grievous errors (e.g. multiple joins on non-indexed columns), you will do reasonably well. But then, the DBMS should be able to detect if you're about to make a grievous error (or perhaps the reporting tool, if you use one). So, why a thick book on optimization?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30166624-6489336774271834256?l=connectedsystems.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://connectedsystems.blogspot.com/feeds/6489336774271834256/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30166624&amp;postID=6489336774271834256' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30166624/posts/default/6489336774271834256'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30166624/posts/default/6489336774271834256'/><link rel='alternate' type='text/html' href='http://connectedsystems.blogspot.com/2009/10/more-on-orm-optimization.html' title='More on ORM; optimization?'/><author><name>Razvan</name><uri>http://www.blogger.com/profile/01478237694157411648</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp1.blogger.com/_oKO4lXYJzFQ/SD-O3vBCSZI/AAAAAAAAACw/rLUH4XNTr8A/S220/rjp.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30166624.post-4996796634456248708</id><published>2009-10-02T02:31:00.000-07:00</published><updated>2009-10-02T02:43:19.519-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='HealthVault'/><title type='text'>AIR and GoogleHealth</title><content type='html'>Finally, I completed this project. Write up coming soon - in the meantime, &lt;a href="http://razvan.petrescu.googlepages.com/gh_js.txt"&gt;here&lt;/a&gt; is the Javascript/AIR code amalgamation. Briefly, this is a client for GoogleHealth written in Adobe AIR/Javascript; it lets you query a GH profile and update it (via the Atom protocol). GH documentation is spotty and occasionally incorrect, so this wasn't as pain-free as it should. Neither is the code production-ready or elegant. It is just a prototype - a &lt;em&gt;working&lt;/em&gt; one.&lt;br /&gt;&lt;br /&gt;The code requires a (sqlite) database, and of course the HTML forms. However, the most important functionality is encapsulated in the file, so that should be enough for a quick start.&lt;br /&gt;&lt;br /&gt;It's all, of course, ensconced in Subversion....&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30166624-4996796634456248708?l=connectedsystems.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://connectedsystems.blogspot.com/feeds/4996796634456248708/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30166624&amp;postID=4996796634456248708' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30166624/posts/default/4996796634456248708'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30166624/posts/default/4996796634456248708'/><link rel='alternate' type='text/html' href='http://connectedsystems.blogspot.com/2009/10/air-and-googlehealth.html' title='AIR and GoogleHealth'/><author><name>Razvan</name><uri>http://www.blogger.com/profile/01478237694157411648</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp1.blogger.com/_oKO4lXYJzFQ/SD-O3vBCSZI/AAAAAAAAACw/rLUH4XNTr8A/S220/rjp.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30166624.post-5977549999532465720</id><published>2009-09-30T04:25:00.000-07:00</published><updated>2009-10-01T03:40:51.090-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='information economics'/><title type='text'>Subversion</title><content type='html'>&lt;p&gt;I have not used source control systems much, and I am finding that setting it up, on a Windows machine, with open source IDE's (especially not Eclipse) is more painful than it should be - documentation somehow seems to assume you're either using Eclipse or a Unix system or both. Here is what seems to work for me:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;install Subversion&lt;/li&gt;&lt;li&gt;create (in DOS) a directory where you will store the files: dirX&lt;/li&gt;&lt;li&gt;in DOS: svnadmin create dirX (e.g.: D:\svn)&lt;/li&gt;&lt;li&gt;in DOS: set EDITOR=notepad.exe&lt;/li&gt;&lt;li&gt;in DOS, D:\&gt;svn mkdir &lt;a href="file:///svn/python"&gt;file:///svn/python&lt;/a&gt; (if python is the sub directory where you want to store a project); using a \ (eg svn\python) will cause svn to fail with a weird assertion&lt;/li&gt;&lt;li&gt;do the initial load of the project in the subversion system: svn import D:\pythonsource\ &lt;a href="file:///svn/python"&gt;file:///svn/python&lt;/a&gt; (assuming your project is in D:\pythonsource)&lt;/li&gt;&lt;li&gt;you will get a message in Notepad - close it, and choose [c] in DOS to continue the process of loading the directory into subversion&lt;/li&gt;&lt;li&gt;at this point you will have the original source, the subversion source, and when the IDE will check out from subversion it will create another project, so you can delete the initial source directory&lt;/li&gt;&lt;li&gt;you might want to only include the source files from the initial load... and create the project to include everything; have to be careful here if you need additional libraries (eg developing Processing projects in the NetBeans IDE, which will need the additional core.jar added to libraries)&lt;/li&gt;&lt;li&gt;set up the IDE's:&lt;/li&gt;&lt;li&gt;&lt;strong&gt;&lt;span style="font-size:130%;"&gt;NetBeans&lt;/span&gt;&lt;/strong&gt;:&lt;/li&gt;&lt;li&gt;use the TeamCheckout menu option&lt;/li&gt;&lt;li&gt;use the URL as below (Aptana)&lt;/li&gt;&lt;li&gt;you will be asked to create a new project to which the files will be downloaded&lt;/li&gt;&lt;li&gt;if you do, be careful not to create a new Main class (assuming you have a Java project)&lt;/li&gt;&lt;li&gt;so ideally the workflow is&lt;/li&gt;&lt;li&gt;create the initial project in the IDE&lt;/li&gt;&lt;li&gt;only keep the SRC directory&lt;/li&gt;&lt;li&gt;create the SVN structure as above&lt;/li&gt;&lt;li&gt;create the new project in the IDE based on a SVN checkout&lt;/li&gt;&lt;li&gt;&lt;strong&gt;&lt;span style="font-size:130%;"&gt;Aptana&lt;/span&gt;&lt;/strong&gt;:&lt;/li&gt;&lt;li&gt;open the SVN view&lt;/li&gt;&lt;li&gt;create new Repository Location (right click in the SVN window)&lt;/li&gt;&lt;li&gt;the URL will be &lt;a href="file:///d:/svn/python"&gt;file:///d:/svn/python&lt;/a&gt;&lt;/li&gt;&lt;li&gt;then back to the SVN view to check out the project into an active project (right click on the repository)&lt;/li&gt;&lt;li&gt;you will manipulate the files through the Team context menu (right click the file in the solution explorer) in the main Aptana view (not Pydev, if you are using it for Python files) - update the file, update the directory, then check it in&lt;/li&gt;&lt;li&gt;if you import it into a new project, eg AIR, you will be able to specify all the parameters again so if you have some existing project parameters (eg startup form), you will need to manually make the necessary adjustments (for AIR, change the application manifest, application.xml; also you will need to reimport the AIRAliases.js file)&lt;/li&gt;&lt;li&gt;at this point the code is checked out and available to use; remember to update/commit it to the repository&lt;/li&gt;&lt;li&gt;with AIR specifically, you shouldn't commit the icons to the repository (and others such as the .project file)&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Alternatively, (at least in NetBeans), once you created the first SVN connection, you can check in a project without going through svn import. Just write the source, then right click on it and choose SubversionCommit to sent it to the repository. You can still look at the history changes between different versions - not sure how well this works in an environment with multiple users though since the original codebase is your own.&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;More details &lt;a href="http://nedbatchelder.com/text/quicksvn.html"&gt;here&lt;/a&gt;. Notice that having Subversion running will show the hard drive where you have the repositories with a different icon in Windows Explorer.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30166624-5977549999532465720?l=connectedsystems.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://connectedsystems.blogspot.com/feeds/5977549999532465720/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30166624&amp;postID=5977549999532465720' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30166624/posts/default/5977549999532465720'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30166624/posts/default/5977549999532465720'/><link rel='alternate' type='text/html' href='http://connectedsystems.blogspot.com/2009/09/subversion.html' title='Subversion'/><author><name>Razvan</name><uri>http://www.blogger.com/profile/01478237694157411648</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp1.blogger.com/_oKO4lXYJzFQ/SD-O3vBCSZI/AAAAAAAAACw/rLUH4XNTr8A/S220/rjp.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30166624.post-5600628429688885148</id><published>2009-09-28T08:58:00.000-07:00</published><updated>2009-09-28T20:26:34.546-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='API'/><title type='text'>Oracle and objects</title><content type='html'>Some quick notes regarding Oracle (11)'s OO features:&lt;br /&gt;&lt;br /&gt;Create a custom type - which, other than data types, can include member functions (defined in two parts, the data and the function declarations, and the body containing the function definitions).&lt;br /&gt;&lt;br /&gt;Create the table:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;CREATE TABLE( person_typ pobject, ... ) &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Inserting the data is done this way:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;INSERT INTO object_table VALUES ( 'second insert',&lt;br /&gt;person_typ (51, 'donald', 'duck', 'dduck@disney.com', '66-650-555-0125'));&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;Notice the implicit constructor.&lt;br /&gt;&lt;br /&gt;To call a method:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;SELECT o.pobject.get_idno() from object_table o&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;This is cool. But usually objects are used in code. So how is the client code/databaset object chasm bridged over?&lt;br /&gt;&lt;br /&gt;These objects should be stored alone, without relational data (row objects as opposed to column objects as in the example above).&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;CREATE TABLE person_obj_table OF person_typ; &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Scanning the object table:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;DECLARE person person_typ;&lt;br /&gt;BEGIN &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;SELECT VALUE(p) INTO person FROM person_obj_table p WHERE p.idno = 101;&lt;br /&gt;person.display_details();&lt;br /&gt;END&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;Pointers to objects are supported via the REF type.&lt;br /&gt;You can use a SELECT INTO to load a specific row object into a object variable.&lt;br /&gt;&lt;br /&gt;You can implement database functions, procedures, or member methods of an object&lt;br /&gt;type in PL/SQL, Java, C, or .NET as external procedures. This is a way to have the objects execute code defined externally. Only PL/SQL and Java code is stored in the database.&lt;br /&gt;&lt;br /&gt;As far as consuming objects externally, one way is by the means of using untyped structures or by using a wizard to create strongly typed (Java) classes:&lt;br /&gt;&lt;br /&gt;&lt;quot&gt;Strongly typed representations use a custom Java class that corresponds to a particular object type, REF type, or collection type and must implement the interface oracle.sql.ORAData.&lt;/quot&gt;&lt;br /&gt;&lt;br /&gt;Object views, where you define a filter that interprets the rows in a table as an object, is an interesting innovation.&lt;br /&gt;&lt;br /&gt;So does this really solve the impedance problem? It's not like you define an object in C# then persist it in the database, then deserialize it in the application again and call its methods. It's more like, you define an object in the database, and with some manual work you can map between it and a custom class you define in Java. You can define some of its methods in C# (using the Oracle Database Extensions for .NET) - how is that for multiple indirections?&lt;br /&gt;&lt;br /&gt;The question is really, where do you want your code to execute. In the case discussed above, (defining member functions in .NET) Oracle acts as a CLR host for the .NET runtime; not unlike the way SQL Server external procedures (written in C and compiled as DLL's) used to run in an external process space. So the code executes outside the (physical) database process, but still inside a (logical) database layer. I still can't escape a nagging feeling that this is as database-centric a view of the application as they come. Usually the design of an application starts with actors modeling, etc, and the data layer is something that does not come into play until the end. Ideally, from an application designer's perspective, as I mentioned above, you should be able to just persist an object somehow to the database, and instantiate/deserialize it from the data layer/the abstract persistence without too much fuss. In the case of Cache this is made easier by the fact that the application layer coexists with the database layer and has access to the native objects (at least, if you use the Cache application development environment).&lt;br /&gt;&lt;br /&gt;In the case of Oracle the separate spaces, database for storage/execution and application for execution pose the standard impedance discrepancy problem, which I am not sure is in any way eased by the OO features of the database.&lt;br /&gt;&lt;br /&gt;An ideal solution? Maybe database functionality should be provided by the OS layer and the application development/execution environment should be able to take advantage of that.&lt;br /&gt;&lt;br /&gt;Meanwhile, Microsoft's &lt;a href="http://msdn.microsoft.com/en-us/library/aa697427(VS.80).aspx"&gt;Entity Framework&lt;/a&gt; (actually, a rather logical development from ADO.NET) deals with this problem in the dev environment. What I have seen so far looks cool, just a couple of questions:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;can you start with the entities and generate (forward engineer) the database tables&lt;/li&gt;&lt;br /&gt;&lt;li&gt;how is the schema versioned and how are evolutionary changes sync'ed&lt;/li&gt;&lt;br /&gt;&lt;li&gt;how does the (obvious) overhead perform when there are hundreds of tables, mappings, etc.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;p&gt;&lt;br /&gt;&lt;br /&gt;Incidentally, using the Oracle ODP.NET driver in Visual Studio yields a much better experience with an Oracle database than using the standard MS drivers. You actually get a return (XML-formatted) when querying object tables (the MS driver reports it as 'unsupported data type') and can interact with the underlying database much more, including tuning advisor, deeper database object introspection, etc.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/_oKO4lXYJzFQ/SsEEZABQ_xI/AAAAAAAAAGo/sWowrRUCBhU/s1600-h/oracle.jpg"&gt;&lt;img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 480px; DISPLAY: block; HEIGHT: 240px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5386591456860372754" border="0" alt="" src="http://4.bp.blogspot.com/_oKO4lXYJzFQ/SsEEZABQ_xI/AAAAAAAAAGo/sWowrRUCBhU/s320/oracle.jpg" /&gt;&lt;/a&gt; &lt;/p&gt;&lt;p&gt;Even PostgreSQL (which I find quite cool actually) does portray itself as having object/relational features - table structures can be inherited.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30166624-5600628429688885148?l=connectedsystems.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://connectedsystems.blogspot.com/feeds/5600628429688885148/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30166624&amp;postID=5600628429688885148' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30166624/posts/default/5600628429688885148'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30166624/posts/default/5600628429688885148'/><link rel='alternate' type='text/html' href='http://connectedsystems.blogspot.com/2009/09/oracle-and-objects.html' title='Oracle and objects'/><author><name>Razvan</name><uri>http://www.blogger.com/profile/01478237694157411648</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp1.blogger.com/_oKO4lXYJzFQ/SD-O3vBCSZI/AAAAAAAAACw/rLUH4XNTr8A/S220/rjp.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_oKO4lXYJzFQ/SsEEZABQ_xI/AAAAAAAAAGo/sWowrRUCBhU/s72-c/oracle.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30166624.post-3209202059259800926</id><published>2009-09-26T02:30:00.000-07:00</published><updated>2009-09-26T05:50:49.018-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='API'/><category scheme='http://www.blogger.com/atom/ns#' term='Ruby'/><category scheme='http://www.blogger.com/atom/ns#' term='Windows'/><title type='text'>More on globals and classes in Caché</title><content type='html'>&lt;span style="font-family:georgia;"&gt;Interesting - it seems that "dynamic languages" have been around for much longer than (us) Ruby users would think. Here's Caché's own version of it at work:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Class Definition: TransactionData&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;/// Test class - Julian, Sept 2009&lt;br /&gt;Class User.TransactionData Extends %Persistent&lt;br /&gt;{&lt;br /&gt;Property Message As %String;&lt;br /&gt;Property Token As %Integer;&lt;br /&gt;} &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Routine: &lt;span style="font-family:courier new;"&gt;test.mac&lt;br /&gt;&lt;br /&gt;Set ^tdp = ##class(User.TransactionData).%New()&lt;br /&gt;Set ^tdp.Message = "XXXX^QPR^JTX"&lt;br /&gt;Set ^tdp.Token = 131&lt;br /&gt;&lt;br /&gt;Write !, "Created: " _ ^tdp&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Terminal:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;USER&gt; do ^test&lt;br /&gt;... Created 1@User.TransactionData&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;Studio: Globals&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;tdp&lt;br /&gt;^tdp = "1@User.TransactionData"&lt;br /&gt;tdp.Message&lt;br /&gt;^tdp.Message = "XXXX^QPR^JTX"&lt;br /&gt;tdp.Token&lt;br /&gt;^tdp.Token = 131&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:georgia;"&gt;The order of creation is:&lt;br /&gt;&lt;/span&gt;&lt;ol&gt;&lt;li&gt;&lt;span style="font-family:georgia;"&gt;create the class&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:georgia;"&gt;this will create the SQL objects&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:georgia;"&gt;populating the SQL table will instantiate the globals&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:georgia;"&gt;the globals are: &lt;em&gt;class&lt;/em&gt;D for data, &lt;em&gt;class&lt;/em&gt;I for index&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;&lt;span style="font-family:georgia;"&gt;Objects can be created (%New)/opened(%OpenId) from code, but to be saved (%Save: which will update the database), the restrictions must be met (required properties, unique indexes, etc).&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:georgia;"&gt;Also, I finally got the .NET gateway generator to work: it creates native .NET classes that can communicate with Cache objects. Here is a sample of the client code:&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Arial;"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:courier new;"&gt;InterSystems.Data.CacheClient.CacheConnection cn = new InterSystems.Data.CacheClient.CacheConnection("Server=Irikiki; Port=1972;" +&lt;br /&gt;"Log File = D:\\CacheNet\\DotNetCurrentAccess.log; Namespace = USER;" +&lt;br /&gt;"Password = ______; USER ID = ____");&lt;br /&gt;cn.Open();&lt;br /&gt;PatientInfo pi = new PatientInfo(cn);&lt;br /&gt;pi.PatientName = "New Patient";&lt;br /&gt;pi.PatientID = new byte[1]{6};&lt;br /&gt;InterSystems.Data.CacheTypes.CacheStatus x = pi.Save();&lt;br /&gt;Console.WriteLine(x.Message);&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:courier new;"&gt;PatientInfo&lt;/span&gt;&lt;span style="font-family:arial;"&gt; &lt;span style="font-family:georgia;"&gt;is a class defined in Cache, as follows&lt;/span&gt;:&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:courier new;"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:courier new;"&gt;&lt;/p&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;Class User.PatientInfo Extends %Persistent&lt;br /&gt;{&lt;br /&gt;&lt;br /&gt;Property PatientName As %String [ Required ];&lt;br /&gt;Property PatientDOB As %Date;&lt;br /&gt;Property PatientID As %ObjectIdentity;&lt;br /&gt;&lt;br /&gt;Method getVersion() As %String&lt;br /&gt;{&lt;br /&gt;Quit "Version 1.0"&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;Index IndexPatientName On PatientName;&lt;br /&gt;Index IndexPatientId On PatientID [ IdKey, PrimaryKey, Unique ];&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:georgia;"&gt;Easy enough, the &lt;span style="font-family:courier new;"&gt;getVersion()&lt;/span&gt; method is available to the C# code, as are the persistence and all the other methdods natively available in ObjectScript. The generated code is &lt;/span&gt;&lt;a href="http://razvan.petrescu.googlepages.com/PatientInfo.cs"&gt;&lt;span style="font-family:georgia;"&gt;here&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family:georgia;"&gt;. &lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30166624-3209202059259800926?l=connectedsystems.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://connectedsystems.blogspot.com/feeds/3209202059259800926/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30166624&amp;postID=3209202059259800926' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30166624/posts/default/3209202059259800926'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30166624/posts/default/3209202059259800926'/><link rel='alternate' type='text/html' href='http://connectedsystems.blogspot.com/2009/09/more-on-globals-and-classes-in-cache.html' title='More on globals and classes in Caché'/><author><name>Razvan</name><uri>http://www.blogger.com/profile/01478237694157411648</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp1.blogger.com/_oKO4lXYJzFQ/SD-O3vBCSZI/AAAAAAAAACw/rLUH4XNTr8A/S220/rjp.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30166624.post-2484728947407498041</id><published>2009-09-23T20:02:00.000-07:00</published><updated>2009-09-23T20:05:35.932-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='API'/><category scheme='http://www.blogger.com/atom/ns#' term='information economics'/><title type='text'>Ahead of the curve?</title><content type='html'>Some of the challenges I encountered while working on the AIR/GoogleHealth project:&lt;br /&gt;&lt;br /&gt;- learning the Google Data API&lt;br /&gt;- learning the Google Health API which rests on top of the Data API&lt;br /&gt;- (re) figuring out some of AIR's limitations and features&lt;br /&gt;- (re) figuring out some of JavaScript's limitations and features&lt;br /&gt;- using the mixed AIR/JavaScript environment&lt;br /&gt;&lt;br /&gt;In my experience this is pretty standard when dealing with new languages and platforms. 15 years on, still a struggle - but then probably one should be worried when one becomes too proficient in a language/platform because it's already obsolete by then.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30166624-2484728947407498041?l=connectedsystems.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://connectedsystems.blogspot.com/feeds/2484728947407498041/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30166624&amp;postID=2484728947407498041' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30166624/posts/default/2484728947407498041'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30166624/posts/default/2484728947407498041'/><link rel='alternate' type='text/html' href='http://connectedsystems.blogspot.com/2009/09/ahead-of-curve.html' title='Ahead of the curve?'/><author><name>Razvan</name><uri>http://www.blogger.com/profile/01478237694157411648</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp1.blogger.com/_oKO4lXYJzFQ/SD-O3vBCSZI/AAAAAAAAACw/rLUH4XNTr8A/S220/rjp.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30166624.post-2094160697225544509</id><published>2009-09-22T01:25:00.001-07:00</published><updated>2009-09-26T02:35:51.587-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Middleware'/><title type='text'>Caché and ODBC</title><content type='html'>And yes, reporting tools do indeed allow you to use Caché-specific SQL:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/_oKO4lXYJzFQ/SriKT0-6O8I/AAAAAAAAAGg/QHRUEGJajYk/s1600-h/CacheODBC.jpg"&gt;&lt;img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; WIDTH: 320px; DISPLAY: block; HEIGHT: 249px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5384205427766082498" border="0" alt="" src="http://4.bp.blogspot.com/_oKO4lXYJzFQ/SriKT0-6O8I/AAAAAAAAAGg/QHRUEGJajYk/s320/CacheODBC.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Above, Microsoft Report Builder 2.0 with Caché-tinged SQL.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30166624-2094160697225544509?l=connectedsystems.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://connectedsystems.blogspot.com/feeds/2094160697225544509/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30166624&amp;postID=2094160697225544509' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30166624/posts/default/2094160697225544509'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30166624/posts/default/2094160697225544509'/><link rel='alternate' type='text/html' href='http://connectedsystems.blogspot.com/2009/09/cache-and-odbc.html' title='Caché and ODBC'/><author><name>Razvan</name><uri>http://www.blogger.com/profile/01478237694157411648</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp1.blogger.com/_oKO4lXYJzFQ/SD-O3vBCSZI/AAAAAAAAACw/rLUH4XNTr8A/S220/rjp.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_oKO4lXYJzFQ/SriKT0-6O8I/AAAAAAAAAGg/QHRUEGJajYk/s72-c/CacheODBC.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30166624.post-2186434430110503796</id><published>2009-09-21T23:29:00.000-07:00</published><updated>2009-09-21T23:35:23.415-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='HealthVault'/><title type='text'>Sybase joins the healthcare fray</title><content type='html'>Sybase &lt;a href="http://www.sybase.com/products/healthcare/providers"&gt;has&lt;/a&gt; now a set of solutions for healthcare. Which is interesting, as previously they were known for their financial industry focus. So indeed it would appear that healthcare-oriented IT is poised to grow to the same prominence as that hitherto enjoyed by finance-IT.&lt;br /&gt;&lt;br /&gt;Their flagship product in the industry seems to be eBiz Impact, YAIP (&lt;em&gt;yet another integration platform&lt;/em&gt;) in the vein of Ensemble, DBMotion, and perhaps even &lt;a href="http://www.alert-online.com/"&gt;alert-online&lt;/a&gt;. I might have to revise my chart from a few posts ago.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30166624-2186434430110503796?l=connectedsystems.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://connectedsystems.blogspot.com/feeds/2186434430110503796/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30166624&amp;postID=2186434430110503796' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30166624/posts/default/2186434430110503796'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30166624/posts/default/2186434430110503796'/><link rel='alternate' type='text/html' href='http://connectedsystems.blogspot.com/2009/09/sybase-joins-healthcare-fray.html' title='Sybase joins the healthcare fray'/><author><name>Razvan</name><uri>http://www.blogger.com/profile/01478237694157411648</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp1.blogger.com/_oKO4lXYJzFQ/SD-O3vBCSZI/AAAAAAAAACw/rLUH4XNTr8A/S220/rjp.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30166624.post-2009550728630446356</id><published>2009-09-12T07:30:00.000-07:00</published><updated>2009-09-12T07:40:44.778-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='AIR'/><category scheme='http://www.blogger.com/atom/ns#' term='SQLite'/><category scheme='http://www.blogger.com/atom/ns#' term='Javascript'/><category scheme='http://www.blogger.com/atom/ns#' term='HealthVault'/><title type='text'>XMLite?</title><content type='html'>So, just for fun, I decided to code the GoogleHealth client in Adobe AIR. Using the embedded sqlite database allows for a nice persistence of the 'session' variables, but here we also run into a small issue: since communication with GoogleHealth is done via XML - which, BTW, demands feeding the XMLHttpRequest output into DOMParser for a more natural processing - and there are large XML documents to be passed between the cloud and the client (e.g., the notice template and the other CCR data) it would make a lot of sense to use a XML database such as &lt;a href="http://bigmenoncontent.com/2009/05/28/xdb-matters/"&gt;xDB&lt;/a&gt;. But, AIR is JS-based, hence no easy JDBC access, so the only solution would seem to be using SQLite's Virtual Tables as a gateway into xDB. Not sure it is doable - it probably is, but not worth the effort (VTables need C-API coding, xDB is Java-based... etc). Just another example of the impedance difference problem, this time at the data communication layer, and an illustration of how global data connectivity is still far from being achieved.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30166624-2009550728630446356?l=connectedsystems.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://connectedsystems.blogspot.com/feeds/2009550728630446356/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30166624&amp;postID=2009550728630446356' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30166624/posts/default/2009550728630446356'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30166624/posts/default/2009550728630446356'/><link rel='alternate' type='text/html' href='http://connectedsystems.blogspot.com/2009/09/xmlite.html' title='XMLite?'/><author><name>Razvan</name><uri>http://www.blogger.com/profile/01478237694157411648</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp1.blogger.com/_oKO4lXYJzFQ/SD-O3vBCSZI/AAAAAAAAACw/rLUH4XNTr8A/S220/rjp.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30166624.post-2539868963376221752</id><published>2009-09-12T01:47:00.000-07:00</published><updated>2009-09-12T01:54:26.278-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Javascript'/><title type='text'>Thank you for the improved version</title><content type='html'>Getting back to working on the GoogleHealth demo. Code that used to work a month ago doesn't anymore - the only change is, I upgraded Firefox. Which caused some problems with XMLHttpRequest. D'oh - the code works just fine in Internet Explorer, save for the (useless) ActiveX warnings. Why, why, why Firefox, why do you return a '0' status? Changes/bugs/whatever it is such as this as very annoying, a waste of time, and a serious productivity drain. Not to mention that Firefox doesn't seem to render this very site correctly.&lt;br /&gt;&lt;br /&gt;Ok enough ranting. Will be documenting the GH project next... update to follow.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30166624-2539868963376221752?l=connectedsystems.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://connectedsystems.blogspot.com/feeds/2539868963376221752/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30166624&amp;postID=2539868963376221752' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30166624/posts/default/2539868963376221752'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30166624/posts/default/2539868963376221752'/><link rel='alternate' type='text/html' href='http://connectedsystems.blogspot.com/2009/09/getting-back-to-working-on-googlehealth.html' title='Thank you for the improved version'/><author><name>Razvan</name><uri>http://www.blogger.com/profile/01478237694157411648</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp1.blogger.com/_oKO4lXYJzFQ/SD-O3vBCSZI/AAAAAAAAACw/rLUH4XNTr8A/S220/rjp.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30166624.post-7928614991140089611</id><published>2009-09-08T22:47:00.000-07:00</published><updated>2009-09-08T22:50:41.904-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Programmable web'/><title type='text'>Follow-ups</title><content type='html'>Interesting &lt;a href="http://www.hoot72.org/"&gt;link&lt;/a&gt; related to my previous posts on Intersystems, HL7, etc.&lt;br /&gt;&lt;br /&gt;And &lt;a href="http://www.ibm.com/developerworks/edu/x-dw-x-sparql.html"&gt;SPARQL&lt;/a&gt;, something I should look into.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30166624-7928614991140089611?l=connectedsystems.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://connectedsystems.blogspot.com/feeds/7928614991140089611/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30166624&amp;postID=7928614991140089611' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30166624/posts/default/7928614991140089611'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30166624/posts/default/7928614991140089611'/><link rel='alternate' type='text/html' href='http://connectedsystems.blogspot.com/2009/09/follow-ups.html' title='Follow-ups'/><author><name>Razvan</name><uri>http://www.blogger.com/profile/01478237694157411648</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp1.blogger.com/_oKO4lXYJzFQ/SD-O3vBCSZI/AAAAAAAAACw/rLUH4XNTr8A/S220/rjp.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30166624.post-4211034043028789781</id><published>2009-08-04T10:23:00.000-07:00</published><updated>2009-08-04T10:25:14.278-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='information economics'/><title type='text'>(very) Preliminary performance comparisons</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_oKO4lXYJzFQ/Snhu3fAhASI/AAAAAAAAAGA/NGthm0ESJSg/s1600-h/Insert.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 193px;" src="http://1.bp.blogspot.com/_oKO4lXYJzFQ/Snhu3fAhASI/AAAAAAAAAGA/NGthm0ESJSg/s320/Insert.jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5366160855507468578" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;p&gt;Ok, I hope to finish this before I tire of it, but here are the comparisons between INSERT ops for Cache and C-Tree. &lt;em&gt;x&lt;/em&gt; - # records, &lt;em&gt;y&lt;/em&gt; - milliseconds.&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30166624-4211034043028789781?l=connectedsystems.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://connectedsystems.blogspot.com/feeds/4211034043028789781/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30166624&amp;postID=4211034043028789781' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30166624/posts/default/4211034043028789781'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30166624/posts/default/4211034043028789781'/><link rel='alternate' type='text/html' href='http://connectedsystems.blogspot.com/2009/08/very-preliminary-performance.html' title='(very) Preliminary performance comparisons'/><author><name>Razvan</name><uri>http://www.blogger.com/profile/01478237694157411648</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp1.blogger.com/_oKO4lXYJzFQ/SD-O3vBCSZI/AAAAAAAAACw/rLUH4XNTr8A/S220/rjp.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_oKO4lXYJzFQ/Snhu3fAhASI/AAAAAAAAAGA/NGthm0ESJSg/s72-c/Insert.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30166624.post-3861032622714112960</id><published>2009-07-31T04:43:00.001-07:00</published><updated>2009-09-08T22:27:18.183-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='HealthVault'/><category scheme='http://www.blogger.com/atom/ns#' term='information economics'/><title type='text'>Competition in high technology</title><content type='html'>One of the purposes of the last posts was to see how do high-tech firms actually compete. Industry analysis is usually presented in a nice compartmentalized way where the value chain is clearly identified and the five forces framework can be neatly applied. I think this post will show that for large firms, with offerings across different segments of an industry, or even crossing industry barriers, the analysis is a bit more complex.&lt;br /&gt;&lt;br /&gt;I think this starts with the fact that the "IT industry" is in fact a multiple-headed beast, since so many other industries use it. So defining the industry in which these players compete is difficult in itself.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/_oKO4lXYJzFQ/Sp9wnuqqTBI/AAAAAAAAAGY/y6rM7Kpa7m4/s1600-h/Comparison.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 99px;" src="http://2.bp.blogspot.com/_oKO4lXYJzFQ/Sp9wnuqqTBI/AAAAAAAAAGY/y6rM7Kpa7m4/s320/Comparison.jpg" alt="" id="BLOGGER_PHOTO_ID_5377140307947834386" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;So basically some companies started in an industry vertical (Intersystems - healthcare) where they built a complete stack which then they exported to other verticals (finance for Intersystems), or to the "center", becoming integrated players (Cache is portraying itself as a general purpose "post-relational" database; my guess is that this moniker is an attempt to rebrand it as a mainstream competitor, kind of reframing the "hierarchical database with roots in 60's healthcare software" description; BTW, there is nothing wrong with this description, and I think it is a cool product with remarkable performance characteristics).&lt;br /&gt;&lt;br /&gt;The challenge in this case is convincing a mainstream audience that a niche product originating in a vertical is indeed a viable proposition. Tough, especially since the ecosystem (e.g., reporting tools) is built around standards that for example Cache works around (e.g., the SQL "pointers").&lt;br /&gt;&lt;br /&gt;Secondly, there are the pure vertical players (which I haven't really talked much about here such as Siemens and GE). They built their applications portfolios by acquisitions (so perhaps dbMotion is a potential acquisition target?) but they rely on the mainstream vendors from the "center" for the base technology (perhaps; e.g., Siemens uses MS SQL as the db engine for its HIS, but Epic uses Cache).&lt;br /&gt;&lt;br /&gt;Then, there are the mainstream technology companies which are trying to move from the center (pure database platform) into verticals (Amalga). At this point they are obviously encroaching on the vertical vendors territory, be they pure vertical players or integrated players. How will companies compete on one segment while collaborating on others remains to be seen (vertical industry offering competition, collaboration at the platform level).&lt;br /&gt;&lt;br /&gt;Fourth, there are niche players (dbMotion, SQLite, FairCom) which operate either in the vertical or in the center, but offering solutions appropriate for a specific vertical (e.g. FairCom having found a reasonalby comfortable place as the engine of choice for turnkey systems). As mentioned already, I would guess that at some point dbMotion's PE backers (if there are any) would be looking for an exit in the guise of a purchase by a vendor, either in the mainstream/center (more likely) or in the vertical, while SQLite or FairCom are likely, due to their more general (albeit niche) appeal, to survive on their own.&lt;br /&gt;&lt;br /&gt;There are plenty of interesting companies I have not covered such as MCObject, db4o, Pervasive, OpenLINK, NeoTool, and perhaps even Progress. As time permits I might revisit this writeup to include them, and perhaps even do a nice boxes and arrows schema, as good strategy analysis always seems to demand!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30166624-3861032622714112960?l=connectedsystems.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://connectedsystems.blogspot.com/feeds/3861032622714112960/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30166624&amp;postID=3861032622714112960' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30166624/posts/default/3861032622714112960'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30166624/posts/default/3861032622714112960'/><link rel='alternate' type='text/html' href='http://connectedsystems.blogspot.com/2009/07/competition-in-high-technology.html' title='Competition in high technology'/><author><name>Razvan</name><uri>http://www.blogger.com/profile/01478237694157411648</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp1.blogger.com/_oKO4lXYJzFQ/SD-O3vBCSZI/AAAAAAAAACw/rLUH4XNTr8A/S220/rjp.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_oKO4lXYJzFQ/Sp9wnuqqTBI/AAAAAAAAAGY/y6rM7Kpa7m4/s72-c/Comparison.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30166624.post-3590125681439911836</id><published>2009-07-31T04:42:00.001-07:00</published><updated>2009-09-04T00:18:51.040-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='HealthVault'/><title type='text'>dbMotion</title><content type='html'>&lt;ul&gt;&lt;br /&gt;&lt;li&gt;similar to: partially, Intersystems&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;p&gt;&lt;br /&gt;&lt;strong&gt;dbMotion&lt;/strong&gt; presents itself as a SOA-based platform enabling medical information interoperability and HIE. It is made up of several layers (from data integration, the lowest, to presentation, the highest) which are tied together and present to the exterior a 'unified medical schema', a patient-centric medical record. A business layer does data aggregation.&lt;br /&gt;&lt;br /&gt;There are also a few other components such as shared services (which deals with, among others, unique patient identification). UMS is based on &lt;a href="http://www.neotool.com/blog/2007/05/14/why-use-an-hl7-engine/"&gt;HL7&lt;/a&gt; V3 Reference Information Model. Other features include custom views into the data, data-triggered events, and an EMR gateway. &lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;a href="http://4.bp.blogspot.com/_oKO4lXYJzFQ/Sp9t07AfVYI/AAAAAAAAAGQ/qWm7oAMDZKg/s1600-h/dbMotion.jpg"&gt;&lt;img style="margin: 0px auto 10px; text-align: center; width: 320px; display: block; height: 212px;" id="BLOGGER_PHOTO_ID_5377137236064032130" alt="" src="http://4.bp.blogspot.com/_oKO4lXYJzFQ/Sp9t07AfVYI/AAAAAAAAAGQ/qWm7oAMDZKg/s320/dbMotion.jpg" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;As I understand it, without having seen it in an actual deployment, dbMotion's offering is similar to Intersystems' Ensemble, without the underlying infrastructure (no Cache included, it relies on the user's database), but with the HealthShare component (so it offers healthcare-specific application infrastructure, whereas Intersystems' offerings are more segmented). What would be the benefit, compared to Ensemble? It does not take a whole Cache installation so it might (?) be cheaper, and the dev skills might be more widespread; it also is more mainstream-RAD. It seems to be a solution for patching together an existing infrastructure, whether my feeling about Ensemble is that it would perhaps work best with a brand new setup.&lt;/p&gt;Interestingly enough, dbMotion is developed using the Microsoft stack, and the company is in fact a Microsoft &lt;a href="http://www.microsoft.com/canada/partnersolutionmarketplace/solutiondetail.aspx?id=954e008c-ace5-4f48-8e6b-d38d1c8fc4e0#"&gt;partner&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;What I don't quite get from the description is how does HL7 interfacing work with dbMotion - UMS is (perhaps logically) based on the (XML-based) HL7.v3 RIM, but is there a conversion mechanism to the other versions? How about v2 endpoints?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30166624-3590125681439911836?l=connectedsystems.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://connectedsystems.blogspot.com/feeds/3590125681439911836/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30166624&amp;postID=3590125681439911836' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30166624/posts/default/3590125681439911836'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30166624/posts/default/3590125681439911836'/><link rel='alternate' type='text/html' href='http://connectedsystems.blogspot.com/2009/07/dbmotion.html' title='dbMotion'/><author><name>Razvan</name><uri>http://www.blogger.com/profile/01478237694157411648</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp1.blogger.com/_oKO4lXYJzFQ/SD-O3vBCSZI/AAAAAAAAACw/rLUH4XNTr8A/S220/rjp.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_oKO4lXYJzFQ/Sp9t07AfVYI/AAAAAAAAAGQ/qWm7oAMDZKg/s72-c/dbMotion.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30166624.post-6257023973944952168</id><published>2009-07-31T04:41:00.000-07:00</published><updated>2009-09-03T00:48:49.927-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='HealthVault'/><title type='text'>Oracle</title><content type='html'>&lt;ul&gt;&lt;li&gt;similar to: IBM, Microsoft&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;As far as I can tell, other than platform offerings, Oracle's only specific healthcare product is &lt;strong&gt;Transaction Base&lt;/strong&gt;, a IHE solution. While the full spec is &lt;a href="http://www.oracle.com/industries/healthcare/htb.html"&gt;here&lt;/a&gt;, my initial assessment is that it would make sense in an environment with an already significant Oracle investment. There is a life sciences product as well (Argus Safety Suite) which I believe Oracle just purchased; the other life sciences product is Clinical Data Management which deals with managing clinical trials data.&lt;/p&gt;&lt;p&gt;Interesting, but apparently not as exhaustive as some of the other products discussed here.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30166624-6257023973944952168?l=connectedsystems.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://connectedsystems.blogspot.com/feeds/6257023973944952168/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30166624&amp;postID=6257023973944952168' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30166624/posts/default/6257023973944952168'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30166624/posts/default/6257023973944952168'/><link rel='alternate' type='text/html' href='http://connectedsystems.blogspot.com/2009/07/oracle.html' title='Oracle'/><author><name>Razvan</name><uri>http://www.blogger.com/profile/01478237694157411648</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp1.blogger.com/_oKO4lXYJzFQ/SD-O3vBCSZI/AAAAAAAAACw/rLUH4XNTr8A/S220/rjp.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30166624.post-2319661499788887130</id><published>2009-07-31T04:40:00.002-07:00</published><updated>2009-09-03T00:42:22.127-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='HealthVault'/><title type='text'>Microsoft</title><content type='html'>&lt;ul&gt;&lt;li&gt;similar to: Intersystems, Oracle/IBM&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Through acquisitions, Microsoft has built an impressive array of offerings in the healthcare space:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;HIS/PACS-RIS&lt;/li&gt;&lt;li&gt;LifeSciences&lt;/li&gt;&lt;li&gt;Unified Intelligence System&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;HIS is pretty clear - direct competition to the Intersystems TrakCare discussed here. &lt;/p&gt;&lt;p&gt;UIS is a data aggregator and is somewhat similar to dbMotion and Ensemble. It integrates with HealthVault as an EMR solution. &lt;/p&gt;&lt;p&gt;&lt;a href="http://www.microsoft.com/amalga/products/microsoftamalgalifesciences/howitworks.mspx"&gt;LifeSciences&lt;/a&gt; is similar to Oracle and IBM offerings in that it is a suprastructure built on an existing pure technology platform that is targeted at the needs of life sciences.&lt;/p&gt;&lt;p&gt;Same as Oracle and IBM, Microsoft has arrived at the healthcare apps arena from the pure tech extreme - leveraging a platform into a specific vertical, quite the opposite of Intersystems, which started with an industry-specific application which it then moved (more or less) downstream as a general-purpose platform.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30166624-2319661499788887130?l=connectedsystems.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://connectedsystems.blogspot.com/feeds/2319661499788887130/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30166624&amp;postID=2319661499788887130' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30166624/posts/default/2319661499788887130'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30166624/posts/default/2319661499788887130'/><link rel='alternate' type='text/html' href='http://connectedsystems.blogspot.com/2009/07/microsoft.html' title='Microsoft'/><author><name>Razvan</name><uri>http://www.blogger.com/profile/01478237694157411648</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp1.blogger.com/_oKO4lXYJzFQ/SD-O3vBCSZI/AAAAAAAAACw/rLUH4XNTr8A/S220/rjp.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30166624.post-2043701909293875565</id><published>2009-07-31T04:40:00.001-07:00</published><updated>2009-08-04T10:58:39.213-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SQLite'/><category scheme='http://www.blogger.com/atom/ns#' term='information economics'/><title type='text'>FairCom C-Tree</title><content type='html'>&lt;ul&gt;&lt;li&gt;similar to: SQLite&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;FairCom is not an illogical choice to follow InterSystems; both companies' databases claim to be among the fastest on the market.&lt;/p&gt;&lt;p&gt;Also, both are "developers'" platforms, designed less with a general-purpose audience in mind and more with a techie audience. Both originate from successful companies that have been in business for a long time, and yet are not so well known outside tech circles.&lt;/p&gt;&lt;p&gt;So what are the differences?&lt;br /&gt;&lt;/p&gt;&lt;p&gt;What most people like about FairCom &lt;strong&gt;cTree&lt;/strong&gt; is the access they get to the source code, which allows them to interact with the database through various interfaces, native, ADO, ODBC, etc. I guess that this is also possible with &lt;a href="http://dev.mysql.com/downloads/"&gt;mySQL&lt;/a&gt;, &lt;a href="http://www.sqlite.org/sqlite-amalgamation-3_6_16.zip"&gt;SQLite&lt;/a&gt;, and perhaps &lt;a href="http://doxygen.postgresql.org/"&gt;PostGreSQL&lt;/a&gt; as well. FairCom predates (or is a contemporary) of most of these products.&lt;/p&gt;&lt;p&gt;Where FairCom differs from Intersystems is that its product is even less open, the &lt;em&gt;cTree Ace SQLExplorer&lt;/em&gt; tool notwithstanding. It takes minimal admin effort and it seems targeted at turnkey or embedded systems developers, with its heavy access on C-application layer programming. You can certainly access cTree from C#, but the product is written in C and has a C developer audience in mind first; if performance is its main selling point (which makes sense: connecting from a JVM through a JDBC/ODBC bridge to, say, a remote Cache gateway which will in turn translate the code to native requests is probably akin to entering virtual machine hell), then staying close to the core system is compulsory. More on performance later.&lt;/p&gt;&lt;p&gt;Another thing that Cache and C-Tree have in common (but where they also differ) is that they provide different "views" into the database engine: hierarchical/sparse arrays/B-Trees in the case of Cache, C-Trees with ISAM and SQL interfaces in the case of C-Tree. Relational databases are based on, if memory serves, B-Trees (or B+ trees). However, SQL Server for example, keeps the relational engine very close to the B-Tree structure (time to review those &lt;a href="http://sqlblog.com/blogs/kalen_delaney/"&gt;Kalen Delaney&lt;/a&gt; books); in fact, I found the whole interaction between the set-based SQL and row-based processing engine quite fascinating.&lt;/p&gt;&lt;p&gt;Both Cache and C-Tree take a slightly different approach; the various interfaces into their storage engines are clearly provided for convenience only; back in the day, as far as I recall, &lt;a href="http://msdn.microsoft.com/en-us/library/aa936940(SQL.80).aspx"&gt;Db-Lib&lt;/a&gt; was the library of choice for SQL Server as well (makes you wonder where does &lt;a href="http://www.freetds.org/userguide/choosingtdsprotocol.htm"&gt;TDS&lt;/a&gt; live now?) The bottom line is that if you are going to use Cache or C-Tree, you &lt;em&gt;should&lt;/em&gt; use the native interfaces; there is no other reason why you would choose C-Tree over a mainstream product such as SQL Server or Oracle, or even mySQL.&lt;/p&gt;&lt;p&gt;C-Tree uses ISAM as its innermost data structure; this harkens back to the mainframe days, and what it means is is that data is accessed directly through indexes, as opposed to allowing the query optimizer to decide which indexes to use (for a relational database).&lt;br /&gt;&lt;br /&gt;As per Wikipedia, ISAM data is fixed-length. Indexes are stored in a separate tables and not in the leaves of data tables. MySQL functions on the same principle. A relational mechanism can exist on top of the ISAM structures. A more detailed presentation of the technicalities of working with the system can be found here. &lt;br /&gt;&lt;br /&gt;You can see more details of the structure here - how each table corresponds to a data/index file pair.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_oKO4lXYJzFQ/SnhvgcgHPcI/AAAAAAAAAGI/CVac3ENDhQc/s1600-h/ctree.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 115px;" src="http://3.bp.blogspot.com/_oKO4lXYJzFQ/SnhvgcgHPcI/AAAAAAAAAGI/CVac3ENDhQc/s320/ctree.jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5366161559209328066" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The reason I am likening it to SQLite is that it is a niche product that caters to a well-defined group: developers of embedded or turnkey systems (which is not dissimilar to who SQLite targets - remember that it is the db of choice for iTunes and Adobe AIR).&lt;span style="font-family:courier new;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30166624-2043701909293875565?l=connectedsystems.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://connectedsystems.blogspot.com/feeds/2043701909293875565/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30166624&amp;postID=2043701909293875565' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30166624/posts/default/2043701909293875565'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30166624/posts/default/2043701909293875565'/><link rel='alternate' type='text/html' href='http://connectedsystems.blogspot.com/2009/07/faircom-c-tree.html' title='FairCom C-Tree'/><author><name>Razvan</name><uri>http://www.blogger.com/profile/01478237694157411648</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp1.blogger.com/_oKO4lXYJzFQ/SD-O3vBCSZI/AAAAAAAAACw/rLUH4XNTr8A/S220/rjp.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_oKO4lXYJzFQ/SnhvgcgHPcI/AAAAAAAAAGI/CVac3ENDhQc/s72-c/ctree.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30166624.post-5889115515361292679</id><published>2009-07-31T02:51:00.000-07:00</published><updated>2009-07-31T05:28:27.611-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='HealthVault'/><title type='text'>Middleware, continued (Intersystems HealthShare/TrackCare)</title><content type='html'>&lt;span style="font-weight: bold;"&gt;HealthShare&lt;/span&gt; is an extension of Caché and Ensemble in the healthcare vertical. It is called a 'health information exchange', and I am going to try to see if this matches what HealthVault and GoogleHealth are attempting to be; terminology can be tricky. 'EHR' comes up frequently when describing HealthShare, but is it just an EHR data platform? Or a HIS?&lt;br /&gt;&lt;br /&gt;A consortium called &lt;a href="http://www.ihe.net/"&gt;IHE&lt;/a&gt; exists, affiliated with HIMSS, which attempts to establish interconnectivity standards for the healthcare IT industry. It documents how established standards (DICOM, HL7) should be used to exchange information between clinical applications. HealthShare operates along those lines.&lt;br /&gt;&lt;br /&gt;IHE does things such as this:&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_oKO4lXYJzFQ/SnLicZbh9CI/AAAAAAAAAFw/fOjMtEuq_TA/s1600-h/CardiologyUseCase.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 228px;" src="http://3.bp.blogspot.com/_oKO4lXYJzFQ/SnLicZbh9CI/AAAAAAAAAFw/fOjMtEuq_TA/s320/CardiologyUseCase.jpg" alt="" id="BLOGGER_PHOTO_ID_5364599083642254370" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;span style="font-size:85%;"&gt;A cardiology use case&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;Or as this:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_oKO4lXYJzFQ/SnLi3CO4R0I/AAAAAAAAAF4/qhJgYlAZNGo/s1600-h/CardiologyXactActors.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 213px;" src="http://1.bp.blogspot.com/_oKO4lXYJzFQ/SnLi3CO4R0I/AAAAAAAAAF4/qhJgYlAZNGo/s320/CardiologyXactActors.jpg" alt="" id="BLOGGER_PHOTO_ID_5364599541271643970" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;span style="font-size:85%;"&gt;Actors and transactions involved in an electrocardiography IHE "profile"&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;(images from the IHE Cardiology Profile &lt;a href="http://www.ihe.net/Technical_Framework/upload/ihe_CARD_tf_vol1_2.pdf"&gt;documentation&lt;/a&gt;)&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;HealthShare organizes data from clinical providers and makes it accessible to clinicians via a web browser. Although it does store some data locally and performs some data transformations, essentially it is a repository of clinical data from one/multiple providers. A similar product that I can think of is &lt;a href="http://www.microsoft.com/amalga/products/microsoftamalgauis/default.mspx"&gt;Amalga UIS&lt;/a&gt;. Some of the components first introduced in Ensemble (gateways) are in this case used to provide connectivity to the various clinical information sources. HealthVault would be the equivalent of the &lt;span style="font-style: italic;"&gt;HealthShare Edge Cache Repository&lt;/span&gt;, a store of shared data defined at each clinical data provider's level.&lt;br /&gt;&lt;br /&gt;Another component is the &lt;span style="font-style: italic;"&gt;Hub&lt;/span&gt;, developed in Ensemble, which connects all the data sources together and among others performs &lt;span style="color: rgb(204, 0, 0);"&gt;patient identification&lt;/span&gt; - something which I am too familiar with. I am curious how the Hub is updated (event-based, day-end process?)&lt;br /&gt;&lt;br /&gt;Edge Cache can replicate some or all of the clinical data from the original sources. At the minimum, it requests data through the gateways of the original sources, at the request of the Hub. It therefore serves another role that I am quite familiar with, that of a &lt;span style="color: rgb(204, 0, 0);"&gt;backup system for the HIS&lt;/span&gt; or practice management system.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.intersystems.com/healthshare/whitepapers/nehr-wp-images/Healthshare_image_1.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 600px; height: 460px;" src="http://www.intersystems.com/healthshare/whitepapers/nehr-wp-images/Healthshare_image_1.jpg" alt="" border="0" /&gt;&lt;/a&gt;&lt;span style="font-size:85%;"&gt;(image from the official HealthShare &lt;a href="http://www.intersystems.com/healthshare/whitepapers/creating_nehr_wp.html"&gt;docs&lt;/a&gt;)&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;hr /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;TrackCare&lt;/span&gt; is a web-based HIS; (un?) surprisingly, just like Amalga, it is not available in the US. It covers both financial and clinical apps. It is built on top of Ensemble. Since it is a full-fledged HIS, its description is beyond the scope of this post, but can be found &lt;a href="http://www.intersystems.com/trakcare/solution/trakcare-sg_complete.html"&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;The whole Intersystems portfolio of applications can be depicted as follows:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_oKO4lXYJzFQ/SnLRsWNB3FI/AAAAAAAAAFo/a98DlIS2r1k/s1600-h/Intersystems.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 194px; height: 320px;" src="http://3.bp.blogspot.com/_oKO4lXYJzFQ/SnLRsWNB3FI/AAAAAAAAAFo/a98DlIS2r1k/s320/Intersystems.jpg" alt="" id="BLOGGER_PHOTO_ID_5364580665956359250" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I will try to use this model when dealing with other vendors as well.&lt;br /&gt;&lt;br /&gt;A few concluding remarks:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;this is an integrated stack; you just need the OS and it gives you a storage system, an application development environment&lt;/li&gt;&lt;li&gt;however, the app dev environment isn't for the faint of heart, the VB-inspired offering notwithstanding; and some of the other languages offered are somewhat unusual by today's standards - but this is a throwback to the system's 60's roots; it must perform quite well in fact, since it has not gone the way of COBOL! (anyone &lt;span style="font-style: italic;"&gt;really&lt;/span&gt; uses Object-COBOL?)&lt;br /&gt;&lt;/li&gt;&lt;li&gt;the above makes it less known than, say, MS Visual Studio - but the environment is in fact targeted at specialized business developers and not at a mass audience&lt;/li&gt;&lt;li&gt;in the verticals that it targets (healthcare, finance) it seems to do quite well - Intersystems, the flagbearer for MUMPS, has been in business for over 3 decades&lt;/li&gt;&lt;li&gt;my question would be why there isn't an offering for finance (similar to the healthcare solutions) - perhaps the industry is much more fragmented than healthcare?&lt;/li&gt;&lt;li&gt;so the vendor's strategy in this case (Intersystems) is to offer a platform, a development environment, and a foray into an industry vertical. I am not sure which came first (apparently, all at the same time! if you read the history behind MUMPS), while, as we will see, other vendors' route has been different.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30166624-5889115515361292679?l=connectedsystems.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://connectedsystems.blogspot.com/feeds/5889115515361292679/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30166624&amp;postID=5889115515361292679' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30166624/posts/default/5889115515361292679'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30166624/posts/default/5889115515361292679'/><link rel='alternate' type='text/html' href='http://connectedsystems.blogspot.com/2009/07/middleware-continued-intersystems.html' title='Middleware, continued (Intersystems HealthShare/TrackCare)'/><author><name>Razvan</name><uri>http://www.blogger.com/profile/01478237694157411648</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp1.blogger.com/_oKO4lXYJzFQ/SD-O3vBCSZI/AAAAAAAAACw/rLUH4XNTr8A/S220/rjp.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_oKO4lXYJzFQ/SnLicZbh9CI/AAAAAAAAAFw/fOjMtEuq_TA/s72-c/CardiologyUseCase.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30166624.post-4598769659420823060</id><published>2009-07-30T10:54:00.000-07:00</published><updated>2009-07-31T01:35:36.670-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='HealthVault'/><category scheme='http://www.blogger.com/atom/ns#' term='Middleware'/><title type='text'>Middleware, continued (Intersystems Ensemble)</title><content type='html'>&lt;span&gt;Incidentally, I started a project that will test different databases' performance. The (yet, incomplete) version is &lt;a href="http://razvan.petrescu.googlepages.com/DbTest-project.rar"&gt;here&lt;/a&gt;, and the C# class that specifically deals with Caché interaction is &lt;a href="http://razvan.petrescu.googlepages.com/DbTest-CCacheDb.cs"&gt;here&lt;/a&gt; (a subclass of the &lt;a href="http://razvan.petrescu.googlepages.com/DbTest-CDb.cs"&gt;main&lt;/a&gt; database class). The I/O ops are very simple, only dealing with 2 fields.&lt;br /&gt;&lt;br /&gt;&lt;hr /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;Ensemble&lt;/span&gt; is a RAD platform; it allows users to create workflows, RIA's, and rule-based logic (hence, it can work as an interface engine). It contains an application server, workflow server, document server all in one - not surprising, given the Caché platform's own relatively wide array of offerings, on which Ensemble is based. As far as I can tell without having seen the product, it is really a set of extensions built in the Caché environment to provide messaging, workflow, and portal services, with some industry-specific features such as HL7/EDI, and endpoints for BPEL applications, database access, and other EAI connectors. Ensemble also offers data (SSIS-style? not too difficult to understand, and resulting in federated databases, as already implemented in the Caché application server external database gateway) and object transformation (Java --&gt; .NET ORBing? I am not sure how is this done, I assume through instantiating VM's for each of the supported platforms and performing marshaling between the objects).&lt;br /&gt;&lt;br /&gt;I assume that messaging is implemented in the Caché application server - not entirely different from the original MSMQ.&lt;br /&gt;&lt;br /&gt;As far as RAD capabilities (as so far I have mostly talked about infrastructure), Ensemble offers some graphical code generators for BPM; I am assuming it also supports the Caché development environment (ObjectScript, MVBasic and Basic).&lt;br /&gt;&lt;br /&gt;In Microsoft terms, Ensemble is basically VS + SQLServer + &lt;span style="font-weight: bold;"&gt;SSIS + WCF + WWF&lt;/span&gt; + BPEL parser + BizTalk + customizations. In bold, the middleware stack.&lt;br /&gt;&lt;br /&gt;&lt;hr /&gt;&lt;span style="font-size:85%;"&gt;On closer inspection, it appears that the inter-VM object conversion is in fact introspection- and proxy-based instantiation of .NET objects which are made available by Ensemble to Caché's native VM's. Ensemble runs a .NET VM which can execute .NET objects natively through worker threads. I am curious if this requires a Windows Server to be available at runtime - not sure how distributed can the Ensemble installation be.&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30166624-4598769659420823060?l=connectedsystems.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://connectedsystems.blogspot.com/feeds/4598769659420823060/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30166624&amp;postID=4598769659420823060' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30166624/posts/default/4598769659420823060'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30166624/posts/default/4598769659420823060'/><link rel='alternate' type='text/html' href='http://connectedsystems.blogspot.com/2009/07/middleware-continued.html' title='Middleware, continued (Intersystems Ensemble)'/><author><name>Razvan</name><uri>http://www.blogger.com/profile/01478237694157411648</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp1.blogger.com/_oKO4lXYJzFQ/SD-O3vBCSZI/AAAAAAAAACw/rLUH4XNTr8A/S220/rjp.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30166624.post-8136919066762959056</id><published>2009-07-30T07:03:00.000-07:00</published><updated>2009-07-31T07:48:24.846-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SQLite'/><category scheme='http://www.blogger.com/atom/ns#' term='HealthVault'/><category scheme='http://www.blogger.com/atom/ns#' term='Windows'/><category scheme='http://www.blogger.com/atom/ns#' term='information economics'/><category scheme='http://www.blogger.com/atom/ns#' term='Middleware'/><title type='text'>Middleware (Intersystems Cache)</title><content type='html'>...as in &lt;span style="font-style: italic;"&gt;connected systems&lt;/span&gt;, the original title to which this blog just reverted. I just noticed lately that there has been a bewildering proliferation of offerings in this space, some having to do with the Cloud, some having to do with verticals such as health care. So I will try to make sense of some of these things next.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Intersystems&lt;/span&gt; offers a &lt;span style="font-weight: bold;"&gt;database platform&lt;/span&gt; (Caché), a &lt;span style="font-weight: bold;"&gt;RAD toolset&lt;/span&gt; (Ensemble), a &lt;span style="font-weight: bold;"&gt;BI system&lt;/span&gt; (DeepSee), and two products specifically targeted at healthcare, an &lt;span style="font-weight: bold;"&gt;information exchange platform&lt;/span&gt; (HealthShare) and a &lt;span style="font-weight: bold;"&gt;web based IS&lt;/span&gt; (TrakCare). So if I was to put everything in a matrix comparing different vendors, it would almost have to be a 3D one - one dimension would have to cover the platform, and another (the depth) would have to cover the vertical (healthcare), as for example, Microsoft offers both the platform and the vertical app.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Caché&lt;/span&gt; is a combination of several products, some of which originate in MUMPS, which is a healthcare-specific programming language developed in the 1960's. MUMPS used hierarchical databases and was an underpinning of some of the earliest HIS developments (Wikipedia is our friend); at some point it ran on PDP-11, which incidentally was the first computer I did ever see.&lt;br /&gt;&lt;br /&gt;It makes one wonder what would have happened had MUMPS became the database standard as opposed to what would become Oracle, as MUMPS predates R2 (and C, by the way). But the close connection between the language and the database, which might strike some today as strange, goes back to its origins.&lt;br /&gt;&lt;br /&gt;Caché's performance stems from its sparse record architecture, and from its hierarchical (always-sorted) structure.&lt;br /&gt;&lt;br /&gt;Caché has been modernized to provide a ODBC-compliant interface (and derivatives: ADO.NET) and an object-oriented 'view' of the data and functionality embedded in MUMPS (ObjectScript). The development environment also offers a BASIC-type of programming language and a website construction toolkit, quite a lot for one standalone package.&lt;br /&gt;&lt;br /&gt;It seems that Caché is a document-oriented database, which would make it similar to a XML database in some ways - the main 'entities' are arrays in one case, nodes in the other as opposed to relational tables.&lt;br /&gt;&lt;br /&gt;At the same time, for a hierarchical database, Intersystems somewhat confusingly portrays it as an "object" database, which is probably not technically incorrect, since one of the views of the data is "object"-based as I mentioned above.&lt;br /&gt;&lt;br /&gt;Creating a class in Caché also creates a table accessible in SQL (via the database interfaces, or through the System Management Portal). The table has a few additional fields on top of the class' properties - an ID and a class name (used for reflection, I assume). The System Management Portal also provides a way to execute SQL statements against the database, although at first sight I cannot seem to create a new data source in Visual Studio - and have to access the data programmatically.&lt;br /&gt;&lt;br /&gt;One of the ways using the database from Microsoft Visual Studio requires the use of a stub creator app - CacheNetWizard, which failed every time I tried to use it. The other is to use the Caché ADO.NET provider:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;blockquote style="color: rgb(102, 0, 204);"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;            command = new CacheCommand(sql, cnCache);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;            CacheDataReader reader = command.ExecuteReader();&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;            while (reader.Read())&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;            {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;                 noRecsRead++;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;                 if (noRecs &gt; 0 &amp;amp;&amp;amp; noRecsRead &gt;= noRecs)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;                         break;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;            }&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/blockquote&gt;&lt;br /&gt;Running a large operation (a DELETE, in this case) from one client seems to spawn multiple CACHE.EXE processes.&lt;br /&gt;&lt;br /&gt;There are several ways of exporting data from Caché - exporting classes, which only exports the class definition (in fact, the table definition) and exporting the table itself to text, which exports the contents.&lt;br /&gt;&lt;br /&gt;The multidimensional array view of Caché reminds me somewhat of dictionary and array types in languages such as Ruby and Python, while the untyped data elements are also used in SQLite. Arrays can be embedded together to provide a sort of materialized view (in SQL terms) in effect.&lt;br /&gt;&lt;br /&gt;Ultimately, the gateway to Caché's hierarchical engine is the &lt;span style="font-style: italic;"&gt;Application Server&lt;/span&gt;, which takes care of the virtual machines for each of the supported languages, of the SQL interface, of the object views, and of the web/SOAP/XML accessibility, as well as providing communication mechanisms with other Caché instances and other databases (via ODBC and JDBC). The VM's access Caché tables as if they were variables.&lt;br /&gt;&lt;br /&gt;When it comes to &lt;span style="font-style: italic;"&gt;languages&lt;/span&gt;, Caché offers a BASIC variant and ObjectScript. The BASIC can be accessed from the (integrated) Studio (used for writing code) or from a (DOS-based) Terminal (used for launching code). It operates within the defined namespaces (class namespaces or table schemas). A difference from other variants of the language, which is due to the tight connection with the Caché engine, is the presence of disk-stored "global" variables, whose name is prefixed by ^; BASIC function names are actually global variables. Another difference is the presence of multidimensional arrays, similar to Python or Ruby, but which in this case are closely related to the Caché database engine (to which they are a core native feature - hierarchical databases' tables are ordered B-Trees, and these B-Trees provide the actual implementation of arrays; the SQL "tables" and OO "classes" are just views into these B-Trees/arrays); they do not have to be declared.&lt;br /&gt;&lt;br /&gt;The array "index" is nothing else than a notation for the key of the node of the B-Tree. Non-numeric indexes are therefore possible.&lt;br /&gt;&lt;br /&gt;Architecturally, I would be curious to know if these trees are always stored on disk, or they are cached in memory and some lazy-writer process at some point commits them to disk.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_oKO4lXYJzFQ/SnKHGHKpRdI/AAAAAAAAAFQ/c743JTKu3To/s1600-h/Cache.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 134px;" src="http://2.bp.blogspot.com/_oKO4lXYJzFQ/SnKHGHKpRdI/AAAAAAAAAFQ/c743JTKu3To/s320/Cache.jpg" alt="" id="BLOGGER_PHOTO_ID_5364498645224342994" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The image above - which I stole from the official docs, and modified - shows the structure of the tree; 4 is a value that the official example stored in all nodes, but any value in any node can be anything.&lt;br /&gt;&lt;br /&gt;It can be seen that this "array" implementation actually does not need the &lt;span style="font-style: italic;"&gt;d1 x d2 * d3 * ... dn&lt;/span&gt; storage for a n-dimension array.&lt;br /&gt;&lt;br /&gt;This lack of structure allows for small size but it also can create problems at run time, especially if the consumer of the array and the producer are different; the consumer might not be aware of all the indexes/dimensions of the array. A function exists, &lt;span style="font-family:courier new;"&gt;traverse()&lt;/span&gt;, which can be called recursively to yield all existing subscripts.&lt;br /&gt;&lt;br /&gt;If called with the same number of arguments, &lt;span style="font-family:courier new;"&gt;traverse()&lt;/span&gt; does a sibling search. An increase of the number in arguments will make it go down one level; an empty argument will yield the first index of the child (quite naturally, since you don't know what that might be at runtime). However I am still not sure how you can fully discover an array with a potentially unlimited number of dimensions, so the application must enforce at least some structure to the arrays/tables.&lt;br /&gt;&lt;br /&gt;Now that the actual storage is better understood, it is interesting to see how these features show up in the table/class structure. What is the mechanism that allows for arbitrary indices to pop up at runtime?&lt;br /&gt;&lt;br /&gt;A ^global variable is a persistent object of a class and a row in a SQL table; the latter are OO/relational "views" of the B-Tree/array. To answer a question from above, instantiating a new object creates it in memory; opening it (via its ID property) loads it in memory from disk. It is important to understand that an &lt;span style="font-style: italic;"&gt;object is a row&lt;/span&gt; in a table. This is a sub-structure of the tree/array, e.g. &lt;span style="font-family:courier new;"&gt;^SALARY("Julian", 36, 8) = 125000.75&lt;/span&gt;: &lt;span style="font-family:courier new;"&gt;^SALARY&lt;/span&gt; is the entire structure, and &lt;span style="font-family:courier new;"&gt;^SALARY("Scott")&lt;/span&gt; represents a different person's salary, and a different row in the table.&lt;br /&gt;&lt;br /&gt;Does the tree's dynamic indexing means that classes are effectively dynamic as well and can be changed at runtime? Not really. Neither does the SQL table structure change to reflect changes in the underlying array.&lt;br /&gt;&lt;br /&gt;As it can be seen, the value of the global (^USER) is a pointer to the index of the first element, which also is the $ID column of that row.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_oKO4lXYJzFQ/SnKay3EmKGI/AAAAAAAAAFY/fxQgWmNgH9o/s1600-h/Cache2.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 256px;" src="http://2.bp.blogspot.com/_oKO4lXYJzFQ/SnKay3EmKGI/AAAAAAAAAFY/fxQgWmNgH9o/s320/Cache2.jpg" alt="" id="BLOGGER_PHOTO_ID_5364520304719046754" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Interestingly, adding a &lt;span style="font-family:courier new;"&gt;^USERD(2, "Dummy")&lt;/span&gt; creates an empty record in the table, and adding a &lt;span style="font-family:courier new;"&gt;^USERD(2)&lt;/span&gt; actually populates the record. So the second level in the &lt;span style="font-family:courier new;"&gt;^USERD(2)&lt;/span&gt; does not actually show in the table at all. Is this child the next table in the hierarchy?&lt;br /&gt;&lt;br /&gt;Mapping the other concepts, the class' package does become the database schema. Creating a table or a class does not instantiate the ^global (array), that only happens when data populates the array. The array's name becomes &lt;span style="font-family:courier new;"&gt;package.className&lt;span style="font-weight: bold; font-style: italic;"&gt;D&lt;/span&gt;&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;&lt;hr /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;ObjectScript&lt;/span&gt; is another language supported by Caché. It is available from the Terminal (one of the ways of interacting with Caché, besides the Studio and the System Management Portal), where you can directly issue ObjectScript commands - you use ObjectScript to launch Basic routines stored in the system. Commands can be abbreviated, which unfortunately makes for unreadable code, as the MUMPS example at Wikipedia shows (it compiled fine in Studio!).&lt;br /&gt;&lt;br /&gt;ObjectScript is also an untyped language, allowing for interesting effects such as this:&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;&gt; set x = 2        --&gt; 2&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;&gt; set x = 2 + "1a" --&gt; 3, since "1a" is interpreted as 1&lt;/span&gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;System routine names are preceded by %, and routine names are always preceded by ^ as they are globals. Routines can be called from specific (tagged) entry points by executing &lt;span style="font-family:courier new;"&gt;DO tag^routine&lt;/span&gt;.  The language is case- AND space-sensitive.&lt;br /&gt;&lt;br /&gt;Creating a class also creates ObjectScript routines, which, as far as I can tell, deal with the database persisting operations of the class. &lt;span style="font-family:courier new;"&gt;for&lt;/span&gt; allows for argument list iteration, (similar to Ruby?). It supports regular expressions (through the ? pattern), a fairly robust support for lists, and an interesting type named bit-string (similar to BCD?).&lt;br /&gt;&lt;br /&gt;Routines are saved with the .mac extension.&lt;br /&gt;&lt;br /&gt;Creating a ^global variable in ObjectScript in Terminal makes it visible in the System Management Portal under "Globals". However, this does not create a table available in SQL.&lt;br /&gt;&lt;br /&gt;"Writing" a global only renders that particular node, e.g. ^z is not the same as ^z(1) (the &lt;span style="font-family: courier new;"&gt;zwrite&lt;/span&gt; command does that). However, &lt;span style="font-family: courier new;"&gt;kill&lt;/span&gt;ing ^z removes the whole tree.&lt;br /&gt;&lt;br /&gt;It can be seen that, not unlike with XML (node values vs. attributes), data can be stored in nodes (&lt;span style="font-family: courier new;"&gt;^global(subscript) = value&lt;/span&gt;), or in the subscripts themselves.&lt;br /&gt;&lt;br /&gt;There are a couple of handy packages that let you run Oracle/SQLServer DDL to create Caché tables.&lt;br /&gt;&lt;br /&gt;There is a lot more about the OO/Relational features of Caché that I have not covered; e.g., it is possible to create objects with hierarchies in ObjectScript, or have array properties of classes, that become flattened tables or related tables in SQL. More details &lt;a href="http://docs.intersystems.com/cache20091/csp/docbook/DocBook.UI.Page.cls?KEY=GOBJ_objectsql"&gt;here&lt;/a&gt;, with the caveat that Reference properties appear a referential integrity mechanism of sorts which could perhaps have been implemented more "relationally" through foreign keys (supported by Caché, but Caché SQL also supports a pointer dereferencing type of notation, e.g. &lt;span style="font-family: courier new;"&gt;SELECT User-&gt;Name&lt;/span&gt;; I am not sure how useful that is since most SQL is actually generated by reporting tools - and I don't think Crystal Reports can generate this Caché-specific SQL; I might be wrong, perhaps this is dealt with in the ODBC/ADO.NET layer).&lt;br /&gt;&lt;br /&gt;More on MUMPS' hierarchical legacy &lt;a href="http://www.cs.uni.edu/%7Eokane/mumps.html"&gt;here&lt;/a&gt;. On OO, XML, hierarchical (and even relational!) databases, &lt;a href="http://www.ibm.com/developerworks/xml/library/x-matters8/"&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;This is just a brief overview of several aspects of the Caché platform. Next I will go over the rest of Intersystems' offerings.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30166624-8136919066762959056?l=connectedsystems.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://connectedsystems.blogspot.com/feeds/8136919066762959056/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30166624&amp;postID=8136919066762959056' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30166624/posts/default/8136919066762959056'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30166624/posts/default/8136919066762959056'/><link rel='alternate' type='text/html' href='http://connectedsystems.blogspot.com/2009/07/middleware.html' title='Middleware (Intersystems Cache)'/><author><name>Razvan</name><uri>http://www.blogger.com/profile/01478237694157411648</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp1.blogger.com/_oKO4lXYJzFQ/SD-O3vBCSZI/AAAAAAAAACw/rLUH4XNTr8A/S220/rjp.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_oKO4lXYJzFQ/SnKHGHKpRdI/AAAAAAAAAFQ/c743JTKu3To/s72-c/Cache.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30166624.post-5203451004647818944</id><published>2009-07-23T09:53:00.000-07:00</published><updated>2009-07-23T10:01:32.372-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Programmable web'/><category scheme='http://www.blogger.com/atom/ns#' term='API'/><category scheme='http://www.blogger.com/atom/ns#' term='Hosting'/><category scheme='http://www.blogger.com/atom/ns#' term='Windows'/><title type='text'>Open Source, Cloud-based Approach to Describing Solution Architectures</title><content type='html'>Mike Walker &lt;a href="http://msdn.microsoft.com/en-us/architecture/aa699450%28printer%29.aspx"&gt;discusses&lt;/a&gt; in a recent issue of the &lt;a href="http://www.architecturejournal.com/default.aspx"&gt;Microsoft Architecture Journal&lt;/a&gt; a set of tools that can be used to document solution architectures - based, not surprisingly, on Microsoft tools. Together, these make up the Enterprise Architecture Toolkit.&lt;br /&gt;&lt;br /&gt;Since I don't have a Windows Server to run Sharepoint (I could, presumably, use &lt;a href="http://www.microsoft.com/azure/default.mspx"&gt;Azure&lt;/a&gt;), I came up with a similar application setup using open source or cloud-based tools:&lt;br /&gt;&lt;br /&gt;&lt;script src="http://www.gliffy.com/diagramEmbed.js" type="text/javascript"&gt; &lt;/script&gt;&lt;br /&gt;&lt;script type="text/javascript"&gt; gliffy_did = "1771789"; embedGliffy(); &lt;/script&gt;&lt;br /&gt;&lt;br /&gt;The only thing that needs to be built is the manager ("gateway", in the chart above) which can be a RIA application whose role is to tie everything together. Sounds simple enough?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30166624-5203451004647818944?l=connectedsystems.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://connectedsystems.blogspot.com/feeds/5203451004647818944/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30166624&amp;postID=5203451004647818944' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30166624/posts/default/5203451004647818944'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30166624/posts/default/5203451004647818944'/><link rel='alternate' type='text/html' href='http://connectedsystems.blogspot.com/2009/07/open-source-cloud-based-approach-to.html' title='Open Source, Cloud-based Approach to Describing Solution Architectures'/><author><name>Razvan</name><uri>http://www.blogger.com/profile/01478237694157411648</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp1.blogger.com/_oKO4lXYJzFQ/SD-O3vBCSZI/AAAAAAAAACw/rLUH4XNTr8A/S220/rjp.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30166624.post-50636113777518285</id><published>2009-07-19T23:44:00.001-07:00</published><updated>2009-07-19T23:50:54.649-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='HealthVault'/><title type='text'>Mobile EHR</title><content type='html'>It makes sense for mobile carriers to &lt;a href="http://home.singtel.com/attachment_hub/4A15D2F5-43E5-4B8C-9AD5-D0D889A708ED/Cover%20Story.pdf"&gt;get involved&lt;/a&gt; in the EHR arena. However, the way I see this done is via cloud-stored EHR info that is accessible through a handset; how else would you carry the record should you decide to move to another carrier?&lt;br /&gt;&lt;br /&gt;I still think it is far fetched for a mobile carrier to roll out an entire HIS application though. There are so many verticals (all, practically) that make use of mobile communications one way or another, should mobile communications providers create solutions for everything?&lt;br /&gt;&lt;br /&gt;And a 'global' mEHR, while a nice idea indeed, I think will be always hindered by competing standards and lack of acceptance - after all, even the mobile infrastructure worldwide is fragmented, CDMA, GPS, etc. Why would the application layer be any different?&lt;br /&gt;&lt;br /&gt;Worth keeping an eye on though.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30166624-50636113777518285?l=connectedsystems.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://connectedsystems.blogspot.com/feeds/50636113777518285/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30166624&amp;postID=50636113777518285' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30166624/posts/default/50636113777518285'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30166624/posts/default/50636113777518285'/><link rel='alternate' type='text/html' href='http://connectedsystems.blogspot.com/2009/07/mobile-ehr.html' title='Mobile EHR'/><author><name>Razvan</name><uri>http://www.blogger.com/profile/01478237694157411648</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp1.blogger.com/_oKO4lXYJzFQ/SD-O3vBCSZI/AAAAAAAAACw/rLUH4XNTr8A/S220/rjp.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30166624.post-1665662452571298354</id><published>2009-07-15T23:53:00.000-07:00</published><updated>2009-07-16T00:00:51.215-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Programmable web'/><title type='text'>Google Maps knows where you are</title><content type='html'>&lt;a href="http://blog.programmableweb.com/2009/07/13/google-maps-knows-where-you-are/"&gt;This&lt;/a&gt; is way cool: if you connect to the Internet using WiFi, Google Maps 'knows' where you are and shows your location by default.&lt;br /&gt;&lt;br /&gt;Slowly it is all coming together - the 'cloud' means that you can keep your data (and processes!) in one place, and you can access it (via WiFi) from anywhere, even using a lightweight client. Also both the client and the cloud backend 'know' where you are so functionality can be tailored to the time/location.&lt;br /&gt;&lt;br /&gt;I'm not sure how much computing power is needed on the (portable) client - probably, only enough for rich media rendering. Other than specialized applications, most that an average user really needs should be easily done using a client that combines media/communication/lightweight computing services. I don't think iPhone is there yet (as the all-purpose 'client'), but perhaps a combination of iPhone and Kindle, three versions from now, might become just that.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30166624-1665662452571298354?l=connectedsystems.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://connectedsystems.blogspot.com/feeds/1665662452571298354/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30166624&amp;postID=1665662452571298354' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30166624/posts/default/1665662452571298354'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30166624/posts/default/1665662452571298354'/><link rel='alternate' type='text/html' href='http://connectedsystems.blogspot.com/2009/07/google-maps-knows-where-you-are.html' title='Google Maps knows where you are'/><author><name>Razvan</name><uri>http://www.blogger.com/profile/01478237694157411648</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp1.blogger.com/_oKO4lXYJzFQ/SD-O3vBCSZI/AAAAAAAAACw/rLUH4XNTr8A/S220/rjp.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30166624.post-2446539516862727844</id><published>2009-07-14T03:29:00.000-07:00</published><updated>2009-07-14T04:22:19.205-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='HealthVault'/><category scheme='http://www.blogger.com/atom/ns#' term='API'/><title type='text'>XDb</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_oKO4lXYJzFQ/SlxjPxjI4hI/AAAAAAAAAE0/x5HiLXP8hvU/s1600-h/XDB.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 192px;" src="http://2.bp.blogspot.com/_oKO4lXYJzFQ/SlxjPxjI4hI/AAAAAAAAAE0/x5HiLXP8hvU/s320/XDB.jpg" alt="" id="BLOGGER_PHOTO_ID_5358266779313955346" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Documentum/EMC offers a XML database named XDb. XProc is in fact designed to work with XDb.&lt;br /&gt;&lt;br /&gt;Perhaps XML &lt;span style="font-style: italic;"&gt;database&lt;/span&gt; is a misnomer. It really is a way of storing XML documents, without (apparently) enforcing any relational integrity constraints other than those defined by the DTD (and perhaps XLink, athough so far I don't know if XLink is declarative only). Therefore XDb and XProc work hand in hand, one allowing for the storage of XML documents, the other allowing for manipulation of those documents (and perhaps, in-place updates).&lt;br /&gt;&lt;br /&gt;The logical design is therefore done at a superior level. The 'database' concept appears to function when various stored documents are manipulated as sets - XDb supports XQuery (preferred), also XPath and XPointer.&lt;br /&gt;&lt;br /&gt;Each XML document is stored as a &lt;span style="font-family:courier new;"&gt;DOM.Document&lt;/span&gt; and can be manipulated using the standard methods (&lt;span style="font-family:courier new;"&gt;createAttribute&lt;/span&gt;, &lt;span style="font-family:courier new;"&gt;createTextNode&lt;/span&gt;, etc).&lt;br /&gt;&lt;br /&gt;I can see a possible usage in, for example, GoogleHealth - where XDb would store well-formatted templates for charts, diagnoses, allergies, vaccines, etc, which would be populated for each patient encounter and loaded into GH.&lt;br /&gt;&lt;br /&gt;While in normal usage write contention should not be an issue, I am curious how does XDb deal with document versioning and multiple writes against the same documents - or is the R/W pipe single throttled? (&lt;span style="font-style: italic;"&gt;later - here it is - clicking Refresh in the Db manager while an update process was underway yielded the following error:&lt;/span&gt;)&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_oKO4lXYJzFQ/SlxqLDBrvpI/AAAAAAAAAFE/YiTippc5xl4/s1600-h/NoLock.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 173px;" src="http://2.bp.blogspot.com/_oKO4lXYJzFQ/SlxqLDBrvpI/AAAAAAAAAFE/YiTippc5xl4/s320/NoLock.jpg" alt="" id="BLOGGER_PHOTO_ID_5358274394687520402" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Interesting XML database reference information &lt;a href="http://www.rpbourret.com/xml/XMLAndDatabases.htm"&gt;here&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30166624-2446539516862727844?l=connectedsystems.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://connectedsystems.blogspot.com/feeds/2446539516862727844/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30166624&amp;postID=2446539516862727844' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30166624/posts/default/2446539516862727844'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30166624/posts/default/2446539516862727844'/><link rel='alternate' type='text/html' href='http://connectedsystems.blogspot.com/2009/07/xdb.html' title='XDb'/><author><name>Razvan</name><uri>http://www.blogger.com/profile/01478237694157411648</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp1.blogger.com/_oKO4lXYJzFQ/SD-O3vBCSZI/AAAAAAAAACw/rLUH4XNTr8A/S220/rjp.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_oKO4lXYJzFQ/SlxjPxjI4hI/AAAAAAAAAE0/x5HiLXP8hvU/s72-c/XDB.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30166624.post-7905768041446320003</id><published>2009-07-12T10:30:00.000-07:00</published><updated>2009-07-12T23:45:26.577-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Programmable web'/><category scheme='http://www.blogger.com/atom/ns#' term='information economics'/><title type='text'>XProc</title><content type='html'>Documentum's XProc &lt;a href="http://137.69.120.115:8080/designer-20090703-1510/"&gt;XDesigner&lt;/a&gt; - a first step towards I see as a full online development environment, although this is more similar to &lt;a href="http://pipes.yahoo.com/"&gt;Yahoo Pipes&lt;/a&gt;. The technology is there (web-based GUI + cloud for compilation and even possibly for deployment), I think it's only a matter of finding a way of monetizing it by tool developers. Is Microsoft really making money on Visual Studio though?&lt;br /&gt;&lt;br&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_oKO4lXYJzFQ/SlrX0HPdKxI/AAAAAAAAAEs/ftA2dFlng-I/s1600-h/XProc.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 150px;" src="http://2.bp.blogspot.com/_oKO4lXYJzFQ/SlrX0HPdKxI/AAAAAAAAAEs/ftA2dFlng-I/s320/XProc.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5357831997007670034" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30166624-7905768041446320003?l=connectedsystems.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://connectedsystems.blogspot.com/feeds/7905768041446320003/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30166624&amp;postID=7905768041446320003' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30166624/posts/default/7905768041446320003'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30166624/posts/default/7905768041446320003'/><link rel='alternate' type='text/html' href='http://connectedsystems.blogspot.com/2009/07/xproc.html' title='XProc'/><author><name>Razvan</name><uri>http://www.blogger.com/profile/01478237694157411648</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp1.blogger.com/_oKO4lXYJzFQ/SD-O3vBCSZI/AAAAAAAAACw/rLUH4XNTr8A/S220/rjp.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_oKO4lXYJzFQ/SlrX0HPdKxI/AAAAAAAAAEs/ftA2dFlng-I/s72-c/XProc.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30166624.post-8994386762221607684</id><published>2009-07-08T08:37:00.000-07:00</published><updated>2009-07-08T08:42:27.502-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Hosting'/><title type='text'>Over mashed-up</title><content type='html'>It occurred to me that I started this blog to, well, blog about my thoughts on various aspects of computing. A while ago though, this became my testing ground for various mashups, widgets, embedded code, and so on - mainly because &lt;s&gt;Blogspot&lt;/s&gt; Blogger allows for all kinds of code to be inserted, which Wordpress (free hosted Wordpress, that is) doesn't. Anyway, this doesn't make for a nice reading experience, so perhaps it is time I should refocus on writing and move the coding elsewhere.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30166624-8994386762221607684?l=connectedsystems.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://connectedsystems.blogspot.com/feeds/8994386762221607684/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30166624&amp;postID=8994386762221607684' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30166624/posts/default/8994386762221607684'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30166624/posts/default/8994386762221607684'/><link rel='alternate' type='text/html' href='http://connectedsystems.blogspot.com/2009/07/over-mashed-up.html' title='Over mashed-up'/><author><name>Razvan</name><uri>http://www.blogger.com/profile/01478237694157411648</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp1.blogger.com/_oKO4lXYJzFQ/SD-O3vBCSZI/AAAAAAAAACw/rLUH4XNTr8A/S220/rjp.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30166624.post-6722225463870518469</id><published>2009-07-08T08:35:00.000-07:00</published><updated>2009-07-08T08:36:12.033-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Widgets'/><category scheme='http://www.blogger.com/atom/ns#' term='information economics'/><title type='text'>An interesting experiment</title><content type='html'>And worth reading... if I can find the time.&lt;br /&gt;&lt;br /&gt;&lt;a title="View FREE (full book) by Chris Anderson on Scribd" href="http://www.scribd.com/doc/17135767/FREE-full-book-by-Chris-Anderson" style="margin: 12px auto 6px auto; font-family: Helvetica,Arial,Sans-serif; font-style: normal; font-variant: normal; font-weight: normal; font-size: 14px; line-height: normal; font-size-adjust: none; font-stretch: normal; -x-system-font: none; display: block; text-decoration: underline;"&gt;FREE (full book) by Chris Anderson&lt;/a&gt; &lt;object codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=9,0,0,0" id="doc_684025667480273" name="doc_684025667480273" classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" align="middle" height="500" width="100%" rel="media:document" resource="http://d.scribd.com/ScribdViewer.swf?document_id=17135767&amp;access_key=key-1htgstmrudqatvm1xi4t&amp;page=1&amp;version=1&amp;viewMode=" xmlns:media="http://search.yahoo.com/searchmonkey/media/" xmlns:dc="http://purl.org/dc/terms/" &gt;  &lt;param name="movie" value="http://d.scribd.com/ScribdViewer.swf?document_id=17135767&amp;access_key=key-1htgstmrudqatvm1xi4t&amp;page=1&amp;version=1&amp;viewMode="&gt;   &lt;param name="quality" value="high"&gt;   &lt;param name="play" value="true"&gt;  &lt;param name="loop" value="true"&gt;   &lt;param name="scale" value="showall"&gt;  &lt;param name="wmode" value="opaque"&gt;   &lt;param name="devicefont" value="false"&gt;  &lt;param name="bgcolor" value="#ffffff"&gt;   &lt;param name="menu" value="true"&gt;  &lt;param name="allowFullScreen" value="true"&gt;   &lt;param name="allowScriptAccess" value="always"&gt;   &lt;param name="salign" value=""&gt;        &lt;embed src="http://d.scribd.com/ScribdViewer.swf?document_id=17135767&amp;access_key=key-1htgstmrudqatvm1xi4t&amp;page=1&amp;version=1&amp;viewMode=" quality="high" pluginspage="http://www.macromedia.com/go/getflashplayer" play="true" loop="true" scale="showall" wmode="opaque" devicefont="false" bgcolor="#ffffff" name="doc_684025667480273_object" menu="true" allowfullscreen="true" allowscriptaccess="always" salign="" type="application/x-shockwave-flash" align="middle"  height="500" width="100%"&gt;&lt;/embed&gt; &lt;/object&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30166624-6722225463870518469?l=connectedsystems.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://connectedsystems.blogspot.com/feeds/6722225463870518469/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30166624&amp;postID=6722225463870518469' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30166624/posts/default/6722225463870518469'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30166624/posts/default/6722225463870518469'/><link rel='alternate' type='text/html' href='http://connectedsystems.blogspot.com/2009/07/interesting-experiment.html' title='An interesting experiment'/><author><name>Razvan</name><uri>http://www.blogger.com/profile/01478237694157411648</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp1.blogger.com/_oKO4lXYJzFQ/SD-O3vBCSZI/AAAAAAAAACw/rLUH4XNTr8A/S220/rjp.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30166624.post-6496571823446383782</id><published>2009-07-07T07:10:00.001-07:00</published><updated>2009-07-07T07:10:46.960-07:00</updated><title type='text'>Platform Convertor Strategy Analysis</title><content type='html'>A work in progress, a consulting project that discusses the positioning of a platform convertor.&lt;div style="width:425px;text-align:left" id="__ss_1691675"&gt;&lt;a style="font:14px Helvetica,Arial,Sans-serif;display:block;margin:12px 0 3px 0;text-decoration:underline;" href="http://www.slideshare.net/rjpetrescu/platform-convertor-strategy-analysis" title="Platform Convertor Strategy Analysis"&gt;Platform Convertor Strategy Analysis&lt;/a&gt;&lt;object style="margin:0px" width="425" height="355"&gt;&lt;param name="movie" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=motherapp-analysis-090707090435-phpapp01&amp;stripped_title=platform-convertor-strategy-analysis" /&gt;&lt;param name="allowFullScreen" value="true"/&gt;&lt;param name="allowScriptAccess" value="always"/&gt;&lt;embed src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=motherapp-analysis-090707090435-phpapp01&amp;stripped_title=platform-convertor-strategy-analysis" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="355"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div style="font-size:11px;font-family:tahoma,arial;height:26px;padding-top:2px;"&gt;View more &lt;a style="text-decoration:underline;" href="http://www.slideshare.net/"&gt;documents&lt;/a&gt; from &lt;a style="text-decoration:underline;" href="http://www.slideshare.net/rjpetrescu"&gt;Razvan julian Petrescu&lt;/a&gt;.&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30166624-6496571823446383782?l=connectedsystems.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://connectedsystems.blogspot.com/feeds/6496571823446383782/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30166624&amp;postID=6496571823446383782' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30166624/posts/default/6496571823446383782'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30166624/posts/default/6496571823446383782'/><link rel='alternate' type='text/html' href='http://connectedsystems.blogspot.com/2009/07/platform-convertor-strategy-analysis.html' title='Platform Convertor Strategy Analysis'/><author><name>Razvan</name><uri>http://www.blogger.com/profile/01478237694157411648</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp1.blogger.com/_oKO4lXYJzFQ/SD-O3vBCSZI/AAAAAAAAACw/rLUH4XNTr8A/S220/rjp.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30166624.post-1390144610557820990</id><published>2009-07-05T01:30:00.000-07:00</published><updated>2009-07-05T01:37:17.173-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Processing'/><category scheme='http://www.blogger.com/atom/ns#' term='Visualization'/><title type='text'>Visualization, again</title><content type='html'>Visualization of data seems to be the new new wave of BI. Already mentioned IBM's offering a few months ago, but are quite a few other players in this space, startups with interesting products, such as &lt;a href="http://www.tableausoftware.com"&gt;TableauDesktop&lt;/a&gt;, &lt;a href="http://www.visokio.com/"&gt;Omniscope&lt;/a&gt;, and even SAP has a product (&lt;a href="http://www.zdnetasia.com/techshowcase/sap/%C3%A2%C2%80%C2%8Bxcelsius"&gt;Xcelsius&lt;/a&gt;), or research institutions (such as Stanford with &lt;a href="http://vis.stanford.edu/protovis"&gt;Protovis&lt;/a&gt;).&lt;br /&gt;&lt;br /&gt;What can I say: Tufte meets SQL. And perhaps Processing should get in the game - surprised I haven't seen any rich visualization libraries for it - yet.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30166624-1390144610557820990?l=connectedsystems.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://connectedsystems.blogspot.com/feeds/1390144610557820990/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30166624&amp;postID=1390144610557820990' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30166624/posts/default/1390144610557820990'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30166624/posts/default/1390144610557820990'/><link rel='alternate' type='text/html' href='http://connectedsystems.blogspot.com/2009/07/visualization-again.html' title='Visualization, again'/><author><name>Razvan</name><uri>http://www.blogger.com/profile/01478237694157411648</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp1.blogger.com/_oKO4lXYJzFQ/SD-O3vBCSZI/AAAAAAAAACw/rLUH4XNTr8A/S220/rjp.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30166624.post-3722363306788800087</id><published>2009-06-18T11:18:00.000-07:00</published><updated>2009-06-18T11:21:42.712-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='information economics'/><title type='text'>Modeling</title><content type='html'>The RUP (rational unified process) is very nice, and so is UML. For smaller projects though, the following will do:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_oKO4lXYJzFQ/SjqFS4-LwmI/AAAAAAAAAEk/H44mIZQ2m8A/s1600-h/FrequentFlierWeb.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 249px;" src="http://3.bp.blogspot.com/_oKO4lXYJzFQ/SjqFS4-LwmI/AAAAAAAAAEk/H44mIZQ2m8A/s320/FrequentFlierWeb.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5348734067033227874" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I would really like to know how much code is written according to diagrams. The mental image that programmers have of a problem's universe is a fascinating topic indeed - and far reaching, since how a software system works determines, ultimately, how a user &lt;span style="font-style:italic;"&gt;has&lt;/span&gt; to work to accommodate the system.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30166624-3722363306788800087?l=connectedsystems.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://connectedsystems.blogspot.com/feeds/3722363306788800087/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30166624&amp;postID=3722363306788800087' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30166624/posts/default/3722363306788800087'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30166624/posts/default/3722363306788800087'/><link rel='alternate' type='text/html' href='http://connectedsystems.blogspot.com/2009/06/modeling.html' title='Modeling'/><author><name>Razvan</name><uri>http://www.blogger.com/profile/01478237694157411648</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp1.blogger.com/_oKO4lXYJzFQ/SD-O3vBCSZI/AAAAAAAAACw/rLUH4XNTr8A/S220/rjp.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_oKO4lXYJzFQ/SjqFS4-LwmI/AAAAAAAAAEk/H44mIZQ2m8A/s72-c/FrequentFlierWeb.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30166624.post-7573424111667058879</id><published>2009-06-17T01:29:00.001-07:00</published><updated>2009-06-17T10:01:29.186-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='HealthVault'/><category scheme='http://www.blogger.com/atom/ns#' term='Programmable web'/><category scheme='http://www.blogger.com/atom/ns#' term='API'/><title type='text'>HealthVault</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_oKO4lXYJzFQ/SjkhOenHXUI/AAAAAAAAAEU/P_UzBiY4ApY/s1600-h/HealthVault.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 200px;" src="http://4.bp.blogspot.com/_oKO4lXYJzFQ/SjkhOenHXUI/AAAAAAAAAEU/P_UzBiY4ApY/s320/HealthVault.jpg" alt="" id="BLOGGER_PHOTO_ID_5348342565098184002" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Yes it does have an API, and some sample apps. The .NET samples include a web application to talk to the service - however, I give up on it for the time being as the utility to make certificates seems to crash all the time (nice unhandled error, by the way; the crash seems related to the fact that the app is installed in Program Files as opposed to Documents, and Visual Studio doesn't have full rights to PF). Will come back to it later, but so far it is remarkably similar to Google Health.&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;One additional thing, the SDK features some device drivers to enable medical devices to talk directly to HV. Nice - as long as they don't cause any crashes...&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30166624-7573424111667058879?l=connectedsystems.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://connectedsystems.blogspot.com/feeds/7573424111667058879/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30166624&amp;postID=7573424111667058879' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30166624/posts/default/7573424111667058879'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30166624/posts/default/7573424111667058879'/><link rel='alternate' type='text/html' href='http://connectedsystems.blogspot.com/2009/06/healthvault.html' title='HealthVault'/><author><name>Razvan</name><uri>http://www.blogger.com/profile/01478237694157411648</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp1.blogger.com/_oKO4lXYJzFQ/SD-O3vBCSZI/AAAAAAAAACw/rLUH4XNTr8A/S220/rjp.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_oKO4lXYJzFQ/SjkhOenHXUI/AAAAAAAAAEU/P_UzBiY4ApY/s72-c/HealthVault.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30166624.post-2568632528249353197</id><published>2009-06-16T11:15:00.001-07:00</published><updated>2009-06-17T10:05:55.626-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='AIR'/><category scheme='http://www.blogger.com/atom/ns#' term='Javascript'/><category scheme='http://www.blogger.com/atom/ns#' term='Programmable web'/><category scheme='http://www.blogger.com/atom/ns#' term='Widgets'/><title type='text'>AIR and Google Health</title><content type='html'>Recently I've been tinkering with AIR and Google Health (GH). It's been surprisingly easy, if one can overlook the endless stream of XML returned by GH - but there is no other way, HL7 would be just as nasty looking. I don't know yet how it returns the file/image data that can be attached to the GH account.&lt;br /&gt;&lt;br /&gt;AIR seems an ideal environment to build a desktop client to front a GH cloud-based application: it's lightweight, Javascript-compatible, and portable across platforms.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_oKO4lXYJzFQ/SjkiXlCuiCI/AAAAAAAAAEc/TuUXdGpcvXk/s1600-h/GoogleHealth.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 200px;" src="http://4.bp.blogspot.com/_oKO4lXYJzFQ/SjkiXlCuiCI/AAAAAAAAAEc/TuUXdGpcvXk/s320/GoogleHealth.jpg" alt="" id="BLOGGER_PHOTO_ID_5348343820955060258" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Speaking of, it seems that AIR &lt;a href="http://www.republicofcode.com/2008/11/15/adobe-air-mobil/"&gt;will be ported&lt;/a&gt; to mobiles as well. I would argue that the paragraph above (and not just the stronger OO features found in Flash and available to AIR) is a strong reason to do this port, although I am not sure how easy is to develop and maintain AIR applications, and also I am not sure how well do these applications perform given the several layers of virtual environments they have to execute in.&lt;br /&gt;&lt;br /&gt;Will write more thoughts as soon as I finish the small scale project I am working on right now, 4-5 forms of reduced complexity (but with a significant amount of functionality built in; the underpinnings of this relatively simple project are amazingly complex and would have been hard to imagine only a few years ago).&lt;br /&gt;&lt;br /&gt;I haven't looked at Google Tables yet, but read some things about YQL and can see a scenario where medical (and other) personal information (e.g. reverse phone lookups, credit history, white and yellow pages) is queriable over the web via a SQL-type of language &lt;b&gt;with the right security&lt;/b&gt; in place. In fact, the infrastructure already exists! So it would be just a mater of connecting the pipes.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;And, I haven't even started to look at HealthVault's API (if it has one).&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30166624-2568632528249353197?l=connectedsystems.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://connectedsystems.blogspot.com/feeds/2568632528249353197/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30166624&amp;postID=2568632528249353197' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30166624/posts/default/2568632528249353197'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30166624/posts/default/2568632528249353197'/><link rel='alternate' type='text/html' href='http://connectedsystems.blogspot.com/2009/06/air-and-google-health.html' title='AIR and Google Health'/><author><name>Razvan</name><uri>http://www.blogger.com/profile/01478237694157411648</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp1.blogger.com/_oKO4lXYJzFQ/SD-O3vBCSZI/AAAAAAAAACw/rLUH4XNTr8A/S220/rjp.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_oKO4lXYJzFQ/SjkiXlCuiCI/AAAAAAAAAEc/TuUXdGpcvXk/s72-c/GoogleHealth.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30166624.post-2470925202863561896</id><published>2009-06-10T05:55:00.001-07:00</published><updated>2009-06-10T05:55:42.175-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Widgets'/><title type='text'>A map of where I've been</title><content type='html'>&lt;iframe height="325" frameborder="0" width="400" scrolling="auto" src="http://www.whereivebeen.com/map.php?uID=7773206&amp;iID=4jmeeddnx4htpaj0bk7hmn93togyxi7q"&gt;&lt;/iframe&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30166624-2470925202863561896?l=connectedsystems.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://connectedsystems.blogspot.com/feeds/2470925202863561896/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30166624&amp;postID=2470925202863561896' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30166624/posts/default/2470925202863561896'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30166624/posts/default/2470925202863561896'/><link rel='alternate' type='text/html' href='http://connectedsystems.blogspot.com/2009/06/map-of-where-ive-been.html' title='A map of where I&apos;ve been'/><author><name>Razvan</name><uri>http://www.blogger.com/profile/01478237694157411648</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp1.blogger.com/_oKO4lXYJzFQ/SD-O3vBCSZI/AAAAAAAAACw/rLUH4XNTr8A/S220/rjp.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30166624.post-3243635394645131151</id><published>2009-06-01T23:53:00.000-07:00</published><updated>2009-06-01T23:54:14.481-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Widgets'/><title type='text'>LinkedIn widget</title><content type='html'>&lt;script type="text/javascript" src="http://www.linkedin.com/js/public-profile/widget-os.js"&gt;&lt;/script&gt;&lt;br /&gt;    &lt;a class="linkedin-profileinsider-popup" href="http://www.linkedin.com/in/razvanpetrescu"&gt;My LinkedIn Profile&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30166624-3243635394645131151?l=connectedsystems.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://connectedsystems.blogspot.com/feeds/3243635394645131151/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30166624&amp;postID=3243635394645131151' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30166624/posts/default/3243635394645131151'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30166624/posts/default/3243635394645131151'/><link rel='alternate' type='text/html' href='http://connectedsystems.blogspot.com/2009/06/linkedin-widget.html' title='LinkedIn widget'/><author><name>Razvan</name><uri>http://www.blogger.com/profile/01478237694157411648</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp1.blogger.com/_oKO4lXYJzFQ/SD-O3vBCSZI/AAAAAAAAACw/rLUH4XNTr8A/S220/rjp.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30166624.post-5483266619057378713</id><published>2009-06-01T23:14:00.001-07:00</published><updated>2009-07-14T04:36:38.027-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Widgets'/><title type='text'>Donkey Kong</title><content type='html'>I never really played this game in the 80's - it seemed to be available only on computers I did not own, such as the C64. I can, finally - will someone make a Sentinel widgety game available please?&lt;br /&gt;&lt;br /&gt;&lt;script type="text/javascript" src="http://cdn.widgetserver.com/syndication/subscriber/InsertWidget.js"&gt;&lt;/script&gt;&lt;script&gt;if (WIDGETBOX) WIDGETBOX.renderWidget('e80d98df-824d-471f-82cc-23c446a82742');&lt;/script&gt;&lt;noscript&gt;Get the &lt;a href="http://www.widgetbox.com/widget/donkey-kong"&gt;Donkey Kong&lt;/a&gt; widget and many other &lt;a href="http://www.widgetbox.com/"&gt;great free widgets&lt;/a&gt; at &lt;a href="http://www.widgetbox.com"&gt;Widgetbox&lt;/a&gt;!&lt;/noscript&gt;&lt;br /&gt;&lt;br /&gt;Whatever one thinks of video games, I find it amazing that today you can run what was once a significant programming effort in a 'virtual' OS through several layers of interpreted code (widget &gt; flash &gt; browser &gt; OS process &gt; ...). I wonder how similar is the machine code ultimately generated on the OS to the machine code of the original program :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30166624-5483266619057378713?l=connectedsystems.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://connectedsystems.blogspot.com/feeds/5483266619057378713/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30166624&amp;postID=5483266619057378713' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30166624/posts/default/5483266619057378713'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30166624/posts/default/5483266619057378713'/><link rel='alternate' type='text/html' href='http://connectedsystems.blogspot.com/2009/06/donkey-kong.html' title='Donkey Kong'/><author><name>Razvan</name><uri>http://www.blogger.com/profile/01478237694157411648</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp1.blogger.com/_oKO4lXYJzFQ/SD-O3vBCSZI/AAAAAAAAACw/rLUH4XNTr8A/S220/rjp.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30166624.post-6957474218239229441</id><published>2009-04-14T22:03:00.000-07:00</published><updated>2009-04-14T22:04:56.623-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Programmable web'/><category scheme='http://www.blogger.com/atom/ns#' term='API'/><title type='text'>Slideshare</title><content type='html'>Some of the academic presentations I have worked on can be found here.&lt;br /&gt;&lt;a title="View my presentations on SlideShare" href="http://www.slideshare.net/rjpetrescu" &gt; &lt;img src="http://public.slidesharecdn.com/images/badge85_62.gif" width="85" height="62" border="0" alt="View my profile on slideshare"&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30166624-6957474218239229441?l=connectedsystems.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://connectedsystems.blogspot.com/feeds/6957474218239229441/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30166624&amp;postID=6957474218239229441' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30166624/posts/default/6957474218239229441'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30166624/posts/default/6957474218239229441'/><link rel='alternate' type='text/html' href='http://connectedsystems.blogspot.com/2009/04/slideshare.html' title='Slideshare'/><author><name>Razvan</name><uri>http://www.blogger.com/profile/01478237694157411648</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp1.blogger.com/_oKO4lXYJzFQ/SD-O3vBCSZI/AAAAAAAAACw/rLUH4XNTr8A/S220/rjp.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30166624.post-8551557898652343194</id><published>2009-04-14T18:25:00.000-07:00</published><updated>2009-04-14T18:27:30.500-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='API'/><title type='text'>LiveEarth</title><content type='html'>&lt;iframe src ="http://maps.live.com/default.aspx?v=2&amp;FORM=LMLTCC&amp;cp=1.348791~103.848267&amp;style=r&amp;lvl=12&amp;tilt=-90&amp;dir=0&amp;alt=-1000&amp;phx=0&amp;phy=0&amp;phscl=1&amp;encType=1" width="100%" height="100%"&gt;&lt;br /&gt;  &lt;p&gt;&lt;a href="http://maps.live.com/default.aspx?v=2&amp;FORM=LMLTCC&amp;cp=1.348791~103.848267&amp;style=r&amp;lvl=12&amp;tilt=-90&amp;dir=0&amp;alt=-1000&amp;phx=0&amp;phy=0&amp;phscl=1&amp;encType=1"&gt;Where&lt;/a&gt; I live.&lt;/p&gt;&lt;br /&gt;&lt;/iframe&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30166624-8551557898652343194?l=connectedsystems.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://connectedsystems.blogspot.com/feeds/8551557898652343194/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30166624&amp;postID=8551557898652343194' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30166624/posts/default/8551557898652343194'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30166624/posts/default/8551557898652343194'/><link rel='alternate' type='text/html' href='http://connectedsystems.blogspot.com/2009/04/liveearth.html' title='LiveEarth'/><author><name>Razvan</name><uri>http://www.blogger.com/profile/01478237694157411648</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp1.blogger.com/_oKO4lXYJzFQ/SD-O3vBCSZI/AAAAAAAAACw/rLUH4XNTr8A/S220/rjp.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30166624.post-8800318122457438461</id><published>2009-04-05T04:49:00.001-07:00</published><updated>2009-04-05T04:52:23.066-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Twitter'/><title type='text'>More tweets visualizations</title><content type='html'>For quite some time now I have been finding &lt;em&gt;visualizations&lt;/em&gt; cool. There is a whole list of blogs and web sites dedicated to this rather obscure area of - computing? Web 2.0? It's an Edward Tufte-meets-open source type of thing... and even (SF) author Bruce Sterling is in on the game. And now, even IBM: they too are &lt;a href="http://manyeyes.alphaworks.ibm.com/manyeyes/"&gt;visualizing tweets&lt;/a&gt; (real-time Internet seems to be the &lt;em&gt;in&lt;/em&gt; thing now). Still unsure about the usefulness of it all, but it makes for nice mind-map-like charting.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30166624-8800318122457438461?l=connectedsystems.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://connectedsystems.blogspot.com/feeds/8800318122457438461/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30166624&amp;postID=8800318122457438461' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30166624/posts/default/8800318122457438461'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30166624/posts/default/8800318122457438461'/><link rel='alternate' type='text/html' href='http://connectedsystems.blogspot.com/2009/04/more-tweets-visualizations.html' title='More tweets visualizations'/><author><name>Razvan</name><uri>http://www.blogger.com/profile/01478237694157411648</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp1.blogger.com/_oKO4lXYJzFQ/SD-O3vBCSZI/AAAAAAAAACw/rLUH4XNTr8A/S220/rjp.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30166624.post-6735843987684920225</id><published>2009-03-26T03:06:00.000-07:00</published><updated>2009-03-26T03:07:49.532-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Programmable web'/><category scheme='http://www.blogger.com/atom/ns#' term='Twitter'/><title type='text'>Visualizing tweets live</title><content type='html'>I'm not sure how useful it is, but it's certainly cool: &lt;a href="http://twittervision.com/"&gt;Twittervision&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30166624-6735843987684920225?l=connectedsystems.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://connectedsystems.blogspot.com/feeds/6735843987684920225/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30166624&amp;postID=6735843987684920225' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30166624/posts/default/6735843987684920225'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30166624/posts/default/6735843987684920225'/><link rel='alternate' type='text/html' href='http://connectedsystems.blogspot.com/2009/03/visualizing-tweets-live.html' title='Visualizing tweets live'/><author><name>Razvan</name><uri>http://www.blogger.com/profile/01478237694157411648</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp1.blogger.com/_oKO4lXYJzFQ/SD-O3vBCSZI/AAAAAAAAACw/rLUH4XNTr8A/S220/rjp.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30166624.post-5986244709244570986</id><published>2009-03-15T09:29:00.001-07:00</published><updated>2009-03-15T09:29:58.682-07:00</updated><title type='text'>Virtual Worlds in Asia</title><content type='html'>Check out this SlideShare Presentation: &lt;div style="width:425px;text-align:left" id="__ss_1144427"&gt;&lt;a style="font:14px Helvetica,Arial,Sans-serif;display:block;margin:12px 0 3px 0;text-decoration:underline;" href="http://www.slideshare.net/plus8star/virtual-worlds-in-asia-1144427?type=presentation" title="Virtual Worlds in Asia"&gt;Virtual Worlds in Asia&lt;/a&gt;&lt;object style="margin:0px" width="425" height="355"&gt;&lt;param name="movie" value="http://static.slideshare.net/swf/ssplayer2.swf?doc=plus8starvirtualworldsinasia-090313234125-phpapp02&amp;stripped_title=virtual-worlds-in-asia-1144427" /&gt;&lt;param name="allowFullScreen" value="true"/&gt;&lt;param name="allowScriptAccess" value="always"/&gt;&lt;embed src="http://static.slideshare.net/swf/ssplayer2.swf?doc=plus8starvirtualworldsinasia-090313234125-phpapp02&amp;stripped_title=virtual-worlds-in-asia-1144427" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="355"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div style="font-size:11px;font-family:tahoma,arial;height:26px;padding-top:2px;"&gt;View more &lt;a style="text-decoration:underline;" href="http://www.slideshare.net/"&gt;presentations&lt;/a&gt; from &lt;a style="text-decoration:underline;" href="http://www.slideshare.net/plus8star"&gt;Benjamin Joffe&lt;/a&gt;.&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30166624-5986244709244570986?l=connectedsystems.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://connectedsystems.blogspot.com/feeds/5986244709244570986/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30166624&amp;postID=5986244709244570986' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30166624/posts/default/5986244709244570986'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30166624/posts/default/5986244709244570986'/><link rel='alternate' type='text/html' href='http://connectedsystems.blogspot.com/2009/03/virtual-worlds-in-asia.html' title='Virtual Worlds in Asia'/><author><name>Razvan</name><uri>http://www.blogger.com/profile/01478237694157411648</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp1.blogger.com/_oKO4lXYJzFQ/SD-O3vBCSZI/AAAAAAAAACw/rLUH4XNTr8A/S220/rjp.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30166624.post-4216890795405525133</id><published>2009-02-08T02:25:00.000-08:00</published><updated>2009-04-30T07:54:36.035-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Programmable web'/><category scheme='http://www.blogger.com/atom/ns#' term='Widgets'/><title type='text'>About me....</title><content type='html'>Or rather, about embedded Google presentations:&lt;br /&gt;&lt;br /&gt;&lt;iframe src='http://docs.google.com/EmbedSlideshow?docid=dc4hxj2z_51g8459kd7&amp;amp;size=l' frameborder='0' width='700' height='559'&gt;&lt;/iframe&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30166624-4216890795405525133?l=connectedsystems.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://connectedsystems.blogspot.com/feeds/4216890795405525133/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30166624&amp;postID=4216890795405525133' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30166624/posts/default/4216890795405525133'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30166624/posts/default/4216890795405525133'/><link rel='alternate' type='text/html' href='http://connectedsystems.blogspot.com/2009/02/about-me.html' title='About me....'/><author><name>Razvan</name><uri>http://www.blogger.com/profile/01478237694157411648</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp1.blogger.com/_oKO4lXYJzFQ/SD-O3vBCSZI/AAAAAAAAACw/rLUH4XNTr8A/S220/rjp.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30166624.post-9067766226364782605</id><published>2009-02-06T02:40:00.000-08:00</published><updated>2009-02-06T02:44:32.852-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Programmable web'/><category scheme='http://www.blogger.com/atom/ns#' term='Widgets'/><title type='text'>Flight Stats widget</title><content type='html'>&lt;form style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-TOP: 0px" action="http://www.flightstats.com/go/Redirect/websiteRedirect.do" method="post"&gt;&lt;div id="FlightStats" style="BORDER-RIGHT: #000000 1px solid; BORDER-TOP: #000000 1px solid; BORDER-LEFT: #000000 1px solid; WIDTH: 120px; BORDER-BOTTOM: #000000 1px solid; FONT-FAMILY: Hallmarke Condensed Light, Arial, Verdana, sans-serif"&gt;&lt;div style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; FONT-SIZE: 9pt; BACKGROUND: #353f53; MAX-WIDTH: 117px; PADDING-BOTTOM: 3px; BORDER-LEFT: #353f53 3px solid; WIDTH: 120px; COLOR: #ffffff; PADDING-TOP: 3px"&gt;Flight Status&lt;/div&gt;&lt;div style="PADDING-LEFT: 5px;font-size:7pt;" &gt;&lt;span style="font-size:8;"&gt;By Flight or Route&lt;/span&gt;&lt;br /&gt;&lt;input style="FONT-SIZE: 8pt; FONT-FAMILY: Hallmarke Condensed Light, Arial, Verdana, sans-serif" size="5" value="CX 708" name="submission"&gt;&lt;input type="image" src="http://www.flightstats.com/go/images/btn_go_on_white.gif"&gt;&lt;br /&gt;&lt;a href="http://www.flightstats.com/go/Downloads/websiteRedirectExamples.do" target="_blank"&gt;examples:&lt;/a&gt; CX 709 or JFK to LHR&lt;br /&gt;&lt;a href="http://www.flightstats.com/go/Downloads/websiteRedirectPopup.do" target="_blank"&gt;Don't Know the Code?&lt;/a&gt;&lt;/div&gt;&lt;a href="http://www.flightstats.com/" target="_blank"&gt;&lt;img src="http://www.flightstats.com/go/Widgets/images/flightstats_logo_widget.gif" align="center" border="0" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;/form&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30166624-9067766226364782605?l=connectedsystems.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://connectedsystems.blogspot.com/feeds/9067766226364782605/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30166624&amp;postID=9067766226364782605' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30166624/posts/default/9067766226364782605'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30166624/posts/default/9067766226364782605'/><link rel='alternate' type='text/html' href='http://connectedsystems.blogspot.com/2009/02/flight-status-by-flight-or-route.html' title='Flight Stats widget'/><author><name>Razvan</name><uri>http://www.blogger.com/profile/01478237694157411648</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp1.blogger.com/_oKO4lXYJzFQ/SD-O3vBCSZI/AAAAAAAAACw/rLUH4XNTr8A/S220/rjp.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30166624.post-6149592771129810681</id><published>2009-02-03T04:50:00.000-08:00</published><updated>2009-02-03T04:51:12.793-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Widgets'/><title type='text'>BBC World Music Widget</title><content type='html'>Who knew that the BBC was &lt;a href="http://www.radio1musicubes.co.uk/constructor1.shtml"&gt;so cool&lt;/a&gt;?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30166624-6149592771129810681?l=connectedsystems.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://connectedsystems.blogspot.com/feeds/6149592771129810681/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30166624&amp;postID=6149592771129810681' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30166624/posts/default/6149592771129810681'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30166624/posts/default/6149592771129810681'/><link rel='alternate' type='text/html' href='http://connectedsystems.blogspot.com/2009/02/bbc-world-music-widget.html' title='BBC World Music Widget'/><author><name>Razvan</name><uri>http://www.blogger.com/profile/01478237694157411648</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp1.blogger.com/_oKO4lXYJzFQ/SD-O3vBCSZI/AAAAAAAAACw/rLUH4XNTr8A/S220/rjp.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30166624.post-8611296100526541601</id><published>2008-12-05T22:39:00.001-08:00</published><updated>2008-12-05T22:39:47.180-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Processing'/><title type='text'>Processing</title><content type='html'>&lt;object width="400" height="225"&gt;&lt;param name="allowfullscreen" value="true" /&gt;&lt;param name="allowscriptaccess" value="always" /&gt;&lt;param name="movie" value="http://vimeo.com/moogaloop.swf?clip_id=1362832&amp;amp;server=vimeo.com&amp;amp;show_title=1&amp;amp;show_byline=1&amp;amp;show_portrait=0&amp;amp;color=&amp;amp;fullscreen=1" /&gt;&lt;embed src="http://vimeo.com/moogaloop.swf?clip_id=1362832&amp;amp;server=vimeo.com&amp;amp;show_title=1&amp;amp;show_byline=1&amp;amp;show_portrait=0&amp;amp;color=&amp;amp;fullscreen=1" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" width="400" height="225"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;a href="http://vimeo.com/1362832"&gt;Body Navigation by Recoil Performance Group&lt;/a&gt; from &lt;a href="http://vimeo.com/olekristensen"&gt;ole kristensen&lt;/a&gt; on &lt;a href="http://vimeo.com"&gt;Vimeo&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30166624-8611296100526541601?l=connectedsystems.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://connectedsystems.blogspot.com/feeds/8611296100526541601/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30166624&amp;postID=8611296100526541601' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30166624/posts/default/8611296100526541601'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30166624/posts/default/8611296100526541601'/><link rel='alternate' type='text/html' href='http://connectedsystems.blogspot.com/2008/12/processing.html' title='Processing'/><author><name>Razvan</name><uri>http://www.blogger.com/profile/01478237694157411648</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp1.blogger.com/_oKO4lXYJzFQ/SD-O3vBCSZI/AAAAAAAAACw/rLUH4XNTr8A/S220/rjp.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30166624.post-5910131330296372216</id><published>2008-12-02T01:58:00.000-08:00</published><updated>2008-12-02T02:01:14.642-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='information economics'/><title type='text'>Semantic space</title><content type='html'>A semantic space &lt;a href="http://go.sioc.me/"&gt;explorer&lt;/a&gt;. Unfinished, but a great metaphor for exploring all kinds of databanks and databases.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30166624-5910131330296372216?l=connectedsystems.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://connectedsystems.blogspot.com/feeds/5910131330296372216/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30166624&amp;postID=5910131330296372216' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30166624/posts/default/5910131330296372216'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30166624/posts/default/5910131330296372216'/><link rel='alternate' type='text/html' href='http://connectedsystems.blogspot.com/2008/12/semantic-space.html' title='Semantic space'/><author><name>Razvan</name><uri>http://www.blogger.com/profile/01478237694157411648</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp1.blogger.com/_oKO4lXYJzFQ/SD-O3vBCSZI/AAAAAAAAACw/rLUH4XNTr8A/S220/rjp.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30166624.post-6108910696927751070</id><published>2008-11-03T08:18:00.000-08:00</published><updated>2008-11-03T08:28:36.696-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='information economics'/><title type='text'>Pricing of information</title><content type='html'>An interesting &lt;a href="http://cat.inist.fr/?aModele=afficheN&amp;amp;cpsidt=18507233"&gt;piece of research&lt;/a&gt; from one of my professors from INSEAD, Markus Christen: it seems that it is more profitable for information providers to offer lower quality information to their clients. This will force their clients to use multiple providers to arrive at a 'truth', and will also allow them to raise the prices of the (unreliable) information they offer. This works if there is a low correlation between the information offered by the providers, and if there is a relatively low number of providers.&lt;br /&gt;Reminds me of IDG, Gartner, &lt;em&gt;et al&lt;/em&gt;. Which incidentally are among the examples mentioned in the paper.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30166624-6108910696927751070?l=connectedsystems.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://connectedsystems.blogspot.com/feeds/6108910696927751070/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30166624&amp;postID=6108910696927751070' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30166624/posts/default/6108910696927751070'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30166624/posts/default/6108910696927751070'/><link rel='alternate' type='text/html' href='http://connectedsystems.blogspot.com/2008/11/pricing-of-information.html' title='Pricing of information'/><author><name>Razvan</name><uri>http://www.blogger.com/profile/01478237694157411648</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp1.blogger.com/_oKO4lXYJzFQ/SD-O3vBCSZI/AAAAAAAAACw/rLUH4XNTr8A/S220/rjp.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30166624.post-7792818967418864850</id><published>2008-09-26T07:58:00.001-07:00</published><updated>2008-09-26T08:01:42.240-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Programmable web'/><title type='text'>Reality?</title><content type='html'>&lt;a href="http://1.bp.blogspot.com/_oKO4lXYJzFQ/SNz5HgwI4GI/AAAAAAAAAD8/bIyUH04taWs/s1600-h/ExitReality.jpg"&gt;&lt;img id="BLOGGER_PHOTO_ID_5250345173053399138" style="DISPLAY: block; MARGIN: 0px auto 10px; CURSOR: hand; TEXT-ALIGN: center" alt="" src="http://1.bp.blogspot.com/_oKO4lXYJzFQ/SNz5HgwI4GI/AAAAAAAAAD8/bIyUH04taWs/s320/ExitReality.jpg" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div&gt;Not sure what to think about this, other than having my vanity reach new levels as I look at my face in a Blade Runner-esque virtual environment... thanks to &lt;a href="http://www.exitreality.com/"&gt;ExitReality&lt;/a&gt;. The navigation metaphor is ok-ish, I had a similar idea for exploring databases; but I'd guess that most of the information-rich web sites aren't amenable to this kind of visualization.&lt;/div&gt;&lt;br /&gt;&lt;div&gt;Super cool toy, though.&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30166624-7792818967418864850?l=connectedsystems.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://connectedsystems.blogspot.com/feeds/7792818967418864850/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30166624&amp;postID=7792818967418864850' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30166624/posts/default/7792818967418864850'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30166624/posts/default/7792818967418864850'/><link rel='alternate' type='text/html' href='http://connectedsystems.blogspot.com/2008/09/reality.html' title='Reality?'/><author><name>Razvan</name><uri>http://www.blogger.com/profile/01478237694157411648</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp1.blogger.com/_oKO4lXYJzFQ/SD-O3vBCSZI/AAAAAAAAACw/rLUH4XNTr8A/S220/rjp.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_oKO4lXYJzFQ/SNz5HgwI4GI/AAAAAAAAAD8/bIyUH04taWs/s72-c/ExitReality.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30166624.post-8685652640605827376</id><published>2008-08-18T19:58:00.001-07:00</published><updated>2008-08-18T19:58:33.052-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Widgets'/><title type='text'>Eno &amp; Byrne</title><content type='html'>&lt;object type="application/x-shockwave-flash" height="400" width="400" id="TSBundleWidget" data="http://bits-0.topspin.net/u/byrne/TSBundleWidget.swf?rootPath=https://app.topspin.net&amp;showTrace=false&amp;campaign_id=6001"&gt;&lt;param value="always" name="allowScriptAccess"/&gt;&lt;param name="allowfullscreen" value="true" /&gt;&lt;param name="movie" value="http://bits-0.topspin.net/u/byrne/TSBundleWidget.swf?rootPath=https://app.topspin.net&amp;showTrace=false&amp;campaign_id=6001" /&gt;&lt;param name="quality" value="high" /&gt;&lt;param name="flashvars" value="campaign_id=6001&amp;amp;baseurl=http://app.topspin.net&amp;amp;width=400&amp;amp;height=400&amp;amp;configurl=http://bits-0.topspin.net/u/byrne/album_config_6001.xml&amp;amp;autoplay=false" /&gt;&lt;/object&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30166624-8685652640605827376?l=connectedsystems.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://connectedsystems.blogspot.com/feeds/8685652640605827376/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30166624&amp;postID=8685652640605827376' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30166624/posts/default/8685652640605827376'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30166624/posts/default/8685652640605827376'/><link rel='alternate' type='text/html' href='http://connectedsystems.blogspot.com/2008/08/eno-byrne.html' title='Eno &amp; Byrne'/><author><name>Razvan</name><uri>http://www.blogger.com/profile/01478237694157411648</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp1.blogger.com/_oKO4lXYJzFQ/SD-O3vBCSZI/AAAAAAAAACw/rLUH4XNTr8A/S220/rjp.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30166624.post-9132691908446483141</id><published>2008-08-15T14:19:00.000-07:00</published><updated>2008-08-15T14:20:46.380-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Hosting'/><title type='text'>Moolah</title><content type='html'>Nice, Wordpress. To redirect a WP-hosted blog, one must pay $10/year. To use a custom CSS (I hate the font used by the current one I have there), it's another $15. I understand they have to make a living. They should understand I can use Blogger instead.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30166624-9132691908446483141?l=connectedsystems.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://connectedsystems.blogspot.com/feeds/9132691908446483141/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30166624&amp;postID=9132691908446483141' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30166624/posts/default/9132691908446483141'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30166624/posts/default/9132691908446483141'/><link rel='alternate' type='text/html' href='http://connectedsystems.blogspot.com/2008/08/moolah.html' title='Moolah'/><author><name>Razvan</name><uri>http://www.blogger.com/profile/01478237694157411648</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp1.blogger.com/_oKO4lXYJzFQ/SD-O3vBCSZI/AAAAAAAAACw/rLUH4XNTr8A/S220/rjp.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30166624.post-5451512942924029837</id><published>2008-08-15T13:48:00.000-07:00</published><updated>2008-08-15T13:52:36.496-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='API'/><title type='text'>Applets once were embeddable</title><content type='html'>Ok most of my recent posts have actually been embedded scripts or badges from various external sites; long live mashups! Today however, I had to deal with a problem I thought had been fixed since 1996: embedding a Java applet in a web page. Such a simple task was made unpleasant by the need to have it done in XHTML and supported across various browsers, including IE, Firefox, and Safari.&lt;br /&gt;&lt;br /&gt;Well, the OBJECT tag works slightly different in each of the above. And it is extremely poorly documented. If you want your JAR to reside in other directory than the one where the HTML file is, tough luck.&lt;br /&gt;&lt;br /&gt;This is plain stupid. Why is it so hard to standardize such a basic premise of the internet? Ok Java applets aren't used that much anymore, but why did they have to go and make something that was once simple, complicated?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30166624-5451512942924029837?l=connectedsystems.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://connectedsystems.blogspot.com/feeds/5451512942924029837/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30166624&amp;postID=5451512942924029837' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30166624/posts/default/5451512942924029837'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30166624/posts/default/5451512942924029837'/><link rel='alternate' type='text/html' href='http://connectedsystems.blogspot.com/2008/08/applets-once-were-embeddable.html' title='Applets once were embeddable'/><author><name>Razvan</name><uri>http://www.blogger.com/profile/01478237694157411648</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp1.blogger.com/_oKO4lXYJzFQ/SD-O3vBCSZI/AAAAAAAAACw/rLUH4XNTr8A/S220/rjp.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-30166624.post-348325267929218791</id><published>2008-06-13T12:42:00.000-07:00</published><updated>2008-06-18T17:58:02.598-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Processing'/><title type='text'>Landing page project for my personal web site</title><content type='html'>Courtesy of &lt;span style="font-weight:bold;"&gt;Gliffy&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Work in progress:&lt;br /&gt;&lt;a href="http://razvan.petrescu.googlepages.com/LandingPage2.html"&gt;...here&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Image:&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.gliffy.com/pubdoc/1444974/S.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px;" src="http://www.gliffy.com/pubdoc/1444974/S.jpg" border="0" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Editable chart:&lt;br /&gt;&lt;br /&gt;&lt;script src="http://www.gliffy.com/diagramEmbed.js" type="text/javascript"&gt; &lt;/script&gt;&lt;br /&gt;&lt;script type="text/javascript"&gt; gliffy_did = "1444974"; embedGliffy(); &lt;/script&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/30166624-348325267929218791?l=connectedsystems.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://connectedsystems.blogspot.com/feeds/348325267929218791/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=30166624&amp;postID=348325267929218791' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/30166624/posts/default/348325267929218791'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/30166624/posts/default/348325267929218791'/><link rel='alternate' type='text/html' href='http://connectedsystems.blogspot.com/2008/06/landing-page-project-for-my-personal.html' title='Landing page project for my personal web site'/><author><name>Razvan</name><uri>http://www.blogger.com/profile/01478237694157411648</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp1.blogger.com/_oKO4lXYJzFQ/SD-O3vBCSZI/AAAAAAAAACw/rLUH4XNTr8A/S220/rjp.jpg'/></author><thr:total>0</thr:total></entry></feed>
