« January 2006 | Main | March 2006 »

February 28, 2006

Plotting the exact X/Y coordinates of clicks on a page

We've worked with the National Maritime Museum in London for many years (who use our CMS, Amaxus). Over this time their web site has become incredibly successful, but now it's time for a design refresh, which will start with a number of real user-testing sessions.

To complement this, we decided to record the exact position of any clicks on their homepage, to see if people's click behaviour could tell us anything interesting about the current site. So one of our developers, Jon, used his lightning AJAX skills to quickly set-up the sending of a tiny XML message for every click on the page (that includes data such as: X, Y, user agent, text size setting, browser window size, etc.).

We then plotted this data using a variety of techniques (simple red crosses for clicks, grid-based heat maps, and Jon even made a lovely normal-distribution heat map). Many of the patterns we saw are not specific to the template, so I thought I'd share these with you.

First, a quick disclosure: all non IE-on-a-PC clicks have been removed (because other browsers render the page slightly differently), as have clicks from users that have non-default 'text size' (again, which causes the X/Y of clicks to be meaningless when combined together), and any users internal to the museum.

People click towards the middle (horizontally) of a link

The top menu of the NMM site, with clicks marked

As a consequence of Fitts' law (perhaps?), there was a definite trend towards the centre of links.

A slight trend towards the bottom of links

The calendar from the NMM site, with clicks marked

As also demonstrated in the first image, there was a slight, if definite, trend for clicks to be slightly lower than the vertical centre of the link. Is this so that the user can still read the text of the link before clicking?

People click towards the left of text boxes...

The search input field from the NMM site, with clicks marked

OK, so I've extrapolated this result from a single text box, but it would seem to make sense. In English, we're used to writing left-to-right, so do we perhaps try to position the cursor in the left of the available 'space'?

... and the bottom right of buttons?

The search button from the NMM site, with clicks marked

This needs a much larger variety of tests, but from the single button on the page, the clicks were concentrated in the bottom right corner. It would also be interesting to test the difference between square buttons and rectangular buttons. Actually, Jon's normal-distribution map shows this better:

The search button from the NMM site, with a heat map of clicks overlayed.

Next steps...

We're currently recording data from a few other sites, to get a better idea of generic patterns. If anyone out there can translate any of this into meaningful guidance for design, then let me know below! (For example, if people click towards the left of text boxes, should you not place links close to their left edge, in case of accidental clicks?)


Link: http://www.oreillynet.com/xml/blog/2006/02/plotting_the_exact_xy_coordina.html?CMP=OTC-TY3388567169&ATT=Plotting+the+exact+X/Y+coordinates+of+clicks+on+a+page

February 27, 2006

The Transparent Microsoft -- "What! No Evil Demons Lurking Inside!?"

It has become increasingly apparent as of late that several of the teams at Microsoft in which, by nature, tend to be criticized more often because they are exposed to a much broader/larger audience of folks, are beginning to change what we perceived, in the past, to simply be the Microsoft way. Because Internet Explorer represents a perfect example of this kind of extreme exposure, The IE team is an obvious candidate for just such criticism.

Of course the IE team at this stage of the game tends to lean more towards the IE7 team label. Closely knitted to the efforts of the IE7 team is the RSS team. While in previous years it hasn't seemed like this was the case, things seem to be changing as of late, the result of which is showcased in particular by recent activity of the IE7/RSS teams in which have taken it upon themselves to proactively seek after such criticism, literally entering into areas such as the Atom and RSS syntax mailing lists, asking questions like (paraphrased) "What do we need to be doing to make things better for everyone involved?"

What could this mean?

Well, I'm guessing that out of a sampling of 100 people who read this post, a solid 10% will suggest that these efforts simply represent something that's less obvious to the untrained eye, but evil none-the-less.

NOTE to these 10 folks:

"When did Slashdot let you out of your cage?"

Oh.... No reason. Just wondering. You've got some drool rollin' -- you know what, don't worry about it... you look great! Really! I really do mean that.

[QUESTION-TO-THE-OTHER-90% : Is that drool, or is he just salivating while he thinks about wanting to eat me for lunch?]

Hmmm... Seems I'd best close this one out and -- wait, "whats that... Oh... sorry, no, we don't have any of those clever little icons we cut outta magazines and glued to the screen... You must feel lost, huh?

"Yeah..."

Poor things... they must feel like they've been lied to all this time, huh?!

