HP has a new logo! And they can do it in CSS
Wednesday, December 14th, 2011There is a lot of discussion right now about HP’s new logo. I for one like it as they can save an HTTP request by creating it with CSS:
You are currently browsing the Christian Heilmann blog archives for December, 2011.
There is a lot of discussion right now about HP’s new logo. I for one like it as they can save an HTTP request by creating it with CSS:
During some interesting discussions on Twitter yesterday I found that there is now more than ever a confusion about JavaScript dependence in web applications and web sites. This is a never ending story but it seems to me to flare up ever time our browsing technology leaps forward.
I encountered this for the first time back in the days of DHTML. We pushed browsers to their limits with our lovely animated menus and 3D logos (something we of course learned not to do again, right?) and we were grumpy when people told us that there are environments out there where JavaScript isn’t available.
The first question we need to ask about this is what these environments are. There are a few options for that:
As you can see some of them are done to our end users (proxying my companies or mobile provider), some are probably temporary (feature phones) and some are simply their own choice. So there is no way to say that only people who want to mess with our cool web stuff are affected.
As listed above, there are many reasons. When it comes to deliberately turning off JavaScript, I’d wager to guess that the main three are security concerns, advertising fatigue and slow connectivity.
Security is actually very understandable. Almost every attack on a client machine happens using JavaScript (in most cases in conjunction with plugin vulnerabilities). Java of course is the biggest security hole at the moment but there is a lot of evil you can do with JavaScript via a vulnerable web site and unprotected or outdated browser and OS.
Slow connectivity is a very interesting one. Quite ironic – if you think about it – as most of what we use JavaScript for is to speed up the experience of our end users. One of the first use cases for JS was client side validation of forms to avoid unnecessary server roundtrips.
Now when you are on a very flaky connection (say a free wireless or bad 3G connectivity or at any web development conference) and you try to use for example Google Reader or Gmail you’ll end up with half broken interfaces. If the flakiness gets caught during first load you actually get offered a “HTML only low version” that is very likely to work better.
This is totally fine – it tries to give an end user the best experience depending on environment and connectivity. And this is what progressive enhancement is about, really. And there is nothing evangelical about that – it is plain and pure pragmatism.
It seems just not a good plan under any circumstances to give people an interface that doesn’t work. So to avoid this, let’s generate the interface with the technologies that it is dependent on.
With techniques like event delegation this is incredibly simple. You add click handlers to the parent elements and write out your HTML using innerHTML or other, newer and faster techniques.
Frankly, I really don’t know. Maybe it is because I am old school and like my localhost. Maybe it is because I have been disappointed by browsers and environments over and over again and like to play it safe. I just really don’t get why someone would go for a JS-only solution when the JS is really only needed to provide the enhanced experience on top of something that can work without it.
A big thing that people keep coming up with are the “applications that need JavaScript”. If we are really honest with ourselves, then these are very rare. If pushed, I could only think of something like photoshop in the browser, or any other editor (video, IDE in the browser, synth) that would be dependent on JavaScript. All the others can fall back to a solution that requires a reload and server-side component.
And let’s face it – in the times of Node.js the server side solution can be done in JavaScript, too. Dav Glass of Yahoo 2 years ago showed that if a widget library is written to be independent of its environment, you can re-use the same rich widget client and server side.
The real reasons for the “App that needs JavaScript” seems to be a different, non-technical ones.
Much like there are reasons for not having JavaScript there are reasons for apps that need JavaScript and deliver broken experiences.
All in all, the question of JavaScript dependence reaches much further than just the technical issues. It questions old best practices and has quite an impact on maintainability (I will write about this soon).
Let’s just say that our discussions about it would be much more fruitful if we started asking the “what do we need JS for” question rather than the “why do people have no JS”. There is no point in blaming people to hold back the web when our techniques are very adaptive to different needs.
There is also no point in showing people you can break their stuff by turning things in your browser on and off. That is not a representation of what happens when a normal visitor gets stuck in our apps.
Maybe all of this will be moot when node.js matures and becomes as ubiquitous as the LAMP stack is now. I’d like to see that.
I am lucky enough to have a vid.ly pro account to convert videos. Lucky because lately the free service started limiting the amount of times you can watch a video in a month (as they were hammered by a lot of traffic from Asia abusing the service). In case you still haven’t heard about vid.ly – it is a service that converts a video into a few dozen formats for HTML5 embedding and gives you a single URL to redirect devices to the correct format of the video.
Now, to make it easier for my colleagues to convert and embed videos in HTML5, I built a simple interface for converting and embedding a video on our blogs. For this I am using the API, but I wanted to avoid having to give my key out for colleagues to use.
The interface to convert videos is pretty easy:
<header><h1>Vid.ly conversion and embed</h1></header> <section> <?php echo $message; ?> <p>Simply add the URL of the video to convert below and you get the embed code. An email will inform you about the successful conversion. Conversion could take up to an hour.</p> <form method="post"> <div><label for="email">Email:</label><input type="text" id="email" name="email"></div> <div><label for="url">URL:</label><input type="text" id="url" name="url"></div> <div><input type="submit" name="send" value="make it so"></div> </form> </section> |
One of the cool features of the API is that it allows you to define an email that is not the one connected with the key to be the one that gets notified both of the conversion start, errors and success email. That made my job a lot easier. All I needed to do was assemble the correct XML and send it to the API. As the result is XML, too, I needed to check what came back and give feedback in the form:
<?php $key = '{add your key here}'; $message = ''; if(isset($_POST['send'])){ if($_POST['email'] !== '' && $_POST['url'] !== '') { $query = '<?xml version="1.0"?>'. '<query><action>AddMedia</action><userid>481</userid>'. '<userkey>'.$key.'</userkey>'. '<notify>'.$_POST['email'].'</notify>'. '<Source><SourceFile>'.$_POST['url'].'</SourceFile>'. '<CDN>AWS</CDN></Source></query>'; $url = 'http://m.vid.ly/api/'; $ch = curl_init(); curl_setopt($ch,CURLOPT_URL,$url); curl_setopt($ch,CURLOPT_POST,1); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch,CURLOPT_POSTFIELDS,'xml='.urlencode($query)); $result = curl_exec($ch); curl_close($ch); $xml = simplexml_load_string($result); if($xml->Success) { $vid = $xml->Success->MediaShortLink->ShortLink; $video = '<video controls width="100%" controls preload="none"'. ' poster="http://cf.cdn.vid.ly/'.$vid.'/poster.jpg">'. '<source src="http://cf.cdn.vid.ly/'.$vid.'/mp4.mp4" '. 'type="video/mp4">'. '<source src="http://cf.cdn.vid.ly/'.$vid.'/webm.webm" '. 'type="video/webm">'. '<source src="http://cf.cdn.vid.ly/'.$vid.'/ogv.ogv" '. 'type="video/ogg">'. '<a target="_blank" href="http://vid.ly/'.$vid.'">'. '<img src="http://cf.cdn.vid.ly/'.$vid.'/poster.jpg" '. 'width="500"></a>'. '</video>'; $message = '<div class="success"><h1>Conversion started</h1>'. '<p>The video conversion is under way. '. 'You should get an email telling you so and an email when '. 'the video URL is ready. The code to copy & paste into '. 'the blog is:</p>'. '<textarea>'.htmlspecialchars($video).' </textarea>'; } else { $message = '<div class="error"><h1>Error</h1>'. '<p>Something went wrong in the conversion,'. 'please try again.</p></div>'; } } else { $message = '<div class="error"><h1>Error</h1>'. '<p>Please provide a video URL and email</p></div>'; } } ?> |
Pretty simple, isn’t it. Now my colleagues can add their email, give the form a URL where the video to convert is on the web and will get a copy and paste HTML for the video, for example:
<video controls preload="none" style="width:100%;height:300px;" poster="http://cf.cdn.vid.ly/1l5i5m/poster.jpg"> <source src="http://cf.cdn.vid.ly/1l5i5m/mp4.mp4" type="video/mp4"> <source src="http://cf.cdn.vid.ly/1l5i5m/webm.webm" type="video/webm"> <source src="http://cf.cdn.vid.ly/1l5i5m/ogv.ogv" type="video/ogg"> <a target='_blank' href='http://vid.ly/1l5i5m'> <img src='http://cf.cdn.vid.ly/1l5i5m/poster.jpg' width="500"></a> </video> |
Which results in:
Giving HTML5 video to the browsers who support it and a link to vid.ly for those who don’t :) The code is on GitHub as a Gist: