Interesting article up on SlashDot, one of our favorite sources for tech news. This one is about Chinese DNS Tampering and what it could mean for you:
Monday, November 29, 2010
Monday, November 22, 2010
Boston named #1 Digital City in America
It’s a good day to be from Boston, and we’re not talking just about the Patriots beating the Jets last nite. Our fair city has been named #1 Digital City in America, and at CABEM, we’re glad that our industry’s contribution to the region’s economy is getting recognized, and looking forward to continuing to do our part. Read the whole announcement on the City of Boston website:
Monday, November 8, 2010
The "new" storytelling
These days, people are taking advantage of accessibility of interactive tools to expand upon narrative techniques of old. Paradoxically, politics were the primary driver for this revolution - polls are used to determine anything and everything from how "hot" a presidential candidate is to how popular a certain policy will be before even risking one's political hide on what may turn out to be an unpopular decision. Big business followed closely behind, making the tools and the analytics ever more sophisticated in trying to gauge just what exactly this customer may "want" (forget "need", that's a whole other can of worms) to buy.
In today's world of hyper-sensitivity to user feedback, perhaps it was only a question when this technique was going to penetrate the traditional methods of storytelling. Well, it's happened, and it may be more significant in this area then in all the areas that preceeded it, simply because you're creating a narrative that is for the first time truly a dialogue. This is not about social media, or being able to give your favorite writer or comic book artist feedback on their latest creation via their blog. These are new methods, involving new media, that at their best give the user an opportunity to truly and permanently impact the development of the narrative itself.
There are many examples.... Stories that are done as linear movie clips on YouTube. Web comics that include "choose your own story" model (remember those books?) to customize the user experience. Non-linear storylines where the user can follow a character or a segment of the story and cut thru the parts they don't relate to as much. Complex projects that include wiki materials that can be easily accessed by clicking on a button - and not losing the flow of the narrative. And so on, new ideas are happening as these very words are being written.
At worst, these can be distractions in what used to be a pretty straightforward medium. At best, they create immersive experiences which Web 2.0 has become all about. There are so many routes open, but in the end the old rule still holds true - when in doubt, just do it.
Tuesday, September 28, 2010
Hackers are Heroes?
Today I came across an interesting article by Gary Hamel on Facebook Generation vs. the Fortune 500. He talks about the "Generation F" and their expectations from the workplace, as well as unique skillsets and working styles they bring to the table. Read the entire article on Opensource.com
Saturday, September 18, 2010
Lessons of Comic Books make better UIs
As someone who grew up with comic books and viewed them as some kind of a "secret pleasure", it took me a while to come around to the fact that narrative and visual devices used in sequential art not only apply to the digital media, but can in fact be a driver for better, more immersive User Experiences. With the proliferation of SmartPhones and iPads we have more digitally literate people then ever, and that will only keep increasing.
Somewhat shortsightedly, the main concern of comic book companies has been how to get their print comics on the web, gettomg a second source of revenue for the same basic product (recycled story and art, minus printing, so it's essentially cost-free the second time around).
But why not consider tweaking that product and above everything the delivery model so that the user truly has a different experience, and not just a digital copy of the printed page? Think about it. Comic books were developed on the premise that you want to pack action and essentially bring drawing one step closer to animation. Yet animation and digital comic books have essentially evolved in separate directions, even though the very format of sequential art lends itself to presenting different types of content in different frames. And the technology can handle it now. What it does require is an investment in bringing the "envelope" to the next level, and while it's admittedly more involved than just copy/paste from the print medium, it allows the user to substitute the tactile experiences they're losing in transfer from print to digital (interaction with paper, un-evenness of page due to printing, owning a physical comic book, etc.) they can potentially replace not just with widgets, but with a truly improved and altered user experience.
What's interesting here though, and brings it outside of the world of comic book geeks sitting in dark basements is that the same lessons apply to just about any other vertical. No, it's not just a case of the Geek and the Suit sailing off in opposite directions and meeting each other again half-way across the world. While it's a fact that the comic book properties have flooded the mainsteream in the recent years, there is no reason not to believe that the spike will drop at some point. But for intents and purposes of strictly improving user experiences in any vertical or type of content, the true driver is the fact that today's user has come to expect and prefer information to be delivered in a manner that strikingly resembles, well, a comic book page. We multitask everything. We look at a few things at once. We prefer it that way.
In recently working on User Interface screens for CABEM's upcoming update to our Livia_vLab application it really hit me that this is exactly what we're trying to do. Even though the narrative is not necessarily sequential, everything else applies. User experience design was always about organizing and displaying information in a manner that is engaging, logical and well organized. Comic books do the same. If anything, being free of having to follow a completely linear narrative, the layout becomes even more engaging. It's not a book, it's a command module. And it's not just about storytelling anymore, it's about project management, organization, collaboration, archiving, and every way you find yourself working and looking at information every day.
Wednesday, September 15, 2010
Ten Strikes
A number of web sites block logins after just three failed attempts. Every site wants a different login and password, so sometimes it can take more than three tries to remember which password to use. The paper "Ten strikes and you're out": Increasing the number of login attempts can improve password usability takes a step toward quantifying the costs this policy. They find that increasing the number of allowed attempts to 10 could potentially eliminate 47% of password reset requests.
Wednesday, September 1, 2010
Pipes for Windows?
Today I had to get a list of files out of a zip file and append them into an Excel formatted spreadsheet. As a long time Unix user and being someone unfamiliar with Windows, the easiest way I could think of in under a minute is to use
zipinfo
and sed
and sort
to build a CSV file and then paste it into the Excel spreadsheet. It's pretty simple, just:zipinfo -1 foo.zip | sed -e 's/.*\///' | sort -n -t_ -k2 > foo.csv
(The parameters to sort say to sort by the second field, delimited by '_' characters, which I need to do for this problem).
All very easy on -- from the Unix/Linux shell. The system that will ultimately use these files runs Windows. Is there any quick and dirty way to do this kind of throw-away scripting on Windows?
I have used Cygwin before, and could install it, but it always takes several hours to install, which seems like an awful lot of work to avoid a few file transfers. Of course, I could do the entire process manually under Windows, copying and pasting filenames from Windows Explorer. However, I have about 15 of these files which would make it pretty time consuming.
At the other extreme, I could probably write a .NET program in a few hours, but I have few enough files that copying and pasting from the CSV file is faster just typing a simple command line (though with .NET stuffing data directly into the spreadsheet becomes pretty easy).
So how would you handle this on Windows? Is there something similar to Unix pipes that lets you quickly handle one-off tasks like this?
Monday, August 30, 2010
MySQL Discussion at BGLUG
I went to the Bluegrass Linux User's Group (BGLUG) meeting last Saturday and saw an interesting talk about MySQL by Eddie Pauley. He covered the basics as well as some practical experience in scaling up to larger sites for his employer twinspires.com.
I would like to encourage anyone in the area with an interest in Linux or Unix to attend a meeting. They are typically held the third Saturday of the month at the Eagle Creek branch of the Lexington Public Library, though locations some times vary, so check the BGLUG website for times, topics, and locations. You can also chat with the group on freenode.net channel #bglug.
Sunday, August 8, 2010
Web-App Authentication in a Multi-Domain Active Directory Environment
CABEM has a customer who uses Active Directory internally to authenticate users. A web application we wrote for them ties into their Active Directory setup using LDAP to authenticate internal users to the application, using their email as a login name.
The adLDAP PHP class makes that pretty easy, we just look for the user name matching the email address, then authenticate as that user. They have recently switched to a setup with multiple sub-domains, requiring the application to authenticate across the sub-domains. I found very little on using adLDAP or LDAP in general to authenticate in a multi-domain environment, so I'll document some of what I found here.
Within a single domain, any domain server can answer a query because they synchronize information with each other. The reason for using sub-domains is because the link between the sub-domains is assumed to be too slow to keep domain controllers in sync. Only information in Active Directory's Global Catalog are shared across domains.
Our client has configured Active Directory to put all their internal users into the Global Catalog. That way a user visiting a remote site will be able to log in to any windows machine. The login may take a little longer, but travel to a remote site are uncommon. To reduce the amount of information that needs to be shared between sites, not all user attributes are made global.
The first problem we ran into is that email addresses were not being made global. As a result email lookup failed outside the user's home domain. The straightforward way to fix the problem is to mark the email address as a global attribute.
The other issue is more subtle. The adLDAP library authenticates users by trying to bind to the server as the user. Active Directory expects the user name to be either an LDAP Distinguished Name or a User Principal Name. The distinguished name explicitly calls out information about the user. A typical name would be something like "OU=users, OU=accounting, cn=Bob Smith, dc=carolina, dc= example, dc=com" identifying a user named Bob who works in accounting at the Carolina office of example.com. The DN's are pretty cumbersome, and likely to change if Bob ever moves to a different location.
The User Principal Name can be formed by concatenating the user's Active Directory name to an '@' followed by the DNS domain name of his or her home domain server. In this case it would probably look something like "BSmith@carolina.example.com". Though, this looks like an email address, it is not necessarily. The company we are working with uses a convention that would make Bob's email address be "bob.smith@example.com".
Active Directory generally does not allow anonymous access, for security reasons. Since a single connection with adLDAP might deal with several users, adLDAP conveniently stores the sub-domain name in its
account_suffix
attribute. However, the account used to get Active Directory listings only exists in one sub-domain and the adLDAP::authenticate
method binds as both users within the same method call.The solution is to set
account_suffix
to the empty string and pass the full User Principal Name rather than just the SAM Account Name to adLDAP::authenticate
. Not using the account suffix really is not any more work. The code calling adLDAP just needs to as for userprincipalname
rather than samaccountname
.As is often the case, once you know what to do it's easy. It's figuring out what to do that is difficult.
Sunday, July 18, 2010
Objects vs. Arrays in PHP
Traditionally, an array is a data structure storing values indexed by an integer. What PHP calls an array is really an ordered map, a data structure that maps a key to a value with some notion of how keys should be ordered when iterating through the map. Keys can be either integers or strings, and values can be any PHP type.
The obvious uses for arrays are when you need to store data indexed either by a number or by a key. The ordered map semantics of PHP arrays also allows them to be used to build arbitrary data structures fairly easily. The array keys are like field names and array values are values. New fields can be added at run time, simply by assigning a value to a new key representing the new field name.
This is a wimpy form of object oriented programming (OOP) -- by convention the methods that operate on an array pseudo-objects can be kept in one file, perhaps along with comments that describe which keys could be present. This wimpy OOP saves us the trouble of creating a new class, but relies on convention and extra documentation for clarity.
I have seen quite a bit of code that does this, so it appears to be a common idiom, probably left over from PHP4. PHP5 provides better object oriented support, so when should programmers use an array, and when should they declare a new object?
When To Use Arrays
The built-in array functions in PHP make it easy to use PHP arrays to implement the same functionality as a number of common data structures like queues, stacks, lists, etc. Most of these data structures are similar enough to arrays that it is best to take advantage of all of the built-in array functions, rather than trying to re-implement all that functionality with objects.
Sometimes, it is pretty clear when an array is called for. If you want a variable number of items, indexed numerically, that begs for an array. For example, if to write an RSS feed reader that gets all the articles from a group of sites within the last 3 days, the list of sites and the articles returned would make make sense to store in arrays. Or, to store definitions for words, it would make sense to use an array with the words as keys and the definitions as values. For example,
[sourcecode language="php"]
$words = array(
'doe' => 'a deer, a female deer',
'ray' => 'a drop of golden sun'
);
[/sourcecode]
Retrieving the definition of
'doe'
is as simple as $words['doe']
.Things get a little less clear cut when dealing with more complicated data. In the word definitions example, you might also want to store pronunciation, and etymological information. The straightforward incremental change is to make each array value be an array with all of the properties you care about. For example,
[sourcecode language="php"]
$words = array(
'doe' => array('definition' => 'a deer, a female deer'
'pronunciation' => 'do̅'),
'ray' => array('definition' => 'a drop of golden sun',
'pronunciation' => 'rey')
);
[/sourcecode]
Is a common way to handle the issue. As more attributes of a word are needed, they can be added to the array describing each word.
In a language like C or C++ this would typically be done with
struct
s. Passing around data like this in arrays has advantages and disadvantages. The advantage is that you can crank out code pretty quickly because you do not have to design an actual interface -- just put in all the stuff you want for now, and if you have to change it, just add or remove fields later.Using arrays in this case does have several drawbacks, though. First, there is no easy way to check the type of the array to make sure the right array are gets passed to the right place. Passing a variable to the wrong parameter type to a function or method is a fairly common error to make. If words were defined as objects, the PHP interpreter would catch the error and warn you about it. Any time the interpreter can tell you the precise line of code that has a bug, that is a big time saver.
The second problem is that not thinking about how code will interface usually results in interfaces that are sloppy and inconsistent. In cases like this, it is fairly common that some arrays values are initialized and some are not, so the code ends up having to check for every attribute before it can be sure it is there. Often there will be a set of functions that operate on these word arrays. Putting those functions in an object with a word word makes more sense. Sometimes sets of attributes are mutually exclusive depending on the value of another attribute. This is an excellent time to take advantage of inheritance.
When To Use Objects
The above example can be recoded using objects like this:
[sourcecode language="php"]
class word {
public $definition;
public $pronunciation;
public function __construct($pronunciation, $definition) {
$this->definition = $definition;
$this->pronunciation = $pronunciation;
}
$words = array('doe' => new word('do̅', 'a deer, a female deer'),
'ray' => new word('rey', 'a drop of golden sun')
);
[/sourcecode]
Though this example is about twice as many lines, the more arrays of words you create, the smaller the overhead is. We don't have any word operations defined here, but as they are used more and more, some are likely to crop up.
An advantage of the object-based approach is that PHP can check the type of an object passed as a parameter, when passing a single word, whereas all arrays look the same to it. If you want to make sure an array someone passed is valid you have to explicitly check it, which is more work for the programmer. Unfortunately, PHP does not provide an easy way to require a function be passed an array of a particular object.
Conclusion
If you want a list of items or a hash table or dictionary, then arrays make perfect sense. There are lots of array operations that make operating on arrays fast and easy, so there is no reason to avoid them when they are a logic fit.
When data has well defined attributes and operations an object makes more sense. PHP can provide type checking, implementation can be hidden behind interfaces, operations can be coupled with data, inheritance can simplify implementation, and all that other good object oriented stuff.
Wednesday, May 5, 2010
Apple and Adobe: Why can't we all just get along?
As someone who is a (almost) lifelong uninterrupted fan of both Apple and Adobe, I have eagerly been waiting for the news that Flash would be integrated into the next iPhone since the days of 1.0. Instead, we are treated to an open email from Steve Jobs posted on the Apple.com site that basically not only says "don't hold your breath" but goes on to attack Adobe's products (and Flash in particular) as not Open source enough, or not in accordance with Apple's vision of what next generation of browsing should be. I know Adobe has gotten their jabs in previously too, but in general it seems to me obvious that Flash does offer some options as far as interactivity on the Web that YouTube just doesn't. YouTube is great for video, but it really is just that - a platform for video.
Being from a generation of DIY web designers/animators/developers from the Gold Rush days, I can't help but feel that there should be room for some exploration as far as narrative storytelling (or just information exchange) on the web, and Flash to me has always seemed as a good (but not only!) tool for this as any other out there. I think that in the era of user-generated content of higher and higher quality we forget that there could and should be experimentation with the User Interface Design, combining different media, video, gaming, mouse/keyboard interaction to create content that encourages user participation. One of the most appealing aspects of Flash in my opinion is that it's fairly inclusive of other kinds of content, and unusual/weird navigation and UI structures.
And don't tell me I can't have buttons! Jobs talks about how next generation browsing includes a different set of actions that isn't button-friendly, and obviously he can ultimately have his OS do what he wants it to do. But as a visionary, someone who has helped expand our horizons so many times, perhaps he would serve his own vision better by being a little more inclusive.
Let's make it happen!
Wednesday, April 14, 2010
CABEM launches it's long awaited blog!
CABEM Technologies is a software design business, a service provider, a product developer, a partner and a consultant. We are all these things, but most importantly, we are a group of people, interested in the world around us and looking to make it better. We also have some opinions about it, some based on years of experience, some just on a hunch, some right, some wrong. This is a place for us to express some of those, and we hope you'll stop by for a read every now and then. Thanks!
Wednesday, February 10, 2010
vLab to go Mobile
It's been a little while since our last post - we've been busy on the product development side at CABEM, rolling out our Livia_Marketing Manager software and working on general improvements to our entire software suite. The SmartPhone owners out there will also be happy to hear that we've been playing with a nimble version of CABEM Livia_vLab that will be designed specifically for the mobile technology. Actually, the real truth is we've been excited and playing with it for a while, researching UI standards and new trends in mobile apps, but we've been doing this for long enough to know that you don't force a technology on a project just because it's "new" and "cool", you pick the technology to fit the need. Well, now that the need has been defined, we are having a blast, and we think our customers will like the results. Speaking of customers, we are looking to make the end user engaged in creating the user experience from the start, so we'd love to hear opinions from existing vLab users and people with experience in Virtual Witnessing alike. For more information about mobile apps design at CABEM or to get involved in this project, please contact mobile@cabem.com
Subscribe to:
Posts (Atom)