Actually, I think they kind of have. That, or the MS recruiting folks are doing a bang-up job and bringing in folks who are less concerned with stock option value (or lack there-of as the case may be/is) and more concerned with being passionate about creating the next generation of Microsoft and the next generation of Microsoft Software.

I think its probably a bit of both.

But I'll tell you what... Pop-on into the Atom-syntax archives (start here.) at some point and take a look at whats going on... Its really quite cool to see that Sean Lyndersay has taken it upon himself to proactively seek the questions, comments, and bug reports in regards to the Atom/RSS Data Feed support in the IE7 product. It's this kind of proactive transparency that, when combined with the transparency that already has made itself known on the IE7 and RSS team blogs (and a whole bunch of other MS team blogs as well), is going to be the difference between a development community that believes that Microsoft could care less, and a development community who suddenly now realizes this is simply not (no longer?) the case, and reacts by providing valuable/usable feedback from folks who would otherwise not even bother.

The great thing about this is that the folks that I am referring to, the ones now providing feedback, that otherwise would not [UPDATE: Actually, that's not true... these folks WOULD and DO help if and when they are asked... I just don't think that MS has a history of asking. Suddenly, it seems this is no longer the case.], are folks like the Tim Bray's, the Sam Ruby's, the Uche Ogbuji's, the James Snell's, the ... well, the list goes on with names just like this for several miles, if not more, something in which you can drop by and see for yourself. These are the folks who truly love building great software, and are passionate about every level of the process.

Seems like Sean, and the rest of the IE7/RSS folks are proving quite nicely that, in fact, they too love building great software.

What about the passion?

Seems to be there just the same.

These are all *GREAT* and *WONDEFUL* things that we are *ALL* are going to benefit from because of this.

Keep up the GREAT work IE7/RSS/Sean and all of the folks on Atom-syntax list who are proving that the thing that matters most is helping in the effort to ensure we don't spend the next 10 years of our lives fixing all the mistakes we made in each of the years preceding the next because we simply refused to take into account all of the little, teenie, seemingly weenie things that, in fact, are just the opposite. Its rarely big things that cause problems in software, and instead LOT and LOTS of little things.

Details matter!

This stuff *REALLY, REALLY* matters.

And all of these folks who are putting for this effort are the ones that matter most.

Thanks everyone! Today, tomorrow, and for what seems to be be many, many years to come, these transparent efforts of MS, and the willingness of the Atom development community to simply help where the help is needed is going to result in a MUCH better world for all of us because of these efforts. These folks deserve a huge round of virtual applause from all of us for the efforts they are putting forth. And I mean that from both sides of the Atomic-structure-based fence (everything's Atom-based, right? Yep, sure is. :)

Enjoy your AtomicRSS-enhanced Day! :)

[UPDATE: Regarding MS and asking for feedback. When it comes to their vast network of pro-MS developers, the history is quite a bit different. But the folks on the Atom list in particular tend to be more from the LAMP/Perl/Python/PHP/Ruby/Linux camps, and as such, this is more of the "history of not asking" I am referencing above.]

[ONE FINAL UPDATE: I don't know how kosher this really is, but I also don't think that highlighting the positive things that continue to take place in this space is a bad thing either. My apologies if this is the kind of thing that maybe should be left to be discovered by individuals on their own, but a recent post back from Sam Ruby to Sean Lyndersay's latest post does such a great job of highlighting what I mean when I say these folks TRULY care about and are passionate at EVERY level of the software development process that starts with an idea, moves into various proof's of concept, begins to develop a specification, a group of passionate folks come together and create a standards group for the development of this spec... etc... etc... etc... until they've reached the next level, which is taking the experiences of both the triumphs and the mistakes, and building better software using these experiences to then start at the beginning, and moving forward through the recursive/cyclical process all over again.

I can only think of about five folks who are in the same category/@ the same level as Sam Ruby when it comes to someone who simply deserves every ounce of credit and respect he is given, and in fact deserves more than that, but as is common among the elite at this level... its not about that. Its about the software and the process from start to finish of building that software to then support it, to then build better software, and so forth.

In and of itself, this is the reward, and what continues to drive the best and the brightest among all of us. (Like Sam)

Sean's followed by Sam's comments are below (archived post)


Sean Lyndersay wrote:
> Thanks James. I’ve filed bugs in our bug tracking database for each of
> the issues that came up in the feed validator (except for flagging
> /atom:*/ items, since these are a correct use of RSS 2.0 extension
> namespaces).

Re the flagging of atom: elements: this was indeed a bug in the Feed
Validator.

The Feed Validator was incorrectly flagging the use of atom:author
elements at the channel level and atom:link elements at the item level.
A test case has been expanded to include these elements, and these
problems have been corrected.

The fix should be deployed online in a matter of hours.

- Sam Ruby

The next few hours?

Ummmm.... WOW! Thats really cool :)

