Last night I gave a presentation at the Colorado Springs Open Source Users Group on the topic of cloud computing called “Partly Cloudy with a Chance of Hype.” If you were there, I’d love to here your feedback! The slides are posted to Slideshare.
Last night I gave a presentation at the Colorado Springs Open Source Users Group on the topic of cloud computing called “Partly Cloudy with a Chance of Hype.” If you were there, I’d love to here your feedback! The slides are posted to Slideshare.
Since writing my last article for TheNextWeb on Socialcast and my conversation with Tim Young, I’ve been thinking about the bidirectional, actionable activity stream concept. It’s less relevant to human constructed messages and more related to machine generated activity messages, specifically exceptions raised from the system. When a source system generates an exception based message that’s put into an activity stream, then generally they require some action or acknowledgement . This is where things can get interesting.
For example, let’s say there is an expense management system for managing employee expense reports and payments. Employee Joe submits an expense report with $750 in miscellaneous “entertainment” expenses which raises an exception. The expense management system is integrated with an activity stream engine; it posts a new message into a stream alerting Jim of the exception (this is where permissions, users, groups, identity, etc get tricky – ignoring that here).
So that’s well and good, Jim is alerted to the exception but now what? Wouldn’t it be great if Jim could act on the message in context?
For example, he could discuss the exception with Joe in context of message in the activity steam. “@joe I need more details on the $750 entertainment charge, and it better be good!” Joe replies, “whoops! sorry that should have been $75, please reject and I will fix.” Jim then rejects the expense report in context of the stream and inherently passes along the stream conversation back to the expense management system as notes to the expense report.
Traditionally, Jim may have received the exception notification via email. He then would have logged into the expense management system, looked at the expense report and either rejected it, notating his question about the entertainment expense or would have emailed Joe asking for details on the expense. Joe then might have replied to Jim or logged into the expense system to add a note and fix the error. This doesn’t sound that bad in this simple scenario, but Jim is very busy and receives hundreds of emails a day and the notification from the system might likely be passed over or Jim just didn’t have time to interrupt what he was doing to go log into the expense management system.
The exception based activity stream use case is more powerful if it allows action to be taken in context. So how might you handle this? Now I’m no activity stream expert, and I’ve had no involvement with any of the standards like activitystrea.ms; I’m just a guy thinking aloud….
What really got me thinking about this use case was a presentation given by Neal Ford at the last social on Implementing Evolutionary Enterprise Architecture. It was primarily based on the Richardson Maturity Model, a model of breaking down REST into three steps that introduces resources, http verbs and hypermedia controls. A hypermedia service enforces a protocol by advertising legitimate interactions with relevant resources at runtime.
In the context of the machine generated activity stream message, the payload of the message would contain a representation of state with respect to the source system activity and links that define possible interactions.
The point of the hypermedia controls is to tell us what we can do next, and the URI of the resource we need to do it. For example, in the example above. The entry might look something like this, with two links – one for approve and the other for reject.

