<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearchrss/1.0/" xmlns:georss="http://www.georss.org/georss" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0"><id>tag:blogger.com,1999:blog-4522919003955435321</id><updated>2009-11-09T17:21:16.995-08:00</updated><title type="text">Software and Architecture</title><subtitle type="html" /><link rel="http://schemas.google.com/g/2005#feed" type="application/atom+xml" href="http://rdfsg.blogspot.com/feeds/posts/default" /><link rel="alternate" type="text/html" href="http://rdfsg.blogspot.com/" /><link rel="hub" href="http://pubsubhubbub.appspot.com/" /><link rel="next" type="application/atom+xml" href="http://www.blogger.com/feeds/4522919003955435321/posts/default?start-index=26&amp;max-results=25" /><author><name>rdf</name><uri>http://www.blogger.com/profile/04410128869406318890</uri><email>noreply@blogger.com</email></author><generator version="7.00" uri="http://www.blogger.com">Blogger</generator><openSearch:totalResults>53</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><link rel="self" href="http://feeds.feedburner.com/SoftwareAndArchitecture" type="application/atom+xml" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com" /><entry><id>tag:blogger.com,1999:blog-4522919003955435321.post-7840867892533207297</id><published>2009-11-09T17:21:00.001-08:00</published><updated>2009-11-09T17:21:17.092-08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="seam" /><category scheme="http://www.blogger.com/atom/ns#" term="jboss" /><title type="text">Seam + {jboss 5.0 | jboss 5.1} = ?</title><content type="html">About a month ago I completed the upgrade of all my Macs to &lt;a href="http://www.apple.com/macosx/"&gt;Snow Leopard&lt;/a&gt;. This generally went smoothly -- not a surprise for a release that has been charactered as "more refinement than upgrade."&lt;br /&gt;&lt;br /&gt;One exception was a jboss 4.2.2/seam 2.1 application that would hang when generating a list view of objects that included images. My initial reaction was that this provided an opportunity to upgrade to jboss 5.x and partake of whatever enhancements that offered.&lt;br /&gt;&lt;br /&gt;This proved to be a task that ended in frustration. I spent ~ 40 hours on it and eventually gave up. I fell back to the earlier version and upgraded to jboss 4.2.3 which solved the problem (which I think was related to using Java 1.6). &lt;br /&gt;&lt;br /&gt;I thought I'd share some of my experiences, just in case someone else finds it useful:&lt;br /&gt;&lt;br /&gt;The first glitch was that the version of seam I was running didn't appear to work with jboss 5.x so I upgraded to version 2.2&lt;br /&gt;&lt;br /&gt;The attendant upgrades caused me to change some of the DB mappings&lt;br /&gt;e.g.,&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;&lt;code&gt;change blob annotations (mysql specified)&lt;br /&gt;From: @Column(name = “data”, length = 8000000)&lt;br /&gt;To: @Column(name = “data”, length = 8000000, columnDefinition = “mediumblob”)&lt;/code&gt;&lt;/pre&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;I also tried switching to &lt;a href="http://www.jboss.com/products/devstudio/"&gt;jboss developer studio&lt;/a&gt; to see if that would help me uncover the problem -- this had no real impact.&lt;br /&gt;&lt;br /&gt;The core symptom was that nothing was coming back from pages that generated a list of items in the DB and no Hibernate queries showed up in the back end stream.&lt;br /&gt;&lt;br /&gt;I eventually tried to go in to one of the more "internal" pages&lt;br /&gt; &lt;code&gt;http://localhost:8080/webtwo/Competition.seam?htmlTitle=competition&amp;competitionId=2&amp;cid=6&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;(a real advantage of Seam's &lt;a href="http://en.wikipedia.org/wiki/Representational_State_Transfer"&gt;rest interface&lt;/a&gt;) and finally saw a hibernate query on the background stream with the warning:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;code&gt;WARN  [Param] could not create converter for: competitionId&lt;br /&gt;javax.el.PropertyNotFoundException: Target Unreachable, identifier ‘competitionHome’ resolved to NULL&lt;/code&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;This warning was similar to the error I was getting that the &lt;code&gt;authenticate method resolved to NULL.&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;What appeared to be happening is that the seam annotations weren't being processed correctly (specifically &lt;code&gt;@Name("competitionHome")&lt;/code&gt; ).&lt;br /&gt;&lt;br /&gt;After searching on this error I found this link&lt;br /&gt;&lt;a href="http://www.seamframework.org/Documentation/WhatHappensWhenYouDeploySeamAppInJBoss5"&gt;http://www.seamframework.org/Documentation/WhatHappensWhenYouDeploySeamAppInJBoss5&lt;/a&gt;&lt;br /&gt;which made me think that things are basically broken.&lt;br /&gt;&lt;br /&gt;As I said, rolling back to the original code, the problems went away in jboss 4.2.3. However, I must admit that I'm surprised that the issue exists in the newer versions of seam/jboss&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;strong&gt;Jboss&lt;/strong&gt;&lt;br /&gt;5.0.0.GA	Stable	104 MB	2008-12-05	LGPL	 134971	Download	Notes&lt;br /&gt;5.1.0.GA	Stable	130 MB	2009-05-23	LGPL	 181731	Download	Notes&lt;br /&gt;&lt;strong&gt;Seam&lt;/strong&gt;&lt;br /&gt;JBoss Seam 2.2	2.2.0.GA	Production	111 MB	30.07.2009	LGPL	Notes	Download&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;I know that this is "unsupported" code, but I would still think that there would be better testing. After all, 5.1 was out in May of this year and Seam 2.2 claims&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;Seam 2.2 examples target JBoss Application Server 5.1.&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Now, I do realize I could have been anywhere from 1 minute to 1 month away from a solution for this problem (if anyone has a solution, I'd be more than happy to try it), but I have two closing thoughts:&lt;br /&gt;&lt;UL&gt;&lt;LI&gt;Allocate more time than you might have expected towards making the transition&lt;/LI&gt;&lt;br /&gt;&lt;LI&gt;It would have been appreciated if the various teams involved paid more attention to migration tools (even documentation) and/or backward compatibility. My various searches trying to solve this problem turned up a lot of people having obscure issues with the transition: this is not the way to encourage wide uptake of a tool set.&lt;/LI&gt;&lt;br /&gt;&lt;/UL&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4522919003955435321-7840867892533207297?l=rdfsg.blogspot.com'/&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://rdfsg.blogspot.com/feeds/7840867892533207297/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=4522919003955435321&amp;postID=7840867892533207297" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/4522919003955435321/posts/default/7840867892533207297" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/4522919003955435321/posts/default/7840867892533207297" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/SoftwareAndArchitecture/~3/J4pkoPBaXbI/seam-jboss-50-jboss-51.html" title="Seam + {jboss 5.0 | jboss 5.1} = ?" /><author><name>rdf</name><uri>http://www.blogger.com/profile/04410128869406318890</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="OpenSocialUserId" value="16845754167005561368" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://rdfsg.blogspot.com/2009/11/seam-jboss-50-jboss-51.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-4522919003955435321.post-8307647561159855495</id><published>2009-10-20T06:17:00.001-07:00</published><updated>2009-10-20T06:17:18.510-07:00</updated><title type="text">XCode 3.x</title><content type="html">I've been coming up to speed on iPhone development and thought I'd share some of my experiences.&lt;br /&gt;&lt;br /&gt;The first is that &lt;em&gt;&lt;a href="http://www.amazon.com/Beginning-iPhone-Development-Exploring-SDK/dp/1430224592/ref=sr_1_1?ie=UTF8&amp;s=books&amp;qid=1254423636&amp;sr=8-1"&gt;Beginning iPhone 3 Development&lt;/a&gt;&lt;/em&gt; is a very useful starting point. I tried a couple of other resources but finally settled on this. I do like books better than video when learning a new environment but this book also has the advantage of being up-to-date and accurate. I hate trying to learn an environment/languiage when the examples are wrong! &lt;em&gt;Beginning iPhone 3 Development&lt;/em&gt; employed a technical reviewer who worked and verified all of the examples. Shouldn't every book like this have a technical reviewer? -- the world would be a better place.&lt;br /&gt;&lt;br /&gt;A few observations on the development environment, which although reasonable is a bit more primitive than netbeans or eclipse, especially around refactoring&lt;br /&gt;e.g., &lt;br /&gt;renaming a class/header file doesn't rename all of the imports throughout the project, and there isn't a "Refactoring" capability that I've found that does this.&lt;br /&gt;&lt;br /&gt;The C aspects certainly harken back to an earlier era, e.g., one has to define a function in a .m file and declare it in a .h file for it to work correctly. At least Code Sense minimizes the chances for mistyping in this case.&lt;br /&gt;&lt;br /&gt;XCode only allows you to view the interface specification (the .xib file) via the interface builder--however it is useful to realize that the .xib file is really an xml file that can be viewed in a normal text editor e.g., &lt;a href="http://www.gnu.org/software/emacs/"&gt;emacs&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Misspellings count and don't seem to generate errors:&lt;br /&gt;&lt;UL&gt;&lt;LI&gt;Surprised that Code Sense doesn't prompt when overriding methods from the superclasses, which causes the the classic "why wasn't this method called debugging session"&lt;/LI&gt; &lt;br /&gt;&lt;br /&gt;&lt;LI&gt;Similarly the compiler doesn't tell if you're calling undefined methods&lt;br /&gt;&lt;/LI&gt;&lt;br /&gt;&lt;br /&gt;&lt;LI&gt;Misspelling accessor e.g., &lt;br /&gt;childController.tltle = prez.name;&lt;br /&gt;vs&lt;br /&gt; childController.title = prez.name;&lt;br /&gt;gets the error: &lt;code&gt;request for member ‘tltle’ in something not a structure or a union&lt;/code&gt;&lt;/LI&gt;&lt;br /&gt;&lt;/UL&gt;&lt;br /&gt;&lt;br /&gt;Also can't believe that there isn’t enough introspection so that you still have to do these:&lt;br /&gt;&lt;pre&gt;&lt;code&gt;&lt;br /&gt;#pragma mark NSCoding&lt;br /&gt;-(void)encodeWithCoder:(NSCoder *)encoder{&lt;br /&gt;	[encoder encodeObject:field1 forKey:kField1Key];&lt;br /&gt;	[encoder encodeObject:field2 forKey:kField2Key];&lt;br /&gt;	[encoder encodeObject:field3 forKey:kField3Key];&lt;br /&gt;	[encoder encodeObject:field4 forKey:kField4Key];&lt;br /&gt;}&lt;br /&gt;-(id)initWithCoder:(NSCoder *)decoder{&lt;br /&gt;	if(self = [super init]){&lt;br /&gt;		self.field1 = [decoder decodeObjectForKey:kField1Key];&lt;br /&gt;		self.field2 = [decoder decodeObjectForKey:kField2Key];&lt;br /&gt;		self.field3 = [decoder decodeObjectForKey:kField3Key];&lt;br /&gt;		self.field4 = [decoder decodeObjectForKey:kField4Key];&lt;br /&gt;	}&lt;br /&gt;	return self;&lt;br /&gt;}&lt;br /&gt;#pragma mark -&lt;br /&gt;#pragma mark NSCopying&lt;br /&gt;-(id)copyWithZone:(NSZone *)zone{&lt;br /&gt;	FourLines *copy = [[[self class] allocWithZone:zone] init];&lt;br /&gt;	copy.field1 = [[self.field1 copyWithZone:zone] autorelease];&lt;br /&gt;	copy.field2 = [[self.field2 copyWithZone:zone] autorelease];&lt;br /&gt;	copy.field3 = [[self.field3 copyWithZone:zone] autorelease];&lt;br /&gt;	copy.field4 = [[self.field4 copyWithZone:zone] autorelease];&lt;br /&gt;}&lt;/code&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;h2&gt;On The Bright Side &lt;br /&gt;&lt;/h2&gt;&lt;br /&gt;@synthesize obviates a lot of useless typing.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://macdevelopertips.com/objective-c/objective-c-categories.html"&gt;Categories&lt;/a&gt; seem cool and I plan to explore them further. Categories let you add methods to an existing class -- the source code of the existing class is not required.&lt;br /&gt;&lt;br /&gt;From the xcode 3.1 doc Categories&lt;br /&gt;&lt;br /&gt;&lt;UL&gt;&lt;LI&gt;Provide a simple way of grouping related methods. Similar methods defined in different classes can be kept together in the same source file.&lt;/LI&gt;&lt;br /&gt;&lt;LI&gt;Simplify the management of a large class when several developers contribute to the class definition.&lt;br /&gt;Let you achieve some of the benefits of incremental compilation for a very large class.&lt;/LI&gt;&lt;br /&gt;&lt;LI&gt;Can help improve locality of reference for commonly used methods.&lt;br /&gt;Enable you to configure a class differently for separate applications, without having to maintain different versions of the same source code.&lt;br /&gt;To declare informal protocols.&lt;br /&gt;See “Informal Protocols ,” as discussed under “Declaring Interfaces for Others to Implement.”&lt;/LI&gt;&lt;/UL&gt;&lt;br /&gt;&lt;br /&gt;The doc also contains a suitable caveat:&lt;br /&gt;&lt;blockquote&gt;Although the language currently allows you to use a category to override methods the class inherits, or even methods declared in the class interface, you are strongly discouraged from using this functionality. A category is not a substitute for a subclass.&lt;/blockquote&gt; &lt;br /&gt;&lt;br /&gt;That is, categories are powerful and can blow your foot off, the "power tool" version of shooting yourself in the foot, if you're not careful.&lt;br /&gt;&lt;br /&gt;You can schedule actions to happen in the future and then cancel them when superseded by a subsequent user action.&lt;br /&gt;&lt;code&gt;&lt;pre&gt;[NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(singleTap) object:nil];&lt;br /&gt;			[self performSelector:@selector(doubleTap) withObject:nil afterDelay:.4];&lt;/pre&gt;&lt;/code&gt;&lt;br /&gt;It is very nice to have that capability just "built in."&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4522919003955435321-8307647561159855495?l=rdfsg.blogspot.com'/&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://rdfsg.blogspot.com/feeds/8307647561159855495/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=4522919003955435321&amp;postID=8307647561159855495" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/4522919003955435321/posts/default/8307647561159855495" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/4522919003955435321/posts/default/8307647561159855495" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/SoftwareAndArchitecture/~3/f1ZmuyqGQHM/xcode-3x.html" title="XCode 3.x" /><author><name>rdf</name><uri>http://www.blogger.com/profile/04410128869406318890</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="OpenSocialUserId" value="16845754167005561368" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://rdfsg.blogspot.com/2009/10/xcode-3x.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-4522919003955435321.post-886156095452704582</id><published>2009-09-14T17:17:00.001-07:00</published><updated>2009-09-14T17:17:48.877-07:00</updated><title type="text">Patterns in Network Architecture</title><content type="html">I recently finished reading &lt;a href="http://www.amazon.com/Patterns-Network-Architecture-Return-Fundamentals/dp/0132252422/ref=sr_1_1?ie=UTF8&amp;s=books&amp;qid=1252342315&amp;sr=8-1"&gt;Patterns in Network Architecture&lt;/a&gt; by &lt;a href="http://en.wikipedia.org/wiki/John_Day_(computer_scientist)"&gt;John Day&lt;/a&gt;. It's an attempt to rethink network architectures and polish up "the unfinished demo" that is the internet. &lt;br /&gt;&lt;br /&gt;Now, I'm not a network guy, so I can't evaluate the quality of his proposed solutions in any detail, but I liked his thought process and found it a useful read for anyone interested in a good example of thinking through a hard problem and coming up with a disciplined "minimal covering" solution. &lt;br /&gt;&lt;br /&gt;Day focuses upon discovering the appropriate layers and layer structures necessary for communication. He works up from interprocess communication on a single machine to processes communicating across multiple machines.&lt;br /&gt;&lt;br /&gt;The implications of this analysis are interesting in and of themselves and closely resemble structures seen in other systems. His metaphors are primarily in terms of name lookup and binding,  using compilers and operating systems as examples (I have to admit that this only feels partially correct to me: I think the full problem is more akin to providing the data/instructions to a processor and therefore needs to include the mapping from a "memory location" to an actual address accessible by the chip's execution unit e.g., it should take into account caching, &lt;a href="http://en.wikipedia.org/wiki/Translation_lookaside_buffer"&gt;TLBs&lt;/a&gt; et al.).&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;The first and foremost conclusion in Day's opinion is that there is one layer that provides interprocessor communication and it replicates. That is, the structure of each network layer is the same, but the policies and optimizations differ depending upon the particulars of what the layer is connected to. Every layer has three parts, data transfer, IPC (Interprocess Communication) control and IPC management -- where control is short cycle management.&lt;br /&gt;&lt;br /&gt;In his words&lt;br /&gt;&lt;br /&gt; &lt;span&gt;"Layers have two major properties that are of interest to us: abstraction and scaling (i.e., divide and conquer). Layers hide the operation of the internal mechanisms from the users of the mechanisms and segregate and aggregate traffic. But most important, they provide an abstraction of the layers below"&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;When moving from a shared to a distributed environment the core new functionality is an Error- and flow-control protocol (EFCP). This protocol replaces the shared memory mechanisms of the single system to ensure reliability and to provide flow control in the environment of communication between two systems. An EFCP PM is a task of the IPC process. Although in theory, such a process could be included even when communication is on a shared processor, in practice, this communication is so reliable as to make it redundant.&lt;br /&gt;&lt;br /&gt;I think that the core insight/technique was to frame communication from the network perspective as being  from application to application and not as interacting with the network e.g., in the figure below (6-15 from the book) communication is conceptualized as being &lt;em&gt;across,&lt;/em&gt; that is between applications at the same layer, rather than down through the network and back up to the other application. &lt;br /&gt;&lt;br /&gt;The application concerns itself with developing a shared state with its partner application. The N-1 layer provides an an abstract aggregated API to support the application's view of the communication and performs whatever aggregation and abstraction necessary to develop a shared state with the N-1 application on the other side. It then hands off details to the N-2 layer which gets it to the N-2 layer on the other side, etc.&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align:center;"&gt;&lt;img src="http://lh6.ggpht.com/_uhpaSaKsmiM/SqVLTjCKqxI/AAAAAAAAAGw/6gBOXQOqMAQ/blog__6-15.jpg?imgmax=800" alt="blog__6-15.jpg" border="0" width="300" height="185" /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Yes, it is just encapsulation all over again, but as we all know, finding the right thing to encapsulate and doing it in a practical way takes a lot of work. &lt;br /&gt;&lt;br /&gt;I'm eliding a number of the other key findings of the book such as &lt;UL&gt;&lt;LI&gt;The observation than an address only needs to be unique within a (distributed) application layer&lt;/LI&gt;&lt;LI&gt; A connection is made only after authentication has been obtained and the connection authorized etc.&lt;/LI&gt; &lt;/UL&gt;&lt;br /&gt;All are developed in a thoughtful way showing deep insight into the problem.&lt;br /&gt;&lt;br /&gt;Although not the easiest read for someone without a strong networking background, it is an interesting and useful exercise to watch someone so well versed go through the process so thoughtfully.&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4522919003955435321-886156095452704582?l=rdfsg.blogspot.com'/&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://rdfsg.blogspot.com/feeds/886156095452704582/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=4522919003955435321&amp;postID=886156095452704582" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/4522919003955435321/posts/default/886156095452704582" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/4522919003955435321/posts/default/886156095452704582" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/SoftwareAndArchitecture/~3/qx2tpoQ8U-M/patterns-in-network-architecture.html" title="Patterns in Network Architecture" /><author><name>rdf</name><uri>http://www.blogger.com/profile/04410128869406318890</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="OpenSocialUserId" value="16845754167005561368" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://rdfsg.blogspot.com/2009/09/patterns-in-network-architecture.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-4522919003955435321.post-6804773551904665488</id><published>2009-08-24T18:00:00.001-07:00</published><updated>2009-08-24T18:00:22.947-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="architecture" /><title type="text">Flavors of Architects and Analysts</title><content type="html">I was recently involved in a discussion on the difference between architects and business analysts and decided to put together my thoughts on the subject.&lt;br /&gt;&lt;br /&gt;Here they are: for each category “Architect”, “Business Analyst” there are a number of sub-categories&lt;br /&gt;&lt;br /&gt;I normally think of three levels of Architecture:&lt;br /&gt;&lt;br /&gt;&lt;UL&gt;&lt;LI&gt;Application – addresses evolution and delivery of a single application (small set of highly related functions), activities include:&lt;br /&gt;&lt;UL&gt;&lt;LI&gt;Partitioning functionality within an application.&lt;/LI&gt;&lt;br /&gt;&lt;LI&gt;Developing best practices.&lt;/LI&gt;&lt;br /&gt;&lt;LI&gt;Assuring flexibility to meet current and immediate business needs.&lt;/LI&gt;&lt;/UL&gt;&lt;/LI&gt;&lt;br /&gt;&lt;LI&gt;Platform – addresses evolution and delivery of a multiple application for a particular business area (applications grouped by functionality/user community), activities include: &lt;br /&gt;&lt;UL&gt;&lt;br /&gt;&lt;LI&gt;Assuring a commonality of results.&lt;/LI&gt; &lt;LI&gt;Providing for fine grained interoperability.&lt;/LI&gt;&lt;br /&gt;&lt;LI&gt;Developing frameworks that allow multiple applications to ship on a common substrate.&lt;/LI&gt;&lt;br /&gt;&lt;LI&gt;Building in flexibility to meet business developments on the planning horizon (this year/next year goals) for moderate-sized groups within the company (~100 people)&lt;/LI&gt;&lt;LI&gt; Assuring that a substrate achieving these goals is in place so the applications can pick it up at the appropriate time.&lt;/LI&gt;&lt;/UL&gt;&lt;/LI&gt;&lt;br /&gt;&lt;LI&gt;Enterprise: &lt;br /&gt;&lt;UL&gt;&lt;LI&gt;Identify core data elements and services that will be important over the strategic timeframe.&lt;/LI&gt;&lt;br /&gt;&lt;LI&gt;Assure that there is an appropriate mix of flexibility/capabilities to meet strategic goals e.g., &lt;UL&gt;&lt;LI&gt;If acquisition of companies is a strategic goal, methods for rapidly merging personnel, purchasing, and operational information systems are important.&lt;/LI&gt; &lt;LI&gt;If acquiring products is a strategic goal, capturing data about supply and delivery chains etc. is important.&lt;/LI&gt;&lt;/UL&gt;&lt;/LI&gt;&lt;/UL&gt;&lt;/LI&gt;&lt;br /&gt;&lt;/UL&gt;&lt;br /&gt;On the business analyst side I similarly think of three levels:&lt;br /&gt;&lt;UL&gt;&lt;LI&gt;	Department Level: &lt;/LI&gt;&lt;br /&gt;&lt;UL&gt;&lt;LI&gt;What are the processes involved in performing a function: including &lt;em&gt;as is&lt;/em&gt; and &lt;em&gt;to be&lt;/em&gt; states?&lt;/LI&gt;&lt;/UL&gt;&lt;br /&gt;&lt;LI&gt;Division Level: &lt;br /&gt;&lt;UL&gt;&lt;LI&gt;What is the external business goal that is being addressed?&lt;/LI&gt; &lt;br /&gt;&lt;LI&gt;Is this the right way to address it?&lt;/LI&gt;&lt;LI&gt;Should functions be merged/refactored?&lt;/LI&gt;&lt;/UL&gt;&lt;/LI&gt;&lt;br /&gt;&lt;LI&gt;Corporate/Strategic: &lt;br /&gt;&lt;UL&gt;&lt;LI&gt;What are the strategic business differentiators going to be in the business that we want to be in 3-5 years?&lt;/LI&gt;&lt;br /&gt;&lt;LI&gt;What must the business look like to support them?&lt;/LI&gt;&lt;/UL&gt;.&lt;/LI&gt;&lt;br /&gt;&lt;/UL&gt;&lt;br /&gt;At all levels there should be some time spent to look at potential inflection points that might radically change the structure of delivery and build in flexibility to address that potential,  e.g., &lt;br /&gt;&lt;UL&gt;&lt;LI&gt;For architecture think outsourcing, software as a service, location aware computing, etc.&lt;/LI&gt;&lt;br /&gt;&lt;LI&gt;For business think increased competition in product acquisition, competition from generic products, regulatory/legal landscape.&lt;/LI&gt;&lt;/UL&gt;&lt;br /&gt;&lt;br /&gt;How these various functions are actually assigned to people depends a lot upon the scale of the problem, the level of risk/uncertainty, the talents of the people involved, and the flexibility of the organization. At one extreme, a star performer building upon a solid platform architecture (in the sense used above) can be a combination business analyst/application-architect/developer for a system serving 50+ users in a non-validated environment.&lt;br /&gt;&lt;br /&gt;I think it important that business analysts are able to understand the business processes and vocabulary well enough so that there is a good transmission of information between those expressing the needs and the analyst. This implies a greater stickiness between the analyst and the user community than is necessary for the architecture or project management functions.&lt;br /&gt;&lt;br /&gt;Similarly there are commonalities in the level of abstractions used in the architecture level (Application, Platform and Enterprise) that imply that levels are sticker than business areas or technology. &lt;br /&gt;&lt;br /&gt;In theory, project management is more transferable, but the stickiness here revolves around legal requirement, diversity of end use (geography, user types), system novelty.&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4522919003955435321-6804773551904665488?l=rdfsg.blogspot.com'/&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://rdfsg.blogspot.com/feeds/6804773551904665488/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=4522919003955435321&amp;postID=6804773551904665488" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/4522919003955435321/posts/default/6804773551904665488" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/4522919003955435321/posts/default/6804773551904665488" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/SoftwareAndArchitecture/~3/aGmOInxa7fM/flavors-of-architects-and-analysts.html" title="Flavors of Architects and Analysts" /><author><name>rdf</name><uri>http://www.blogger.com/profile/04410128869406318890</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="OpenSocialUserId" value="16845754167005561368" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://rdfsg.blogspot.com/2009/08/flavors-of-architects-and-analysts.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-4522919003955435321.post-1248582057492028913</id><published>2009-07-26T07:18:00.001-07:00</published><updated>2009-07-26T07:18:09.566-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="architecture" /><title type="text">Open Source as an Architectural Driver</title><content type="html">&lt;a href="http://www.washingtonmonthly.com/features/2009/0907.longman.html"&gt;Phillip Longman's post about open source products in healthcare&lt;/a&gt; (specifically,  the VA's "health IT system") talks about how the Midland Memorial Hospital's installation of the VA system went well because it was easy to use, and it was easy to use because it was open source.&lt;br /&gt;&lt;br /&gt;Well, the first one wasn't a surprise. Well-designed easy to use software is well, easy to use. The fact that this leads to successful system uptake/user adoption should be no more surprising than the fact that people like their iPhones. The second factor &lt;em&gt;being easy to use because you are open source&lt;/em&gt; is a bit of mental speed bump: &lt;strong&gt;Easy to use open source? &lt;/strong&gt;Well,  maybe if you are a developer. The article states that the ease of use stemmed from its ease of modification. Now I can't comment on that since I am unfamiliar with the product and have never been involved in a hospital centric system.&lt;br /&gt;&lt;br /&gt;However, open source and ease of modification? Yes, that fits. A successful open source project, by definition, must be relatively easy to modify: An interested developer should be able to jump in, modify the code and stand up a running test build in short order. Otherwise the project won't attract enough attention to survive. More importantly, I think a system that is easier to modify will leap ahead in functionality even if it starts out behind. &lt;br /&gt;&lt;br /&gt;This is one of the reasons we've seen such useful build/test tools come out of the open source community e.g., ant/junit/maven etc.. All open source projects needs tools like these to succeed since they are critical situations where you cannot afford a dedicated buildmeister or QA organization e.g., you're a developer modifying the code to satisfy your needs.&lt;br /&gt;&lt;br /&gt;Similarly a clean, modular, layered structure is going to be favored, codependencies (&lt;strong&gt;A&lt;/strong&gt; depends upon &lt;strong&gt;B&lt;/strong&gt;, &lt;strong&gt;B&lt;/strong&gt; depends upon &lt;strong&gt;A&lt;/strong&gt;) are going to be rejected, since they require understanding two pieces of code and their interrelationship to perform a successful modification.&lt;br /&gt;&lt;br /&gt;Both of these issues can be more easily compensated for within a "closed source" shop, since revenue-generating projects employing full time personnel can invest the time and discipline to keep things working, even if the software has a few points of poor structure. In addition, if the points of 'bad architecture" are manageable there is little incentive to fix the problem, since it might easily cost more to fix than it's worth, given the costs of running a full-time development team.&lt;br /&gt;&lt;br /&gt;One of the strongest examples I think we've seen of this is the EJB vs. Hibernate controversy with the resultant "conciliation" of EJB3. Hibernate, being open source, could give developers what they needed rather than what they "should want" &amp; it won due to its simplicity and speed.&lt;br /&gt;&lt;br /&gt;This argues for a bias towards an open source style, even in a closed source system. For example, can your consultants (internal or external) add/modify deep system functionality? Designing your system in a way that supports such modifications will make the architecture better and help keep the product fresh.&lt;br /&gt;&lt;br /&gt;Again, why this works for hospital systems is beyond me, unless there has been an undocumented rash of coding by doctors and nurses.&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4522919003955435321-1248582057492028913?l=rdfsg.blogspot.com'/&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://rdfsg.blogspot.com/feeds/1248582057492028913/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=4522919003955435321&amp;postID=1248582057492028913" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/4522919003955435321/posts/default/1248582057492028913" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/4522919003955435321/posts/default/1248582057492028913" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/SoftwareAndArchitecture/~3/CKsH5qn5apw/open-source-as-architectural-driver.html" title="Open Source as an Architectural Driver" /><author><name>rdf</name><uri>http://www.blogger.com/profile/04410128869406318890</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="OpenSocialUserId" value="16845754167005561368" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://rdfsg.blogspot.com/2009/07/open-source-as-architectural-driver.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-4522919003955435321.post-4722817001276152623</id><published>2009-06-30T14:45:00.001-07:00</published><updated>2009-06-30T14:45:15.113-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="iPhone" /><title type="text">iPhone: changing the way we think</title><content type="html">I'm struck by how the iPhone has changed the way we think about what can be done with software based devices assisting us as &lt;em&gt;&lt;a href="http://en.wikipedia.org/wiki/Heideggerian_terminology"&gt;beings-in-the-world&lt;/a&gt;&lt;/em&gt;. I'm doing a Heidegger reference here because the iPhone is more than just &lt;a href="http://en.wikipedia.org/wiki/Ubiquitous_computing"&gt;ubiquitous computing&lt;/a&gt;: a device always at my side that could answer those important questions like:&lt;br /&gt;&lt;UL&gt;&lt;LI&gt;Is there good coffee close by?&lt;/LI&gt;&lt;br /&gt;&lt;LI&gt;What's the weather going to be like later?&lt;/LI&gt;&lt;br /&gt;&lt;LI&gt;How old was Kennedy when he was elected?&lt;/LI&gt;&lt;/UL&gt;&lt;br /&gt;&lt;br /&gt;Although it certainly is that, it has become a lot more, changing both the economics of software delivery and what it means for software to be delivered. &lt;br /&gt;&lt;br /&gt;It's not just that there are a billion apps (or so it seems) in the app store, but the economics of iPhone software is such that a small gaming company can do a novel game e.g., &lt;a href="http://zenbound.com/"&gt;tying rope around wooden blocks&lt;/a&gt;, get traction with it and make money. That didn't sound that amazing until I read an &lt;a href="http://www.gamasutra.com/php-bin/news_index.php?story=23785"&gt;interview&lt;/a&gt; with the developers in &lt;a href="http://www.gamasutra.com/"&gt;Gamasutra&lt;/a&gt; that reminded me how hard it was to make money in computer games pre-iPhone. Not that it is easy now, but compared to the stories I heard when I attended a few &lt;a href="http://www.gdconf.com/"&gt;Game Developer conferences&lt;/a&gt; earlier in the decade, it is trivial. Let's just say that the economics of doing a platform (XBox, Playstation, wii) or PC based game were daunting, to say the least, and the likelihood of getting paid for your game was minimal, even if the game was successful.&lt;br /&gt;&lt;br /&gt;The core of the iPhone's difference is as a platform that is easy to use, location aware and ready-to-hand -- more like a hammer than a computer. &lt;br /&gt;&lt;br /&gt;As a platform it is sufficiently distinct that it is also effecting the way we think about delivering &lt;a href="http://chip.org/platform"&gt;healthcare&lt;/a&gt;. Looking at this list highlights core features that are "new," not "new" in the sense of being completely unheard of, but new in the sense of being practically available for use by the overwhelming bulk of the user community -- sort of like the difference between having a generator kit/knowing about electricity and having an electric grid that you can plug your device into.&lt;br /&gt;&lt;br /&gt;As a user-assistant, the iPhone allows me fully exploit the affordances of my current location. I can see where I am on a map, look at overhead imagery of my current neighborhood to see if there is something that I want to photograph, and, if there is, use a small application to grab the geo coordinates so I can later tag the photos I took with my (non-GPS enabled) camera.&lt;br /&gt;&lt;br /&gt;The end result is something that is always with you, knows who you are, knows where you are, has connectivity both up (3G/internet) and down (bluetooth to local devices) while providing a simple effective mechanism to easily add functionality in small increments. &lt;br /&gt;&lt;br /&gt;I think this makes it the biggest game changer since the rollout of the internet to the general public. However, I also realize that this means that it is time to code up a small test application for the iPhone.&lt;br /&gt;&lt;br /&gt;PS: I don't have any experience with the &lt;a href="http://www.google.com/mobile/android/"&gt;Google android platform&lt;/a&gt; or the &lt;a href="http://www.palm.com/us/products/phones/pre/index.html"&gt;Palm Pre&lt;/a&gt;; these observations may apply equally as well to them.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt; &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4522919003955435321-4722817001276152623?l=rdfsg.blogspot.com'/&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://rdfsg.blogspot.com/feeds/4722817001276152623/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=4522919003955435321&amp;postID=4722817001276152623" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/4522919003955435321/posts/default/4722817001276152623" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/4522919003955435321/posts/default/4722817001276152623" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/SoftwareAndArchitecture/~3/1f_EuI3mEsw/iphone-changing-way-we-think.html" title="iPhone: changing the way we think" /><author><name>rdf</name><uri>http://www.blogger.com/profile/04410128869406318890</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="OpenSocialUserId" value="16845754167005561368" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://rdfsg.blogspot.com/2009/06/iphone-changing-way-we-think.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-4522919003955435321.post-5448813411722545646</id><published>2009-06-01T18:37:00.001-07:00</published><updated>2009-06-01T18:37:13.404-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="data integration" /><title type="text">Linked Data</title><content type="html">Finally, thanks to a discussion with &lt;a href="http://eneumann.org/"&gt;Eric Neumann&lt;/a&gt; a few weeks ago, I'm beginning to understand what &lt;a href="http://linkeddata.org/"&gt;Linked Data&lt;/a&gt; is all about. First a caveat -- although I credit Eric for helping me see how linked data fits into what I'm doing, the following interpretation is strictly my own as are errors of omission, commission or orthogonality, although I think my view is supported by the &lt;a href="http://www.w3.org/DesignIssues/LinkedData.html"&gt;Design Issues document&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;The short story is that linked data provides stable identifiers for stuff (a more abstract form of things). These stable identifiers then allow you to say things about this (particular) stuff without necessarily making a strong &lt;a href="http://rdfsg.blogspot.com/2009/04/owlsameas-is-very-strong-assertion.html"&gt;ontological&lt;/a&gt; commitment. &lt;br /&gt;&lt;br /&gt;I like this. It provides for interoperability and integration. It does not provide any inference guarantees which is fine by be, and something that I have been advocating for a while. The Linked data site also has links to a number of datasets which  publish stable identifiers for useful stuff. The site also gives examples of how to publish your own data.&lt;br /&gt;&lt;br /&gt;Hopefully &lt;a href="http://www.data.gov/"&gt;data.gov&lt;/a&gt; will provide its data in this form in the near future.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4522919003955435321-5448813411722545646?l=rdfsg.blogspot.com'/&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://rdfsg.blogspot.com/feeds/5448813411722545646/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=4522919003955435321&amp;postID=5448813411722545646" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/4522919003955435321/posts/default/5448813411722545646" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/4522919003955435321/posts/default/5448813411722545646" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/SoftwareAndArchitecture/~3/fuw88udwRIg/linked-data.html" title="Linked Data" /><author><name>rdf</name><uri>http://www.blogger.com/profile/04410128869406318890</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="OpenSocialUserId" value="16845754167005561368" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://rdfsg.blogspot.com/2009/06/linked-data.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-4522919003955435321.post-7630833637176229851</id><published>2009-05-17T18:42:00.001-07:00</published><updated>2009-05-18T12:33:23.879-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="RDF" /><title type="text">Wolfram Alpha</title><content type="html">Wolfram Alpha is supposed to be launching in the next few days and has been getting a lot of publicity. For background, here's a link to a short &lt;a href="http://www.youtube.com/watch?v=hYhLsQPHNas"&gt;YouTube demo of Wolfram Alpha&lt;/a&gt;, and a &lt;a href="http://www.nytimes.com/2009/05/11/technology/internet/11search.html"&gt;NY Times&lt;/a&gt; article and Doug Lenat has a nice &lt;a href="http://blog.cyc.com/2009/03/wolfram-alpha.html"&gt;post on his impressions&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;From what I can see (and I don't have access) even though it doesn't live up to some of the early hype, it achieves a very interesting result: it allows retrieval of general computable information using a simple &lt;em&gt;&lt;a href="http://en.wikipedia.org/wiki/Natural_language_processing"&gt;natural language processing&lt;/a&gt;&lt;/em&gt; (&lt;strong&gt;NLP&lt;/strong&gt;) interface. &lt;br /&gt;&lt;br /&gt;This allows for analysis similar to that permitted by a data warehouse, but within different design space. The design goals of WolframAlpha, unlike those of a data warehouse, preclude prestructuring the data in &lt;a href="http://en.wikipedia.org/wiki/Data_mart"&gt;marts&lt;/a&gt; to allow rapid querying of the data in relatively well defined ways. However similar to the mart/warehouse situation you must still provide a speedy response to the quantitative queries to prevent users from drifting away while waiting for an answer.&lt;br /&gt;&lt;br /&gt;The question is how is this done? Rumors on the net indicate that the underlying data is an &lt;a href="http://thenoisychannel.com/2009/03/19/wolfram-alpha-second-hand-impressions/"&gt;RDF triple store&lt;/a&gt;, which makes a lot of sense since RDF Triples constitute a &lt;a href="http://rdfsg.blogspot.com/2008/07/structuring-database-tables.html"&gt;vertical&lt;/a&gt;, model free storage approach. In operation, I imagine that the queries provide nice entry points for initiating a &lt;a href="http://en.wikipedia.org/wiki/Spreading_activation"&gt;spreading-activation&lt;/a&gt; fan-out process on the graph. When the activations intersect you can proceed to roll back up to the initiation points suggested by the query, clustering in a bottom-up data-driven fashion along the way. The clustering also affords a natural  way to structure the data for presentation to the user.&lt;br /&gt;&lt;br /&gt;Although I'll admit that this is just an educated guess as to the mechanism, it does suggest an interesting set of technologies involving fast linking and roll up of data for ad-hoc queries without requiring a lot of effort to tune the data to a specific query.&lt;br /&gt;&lt;br /&gt;Generating a set of vetted and annotated data is a different problem, but hopefully would not require a significantly greater level of effort than the ETL portion of current warehousing efforts.&lt;br /&gt;&lt;br /&gt;Wolfram Alpha therefore constitutes another factor leading me to be more vertical in my storage designs. In the  coming months, I'm hoping to run some benchmarks on production hardware/datasets so as to ground the practicality of this approach and then get permission to publish the results.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Update 18 May 2009:&lt;/strong&gt; I did try Wolfram Alpha today and it failed on my first try "age distribution of England vs UK,"  not so much from any idiosyncrasies in parsing my query, but because it appears to be  encoded with the identity "England == UK." This just goes to show how important it is to be spot-on with your identity information aka "synonym tables are easy, antonym tables on the other hand......aren't."&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4522919003955435321-7630833637176229851?l=rdfsg.blogspot.com'/&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://rdfsg.blogspot.com/feeds/7630833637176229851/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=4522919003955435321&amp;postID=7630833637176229851" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/4522919003955435321/posts/default/7630833637176229851" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/4522919003955435321/posts/default/7630833637176229851" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/SoftwareAndArchitecture/~3/kserSvb3S8I/wolfram-alpha.html" title="Wolfram Alpha" /><author><name>rdf</name><uri>http://www.blogger.com/profile/04410128869406318890</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="OpenSocialUserId" value="16845754167005561368" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://rdfsg.blogspot.com/2009/05/wolfram-alpha.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-4522919003955435321.post-6861647410631050147</id><published>2009-05-06T17:08:00.001-07:00</published><updated>2009-05-06T17:08:58.115-07:00</updated><title type="text">launchd</title><content type="html">I just upgraded to a new laptop (driven mostly by the need for more RAM -- hopefully 6G will be adequate for a couple of years). It got me thinking: even though it's great that the Mac will copy all of your old apps over effortlessly to your new machine, it also happily copies all your old unused cruft over to your new machine, and that's not so great.  &lt;br /&gt;&lt;br /&gt;So, in the spirit of good hygiene (and H1N1 preparedness), I decided to open up the console and look to see what I might find.  I discovered that I had a couple of launchd jobs that referenced executables which didn't exist on my system any more e.g., carbon copy cloner. &lt;br /&gt;&lt;br /&gt;I have been able to rid myself of all the launchd issues, by cleaning up the Launchdemons/launchagents under the Library folder but&lt;br /&gt;I still haven't been able to rid myself of all of these&lt;br /&gt;&lt;pre&gt;&lt;code&gt;/Applications/Safari.app/Contents/MacOS/Safari[54428]: Warning: accessing obsolete X509Anchors.&lt;/code&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;This is even after searching the web a couple of times. I think the problem starts up after I open an article from &lt;a href="http://www.newsfirerss.com/"&gt;NewsFire&lt;/a&gt;, but I'm not completely sure. This is definitely a space in which I believe &lt;em&gt;correlation is not causality.&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;If anyone has any ideas on how to fix this, I'd appreciate it.&lt;br /&gt;&lt;br /&gt;BTW it is really nice to have a built in tool like Console: it is simple and effective with just that little bit of extra functionality (string filtering) that makes all the difference in usability.&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4522919003955435321-6861647410631050147?l=rdfsg.blogspot.com'/&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://rdfsg.blogspot.com/feeds/6861647410631050147/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=4522919003955435321&amp;postID=6861647410631050147" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/4522919003955435321/posts/default/6861647410631050147" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/4522919003955435321/posts/default/6861647410631050147" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/SoftwareAndArchitecture/~3/GHo_57WTPkc/launchd.html" title="launchd" /><author><name>rdf</name><uri>http://www.blogger.com/profile/04410128869406318890</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="OpenSocialUserId" value="16845754167005561368" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">1</thr:total><feedburner:origLink>http://rdfsg.blogspot.com/2009/05/launchd.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-4522919003955435321.post-4458585381251565688</id><published>2009-04-20T15:12:00.001-07:00</published><updated>2009-04-20T15:12:25.083-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="software" /><title type="text">Java Concurrency</title><content type="html">A predictable side effect of having (way too) many years of experience in Java is that certain "new" features escape your notice. This is particularly true if the IDE's don't pressure you into changing your previously successful, and still functional patterns (the way they do with generics).&lt;br /&gt;&lt;br /&gt;I realized this when reading &lt;a href="http://www.amazon.com/Java-Concurrency-Practice-Brian-Goetz/dp/0321349601/ref=sr_1_1?ie=UTF8&amp;s=books&amp;qid=1240155526&amp;sr=8-1"&gt;Java Concurrency in Practice&lt;/a&gt;. It's a very good book -- I can't say it really opened my eyes on concurrency since I had done some work on multi-master VME based real-time systems years ago, but it is spot on, well written, and a nice refresh. In addition, it made me aware of the thread/concurrency capabilities available in newer versions of Java such as &lt;a href="http://java.sun.com/j2se/1.5.0/docs/api/java/util/concurrent/ThreadPoolExecutor.html"&gt;ThreadPoolExecutor&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I recently built a file crawler/hash-calculator/storage system as part of my &lt;a href="http://rdfsg.blogspot.com/2008/12/name-that-data.html"&gt;namedData&lt;/a&gt; work using an &lt;a href="http://java.sun.com/j2se/1.5.0/docs/api/java/util/concurrent/ArrayBlockingQueue.html"&gt;ArrayBlockingQueue&lt;/a&gt; and explicitly created threads. ThreadPoolExecutor appeared to allow an easier approach with cleaner shutdown/interrupt semantics.&lt;br /&gt;&lt;br /&gt;Java tips has a clear &lt;a href="http://www.java-tips.org/java-se-tips/java.util.concurrent/pooling-threads-to-execute-short.html"&gt;example&lt;/a&gt; -- the primary change that I would make to this example is to size the thread pool based upon the &lt;a href="http://java.sun.com/j2se/1.5.0/docs/api/java/lang/Runtime.html#availableProcessors()"&gt;number of processors available&lt;/a&gt; (on my laptop this returns the number of cores).&lt;br /&gt;&lt;br /&gt;It took me less than an hour to make this change, test the code, etc. The final product is a lot cleaner, has better shutdown behavior, and even feels like it runs faster. Definitely the right way to go.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4522919003955435321-4458585381251565688?l=rdfsg.blogspot.com'/&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://rdfsg.blogspot.com/feeds/4458585381251565688/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=4522919003955435321&amp;postID=4458585381251565688" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/4522919003955435321/posts/default/4458585381251565688" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/4522919003955435321/posts/default/4458585381251565688" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/SoftwareAndArchitecture/~3/GqQ-Q4dXfCk/java-concurrency.html" title="Java Concurrency" /><author><name>rdf</name><uri>http://www.blogger.com/profile/04410128869406318890</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="OpenSocialUserId" value="16845754167005561368" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://rdfsg.blogspot.com/2009/04/java-concurrency.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-4522919003955435321.post-6884284460948142678</id><published>2009-04-06T17:53:00.001-07:00</published><updated>2009-04-06T17:53:32.333-07:00</updated><title type="text">owl:sameAs is a very strong assertion</title><content type="html">There's been an interesting discussion on the  public-semweb-lifesci mailing list with the subject "&lt;a href="http://lists.w3.org/Archives/Public/public-semweb-lifesci/2009Mar/0066.html"&gt;blog: semantic dissonance in uniprot&lt;/a&gt;" which, appropriately enough, was spurred by a blogpost entitled &lt;a href="http://i9606.blogspot.com/2009/02/semantic-dissonance-in-uniprot.html"&gt;semantic dissonance in uniprot&lt;/a&gt;. This post talks about a &lt;a href="http://www.uniprot.org/"&gt;uniprot&lt;/a&gt; entry which listed a Drosophila (fruit fly) protein sequence as having been isolated from "a young &lt;a href="http://en.wikipedia.org/wiki/Sporophyte"&gt;sporophyte&lt;/a&gt; contained within a seed." &lt;br /&gt;&lt;br /&gt;The point being that although one doesn't find fruit fly genes in plants, following the &lt;code&gt;owl:sameAs&lt;/code&gt; link leads directly to that conclusion. This generated a very long, fairly thoughtful and minimally flame based &lt;a href="http://www.w3.org/Search/Mail/Public/search?type-index=public-semweb-lifesci&amp;index-type=t&amp;keywords=semantic%20dissonance%20in%20uniprot&amp;search=Search&amp;resultsperpage=100&amp;sortby=date&amp;page=1"&gt;conversation on &lt;code&gt;owl:sameAs&lt;/code&gt; and identity in general&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;As the discussion progressed, the problem with associating identity across graphs (ontologies/systems of data developed by different organizations) was noted, e.g., (in pseudo annotation) &lt;strong&gt;&lt;code&gt;mySystem:itemA owl:sameAs yourSystem:itemX&lt;/code&gt;&lt;/strong&gt;, the issue being that the use of the terms is usually subtly (and often not so subtly) different between the two systems. This problem is especially apparent when making assertions about real objects which exist independently out in the world. For example: "gold" may have a property, but does the property adhere to a single molecule, or a group of gold molecules and if so what characterizes a group of the appropriate size? For example given:&lt;br /&gt;&lt;UL&gt;&lt;LI&gt;A nanotechnology view of gold (still under development)&lt;/LI&gt;&lt;br /&gt;&lt;LI&gt;A semiconductor view of gold (probably reasonably well characterized)&lt;br /&gt;&lt;/LI&gt;&lt;LI&gt;A jewelry view of gold&lt;/LI&gt;&lt;/UL&gt;&lt;br /&gt;what are the precise boundaries of their applicability? The issue doesn't arise in a system developed for nanotechnology, semiconductors, or jewelry. The problems surface only when these systems are linked together.&lt;br /&gt;&lt;br /&gt;My thought is that the difficulty centers around the extreme power of &lt;code&gt;owl:sameAs&lt;/code&gt; which indicates that things are identical in all contexts. However in the physical world not only is context everything, but context is also inherently incompletely specified. &lt;br /&gt;&lt;br /&gt;In practice many of us heuristically treat identity in the physical world as operating as if identity means &lt;em&gt;indistinguishable in this context&lt;/em&gt;, with the context being implicitly dependent upon the issue being considered. I would claim that this is the only reasonable way to proceed when reasoning in a practical manner about what is true about particular objects in the world (abstractions can obviously satisfy stronger conditions since they are abstractions -- with the context factored out to any level desired).&lt;br /&gt;&lt;br /&gt;In the physical world, we cannot assure that even the ability to track a particular item with unlimited precision would allow us to make statements about that item which would hold through time. For example, although we might make assertions about a particular atom (#0x177FFEAA) of gold and its behavior, some if not all of the assertions may fail under unexpected conditions, e.g., after an event that alters the structure of the nucleus (nuclear collisions, extremely high temperatures etc.). Exhaustively specifying all of these conditions is impractical at best -- which is one of the reasons the phrase&lt;a href="http://en.wikipedia.org/wiki/Ceteris_paribus"&gt; &lt;em&gt;ceteris paribus&lt;/em&gt;&lt;/a&gt; has remained with us for so long.&lt;br /&gt;&lt;br /&gt;In my own work, since I never worry about tracking individual atoms. I gravitate toward weak rather than strong assertions of identity, trying to be very attentive to context. This is very much in the spirit of the &lt;em&gt;middle distance&lt;/em&gt; as developed in Brian Cantwell Smith's &lt;a href="http://www.amazon.com/Origin-Objects-Bradford-Books/dp/0262692090/ref=sr_1_2?ie=UTF8&amp;s=books&amp;qid=1238705921&amp;sr=8-2"&gt;On The Origin of Objects&lt;/a&gt;.  Smith's point is that our intuitions are well tuned to objects about our size that we interact with frequently. In data integration and architecture work (I had to get there eventually) it implies that integrating across fields that interact to some degree in the "world" is going to be more feasible than integrating across those that don't interact. The give and take of the practical interaction has allowed us to identify the particular features of each item that are important in context.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4522919003955435321-6884284460948142678?l=rdfsg.blogspot.com'/&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://rdfsg.blogspot.com/feeds/6884284460948142678/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=4522919003955435321&amp;postID=6884284460948142678" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/4522919003955435321/posts/default/6884284460948142678" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/4522919003955435321/posts/default/6884284460948142678" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/SoftwareAndArchitecture/~3/GzeZ4OC75d4/owlsameas-is-very-strong-assertion.html" title="owl:sameAs is a very strong assertion" /><author><name>rdf</name><uri>http://www.blogger.com/profile/04410128869406318890</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="OpenSocialUserId" value="16845754167005561368" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://rdfsg.blogspot.com/2009/04/owlsameas-is-very-strong-assertion.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-4522919003955435321.post-8198218463232690636</id><published>2009-03-23T18:03:00.001-07:00</published><updated>2009-03-23T18:03:04.823-07:00</updated><title type="text">OSX Performance Analysis: Instruments</title><content type="html">I started working with OSX's &lt;a href="http://developer.apple.com/documentation/DeveloperTools/Conceptual/InstrumentsUserGuide/Introduction/Introduction.html"&gt;Instruments&lt;/a&gt; performance analysis tool, partly out of curiosity and partly because I had just fixed a performance problem in an application using an ad hoc &lt;em&gt;a priori&lt;/em&gt; analysis. It happened to solve the problem, but I have enough experience with performance issues to know that the &lt;em&gt;a priori&lt;/em&gt; guess is often wrong.&lt;br /&gt;&lt;br /&gt;Instruments is heavily related to &lt;a href="http://en.wikipedia.org/wiki/DTrace"&gt;dtrace&lt;/a&gt; and shares a lot of its core attributes. The key attributes are that it is low overhead and works with (almost) anything running on your systems (OSX apparently has the capability for some applications to turn off monitoring for security/DRM reasons).&lt;br /&gt;&lt;br /&gt;There's a lot to like here: you can easily get it up and going on your system and it the analysis section is very user friendly:&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align:center;"&gt;&lt;a href="http://lh4.ggpht.com/_x3Qv8fFpuQg/Sb12SCVKTJI/AAAAAAAAANc/ERSxh7S7r5I/instruments_screen.jpg?imgmax=800" alt="instruments_screen.jpg"&gt;&lt;img src="http://lh6.ggpht.com/_x3Qv8fFpuQg/Sb12LP0QKfI/AAAAAAAAANY/Z8AabyYJxe8/blog__instruments_screen.jpg?imgmax=800" alt="blog__instruments_screen.jpg" border="0" width="300" height="211" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Especially nice features include &lt;UL&gt;&lt;LI&gt;Low overhead: the peak CPU usage I saw for the tool was ~ 16%&lt;/LI&gt;&lt;LI&gt;The ability to display exactly what is going on under the &lt;strong&gt;read head&lt;/strong&gt; (the upside down triangle above the graph)&lt;/LI&gt;&lt;LI&gt; Being able to display parameters that you didn't think of turning on during the run. All parameters are captured. The selection only impacts the display -- a godsend for anyone who has had to rerun a test because they forgot to capture a parameter&lt;/LI&gt;&lt;/UL&gt;&lt;br /&gt;That said, I couldn't get any particular instrument to focus only on the process specified. As you can see, all of the instruments capture all of the activity, even though they were set to focus on different processes. Additionally, the "default action" kept resetting whenever I dragged a new instrument onto the display.&lt;br /&gt;&lt;br /&gt;It is still a very worthwhile tool, but if anyone has any tips as to how to get around these issues, I'd appreciate it.&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4522919003955435321-8198218463232690636?l=rdfsg.blogspot.com'/&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://rdfsg.blogspot.com/feeds/8198218463232690636/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=4522919003955435321&amp;postID=8198218463232690636" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/4522919003955435321/posts/default/8198218463232690636" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/4522919003955435321/posts/default/8198218463232690636" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/SoftwareAndArchitecture/~3/VM3sQsAh_js/osx-performance-analysis-instruments.html" title="OSX Performance Analysis: Instruments" /><author><name>rdf</name><uri>http://www.blogger.com/profile/04410128869406318890</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="OpenSocialUserId" value="16845754167005561368" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://rdfsg.blogspot.com/2009/03/osx-performance-analysis-instruments.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-4522919003955435321.post-8772317947446322965</id><published>2009-03-04T18:26:00.001-08:00</published><updated>2009-03-04T18:26:56.702-08:00</updated><title type="text">Kindle</title><content type="html">It's a bit off topic, but I thought I'd point out how useful a &lt;a href="http://www.amazon.com/Kindle-Amazons-Wireless-Reading-Generation/dp/B00154JDAI/ref=amb_link_83624371_1?pf_rd_m=ATVPDKIKX0DER&amp;pf_rd_s=center-1&amp;pf_rd_r=0N6H9WJA3W78N3122NF5&amp;pf_rd_t=101&amp;pf_rd_p=469942651&amp;pf_rd_i=507846"&gt;Kindle&lt;/a&gt; can be for consulting. You can carry at least 500 reference books on it (and who needs more than 490 anyhow?). It is also very light and easy to read.&lt;br /&gt;&lt;br /&gt;I do have a couple of qualms. It is a page oriented display (no scrolling), no touchscreen and has no spatial indexing e.g., &lt;em&gt;the top side of the right page half way in&lt;/em&gt;, but other than that it's a win.&lt;br /&gt;&lt;br /&gt;An important note on utility: &lt;a href="http://oreilly.com/ebooks/"&gt;O'Reilly&lt;/a&gt; e books can be read on the Kindle. The truly great thing about O'Reilly's e-books is that you get both the Kindle compatible mobiPocket files and the more aesthetically pleasing PDF files (for me,  aesthetics matter--even in a SQL guide). &lt;br /&gt;&lt;br /&gt;You can mix and match reading and reference between the formats depending upon your preference. Thankfully the files aren't copy protected. Thanks,  O'Reilly, this is a very nice touch.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4522919003955435321-8772317947446322965?l=rdfsg.blogspot.com'/&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://rdfsg.blogspot.com/feeds/8772317947446322965/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=4522919003955435321&amp;postID=8772317947446322965" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/4522919003955435321/posts/default/8772317947446322965" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/4522919003955435321/posts/default/8772317947446322965" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/SoftwareAndArchitecture/~3/i_f6JDu64qg/kindle.html" title="Kindle" /><author><name>rdf</name><uri>http://www.blogger.com/profile/04410128869406318890</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="OpenSocialUserId" value="16845754167005561368" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://rdfsg.blogspot.com/2009/03/kindle.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-4522919003955435321.post-1803918442617895088</id><published>2009-02-17T08:56:00.001-08:00</published><updated>2009-02-17T08:56:59.404-08:00</updated><title type="text">Seambay modifications to access Seam Annotations </title><content type="html">This post extends my last one about &lt;a href="http://rdfsg.blogspot.com/2009/02/seam-from-command-line.html"&gt;accessing Seam from the command line&lt;/a&gt;. Here I describe the transition from using &lt;code&gt;EntityManager&lt;/code&gt; to using &lt;code&gt;EntityHome&lt;/code&gt;.&lt;br /&gt;&lt;br /&gt;The first thing I did was to create a new folder for the webSevice sources, which meant that I had to add this directory into the build.xml file and add all of the libraries into the compile path in NetBeans (both of which are obvious, but both of which I always forget to do).&lt;br /&gt;&lt;br /&gt;The next was to make my action work similarly to an .xhtml page and interact with a  &lt;em&gt;home&lt;/em&gt; object rather than directly with the EntityManager&lt;br /&gt;going from:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;      &lt;br /&gt;if (fileData == null) {&lt;br /&gt;            fileData = new FileData();&lt;br /&gt;            &lt;em&gt;// various actions on fileData&lt;/em&gt;&lt;br /&gt;            entityManager.persist(fileData);&lt;br /&gt;        }&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;to&lt;br /&gt;&lt;pre&gt;&lt;code&gt;       &lt;br /&gt;if (fileData == null) {&lt;br /&gt;            fileDataHome.create();&lt;br /&gt;            fileDataHome.persist(); //side effect of creating the defined instance&lt;br /&gt;            fileData = fileDataHome.getDefinedInstance();&lt;br /&gt;            &lt;em&gt;// various actions on fileData&lt;/em&gt;&lt;br /&gt;            fileDataHome.update();&lt;br /&gt;        }&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;which also required adding these lines to components.xml&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;xmlns:transaction=”http://jboss.com/products/seam/transaction”   &lt;br /&gt;....    &lt;br /&gt;&amp;lt;transaction:ejb-transaction/&amp;gt;  &lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;None of which was particularly difficult and I was up and running in a hour or so.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4522919003955435321-1803918442617895088?l=rdfsg.blogspot.com'/&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://rdfsg.blogspot.com/feeds/1803918442617895088/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=4522919003955435321&amp;postID=1803918442617895088" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/4522919003955435321/posts/default/1803918442617895088" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/4522919003955435321/posts/default/1803918442617895088" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/SoftwareAndArchitecture/~3/_oy-xt54VEY/seambay-modifications-to-access-seam.html" title="Seambay modifications to access Seam Annotations " /><author><name>rdf</name><uri>http://www.blogger.com/profile/04410128869406318890</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="OpenSocialUserId" value="16845754167005561368" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://rdfsg.blogspot.com/2009/02/seambay-modifications-to-access-seam.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-4522919003955435321.post-8844746419218783778</id><published>2009-02-02T17:36:00.001-08:00</published><updated>2009-02-02T17:36:41.806-08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="seam" /><category scheme="http://www.blogger.com/atom/ns#" term="jboss" /><title type="text">Seam From a Command Line</title><content type="html">I recently wanted to access some seam derived functionality from a command line java program (something that I could run via cron). I ran into a few minor problems and thought I'd share their solutions.&lt;br /&gt;&lt;br /&gt;The first problem was that seam annotations like &lt;code&gt;@Logger&lt;/code&gt; won't work. I guess it isn’t that surprising, but the jboss seam annotations are unavailable to a command line program (at least not easily) since the portions of the framework that enables these annotations are designed to operate within a server.&lt;br /&gt;&lt;br /&gt;This was disappointing. The &lt;code&gt;@Logger&lt;/code&gt; annotation is really useful, but I couldn't come up with a way to get it going.&lt;br /&gt;&lt;br /&gt;This pushed me into wanting to use web services as much as possible to take advantage of other annotations that I had built into my system, e.g., the ability to automatically stamp an object with &lt;em&gt;time modified&lt;/em&gt; and &lt;em&gt;time created&lt;/em&gt; to support &lt;a href="http://rdfsg.blogspot.com/2008/07/temporal-data.html"&gt;temporal data operations&lt;/a&gt;. &lt;br /&gt;&lt;br /&gt;I did not find the seam documentation about accessing seam web services particularly clear (especially when using netbeans) so I turned to the &lt;a href="http://www.netbeans.org/kb/55/websvc-jax-ws.html"&gt;netbeans tutorial&lt;/a&gt; and was quickly up and running with the seambay example. &lt;br /&gt;&lt;br /&gt;Note:&lt;br /&gt;&lt;UL&gt;The WSDL for the seambay example is found at (assuming your server is local &lt;strong&gt;and&lt;/strong&gt; you have deployed the seambay example) http://localhost:8080/jboss-seam-bay-jboss-seam-bay/AuctionService?wsdl&lt;br /&gt;&lt;br /&gt;An overview of all services at the host (again, assuming your server is local) appears at&lt;br /&gt;http://localhost:8080/jbossws/services.&lt;/UL&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4522919003955435321-8844746419218783778?l=rdfsg.blogspot.com'/&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://rdfsg.blogspot.com/feeds/8844746419218783778/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=4522919003955435321&amp;postID=8844746419218783778" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/4522919003955435321/posts/default/8844746419218783778" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/4522919003955435321/posts/default/8844746419218783778" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/SoftwareAndArchitecture/~3/3HO8Xy8YU_0/seam-from-command-line.html" title="Seam From a Command Line" /><author><name>rdf</name><uri>http://www.blogger.com/profile/04410128869406318890</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="OpenSocialUserId" value="16845754167005561368" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://rdfsg.blogspot.com/2009/02/seam-from-command-line.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-4522919003955435321.post-8861242408980788293</id><published>2009-01-05T18:10:00.001-08:00</published><updated>2009-01-05T18:10:19.448-08:00</updated><title type="text">Data Deduplication</title><content type="html">IEEE Computer recently published a short &lt;a href="http://www.computer.org/portal/cms_docs_computer/computer/homepage/Dec08/r12intr.pdf"&gt;survey&lt;/a&gt; on data deduplication. Conceptually &lt;a href="http://en.wikipedia.org/wiki/Deduplication"&gt;deduplication&lt;/a&gt; is isomorphic to the &lt;a href="http://rdfsg.blogspot.com/2008/12/name-that-data.html"&gt;named data &lt;/a&gt; approach I posted about a few weeks ago.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt; The vendors discussed include &lt;br /&gt;&lt;UL&gt;&lt;br /&gt;&lt;LI&gt;&lt;a href="http://www.emc.com/products/detail/software/avamar.htm"&gt;EMC&lt;/a&gt;&lt;/LI&gt;&lt;br /&gt;&lt;LI&gt;&lt;a href="http://www.exagrid.com/"&gt;ExaGrid&lt;/a&gt;&lt;/LI&gt;&lt;br /&gt;&lt;LI&gt;&lt;a href="http://www.falconstor.com/en/pages/index.cfm?pn=Deduplication&amp;bhcp=1"&gt;FalconStor&lt;/a&gt;&lt;/LI&gt;&lt;br /&gt;&lt;LI&gt;&lt;a href="http://www.necam.com/HYDRAstor/HYDRAstorWorks.cfm"&gt;NEC DataRedux&lt;/a&gt;&lt;/LI&gt;&lt;br /&gt;&lt;LI&gt;&lt;a href="http://www.quantum.com/Solutions/datadeduplication/Index.aspx"&gt;Quantum DXi&lt;/a&gt;&lt;/LI&gt;&lt;br /&gt;&lt;LI&gt;&lt;a href="http://www.sepaton.com/news/news_item.php?news_id=124"&gt;Sepaton DeltaStor&lt;/a&gt;&lt;/LI&gt;&lt;br /&gt;&lt;LI&gt;&lt;a href="http://www.symantec.com/business/resources/articles/article.jsp?aid=power_of_disk"&gt;Symantec&lt;/a&gt;&lt;/LI&gt;&lt;/UL&gt;&lt;br /&gt;&lt;div&gt;Since I'm not sure how long the pdf of the article will be available, I'm posting this as a follow up to my previous post.&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt; My preference would be to see these capabilities built right into the internet/operating systems rather than separate utility servers.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4522919003955435321-8861242408980788293?l=rdfsg.blogspot.com'/&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://rdfsg.blogspot.com/feeds/8861242408980788293/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=4522919003955435321&amp;postID=8861242408980788293" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/4522919003955435321/posts/default/8861242408980788293" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/4522919003955435321/posts/default/8861242408980788293" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/SoftwareAndArchitecture/~3/kEiJFiUd8w4/data-deduplication.html" title="Data Deduplication" /><author><name>rdf</name><uri>http://www.blogger.com/profile/04410128869406318890</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="OpenSocialUserId" value="16845754167005561368" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://rdfsg.blogspot.com/2009/01/data-deduplication.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-4522919003955435321.post-6726992157996770995</id><published>2008-12-23T18:20:00.001-08:00</published><updated>2008-12-23T18:20:07.415-08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="architecture" /><title type="text">Discussing Architecture</title><content type="html">If you're like me, you are forever grappling with finding the right format for discussing architecture with end users.&lt;br /&gt;&lt;br /&gt;There are the standard architectural diagrams, but they really don't capture: &lt;UL&gt;&lt;LI&gt;How the end users relate to the system&lt;/LI&gt;&lt;LI&gt; How all of the components are strung together to support the overall business processes&lt;/LI&gt; &lt;LI&gt;What artifacts (data, documents, etc.) are produced&lt;/LI&gt;  &lt;/UL&gt;&lt;br /&gt;&lt;br /&gt;I think there may finally be a "better mousetrap" available in  &lt;a href="http://www.archimate.org"&gt;ArchiMate&lt;/a&gt; which has a suitably small number of patterns/best practices that allow you to capture what's important in a large system at the appropriate level of detail. The most important aspect of ArchiMate is that it is a mixed mode modeling language with a distinctive, simple shape for each type of artifact.&lt;br /&gt;&lt;br /&gt;ArchiMate allows for &lt;a href="http://www.archimate.org/en/about_archimate/"&gt;seven different&lt;/a&gt; &lt;em&gt;types of things&lt;/em&gt;: Services, Processes, Organization, Products, Information, Infrastructure, Applications, and Functions.&lt;br /&gt;&lt;br /&gt;As of yet I am not completely clear on the breakdown of these categories and to be honest I'm not sure that it really matters. ArchiMate is a communication tool. If it helps you communicate, it has served its purpose. If your way of breaking down the architecture is slightly different from their recommendations (which I &lt;strong&gt;strongly&lt;/strong&gt; feel could use more examples) it may have no more impact than if your class structure for a domain is slightly different from someone else's. Don't get me wrong: I'm a big fan of standards when they have been properly vetted and heavily used, but until they hit that point it is important to be flexible in using them. Flexibility allows a standard to grow and cover a sufficient portion of the domain; otherwise it will wither from lack of use.&lt;br /&gt;&lt;br /&gt;The presentation format that speaks to me the most is  the layered diagram as shown on p 11(figure 12) of the &lt;a href="http://www.via-nova-architectura.org/magazine/magazine/enterprise-architecture-development-and-mode.html"&gt;Enterprise Architecture Development and Modelling&lt;/a&gt; paper. See below:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://lh3.ggpht.com/_uhpaSaKsmiM/SU7dEo460oI/AAAAAAAAAFQ/vm-L-kxaPHE/2007%20Lankhorst_P11.jpg"&gt;&lt;img src="http://lh4.ggpht.com/_uhpaSaKsmiM/SU7cn6X2hcI/AAAAAAAAAFE/6seiuSeyL8o/example_archimate_small.jpg?imgmax=800" alt="example_archimate_small.jpg" border="0" width="212" height="300" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Here's my simplified take for a clinical trial system used by physicians and patients.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://lh4.ggpht.com/_uhpaSaKsmiM/SU7czaMgmrI/AAAAAAAAAFM/ej-OnUOwF9Q/archimate.jpg"&gt;&lt;img src="http://lh5.ggpht.com/_uhpaSaKsmiM/SU7ctobUpyI/AAAAAAAAAFI/h7g9fd_QpaI/clinical_archimate_small.jpg?imgmax=800" alt="clinical_archimate_small.jpg" border="0" width="227" height="300" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;What I like about this format is that all of the elements on a particular layer are at the same level of abstraction and are easily placed in relationship to the other few things that are at that same abstraction level. Simultaneously, you can see what supports (and is supported by) a particular component. Each perspective (which appears on the same diagram) only requires concentrating on a small number things at a time and can easily be held in your short term memory.&lt;br /&gt;&lt;br /&gt;One of the key things about the layers is that they distinguish externally available from internally consumed data interfaces -- especially highlighting those that cross abstraction boundaries. These external interfaces are distinguished from those that support multiple applications at the same level in the stack. Such "external" interfaces (which are internal to a particular level of abstraction) are more easily altered since they are more tightly coupled organizationally. This nicely foregrounds the implication that care should be taken in designing the external, level crossing APIs and lifecycles since changes to them will be harder to coordinate given the diversity of the interested parties.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4522919003955435321-6726992157996770995?l=rdfsg.blogspot.com'/&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://rdfsg.blogspot.com/feeds/6726992157996770995/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=4522919003955435321&amp;postID=6726992157996770995" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/4522919003955435321/posts/default/6726992157996770995" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/4522919003955435321/posts/default/6726992157996770995" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/SoftwareAndArchitecture/~3/224_O0IGwWM/discussing-architecture.html" title="Discussing Architecture" /><author><name>rdf</name><uri>http://www.blogger.com/profile/04410128869406318890</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="OpenSocialUserId" value="16845754167005561368" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://rdfsg.blogspot.com/2008/12/discussing-architecture.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-4522919003955435321.post-8867007854969451661</id><published>2008-12-08T17:28:00.001-08:00</published><updated>2008-12-08T17:28:23.554-08:00</updated><title type="text">Name that data</title><content type="html">There is an interesting trend that I feel has the potential to fundamentally shift the way we think about how data is used in networking and applications.&lt;br /&gt;&lt;br /&gt;It involves attaching unique names to data, i.e., referring to the data by its SHA1 hash value. Unique identifiers allow a number of things. For example, they allow you to retrieve the data from the network without worrying where it resides on the network, as described in &lt;br /&gt;&lt;a href="http://video.google.com/videoplay?docid=-6972678839686672840&amp;hl=en"&gt;A New Way to look at Networking&lt;/a&gt; in which &lt;a href="http://en.wikipedia.org/wiki/Van_Jacobson"&gt;Van Jacobson&lt;/a&gt; discusses breaking out the content of the page from the page itself. &lt;br /&gt;&lt;p&gt;At 42:47 in the talk there's the section on &lt;br /&gt;&lt;em&gt;Dissemination networking&lt;/em&gt; &lt;blockquote&gt;in which &lt;br /&gt;data is requested, by name using any and all means available (IP, VON tunnels, zeroconf addresses, multicast, proxies, etc),&lt;br /&gt;Anything that hears the request and has a valid copy of the data can respond. The returned data is signed and optionally secured, so its integrity and association with the name name can be validated.&lt;/blockquote&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;Rather than getting all of the data from a particular location e.g., as specified by a URL, we get the identifier for the content of the data and then let the network supply the data from the location "nearest" (using the appropriate distance metric) to its use.&lt;br /&gt;&lt;br /&gt;A similar idea exists in &lt;a href="http://en.wikipedia.org/wiki/ZFS"&gt;ZFS'&lt;/a&gt; implementation of a copy-on-write transactional model:&lt;br /&gt;&lt;blockquote&gt;ZFS uses a copy-on-write transactional object model. All block pointers within the filesystem contain a 256-bit checksum of the target block which is verified when the block is read. Blocks containing active data are never overwritten in place; instead, a new block is allocated, modified data is written to it, and then any metadata blocks referencing it are similarly read, reallocated, and written.&lt;/blockquote&gt;&lt;br /&gt;This design allows small changes in large files to be reflected by changing &lt;em&gt;only the blocks that have been altered&lt;/em&gt; rather than by rewriting the whole file to a new location. This simplifies backup procedures, reduces R/W bandwidth requirements, etc. Part of what's significant here is that we're dealing with abstractions of the data, e.g., checksums rather than the data itself. If we use cryptographic hash functions rather than checksums the ideas become isomorphic aka, &lt;em&gt;get me this block from wherever it is&lt;/em&gt;.&lt;br /&gt;&lt;br /&gt;This has a number of potentially interesting applications depending on the granularity of the "named data". As a simple example, answering the obvious: "am I working with the copy of the file that was emailed to me last Friday, or an older version?" Even with coarse grain naming it would be possible to create mashups of music already on a users computer -- just transmitting offsets into and segment durations of existing content gets past &lt;a href="http://en.wikipedia.org/wiki/Digital_rights_management"&gt;DRM&lt;/a&gt; issues entirely (morally if not practically-- since much DRM protected media is encoded).&lt;br /&gt;&lt;br /&gt;Uniquely naming the content is not just about networking, nor is it just about data but is really about the cross product of the two: the data and its location/retrieval. Data location and retrieval is most of what is involved in computing: unless data is being actively processed by a computational unit (in this case, I'm talking about the integer and floating point units on the chip) the rest of "computation" is about the retrieval and storage of data e.g., do I put this in a frame buffer, in the cloud or in a shredder?&lt;br /&gt;&lt;br /&gt;Imagine an ecosystem of data that represents everything that you own/care about -- you could partition this data into multiple overlapping categories based on any number of attributes such as:&lt;br /&gt;&lt;UL&gt;&lt;LI&gt;&lt;strong&gt;&lt;em&gt;temporary:&lt;/em&gt;&lt;/strong&gt;&lt;em&gt;&lt;/em&gt; make no copies&lt;/LI&gt;&lt;br /&gt;&lt;LI&gt;&lt;strong&gt;&lt;em&gt;pieces of a larger whole:&lt;/em&gt;&lt;/strong&gt;&lt;em&gt;&lt;/em&gt; applications would minimize the number of named datasets that they change when they perform updates e.g., editing out that first minute from your video won't change every block of the video.&lt;br /&gt;&lt;/LI&gt;&lt;br /&gt;&lt;LI&gt;&lt;b&gt;&lt;i&gt;number of independently survivable copies required&lt;/i&gt;&lt;/b&gt;, with what longevity?&lt;br /&gt;&lt;/LI&gt;&lt;LI&gt;&lt;b&gt;&lt;i&gt;coupling the data to geographic position:&lt;/i&gt;&lt;/b&gt; How closely should the data follow me as I move around the planet? Can it stay where I put it, or should it go where I go and be available for high bandwidth processing.&lt;/LI&gt;&lt;/UL&gt;&lt;br /&gt;&lt;br /&gt;This are just my first pass ideas. This concept of divorcing the data off from its location and higher level structural organization opens up the potential for a whole new set of applications which provide enhanced user functionality by pushing a lot of these data management, replication and caching issues deep into the infrastructure.&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4522919003955435321-8867007854969451661?l=rdfsg.blogspot.com'/&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://rdfsg.blogspot.com/feeds/8867007854969451661/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=4522919003955435321&amp;postID=8867007854969451661" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/4522919003955435321/posts/default/8867007854969451661" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/4522919003955435321/posts/default/8867007854969451661" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/SoftwareAndArchitecture/~3/vDGNzlHp8Qw/name-that-data.html" title="Name that data" /><author><name>rdf</name><uri>http://www.blogger.com/profile/04410128869406318890</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="OpenSocialUserId" value="16845754167005561368" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://rdfsg.blogspot.com/2008/12/name-that-data.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-4522919003955435321.post-5447325946630154298</id><published>2008-11-24T17:33:00.001-08:00</published><updated>2008-11-24T17:33:35.223-08:00</updated><title type="text">Semantic Interoperability: from Mashups to Inference</title><content type="html">My &lt;a href="http://rdfsg.blogspot.com/2008/11/semantic-interoperability-adverse.html"&gt;last post&lt;/a&gt; looked at semantic interoperability from the standpoint of the &lt;a href="http://bridgmodel.org/"&gt;CDISC BRIDG model&lt;/a&gt;. Thinking back on it, I found that writing it left me with more questions than I had before I started.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;I have to admit to being unclear as to what is meant by “semantic interoperability,” since I have heard it used in a number of different ways depending upon the audience. (apparently I’m not the only one: the &lt;a href="http://en.wikipedia.org/wiki/Semantic_interoperability"&gt;wikipedia entry on semantic interoperability&lt;/a&gt; has the caveat &lt;b&gt;&lt;i&gt;All or part of this article may be confusing or unclear&lt;/i&gt;&lt;/b&gt;.) &lt;br /&gt;&lt;br /&gt;"Semantic interoperability" puts requirements on the data, on the models, and on the processes of using them. How we respond to those requirements implies different interpretations of what it means to be &lt;em&gt;semantically interoperable.&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;I think that there are three basic ways of using data that are "semantically interoperable". &lt;br /&gt;&lt;UL&gt;&lt;LI&gt;“hands-off” data integration between designated well curated systems--this is the way in which I think it is used most often.&lt;/LI&gt; &lt;br /&gt;&lt;LI&gt;“hands-off” data integration between any systems sharing common identifiers e.g., publish an interface and allow anyone to use it.&lt;/LI&gt;&lt;br /&gt;&lt;UL&gt;&lt;LI&gt;The dual use of integration with any published interface that provides the data that you're looking for - which I think is less common e.g., I'll use any map, or any book information service rather than Google/Amazon (or Yahoo/BN). &lt;em&gt;I haven't seen this that often and I think it sounds a bit sketchy.&lt;/em&gt;&lt;/LI&gt;&lt;/UL&gt;&lt;br /&gt;&lt;LI&gt;Using OWL reasoners etc. for inference across systems to generate new information.&lt;/LI&gt;&lt;/UL&gt;&lt;br /&gt;The requirements around these things are pretty different, both in data quality and in the congruence of the requisite component models.&lt;br /&gt;&lt;br /&gt;The first &lt;em&gt;“hands-off” data integration between any systems sharing common identifiers&lt;/em&gt; doesn't really require any similarity of models other than around the key integration point(s). You need the &lt;em&gt;&lt;strong&gt;name of the referent&lt;/strong&gt;&lt;/em&gt; of the data, the &lt;em&gt;&lt;strong&gt;name of the data item&lt;/strong&gt;&lt;/em&gt; and the &lt;em&gt;&lt;strong&gt;format of the returned data&lt;/strong&gt;&lt;/em&gt; e.g., &lt;em&gt;"The first president of the United States"&lt;/em&gt;; &lt;em&gt;"date of birth"&lt;/em&gt; returned in &lt;em&gt;ISO 8601&lt;/em&gt; format. Of course the more points that you want to make referenceable between the systems, the more the models have to match e.g., your model of US presidents has to contain a way of dereferencing the person and that person's date of birth. The more independently developed and maintained your systems are, the more quickly you want to start using RDF to give you very stable identifiers for your referents. &lt;br /&gt;&lt;br /&gt;If the systems are required to do some curation/analysis of the data, the exported models need to match more closely so that you can derive the correct metrics to perform the analysis and understand the relationships between individual data points. A good example of this comes from &lt;a href="http://blogs.msdn.com/nickmalik/archive/2007/10/19/soa-in-the-coordination-model.aspx"&gt;Nick Malik&lt;/a&gt; who points out &lt;blockquote&gt;So, if you look in a database and you see a purchase order... has it been approved or not?  The answer depends on the business unit that created it.&lt;/blockquote&gt;&lt;br /&gt;Your models can be in a number of different forms (UML, OWL, etc.) and be wildly divergent from the underlying reality, but if the delusion is shared you can achieve some synergy. &lt;br /&gt;&lt;br /&gt;Inference of course requires (at least) a locally full up OWL ontology since that's the only modelling language that permits inference. Models also have to more closely resemble the shared "current best understanding" of reality (which is of course a moving target in a scientific domain) or the resulting inferences will be worthless, or at best amusing.&lt;br /&gt;&lt;br /&gt;However, doing an ontology is a big deal (see &lt;a href="http://bioontology.org/wiki/images/f/f0/OntologyJoy.ppt"&gt;The Joy of Ontology&lt;/a&gt; by Suzanna Lewis for a discussion). The increment of commitment that we're making here is decidedly non-trivial, especially if the domain that we are trying to model is of substantial size. &lt;br /&gt;&lt;br /&gt;I think the clinical trial domain is a good example of &lt;strong&gt;substantial size&lt;/strong&gt;. BRIDG took a long time to do, it is still undergoing revision and does not allow inference. I would argue that  given the continued refinement of some of the base terms (&lt;a href="https://cabig.nci.nih.gov/workspaces/VCDE/Data_Standards/"&gt;sex and gender were recently updated&lt;/a&gt;), even if there was an ontology, hands-off inference is not something that lies in the near future, simply because the ground doesn't provide a sufficiently firm foundation. &lt;br /&gt;&lt;br /&gt;Just for clarity -- this doesn't mean that turning loose an inferencing bot over a sufficiently sized test set would not yield interesting and perhaps even transformative results. It just means that the inferencing would be part of a web research project rather than a production operation.&lt;br /&gt;&lt;br /&gt;I could be wrong on this (and gladly so), but I did live through AI winter an I can no longer utter the phrase "sufficiently smart compiler" without irony.&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4522919003955435321-5447325946630154298?l=rdfsg.blogspot.com'/&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://rdfsg.blogspot.com/feeds/5447325946630154298/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=4522919003955435321&amp;postID=5447325946630154298" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/4522919003955435321/posts/default/5447325946630154298" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/4522919003955435321/posts/default/5447325946630154298" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/SoftwareAndArchitecture/~3/zPMhVQ8PE7w/semantic-interoperability-from-mashups.html" title="Semantic Interoperability: from Mashups to Inference" /><author><name>rdf</name><uri>http://www.blogger.com/profile/04410128869406318890</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="OpenSocialUserId" value="16845754167005561368" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://rdfsg.blogspot.com/2008/11/semantic-interoperability-from-mashups.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-4522919003955435321.post-1475837687485740497</id><published>2008-11-11T10:28:00.001-08:00</published><updated>2008-11-11T10:28:31.036-08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="data integration" /><category scheme="http://www.blogger.com/atom/ns#" term="CDISC" /><title type="text">Semantic Interoperability: Adverse Events</title><content type="html">When reviewing the  &lt;em&gt;Bridg Release 2.0 Static Elements report.RTF&lt;/em&gt; I did look in a bit of detail at the adverse event model.&lt;br /&gt;&lt;br /&gt;Here's a summary:&lt;br /&gt;&lt;br /&gt;The &lt;code&gt;AdverseEvent&lt;/code&gt;&lt;br /&gt;class is decribed as having the following connections and attributes&lt;br /&gt;&lt;br /&gt;Connections &lt;br /&gt;&lt;UL&gt;&lt;br /&gt;&lt;LI&gt;Association link from class &lt;code&gt;PerformedProductInvestigation&lt;/code&gt;&lt;br /&gt;&lt;/LI&gt;&lt;br /&gt;&lt;LI&gt;Association link from class &lt;code&gt;Subject&lt;/code&gt;&lt;br /&gt;&lt;/LI&gt;&lt;br /&gt;&lt;LI&gt;Association link to class &lt;code&gt;AEOutcomeAssessmentRelationship&lt;/code&gt;&lt;br /&gt;&lt;/LI&gt;&lt;LI&gt;Association link to class &lt;code&gt;AECausalityAssessmentRelationship&lt;/code&gt;&lt;br /&gt;&lt;/LI&gt;Association link to class &lt;code&gt;AEActionTakenRelationship&lt;/code&gt;&lt;br /&gt;&lt;LI&gt;Generalization link to class &lt;code&gt;PerformedObservationResult&lt;/code&gt;&lt;br /&gt;&lt;/LI&gt;&lt;br /&gt;&lt;LI&gt;Association link from class &lt;code&gt;PerformedProductInvestigation&lt;/code&gt;&lt;br /&gt;&lt;/LI&gt;&lt;br /&gt;&lt;LI&gt;Generalization of &lt;code&gt;PerformedActivity&lt;/code&gt; adding an &lt;code&gt;evaluationMethodCode&lt;/code&gt; attribute; &lt;code&gt;PerformedActivity&lt;/code&gt; captures the duration of the activity&lt;/LI&gt;&lt;br /&gt;&lt;LI&gt;Association link from class &lt;code&gt;Subject&lt;/code&gt; -- the clinical subject (An entity of interest, either biological or otherwise.)&lt;br /&gt;&lt;/LI&gt;&lt;br /&gt;&lt;LI&gt;Association link to class &lt;code&gt;AEOutcomeAssessmentRelationship&lt;/code&gt;&lt;br /&gt;links the AE to an observation&lt;br /&gt;&lt;div&gt;For example, recovered/resolved, recovering/resolving, not recovered/not resolved, recovered/resolved with &lt;br /&gt;sequelae, fatal or unknown&lt;/div&gt;&lt;/LI&gt;&lt;br /&gt;&lt;LI&gt;Association link to class &lt;code&gt;AECausalityAssessmentRelationship&lt;/code&gt;&lt;br /&gt;links the ae to an observation.&lt;div&gt; For example, when an adverse event occurs, a physician may evaluate interventions that may have caused the &lt;br /&gt;adverse event.&lt;/div&gt;&lt;/LI&gt;&lt;br /&gt;&lt;LI&gt;Association link to class &lt;code&gt;AEActionTakenRelationship&lt;/code&gt;.&lt;br /&gt;Specifies the link between an adverse event and the steps performed to address it.&lt;br /&gt;&lt;div&gt;For example, study dose reduced, protocol treatment change, etc.&lt;br /&gt;&lt;/div&gt;&lt;/LI&gt;&lt;br /&gt;&lt;LI&gt;Generalization link to class &lt;code&gt;PerformedObservationResult&lt;/code&gt;&lt;br /&gt;links all observations/protocol deviations etc together with a report.&lt;/LI&gt;&lt;br /&gt;&lt;/UL&gt;&lt;br /&gt;The AE itself has the attributes:&lt;br /&gt;&lt;UL&gt;&lt;LI&gt; &lt;code&gt;gradeCode&lt;/code&gt; &lt;br /&gt;&lt;/LI&gt; &lt;br /&gt;&lt;LI&gt;&lt;code&gt;severityCode&lt;/code&gt; &lt;br /&gt;&lt;/LI&gt;&lt;LI&gt; &lt;code&gt;seriousnessCode&lt;/code&gt; &lt;br /&gt;&lt;/LI&gt; &lt;br /&gt;&lt;LI&gt;&lt;code&gt;occurrencePatternCode&lt;/code&gt; &lt;br /&gt;&lt;/LI&gt;&lt;LI&gt; &lt;code&gt;unexpectedReasonCode&lt;/code&gt;&lt;/LI&gt;&lt;br /&gt;&lt;LI&gt; &lt;code&gt;expectedIndicator&lt;/code&gt;&lt;/LI&gt; &lt;br /&gt;&lt;LI&gt; &lt;code&gt;highlightedIndicator&lt;/code&gt; &lt;br /&gt;&lt;/LI&gt;&lt;LI&gt; &lt;code&gt;hospitalizationRequiredIndicator&lt;/code&gt; &lt;/LI&gt;&lt;br /&gt;&lt;LI&gt; &lt;code&gt;onsetDate&lt;/code&gt; &lt;br /&gt;&lt;/LI&gt;&lt;LI&gt; &lt;code&gt;resolutionDate&lt;/code&gt; &lt;/LI&gt;&lt;br /&gt;&lt;/UL&gt;&lt;br /&gt;The end result is a structure that has a formal relationship that is well thought out, should cover all situations and permits systems to interoperate. &lt;br /&gt;&lt;br /&gt;In my mind, this is not the same as assuring &lt;strong&gt;semantic interoperabillity&lt;/strong&gt;. For semantic interoperability to really occur, the grade codes must be comparable across sites, hospitalization criteria must be identical (or at least commensurable) etc.. Achieving this comparability requires continuing education and harmonization efforts, constant feedback of metrics to practitioners etc.. It therefore represents a much higher bar.&lt;br /&gt;&lt;br /&gt;This is not in any way a criticism of BRIDG. You need something like BRIDG -- a  well vetted industry standard -- to be even be able to begin such an attempt. However, true semantic interoperability involves not only the structure of the data, but the data itself.&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4522919003955435321-1475837687485740497?l=rdfsg.blogspot.com'/&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://rdfsg.blogspot.com/feeds/1475837687485740497/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=4522919003955435321&amp;postID=1475837687485740497" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/4522919003955435321/posts/default/1475837687485740497" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/4522919003955435321/posts/default/1475837687485740497" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/SoftwareAndArchitecture/~3/bQ-EjvKvc3c/semantic-interoperability-adverse.html" title="Semantic Interoperability: Adverse Events" /><author><name>rdf</name><uri>http://www.blogger.com/profile/04410128869406318890</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="OpenSocialUserId" value="16845754167005561368" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://rdfsg.blogspot.com/2008/11/semantic-interoperability-adverse.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-4522919003955435321.post-4179442749587789714</id><published>2008-10-27T18:52:00.001-07:00</published><updated>2008-10-27T18:52:02.425-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="data integration" /><category scheme="http://www.blogger.com/atom/ns#" term="CDISC" /><title type="text">CDISC/BRIDG</title><content type="html">Last month I attended the Boston Area CDISC Users group meeting (BACUN). All of the presentations were interesting and useful. However, I found that the one by Lisa Chatterjee on BRIDG stood out as particularly informative.&lt;br /&gt;&lt;br /&gt;The  &lt;a href="http://bridgmodel.org/"&gt;BRIDG&lt;/a&gt; Domain Analysis Model is a representation of protocol-driven biomedical/clinical research.&lt;br /&gt;&lt;br /&gt;One of the goals of the effort is Semantic Interoperability - I don't think that this means that "following the model" guarantees semantic interoperability, but rather that BRIDG constitutes a starting point from which a semantically commensurable system can be built. The bridge team appears to view the model as a foundation for other more problem specific representations (CDISC/HL7 etc.). The idea being that if you can map BRIDG &lt;-&gt; HL7 and BRIDG &lt;-&gt; CSDISC the HL7 &lt;-&gt; CDISC mapping is (relatively) straightforward.&lt;br /&gt;&lt;br /&gt;There is no question that BRIDG represents an excellent starting place for using data in an interoperable fashion.&lt;br /&gt;All in all it shows a &lt;strong&gt;&lt;em&gt;very inclusive approach&lt;/em&gt;&lt;/strong&gt;&lt;br /&gt; -- and a surprising openness to modifying the model to ameliorate difficulties encountered in use.&lt;br /&gt;&lt;br /&gt;The core modeling language is UML and spreadsheets are used to track much of the mapping (there already is a draft version of a spreadsheet that maps the BRIDG R2.0 model to RIM2.18).&lt;br /&gt;&lt;br /&gt;From the presentation:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://lh5.ggpht.com/rdf541/SP4Ggce1c2I/AAAAAAAAAE8/HsLh1IPT0PI/Use_of_bridge.png"&gt;&lt;img src="http://lh4.ggpht.com/rdf541/SP4IzPMhWTI/AAAAAAAAAFA/djExRoKkg4M/bridg_slide_sm.jpg?imgmax=800" alt="bridg_slide_sm.jpg" border="0" width="300" height="222" /&gt;&lt;br /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;I have to admit that I haven't examined the model in complete detail. However, from what I've seen almost everything that you need for the target domain is there and the level of abstraction feels right: low enough to be relatively easy to implement, but high enough so that you don't get wedged into a corner from the get-go.&lt;br /&gt;&lt;br /&gt;I did look in a bit of detail at the adverse event model,which is represented in the &lt;em&gt;Bridg Release 2.0 Static Elements report.RTF&lt;/em&gt;.&lt;br /&gt;&lt;br /&gt;What we see in &lt;b&gt;&lt;i&gt;Figure 5 : View 4 - Adverse Event&lt;/i&gt;&lt;/b&gt; is ~ 90% of the complete domain model with a number of classes added in support of recording adverse events and tracking their eventual analysis/resolution.&lt;br /&gt;&lt;br /&gt;Since adverse events raise some issues about semantic interoperabiltity that I want to talk about in detail I will cover them in my next post.&lt;br /&gt;&lt;br /&gt;BTW on my mac, the only application that could open the .rtf file with the figures was &lt;a href="http://www.openoffice.org/"&gt;open office 3&lt;/a&gt;.  MS word 2004 elided the figures.&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4522919003955435321-4179442749587789714?l=rdfsg.blogspot.com'/&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://rdfsg.blogspot.com/feeds/4179442749587789714/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=4522919003955435321&amp;postID=4179442749587789714" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/4522919003955435321/posts/default/4179442749587789714" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/4522919003955435321/posts/default/4179442749587789714" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/SoftwareAndArchitecture/~3/orTkaqhL5qY/cdiscbridg.html" title="CDISC/BRIDG" /><author><name>rdf</name><uri>http://www.blogger.com/profile/04410128869406318890</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="OpenSocialUserId" value="16845754167005561368" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">1</thr:total><feedburner:origLink>http://rdfsg.blogspot.com/2008/10/cdiscbridg.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-4522919003955435321.post-8358273264837594624</id><published>2008-10-13T20:24:00.001-07:00</published><updated>2008-10-13T20:24:19.592-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="seam" /><title type="text">Seam: the ftl advantage</title><content type="html">I finished the first pass schema for the &lt;a href="http://rdfsg.blogspot.com/2008/02/extensible-system-for-discovery-data.html"&gt;flexible drug discovery framework&lt;/a&gt; and pointed the most recent (&lt;a href="https://sourceforge.net/project/showfiles.php?group_id=22866&amp;package_id=163777&amp;release_id=602455"&gt;2.02&lt;/a&gt;) GA release of &lt;a href="http://www.jboss.com/products/seam"&gt;Seam&lt;/a&gt; at the database. &lt;br /&gt;&lt;br /&gt;My hope was that it would produce pages with the latest &lt;a href="http://rdfsg.blogspot.com/2008/07/richfacesdatatablecolumn-sortby.html"&gt;ajax-friendly table sorting headers&lt;/a&gt; -- sadly it didn't. In addition, this version retains the practice of generating pages that use labels and column headers wired to a particular language (English) rather than allowing the headers to be language dependent messages, even though the pages fully support localization (via language specific message_x.properties files in the resources directory).&lt;br /&gt;&lt;br /&gt;I was in the process of fixing these issues manually via emacs using &lt;a href="http://xahlee.org/emacs/find_replace_inter.html"&gt;these instructions&lt;/a&gt; (I find that emacs makes it easier to select the files that I want to edit -- Netbeans picks up too many files and deselecting 70 or so "extra" files is too much work). While making these changes, I was discussing a new system with one of my clients and recommended that they consider an open source solution since they could change it (or hire somebody to change it) if at some point they encountered something that they didn't like. I thought this better than the alternative of waiting for a potentially unresponsive vendor to pay attention to their problem.&lt;br /&gt;&lt;br /&gt;As was saying this, I thought to myself: "Seam is open source, maybe I should try to fix the code rather than edit the result." I'm usually hesitant to go down this path. Sometimes it works, but my &lt;em&gt;a priori &lt;/em&gt;estimate is that the process of understanding the code structure, getting the build environment running etc. costs a day (or more) before anything productive comes out the other end.&lt;br /&gt;&lt;br /&gt;However, as a proof of principle,  I thought I should give it a try and see how it went.&lt;br /&gt;&lt;br /&gt;I'm very happy to report that given a combination of good architecture and good tool selection on the part of the Seam team, making these modifications was almost trivial. &lt;br /&gt;&lt;br /&gt;Let me explain why, and encourage you to "do this at home."&lt;br /&gt;The core reason is that the &lt;a href="http://docs.jboss.org/tools/2.0.0.GA/seam/en/html/generate_entities.html"&gt;seam generate-entities&lt;/a&gt; command operates in a number of phases, one of which generates the .xml and .xhtml files using &lt;a href="http://freemarker.org/"&gt;freemarker template&lt;/a&gt; files (&lt;code&gt;.ftl&lt;/code&gt;). This allows the required changes to be made without either looking at the java involved or developing any understanding of the calling structure, etc.&lt;br /&gt;&lt;br /&gt;The &lt;code&gt;.ftl&lt;/code&gt; files (in &lt;code&gt;./seam-gen/view/&lt;/code&gt;) are pretty much self-documenting (which is handy, given the level of documentation included in the files) and very easy to change -- errors thrown by the freemarker engine are clear and easy to work with.&lt;br /&gt;&lt;br /&gt;A couple of (minor) caveats &lt;br /&gt;&lt;UL&gt;&lt;LI&gt;The &lt;code&gt;.java&lt;/code&gt; files in the &lt;code&gt;src/action&lt;/code&gt; will need to be removed between runs of &lt;code&gt;seam generate-entities.&lt;/code&gt;&lt;br /&gt;&lt;/LI&gt;&lt;LI&gt;I think it is a good idea to point the seam generator at a different target directory (specified by &lt;code&gt;./seam-gen/build.properties&lt;/code&gt; -- "&lt;code&gt;workspace.home&lt;/code&gt;") while debugging so that you don't accidentally overwrite edits that you've already made (oddly I thought of this BEFORE I ran the generator)&lt;/LI&gt;&lt;br /&gt;&lt;/UL&gt;&lt;br /&gt;&lt;br /&gt;In summary, if you find yourself making a lot of changes to seam generated files, change the .ftl files instead; it can be &lt;b&gt;&lt;i&gt;much, much easier.&lt;/i&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4522919003955435321-8358273264837594624?l=rdfsg.blogspot.com'/&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://rdfsg.blogspot.com/feeds/8358273264837594624/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=4522919003955435321&amp;postID=8358273264837594624" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/4522919003955435321/posts/default/8358273264837594624" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/4522919003955435321/posts/default/8358273264837594624" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/SoftwareAndArchitecture/~3/VB1gP7SHSBc/seam-ftl-advantage.html" title="Seam: the ftl advantage" /><author><name>rdf</name><uri>http://www.blogger.com/profile/04410128869406318890</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="OpenSocialUserId" value="16845754167005561368" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://rdfsg.blogspot.com/2008/10/seam-ftl-advantage.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-4522919003955435321.post-1615780743855561545</id><published>2008-09-29T07:21:00.001-07:00</published><updated>2008-09-29T07:21:56.996-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="mysql" /><title type="text">Suddenly mysql won't start</title><content type="html">&lt;em&gt;Suddenly&lt;/em&gt; is a bit of an exaggeration. This happened on my desktop -- I use mysql on my laptop almost daily, but only once every few months my desktop. They are similar environments: latest Mac OSX 10.5 patched intel based macs. The mysql on the desktop was transferred from my previous PowerPc based desktop, but has been used a few times since the transfer.&lt;br /&gt;&lt;br /&gt;In any case, the normal startup action&lt;br /&gt;&lt;code&gt; sudo /usr/local/mysql/bin/mysqld_safe&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;failed with the following output.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;code&gt;Starting mysqld daemon with databases from /usr/local/mysql/data&lt;br /&gt;&lt;br /&gt;/usr/local/mysql/bin/mysqld_safe: line 395: /usr/local/var/: Is a directory&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;/usr/local/mysql/bin/mysqld_safe: line 401: /usr/local/var/: Is a directory&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;STOPPING server from pid file /usr/local/mysql/data/rdf-8-Tower.local.pid&lt;br /&gt;&lt;br /&gt;tee: /usr/local/var/: Is a directory&lt;br /&gt;&lt;br /&gt;080910 15:39:05  mysqld ended&lt;br /&gt;&lt;br /&gt;tee: /usr/local/var/: Is a directory&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;At this point I said to myself "well this hasn't been upgraded in a while, I should upgrade mysql" &lt;strong&gt;!!bad idea!!&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;The upgrade didn't solve the problem. After tracing through the script in more detail I did a &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;code&gt;sudo ./my_print_defaults&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt; &lt;br /&gt;which reminded me that &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;code&gt;Default options are read from the following files in the given order:&lt;br /&gt;&lt;br /&gt;/etc/my.cnf /usr/local/mysql/etc/my.cnf ~/.my.cnf&lt;/code&gt; &lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;/etc/my.cnf contained&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;code&gt;[mysqld]&lt;br /&gt;&lt;br /&gt;log = /usr/local/var/mysqlLOG.log&lt;br /&gt;&lt;br /&gt;#If no specific storage engine/table type is defined in an SQL-Create statement the default type will be used.&lt;br /&gt;&lt;br /&gt;default-storage-engine=myisam&lt;br /&gt;&lt;br /&gt;max_allowed_packet = 16M&lt;br /&gt;&lt;br /&gt;#Enter a name for the error log file. Otherwise a default name will be used.&lt;br /&gt;&lt;br /&gt;log-error=/usr/local/var/&lt;br /&gt;&lt;br /&gt;#Enter a name for the slow query log. Otherwise a default name will be used.&lt;br /&gt;&lt;br /&gt;log-slow-queries=/usr/local/var/&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;&lt;/blockquote&gt;&lt;br /&gt;Which I changed to &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;code&gt;[mysqld]&lt;br /&gt;&lt;br /&gt;log = /usr/local/var/mysqlLOG.log&lt;br /&gt;&lt;br /&gt;#If no specific storage engine/table type is defined in an SQL-Create statement the default type will be used.&lt;br /&gt;&lt;br /&gt;default-storage-engine=myisam&lt;br /&gt;&lt;br /&gt;max_allowed_packet = 16M&lt;br /&gt;&lt;br /&gt;#Enter a name for the error log file. Otherwise a default name will be used.&lt;br /&gt;&lt;br /&gt;log-error=/usr/local/mysql_ERROR_LOG.log&lt;br /&gt;&lt;br /&gt;#Enter a name for the slow query log. Otherwise a default name will be used.&lt;br /&gt;&lt;br /&gt;log-slow-queries=/usr/local/var/mysql_SLOW_l_LOG.log&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;&lt;code&gt; /usr/local/mysql/etc/my.cnf&lt;br /&gt;&lt;/code&gt;didn't exist, nor did&lt;br /&gt;&lt;code&gt;~/.my.cnf&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;This allowed the db to start but I couldn't log in with any of the user accounts normally available (including root). It appears that using the &lt;code&gt;mysql-5.0.67-osx10.5-x86.dmg&lt;/code&gt; file to update caused the db user information to get hosed.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;br /&gt;Fortunately I'm pretty neurotic about backups and so I easily recovered just by copying /usr/local/* from my last backup. &lt;br /&gt;&lt;br/&gt;&lt;br /&gt;&lt;strong&gt;NOTE:&lt;/strong&gt; this backup was to a separate disk performed using &lt;a href="http://www.shirt-pocket.com/SuperDuper/SuperDuperDescription.html"&gt;SuperDuper&lt;/a&gt; -- &lt;a href="http://www.apple.com/macosx/features/timemachine.html"&gt;TimeMachine&lt;/a&gt; isn't going to get files in /usr (which helps explain why the disk space used by TimeMachine is smaller than I expected). &lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4522919003955435321-1615780743855561545?l=rdfsg.blogspot.com'/&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://rdfsg.blogspot.com/feeds/1615780743855561545/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=4522919003955435321&amp;postID=1615780743855561545" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/4522919003955435321/posts/default/1615780743855561545" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/4522919003955435321/posts/default/1615780743855561545" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/SoftwareAndArchitecture/~3/3tYA9pAHlgc/suddenly-mysql-won-start.html" title="Suddenly mysql won&amp;#39;t start" /><author><name>rdf</name><uri>http://www.blogger.com/profile/04410128869406318890</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="OpenSocialUserId" value="16845754167005561368" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://rdfsg.blogspot.com/2008/09/suddenly-mysql-won-start.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-4522919003955435321.post-2948085440037304221</id><published>2008-09-15T17:41:00.001-07:00</published><updated>2008-09-15T17:45:49.419-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="seam" /><category scheme="http://www.blogger.com/atom/ns#" term="Amazon Web Services" /><category scheme="http://www.blogger.com/atom/ns#" term="jboss" /><title type="text">Seam on Amazon EC2</title><content type="html">I just completed putting up a demo of my seam work on &lt;a href="http://www.amazon.com/gp/browse.html?node=3435361"&gt;Amazon Web Services &lt;/a&gt; EC2 service. I primarily did this to ground my advocacy of EC2 as a good option for small biotechs that may need occasional bursts of compute power but have neither the cash to buy adequate servers for peak compute load nor the staff to maintain them.&lt;br /&gt;&lt;br /&gt;I thought that putting up my jboss/seam/mysql demo would also be sufficiently non-trivial to give me a good feel of what it is like.&lt;br /&gt;&lt;br /&gt;There are similarities between EC2 and other virtualization options (EC2&lt;a href="http://www.virtualization.info/2006/08/amazon-launches-xen-powered-virtual.html"&gt; is based on XEN&lt;/a&gt; after all).&lt;br /&gt;&lt;br /&gt;The core differences in my mind revolve around having S3 as a backing store. Since S3 is on Amazon's servers you need to pay more attention to security keys etc.&lt;br /&gt;&lt;br /&gt;My recommendation is the go through the &lt;a href="http://docs.amazonwebservices.com/AWSEC2/2008-02-01/GettingStartedGuide/"&gt;Getting Started Guide&lt;/a&gt; -- even to the point of saving a modified image. This will assure that you have the proper accounts set up both on EC2 and S3 and you have a bucket set up on S3 for storing your image.&lt;br /&gt;&lt;br /&gt;I found it easiest to create a bucket using the &lt;a href="http://aws.krugle.com/kse/projects/gMHDggx#2"&gt;Python&lt;/a&gt; examples -- even though I have never done much more than a "hello world" program in python (yes one that consists of &lt;br /&gt;&lt;code&gt;#!/usr/bin/env python&lt;br /&gt;print "Hello World"&lt;/code&gt;). The python code is the most self contained and required the fewest downloads of ancillary libraries in my environment (Apple OSX 10.5.4)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Building and saving an image takes a while -- I would recommend doing a reboot of your virtual machine to make sure that all of the changes take hold (boot processes start as designed etc.).&lt;br /&gt;&lt;br /&gt;Not to overstate the obvious, but the image that you start with has a tremendous impact on the time it takes you to get up and running. I settled upon an &lt;a href="http://developer.amazonwebservices.com/connect/entry.jspa?externalID=1523&amp;categoryID=101"&gt;image&lt;/a&gt; that already had mysql5, jboss 4.2.2 installed, and it made things much easier. In general I didn't feel that the images were particularly well documented. Not being that familiar with Fedora I thought that the difference bettween the Fedora-core-4 and fedora-core-8 was how many CPU cores they were optimized for, not the revision number. My initial foray with the fedora-core-4 image stopped when I realized that it had mysql4 rather than mysql 5.&lt;br /&gt;&lt;br /&gt;All in all the experience wasn't too bad (I don't think that I could ever call one of these experiences "good" -- if it were good I would just be able to click a "do it" button that would do exactly what I wanted), and would have been much better if I hadn't "lost my keys".&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4522919003955435321-2948085440037304221?l=rdfsg.blogspot.com'/&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://rdfsg.blogspot.com/feeds/2948085440037304221/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=4522919003955435321&amp;postID=2948085440037304221" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/4522919003955435321/posts/default/2948085440037304221" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/4522919003955435321/posts/default/2948085440037304221" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/SoftwareAndArchitecture/~3/VpVGGGI63Pc/seam-on-amazon-ec2.html" title="Seam on Amazon EC2" /><author><name>rdf</name><uri>http://www.blogger.com/profile/04410128869406318890</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="OpenSocialUserId" value="16845754167005561368" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">2</thr:total><feedburner:origLink>http://rdfsg.blogspot.com/2008/09/seam-on-amazon-ec2.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-4522919003955435321.post-3341570637991809339</id><published>2008-08-29T06:37:00.001-07:00</published><updated>2008-08-29T06:54:18.149-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="software" /><category scheme="http://www.blogger.com/atom/ns#" term="architecture" /><category scheme="http://www.blogger.com/atom/ns#" term="data integration" /><title type="text">TOGAF and Evaluating Architectures</title><content type="html">The old adage is that you always have an enterprise architecture even if you never designed one -- the point being to encourage an organization to spend the time to design one. This is all well and good, but given an ongoing enterprise, what's the best way to determine what enterprise architecture you have, where you want it to go and most importantly, how to get there.&lt;br /&gt;&lt;br /&gt;For various reason I've started looking at this issue again and have just refamiliarized myself with &lt;a href="http://www.opengroup.org/togaf/"&gt;TOGAF&lt;/a&gt; (The Open Group's Architecture Framework). I had forgotten how much I liked it: it is pragmatic, highly tailorable and focused on open cross-organizational solutions. I'm not going to do a detailed analysis of TOGAF vs. other frameworks -- it's not really my interest as I'm definitely in &lt;a href="http://en.wikipedia.org/wiki/Satisficing"&gt;satisficing&lt;/a&gt; mode here. What follows is my (long) elevator pitch of the TOGAF take home message.&lt;br /&gt;&lt;br /&gt;The top level graphic of the TOGAF process captures the flavor pretty well&lt;br /&gt;&lt;br /&gt;&lt;a href="http://lh3.ggpht.com/rdf541/SJxf55DXheI/AAAAAAAAAD0/EU6UDrSVdvc/togaf_dev_cycle.jpg"&gt;&lt;img src="http://lh5.ggpht.com/rdf541/SLf-k7Hq5HI/AAAAAAAAAEU/pK8F01Nlv-8/blog__togaf_dev_cycle.jpg?imgmax=800" alt="blog__togaf_dev_cycle.jpg" border="0" width="270" height="300" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The preliminary phase is key but very easy to overlook. TOGAF suggests that this phase consists of defining the overall objectives and scope&lt;br /&gt;&lt;br /&gt;&lt;UL&gt;&lt;br /&gt;&lt;LI&gt;Define Objectives&lt;br /&gt;&lt;UL&gt;&lt;LI&gt;Assure that everyone who will be involved in or beneﬁt from this approach is committed to the success of the architectural process&lt;/LI&gt; &lt;br /&gt;&lt;LI&gt;Define the architecture principles that will inform the constraints on any architecture work &lt;br /&gt;&lt;/LI&gt;&lt;br /&gt;&lt;LI&gt; Define the ‘‘architecture footprint’’ for the organization — the people responsible for performing architecture work, where they are located, and their responsibilities &lt;/LI&gt;&lt;br /&gt;&lt;/UL&gt;&lt;br /&gt;&lt;/LI&gt;&lt;br /&gt;&lt;LI&gt; &lt;br /&gt;Define Scope and Assumptions&lt;br /&gt;&lt;UL&gt;&lt;br /&gt;&lt;LI&gt;The business units that are involved&lt;br /&gt;&lt;/LI&gt;&lt;br /&gt;&lt;LI&gt;The level of detail to be deﬁned &lt;br /&gt;&lt;/LI&gt;&lt;br /&gt;&lt;LI&gt;The speciﬁc architecture domains to be covered (Business, Data, Applications, Technology) &lt;br /&gt;&lt;/LI&gt;&lt;br /&gt;&lt;LI&gt;The time horizon that should be addressed by the architecture. &lt;/LI&gt;&lt;/UL&gt;&lt;/LI&gt;&lt;br /&gt;&lt;/UL&gt;&lt;br /&gt;&lt;br /&gt;What I find attractive about this whole approach is its focus on getting getting buy in from the key players in the organization, defining their roles and developing a shared set of expectations around what's going to be done as part of the architecture effort. The preliminary steps give the team some initial criteria for driving the architectural vision, but then TOGAF immediately requires them to ground it as supporting the needs of the business users. I find this grounding critical; often the business thinks that architecture efforts are worthless and often they are right because the architectural model hasn't been grounded in the business process. &lt;b&gt;&lt;i&gt;Note: in this case "business process" and "user's scientific process" are equivalent.&lt;/i&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;The key to the success of an architecture effort is to address current pain points as they will be reflected in the business processes that will be in place when the architecture rolls out. Sorry if the tense of the last sentence was a bit torqued. What I mean is that the architecture needs to hit a mark to support business operations as they will be in the future, not as they are now, and that some of the problems that are being experienced now will only be exacerbated by these planned changes.&lt;br /&gt;&lt;br /&gt;The dialog with the Business Unit leader sounds something like &lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;We're planning to do more collaborations in the future, but with our current collaborations we have a terrible time registering new users and tracking responses to our questions about the data. However, if we put an architecture in place which uses our new authentication mechanism that supports &lt;a href="http://openid.net/"&gt;OpenId&lt;/a&gt; it will radically simplify the process of adding new users. &lt;br /&gt;&lt;p&gt;&lt;br /&gt;In addition, if we use vendor X's implementation of the &lt;a href="http://www.cdisc.org/publications/Benefits_lifeSciencesIndustryArchitecture.pdf"&gt;Life Sciences Industry Architecture&lt;/a&gt;, queries will be automatically tracked. &lt;p&gt;&lt;br /&gt;Our ability to handle more collaborations on the back end is increased as our new system allows us to share extra capacity across multiple business units, thereby sharing the cost of reserve capacity to meet any unanticipated surges in demand. &lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Such a "political/operational" model for rolling out an architectural analysis implies that everyone who contributes to the effort should get something out of it (this is a goal, but the closer you can come to meeting the goal, the more self-organizing the system becomes).&lt;br /&gt;&lt;br /&gt;As one proceeds around the TOGAF loop, you pick and choose what makes sense given the decisions made previously (which of course you are always free to revisit) analyzed to the level of depth that is appropriate.&lt;br /&gt;&lt;br /&gt;Think of TOGAF as providing a (partial) checklist of processes to use and things to consider that help you reach the end state of &lt;br /&gt;&lt;a href="http://www.opengroup.org/"&gt;Boundaryless information flow (tm)&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://lh6.ggpht.com/rdf541/SJxqkaYoFFI/AAAAAAAAAD4/Sgm0acobIQg/Brokerage_applications.jpg"&gt;&lt;img src="http://lh4.ggpht.com/rdf541/SLf_VqDaIaI/AAAAAAAAAEY/x6o1NkDU32U/blog__Brokerage_applications.jpg?imgmax=800" alt="blog__Brokerage_applications.jpg" border="0" width="300" height="182" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;I think of it as being similar in spirit to the way the Software Engineering Institute's &lt;a href="http://www.sei.cmu.edu/publications/documents/93.reports/93.tr.006.html"&gt;Risk Management Taxonomy&lt;/a&gt; provides a comprehensive checklist of things to consider when undertaking a project -- it keeps you from forgetting something that would be obvious in retrospect. &lt;br /&gt;&lt;br /&gt;An aside:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;My favorite quote from one of their &lt;a href="http://www.sei.cmu.edu/risk/index.html"&gt;pages&lt;/a&gt;:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;Another company is developing a flight control system. During system integration testing the flight control system becomes unstable because processing of the control function is not quick enough during a specific maneuver sequence.&lt;br /&gt;&lt;br /&gt;The instability of the system is not a risk since the event is a certainty - it is a problem.&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4522919003955435321-3341570637991809339?l=rdfsg.blogspot.com'/&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://rdfsg.blogspot.com/feeds/3341570637991809339/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=4522919003955435321&amp;postID=3341570637991809339" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/4522919003955435321/posts/default/3341570637991809339" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/4522919003955435321/posts/default/3341570637991809339" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/SoftwareAndArchitecture/~3/il8RemvosQg/togaf-and-evaluating-architectures.html" title="TOGAF and Evaluating Architectures" /><author><name>rdf</name><uri>http://www.blogger.com/profile/04410128869406318890</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="OpenSocialUserId" value="16845754167005561368" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://rdfsg.blogspot.com/2008/08/togaf-and-evaluating-architectures.html</feedburner:origLink></entry></feed>