Transparency at its finest hour.


Link: http://www.oreillynet.com/xml/blog/2006/02/the_transparent_microsoft_what.html?CMP=OTC-TY3388567169&ATT=The+Transparent+Microsoft+--+What!++No+Evil+Demons+Lurking+Inside!

Sourceforge does Subversion

Sourceforge has enabled Subversion support for all projects.
Now you don't need CVS anymore, Subversion really has become "a compelling replacement for CVS".
Link: http://digg.com/programming/Sourceforge_does_Subversion

The Transparent Microsoft -- "What! No Evil Demons Lurking Inside!?"

Well that sucks... what good is a transparent Microsoft, if theres nothing but... well, nothing whatsover to look at but the other side of... nothing. Hmmm... this might make good business sense, but what fun is a non-Evil Micorosoft?! THIS ISN'T FAIR!!! Or is it? Actually, interesting enough there seems to be other things besides the somewhat sick, yet satisfying pleasure of crying "Evil!" that are beginning to prove something a lot less sick, a lot more satisfying, and in the end is bringing about something even better! Results (of the O-B-Positive-type ;).
Link: http://www.oreillynet.com/pub/wlg/9257?CMP=OTC-TY3388567169&ATT=The+Transparent+Microsoft+--+What!+No+Evil+Demons+Lurking+Inside!

Commit emails and password prompts on RubyForge

Commit emails are now available on RubyForge for projects using Subversion! This has always been available on CVS-based projects, but I finally got around to putting it together for Subversion projects this weekend. A few notes: When I first tried...
Link: http://tomcopeland.blogs.com/juniordeveloper/2006/02/commit_emails_a.html

February 26, 2006

O'Reilly

There have been a number of interesting debates going on lately in quite a number of different areas that all have a certain thread running through them. A recent article asked whether PHP has taught too many bad habits and that it is slowly dying in its nest of bad code (and worse coders). The Java side seems to be facing the same existential angst - whether Java is in fact becoming an obsolete language, especially on the Web - and the arguments even range in areas as diverse as Perl, C#, Ruby and C++.

My suspicion here is that what is going on has less to do with the benefits of Java over Javascript (or vice versa) but has more to do with a deep level disquiet about the fact that maybe object oriented programming itself is changing in ways that challenge its initial tenets, that raises the possibility that maybe, just maybe OOP is not the ideal solution that it was deemed nearly thirty years ago. Admittedly, thirty years is a long time for any kind of technology to hold sway, so you could argue just as effectively that OOP has been extraordinarily effective over that time, which I agree with completely. However, these don't make a duality. Rather, I think that both statements are true, and that we are only just now beginning to recognize this fact, much like finding oddly loose flooring raises the disturbing possibility that dry rot has set in underneath the support braces of your otherwise seemingly well-built house.

