« January 2010 | Main | March 2010 »
February 27, 2010
HB150 Gives Too Great a Power to State
Image via Wikipedia
Utah House Bill 150 is a bad bill that will give government too much power to invade your privacy without a warrant. The bill has passed the house and it now awaiting action in the Senate. Read this post, read the bill, and then take a minute to contact your senator and express your hope that they will vote against it. If you don't know who your senator is, you can find out here.
HB150 would allow law enforcement agencies in Utah to use an "administrative subpoena" to ask for the records of people suspected of committing crimes against children from Internet Service Providers (ISPs) without a warrant. This may sound fine as long as the people are really engaged in suspicious activity, but there's no check to ensure that's the case. That's why warrants exist. They force law enforcement to convince another party (i.e. the judge) that they really do have reasonable suspicion.
I'm all for getting tough on crime and catching bad guys who are exploiting children, but I'm not prepared to give up my 4th amendment rights to make it happen. Good conservatives should be on the side of protecting individual rights and liberties, not handing more power to the state, no matter how noble the cause may sound.
Take a minutes, send your senator a note, and ask them to vote no on HB150.
11:50 AM | Comments () | Recommend This | Print This
February 26, 2010
Using Social Media Badly: Novatel as a Case Study

Image by Old Shoe Woman via Flickr
I'm a pretty happy MiFi owner, but I've had a problem with my battery and would like to buy a new one. They're not easy to find, so I was plesantly surprised to find that Novatel (the maker of the MiFi) had a Twitter account: @MyLifeMyWayMiFi. I followed and when I saw some activity, replied to @MyLifeMyWayMiFi asking where spare batteries could be purchased. Nothing. I tried a few more time when I saw activity and have never received any kind of reply. It's clear that Novatel is using it's Twitter account to simply push more advertising at me.
Maybe its working for Novatel, but I think they're missing the real value of using Twitter: two way communication with their customers and opportunities to build relationships. I like my MiFi a lot and I'm a fan. I want to know what they're doing, so in that respect the Twitter account is working. But there's more there.
If I had a relationship with Novatel through Twitter (because they answered my question, for example), I'd be more likely to recommend it to my friends. I'd also be more likely to forgive them missteps. As it is, it's just another piece of the gigantic sewage pump that the industrial age has constructed to push more stuff at me.

