nextwebgen.com

The Next Generation Web Now

Web 2.0 is focus of RightNow's latest upgrade - SmartBrief

Filed under: Uncategorized — web 2.0 - Google News at 11:32 am on Wednesday, August 27, 2008

Web 2.0 is focus of RightNow's latest upgrade
SmartBrief, DC - 11 hours ago
The latest upgrade from e-commerce platform provider RightNow Technologies includes additional collaboration tools as well as a customer portal that offers

Share and Enjoy:These icons link to social bookmarking sites where readers can share and discover new web pages.
  • blogmarks
  • del.icio.us
  • De.lirio.us
  • digg
  • NewsVine
  • YahooMyWeb

Huntelaar fee puts Tottenham off - Independent

Filed under: Uncategorized — Ajax - Google News at 10:19 am on Wednesday, August 27, 2008

Sky News

Huntelaar fee puts Tottenham off
Independent, UK - 2 hours ago
Ajax's asking price for Klaas-Jan Huntelaar is thought to be an obstacle if Tottenham pursue a deal for the Holland striker to join Roman Pavlyuchenko as a
Huntelaar next for Tottenham Footylatest
SPURS TALK: Tottenham set to make a Klaas move East London and West Essex Guardian Series
10 things you need to know about Spurs target Roman Pavlyuchenko Mirror.co.uk
BBC Sport - Goal.com
all 369 news articles

Share and Enjoy:These icons link to social bookmarking sites where readers can share and discover new web pages.
  • blogmarks
  • del.icio.us
  • De.lirio.us
  • digg
  • NewsVine
  • YahooMyWeb

Cisco Buys Linux Email Firm PostPath For $215 Million - Barron’s Blogs

Filed under: Uncategorized — Ajax - Google News at 9:28 am on Wednesday, August 27, 2008

Cisco Buys Linux Email Firm PostPath For $215 Million
Barron’s Blogs - 33 minutes ago
Cisco said that PostPath’s software is “interoperable with many other email solutions and provides a browser-independent AJAX Web client.
Cisco buys PostPath: WebEx to compete with Office, Google Apps? ZDNet
Cisco Buys PostPath, Mail & Calendar Startup for $215 MM GigaOm
StreetInsider.com Notable Mergers and Acquisitions of the Day: StreetInsider.com (subscription)
all 19 news articles

Share and Enjoy:These icons link to social bookmarking sites where readers can share and discover new web pages.
  • blogmarks
  • del.icio.us
  • De.lirio.us
  • digg
  • NewsVine
  • YahooMyWeb

Cisco Buys Linux Email Firm PostPath For $215 Million - Barron’s Blogs

Filed under: Uncategorized — Ajax - Google News at 9:28 am on Wednesday, August 27, 2008

Cisco Buys Linux Email Firm PostPath For $215 Million
Barron’s Blogs - 3 hours ago
Cisco said that PostPath’s software is “interoperable with many other email solutions and provides a browser-independent AJAX Web client.
Cisco Beefs Up WebEx With $215 Million Acquisition of Email TechCrunch
Data Storage Cisco Buys PostPath to Compete with Microsoft Exchange eWeek
Cisco buys PostPath: WebEx to compete with Office, Google Apps? ZDNet
CNNMoney.com - GigaOm
all 41 news articles

Share and Enjoy:These icons link to social bookmarking sites where readers can share and discover new web pages.
  • blogmarks
  • del.icio.us
  • De.lirio.us
  • digg
  • NewsVine
  • YahooMyWeb

Cisco Buys Linux Email Firm PostPath For $215 Million - Barron’s Blogs

Filed under: Uncategorized — Ajax - Google News at 9:28 am on Wednesday, August 27, 2008

Cisco Buys Linux Email Firm PostPath For $215 Million
Barron’s Blogs - 20 hours ago
Cisco said that PostPath’s software is “interoperable with many other email solutions and provides a browser-independent AJAX Web client.
Cisco to acquire e-mail software provider Postpath Telecom Paper (subscription)
Cisco Beefs Up WebEx With $215 Million Acquisition of Email TechCrunch
Cisco Takes On Microsoft Exchange With PostPath Buy CRN
eWeek - ZDNet
all 81 news articles