Object oriented programming began as the logical extension to the datatype that was pervasive in the procedural age. A datatype is a compound structure of either other datatypes or primitive types, or both. In certain languages, such as C, there is a fairly strong degree of correspondance between the most basic datatypes (integers, floating point numbers, characters, and so forth) and physical memory structures -- an integer, for instance, would consist of between two and four bytes, and would have one representation for positive numbers and another for negative numbers (typically two's complement notation) ... this would correspond directly with the way that a machine represented the integer internally. Thus, while simple type was an abstraction, it didn't abstract very far.

However, most data structures require more than one atomic type. A coordinate needs two, or perhaps three such types, along with some means of defining units. A string is a sequence of characters maintained in a linked sequence. An address or something more complex could in fact be made up of multiple levels of such simple types, bound together in a certain manner.

Data structures are purely declarative entities. You are declaring their existence, rather than assigning them intent. In a procedural world intent in turn is provided via functions defined within local libraries that accepted these data structures as inbound arguments, and returned other data structures as outbound arguments. A data type is the first level abstraction of a data structure, listing the associated component types but not specifically allocating values to those types.

The problem with this mode of operation is one of scaling. A linked library is a collection of individual "intents", functions, that are grouped together by an overarching commonality - a graphics library, a file I/O library, a stack library, and so forth. This works reasonably well in certain domains ... indeed, its what made such things as Windows 3.0 a reality, as that code was still procedural rather than objective, but that was probably about the largest (arguably larger than the largest) space that you could in fact use pure procedural code. Code management simply becomes too complex otherwise, and the possibility that two data structures or functions from different libraries would have the same name and signature but different functionality grew considerably, resulting in hideously long names and extremely complex parameter signatures.

The other problem with this approach (and the one perceived to be the problem to solve) was the fact that you needed to maintain a very comprehensive scope for data structures that persisted beyond an immediate functional need, and the likelihood of collisions of those variables reached a near certainty, especially if you had more than one team working in the application at any given time. The heart of polymorphism comes not in the fact that you can have multiple classes perform a similar operation in a common manner - it is that you can have multiple classes utilize the same name for potentially similar but not necessarily identical operations. This is a subtle but very important distinction, one that holds just as true within the namespaces of XML as it does in C++. Polymorphism allows for the reuse of names without having to resort on arbitrary (and often byzantine) naming conventions.

The next characteristic to arrive in the notion of an "object-centric" rather than "procedure-centric" approach is the concept of encapsulation. An "object" is a combination of an internal data model that has scope only within the object declaration and a collection of functions (now called methods) and properties that provide a means for the reading and manipulation of that internal state. Of course, that internal state may also have a direct connection to objects that provide "side-effects" to this state change, but from a programmatic standpoint these side-effects are in fact irrelevant - this object definition is an abstraction that hides the complexity of directly manipulating these side-effects.

One rule that I've observed over the years is a simple one - "Abstractions require energy, whether in the form of increased processing power, more memory (including hard drive storage), greater bandwidth or faster hardware capabilities. An abstraction will not be adopted until a minimum energy threshold is reached, at which point it will seem to coallesce 'overnight'."

This concept is an important one, and serves to highlight why computer technology seems to have definite periods of intensive innovation and activity followed by periods where there seems to be very little such innovation. The periods of intense innovation (one of which I believe we are in now) are brought about because the threshold has been reached to allow for a higher level of abstraction.

Notice that I've talked about polymorphism and encapsulation as being key components, but the one I haven't addressed yet, and the one I think is most controversial, is that of inheritance. For many, many programmers, object oriented programming (OOP) is mainly about the principle of inheritance. I want to state here something that will likely get the dander of many people up - I think that inheritance is in fact a red herring.

Inheritance is one of those concepts that looks eminently good on paper - think about the code reuse you can get by creating a class from another class, adding one or two properties to those defined in the parent class and redefining the definition of one or two other methods or properties. This has been a selling point for OOP adoption to literally a generation of software developers, and in a small enough domain, it would seem to be a pretty good idea.

However, one immediate effect of inheritance is that it means that even the most mundane change to a class must result in the creation of another class, and the changes introduced into a given class close to the top of the inheritance tree intorduces the possibilities of changes to all descendent classes as well, creating a strong incentive to not change such core classes. This means that you must guess very early on about the interfaces that a given class closer to the root class must have in order to work more effectively with descendent classes. This is an extraordinarily difficult task, made even harder because programmers are not generally trained (or given the time) to create the best code, but rather to create code in the quickest fashion possible.

Because of these factors, such code frameworks periodically have to be written from the ground up, usually at tremendous costs in migration, in getting the updated libraries disseminated, and in time spent regaining currency in an API that a programmer had already invested considerable time and energy in learning. Occasionally the cruft accumulates so badly that it forces software developers to go off and write a new language altogether, one that has a different syntax so that its not quite so difficult to work with, but that in turn very quickly succumbs to the same faults that the previous language had.

However, its worth realizing that most languages may very significantly syntactically yet otherwise be similar enough that they can be mapped cleanly one to the other. Indeed, this is one of the principle tenets of Microsoft's CLR, that it recognizes this basic fact and consequently makes it possible to create sanitized versions of languages that share the underlying structure. Admittedly, there are any number of languages that do not in fact correspond even remotely to the CLR model, but as these don't tend to be well known to most developers (Ocaml, anyone?) the premise of a common runtime is seductive. Ultimately, however, I think it still misses the point - it attempts to impose a pure OOP bias upon all languages, even those that are "object-like" but that generally tend to utilize weak typing and minimize the role of inheritance.

The arbiters of programming fashion periodically deem that languages such as C++ represent the pinnacle of perfection and that languages such as the older style Visual Basic (before Microsoft got CLR religion with .NET), Python, Perl (gasp), or even Javascript (double gasp!) represent a debasement of true programming principles because they have OOP like characteristics but aren't as rigourous in enforcing full encapsulation or even in supporting inheritance to the same degree. They are called "object-like" languages as a consequence.

Curiously enough, object-like languages tend to encourage the development of components rather than classes. This might seem like a recipe for anarchy, but curiously enough, such component based architecture seems, in many, many cases, to work better than the "pure" approach of building complex frameworks. Why? I think a part of the reason stems from the fact that such components are designed not to be inherited from. If you can transport the component libraries to your users, you don't need a complete runtime for the entire class framework infrastructure. It separates out the need to have highly skilled OOP developers at all levels of the application, instead breaking the problem domain into highly skilled component developers and much lower skilled component integrators, and, so long as some consistency is provided in establishing presentation standards such components can be both more robust in the face of incoming datatype formats and more "skinnable" at the integration level.

Indeed, looked at in this light, component-centric languages exist at a higher level of abstraction than OOP languages do. Far from being throwbacks to a pre-OOP time, such component languages could only exist once computers reached a sufficient level of complexity to enable the jump from OOP to component systems.

The next obvious jump in abstraction is in the establishment of XML and the document object model. Indeed, I've often thought for some time that the document object model has been misnamed - it is more properly a document component model. People do not inherit a <P> paragraph object generally. Rather, that paragraph contains other content - text nodes, bold or italic containers, spans, etc. Inheritance in fact plays very little role here, while encapsulation is implied in HTML (and SGML) but made explicit within XHTML. and XML.

The XML abstraction has, curiously, seemed to shed much of the baggage of intent in its way to becoming the dominant mechanism for expressing data structures. The DOM mechanisms generally do not provide any intent within their semantics - they exist only to provide means of navigating and extracting elements from the data structure itself, without any preconceived notion about the meaning of that data structure. Certainly, XML schemas do have implicit semantics, and hence there do exist sets of operations that can be performed upon them that are semantic specific, but unlike with object-oriented code, the intent as expressed by such methods can be thought of more as an overlay upon the XML that can be switched with other overlays when the need for switching the intent changes.

The same thing holds true for the notion of type, which, as previously mentioned, is itself is an abstraction. The XML structure does not, in fact, have any explicit requirements upon it to represent type-valid content; this is radically different from most traditional OOP models where type emerges as an artifact of the need to maintain some correspondance with the physical hardware limitations of a given computer. In C++, a string is a class that contains a pointer to multiple characters of a specific character width connected via a linked list structure. In XML, a string is simply a label that will let the XML parsing mechanism determine what the best representation of that data needs to be. What's more, the constraints and containership that a schema implies can be expressed in many different ways, from DTDs and XSD to RNG and Schematron, each of which can specify very different constraints. Thus, as with intent, type itself is an abstraction over an XML document that is imposed from without.

While XML is certainly the most self-evident of these "post-OOP" languages, it isn't the only one. Dynamically typed languages, where the type is resolved based upon context, illustrates again this notion of the fluidity of type. They depend upon OOP typed systems, just as OOP depends in great part upon the notion of procedural code, but they represent an abstraction layer above that provided by such languages as C++ and Java. This in turn tends to push these latter languages further down the stack, away from the building of "workaday" applications and into the realm of constructing the more abstract languages. The higher abstraction languages are also, of course, more inefficient - any abstraction layer will decrease the immediate efficiency of execution, though usually this is more than counteracted by the flexibility that the abstraction layer provides in creating simpler, more manageable code. This is another restatement of the energy principle espoused above, by the way.

Thus the rush to "objectify" languages such as Perl and PHP has caused problems, because a move too far into the realm of pure-inheritance based OOP opens up the door to the full foundation class conundrums that languages such as C++ and Java now face. This is not to say that organizing content using encapsulation and method intent is a bad idea - there are times where it is preferable to maintain the intent with the data. However, taking this to the next step of requiring extensive inheritance models, especially in settings (such as web processing) where the need to maintain elaborate class structures is considerably lessened, usually ends up only adding to the overhead of development and places requirements that developers be considerably more skilled in their programming ability.

On the flipside, the distributed processing models that we are now heading towards means that state needs to be more fully managed upon the client. Here, again, though, such state management works more effectively in a component based environment, which can be seen as being a considerably simpler domain (and which, in general, tend toward being model/view/controller oriented). At the moment, in the AJAX space there is a rush to put out libraries of "helper functions" to perform specialized tasks, replicating in the main the procedural efforts from before OOP became established. I suspect that AJAX will probably not fully "stabilize" until you see a compelling set of components in this space, though good components that work well across the range of browsers currently out there are hard to come by.

The final piece of the puzzle comes in finding the balance that works best for developers. A significant number of web developers on both the client and server side (the domain where scripting and similar high abstraction languages express themselves most clearly) are surprisingly maladept at dealing with object-oriented code ... they still employ the crudest form of code reuse - cutting and pasting content - generally have only marginal ideas about the value of the OOP paradigm, and utilize tools that keep the percieved space of development in a procedural model, even if the tools themselves may encapsulate this within a rudimentary OOP framework.

One expression of this is the current demand for good AJAX programmers. AJAX is not new - all of the pieces have been around for nearly half a decade, and while certainly specific aspects of AJAX programming can be a little more challenging (closures and asynchronous development, for instance) in an area where you might expect there to be a glut of Javascript programmers you have employers instead going begging. My suspicion is that this is true because most Javascript programmers use the language in a strictly procedural manner, and the component nature of DOM programming generally is at best only poorly understood by most of this "laity", while more traditional Java and C++ programmers find the abstractions associated with working with the declarative environments so prevalent on the web confusing because they lack the framework that they've spent years mastering.

Recently there have been discussions about the increasing role of architects in the web sphere, but the more I look at it the more I'm convinced that the reason for such architects is not the need to be able to handle the construction process directly but because such architects naturally tend to gravitate to the realm of higher level abstraction necessary for dealing with heterogeneous, asynchronous, XML-based distributed applications. This points to another corrollary - each level of abstraction encompasses an order of magnitude more physical systems than the one before it. AJAX systems make relatively little sense within a bounded, single computer system, but make perfect sense in distributed systems involving dozens to thousands of operating systems, servers, and related nodes. Of course, this implies that the next level of abstraction involves the manipulation of entire networks, and consequently the evolution of virtual networks that exist for temporary purposes and then disappear - what I see as the "real Web 3.0". There are signs that such are forming at rudimentary levels now, but as with the emergence of Web 2.0 tech, it is likely that we'll go through a rocky period (purely as a guess, in about eight years) before that next level emerges with the requisite technologies to support it.

I hadn't planned on this post being quite so long, but it points to some thinking that I've been noodling over for a while. I think that most of the discussions about language fitness ultimately are reflections over this same awareness that we've entered into a new domain, a new level of abstraction (indeed, perhaps this is a good working definition for what a "paradigm", one of the most overused terms of the dot-com era, really is). I'm curious as to your thoughts on this.

Kurt Cagle is an author, software architect and systems theorist for Mercurial Communications. He lives in Victoria, British Columbia with his wife and two daughters.


Link: http://www.oreillynet.com/xml/blog/2006/02/oreilly.html?CMP=OTC-TY3388567169&ATT=OReilly

Cool Visual Passwords

Passclicks is a new way to login to websites without users having to remember their old style textual password. Just save your password by clicking on 5 points, then login by clicking on those same points with a 7px margin error. Ingenious!
Link: http://digg.com/programming/Cool_Visual_Passwords

Apache .htaccess tweaking tutorial

A list of tips about the .htaccess file and its tweaking. It will be updated as more tips become available. Just solutions, with no long explaining!
Link: http://digg.com/programming/Apache_.htaccess_tweaking_tutorial

Best Regular Expressions site ever!

Great regex tutorials, resources, quick starts, etc. A whole site just about regex!
Link: http://digg.com/programming/Best_Regular_Expressions_site_ever_

February 25, 2006

Write your own operating system :)

