23 September 2008

The Ajax Experience 2008: Boston, MA

The Ajax Experience 2008: Boston, MA

Okay -- this is a real, real small point, but why does the main website for the Ajax Experience 2008 (the big time Ajax conference) use Flash for its main animation on the front page? :\

It's not even very fancy Flash -- this definitely could have been made in JavaScript. :P

18 September 2008

Why Public Email Services Shouldn't Be Used for Sensitive Communication

I really, really don't like commenting on political topics, but this one has an important email security message involved in it:

McCain camp seeks investigation over reported e-mail hack

Sarah Palin Yahoo account 2008 -- Wikileaks

In case you haven't heard, vice-presidential candidate Sarah Palin's Yahoo email account was hacked (apparently by the notorious internet group "Anonymous" -- reports state that it may have been done for the lulz). Yeah -- her Yahoo email account... that she was using for sensitive government business.

Why is this important? Two reasons that you probably won't hear about in the news:
1) Why was she using a private email account for business and governmental matters -- emails that should've been sent using a secure system such as Lotus Notes, for example? Was it to get away with record-keeping requirements?

2) Why would someone in so sensitive a position use something so easily hackable? Seriously, Yahoo couldn't give less of a shit if your email account is hacked. Ask someone who's had it happen to them before.
There's a lot of important questions to discuss here -- perhaps they'll come up in a security meeting you'll have in the future. They'd certainly make good topics.

16 September 2008

Retired Firefox Extensions, Sep 2008

Tabs Open Relative -- A good little extension, but redundant now that TabMixPlus is (somewhat) working in FF3.

Regular Expressions Tester -- Good extension that served me for a long time, but not needed since I found regexpal.com/.

IE Tab -- This extension was all but necessary two years ago, but now that web designers have smartened up, I hardly ever use it anymore. A good extension, though, and one that I used much a while back.

MediaWrap (compatibility layer for IE-only media plugins) -- like IE tab, hardly a use for this anymore, now that the field of web development has improved.


The 65 mpg Ford the U.S. Can't Have

The 65 mpg Ford the U.S. Can't Have
Fiesta ECOnetic


I would love to buy this car if they sold it in the US.

Funny that Ford's reasoning for not selling this car in America is "the greater price of diesel fuel" -- I'm currently paying 10 cents less for diesel fuel than I would for gasoline, where I'm at. :\

15 September 2008

Domino Server/ExtJS "Timeout" Script

Just reposting a bit of code I posted over on the ExtJS forums.

Here's a script that works all by itself -- just place it into your overrides file for your ExtJS/Domino app. Whenever your user's connection to the server has timed-out (and your app tries to fire an Ajax request), the timed-out Ajax request will be cached, the user will be prompted to log back in, and the previous Ajax request will be fired again, with no interruption in code execution. Pretty neat, eh?


/*

DOMINO Server ExtJS "Server Timeout" Script

@author mdm-adph

@release 0.1

@license This script is licensed under the terms of
the Open Source LGPL 3.0 license. Commercial use is permitted to the extent
that the code/component(s) do NOT become part of another Open Source or Commercially
licensed development library or toolkit without explicit permission.

License details: http://www.gnu.org/licenses/lgpl.html

@usage Insert into your overrides file -- script will run automatically whenever
the Domino login page is returned from the server during the course of an
Ajax call. In your original callback, you will need to check for the presence
of a new response variable ("serverTimeout"), because this script will not stop
you original callback from firing.

Automatically tries to fire the last attempted Ajax request upon successful login with
the Domino server.

*/

// Place this variable whereever you want -- it doesn't have to be in the global spec.
// Just make sure to update the script below if you move it.
var AJAXTIMEOUTCTRL = {
VARS: {},
OBJ: {}
};