Share and Enjoy:These icons link to social bookmarking sites where readers can share and discover new web pages.
  • blogmarks
  • del.icio.us
  • De.lirio.us
  • digg
  • NewsVine
  • YahooMyWeb

YouTube Uploader now using Gears, and what people missed in Gears 0.4

Filed under: Uncategorized — Dion Almaer at 9:20 am on Wednesday, August 27, 2008

While we posted about the Gears 0.4 features a lot of the press only really talked about the Geolocation piece.

I think that is important, and posted on that too, but Brad’s piece discussed the full gamut including the Blob API, resummable HTTP, and Desktop API improvements to allow controlled file system access. The example that Brad built was the upload movie tool which ties this all together.

Check out the source code and you will see the parts and pieces in action:

Geolocation

JAVASCRIPT:

  1.  
  2. MovieTool.prototype.getLocation = function(callback) {
  3.   var geolocation = google.gears.factory.create(‘beta.geolocation’);
  4.   if (!geolocation.getPermission(‘Upload Movie Tool’, ‘’,
  5.                                   ‘This sample can use your ‘
  6.                                 + ‘geographic coordinates in order to tag ‘
  7.                                 + ‘uploaded videos with your location’)) {
  8.     document.getElementById(‘location’).innerHTML = ‘Permission denied’;
  9.     callback();
  10.     return;
  11.   }
  12.  
  13.   var self = this;
  14.   geolocation.getCurrentPosition(
  15.     function(p) {
  16.       var addr = p.gearsAddress;
  17.       var address = addr.city + ‘, ‘ + addr.region + ‘, ‘ + addr.country;
  18.       var latitude = p.latitude;
  19.       var longitude = p.longitude;
  20.       self.geoAddress_ = address + ‘ (’ + latitude + ‘, ‘ + longitude + ‘)’;
  21.       document.getElementById(‘location’).innerHTML = self.geoAddress_;
  22.       callback();
  23.     },
  24.  
  25.     function(err) {
  26.       var msg = ‘Error retrieving your location: ‘ + err.message;
  27.       document.getElementById(‘location’).innerHTML = msg;
  28.       callback();
  29.     },
  30.    
  31.     {
  32.       enableHighAccuracy: true,
  33.       gearsRequestAddress: true,
  34.       gearsLocationProviderUrls: [‘http://www.google.com/loc/json’]
  35.     }
  36.   );
  37. }
  38.  

HTTPRequest

JAVASCRIPT:

  1.  
  2.   var req = google.gears.factory.create(‘beta.httprequest’);
  3.   req.open(‘GET’, ‘/list’);
  4.   var self = this;
  5.   req.onreadystatechange = function() {
  6.     if (req.readyState == 4) {
  7.       if (req.status == 200) {
  8.         var loadingMsg = document.getElementById(‘loadingFilesMsg’);
  9.         loadingMsg.parentNode.removeChild(loadingMsg);
  10.         self.movieList_ = eval(req.responseText);
  11.         for (var i = 0; i <self.movieList_.length; i++) {
  12.           var entry = self.movieList_[i];
  13.           // associative entry for fast lookup based on filename
  14.           self.movieList_[‘_’ + entry.filename] = entry;
  15.           var status = ‘Uploaded’
  16.           var percent = ‘100%’;
  17.          
  18.           // was this movie partially uploaded during an earlier browser
  19.           // session?
  20.           if (entry.uploaded == false && entry.blob == null) {
  21.             status = ‘Partially uploaded; re-select file to continue uploading’;
  22.             percent = Math.round((entry.bytesUploaded / entry.length) * 100) + ‘%’;
  23.           }
  24.          
  25.           // is this movie too large?
  26.           if (entry.uploaded == false && entry.length> self.MAX_FILE_SIZE) {
  27.             status = ‘File too large’;
  28.             percent = ‘N/A’;
  29.           }
  30.          
  31.           self.drawRow(entry.filename, entry.geoAddress, status, percent);
  32.         }
  33.       }
  34.      
  35.       callback();
  36.     }
  37.   }
  38.  
  39.   req.send();
  40. }
  41.  
  42. ….
  43.  
  44. // sending a piece
  45.   req.open(‘POST’, uploadURL);
  46.  
  47.   req.setRequestHeader(‘Content-Disposition’,
  48.                         ‘attachment; filename="’ + fileName + ‘"’);
  49.   req.setRequestHeader(‘Content-Type’, ‘application/octet-stream’);
  50.   req.setRequestHeader(‘Content-Range’, ‘bytes ‘ + byteRange);
  51.  
  52.  