Kernel development is not an easy task. This is a testament to your programming expertise: To develop a kernel is to say that you understand how to create software that interfaces with and manages the hardware. A kernel is designed to be a central core to the operating system - the logic that manages the resources that the hardware has to offer.
Link: http://digg.com/programming/Write_your_own_operating_system_%3A%29

Learning the Basics of the C Programming Language

Learn C programming from these daily lessons. They're nine days ahead of you already so get busy...
Link: http://digg.com/programming/Learning_the_Basics_of_the_C_Programming_Language

February 24, 2006

The IT Crowd - Episode 6 Online

Episode 6 of the UK show, The IT Crowd is now online!
Link: http://digg.com/programming/The_IT_Crowd_-_Episode_6_Online

FREE Books: Mastering AJAX

Mastering AJAX explains how to combine these technologies effectively to implement Ajax into your new or existing Web applications. Like you, we are developers who are "in the trenches," tasked with building Web-enabled applications that provide real value to our customers.
Link: http://digg.com/programming/FREE_Books%3A_Mastering_AJAX

The 2006 Best of Web 2.0

Designtechnica has published their list of favorite Web 2.0 sites out there and categorizes them. Topping the list includes Digg.com, Flickr.com, Vimeo, and several others. Congratulations to these site.
Link: http://digg.com/programming/The_2006_Best_of_Web_2.0