This is a loosely coupled way to provide actions for a given activity. The activity stream system can present the activity message in the stream with the options made available in the payload of the message and selectable actions. This makes no assumption of what type of interface you are viewing the activity stream message through, be it browser, mobile, API rendered, etc. The activity stream system would likely need to abstract the actions in it’s API allowing calls to be made back through the APIs in proxy to the source system.
You could obviously take this concept much further, adding a sequence of actions based on the previous action taken on an activity. For example, if you approve the expense report, the REST call response might return a new list of actions like “view’ the updated expense report.
Like I alluded to above, there are many complexities to this including authentication/identity, authorization, the capabilities of the source system, the capabilities of the activity stream system, etc.
I really have no bandwidth to pursue this idea, but it’s been on my mind for that last few weeks so I thought I’d write it up and see what people think.
I started work on this plugin back in December based on the work I did for Patheos.com and by the graces of my employer Avalon Consulting LLC and Patheos, they allowed me to open source the plugin and continue working on it. This week I had some time to get back to it, and today I started creating a basic reference implementation application that will accompany the documentation. Below is a screencast demo of this application which indexes an export of songs from my iTunes library metadata and makes them searchable.
The code for the plugin is at Github and is still a work in progress. I’m pushing towards a 0.1 release next week with the bulk of the work I still need to do in the form of documentation and clean-up.
So please watch the screencast, and I would love feedback. I will certainly take offers to help continue the development of the plugin but would like to get 0.1 out first to round out my train of thought and not further delay that basic milestone.
This was one of those tough to track down issues that yielded very little in terms of actionable solutions vs. confirmation of similar problems while I Googled the problem symptoms. I recently upgraded a Grails app from Weblogic 8 to 10.3. The app allowed users to upload videos to Youtube using the Youtube APIs, using ClientLogin for authentication. The problem was after the upgrade the connection to https://www.google.com/accounts/ClientLogin was failing during the SSL negotiation phase. The errors in the log were
java.lang.IllegalStateException: Cipher not initialized
at javax.crypto.Cipher.c(DashoA13*..)
at javax.crypto.Cipher.update(DashoA13*..)
at com.certicom.tls.provider.Cipher.update(Unknown Source)
…
and
java.security.InvalidKeyException: Illegal key size
Thankfully I found this thread on a Korean Oracle forum. The solution is to add this JVM parameter:
-Dweblogic.security.SSL.nojce=true
This enables Weblogic to use a FIPS 140-2 compliant crypto module in the server’s SSL implementation. FIPS 140-2 is a standard that describes U.S. Federal government requirements for sensitive, but unclassified use.
If you have this problem, I hope you stumble upon this post and it helps you.
On Tuesday (2/2/2010) I participated in the Denver Open Source User Group’s first Ignite night. My presentation was an quick overview of Solr, the java based open-source search engine. This was my first Ignite style presentation, and the format is challenging! The presentations were each 5 minutes with a 20 slide deck auto advancing every 15 seconds. I stumbled a bit out of the gate with the cold start but was able to get it back on the rails though I felt as if I was trying to dig myself out of quicksand through the rest of it. Overall it was a lot of fun.
The room was packed, somewhere in the neighborhood of 100 people, and overall the quality of the presentations were very good. You can check out the slide decks on Slideshare here. Here are my slides:
And here is a dry-run of my presentation I recorded while practicing the day of:
Recently I’ve been heads down writing a Grails Solr plugin for using Solr to index and search Grails domain objects, content and other documents. I share more on that in the next several day and weeks. While doing so I implement annotations for the first time. In this example, I create an annotation type that lets you annotate a class property to specify a custom Solr index field name. In usage it looks like this:
import org.grails.plugins.solr.Solr
class aDomain {
@Solr(field="thedomainstitle")
String title
}
The imported class above is actually an interface that defines the annotation:
package org.grails.plugins.solr
import java.lang.annotation.*
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface Solr {
String field();
}
This is fairly self explanatory. The name of the annotation is “Solr” and there is one propery field with a value of String. Almost identical to the java equivalent.
Now to access the annotation value for the field, you simply need the get a reference to the annotation and call the method on it defined above: field(). So with a bit of context below, I define an indexSolr() method for each domain class, loop through each property and check if there is an annotation of Solr defined for the field, if so I set the value of field() to the docKey which is used as the Solr field name for the property.
application.domainClasses.each { dc ->
dc.metaClass.indexSolr < < { ->
//.......
application.getArtefact(DomainClassArtefactHandler.TYPE, delegate.class.name).getProperties().each {
//.......
def theField = delegate.class.declaredFields.find{ field -> field.name == it.name}
if(theField.isAnnotationPresent(Solr)) {
docKey = theField.getAnnotation(Solr).field()
}
//........
}
//........
}
}
Powerful, yet simple.
My company Avalon Consulting LLC has done a lot of charitable work for ManeGait including developing and managing their website. They are an amazing non-profit therapeutic horsemanship center in Colin County, TX. I encourage you to vote for ManeGait in Chase’s Facebook Community Giving Campaign!
Tonight I updated the theme on my blog with something that’s just more clean and fresh using the Green Park 2 theme by Cordobo, and I added the Wordpress Mobile Pack theme plugin for user-agent based viewing on mobile devices. I replaced how I was pulling in my twitter feeds with the Wickett plugin, set up IntenseDebate for commenting and replaced my share icon set with “Sexy Bookmarks”. Wordpress has really come a long way! Super impressed by all of the amazing extensions available.
I hope to get back to a frequency of a post a week here. Though I haven’t posted here regularly, I have made a few contributions to thenextweb.com including my latest post on my takeaways from the Defrag conference here in Denver last week.
I wrote a script that pings the IP of the first node outside of my house into Comcast’s network. It pings every two seconds and logs when the connection is up or down based on the ping success. Last week Comcast came and checked my line and said everything looked great and that it may be the onslaught of the cold weather. I’ve been working through Comcast support via Twitter which has been sporadic but convenient when they respond. Today I couldn’t get a response from them (@comcastmelissa and @comcaststeve) and today sucked:
Fri Oct 09 08:20:12 MDT 2009 DOWN! Fri Oct 09 08:23:41 MDT 2009 UP Fri Oct 09 09:31:39 MDT 2009 DOWN! Fri Oct 09 09:31:39 MDT 2009 UP Fri Oct 09 09:32:15 MDT 2009 DOWN! Fri Oct 09 09:32:26 MDT 2009 UP Fri Oct 09 09:33:27 MDT 2009 DOWN! Fri Oct 09 09:33:27 MDT 2009 UP Fri Oct 09 09:33:48 MDT 2009 DOWN! Fri Oct 09 09:33:48 MDT 2009 UP Fri Oct 09 09:34:14 MDT 2009 DOWN! Fri Oct 09 09:34:14 MDT 2009 UP Fri Oct 09 09:34:30 MDT 2009 DOWN! Fri Oct 09 09:34:30 MDT 2009 UP Fri Oct 09 09:34:56 MDT 2009 DOWN! Fri Oct 09 09:34:56 MDT 2009 UP Fri Oct 09 09:36:13 MDT 2009 DOWN! Fri Oct 09 09:36:13 MDT 2009 UP Fri Oct 09 09:37:24 MDT 2009 DOWN! Fri Oct 09 09:37:46 MDT 2009 UP Fri Oct 09 09:38:42 MDT 2009 DOWN! Fri Oct 09 09:38:42 MDT 2009 UP Fri Oct 09 09:39:28 MDT 2009 DOWN! Fri Oct 09 09:39:51 MDT 2009 UP Fri Oct 09 09:41:37 MDT 2009 DOWN! Fri Oct 09 09:41:37 MDT 2009 UP Fri Oct 09 09:42:43 MDT 2009 DOWN! Fri Oct 09 09:42:43 MDT 2009 UP Fri Oct 09 09:44:50 MDT 2009 DOWN! Fri Oct 09 09:44:50 MDT 2009 UP Fri Oct 09 09:45:21 MDT 2009 DOWN! Fri Oct 09 09:45:21 MDT 2009 UP Fri Oct 09 09:46:02 MDT 2009 DOWN! Fri Oct 09 09:46:13 MDT 2009 UP Fri Oct 09 09:47:25 MDT 2009 DOWN! Fri Oct 09 09:47:25 MDT 2009 UP Fri Oct 09 09:47:56 MDT 2009 DOWN! Fri Oct 09 09:47:56 MDT 2009 UP Fri Oct 09 09:48:22 MDT 2009 DOWN! Fri Oct 09 09:48:22 MDT 2009 UP Fri Oct 09 09:50:08 MDT 2009 DOWN! Fri Oct 09 09:50:08 MDT 2009 UP Fri Oct 09 09:51:40 MDT 2009 DOWN! Fri Oct 09 09:51:40 MDT 2009 UP Fri Oct 09 09:52:06 MDT 2009 DOWN! Fri Oct 09 09:52:06 MDT 2009 UP Fri Oct 09 09:52:37 MDT 2009 DOWN! Fri Oct 09 09:52:37 MDT 2009 UP Fri Oct 09 09:53:08 MDT 2009 DOWN! Fri Oct 09 09:53:08 MDT 2009 UP Fri Oct 09 09:53:44 MDT 2009 DOWN! Fri Oct 09 09:53:44 MDT 2009 UP Fri Oct 09 09:54:25 MDT 2009 DOWN! Fri Oct 09 09:54:25 MDT 2009 UP Fri Oct 09 09:54:51 MDT 2009 DOWN! Fri Oct 09 09:54:51 MDT 2009 UP Fri Oct 09 09:55:38 MDT 2009 DOWN! Fri Oct 09 09:55:49 MDT 2009 UP Fri Oct 09 09:57:00 MDT 2009 DOWN! Fri Oct 09 09:57:00 MDT 2009 UP Fri Oct 09 09:57:16 MDT 2009 DOWN! Fri Oct 09 09:57:16 MDT 2009 UP Fri Oct 09 09:57:42 MDT 2009 DOWN! Fri Oct 09 09:57:42 MDT 2009 UP Fri Oct 09 09:57:58 MDT 2009 DOWN! Fri Oct 09 09:57:58 MDT 2009 UP Fri Oct 09 09:58:39 MDT 2009 DOWN! Fri Oct 09 09:59:12 MDT 2009 UP Fri Oct 09 09:59:28 MDT 2009 DOWN! Fri Oct 09 09:59:28 MDT 2009 UP Fri Oct 09 09:59:55 MDT 2009 DOWN! Fri Oct 09 10:00:17 MDT 2009 UP Fri Oct 09 10:00:43 MDT 2009 DOWN! Fri Oct 09 10:00:43 MDT 2009 UP Fri Oct 09 10:02:24 MDT 2009 DOWN! Fri Oct 09 10:02:24 MDT 2009 UP Fri Oct 09 10:02:45 MDT 2009 DOWN! Fri Oct 09 10:02:45 MDT 2009 UP Fri Oct 09 10:03:11 MDT 2009 DOWN! Fri Oct 09 10:03:11 MDT 2009 UP Fri Oct 09 10:03:37 MDT 2009 DOWN! Fri Oct 09 10:03:37 MDT 2009 UP Fri Oct 09 10:04:14 MDT 2009 DOWN! Fri Oct 09 10:04:25 MDT 2009 UP Fri Oct 09 10:04:56 MDT 2009 DOWN! Fri Oct 09 10:04:56 MDT 2009 UP Fri Oct 09 10:05:12 MDT 2009 DOWN! Fri Oct 09 10:05:12 MDT 2009 UP Fri Oct 09 10:05:33 MDT 2009 DOWN! Fri Oct 09 10:05:55 MDT 2009 UP Fri Oct 09 10:06:11 MDT 2009 DOWN! Fri Oct 09 10:06:11 MDT 2009 UP Fri Oct 09 10:06:27 MDT 2009 DOWN! Fri Oct 09 10:06:49 MDT 2009 UP Fri Oct 09 10:07:05 MDT 2009 DOWN! Fri Oct 09 10:07:05 MDT 2009 UP Fri Oct 09 10:07:21 MDT 2009 DOWN! Fri Oct 09 10:07:32 MDT 2009 UP Fri Oct 09 10:07:48 MDT 2009 DOWN! Fri Oct 09 10:07:59 MDT 2009 UP Fri Oct 09 10:08:15 MDT 2009 DOWN! Fri Oct 09 10:08:37 MDT 2009 UP Fri Oct 09 10:08:53 MDT 2009 DOWN! Fri Oct 09 10:08:53 MDT 2009 UP Fri Oct 09 10:09:14 MDT 2009 DOWN! Fri Oct 09 10:09:14 MDT 2009 UP Fri Oct 09 10:10:10 MDT 2009 DOWN! Fri Oct 09 10:10:11 MDT 2009 UP Fri Oct 09 10:10:37 MDT 2009 DOWN! Fri Oct 09 10:10:37 MDT 2009 UP Fri Oct 09 10:11:38 MDT 2009 DOWN! Fri Oct 09 10:11:38 MDT 2009 UP Fri Oct 09 10:13:04 MDT 2009 DOWN! Fri Oct 09 10:13:04 MDT 2009 UP Fri Oct 09 10:14:21 MDT 2009 DOWN! Fri Oct 09 10:14:21 MDT 2009 UP Fri Oct 09 10:15:07 MDT 2009 DOWN! Fri Oct 09 10:15:07 MDT 2009 UP Fri Oct 09 10:15:43 MDT 2009 DOWN! Fri Oct 09 10:15:43 MDT 2009 UP Fri Oct 09 10:15:59 MDT 2009 DOWN! Fri Oct 09 10:15:59 MDT 2009 UP Fri Oct 09 10:30:30 MDT 2009 DOWN! Fri Oct 09 10:30:30 MDT 2009 UP Fri Oct 09 10:30:56 MDT 2009 DOWN! Fri Oct 09 10:30:56 MDT 2009 UP Fri Oct 09 10:32:07 MDT 2009 DOWN! Fri Oct 09 10:32:07 MDT 2009 UP Fri Oct 09 10:33:18 MDT 2009 DOWN! Fri Oct 09 10:33:18 MDT 2009 UP Fri Oct 09 10:33:34 MDT 2009 DOWN! Fri Oct 09 10:33:34 MDT 2009 UP Fri Oct 09 10:36:26 MDT 2009 DOWN! Fri Oct 09 10:36:26 MDT 2009 UP Fri Oct 09 13:12:12 MDT 2009 DOWN! Fri Oct 09 13:15:30 MDT 2009 UP Fri Oct 09 13:52:12 MDT 2009 DOWN! Fri Oct 09 13:53:08 MDT 2009 UP Fri Oct 09 14:34:14 MDT 2009 DOWN! Fri Oct 09 14:35:09 MDT 2009 UP Fri Oct 09 15:08:11 MDT 2009 DOWN! Fri Oct 09 15:11:29 MDT 2009 UP Fri Oct 09 16:26:15 MDT 2009 DOWN! Fri Oct 09 16:29:22 MDT 2009 UP Fri Oct 09 17:26:26 MDT 2009 DOWN! Fri Oct 09 17:26:26 MDT 2009 UP Fri Oct 09 17:27:17 MDT 2009 DOWN! Fri Oct 09 17:27:17 MDT 2009 UP Fri Oct 09 17:29:14 MDT 2009 DOWN! Fri Oct 09 17:29:14 MDT 2009 UP Fri Oct 09 17:30:35 MDT 2009 DOWN! Fri Oct 09 17:30:35 MDT 2009 UP Fri Oct 09 17:31:21 MDT 2009 DOWN! Fri Oct 09 17:31:22 MDT 2009 UP Fri Oct 09 17:31:58 MDT 2009 DOWN! Fri Oct 09 17:31:58 MDT 2009 UP Fri Oct 09 17:33:14 MDT 2009 DOWN! Fri Oct 09 17:33:14 MDT 2009 UP Fri Oct 09 18:25:03 MDT 2009 DOWN! Fri Oct 09 18:25:03 MDT 2009 UP
Powered by Web Design Company Plugins