9:39 AM | Comments () | Recommend This | Print This
February 25, 2010
KRL Supports International Characters
One of the things we often get asked at Kynetx by partners is whether or not KRL will support international characters. The answer is "yes" as shown below:
This support extends to reading international characters from data feeds and operations on strings.
10:58 AM | Comments () | Recommend This | Print This
February 23, 2010
Beyond Aesthetics
This week's Technometria podcast is with designer Thomas Petersen on the topic of data overload and design. Late last year he wrote a blog post called Slaves of the Feed that talked about a problem almost all of us face: too much information. It was the start, rather than the end, of a conversation and so seemed a good jumping off spot for a podcast. Thomas has a designer's take on the problem and we ended up talking about design in a more general sense. I enjoyed it.
8:11 AM | Comments () | Recommend This | Print This
February 22, 2010
Jon Udell to Speak at Spring Kynetx Impact Conference
Image via Wikipedia
I'm excited to announce that Jon Udell will be speaking at Kynetx Impact in April. I've known Jon for years--we met though blogging while I was CIO for Utah. He's the perfect person to keynote Impact because he's first and foremost a developer who understands the core nature of the Web.
Jon's topic will be (loosely) "why the decentralized architecture of the Web matters." That's a great topic for Impact because what we're trying to help developers do is create applications that leverage that decentralzied architecture rather than trying to figure out ways to get what they want done in spite of it. The client-centric, rather than server-centric, nature of Kynetx applications is all about embracing decentralization.
In addition to Jon, I'll be speaking and so will Craig Burton. We're working on an awesome agenda and I'll publish that soon. In addition to some mind blowing keynotes that challenge the way you've thought about programming the Web, we'll also be going over the latest developments in KRL.
If you're wondering if you ought to come to Impact, I'd give you this rubric: If you're a Web programmer who's wanted to get beyond the confines of the server and create applications that work anywhere, Impact is for you. Applications built using KRL go beyond a single location and let you work whereever information has the most meaning for your users. As an example, here's an application I wrote that mashes up Twitter with a dozen Web sites to carry the Twitter discussion to them.
People who came to Impact in November will tell you that even if you're not sure you're going to use Kynetx to build your application, the ideas at Impact are of a different stripe than those of a traditional Web development conference. Come participate in the discussion and be part of the client-side revolution.
The spring Kynetx Impact conference will be held April 27-28 in Salt Lake City. The normal price of admittance is $150, but if you ise the code "FOK2010" you'll get 30% off.
1:18 PM | Comments () | Recommend This | Print This
CTO Breakfast on Thursday
This Thursday is the CTO breakfast. We'll start at 8am in the Novell cafeteria. See the link for maps and calendars. I hope you can join us.
The CTO Breakfast is open to anyone interested in high-tech businesses and products. It is a free-form discussion of topic. If you've got something that you're interested in, come prepared to talk about it.
Future CTO Breakfast times can be found on the CTO Breakfast Google calendar. The CTO breakfast for March will be help on March 26th in conjunction with Podcamp SLC. Details to come.
11:03 AM | Comments () | Recommend This | Print This
February 8, 2010
Build 424: Functions and Array Operators
The latest build of the Kynetx Rule Language (KRL) provides a significant upgrade in capability with the addition of functions. We've also added some new array operators that take advantage of functions to make using arrays easier.
KRL supports functions as first-class objects in the expression language. KRL supports only anonymous functions, but they can be given names by binding them to a variable in a declaration. Here's an example:
pre {
add5 = function(x) {
x + 5
};
}
Functions are evaluated statically (e.g. the environment they are defined in, not the environment they are executed in determines the binding of free-variables) and can be recursive. Here's an example of a recursive function in KRL:
pre {
fact = function(n) {
(n <= 0) => 1
| n * fact(n-1)
}
}
Functions are declared using the keyword function and contain optional declarations followed by a single expression that returns the result of the function when executed. To see this,
consider the following example which uses Newton's method to calculate square roots (taken from Section 1.1.8 of Structure and Interpretation of Computer Programs):
sqrt = function(x) {
average = function(x,y) { (x + y) / 2 };
good_enough = function(guess, x) {
v = (guess * guess) - x;
v < 0.01 && v > -0.01
};
improve = function(guess, x) {
average(guess, (x / guess))
}
sqrt_iter = function(guess, x) {
good_enough(guess, x) => guess
| sqrt_iter(improve(guess,x), x)
};
sqrt_iter(1.0, x)
}
Functions can return functions as values and functions can be passed as the arguments to other functions and operators in KRL. The following example defined a generalized summation function that sums the numbers from a to b incrementing using inc and applying the function f to each term:
sum = function(f, a, next, b) {
(a > b) => 0
| f(a) + sum(f, next(a), inc, b)
};
inc = function(x) { x + 1 };
cube = function(x) { x * x * x };
sum_cubes = function(a, b) {
sum(cube, a, inc, b)
}
We could define a function that creates incrementor functions. When given a number, it returns a function that increments by that value:
inc_generator = function(n) { function(x){ x + n } };
inc = inc_generator(1);
inc_by_2 = inc_generator(2);
inc_by_25 = inc_generator(25);
Being able to write functions adds significant power. More so with some of the other languages changes we have in mind for the next few months.
Weve also added several new array operators in recent builds. Most notably, array references now work as follows:
a = [1,4,3,6,5]; b = a[1]
This would bind the value 4 to the variable b. Note that array references only work for arrays of one-dimension, so c[1][2] is not allowed (presuming c is an array of arrays).
In addition, there are a number of new operators available for arrays.
The following array operators are now available (in addition to length which has been previously available):
sort- sorts the array. With no argument, sorting is done in ascending order. The argument"reverse"causes sorting to happen in descending order. The argument can also be a function that takes two argument and returns a boolean value which will be used as the comparison function for the sort.filter- filters an array, producing a new array. The operator takes a function argument that takes a single parameter and returns a boolean value. The return array contains elements for which the function returns true.map- modfies an array from mapping a function to each member of the array. The operator takes a function argument that takes a single parameter and returns any value. The array returned frommapis the result of applying the function to each member of the original array in turn, collecting the results into a new array.head- returns the first element of an array without modifying the array.tail- returns an array that is identical to the orginal array except without the first member.
You could use these like so:
pre {
f = function(x) { x < 4 };
g = function(y) { y * 2 };
a = [1,4,3,6,5];
b = a.sort(); // returns [1,3,4,5,6]
c = a.filter(f); // returns [1,3]
d = a.head(); // d has the value 1
e = a.map(g); // e has the value [2,8,6,12,10]
}
Operators are fairly easy to add and handy to have, so if you have ideas for other operators, on arrays, strings, and so on, just let us know.
9:52 AM | Comments () | Recommend This | Print This
February 6, 2010
Redirectionless OAuth Credentials Exchange

Image via CrunchBase
Am I missing something here? Twitter is working with select partners to test what is variously being called OAuth delegation or browserless OAuth credentials exchange method (not sure why browserless since it's not about the browser, it's about the redirection).
The bottom line is that in an effort to be more user friendly, this removes the redirection to the Twitter site where you authoirize access by letting the third-party site (the site being delegated to) collect and then pass along the user's username and password to get the OAuth credentials. Abraham Williams captured the POST headers from Seesmic Look and they clearly contain the username and password.
I don't see how this can be a step forward in secure third-party access to APIs like Twitter. Once users start being allowed--even required--to (again) enter usernames and passwords into third-party sites, they'll be ripe for phishing attacks. Maybe I'm misunderstanding this based on the scetchy information available, but it looks phishy to me.
11:10 AM | Comments () | Recommend This | Print This
February 5, 2010
Subscription Models are Chic

Image via CrunchBase
A recent blog post by Dave McClure, the investor in charge of the Founders Fund seed investment program makes the assertion that "subscription models are the new black" and we've lost a decade of innovation by people living off the table scraps of Google's $10B pay-per-click ad system. (Warning: the blog post is pretty raw.)
In a seeming non-sequiter, he moves on to talking about passwords. But pay attention, because what he's really doing is talking about friction in subscription models and the friction that they inpose. I think it's interesting that the iPhone app store, for example, still requires that I type a password when I purchase an app on my iPhone given that they have a good identification based on the device. Of course, what they're doing is using the password for authorization. Making sure it's me who's purchasing the app.



