« October 2009 | Main | December 2009 »
November 24, 2009
Build 353: Some New Functions for Kynetx Rule Language
We released Build 353 of the Kynetx Rules Engine (KRE) this morning. Actually, I should point out that Wade Billings released it and I watched over his shoulder. This is the first time in the history of Kynetx that someone besides me released KRE code. Yeah!! This is an exciting thing in and of itself. Wade's job is to build a continuous integration environment for Kynetx so that code changes appear in production as quickly as possible. Until then, I've pushed the pain on him to ensure he's properly motivated.
The new release adds two new features to KRL:
- The
asoperator provides a way to coerce primitive values. The most interesting ones are coercing strings and regular expressions. You can construct a string and then coerce the result to be a regular expression for use in areplace:my_str.replace(("/this/"+ e).as("regexp"),"do you want a") - You can use
math:randomto generate random numbers. The function takes an argument and generates a random number between 0 and the argument. For example, you could bindrto a random number between 0 and 9999999 with the following:pre { r = math:random(9999999) } notify("Randomness", "A new random number: " + r)Here's the result showing on my blog:
Both of these features were the result of developers asking for something they needed. We can't promise same day turn around, but for small features like this we try to be as responsive as we can. On Monday we'll announce the new Kynetx Developer Exchange where you can ask questions, answer questions, and make feature requests. More on that later.

3:39 PM | Comments () | Recommend This | Print This
November 23, 2009
Exercising Power vs Doing Better Work

Image via Wikipedia
Paul Graham has a new essay called Apple's Mistake about how badly the AppStore approval process is broken. This line speaks volumes:
An organization that wins by exercising power starts to lose the ability to win by doing better workFrom Apple's Mistake
Referenced Mon Nov 23 2009 08:40:31 GMT-0700 (MST)
Go read the whole thing and ponder what it means to organizations whose success is measured by the degree to which others use their platform.

8:44 AM | Comments () | Recommend This | Print This
November 19, 2009
Kynetx Impact and New Features
One of the great things about an event like the Kynetx Impact conference that we're holding this week is that they are great focusing tools for a company. This has been true of our thinking, but especially our technology. There were three big features we've been thinking about and working on for a while, but we wanted to have them done for Impact and that made them happen.
The first, I've already mention on this blog: FLWR in KRL, the ability to create foreach loops within a rule. This is a pretty big feature for KRL.
The second feature is creating browser extensions with the push of a button. AppBuilder now has a new link under the "deployment" tag that creates a Firefox and Internet Explorer browser extension that will run a ruleset. Just click the link and you've got browser extension you can distribute any way you like. This is HUGE. In short, you can create browser extension without knowing anything about programming browser extension. This is still a bit experimental, but will firm up over the next few weeks.
Last but not least, we exposed versioning in AppBuilder so that developers can have development version of their ruleset that's different from their production version. This has been much requested by rule writers after they get users up and running. No one wants to test on the production system and this features fills in that missing piece.
Of course in addition to all these, there's countless changes we've made large and small to make things a little nicer before the big event: a new navigation menu in APpBuilder, an updated tutorial, proxy endpoint changes, and so on. I love the way everyone came together and made it all happen. The energy was fun.
9:57 PM | Comments () | Recommend This | Print This
November 16, 2009
Come to Kynetx Impact This Week
If you're a regular reader of my blog, then you know that we're having a developers conference for Kynetx on this week on November 18-19 in Provo called Kynetx Impact. There's an awesome agenda with some great speakers including Doc Searls, Kim Cameron, and Paul Trevethick.
There will also be great food, great people, and a chance to see first hand what we're doing at Kynetx. You can sign up online. Over 110 people are signed up already and we're expecting a standing room only crowd.
I'd like for you to come to Impact. Use Windley25 to get 25% discount on the admission fee. I'd love for you to see what we've built and get your feedback.
1:32 PM | Comments () | Recommend This | Print This
November 11, 2009
We Need More Than a Selector
If you glance at Johannes Ernst's latest blog post, Why We Really Don't Need an "Identity Selector", you might think he's speaking out against identity clients, but in reality, he's speaking out against identity "selectors." That is, the idea that the most important, useful feature of such a client is "selecting" an identity. He says:
The correct product is not a "selector". It also must be:
- An identity "de-selector", with which the user can become anonymous again (or perhaps even remove all the information from the site which was conveyed during the "identity selection" phase). The much-desired "single sign out of the web" button should logically reside there.
- An identity-aware session "visualizer", which conveys to the user that there they have open sessions with which sites, which of the user's identities are currently used with which site, which others they have used with which site in the past, whether the session is valid (as opposed to expired), what information about them they have shared with the site and perhaps how to log out.
From Johannes Ernst's Blog » Why We Really Don't Need an "Identity Selector"
Referenced Tue Nov 10 2009 21:25:44 GMT-0700 (MST)
I agree, but I'd argue that it ought to do even more than this.
At Kynetx we're building a platform for creating what we call purpose-centric applications. These apps are necessarily client-side because the client is the only place that sees all of the user's activity and thus the only place that can mediate on the user's behalf.
Consequently, I think that the client ought to also:
- Help users manage the apps that mediate their online experiences on their behalf
- Provide a way for users to provide feedback about such applications and show the reputation of each app based on that feedback (among other things)
- Provide security and privacy warnings to the user
- Mediate data requests for the user's personal data store and other data sources (i.e. data authorization)
Of course, it ought to do the things Johannes recommends too--why not? But as he correctly points out, authentication is a small part of the overall experience and we ought not name the whole client based on 0.5% of the interactions. What should we call it? I don't know yet, but I'm sure Craig Burton could come up with a few suggestions.
Why put this in the identity client and not somewhere else? My first answer is that we've we've been using a selector to do this for 12 months and it feels natural. The second answer is that client-side, experience-mediating apps deal with lots of personally identifying information. Indeed the security, privacy, and data autorization tasks I mention are part and parcel of the larger "identity management" world.
You might say, but couldn't this be built into the browser? No, unfortunately. That would be easier in the short term, but it won't solve the problem; the apps might be mediating the user's email or IM interactions outside of the browser. I think a separate interface provides greater opportunity for a better user experience.
Kynetx apps need a client that performs these services. Whether we can define them for some generic "action card" concept inside Information Cards or whether we end up building a client that functions as an Information Card selector but also adds additional features like Johannes and I propose is an open question. I've never been shy about building what I need, but I'm also not anxious to reinvent to wheel if something out there meets the need.
In any event, I'm convinced that more full featured identity-management, app-management clients will need to be built to support the coming purpose-centric web that is unfolding. If that idea intrigues you, join us next week at Kynetx Impact.
9:36 AM | Comments () | Recommend This | Print This
November 9, 2009
KNS Build 351: FLWR Comes to KRL
One of the big features missing from KRL as a rule language is a foreach statement that allows looping. Build 351 of KNS (released today) fixes that problem. The thing that kept holding me back was confusion on my part about the best way to add it and how it should work.
The problem was that I wanted, thought KRL needed, more than just looping. I wanted full-blown FLWOR statements (foreach, let, where, order by, result). I realized one day on a bike ride that the entire rule ought to be a FLWOR statement and that meant that the foreach needed to happen before the rule body executed.
The rule prelude already functions in the capacity of a "let," the rule premise (condition on the action) already functions in the capacity of a "where," and the rule action itself is the "result." Yeah, I left out "order." More on that later.
KRL now allows one or more foreach clauses to be added to the select statement like so:
select using "/archives/" setting () foreach [1, 2, 3] setting (x)
The value of x will be bound to the values 1, 2, and 3 on successive executions of the rule body. KNS optimizes the rule so that declarations in the prelude aren't executed inside the loop unless they depend on the value of the variable (directly or indirectly).
Of course, the array is an expression, so it doesn't have to be an array literal. You could do this:
select using "/archives/" setting ()
foreach f.pick("$..store") setting (x)
This works fine as long as f has been declared outside the rule in the global and the pick returns an array.
The entire rule body--everything after the select is executed once for every loop. If the premise is true, an action is produced, so a rule with a foreach over a three element array would produce three actions if the premise were true each time.
We can't order the array yet. Adding a sort operator on arrays would do the trick but to do that I need someway to specify the comparison function and KRL doesn't have functions or closures...yet.
Looping has been a long time coming, but I'm excited to see what people do with it. Surprise me!