Ajax Multiplayer Chess

this is a java-script multiplayer chess. it's very good for playing quick games (no log-in) and a replay-mode is included to view your last game and others in pgn-format.
Link: http://digg.com/programming/Ajax_Multiplayer_Chess

Really clever C++ GUI toolkit and DE

Smart use of C++ rather than code generation allows this cross platform toolkit to compete with scripting languages and be as fast as C/C++.

See the Comparisons link too. I used to code MFC knowing that qt was much better. When you realise that the Ultimate++ code is about 1/3 of its qt equivalent you really start to appreciate how cool this is.
Link: http://digg.com/programming/Really_clever_C_GUI_toolkit_and_DE

Learning Ruby? Try this.

Here are some practice exercises before you change the world with your grand ideas. This is a great site for smaller sized challenges to help you apply what you're learning. Submit your solution and learn from others' solutions.
Link: http://digg.com/programming/Learning_Ruby_Try_this.

February 23, 2006

Advanced Subroutine Techniques

tile imageSubroutines seem like a basic building block of code. They're simple and easy to understand and use, right? That's true--but there are a few advanced techniques to make your code more maintainable and robust. Rob Kinyon goes beyond making sense of subroutines to making subroutines work for you.
Link: http://www.perl.com/pub/a/2006/02/23/advanced_subroutines.html?CMP=OTC-BD0016219291&ATT=Advanced+Subroutine+Techniques