Desktop API

JAVASCRIPT:

  1.  
  2. MovieTool.prototype.selectFiles = function() {
  3.   var desktop = google.gears.factory.create(‘beta.desktop’);
  4.   var self = this;
  5.   desktop.openFiles(
  6.     function(files) {
  7.       for (var i = 0; i <files.length; i++) {
  8.         var entry = {filename: files[i].name, uploaded: false,
  9.                             length: files[i].blob.length,
  10.                             blob: files[i].blob, bytesUploaded: 0,
  11.                             geoAddress: self.geoAddress_, uploadRetries: 0};
  12.         if (self.movieList_[‘_’ + entry.filename]) {
  13.           // was previously uploaded at an earlier browser session
  14.           var oldEntry = self.movieList_[‘_’ + entry.filename];
  15.           if (!oldEntry.uploaded) { // partial upload
  16.             oldEntry.length = entry.length;
  17.             oldEntry.blob = entry.blob;
  18.             var percent = Math.round((oldEntry.bytesUploaded / oldEntry.length) * 100);
  19.             self.updateStatus(oldEntry.filename, ‘Not uploaded’, percent + ‘%’);
  20.           } else {
  21.             self.updateStatus(oldEntry.filename, ‘Uploaded’, ‘100%’);
  22.           }
  23.         } else { // new file
  24.           // associative entry for fast lookup based on filename
  25.           self.movieList_[‘_’ + entry.filename] = entry;                   
  26.           self.movieList_.push(entry);
  27.          
  28.           var status = ‘Not uploaded’;
  29.           var percent = ‘0%’;
  30.           // is this movie too large?
  31.           if (entry.length> self.MAX_FILE_SIZE) {
  32.             status = ‘File too large’;
  33.             percent = ‘N/A’;
  34.           }
  35.          
  36.           self.drawRow(files[i].name, self.geoAddress_, status, percent);
  37.         }
  38.       }
  39.      
  40.       document.getElementById(‘movieUpload’).disabled = false;
  41.       document.getElementById(‘clearMovies’).disabled = false;
  42.     },
  43.    
  44.     { filter: [‘video/quicktime’, ‘.wmv’, ‘video/avi’] }
  45.   );
  46. }
  47.  

It turns out that YouTube has implemented a multifile upload using Gears which puts this into practice. As someone who uses YouTube a lot to upload files this is very welcome indeed, and I can’t wait to see more sites use it now the building blocks are there in a different way (can always use Flash / other controls in the past).

Share and Enjoy:These icons link to social bookmarking sites where readers can share and discover new web pages.
  • blogmarks
  • del.icio.us
  • De.lirio.us
  • digg
  • NewsVine
  • YahooMyWeb

Proxy issues with querystrings in path names

Filed under: Uncategorized — Dion Almaer at 6:06 am on Wednesday, August 27, 2008

You have seen this before: /path/to/something.js?v=2, or maybe it used a date or a version control id or some such. The notion of putting the version into the URL so you can aggressively cache and yet quickly push new versions.

There has long been issues with using the querystring as the version. At some point I seem to remember Safari not going a good job caching that scenario and thinking that it was different.

Steve “Neo” Souders has posted about this issue especially as it relates to proxy servers and default configurations:

There’s a section in my book called Revving Filenames. It contains an example of adding a version number to the filename. That’s prompted several emails where people have asked me about tradeoffs around using a querystring versus embedding something in the filename. I wasn’t aware of any performance difference, but in a meeting this week a co-worker, Jacob Hoffman-Andrews, mentioned that Squid, a popular proxy, doesn’t cache resources with a querystring. This hurts performance when multiple users behind a proxy cache request the same file - rather than using the cached version everybody would have to send a request to the origin server.