12:36 PM | Comments () | Recommend This | Print This
November 4, 2009
Spamming Like a Pro: The Value of Social Data
Image via Wikipedia
This article at TechCrunch: How To Spam Facebook Like A Pro: An Insider's Confession is written by Dennis Yu, a reformed ad spammer on Facebook. In it, he says:
When the Facebook platform first launched, developers used Google AdSense, which was paying 10-15 cent eCPMs, meaning that developers were earning 10 to 15 cents for every 1,000 ads they shown. But soon, ad networks, such as the one I operated, stepped in to show that by using social data and some clever ad copy, we could raise this to well over $6--that's 60 times better than AdSense. AdSense was getting a 0.1% CTR and earning 15 cents a click. Our ads were getting up to a 4% CTR and also earning 15 cents a click. You do the math.From How To Spam Facebook Like A Pro: An Insider's Confession
Referenced Wed Nov 04 2009 14:19:41 GMT-0800 (PST)
That number--60x--jumps out of that statement. There's trmendous pressure, as this article points out, to sell out users. That's a good reason to find technologies that let users manage their data. With the right model, users could share in that revenue and make this kind of sale more above board that what's happening right now.

3:27 PM | Comments () | Recommend This | Print This
IIW Trending Topics: OpenID and IC Cooperation and Activity Streams
IIW IX, the 9th Semiannual Internet Identity Workshop is underway at the Computer History Museum in Mountain View. At each meeting, I'm usually surprised by the emergence of one or two topics and pleased to see continued moves toward even further consolidation and cooperation between mature identity protocols.
There continues to be increased cooperation between OpenID and Information Cards. I've see demos of using Information Cards to store and apply OpenID from Microsoft and heard discussion around OpenID selectors and trust frameworks. I quipped that OpenID keeps adding features incrementally in a way that asoptotically approaches the design of Information Cards. Information Cards, on the other hard, search for way to ride the popularity of OpenID to relying party acceptance. For both, getting relying parties to accept them for authentication remains the hopy grail.
One topic that is trending up at IIW is activity streams. Activity Streams is an extension to the Atom feed format for sharing user activities among various systems. The Activity Streams format has already been adopted by Facebook, MySpace, Windows Live, and Opera. Monica Keller created a Prezi on the anotomy of an activity stream: who did what, where, when, and under what circumstances. What did they say about it? Who else was there?
As I learned about activity streams I couldn't help thinking how neat it would be to build them into KRL so that you could write rules around activities.




