Categories
Uncategorized

Python 3000 Released!

Guido van Rossum’s head on Andre 3000’s body
If there’s an Andre 3000 and a Python 3000,
why not a Guido 3000?
(This photo originally appeared in this entry.)

Python 3000, or Python 3.0 as it’s officially known, is out! If you want to get your paws on it right now, here’s its download page.

Python BDFL (Benevolent Dictator for Life) and Google employee (Python’s his “50% project”) Guido van Rossum makes it very clear in What’s New in Python 3.0 that this is the first-ever intentionally backwards-incompatible Python and features more changes that in a typical Python release. Although this is the sort of thing that usually invites screams from anguished developers, I’m cool with it; although if found Python to be a very pleasurable language to work in, there’s a fair bit of junk that’s accumulated as both the language and the programming scene have evolved. Guido says: “after digesting the changes, you’ll find that Python really hasn’t changed all that much – by and large, we’re mostly fixing well-known annoyances and warts, and removing a lot of old cruft.” Sometimes you have to break backward compatibility to move forward.

I’m hoping to noodle with Python 3000 during the Christmas downtime, but if Python is your bread and butter, I suggest you start looking at the new version ASAP. They’re changes a-plenty that you might stumble on, but as Andre 3000 might say, “It’s all hood.

Links

Categories
Uncategorized

Cheap as in Crap

coby_midget_pc Just over a year ago, I quipped that Acer – the world’s most successful vendor of slightly sub-par but very cheap computer hardware – didn’t have any more sub-par vendors to buy after acquiring Gateway and the dreaded Packard Bell (which I prefer to call “Taco Bell” since both offer dirt cheap products yielding unpleasant results once you’ve consumed them). This was a good thing, I thought, as gathering all the crappy vendors into a single uber-crappy vendor makes them rather easy to avoid.

However, these are tough times, when “cheap and crappy” becomes attractive to customers. As if in answer to the credit crunch, the good news is that there’s been an announcement about a new netbook that promises to be sub-$100 (well, technically $99.95 is below $100).

The bad news? It’s being made by Coby.

coby_logo If you’ve never heard of Coby, you probably don’t hang out in Chinatown, “grey market” electronic stores or Walmart. They’re a manufacturer of consumer electronics of dubious quality bearing a logo that I always found suspiciously similar to Sony’s. They’re the sort of electronics you buy when you need something decent-seeming to give away as prizes at a fundraiser or when your diet consists largely of Top Ramen. I’ve seen too many people burned by the false economy of a Coby purchase to have any faith in the company.

Still, my curiosity cannot help but be piqued. The availability of cheap, very portable, network-capable, almost-disposable computers that you’d pick up at places like discount stores, drug stores and perhaps even those kiosks in the middle of the aisles at your local shopping center is a potential game-changer for both everyday life and us developers. If you look at schoolyards and playgrounds, you’ll see that the Nintendo DS has changed kids’ recreation; what would a grown-up version like dirt-cheap netbooks do?

Here’s what can be gleaned from Inidymedia Arkansas’ article about Coby’s netbook:

  • Expected release date: March 2009
  • Expected models: PoquetMate-7” and PoquetMate-9” (“PoquetMate” is pronounced “pocket mate”), with 7- and 9-inch screens, respectively
  • Processor: Something made by Loongson

I expect that at $100, it’ll run some flavour of Linux. I wonder if it’ll be another case of “Worse is Better” and beat the OLPC at its own game. I may end up picking up one of these suckers on a lark.

Categories
Uncategorized

I’m in Calgary Next Week

downtown_calgary

tech_days_calgary

I’ll be in Calgary from Monday to Friday next week, catching up with my friend and co-worker John Bristowe (he’s Microsoft’s Developer Evangelist for Western Canada) and speaking at the Tech Days conference.