Turbocharged awk

In a previous article, I covered the basics of awk and presented a small application to reformat address book data. Now, I'll show you how to turbocharge awk. You can improve the performance of your awk programs by uncovering bottlenecks in your code with the help of a profiler, hunting for bugs with XREF, and using Awka to increase speed.
Link: http://programming.newsforge.com/article.pl?sid=06/02/03/1544224&from=rss

Yahoo's PHP Resources

Yahoo has a page specifically dedicated to implementing Yahoo services via PHP. Outstanding!
Link: http://digg.com/programming/Yahoo_s_PHP_Resources

Free Game Programming/Development Books

Over 30 books, 100% FREE.

Game Programming. Clear, practical lessons based on C++/Java game programming are the basis of this book's lessons.
Link: http://digg.com/programming/Free_Game_Programming_Development_Books

February 22, 2006

U.S. Grants Patent For Using AJAX

Now any site that uses rich-media technology implementations, including Flash, Flex, Java, Ajax, and XAML, when the rich-media application is accessed on any device over the Internet, including desktops, mobile devices, set-top boxes, and video game consoles will need a licence.
Link: http://digg.com/programming/U.S._Grants_Patent_For_Using_AJAX

Dynamic PHP - Tricks PHP can do that Java/C#/C++ wont

Creating dynamic classes that change themselves at run time and creating new methods and member variables on the fly. You can't do that with the Java, C++, or C# languages.
Link: http://digg.com/programming/Dynamic_PHP_-_Tricks_PHP_can_do_that_Java_C_C_wont

ROME in a Day: Parse and Publish Feeds in Java

tile imageMark Woodman returns with an introduction to ROME, a Java library for handling syndication feed formats RSS and Atom.
Link: http://www.xml.com/pub/a/2006/02/22/rome-parse-publish-rss-atom-feeds-java.html?CMP=OTC-TY3388567169&ATT=ROME+in+a+Day:+Parse+and+Publish+Feeds+in+Java

Axosoft Giving away $500 Version of Software for $5!

Axosoft is doing a social marketing experiment where they're selling a $500 copy of their OnTime Small Team bug tracker and project management tool for just $5 and donating the proceeds to the American Red Cross. The experiment expires Friday.
Link: http://digg.com/programming/Axosoft_Giving_away_%24500_Version_of_Software_for_%245_