I tested this by creating two resources, mylogo.1.2.gif and mylogo.gif?v=1.2. Both have a far future Expires date. I configured my browser to go through a Squid proxy. I made one request to mylogo.1.2.gif, cleared my cache (to simulate another user making the request), and fetched mylogo.1.2.gif again. This produces the following HTTP headers:

>> GET http://stevesouders.com/mylogo.1.2.gif HTTP/1.1
<< HTTP/1.0 200 OK

<< Date: Sat, 23 Aug 2008 00:17:22 GMT
<< Expires: Tue, 21 Aug 2018 00:17:22 GMT
<< X-Cache: MISS from someserver.com
<< X-Cache-Lookup: MISS from someserver.com

>> GET http://stevesouders.com/mylogo.1.2.gif HTTP/1.1
<< HTTP/1.0 200 OK
<< Date: Sat, 23 Aug 2008 00:17:22 GMT
<< Expires: Tue, 21 Aug 2018 00:17:22 GMT
<< X-Cache: HIT from someserver.com

<< X-Cache-Lookup: HIT from someserver.com

Notice that the second response shows a HIT in the X-Cache and X-Cache-Lookup headers. This shows it was served by the Squid proxy. More evidence of this is the fact that the Date and Expires response headers have the same values, even though I made these requests 10 seconds apart. For conclusive evidence, only one hit shows up in the stevesouders.com access log.

Loading mylogo.gif?v=1.2 twice (clearing the cache in between) results in these headers:

>> GET http://stevesouders.com/mylogo.gif?v=1.2 HTTP/1.1
<< HTTP/1.0 200 OK
<< Date: Sat, 23 Aug 2008 00:19:34 GMT
<< Expires: Tue, 21 Aug 2018 00:19:34 GMT

<< X-Cache: MISS from someserver.com
<< X-Cache-Lookup: MISS from someserver.com

>> GET http://stevesouders.com/mylogo.gif?v=1.2 HTTP/1.1
<< HTTP/1.0 200 OK
<< Date: Sat, 23 Aug 2008 00:19:47 GMT
<< Expires: Tue, 21 Aug 2018 00:19:47 GMT
<< X-Cache: MISS from someserver.com
<< X-Cache-Lookup: MISS from someserver.com

Here it’s clear the second response was not served by the proxy: the caching response headers say MISS, the Date and Expires values change, and tailing the stevesouders.com access log shows two hits.

Proxy administrators can change the configuration to support caching resources with a querystring, when the caching headers indicate that is appropriate. But the default configuration is what web developers should expect to encounter most frequently. Another interesting note about these tests: notice how the proxy downgrades the responses to HTTP/1.0. This is going to alter browser behavior in terms of the number of connections that are opened. When I’m doing performance analysis I make sure to avoid being connected through a proxy.

Share and Enjoy:These icons link to social bookmarking sites where readers can share and discover new web pages.
  • blogmarks
  • del.icio.us
  • De.lirio.us
  • digg
  • NewsVine
  • YahooMyWeb

Towards Using Custom Fonts

Filed under: Uncategorized — Ben Galbraith at 6:00 am on Wednesday, August 27, 2008

A little while ago, we talked about the two competing custom font technologies for the Web: linking and “embedding” (aka EOT). With Firefox about to implement support for linking à la Safari, John Allsopp has a summary of the state of font technologies and an illustration of just how easy it is to use these in stylesheets.

Once you define a font-face using both linking and EOT thusly:

CSS:

  1. @font-face {
  2.   font-family:“Fenwick”;
  3.   src: url(fenwick.eot);
  4. }
CSS:

  1. @font-face {
  2.   font-family: “Matrix”;
  3.   src: url(http://www.westciv.com/CSS3Tests/matrix.ttf) ;
  4. }

You can use a single CSS attribute to reference whichever is supported on the currently browser and gracefully degrade on browsers that don’t support either technology:

CSS:

  1. p {
  2.   font-family: Fenwick, Matrix, san-serif;
  3. }

Soon-to-be ubiquitous <canvas> (somehow, we’ll get there), faster JavaScript, and custom fonts. Man, this is exciting…

Share and Enjoy:These icons link to social bookmarking sites where readers can share and discover new web pages.
  • blogmarks
  • del.icio.us
  • De.lirio.us
  • digg
  • NewsVine
  • YahooMyWeb
« Previous PageNext Page »