Ext.Ajax.on({
"requestcomplete": function(conn, response, options){

// Hide progress msg windows here if necessary
// Example: Ext.Msg.hide();

// If "timeout" page has been returned
if (response.responseText.indexOf('action="/names.nsf?Login"') !== -1)
{
// Cache last "true" ajax request, if this failed request isn't a login page
if (options.url != "/names.nsf?Login")
{
AJAXTIMEOUTCTRL.VARS.lastFailedAjaxRequest = options;
}

// Function run after user fills in reauthentication form
function serverLogin() {

AJAXTIMEOUTCTRL.OBJ.dominoLogin.hide();
Ext.Msg.wait("Getting authorization from server...", "Please Wait");
var password = Ext.getCmp("dominoLogin-password").getValue();
var username = Ext.getCmp("dominoLogin-username").getValue();
Ext.getCmp("dominoLogin-password").reset();
Ext.getCmp("dominoLogin-username").reset();

Ext.Ajax.request({
url: "/names.nsf?Login",
params: {
password: password,
username: username
// , RedirectTo:
// an added parameter "RedirectTo" can be added here if necessary
// to direct the Domino server to return a different page than normal
// upon successful login. This can be used to return updated server
// variables, user access levels, etc.
},
callback: function (options, success, response) {
if (success && !response.serverTimeout)
{
// Hide progress msg windows here if necessary
// Example: Ext.Msg.hide();

Ext.Msg.alert("Alert", "Your connection with the server has been reestablished.");

// Try to run the initially requested ajax
Ext.Ajax.request(AJAXTIMEOUTCTRL.VARS.lastFailedAjaxRequest);
}
}
});
}; // end serverLogin()

// Create dominoLogin window object if not already created
if (!AJAXTIMEOUTCTRL.OBJ.dominoLogin)
{
AJAXTIMEOUTCTRL.OBJ.dominoLogin = new Ext.Window({
bodyStyle: "padding: 5px;",
border: false,
closable: false,
height: 160,
layout: "form",
labelAlign: "top",
modal: true,
plain: true,
resizable: false,
title: "Server Authentication Needed",
width: 315,

buttons: [{
text: 'OK',
handler: serverLogin
}],

items: [{
xtype: "textfield",
fieldLabel: "Username",
id: "dominoLogin-username",
width: "100%",
value: "" // Add a variable holding current user's name here if necessary
},{
xtype: "textfield",
fieldLabel: "Password",
id: "dominoLogin-password",
inputType: "password",
width: "100%",
listeners: {
"specialkey": function (theField, e) {
if (e.getKey() == e.ENTER) {
serverLogin();
}
}
}
}]

});
} // end if (!AJAXTIMEOUTCTRL.OBJ.dominoLogin)

AJAXTIMEOUTCTRL.OBJ.dominoLogin.show();

// Delay the focus on the password input box, since the DOM doesn't like focusing while
// it's still manipulating things
Ext.getCmp("dominoLogin-password").focus(false, 500);

// Create additional response flag here so that initial ajax request's callback
// doesn't run
response.serverTimeout = true;

} // end if "timeout" page
}
});

09 September 2008

Getting Java to work on Google Chrome

You're probably wondering yourself, so I'll make this quick:

As I found out on this forum post [java.net], you have to download the number 10 release to Java 6, available here: http://download.java.net/jdk6/

I downloaded it, installed it, and now Google Chrome has Java. Easy as pie.

02 September 2008

Official Google Blog: A fresh take on the browser

Official Google Blog: A fresh take on the browser

Google, I love ya, but please:

#1) Having multiple tabs (each utilizing their own javascript environment) is not "multi-threaded JavaScript." Don't call it that. True multi-threaded JavaScript is the dream of all web developers -- don't tease us.

And I hate to point this out, but the whole multiple processes thing -- wasn't that actually Microsoft's idea, first?

#2) "New Tab Page" with nine easy-access pages -- Opera's Speed Dial.

#3) The "Omnibox" -- Firefox's "Awesome Bar," come on.

That being said first, there are some things I'm really digging:

#1) Thank you for using the Webkit rendering engine. It's an excellent engine that isn't used nearly enough.

#2) I like that browser plugins are going to run on a separate process. This is wonderful.

#3) Integration with Google Gears is neat -- I'm starting to get worried that the API universe for "offline storage" universe is starting to get rather fractered these days. Which one do we use: Google Gears, Firefox 3's built-in storage, Flash storage, Safari databases, etc.? Having Google Gears available to all browsers on all Operating Systems should make things a lot easier for developers.

Either way, I've never had a problem with lots of different types of browsers -- I'm even a beta tester for AT&T's Pogo thingie. As long as the rendering engines aren't radically different, it's easy to program for all.