February 21, 2006

Dynamic Ajax Tabs

This article demonstrates how to create dynamic css based tabs using ajax. New tabs can be opened and closed on the fly without refreshing the page.
Link: http://digg.com/programming/Dynamic_Ajax_Tabs

Visual Comparison of 18 Monospaced Fonts

This is a monospaced font comparison screen shot of 18 different fonts which are great for programming.
Link: http://digg.com/programming/Visual_Comparison_of_18_Monospaced_Fonts

How to become an independent programmer in just 1068 days

Gus Mueller, programmer of Flying Meat's VoodooPad, FlySketch, and FlyGesture, explains his entry into selling software for the Mac. In particular, he mentions how to make your application appealing to potential buyers.
Link: http://digg.com/programming/How_to_become_an_independent_programmer_in_just_1068_days_2

Most Simple Ajax Chat Ever

It's so simple, it will make you laught
Link: http://digg.com/programming/Most_Simple_Ajax_Chat_Ever

Charts and graphs in Ruby on Rails

Thanks to Geoffrey Grosenbach for writing the great little Gruff graphing library! It's a fine piece of work and let me create some nice graphs for the indi backend. More specifically, I wanted to do some time based graphs. Here's...
Link: http://tomcopeland.blogs.com/juniordeveloper/2006/02/charts_and_grap.html

February 20, 2006

Prototype Dissected (and made into a lovely wallpaper)

If you love the AJAX-i-ness of Prototype, but never could really get your head around it, Jon has done the world a great favor and dissected every part of the script. He decided to go through the latest version of the Prototype library (1.5.0_pre0) and detail every method and property that was available. Hopefully you can learn as much as he did.
Link: http://digg.com/programming/Prototype_Dissected_%28and_made_into_a_lovely_wallpaper%29

The Future of JavaScript: an Update From The Creator of JS

JavaScript 2.0, aka ECMAScript 4 will be coming in a future version of Firefox, and with it will come Python-like generators and iterators, among other things. The good news is that Adobe and Microsoft are on the spec alongside Brendan from Mozilla, so there is hope for the language to improve in all browsers in a standard way.
Link: http://digg.com/programming/The_Future_of_JavaScript%3A_an_Update_From_The_Creator_of_JS

Firefox Extension Development Tutorial

A nice tutorial teaching how Firefox's Extensions work and how to create them.
Link: http://digg.com/programming/Firefox_Extension_Development_Tutorial

February 19, 2006

CIA World Factbook Information in a Radial Browser

A much more fluid and interesting way to display information from the CIA World Factbook.
Link: http://digg.com/programming/CIA_World_Factbook_Information_in_a_Radial_Browser

How to Think Like A Computer Scientist

This is a very through and easy to follow tutorial for Python.
Link: http://digg.com/programming/How_to_Think_Like_A_Computer_Scientist

Sorting Algorithms Source Code and Performance

This is a great resource for source code for different sorting algorithms. It also graphs performance of each algorithm to help you choose the best one to use. The code is all in C.
Link: http://digg.com/programming/Sorting_Algorithms_Source_Code_and_Performance

9 must have Firefox extensions for web developers

Engadget's CSS blog lists 9 Firefox extensions that anyone who works with web technology should check out. Some you might have heard of already, others you may not.
Link: http://digg.com/programming/9_must_have_Firefox_extensions_for_web_developers

February 18, 2006

HOWTO: Animated Live Search (Worpdress)

How to set up live search for Wordpress.
Link: http://digg.com/programming/HOWTO%3A_Animated_Live_Search_%28Worpdress%29

February 17, 2006

How To Block Fasterfox To Save Bandwidth

A tutorial to help website owners save bandwidth and reduce server loads by blocking Fasterfox from pre-fetching links on web pages. (add code to robots.txt)
Link: http://digg.com/programming/How_To_Block_Fasterfox_To_Save_Bandwidth

Add digg to your site, in a navigable window.

For example, here's Kevin's digg. To add one to your site, just copy/paste a bit of HTML, and tweak the settings (try your username, a digg search term, a digg category RSS feed, or some of the other built-in services). Questions or comments, please let me know (just follow the link down at the bottom of the Bitty site). -Scott
Link: http://digg.com/programming/Add_digg_to_your_site%2C_in_a_navigable_window.