If you use (or are thinking of using) The Empire’s technologies, Tech Days is a pretty good place to get immersed. It’s a conference focused on learning about Microsoft tech on its target platforms – PC, web and phone – both current and upcoming. It’s also a chance for Microsoft developers to get together and network, and you leave the conference with a nice package of free stuff, including a full version of Visual Studio 2008 Professional Edition. (And just between you and me, if your company’s paying for it, Tech Days is also a good excuse to get a couple of paid days out of the office.)

In addition to the conference notes and reportage that you’ve come to expect from Global Nerdy and the accordion playing you’ve come to expect from me, I will be contributing in another way: I’m delivering the A Deep Dive into the ASP.NET Ajax Extensions presentation (it’s part of the web development track and taking place on Wednesday, December 10th at 1:00 p.m.. Here’s the abstract for the presentation:

The ASP.NET AJAX Extensions are the server half of ASP.NET AJAX. Aside from adding controls such as ScriptManager and UpdatePanel to the platform, they extend the ASMX model to support client-side callbacks and JSON serialization. In this session, we’ll explore ASP.NET AJAX on the server – both inside and out – in order to provide you with the knowledge you will need to exploit it to its fullest.

(If I had more time, I think I’d write my own abstract.)

I looked at the time slot I was given and went “uh-oh”. It’s one p.m., right after lunch, which is what people used to call the sexta hora in Latin. That means “sixth hour” and refers to the sixth hour of being awake, which is when people start to get a little bit sleepy. That’s where the word siesta comes from – it’s a bastardization of sexta hora. I’m going to have to make sure that I keep things interesting – I welcome that challenge.

See you in Calgary!

Categories
Uncategorized

A Fix for the Error in Hour 9 of “Teach Yourself ASP.NET Ajax in 24 Hours” / Client-Side Error Handling in ASP.NET Ajax in .NET 3.5

Cover of "Teach Yourself ASP.NET Ajax in 24 Hours"While following the exercises in the book Teach Yourself ASP.NET Ajax in 24 Hours – one of the few books I’ve been able to find on Ajax for ASP.NET 3.5 – I found an error in the “Hour 9” chapter in the example that covers client-side error-handling (it starts on page 137). I’ve reported this error to the publisher and with any luck, they’ll post a corrected version on their support web page for the book.

I’ve done some searching and haven’t found anything covering this error so I thought I’d cover it here. Better still, I’ll also cover the fix, which turns out to be quite simple. If you’ve been trying out the code in the book and wondering why it doesn’t work, relax: at least in this case, it’s not your fault.

In the course of covering the error and how to fix it, I’ll also talk about how ASP.NET handles exceptions raised by asynchronous postbacks and how you can make use of it to make better user interfaces. Even if you don’t have a copy of Teach Yourself ASP.NET Ajax in 24 Hours, you should find this article an interesting introduction to client-side error handling in ASP.NET Ajax.

Unhandled Exceptions and Asynchronous Postbacks

In ASP.NET Ajax, if an exception is raised during an asynchronous postback and isn’t handled on the server side – that is, in the code-behind – it gets passed along to the client side. What happens on the client side depends on which version of ASP.NET you’re using:

  • In ASP.NET Ajax 1.0, the server-side exception object is serialized into JSON. The JSON is sent to the client, which displays the exception’s message property in an alert box.
  • In ASP.NET Ajax for .NET 3.5, the server-side exception is still serialized into JSON and the JSON is still sent to the client. However, instead of displaying the exception’s message property in an alert box – a presumptuous design decision, if you want my opinion – the client throws the exception, which gives you the opportunity to handle it on the client side as you please.

(In this article, I’ll stick to covering ASP.NET Ajax for .NET 3.5.)

This is quite different from most other web application frameworks, where an exception raised as the result of an XMLHttpRequest call to the server results in some kind of “error” page from the server (or a blank page, if you’re suppressing error reporting).

To illustrate this, let’s put together a simple ASP.NET Ajax application. It’s a single page with a single button, that if clicked, throws an exception.

Here’s the code for the page layout. It’s pretty straightforward:

Listing 1: Default.aspx – Layout for the page of our simple ASP.NET Ajax application.

<%@ Page Language="C#" AutoEventWireup="true" 
CodeBehind="Default.aspx.cs" Inherits="WebApplication1._Default" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
    <title>Error Handling Demo 1</title>
</head>

<body>
    <form id="form1" runat="server">
        
        <div>
            <asp:ScriptManager ID="ScriptManager1" runat="server" />
            <asp:UpdatePanel runat="server" ID="UpdatePanel1">
                <ContentTemplate>
                    <asp:Button runat="server" ID="Button1"
                    Text="Click Me" OnClick="Button1_OnClick" />
                </ContentTemplate>
            </asp:UpdatePanel>
        </div>
        
    </form>
</body>

</html>

Some notes about the code:

  • The ScriptManager control at the top of the form enables Ajax by ensuring that the JavaScript needed to support ASP.NET Ajax on the client side is downloaded to the browser.
  • The UpdatePanel control determines the controls that trigger asynchronous postbacks and defines the region of the page that can be updated via Ajax.
  • Button1 is the button control that we want to throw an exception when clicked. We’ll set it to call the Button1_OnClick method, which will contain the exception-throwing code.

The code-behind is very simple. In it, we define a single method: the event handler Button1_OnClick, which is called in response when the user clicks Button1. All we want it to do is throw an exception that uniquely identifies itself:

Listing 2: Default.aspx.cs – Code-behind for the page of our very simple example app.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

namespace WebApplication1
{
    public partial class _Default : System.Web.UI.Page
    {
        protected void Button1_OnClick(object sender, EventArgs e)
        {
            throw new Exception("Click!");
        }
    }
}

Running with Debugging vs. Running Without Debugging

Listing 1 and 2 give us enough to make our simple app work. It’s time to take it for a spin.

Here’s something that doesn’t get covered in Teach Yourself ASP.NET Ajax in 24 Hours: what happens when you try to run this app with debugging (starting it by hitting F5 in Visual Studio or “Start Debugging” under the “Debug” menu)?

Here’s a screenshot of what happened for me: simple_app_with_debugging

With debugging on, the unhandled exception thrown in Button1_OnClick is caught by the debugger. Normally, this sort of error-catching behaviour is welcome, but in this particular case, it gets in the way of what we’re trying to achieve: having an exception on the server side and passing it along to the user’s browser to handle.

If we run the same app without debugging, we get the effect we want: the exception is raised on the server side, but the server-side part of the application doesn’t halt with an error message. Instead, the client shows the error message.

Here’s a screenshot. Note that the error message includes the string “Click!”, which is the argument in the throw statement the Button1_OnClick event handler. Thanks to this, we can be pretty certain that the error message is the result of our deliberately-thrown exception:

image

Now that we have the exception that we threw on the server side being handled on the client side, let’s do something with it. 

Handling Exceptions Passed from the Server on the Client Side

Let’s do something simple – let’s catch the exception caused by the button click, and instead of having a JavaScript error box pop up, let’s make a couple of changes to the button:

  • Change its text to “This button has been disabled for your safety.”
  • Disable it.

To handle exceptions on the client side, we need to write some client-side JavaScript. Luckily, this is made simple by the number of handy utility classes defined in the scripts downloaded to the client by the ScriptManager component. In this case, we’re going to make use of the Sys.Webforms.PageRequestManager class to deal with the exception because it provides us with the following:

  • The endRequest event, which is raised after an asynchronous postback has completed and control is returned to the browser.
  • The add_endRequest method, which specifies a method to call when the endRequest event is raised.

Here’s the JavaScript, which we’ll put in a file called ErrorHandler.js:

Listing 3: ErrorHandler.js — Client-side error handler for our very simple example app.

Sys.WebForms.PageRequestManager.getInstance().add_endRequest(EndRequestHandler);

function EndRequestHandler(sender, args)
{
    if (args.get_error() != undefined) {
        $get('Button1').value = "This button has been disabled for your safety.";
        $get('Button1').disabled = true;
        args.set_errorHandled(true);
    }
}

The script performs the following:

  • It registers the method EndRequestHandler as the method to call whenever the endRequest event is raised.
  • It defined the method EndRequestHandler, which does the following:
    • If an exception did occur during the asynchronous callback:"
      • The button’s text is changed
      • The button is disabled
      • The error is reported as handled, which allows the application to continue

Now that we have this client-side code, we need to get it to the client. We do this by using the Scripts section of the ScriptManager to send this file to the client. The listing below shows the updated layout code for our simple application. I’ve highlighted the change in the listing below:

Listing 4: Revised Default.aspx – Layout for the page of our simple ASP.NET Ajax application.

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="WebApplication1._Default" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
    <title>Error Handling Demo 1</title>
</head>

<body>
    <form id="form1" runat="server">
        
        <div>
            <asp:ScriptManager ID="ScriptManager1" runat="server">
                <Scripts>
                    <asp:ScriptReference Path="~/ErrorHandler.js" />
                </Scripts>
            </asp:ScriptManager>
            <asp:UpdatePanel runat="server" ID="UpdatePanel1">
                <ContentTemplate>
                    <asp:Button runat="server" ID="Button1"
                    Text="Click Me" OnClick="Button1_OnClick" />
                </ContentTemplate>
            </asp:UpdatePanel>
        </div>
        
    </form>
</body>

</html>

The Scripts section of the ScriptManager lets us specify scripts to be sent to the client along with the page, with each script specified in a ScriptReference tag.

When we run the app (remember, without debugging on) with these changes and click the button, here’s what we get:

Button with text "This button has been disabled for your safety"

In a later article, I’ll look at other ways of using client-side error handling in ASP.NET Ajax in .NET 3.5.

The Error in Teach Yourself ASP.NET Ajax in 24 Hours

Here’s the page layout code for the error-handling example in Teach Yourself ASP.NET Ajax in 24 Hours. The code-behind for the page and the client-side JavaScript are fine, it’s this code that has the error. See if you can spot what’s amiss:

Listing 5: Default.aspx — Page layout of client-side error-handling example in Hour 9 of Teach Yourself ASP.NET Ajax in 24 Hours.

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" 
Inherits="WebApplication1._Default" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" > <head runat="server"> <title></title> </head> <body> <form id="form1" runat="server"> <div> <asp:ScriptManager ID="ScriptManager1" runat="server" /> <asp:UpdatePanel runat="server" ID="UpdatePanel1"> <ContentTemplate> <asp:Button runat="server" ID="Button1" Text="Click Me" OnClick="Button1_OnClick" /> </ContentTemplate> </asp:UpdatePanel> </div> <br /><br /> <div id="Message" style="visibility: hidden;"> <asp:HyperLink ID="HyperLink1" runat="server" Font-Bold="true" Text="Error Occurred..." Font-Italic="true" ForeColor="red" > </asp:HyperLink> </div> </form> </body> </html>

Just for kicks, here’s what happens when you click on the button in the app using the code straight from Teach Yourself ASP.NET Ajax in 24 Hours:

Screen capture of resulting error message from original "Teach Yourself ASP.NET Ajax in 24 Hours" application

The mistake is simple: although there is some error-handling client-side JavaScript in the app, it’s not referenced in the ScriptManager tag, which means it’s not sent to the client. Without error-handling code on the client side, the exception is thrown, there’s nothing to catch it and the user is presented with the standard error dialog box.

The fix is equally simple: reference the script in the ScriptManager tag’s Scripts section:

<asp:ScriptManager ID="ScriptManager1" runat="server">
    <Scripts>
        <asp:ScriptReference Path="~/ErrorHandlingScript.js" />
    </Scripts>
</asp:ScriptManager>

Once that’s done, the program works as promised.

Categories
Uncategorized

O’Reilly’s “Learning XNA 3.0”

Cover of O'Reilly's book "Learning XNA 3.0"

Hey, it looks like I’ve got some potential reading material for the holidays! O’Reilly’s just released their new book, Learning XNA 3.0, an introduction to Microsoft’s 2-D and 3-D game development framework for the PC, Xbox 360 and Zune. Here’s an excerpt from O’Reilly’s description of the book:

Written by an experienced university-level game development instructor, Learning XNA 3.0 walks you through the framework in a clear and understandable step-by-step format. Each chapter offers a self-contained lesson with lots of illustrations and annotated examples to help you master key concepts. Once you finish the book, you’ll know how to develop sophisticated games from start to finish.

  • Learn game development concepts from 2D animation to 3D cameras and effects
  • Delve into high-level shader language (HLSL) and introductory artificial intelligence concepts
  • Develop three complete and exciting games using 2D,3D and multiplayer concepts
  • Develop and deploy games to the Xbox 360 and the Microsoft Zune

While teaching XNA to beginning game developers, author Aaron Reed noticed that several key concepts were difficult for students to grasp. Learning XNA 3.0 was written specifically to address those issues. With this book, you can test your understanding and practice new skills as you go with unique "Test Your Knowledge" exercises and review questions in each chapter.

The book, when purchased from O’Reilly, comes in several formats:

  • Dead-tree format (that is, an actual paperback book): US$34.99 (currently CAD$44.06) / £24.99 in the UK
  • Ebook (PDF, EPUB and Kindle-compatible “Mobipocket” format): US$27.99 (currently CAD$35.23)
  • Dead-tree and ebook: US$45.49 (currently $57.27)

If you’re in Canada, you’ve got a chance to save big. Chapters/Indigo’s online price for the paperback book is CAD$23.09, which makes it cheaper than the electronic version. If you’re an iRewards member, they’ll shave another buck-fifteen off the price to make it CAD$21.94.

Links

Categories
Uncategorized

Symbolics XL1200 Lisp Machine: Free to a Good Home [Updated]

Update

I’m giving the machine to HacklabTO, who were the first to contact me about it. Congrats, guys!


Symbolics XL1200 Lisp MachineIt’s been sitting in my basement long enough, and it’s time that it found a good home. By “it”, I’m referring to my deadbeat ex-housemate’s Symbolics XL1200 Lisp Machine (pictured on the right), a big hulking piece of computer industry history. If you want it and can either pick it up from me (I’m in the High Park area of Accordion City) or can make arrangements to have it shipped to you, it’s yours, FREE. And yes, by free, I mean “free as in beer”. Zero dollars. Gratis.

The full story of how I came to possess this machine is written up in a blog entry of mine from January 2007. As stated in that story, the machine, when last turned on, displayed the message “Hardware Error” and wouldn’t boot any further. As I wrote nearly two years ago:

The fact that it displays a diagnostic message suggests that all is not lost; if someone were willing to go over its numerous circuit boards with a logic probe, he or she may be able to diagnose and fix the problem. Alternately, someone out there who already owns an XL1200 could use it as a source for replacement parts.

It sat safely in a closet in my old house for three years and it’s been sitting in the storage locker of my condo for the past 18 months. It is in good condition, and aside from being put into the storage locker when I moved to the condo, it hasn’t been touched.

If you’re a hardware hacker, computer historian or just really, really, really like the Lisp programming language and want serious Lisp bragging rights, this machine can be yours for free if you can take it off my hands. Interested parties should contact me at joey@globalnerdy.com.

Links

Categories
Uncategorized

Azure Explained in 145 Seconds

In answer to the question “What is Windows Azure?”, most explanations seem to trot out this layer diagram:

windows_azure_layer_diagram

…but I find the explanation in this video produced by some of my developer evangelist counterparts in the UK to be far more satisfying. Note that this video was produced before Azure was announced to the public; in the video, the evangelists refer to Azure by its codename, “Red Dog”. Just think “Azure” every time you hear them say “Red Dog”.

My thanks to Steve Clayton for pointing this one out!