<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:media="http://search.yahoo.com/mrss/" xmlns:gr="http://www.google.com/schemas/reader/atom/" xmlns:idx="urn:atom-extension:indexing" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" idx:index="no" gr:dir="ltr"><!--
Content-type: Preventing XSRF in IE.

--><generator uri="http://www.google.com/reader">Google Reader</generator><id>tag:google.com,2005:reader/user/08674712123734399670/state/com.google/broadcast</id><title>Tobiasz Cudnik's shared items in Google Reader</title><gr:continuation>CNDG3O36g6cC</gr:continuation><author><name>Tobiasz Cudnik</name></author><updated>2012-01-06T11:11:10Z</updated><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/atom+xml" href="http://feeds.feedburner.com/tobiasz_cudnik_reader" /><feedburner:info uri="tobiasz_cudnik_reader" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><entry gr:crawl-timestamp-msec="1325848270607"><id gr:original-id="tag:blogger.com,1999:blog-1377183911445147227.post-3690778472751207005">tag:google.com,2005:reader/item/97b644a40529354f</id><category term="Apps Script" scheme="http://www.blogger.com/atom/ns#" /><category term="Guest Post" scheme="http://www.blogger.com/atom/ns#" /><title type="html">Fun with Apps Script at the Google Apps Developer Hackathon in NYC</title><published>2012-01-04T19:05:00Z</published><updated>2012-01-04T21:21:13Z</updated><link rel="alternate" href="http://feedproxy.google.com/~r/tobiasz_cudnik_reader/~3/MxG8TvUAUVw/fun-with-apps-script-at-google-apps.html" type="text/html" /><link rel="replies" href="http://googleappsdeveloper.blogspot.com/feeds/3690778472751207005/comments/default" title="Post Comments" type="application/atom+xml" /><link rel="replies" href="http://www.blogger.com/comment.g?blogID=1377183911445147227&amp;postID=3690778472751207005&amp;isPopup=true" title="4 Comments" type="text/html" /><link rel="canonical" href="http://googleappsdeveloper.blogspot.com/2012/01/fun-with-apps-script-at-google-apps.html" /><content xml:base="http://googleappsdeveloper.blogspot.com/" type="html">&lt;p&gt;&lt;b&gt;Editor’s Note:&lt;/b&gt;&lt;i&gt;This is a guest post from John Watkinson.  John is a developer and the co-founder of &lt;a href="http://docracy.com"&gt;Docracy&lt;/a&gt;, a start-up company that hosts crowd-sourced legal documents and provides free e-signing services. He recently attended, and won first place, at the Google Apps Hackathon in NYC.  Here's John's story about the event.&lt;/i&gt;&lt;/p&gt;

&lt;p&gt;Our company is focused on documents in the cloud, so we attended the Google Apps Developer Hackathon on December 1st in New York City to learn more about the various Google Apps APIs, and how we can best integrate with them. During the initial presentations from Ryan Boyd and Saurabh Gupta of the Google Apps team, we were delighted to learn about &lt;a href="http://code.google.com/googleapps/appsscript/"&gt;Apps Script&lt;/a&gt;. It provides a powerful JavaScript interface into Google Apps, including &lt;a href="http://code.google.com/googleapps/appsscript/service_document.html"&gt;Docs&lt;/a&gt;, &lt;a href="http://code.google.com/googleapps/appsscript/service_calendar.html"&gt;Calendar&lt;/a&gt;, &lt;a href="http://code.google.com/googleapps/appsscript/service_gmail.html"&gt;Gmail&lt;/a&gt;, &lt;a href="http://code.google.com/googleapps/appsscript/service_maps.html"&gt;Maps&lt;/a&gt; and many others.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;h3&gt;Hack #1: “The Wolf”&lt;/h3&gt;
&lt;p&gt;After the tech presentations, we formed teams and started hacking with the technology. I joined a team with Matt Hall (also from Docracy), Nick Siderakis, Jeff Hsin and Scott Thompson. We struck upon the idea of creating a function that would make calls to &lt;a href="http://www.wolframalpha.com/"&gt;Wolfram Alpha&lt;/a&gt; via their &lt;a href="http://products.wolframalpha.com/api/"&gt;developer API&lt;/a&gt;. It took all five of us hacking away for a few hours to parse the Alpha results properly, but eventually we had an Apps Script custom function for Spreadsheet called “wolf”. It had a kind of magic feeling about it, as you could pass simple English-language queries into the function and get back exact numeric results in your Google Spreadsheet. Some example working queries:&lt;/p&gt;
&lt;ul style="list-style:none"&gt;
  &lt;li&gt;&lt;code&gt;=wolf("distance from the earth to the moon in km")&lt;/code&gt; &lt;em&gt;Answer: 403,778km&lt;/em&gt;&lt;/li&gt;
  &lt;li&gt;&lt;code&gt;=wolf("population of canada in 1960")&lt;/code&gt; &lt;em&gt;Answer: 17.9 million&lt;/em&gt;&lt;/li&gt;
  &lt;li&gt;&lt;code&gt;=wolf("average january temperature in buenos aires")&lt;/code&gt; &lt;em&gt;Answer: 64F&lt;/em&gt;&lt;/li&gt;
  &lt;li&gt;&lt;code&gt;=wolf("9th digit of pi")&lt;/code&gt; &lt;em&gt;Answer: 5&lt;/em&gt;&lt;/li&gt;
  &lt;li&gt;&lt;code&gt;=wolf("count of olympic medals won by japan in 2008")&lt;/code&gt; &lt;em&gt;Answer: 25&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Any function in Apps Script can be used as a spreadsheet function directly, so our main &lt;code&gt;wolf&lt;/code&gt; function is the entry point to our script. We use Apps Script’s &lt;code&gt;UrlFetch&lt;/code&gt; service to make our API call to Wolfram Alpha (note, the full URL is truncated for brevity):&lt;/p&gt;
&lt;pre&gt;
var response = UrlFetchApp.fetch("http://api.wolframalpha.com/..." +
  encodeURIComponent(input));
&lt;/pre&gt;
&lt;p&gt;The response from Alpha is an XML file that includes a lot of metadata we don’t need. So, we used a recursive function and the XML manipulation tools in Apps Script to track down the element of interest to us (below is a simplified version):&lt;/p&gt;
&lt;pre&gt;
function findText(e) {
  if (e.getName().getLocalName() == &amp;#39;plaintext&amp;#39;) {
    return e.getText();
  } else {
    var children = e.getElements();
    for (var i = 0; i &amp;lt; children.length; i++) {
      var result = findText(children[i]);
      if (result) return result;
    }
    return null;
  }
}
&lt;/pre&gt;
&lt;p&gt;A little bit more work is required to parse the result, as sometimes Alpha will report numbers in words (i.e. “40.7 million”), but otherwise that’s it!&lt;p&gt;
&lt;p&gt;For a small script, it definitely feels pretty powerful! Our little invention earned us a first place finish at the hackathon, and the prizes were little indoor RC-controlled helicopters. I managed to irreparably damage mine in a gruesome crash into my refrigerator already, but I hear that many of the others are still serviceable and flying missions daily.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;h3&gt;Hack #2: Sheet Sweeper&lt;/h3&gt;
&lt;p&gt;Once we were comfortable with the &lt;a href="http://code.google.com/googleapps/appsscript/defaultservices.html"&gt;Apps Script Services&lt;/a&gt; (and aware of its capabilities with spreadsheets in particular), a side project emerged that used some of the other integration features available. Apps Script functions can listen for events that are triggered by the editing of a spreadsheet cell (if the user grants the appropriate permissions). Using these onEdit &lt;a href="http://code.google.com/googleapps/appsscript/guide_events.html"&gt;Event Handlers&lt;/a&gt;, we wrote an implementation of the classic game Mine Sweeper that is playable right in the spreadsheet!&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;div style="text-align:center"&gt;
&lt;a href="http://3.bp.blogspot.com/-Yo90FgfFcD4/TwSgzwiV3_I/AAAAAAAAAZQ/gtouyS7WOzw/s1600/image00.png" style="margin-left:1em;margin-right:1em"&gt;&lt;img border="0" width="400" src="http://3.bp.blogspot.com/-Yo90FgfFcD4/TwSgzwiV3_I/AAAAAAAAAZQ/gtouyS7WOzw/s500/image00.png"&gt;&lt;/a&gt;
&lt;div&gt;&lt;a href="http://www.youtube.com/watch?v=4Y4mfD-Jog0"&gt;Watch on YouTube&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;You can play the game by making a copy of &lt;a href="https://docs.google.com/a/google.com/spreadsheet/ccc?key=0Ap2tXBYlw7QmdEg3SVUwSXFXVDNKcGloY0JLcERlZ0E#gid=0"&gt;this spreadsheet&lt;/a&gt; and then clicking the menu item SheetSweeper &amp;gt; New Game. When you play the game, the script responds to onEdit events that are dispatched from the spreadsheet.&lt;/p&gt;
&lt;pre&gt;
function onOpen() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var menuEntries = [{name: "New Game", functionName: "startGame"}];
  ss.addMenu("SheetSweeper", menuEntries);
}
&lt;/pre&gt;

&lt;p&gt;Then when the user edits a cell, the script responds and implements the mine sweeper logic:&lt;/p&gt;

&lt;pre&gt;
function onEdit(event) {
  var ss = event.source.getActiveSheet();
  var cell = ss.getActiveCell();
  if (cell.getValue() == 'x') {
    // Flagging a mine
    flagCell(cell);
  } else {
    // Clearing a cell
    clearCell(cell);
  }  
}
&lt;/pre&gt;

&lt;p&gt;We had a great time at the hackathon, and are happy to have been introduced to Apps Script. We believe it has an exciting future ahead of it.&lt;p&gt;


&lt;p&gt;&lt;/p&gt;&lt;table cellpadding="5" cellspacing="0"&gt;&lt;tbody&gt;&lt;tr style="background-color:#f2f2f2"&gt;&lt;td&gt;&lt;img style="width:90px" width="90px" src="https://lh3.googleusercontent.com/-t3OszVpHgzw/AAAAAAAAAAI/AAAAAAAABD4/G89QRX-Wpqw/s200-c-k/photo.jpg"&gt;&lt;/td&gt;&lt;td valign="top"&gt;&lt;span&gt;John Watkinson&lt;/span&gt;     &lt;a href="https://plus.google.com/u/0/103808128853828210342/" rel="me"&gt;profile&lt;/a&gt;
&lt;br&gt;&lt;div&gt;
&lt;br&gt;John is a developer and the co-founder of &lt;a href="http://docracy.com"&gt;Docracy&lt;/a&gt;, a start-up company that hosts crowd-sourced legal documents and provides free e-signing services. He previously co-founded the mobile development shop &lt;a href="http://larvalabs.com"&gt;Larva Labs&lt;/a&gt;, which developed the popular &lt;a href="http://androidify.com"&gt;Androidify&lt;/a&gt; app with the Google Creative Lab.
&lt;/div&gt;
&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div&gt;&lt;img width="1" height="1" src="https://blogger.googleusercontent.com/tracker/1377183911445147227-3690778472751207005?l=googleappsdeveloper.blogspot.com" alt=""&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/GoogleAppsDeveloperBlog/~4/faMc9HzGlQA" height="1" width="1"&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/tobiasz_cudnik_reader/~4/MxG8TvUAUVw" height="1" width="1"/&gt;</content><author><name>Google Apps Developer Blog Editor</name></author><source gr:stream-id="feed/http://googleappsdeveloper.blogspot.com/atom.xml"><id>tag:google.com,2005:reader/feed/http://googleappsdeveloper.blogspot.com/atom.xml</id><title type="html">Google Apps Developer Blog</title><link rel="alternate" href="http://googleappsdeveloper.blogspot.com/" type="text/html" /></source><feedburner:origLink>http://feedproxy.google.com/~r/GoogleAppsDeveloperBlog/~3/faMc9HzGlQA/fun-with-apps-script-at-google-apps.html</feedburner:origLink></entry><entry gr:crawl-timestamp-msec="1319815116097"><id gr:original-id="http://functionsource.com/post/curl-dancing-fun-with-node-nodejitsu-ansi-escape-codes">tag:google.com,2005:reader/item/cf2d143cf097977b</id><category term="friday" /><category term="fun" /><category term="node" /><title type="html">curl dancing; fun with node + nodejitsu + ANSI escape codes</title><published>2011-10-28T13:12:36Z</published><updated>2011-10-28T13:12:36Z</updated><link rel="alternate" href="http://feedproxy.google.com/~r/tobiasz_cudnik_reader/~3/wP9ClsLBcmQ/curl-dancing-fun-with-node-nodejitsu-ansi-escape-codes" type="text/html" /><content xml:base="http://functionsource.com/" type="html">&lt;p&gt;&lt;img title="curldancing" src="http://functionscopedev.files.wordpress.com/2011/10/curldancing.png?w=442&amp;amp;h=424" height="424" alt="" width="442"&gt;&lt;/p&gt;
&lt;p&gt;Marak Squires of Nodejitsu has a great Friday Fun project for today. He kindly told us a little about it:&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;
Open up a terminal and run:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;curl ohh.io/dancing&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;after that, you can try &lt;code&gt;curl ohh.io&lt;/code&gt; to see a menu.&lt;/p&gt;
&lt;p&gt;After that, check out &lt;a href="http://ohh.io/ASNIdom"&gt;http://ohh.io/ASNIdom&lt;/a&gt;. This is a (naive) DOM implementation in ANSI escape codes. It allows you to share HTML templates between the browser and…the terminal…&lt;/p&gt;
&lt;p&gt;All MIT as usual:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/marak/ANSIdom"&gt;https://github.com/marak/ANSIdom&lt;/a&gt;
&lt;/li&gt;&lt;li&gt;&lt;a href="https://github.com/marak/ohh"&gt;https://github.com/marak/ohh&lt;/a&gt;
&lt;/li&gt;&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;p&gt;Awesome :)&lt;/p&gt;
&lt;br&gt;&lt;img src="http://feeds.feedburner.com/~r/tobiasz_cudnik_reader/~4/wP9ClsLBcmQ" height="1" width="1"/&gt;</content><author><name>Dion Almaer</name></author><source gr:stream-id="feed/http://functionsource.com/feeds/entries"><id>tag:google.com,2005:reader/feed/http://functionsource.com/feeds/entries</id><title type="html">FunctionSource Posts</title><link rel="alternate" href="http://functionsource.com" type="text/html" /></source><feedburner:origLink>http://functionsource.com/post/curl-dancing-fun-with-node-nodejitsu-ansi-escape-codes</feedburner:origLink></entry><entry gr:crawl-timestamp-msec="1319039252528"><id gr:original-id="http://blog.jetbrains.com/webide/?p=2765">tag:google.com,2005:reader/item/5364c68ef9ebe282</id><category term="Feature" /><category term="Tutorial" /><category term="automated testing" /><category term="jasmine" /><category term="JavaScript" /><category term="jstestdriver" /><category term="productivity" /><category term="qunit" /><category term="test-driven development" /><category term="ttd" /><category term="unit testing" /><title type="html">JavaScript unit testing support</title><published>2011-10-17T12:12:27Z</published><updated>2011-10-17T12:12:27Z</updated><link rel="alternate" href="http://feedproxy.google.com/~r/tobiasz_cudnik_reader/~3/HZjFePtp4-Y/" type="text/html" /><link rel="canonical" href="http://blog.jetbrains.com/webide/2011/10/javascript-unit-testing-support/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=javascript-unit-testing-support" /><content xml:base="http://blog.jetbrains.com/webide" type="html">&lt;p&gt;If you’re a JavaScript developer, you probably know that the quality and correctness of your application are crucial. Well, consistency and regression testing just got a little less painful. Meet JsTestDriver plugin – an open-source project that was originally started at Google and is now contributed to by the JetBrains team.&lt;/p&gt;
&lt;p&gt;WebStorm 3.0 bundles it.&lt;/p&gt;
&lt;p&gt;Users of other JetBrains IDE –  PhpStorm, IntelliJ IDEA, PyCharm, RubyMine, and AppCode – can install it  from the plugin repository following &lt;a href="http://confluence.jetbrains.net/display/WI/Installation+of+JsTestDriver+IntelliJ+plugin"&gt;these instructions&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;It allows you to enjoy &lt;a href="http://code.google.com/p/js-test-driver/wiki/DesignPrinciples"&gt;all the  benefits of JsTestDriver&lt;/a&gt; right from the comfort of your IDE. This  includes the following features:&lt;span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;starting and stopping the server;&lt;/li&gt;
&lt;li&gt;running  and rerunning tests;&lt;/li&gt;
&lt;li&gt;filtering and viewing test results, navigation from results to source code;&lt;/li&gt;
&lt;li&gt;jumping from JavaScript exception stacktrace to source code;&lt;/li&gt;
&lt;li&gt;support for JsTestDriver configuration file: syntax and error highlighting, basic completion, navigation to referenced files;&lt;/li&gt;
&lt;li&gt;capturing messages sent to &lt;span style="line-height:100%;font-family:monospace;background-color:#ffffff;padding:1px;font-size:12pt;border:0.01mm solid #000000"&gt;&lt;span style="color:#660e7a;background-color:#ffffff;font-weight:bold"&gt;console&lt;/span&gt;&lt;span style="background-color:#ffffff"&gt;.&lt;/span&gt;&lt;span style="color:#7a7a2b;background-color:#ffffff"&gt;log&lt;/span&gt;&lt;span style="background-color:#ffffff"&gt;()&lt;/span&gt;&lt;/span&gt;;&lt;/li&gt;
&lt;li&gt;support for Jasmine, QUnit and JsTestDriver built-in assertion frameworks:
&lt;ul&gt;
&lt;li&gt;quick-fixes for enabling global symbol reference resolving for each assertion framework (if you have QUnit or Jasmine tests in a project, you will be prompted to install the corresponding &lt;a href="http://code.google.com/p/js-test-driver/wiki/XUnitCompatibility"&gt;adapter&lt;/a&gt;);&lt;/li&gt;
&lt;li&gt;contextual code generation actions (Alt+Insert) for creating new tests, setup and teardown methods for each assertion framework;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://code.google.com/p/js-test-driver/wiki/HtmlDoc"&gt;declarative HTML injection&lt;/a&gt; support for JsTestDriver built-in assertion framework.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The best way to understand how this works is to see it in action.&lt;/p&gt;
&lt;h2&gt;Getting started&lt;/h2&gt;
&lt;p&gt;If you aren’t aware of JsTestDriver concepts, consider visiting &lt;a href="http://code.google.com/p/js-test-driver/wiki/GettingStarted"&gt;http://code.google.com/p/js-test-driver/wiki/GettingStarted&lt;/a&gt;. There is also an excellent &lt;a href="http://msdn.microsoft.com/en-us/scriptjunkie/gg655487.aspx"&gt;tutorial introduction&lt;/a&gt; to JavaScript unit testing by Christian Johansen.&lt;/p&gt;
&lt;h3&gt;Setup project&lt;/h3&gt;
&lt;p&gt;We have created a sample project for you. Please download &lt;a href="http://confluence.jetbrains.net/download/attachments/41490213/greeter-sample.zip"&gt;greeter-sample.zip&lt;/a&gt;, extract it and open the project in your IDE.&lt;/p&gt;
&lt;p&gt;If you open &lt;em&gt;GreeterTest.js&lt;/em&gt; for the first time, you will see error highlighting on the &lt;span style="font-family:Courier New;font-size:11pt"&gt;TestCase&lt;/span&gt; method call expression. Position the caret on the error-highlighted code, press &lt;strong&gt;Alt+Enter&lt;/strong&gt;/&lt;strong&gt;Option+Enter&lt;/strong&gt; and choose “Add JsTestDriver assertion framework support” from the list of available intention actions.&lt;/p&gt;
&lt;p&gt;&lt;img src="http://blog.jetbrains.com/webide/files/2011/10/initial-project-state.png" alt=""&gt;&lt;/p&gt;
&lt;p&gt;A global JavaScript library named “JsTestDriver Assertion Framework” will be created and associated with a project. To view it, open the Settings dialog (&lt;strong&gt;File | Settings&lt;/strong&gt; or &lt;strong&gt;IntelliJ IDEA | Preferences&lt;/strong&gt;) and select &lt;strong&gt;JavaScript Libraries&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Before you can run any of your tests you need to start the test server  and capture at least one slave browser. The server does not have to  reside on the machine where the test runner is, and the browsers  themselves can be on different machines as well.&lt;/p&gt;
&lt;h3&gt;Starting JsTestDriver server locally&lt;/h3&gt;
&lt;p&gt;To launch the JsTestDriver server, look for the tool window at the bottom of the screen.&lt;/p&gt;
&lt;p&gt;&lt;img src="http://blog.jetbrains.com/webide/files/2011/10/server-state-not-running.png" alt="" width="618" height="179"&gt;&lt;/p&gt;
&lt;p&gt;Click the green arrow to the right of the address bar to start the  server. The status bar turns yellow to let you know the server is  running, but has no slave browsers.&lt;/p&gt;
&lt;p&gt;&lt;img src="http://blog.jetbrains.com/webide/files/2011/10/server-state-no-captured-browsers.png" alt="" width="618" height="179"&gt;&lt;/p&gt;
&lt;p&gt;Then, copy the capture URL and paste it in a browser. The status bar  turns green, and the corresponding browser icon lights up. Now you’re  ready to run tests.&lt;/p&gt;
&lt;p&gt;&lt;img src="http://blog.jetbrains.com/webide/files/2011/10/server-state-ready.png" alt="" width="617" height="180"&gt;&lt;/p&gt;
&lt;h3&gt;&lt;span style="color:#000000;font-size:18px;line-height:27px"&gt;Running tests&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;To run tests, right-click &lt;em&gt;greeter.jstd&lt;/em&gt; and choose &lt;strong&gt;Run “greeter.jstd”&lt;/strong&gt;. Tests will be run against the local JsTestDriver server.&lt;/p&gt;
&lt;p&gt;&lt;img src="http://blog.jetbrains.com/webide/files/2011/10/tests-run-results.png" alt="" width="620" height="203"&gt;&lt;/p&gt;
&lt;p&gt;In our case we have one failed test ‘GreeterTest.test greet null’. You can easily navigate from the stack trace to the source code that causes problems. You can also navigate from the test results tree to the test case/test function declaration using the &lt;strong&gt;F4&lt;/strong&gt; key.&lt;/p&gt;
&lt;h3&gt;Generate code&lt;/h3&gt;
&lt;p&gt;In order to remove duplicated code that sets the &lt;span style="font-family:Courier New;font-size:11pt"&gt;greeter&lt;/span&gt; local variable, you can refactor the Greeter object creation to a special method called &lt;span style="font-family:Courier New;font-size:11pt"&gt;setUp&lt;/span&gt;, which is called before each test function is executed. Just invoke the &lt;em&gt;Generate&lt;/em&gt; action by pressing &lt;strong&gt;Alt+Insert&lt;/strong&gt; inside of a &lt;span style="font-family:Courier New;font-size:11pt"&gt;TestCase&lt;/span&gt; method call expression, and then choose “JsTestDriver Setup”.&lt;/p&gt;
&lt;p style="text-align:center"&gt;&lt;img src="http://blog.jetbrains.com/webide/files/2011/10/setup-method-generate-action.png" alt="" width="468" height="211"&gt;&lt;/p&gt;
&lt;p&gt;Use the &lt;strong&gt;Shift+F10&lt;/strong&gt; keyboard shortcut to re-run the tests after changing code.&lt;/p&gt;
&lt;p&gt;Test with pleasure!&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.jetbrains.net/confluence/display/WI/Web+IDE+EAP"&gt;Download WebStorm for your platform from project EAP page&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Note: Users of PhpStorm, as well as other JetBrains IDE –  IntelliJ IDEA, PyCharm,  RubyMine, and AppCode – should install it  from the plugin repository  following &lt;a href="http://confluence.jetbrains.net/display/WI/Installation+of+JsTestDriver+IntelliJ+plugin"&gt;these instructions&lt;/a&gt;.&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/jetbrains_webIde/~4/urqw87ap2SI" height="1" width="1"&gt;&lt;img src="http://feeds.feedburner.com/~r/tobiasz_cudnik_reader/~4/HZjFePtp4-Y" height="1" width="1"/&gt;</content><author><name>Sergey Simonchik</name></author><source gr:stream-id="feed/http://blogs.jetbrains.com/webide/feed/"><id>tag:google.com,2005:reader/feed/http://blogs.jetbrains.com/webide/feed/</id><title type="html">WebStorm &amp;amp; PhpStorm Blog</title><link rel="alternate" href="http://blog.jetbrains.com/webide" type="text/html" /></source><feedburner:origLink>http://feedproxy.google.com/~r/jetbrains_webIde/~3/urqw87ap2SI/</feedburner:origLink></entry><entry gr:crawl-timestamp-msec="1319039214220"><id gr:original-id="tag:blogger.com,1999:blog-6755709643044947179.post-7571970047251223725">tag:google.com,2005:reader/item/3093c3be93dbe386</id><category term="Android 4.0" scheme="http://www.blogger.com/atom/ns#" /><category term="SDK updates" scheme="http://www.blogger.com/atom/ns#" /><category term="Announcements" scheme="http://www.blogger.com/atom/ns#" /><title type="html">Android 4.0 Platform and Updated SDK Tools</title><published>2011-10-19T03:00:00Z</published><updated>2011-10-19T03:36:35Z</updated><link rel="alternate" href="http://feedproxy.google.com/~r/tobiasz_cudnik_reader/~3/hZ9_1ApAp-I/android-40-platform-and-updated-sdk.html" type="text/html" /><link rel="canonical" href="http://android-developers.blogspot.com/2011/10/android-40-platform-and-updated-sdk.html" /><content xml:base="http://android-developers.blogspot.com/" type="html">&lt;img style="float:right;margin:0 10px 10px 0;width:267px;height:200px" src="http://1.bp.blogspot.com/-ebqT6DKrawQ/Tp3Xwy-G78I/AAAAAAAAAAQ/6u4Vf0oslIk/s320/ICS.png" alt="ICS logo" border="0"&gt;&lt;p&gt;Today we are announcing Android 4.0, Ice Cream Sandwich — a new version of the platform that brings a refined, unified user experience for phones, tablets, and more.&lt;/p&gt;&lt;p&gt;Android 4.0 builds on the things people love most about Android — efficient multitasking, rich notifications, customizable home screens, resizable widgets, and deep interactivity — and adds powerful new ways of communicating and sharing. It includes many great features for users, including social and sharing integration, network data usage control, innovative connectivity and camera options, and an updated set of standard apps.&lt;/p&gt;&lt;p&gt;For developers, Android 4.0 introduces many new capabilities and APIs. Here are some highlights:&lt;/p&gt;&lt;dd&gt;&lt;br&gt;
&lt;dl&gt;&lt;p&gt;&lt;em&gt;Unified UI toolkit:&lt;/em&gt; A single set of UI components, styles, and capabilities for phones, tablets, and other devices.&lt;/p&gt;&lt;p&gt;&lt;em&gt;Rich communication and sharing:&lt;/em&gt; New social and calendar APIs, Android Beam for NFC-based instant sharing, Wi-Fi Direct support, Bluetooth Health Device Profile support.&lt;/p&gt;&lt;p&gt;&lt;em&gt;Deep interactivity and customization:&lt;/em&gt; Improved notifications, lockscreen with camera and music controls, and improved app management in the launcher.&lt;/p&gt;&lt;p&gt;&lt;em&gt;New graphics, camera, and media capabilities:&lt;/em&gt; Image and video effects, precise camera metering and face detection, new media codecs and containers.&lt;/p&gt;&lt;p&gt;&lt;em&gt;Interface and input:&lt;/em&gt; Hardware-accelerated 2D drawing, new grid-based layout, improved soft keyboard, spell-checker API, stylus input support, and better mouse support.&lt;/p&gt;&lt;p&gt;&lt;em&gt;Improved accessibility:&lt;/em&gt; New accessibility APIs and  text-to-speech APIs for writing new engines.&lt;/p&gt;&lt;p&gt;&lt;em&gt;Enhancements for enterprise:&lt;/em&gt; Keychain and VPN APIs for managing credentials and connections, a new administrator policy for disabling the camera.&lt;/p&gt;&lt;/dl&gt;&lt;/dd&gt;&lt;p&gt;For a complete overview of what’s new for users and developers, please read the &lt;a href="http://developer.android.com/sdk/android-4.0-highlights.html" title="Android 4.0 Platform Highlights"&gt;Android 4.0 Platform Highlights&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;Alongside the new Android platform, we are releasing new versions of the SDK Tools (r14) and ADT Plugin (14.0) for Eclipse. Among the highlights are:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Improved build performance in Ant and Eclipse&lt;/li&gt;
&lt;li&gt;Improved layout and XML editors&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;To get started developing on Android 4.0, visit the &lt;a href="http://developer.android.com/sdk/index.html" title="Android Developers site"&gt;Android Developers&lt;/a&gt; site for information about the &lt;a href="http://developer.android.com/sdk/android-4.0.html" title="Android 4.0 Platform"&gt;Android 4.0 platform&lt;/a&gt;, the &lt;a href="http://developer.android.com/sdk/tools-notes.html" title="SDK Tools"&gt;SDK Tools&lt;/a&gt;, and the &lt;a href="http://developer.android.com/sdk/eclipse-adt.html" title="ADT Plugin"&gt;ADT Plugin&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;If you have already developed and published apps, we encourage you to download the Android 4.0 platform now, to begin testing your app before devices arrive in stores.&lt;/p&gt;&lt;br&gt;
&lt;p&gt;Check out the video below for a closer look at Android 4.0 in action.&lt;/p&gt;&lt;p style="text-align:center"&gt;&lt;iframe src="http://reader.googleusercontent.com/reader/embediframe?src=http://www.youtube.com/v/-F_ke3rxopc?version%3D3&amp;amp;width=640&amp;amp;height=360" width="640" height="360"&gt;&lt;/iframe&gt;&lt;br&gt;
&lt;/p&gt;&lt;div&gt;&lt;img width="1" height="1" src="https://blogger.googleusercontent.com/tracker/6755709643044947179-7571970047251223725?l=android-developers.blogspot.com" alt=""&gt;&lt;/div&gt;&lt;div&gt;
&lt;a href="http://feeds.feedburner.com/~ff/blogspot/hsDu?a=_P-tzLggUZg:5LeK8X_7qkk:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/hsDu?d=yIl2AUoC8zA" border="0"&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/blogspot/hsDu?a=_P-tzLggUZg:5LeK8X_7qkk:-BTjWOF_DHI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/blogspot/hsDu?i=_P-tzLggUZg:5LeK8X_7qkk:-BTjWOF_DHI" border="0"&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/hsDu/~4/_P-tzLggUZg" height="1" width="1"&gt;&lt;img src="http://feeds.feedburner.com/~r/tobiasz_cudnik_reader/~4/hZ9_1ApAp-I" height="1" width="1"/&gt;</content><author><name>Xavier Ducrohet, Android SDK Tech Lead</name></author><source gr:stream-id="feed/http://feeds.feedburner.com/blogspot/hsDu"><id>tag:google.com,2005:reader/feed/http://feeds.feedburner.com/blogspot/hsDu</id><title type="html">Android Developers Blog</title><link rel="alternate" href="http://android-developers.blogspot.com/" type="text/html" /></source><feedburner:origLink>http://feedproxy.google.com/~r/blogspot/hsDu/~3/_P-tzLggUZg/android-40-platform-and-updated-sdk.html</feedburner:origLink></entry><entry gr:crawl-timestamp-msec="1318276063458"><id gr:original-id="http://hacks.mozilla.org/?p=9688">tag:google.com,2005:reader/item/01065670cecc7974</id><category term="Aurora" scheme="http://hacks.mozilla.org" /><category term="CSS" scheme="http://hacks.mozilla.org" /><category term="DOM" scheme="http://hacks.mozilla.org" /><category term="Feature" scheme="http://hacks.mozilla.org" /><category term="Featured Article" scheme="http://hacks.mozilla.org" /><category term="Firefox 9" scheme="http://hacks.mozilla.org" /><category term="HTML5" scheme="http://hacks.mozilla.org" /><category term="XMLHttpRequest" scheme="http://hacks.mozilla.org" /><title type="html">Introducing Aurora 9</title><published>2011-09-30T22:22:45Z</published><updated>2011-09-30T23:57:17Z</updated><link rel="alternate" href="http://feedproxy.google.com/~r/tobiasz_cudnik_reader/~3/WLsbb_A2dAQ/" type="text/html" /><link rel="replies" href="http://hacks.mozilla.org/2011/09/introducing-aurora-9/#comments" type="text/html" /><link rel="replies" href="http://hacks.mozilla.org/2011/09/introducing-aurora-9/feed/atom/" type="application/atom+xml" /><content xml:base="http://hacks.mozilla.org/2011/09/introducing-aurora-9/" xml:lang="en" type="html">&lt;p&gt;We have just released Aurora 9 (&lt;a href="http://www.mozilla.org/en-US/firefox/channel/"&gt;download and test Aurora 9&lt;/a&gt;), which is planned to be the upcoming Firefox 9. In it, we have a number of new things that we hope will get you excited!&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;h2&gt;JavaScript Type Inference&lt;/h2&gt;
&lt;p&gt;We’ve improved JavaScript performance once again with type inference. We’ve made significant improvements on both the V8 and Kraken benchmarks, and you should see real-world improvements to JavaScript performance as well.&lt;/p&gt;
&lt;h2&gt;JavaScript Interface for Do Not Track&lt;/h2&gt;
&lt;p&gt;Firefox 4 introduced &lt;a href="https://developer.mozilla.org/en/The_Do_Not_Track_Field_Guide/Introduction/How_Do_Not_Track_works"&gt;Do Not Track&lt;/a&gt;, and now there is a way to detect a users’prefence through JavaScript as well:&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;h2&gt;mouseenter and mouseleave events&lt;/h2&gt;
&lt;p&gt;For some time now, &lt;a href="http://www.quirksmode.org/dom/events/mouseover.html"&gt;web developers have been struggling&lt;/a&gt; with handling &lt;code&gt;mouseover&lt;/code&gt; and &lt;code&gt;mouseout&lt;/code&gt; events on elements, since when child elements have gained focus, the event has bubbled up and triggered &lt;code&gt;mouseout&lt;/code&gt; on the parent element – something you would in most cases not like to happen.&lt;/p&gt;
&lt;p&gt;Therefore, we are now happy to introduce support for &lt;code&gt;mouseenter&lt;/code&gt; and &lt;code&gt;mouseleave&lt;/code&gt; events:&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;h2&gt;Camera UI for Mobile&lt;/h2&gt;
&lt;p&gt;You can now use an input element to trigger a native app to take pictures. Please try the &lt;a href="http://jsbin.com/iwerow/27/"&gt;Camera UI for Mobile demo&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;Support for chunked XMLHttpRequest&lt;/h2&gt;
&lt;p&gt;When doing XMLHttpRequest requests with large data sets, you can now &lt;a href="https://bugzilla.mozilla.org/show_bug.cgi?id=687087"&gt;get partial data&lt;/a&gt; as it arrives instead of waiting for it all to show up. You can use this to build more responsive and more efficient web sites.&lt;/p&gt;
&lt;h2&gt;Other changes&lt;/h2&gt;
&lt;p&gt;We’ve also got support for a bunch of other changes as well.  These will be added to the &lt;a href="https://developer.mozilla.org/en/Firefox_9_for_developers"&gt;Firefox 9 for Developers page over the next few weeks.&lt;/a&gt;&lt;/p&gt;
&lt;div&gt;
&lt;h4&gt;HTML&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;We now support &lt;a href="https://bugzilla.mozilla.org/show_bug.cgi?id=654352"&gt;document.caretPositionFromPoint&lt;/a&gt;
&lt;li&gt;We now support &lt;a href="https://bugzilla.mozilla.org/show_bug.cgi?id=683852"&gt;Node.contains(node)&lt;/a&gt;
&lt;li&gt;We now &lt;a href="https://bugzilla.mozilla.org/show_bug.cgi?id=685139"&gt;return true for node.contains(node)&lt;/a&gt;, as other browsers do.  (The spec says we should return false but the spec is probably wrong given the behaviour of all browsers.)
&lt;li&gt;We now support &lt;a href="https://bugzilla.mozilla.org/show_bug.cgi?id=685798"&gt;Node.parentElement&lt;/a&gt;
&lt;li&gt;We no longer &lt;a href="https://bugzilla.mozilla.org/show_bug.cgi?id=685518"&gt;taint the canvas data when drawing images where @crossorigin is set on them&lt;/a&gt;
&lt;li&gt;We now only &lt;a href="https://bugzilla.mozilla.org/show_bug.cgi?id=682554"&gt;fire onreadystatechange on the document element&lt;/a&gt;
&lt;li&gt;There is now &lt;a href="https://bugzilla.mozilla.org/show_bug.cgi?id=605365"&gt;UI for HTML5 Forms Validation in Fennec&lt;/a&gt;
&lt;li&gt;We now fire &lt;a href="https://bugzilla.mozilla.org/show_bug.cgi?id=185236"&gt;load and error events on stylesheet link elements that are loaded dynamically&lt;/a&gt;
&lt;li&gt;We now support &lt;a href="https://bugzilla.mozilla.org/show_bug.cgi?id=543789"&gt;DOM3 composition events&lt;/a&gt;
&lt;/li&gt;&lt;/li&gt;&lt;/li&gt;&lt;/li&gt;&lt;/li&gt;&lt;/li&gt;&lt;/li&gt;&lt;/li&gt;&lt;/li&gt;&lt;/ul&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;h4&gt;Graphics&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;We now support &lt;a href="https://bugzilla.mozilla.org/show_bug.cgi?id=600556"&gt;Vista-style ICO files&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;We now &lt;a href="https://bugzilla.mozilla.org/show_bug.cgi?id=573583"&gt;decode images only when drawing them&lt;/a&gt;, instead of ahead of time&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;h4&gt;Layout&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;We now support the &lt;a href="https://bugzilla.mozilla.org/show_bug.cgi?id=446569"&gt;CSS3 columns shorthand where column-count and column-width can be combined&lt;/a&gt;
&lt;li&gt;We now support &lt;a href="https://bugzilla.mozilla.org/show_bug.cgi?id=677582"&gt;CSS3 text-overflow: &amp;lt;left&amp;gt; &amp;lt;right&amp;gt;&lt;/a&gt;
&lt;li&gt;We now support the font-stretch property (&lt;a href="https://bugzilla.mozilla.org/show_bug.cgi?id=3512"&gt;bug number 3512, filed in 1999!&lt;/a&gt;)
&lt;li&gt;You can now use &lt;a href="https://bugzilla.mozilla.org/show_bug.cgi?id=688405"&gt;65534 rowspans instead of 8190&lt;/a&gt;, to match IE.
&lt;/li&gt;&lt;/li&gt;&lt;/li&gt;&lt;/li&gt;&lt;/ul&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;h4&gt;Video&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;We now support &lt;a href="https://bugzilla.mozilla.org/show_bug.cgi?id=648595"&gt;temporal media URIs for HTML5 video&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;h4&gt;Network&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;We’ve changed the way we handle &lt;a href="https://bugzilla.mozilla.org/show_bug.cgi?id=665706"&gt;semicolons during URL parsing&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;We no longer pop up a &lt;a href="https://bugzilla.mozilla.org/show_bug.cgi?id=423506"&gt;download dialog bog when a server returns no data&lt;/a&gt; and instead show a corrupted content error, to match other browsers.&lt;/li&gt;
&lt;li&gt;We’ve made some &lt;a href="https://bugzilla.mozilla.org/show_bug.cgi?id=686312"&gt;minor&lt;/a&gt; &lt;a href="https://bugzilla.mozilla.org/show_bug.cgi?id=687243"&gt;protocol&lt;/a&gt; fixes to WebSockets&lt;/li&gt;
&lt;li&gt;If you include an &lt;a href="https://bugzilla.mozilla.org/show_bug.cgi?id=272541"&gt;empty disposition type it’s treated as an “attachment”&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;We don’t &lt;a href="https://bugzilla.mozilla.org/show_bug.cgi?id=255119"&gt;show redirect content after denying automatic redirect to javascript: URL&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;h4&gt;Tools&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;We now &lt;a href="https://bugzilla.mozilla.org/show_bug.cgi?id=612658"&gt;cache data for the window.console API&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/tobiasz_cudnik_reader/~4/WLsbb_A2dAQ" height="1" width="1"/&gt;</content><author><name>Robert Nyman</name></author><source gr:stream-id="feed/http://hacks.mozilla.org/feed/atom/"><id>tag:google.com,2005:reader/feed/http://hacks.mozilla.org/feed/atom/</id><title type="html">Mozilla Hacks - the Web developer blog</title><link rel="alternate" href="https://hacks.mozilla.org/" type="text/html" /></source><feedburner:origLink>http://hacks.mozilla.org/2011/09/introducing-aurora-9/</feedburner:origLink></entry><entry gr:crawl-timestamp-msec="1318275667216"><id gr:original-id="http://ajaxian.com/?p=10736">tag:google.com,2005:reader/item/f7cdd0f9b850c970</id><category term="Front Page" /><category term="JavaScript" /><title type="html">Intel’s Parallel Extensions for JavaScript</title><published>2011-10-08T17:38:07Z</published><updated>2011-10-08T17:38:07Z</updated><link rel="alternate" href="http://feedproxy.google.com/~r/tobiasz_cudnik_reader/~3/-aI3-3JdRkI/intels-parallel-extensions-for-javascript" type="text/html" /><link rel="canonical" href="http://ajaxian.com/archives/intels-parallel-extensions-for-javascript" /><content xml:base="http://ajaxian.com/" type="html">&lt;p&gt;Intel’s Parallel Extensions for JavaScript, code named River Trail, hooks into on-chip vector extensions to improve performance of Web applications. Details of Intel’s attempt to get on the JavaScript juggernaut emerged last month at its developer event.&lt;/p&gt;
&lt;p&gt;The prototype JavaScript extension offered by Intel is intended to allow JavaScript apps to take advantage of modern parallel chip capabilities. Sequential gives way to parallel, at least in theory.&lt;/p&gt;
&lt;p&gt;In-browser games and image editing are pitched as examples of application elements that would take advantage of new eight-core processors, &lt;a href="http://blogs.intel.com/research/2011/09/pjs.php"&gt;blogs Intel’s Stephan Herhut&lt;/a&gt;.The software is said to ”play nicely” with the WebGL JavaScript API to OpenGL for 3D visualization in the browser. Intel has a beta Firefox extension for interested developers. Says Herhut:&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;&lt;em&gt;You can &lt;a href="https://github.com/downloads/RiverTrail/RiverTrail/rivertrail.xpi"&gt;download a prebuilt version&lt;/a&gt; for Windows and 64 Bit MacOS [from github] or build it yourself. For the latter, we have written a &lt;a href="https://github.com/RiverTrail/RiverTrail/tree/master/extension"&gt;README&lt;/a&gt; that explains the process. Once you have the extension installed, take a look at our &lt;a href="https://github.com/RiverTrail/RiverTrail/tree/master/examples"&gt;demos&lt;/a&gt; to see what is possible.&lt;/em&gt;&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;Why should the browser be a second fiddle to the operating system? As browsers, JavaScript, and HTML5 gain more influence, top-tier chip makers will start to adapt their libraries to Web application demands. More, including material on &lt;a href="https://github.com/RiverTrail/RiverTrail/wiki/Three-Pillars-of-the-API"&gt;API design&lt;/a&gt; or the beginnings of  &lt;a href="https://github.com/RiverTrail/RiverTrail/wiki/ParallelArray"&gt;API documentation&lt;/a&gt;, is on a &lt;a href="https://github.com/RiverTrail/RiverTrail/wiki"&gt;RiverTrail wiki&lt;/a&gt;.&lt;/p&gt;
&lt;div&gt;
&lt;a href="http://feeds.feedburner.com/~ff/ajaxian?a=jf_aTxFfWn0:EXYKAxug3W0:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ajaxian?d=yIl2AUoC8zA" border="0"&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ajaxian?a=jf_aTxFfWn0:EXYKAxug3W0:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ajaxian?d=7Q72WNTAKBA" border="0"&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ajaxian?a=jf_aTxFfWn0:EXYKAxug3W0:D7DqB2pKExk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ajaxian?i=jf_aTxFfWn0:EXYKAxug3W0:D7DqB2pKExk" border="0"&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/tobiasz_cudnik_reader/~4/-aI3-3JdRkI" height="1" width="1"/&gt;</content><author><name>jvaughan</name></author><source gr:stream-id="feed/http://ajaxian.com/index.xml"><id>tag:google.com,2005:reader/feed/http://ajaxian.com/index.xml</id><title type="html">Ajaxian » Front Page</title><link rel="alternate" href="http://ajaxian.com" type="text/html" /></source><feedburner:origLink>http://feedproxy.google.com/~r/ajaxian/~3/jf_aTxFfWn0/intels-parallel-extensions-for-javascript</feedburner:origLink></entry><entry gr:crawl-timestamp-msec="1318275634349"><id gr:original-id="http://functionsource.com/post/javascriptplusplus">tag:google.com,2005:reader/item/2941815c173317f4</id><category term="javascript" /><title type="html">JavaScript++: classes, block scoping, pluggable type systems, and more</title><published>2011-10-10T07:01:03Z</published><updated>2011-10-10T07:01:03Z</updated><link rel="alternate" href="http://feedproxy.google.com/~r/tobiasz_cudnik_reader/~3/nKNOvaLZ1ss/javascriptplusplus" type="text/html" /><content xml:base="http://functionsource.com/" type="html">&lt;p&gt;All eyes are on the upcoming “Dart” announcement from Denmark. That being said, there are many others playing on top of the playground that is the JavaScript VM (browser + server now!).&lt;/p&gt;
&lt;p&gt;One ambitious project is &lt;a href="http://jspp.javascript.am/"&gt;JavaScript++&lt;/a&gt; from Roger Poon and team.&lt;/p&gt;
&lt;p&gt;The JavaScript++ project adds a slew of functionality that all gets compiled down to ES3. It includes support for:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;classes (as in ‘class’ and ‘extend’)
&lt;/li&gt;&lt;li&gt;block scoping (let!)
&lt;/li&gt;&lt;li&gt;pluggable type systems (gilad!)
&lt;/li&gt;&lt;li&gt;full PCRE-compatible regular expression patterns (everything from look behinds to possessive quantifiers)
&lt;/li&gt;&lt;li&gt;array programming: scoped extensions, comprehensions, and more
&lt;/li&gt;&lt;li&gt;and a ton of “small” things such as multi-line strings
&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;Check out the &lt;a href="http://jspp.javascript.am/tutorial.html"&gt;tutorial for the real deets&lt;/a&gt;.&lt;/p&gt;
&lt;br&gt;&lt;img src="http://feeds.feedburner.com/~r/tobiasz_cudnik_reader/~4/nKNOvaLZ1ss" height="1" width="1"/&gt;</content><author><name>Dion Almaer</name></author><source gr:stream-id="feed/http://functionsource.com/feeds/entries"><id>tag:google.com,2005:reader/feed/http://functionsource.com/feeds/entries</id><title type="html">FunctionSource Posts</title><link rel="alternate" href="http://functionsource.com" type="text/html" /></source><feedburner:origLink>http://functionsource.com/post/javascriptplusplus</feedburner:origLink></entry><entry gr:crawl-timestamp-msec="1312979889653"><id gr:original-id="http://hacks.mozilla.org/?p=8916">tag:google.com,2005:reader/item/27018539737dc123</id><category term="Firebug" scheme="http://hacks.mozilla.org" /><title type="html">Firebug 1.8 New Features</title><published>2011-07-29T11:49:59Z</published><updated>2011-07-29T11:58:21Z</updated><link rel="alternate" href="http://feedproxy.google.com/~r/tobiasz_cudnik_reader/~3/kY0mpJ-21h0/" type="text/html" /><link rel="replies" href="http://hacks.mozilla.org/2011/07/firebug-1-8-new-features/#comments" type="text/html" /><link rel="replies" href="http://hacks.mozilla.org/2011/07/firebug-1-8-new-features/feed/atom/" type="application/atom+xml" /><content xml:base="http://hacks.mozilla.org/2011/07/firebug-1-8-new-features/" xml:lang="en" type="html">&lt;p&gt;&lt;a href="http://getfirebug.com/releases/firebug/1.8/firebug-1.8.0.xpi"&gt;Firebug 1.8&lt;/a&gt; compatible with &lt;strong&gt;Firefox 5.0&lt;/strong&gt; &lt;a href="http://blog.getfirebug.com/2011/07/29/firebug-1-8-0/"&gt;has been released&lt;/a&gt; and I would like to get this opportunity and introduce some new features in this version.&lt;/p&gt;
&lt;p&gt;Firebug 1.8 has been also uploaded to &lt;a href="https://addons.mozilla.org/en-US/firefox/addon/firebug/"&gt;AMO&lt;/a&gt;, but it can take some time to appear.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Firebug" src="http://getfirebug.com/img/firebug-logo.png" title="Firebug" width="293" height="89"&gt;&lt;/p&gt;
&lt;p&gt;First of all, check out the following compatibility table:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Firefox 3.6&lt;/strong&gt; with &lt;a href="https://addons.mozilla.org/en-US/firefox/addon/firebug/versions/?page=1#version-1.7.3"&gt;Firebug 1.7.3&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Firefox 4.0&lt;/strong&gt; with &lt;a href="https://addons.mozilla.org/en-US/firefox/addon/firebug/versions/?page=1#version-1.7.3"&gt;Firebug 1.7.3&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Firefox 5.0&lt;/strong&gt; with &lt;a href="https://addons.mozilla.org/en-US/firefox/addon/firebug/"&gt;Firebug 1.8&lt;/a&gt; (and also &lt;a href="https://addons.mozilla.org/en-US/firefox/addon/firebug/versions/?page=1#version-1.7.3"&gt;Firebug 1.7.3&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Firefox 6.0&lt;/strong&gt; with &lt;a href="http://getfirebug.com/releases/firebug/1.9/firebug-1.9.0a0.xpi"&gt;Firebug 1.9a0&lt;/a&gt; (and Firebug 1.8 as soon as 6.0 is out)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Firefox 7.0&lt;/strong&gt; with &lt;a href="http://getfirebug.com/releases/firebug/1.9/firebug-1.9.0a0.xpi"&gt;Firebug 1.9a0&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Firefox 8.0&lt;/strong&gt; with &lt;a href="http://getfirebug.com/releases/firebug/1.9/firebug-1.9.0a0.xpi"&gt;Firebug 1.9a0&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;console.timeStamp()&lt;/h3&gt;
&lt;p&gt;There is a new API that can be used to create time-stamps during Javascript execution and compare them together with HTTP traffic timing on the timeline in the Net panel: &lt;code&gt;console.timeStamp();&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="" src="http://hacks.mozilla.org/wp-content/uploads/2011/07/console-timestamp.png" title="console.timeStamp()" width="520" height="162"&gt;&lt;/p&gt;
&lt;p&gt;See &lt;a href="http://www.softwareishard.com/blog/firebug/firebug-1-8-console-timestamp/"&gt;detailed description&lt;/a&gt; of this feature with examples how to use it.&lt;/p&gt;
&lt;h3&gt;IP Address displayed in the Net Panel&lt;/h3&gt;
&lt;p&gt;The Net panel displays remote &amp;amp; local IP address + port number for each request. There are two additional columns, see the screen-shot:&lt;/p&gt;
&lt;p&gt;&lt;img alt="" src="http://hacks.mozilla.org/wp-content/uploads/2011/07/netpanel-ipaddress.png" title="Net Panel IP Address &amp;amp; Port" width="520" height="272"&gt;&lt;/p&gt;
&lt;h3&gt;HTML Preview Reloaded&lt;/h3&gt;
&lt;p&gt;This feature is back and better than before. Now you can adjust height of the preview by drag-and-drop to see more or less content as necessary.&lt;/p&gt;
&lt;p&gt;&lt;img alt="" src="http://hacks.mozilla.org/wp-content/uploads/2011/07/netpanel-htmlpreview.png" title="Resizeable HTML Preview" width="520" height="226"&gt;&lt;/p&gt;
&lt;h3&gt;Improved Script Location List&lt;/h3&gt;
&lt;p&gt;Script location list available in the Script panel adjusts its size automatically according to the screen size and uses scroll-bar as needed. This makes easier for the user to pick up the right script.&lt;/p&gt;
&lt;p&gt;&lt;img alt="" src="http://hacks.mozilla.org/wp-content/uploads/2011/07/script-location-list.png" title="Script Location List" width="520" height="238"&gt;&lt;/p&gt;
&lt;h3&gt;Command Line Content Persistence&lt;/h3&gt;
&lt;p&gt;Command line content is now persistent across reloads. This feature allows to quickly execute the same expression on different pages. This is one of many little details that make Firebug the indispensable tool.&lt;/p&gt;
&lt;h3&gt;New DOM Panel Options&lt;/h3&gt;
&lt;p&gt;The DOM panel has two new options: &lt;/p&gt;
&lt;p&gt;&lt;img alt="" src="http://hacks.mozilla.org/wp-content/uploads/2011/07/dompanel-newoptions.png" title="New options in the DOM panel" width="473" height="236"&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Show Own Properties Only&lt;/strong&gt; check if you don’t want see the prototype chain for objects&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Show Enumerable Properties Only&lt;/strong&gt; check if you want to see only enumerable properties&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;CSS Panel Color Tooltips&lt;/h3&gt;
&lt;p&gt;A tooltip with color preview is displayed for colors specified in various formats. Supported formats are: hex, rgb, rgba, hsl and hsla.&lt;/p&gt;
&lt;p&gt;&lt;img alt="" src="http://hacks.mozilla.org/wp-content/uploads/2011/07/csspanel-colortips.png" title="Color Tips" width="406" height="66"&gt;&lt;/p&gt;
&lt;h3&gt;Shortcuts for Changing CSS values&lt;/h3&gt;
&lt;p&gt;Firebug is great when tweaking CSS of the current page to perfection. Now, there are also new keyboard shortcuts for changing CSS values (numbers).&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;Ctrl+Up/Down&lt;/em&gt; increases/decreases by &lt;strong&gt;0.1&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Shift+Up/Down&lt;/em&gt; increases/decreases by &lt;strong&gt;10&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Better Support for External Editors&lt;/h3&gt;
&lt;p&gt;As you might know Firebug allows to configure and open an external editor (or IDE). There has been two arguments you could pass to such editor:&lt;/p&gt;
&lt;p&gt;&lt;img alt="" src="http://hacks.mozilla.org/wp-content/uploads/2011/07/external-editors.png" title="External editors" width="480" height="148"&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;%url&lt;/em&gt; URL of the file (if %url is not present, %file will be added by default)&lt;/li&gt;
&lt;li&gt;&lt;em&gt;%file&lt;/em&gt; Path to the local file (or to the temporary copy)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Firebug 1.8 introduces a new &lt;strong&gt;%line&lt;/strong&gt; argument that allows to open the external editor scrolled at the right position (according to the current scroll position in the the Script panel).&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;%line&lt;/em&gt; Line number&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Box Sizing Exposed&lt;/h3&gt;
&lt;p&gt;CSS3 introduced a new property called &lt;strong&gt;box-sizing&lt;/strong&gt;, which allows the user changing the box model for an element and thereby influence element layout. Value of this property is now exposed in the &lt;strong&gt;Layout side panel&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img alt="" src="http://hacks.mozilla.org/wp-content/uploads/2011/07/box-sizing.png" title="Box-sizing property" width="323" height="206"&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blog.getfirebug.com/"&gt;Stay Tuned!&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Honza&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/tobiasz_cudnik_reader/~4/kY0mpJ-21h0" height="1" width="1"/&gt;</content><author><name>Honza</name></author><source gr:stream-id="feed/http://hacks.mozilla.org/feed/atom/"><id>tag:google.com,2005:reader/feed/http://hacks.mozilla.org/feed/atom/</id><title type="html">Mozilla Hacks - the Web developer blog</title><link rel="alternate" href="https://hacks.mozilla.org/" type="text/html" /></source><feedburner:origLink>http://hacks.mozilla.org/2011/07/firebug-1-8-new-features/</feedburner:origLink></entry><entry gr:crawl-timestamp-msec="1312979821349"><id gr:original-id="http://hacks.mozilla.org/?p=9071">tag:google.com,2005:reader/item/4e2412ad44e11983</id><category term="Animations" scheme="http://hacks.mozilla.org" /><category term="CSS" scheme="http://hacks.mozilla.org" /><category term="Demo" scheme="http://hacks.mozilla.org" /><category term="JavaScript" scheme="http://hacks.mozilla.org" /><category term="3d" scheme="http://hacks.mozilla.org" /><category term="animation" scheme="http://hacks.mozilla.org" /><category term="css3d" scheme="http://hacks.mozilla.org" /><category term="hack" scheme="http://hacks.mozilla.org" /><title type="html">Rendering 3D with CSS and JavaScript with dom3d (guest post)</title><published>2011-08-08T07:38:22Z</published><updated>2011-08-09T22:30:33Z</updated><link rel="alternate" href="http://feedproxy.google.com/~r/tobiasz_cudnik_reader/~3/l8noio-HQT4/" type="text/html" /><link rel="replies" href="http://hacks.mozilla.org/2011/08/rendering-3d-with-css-and-javascript-with-dom3d-guest-post/#comments" type="text/html" /><link rel="replies" href="http://hacks.mozilla.org/2011/08/rendering-3d-with-css-and-javascript-with-dom3d-guest-post/feed/atom/" type="application/atom+xml" /><content xml:base="http://hacks.mozilla.org/2011/08/rendering-3d-with-css-and-javascript-with-dom3d-guest-post/" xml:lang="en" type="html">&lt;p&gt;&lt;img src="http://hacks.mozilla.org/wp-content/uploads/2011/08/jameslong.png" alt="James Long" width="204" height="206" style="float:left;padding:5px"&gt; Today we have a guest post by James Long (&lt;a href="http://twitter.com/jlongster"&gt;@jlongster&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;James is the tech lead for mozilla.com on the Web Development team. James is passionate about interactive graphics on the open web. &lt;/p&gt;
&lt;p&gt;Today he explains how you can create 3D objects using CSS without having 3D transforms support. Take it away, James.&lt;/p&gt;
&lt;hr&gt;
&lt;p style="clear:both;margin-top:3em"&gt;Recently I was tinkering with CSS3 and I discovered that it  enabled me to do primitive 3D rendering, which I found  fascinating! This led to the creation  of &lt;a href="https://github.com/jlongster/dom3d"&gt;dom3d&lt;/a&gt;, a  JavaScript library that uses CSS to render basic 3D objects.&lt;/p&gt;
&lt;p&gt;Now the question is: why? Aren’t canvas, WebGL, and even SVG  better technologies to work with for this? Possibly. However,  CSS is becoming a powerful language for describing complex  effects and shapes, and we should experiment.&lt;/p&gt;
&lt;p&gt;Keep that in mind, because CSS definitely  isn’t &lt;em&gt;intended&lt;/em&gt; to do this, but it’s worth trying to see  where we should take CSS in the future.&lt;/p&gt;
&lt;h2&gt;Advantages&lt;/h2&gt;
&lt;p&gt;Although this is more of an experiment, it has a few real world benefits:&lt;/p&gt;
&lt;p&gt;All rendering libraries available for the web (canvas, WebGL,  SVG) require a canvas, which is a constrained box on the page  with a specific width and height. It is not possible to render  anything outside this box. The canvas also captures all DOM  events (like clicks), even completely transparent  sections. Theoretically, this could make it difficult to do effects that  overlay large parts of the page or are somehow deeply integrated  to the content.&lt;/p&gt;
&lt;p&gt;Using CSS, we aren’t constrained to a box, and the effect can overlay large portions of the page without covering any the the  links or other content requiring interaction.&lt;/p&gt;
&lt;p&gt;Other advantages include no need to initialize canvas 2D or  WebGL, and a simplistic API making it easy to pick up even if  you don’t know much about 3D. It might be easier for kids to  start playing around with this before they jump into WebGL or  something else. Also, because it’s just a dump of DOM elements  you can embed it anywhere (without  animation).&lt;/p&gt;
&lt;p&gt;So keep in mind that this &lt;em&gt;is&lt;/em&gt; a hack, but with the above  advantages. This might be good for certain effects: &lt;a href="http://jlongster.com/s/dom3d/cursor.html"&gt;3D cursor&lt;/a&gt;, nav  transitions, and others.&lt;/p&gt;
&lt;h2&gt;How it works&lt;/h2&gt;
&lt;p&gt;Three-D objects are just a bunch of triangles put together, so let’s  start with one simple triangle. If we get that working, it’s a  simple step forward to render multiple triangles to form a 3D  object.&lt;/p&gt;
&lt;p&gt;Rendering a 3d triangle on a 2D screen involves something called  “projection”. This is the act of taking a 3D point  and &lt;em&gt;projecting&lt;/em&gt; it onto a 2D screen. Plug in a 3D  triangle to a simple math equation, and you get a 2D triangle  representing how the 3D one would look on the screen.&lt;/p&gt;
&lt;p&gt;The math is remarkably simple but may seem weird if you aren’t familiar with linear algebra. You can   &lt;a href="https://github.com/jlongster/dom3d/blob/e892597fc020fe18a766/renderer.js#L6"&gt;take a look at the renderer code&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Now comes the fun part: can you render any 2D triangle simply with &lt;a href="https://developer.mozilla.org/En/transform"&gt;CSS3 transforms&lt;/a&gt;? Turns out you can! It just takes some fiddling  to figure out which transforms to generate. CSS3 transforms are  composed of translate, scale, rotate, and skew values, and we  need a few equations to compute these values for a specific 2D  triangle.&lt;/p&gt;
&lt;p&gt;First, let’s take a simple DOM element and turn it into a  triangle. We can do this with the &lt;code&gt;linear-gradient&lt;/code&gt;  background image (another way  is &lt;a href="http://mrcoles.com/blog/callout-box-css-border-triangles-cross-browser/"&gt;border triangles&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;Now let’s draw the following blue triangle with the points [20,  20], [50, 120], and [120, 30]. A vital step is to set a few  initial reference points which set everything in the same  space. Our equations will assume these coordinate spaces. This  is how the points A, B, C and the side AB are related.&lt;/p&gt;
&lt;p&gt;&lt;img src="http://hacks.mozilla.org/wp-content/uploads/2011/08/tri-compare.png" alt="Triangle comparison"&gt;&lt;/p&gt;
&lt;p&gt;If we take a closer look at this, we can derive the transform  values. First, get an idea of which angles and values we need  and then use geometry to form the equations (in  pseudo-code). The red box represents the DOM element, the form  AB represents the side formed by points A and B, and rotation  occurs clockwise.&lt;/p&gt;
&lt;p&gt;&lt;img src="http://hacks.mozilla.org/wp-content/uploads/2011/08/tri-disect.png" alt="dissecting triangles" style="float:right"&gt;
&lt;pre&gt;
rotation = atan2(AB.x, AB.y)
AC' = rotate(AC, -rotation)
width = AC'.x
height = length(AB)
skew = atan2(AC'.y, AC'.x)
translate = A&lt;/pre&gt;
&lt;p&gt;Awesome! Let’s try it out. Here is a live DOM element being  transformed by applying each of our equations:&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;The resulting triangle matches our target triangle! Here is the  final CSS:&lt;/p&gt;

&lt;div&gt;&lt;div&gt;&lt;pre style="font-family:monospace"&gt;&lt;span style="color:#000000;font-weight:bold"&gt;width&lt;/span&gt;&lt;span style="color:#00aa00"&gt;:&lt;/span&gt; &lt;span style="color:#933"&gt;93px&lt;/span&gt;&lt;span style="color:#00aa00"&gt;;&lt;/span&gt;
&lt;span style="color:#000000;font-weight:bold"&gt;height&lt;/span&gt;&lt;span style="color:#00aa00"&gt;:&lt;/span&gt; &lt;span style="color:#933"&gt;104px&lt;/span&gt;&lt;span style="color:#00aa00"&gt;;&lt;/span&gt;
&lt;span style="color:#000000;font-weight:bold"&gt;background&lt;/span&gt;&lt;span style="color:#00aa00"&gt;:&lt;/span&gt; -moz-linear-gradient&lt;span style="color:#00aa00"&gt;(&lt;/span&gt;-0.727211rad&lt;span style="color:#00aa00"&gt;,&lt;/span&gt; &lt;span style="color:#cc00cc"&gt;#0000FF&lt;/span&gt; &lt;span style="color:#933"&gt;50%&lt;/span&gt;&lt;span style="color:#00aa00"&gt;,&lt;/span&gt; &lt;span style="color:#993333"&gt;transparent&lt;/span&gt; &lt;span style="color:#933"&gt;0pt&lt;/span&gt;&lt;span style="color:#00aa00"&gt;)&lt;/span&gt;&lt;span style="color:#00aa00"&gt;;&lt;/span&gt;
-moz-transform&lt;span style="color:#00aa00"&gt;:&lt;/span&gt; translate&lt;span style="color:#00aa00"&gt;(&lt;/span&gt;&lt;span style="color:#933"&gt;20px&lt;/span&gt;&lt;span style="color:#00aa00"&gt;,&lt;/span&gt; &lt;span style="color:#933"&gt;20px&lt;/span&gt;&lt;span style="color:#00aa00"&gt;)&lt;/span&gt; rotate&lt;span style="color:#00aa00"&gt;(&lt;/span&gt;-0.291457rad&lt;span style="color:#00aa00"&gt;)&lt;/span&gt; skewY&lt;span style="color:#00aa00"&gt;(&lt;/span&gt;0.391125rad&lt;span style="color:#00aa00"&gt;)&lt;/span&gt;&lt;span style="color:#00aa00"&gt;;&lt;/span&gt;
-moz-transform-origin&lt;span style="color:#00aa00"&gt;:&lt;/span&gt; &lt;span style="color:#000000;font-weight:bold"&gt;top&lt;/span&gt; &lt;span style="color:#000000;font-weight:bold"&gt;left&lt;/span&gt;&lt;span style="color:#00aa00"&gt;;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;&lt;em&gt;Note&lt;/em&gt;: The &lt;code&gt;tranform-origin: top left&lt;/code&gt; line is  important. Normally transforms happen relative to the center of  the element, but our equations assume the top left.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Note&lt;/em&gt;: dom3d also generates code with the &lt;code&gt;-webkit&lt;/code&gt;  and &lt;code&gt;-o&lt;/code&gt; prefixes for WebKit and Opera support.&lt;/p&gt;
&lt;p&gt;You can view the &lt;a href="https://github.com/jlongster/dom3d/blob/master/renderer_css.js#L79"&gt;    implementation of these  equations&lt;/a&gt;. It turns out that these equations work for any triangle, as long  as the points given are in counter-clockwise order, which is  standard in the graphics world.&lt;/p&gt;
&lt;h3&gt;Taking it all the way&lt;/h3&gt;
&lt;p&gt;Since we can project a 3D triangle into 2D space and render it  with CSS, all we have to do now is apply that to several 3D  triangles to form a 3D object!&lt;/p&gt;
&lt;p&gt;  We need some 3D data at this point. I used Blender to export a  teapot into the simple OBJ file format and  &lt;a href="https://github.com/jlongster/dom3d/blob/master/mesh/dump-vertices.scm"&gt;wrote a script&lt;/a&gt; to dump the  &lt;a href="https://github.com/jlongster/dom3d/blob/master/teapot.js"&gt;data  as JavaScript&lt;/a&gt;. Rendering all those triangles with this technique  produces the following:&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;Teapot! However, we can do much better. A big part of the 3D  effect is &lt;em&gt;shading&lt;/em&gt;. If we calculate normals, a vector  representing where the triangle is facing, and specify a light  direction, we can take the dot product of the normal and light  for each triangle to get  &lt;a href="http://en.wikipedia.org/wiki/Shading#Flat_vs_smooth_shading"&gt;flat shading&lt;/a&gt;. View   &lt;a href="https://github.com/jlongster/dom3d/blob/master/renderer.js#L69"&gt;the code for flat shading&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;There are many tweaks that take this even further. For example,  the above objects have z-indexing enabled. Without this, a  triangle that is supposed to be behind another may actually  appear on top because it was rendered  later. The dom3d uses a  &lt;a href="https://github.com/jlongster/dom3d/blob/e892597fc020fe18a766/heap.js"&gt;heap&lt;/a&gt; to render the triangles from  &lt;a href="https://github.com/jlongster/dom3d/blob/e892597fc020fe18a766/dom3d.js#L61"&gt;back to front&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Real-time animation can be achieved with a setTimeout or requestAnimationFrame function that continually renders the object. The dom3d supports the scale,  translate, yaw, and pitch transformations, but there’s nothing  stopping you from modifying the object data however you like  between renderings. See some examples over at  the &lt;a href="http://jlongster.com/s/dom3d/"&gt;dom3d website&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Here is the code which renders  the &lt;a href="http://jlongster.com/s/dom3d/example3.html"&gt;teapot  animation&lt;/a&gt; with dom3d:&lt;/p&gt;
&lt;p&gt;
&lt;p&gt;  It’s more appropriate for webpages to update an animation in  response to user interaction instead of constantly rendering and  hogging the CPU. See  the &lt;a href="http://jlongster.com/s/dom3d/example.html"&gt;pole  example&lt;/a&gt; on the dom3d site for an example.&lt;/p&gt;
&lt;h2&gt;Improvements and last thoughts&lt;/h2&gt;
&lt;p&gt;The most interesting possibility with this is to include actual  page elements as part of 3D objects. A navigation item could pop  out and swirl around in 3d space, and the nav item is seamlessly  transformed along with it.&lt;/p&gt;
&lt;p&gt;That’s where this hack starts to show its faults, though. Unfortunately this is a little too hacky to provide an  appropriate web experience. Because it tricks DIVs into fake  triangles, it removes the possibility of integrating any page  elements with it. With the coming  of &lt;a href="http://www.w3.org/TR/css3-3d-transforms/"&gt;3D CSS  transforms&lt;/a&gt; though, we can start building true 3D objects  made up of any kind of page elements. The only restriction with  3D transforms is that the 3D objects need to built with  rectangles instead of triangles.&lt;/p&gt;
&lt;p&gt;Other people have already experimented with 3D transforms, like  &lt;a href="http://cubiq.org/building-a-pure-css-3d-city"&gt;building  a pure CSS 3D city&lt;/a&gt;. There’s another cool library,  &lt;a href="http://minimal.be/lab/Sprite3D/"&gt;Sprite3D&lt;/a&gt;, which  provides a JavaScript API for building basic 3d objects from  page elements.&lt;/p&gt;
&lt;p&gt;The most glaring problem with dom3d is the seams in the object, which appear in all browsers. Apparently there are a few bugs in  rendering engines when stressing their CSS3 transforms and using  linear-gradients!&lt;/p&gt;
&lt;p&gt;The dom3d library provides an API to work with all of this, but is hasn’t  been documented very well yet. Feel free to browse the README  and &lt;a href="http://github.com/jlongster/dom3d"&gt;code on github&lt;/a&gt;. These APIs could be improved as well. It also  provides an SVG rendering backend,  &lt;a href="https://github.com/jlongster/dom3d/blob/master/renderer_raphael.js"&gt;seen  here&lt;/a&gt;, but I don’t this is the right direction to take. We  should focus on building basic 3D objects with page elements.&lt;/p&gt;
&lt;p&gt;  This was a fun experiment and I’m excited by how fast and  capable browsers are becoming. The web is an exciting platform  and getting richer and more powerful every year!&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/tobiasz_cudnik_reader/~4/l8noio-HQT4" height="1" width="1"/&gt;</content><author><name>Chris Heilmann</name></author><source gr:stream-id="feed/http://hacks.mozilla.org/feed/atom/"><id>tag:google.com,2005:reader/feed/http://hacks.mozilla.org/feed/atom/</id><title type="html">Mozilla Hacks - the Web developer blog</title><link rel="alternate" href="https://hacks.mozilla.org/" type="text/html" /></source><feedburner:origLink>http://hacks.mozilla.org/2011/08/rendering-3d-with-css-and-javascript-with-dom3d-guest-post/</feedburner:origLink></entry><entry gr:crawl-timestamp-msec="1312966262875"><id gr:original-id="http://thechangelog.com/post/8061175821">tag:google.com,2005:reader/item/dac51008ce9198b5</id><category term="github" /><title type="html">browserify - write client-side javascript server-side</title><published>2011-07-25T23:23:46Z</published><updated>2011-07-25T23:23:46Z</updated><link rel="alternate" href="http://feedproxy.google.com/~r/tobiasz_cudnik_reader/~3/pulraw3GRkc/8061175821" type="text/html" /><link rel="canonical" href="http://thechangelog.com/post/8061175821" /><summary xml:base="http://thechangelog.com/" type="html">&lt;a href="https://github.com/substack/node-browserify"&gt;browserify - write client-side javascript server-side&lt;/a&gt;: &lt;p&gt;Unifying your front-end and back-end codebases can be a harrowing experience. Regardless of your web technology stack of choice, you’ve probably created some server-side component which generated some front-end JavaScript for you at some point. I’ve created and used many tools that do such code generation, and I’ve hated all of them. This is why I’m soo excited to see &lt;a href="https://github.com/substack/node-browserify"&gt;node-browserify&lt;/a&gt; by prolific Node.js module author, &lt;a href="http://github.com/substack/"&gt;James Halliday&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/substack/node-browserify"&gt;browserify&lt;/a&gt; is a node.js library which helps you share your back-end code to the front-end by enabling such features as:&lt;/p&gt;

&lt;ul&gt;&lt;li&gt;a client-side require() method&lt;/li&gt;
&lt;li&gt;being able to load &lt;code&gt;npm&lt;/code&gt; packages&lt;/li&gt;
&lt;li&gt;a middleware system for code generation: 

&lt;ul&gt;&lt;li&gt;minify&lt;/li&gt;
&lt;li&gt;uglify&lt;/li&gt;
&lt;li&gt;ES5 compatibility&lt;/li&gt;
&lt;li&gt;fileify ( wrap static files or directories in JavaScript methods )&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;a CLI tool for creating stand-alone bundles&lt;/li&gt;
&lt;li&gt;full integration with node’s httpServer and Express&lt;/li&gt;
&lt;li&gt;browser-versions of certain core node modules such as &lt;code&gt;path&lt;/code&gt;, &lt;code&gt;events&lt;/code&gt;, and &lt;code&gt;vm&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;Browserify does a great job of simplifying the process of sharing code between the browser and server by building on top of existing infrastructure and providing some great new features that play very nice with node.js&lt;/p&gt;

&lt;p&gt;I needed to build a library that would operate dual-sided ( front-end and back-end ), and I choose to build it server-side first and then use the browserify CLI tool to port it to the client ( and work as a standalone with no server dependencies ). The entire process worked out much better then expected and I’d recommend trying it out for your next JavaScript project.&lt;/p&gt;

&lt;p&gt;If you’d like to see an example of node-browserify in production, you can check out &lt;a href="http://browserling.com"&gt;Browserling&lt;/a&gt;, Mr. Halliday’s very own company which allows you to test websites cross-browser, in your own browser! I can only imagine what crazy libraries SubStack will think up next.&lt;/p&gt;&lt;div&gt;
&lt;a href="http://feeds.feedburner.com/~ff/thechangelog?a=r41D1Z_HKYs:T7XktbrzVu4:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/thechangelog?d=yIl2AUoC8zA" border="0"&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/thechangelog?a=r41D1Z_HKYs:T7XktbrzVu4:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/thechangelog?d=7Q72WNTAKBA" border="0"&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/thechangelog?a=r41D1Z_HKYs:T7XktbrzVu4:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/thechangelog?i=r41D1Z_HKYs:T7XktbrzVu4:V_sGLiPBpWU" border="0"&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/thechangelog?a=r41D1Z_HKYs:T7XktbrzVu4:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/thechangelog?d=qj6IDK7rITs" border="0"&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/thechangelog?a=r41D1Z_HKYs:T7XktbrzVu4:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/thechangelog?i=r41D1Z_HKYs:T7XktbrzVu4:gIN9vFwOqvQ" border="0"&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/thechangelog/~4/r41D1Z_HKYs" height="1" width="1"&gt;&lt;img src="http://feeds.feedburner.com/~r/tobiasz_cudnik_reader/~4/pulraw3GRkc" height="1" width="1"/&gt;</summary><author gr:unknown-author="true"><name>(author unknown)</name></author><source gr:stream-id="feed/http://feeds.feedburner.com/thechangelog"><id>tag:google.com,2005:reader/feed/http://feeds.feedburner.com/thechangelog</id><title type="html">The Changelog</title><link rel="alternate" href="http://thechangelog.com" type="text/html" /></source><feedburner:origLink>http://feedproxy.google.com/~r/thechangelog/~3/r41D1Z_HKYs/8061175821</feedburner:origLink></entry><entry gr:crawl-timestamp-msec="1312326934811"><id gr:original-id="http://thechangelog.com/post/8383704589">tag:google.com,2005:reader/item/3d24c78aae0ce79a</id><category term="github" /><title type="html">hook.io 0.6.0 released</title><published>2011-08-02T13:37:16Z</published><updated>2011-08-02T13:37:16Z</updated><link rel="alternate" href="http://feedproxy.google.com/~r/tobiasz_cudnik_reader/~3/Nfmu2FmQ0iI/8383704589" type="text/html" /><link rel="canonical" href="http://thechangelog.com/post/8383704589" /><summary xml:base="http://thechangelog.com/" type="html">&lt;a href="http://github.com/hookio/hook.io"&gt;hook.io 0.6.0 released&lt;/a&gt;: &lt;p&gt;&lt;a href="http://hook.io"&gt;hook.io&lt;/a&gt; is a node.js library which creates a distributed EventEmitter that works cross-process / cross-platform / cross-browser. Essentially, it’s a real-time event bus that works anywhere JavaScript is supported.&lt;/p&gt;

&lt;p&gt;Since we first blogged about &lt;a href="http://hook.io"&gt;hook.io&lt;/a&gt; in &lt;a href="http://thechangelog.com/post/502419270/hook-io-the-node-js-web-hook-platform"&gt;April of 2010&lt;/a&gt;, the project has been completely rewritten in the 0.5.x and 0.6.x versions to take full advantage of &lt;a href="http://github.com/hij1nx/EventEmitter2"&gt;EventEmitter2&lt;/a&gt;, &lt;a href="http://github.com/substack/dnode"&gt;dnode&lt;/a&gt;, and &lt;a href="http://github.com/indexzero/forever"&gt;Forever&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The new version has a very simple broadcasting API:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt; hook.emit('hello', 'world');

 hook.on('*::hello', function(data){
    console.log(this.event); // 'the-source-hook::hello'
    console.log(data);  // 'world   
 });
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;There are also a few pre-built Hooks&lt;/p&gt;

&lt;ul&gt;&lt;li&gt;&lt;a href="http://github.com/hookio/cron"&gt;cron&lt;/a&gt;: Execute Hook Events as Tasks&lt;/li&gt;
&lt;li&gt;&lt;a href="http://github.com/hookio/irc"&gt;irc&lt;/a&gt;: Full IRC bindings&lt;/li&gt;
&lt;li&gt;&lt;a href="http://github.com/hookio/helloworld"&gt;helloworld&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://github.com/hookio/logger"&gt;logger&lt;/a&gt;: Multi-transport Logger ( Console, File, Redis, Mongo, Loggly )&lt;/li&gt;
&lt;li&gt;&lt;a href="http://github.com/hookio/mailer"&gt;mailer&lt;/a&gt;: Sends emails&lt;/li&gt;
&lt;li&gt;&lt;a href="http://github.com/hookio/pinger"&gt;pinger&lt;/a&gt;: Pings URLS on intervals ( useful for monitoring )&lt;/li&gt;
&lt;li&gt;&lt;a href="http://github.com/hookio/request"&gt;request&lt;/a&gt;: Simple wrapper for &lt;a href="http://github.com/mikeal/request"&gt;&lt;a href="http://github.com/mikeal/request"&gt;http://github.com/mikeal/request&lt;/a&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://github.com/hookio/repl"&gt;repl&lt;/a&gt;: Rainbow Powered REPL&lt;/li&gt;
&lt;li&gt;&lt;a href="http://github.com/hookio/twilio"&gt;twilio&lt;/a&gt;: Make calls and send SMS through [Twilio][10]&lt;/li&gt;
&lt;li&gt;&lt;a href="http://github.com/hookio/twitter"&gt;twitter&lt;/a&gt;: Wrapper to Twitter API&lt;/li&gt;
&lt;li&gt;&lt;a href="http://github.com/hookio/webhook"&gt;webhook&lt;/a&gt;: Emits received HTTP requests as Events ( with optional JSON-RPC 1.0 Support )&lt;/li&gt;
&lt;/ul&gt;&lt;div&gt;
&lt;a href="http://feeds.feedburner.com/~ff/thechangelog?a=5kY9_G0zU8c:Zkrv5J2aRCY:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/thechangelog?d=yIl2AUoC8zA" border="0"&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/thechangelog?a=5kY9_G0zU8c:Zkrv5J2aRCY:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/thechangelog?d=7Q72WNTAKBA" border="0"&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/thechangelog?a=5kY9_G0zU8c:Zkrv5J2aRCY:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/thechangelog?i=5kY9_G0zU8c:Zkrv5J2aRCY:V_sGLiPBpWU" border="0"&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/thechangelog?a=5kY9_G0zU8c:Zkrv5J2aRCY:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/thechangelog?d=qj6IDK7rITs" border="0"&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/thechangelog?a=5kY9_G0zU8c:Zkrv5J2aRCY:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/thechangelog?i=5kY9_G0zU8c:Zkrv5J2aRCY:gIN9vFwOqvQ" border="0"&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/thechangelog/~4/5kY9_G0zU8c" height="1" width="1"&gt;&lt;img src="http://feeds.feedburner.com/~r/tobiasz_cudnik_reader/~4/Nfmu2FmQ0iI" height="1" width="1"/&gt;</summary><author gr:unknown-author="true"><name>(author unknown)</name></author><source gr:stream-id="feed/http://feeds.feedburner.com/thechangelog"><id>tag:google.com,2005:reader/feed/http://feeds.feedburner.com/thechangelog</id><title type="html">The Changelog</title><link rel="alternate" href="http://thechangelog.com" type="text/html" /></source><feedburner:origLink>http://feedproxy.google.com/~r/thechangelog/~3/5kY9_G0zU8c/8383704589</feedburner:origLink></entry><entry gr:crawl-timestamp-msec="1308439917185"><id gr:original-id="tag:blogger.com,1999:blog-1377183911445147227.post-2365824007884455574">tag:google.com,2005:reader/item/fc27bdcf1b16de04</id><category term="Apps Script" scheme="http://www.blogger.com/atom/ns#" /><category term="Google Docs API" scheme="http://www.blogger.com/atom/ns#" /><category term="Gmail APIs" scheme="http://www.blogger.com/atom/ns#" /><title type="html">Gmail and Document Services now available in Apps Script</title><published>2011-06-15T21:13:00Z</published><updated>2011-06-15T21:45:04Z</updated><link rel="alternate" href="http://feedproxy.google.com/~r/tobiasz_cudnik_reader/~3/ur6EV4QZWEc/gmail-and-document-services-now.html" type="text/html" /><link rel="replies" href="http://googleappsdeveloper.blogspot.com/feeds/2365824007884455574/comments/default" title="Post Comments" type="application/atom+xml" /><link rel="replies" href="https://www.blogger.com/comment.g?blogID=1377183911445147227&amp;postID=2365824007884455574&amp;isPopup=true" title="4 Comments" type="text/html" /><link rel="canonical" href="http://googleappsdeveloper.blogspot.com/2011/06/gmail-and-document-services-now.html" /><content xml:base="http://googleappsdeveloper.blogspot.com/" type="html">If you’ve used &lt;a href="http://code.google.com/googleapps/appsscript/"&gt;Google Apps Script&lt;/a&gt; before, you’ll know that we have deep integration with many Google Apps &amp;amp; APIs. You can access your Calendar and Contacts, create Google Sites, send email, and lots more. But two integrations were noticeably missing: the Google Docs word processor, and Gmail. A few weeks ago, at Google IO, we announced new Apps Script APIs for these two great products. &lt;br&gt;&lt;h2&gt;&lt;code&gt;GmailApp&lt;/code&gt; - read, label and send emails&lt;/h2&gt;&lt;img style="float:right;margin:0 10px 10px 0;width:64px;height:64px;border:0px" src="http://3.bp.blogspot.com/-v4WMKA3sF10/TfkkLnqRWMI/AAAAAAAAALg/2NjDpftwJnA/s400/image01.png" border="0" alt=""&gt;The new &lt;code&gt;&lt;a href="http://code.google.com/googleapps/appsscript/service_gmail.html"&gt;GmailApp&lt;/a&gt;&lt;/code&gt; should be instantly familiar if you’re used to using Gmail. You have access to labels, threads, and messages, and you can do all the things you expect: change labels, add and remove stars, mark things as important or trash or spam. You can also use the &lt;code&gt;&lt;a href="http://code.google.com/googleapps/appsscript/class_gmailapp.html#search"&gt;GmailApp.search()&lt;/a&gt;&lt;/code&gt; method to do any search you can do in Gmail itself. This is the first full fidelity API to Gmail, and we’re excited to see what you all will do with it.&lt;br&gt;&lt;br&gt;To make sure your Gmail account remains private and secure, we are extra cautious about any script that uses &lt;code&gt;GmailApp&lt;/code&gt;. Any time you change the code for a script that accesses Gmail, we will require you to reauthorize the script to run. Keep that in mind when editing a script that runs on a trigger - if you don’t reauthorize it, it will fail the next time the trigger tries to run it.&lt;br&gt;&lt;br&gt;&lt;h2&gt;&lt;code&gt;DocumentApp&lt;/code&gt; - create and edit Docs&lt;/h2&gt;&lt;img style="float:right;margin:0 0 10px 10px;width:54px;height:64px;border:0px" src="http://3.bp.blogspot.com/-5WCXS4CsfIs/Tfkkk9bI9BI/AAAAAAAAALo/Pog_akqFD0A/s400/image00.jpg" border="0" alt=""&gt;The new &lt;code&gt;&lt;a href="http://code.google.com/googleapps/appsscript/service_document.html"&gt;DocumentApp&lt;/a&gt;&lt;/code&gt; lets you create new documents or open existing ones by id. The id of a document is always in the URL you see when visiting it, and document ids are consistent between &lt;code&gt;DocumentApp&lt;/code&gt; and the existing &lt;a href="http://code.google.com/googleapps/appsscript/service_docslist.html"&gt;DocsList&lt;/a&gt; service, so you can use &lt;a href="http://code.google.com/googleapps/appsscript/class_docslist.html#find"&gt;&lt;code&gt;DocsList.find()&lt;/code&gt;&lt;/a&gt; to search for a document, and then get its id from &lt;a href="http://code.google.com/googleapps/appsscript/class_file.html#getId"&gt;&lt;code&gt;File.getId()&lt;/code&gt;&lt;/a&gt;. &lt;br&gt;&lt;br&gt;Once you have a document, you can access all of its individual elements. You can do search and replace (great for mail merge!), change styles or text, add or remove tables and lists, and much more. And when you are done, you can call &lt;a href="http://code.google.com/googleapps/appsscript/class_document.html#saveAndClose"&gt;&lt;code&gt;Document.saveAndClose()&lt;/code&gt;&lt;/a&gt;, which makes sure all of your changes to the document get saved. If you don’t call it, we’ll do it for you at the end of the script, but it can be useful to call it yourself if you’d like to do something with the document after making your edits.&lt;br&gt;&lt;br&gt;&lt;code&gt;&lt;a href="http://code.google.com/googleapps/appsscript/service_gmail.html"&gt;GmailApp&lt;/a&gt;&lt;/code&gt; and &lt;code&gt;&lt;a href="http://code.google.com/googleapps/appsscript/service_document.html"&gt;DocumentApp&lt;/a&gt;&lt;/code&gt; are available to all Apps Script users right now. Now the only question is, what are you going to build with them?&lt;br&gt;&lt;p&gt;&lt;span&gt;Posted by Corey Goldfeder, Google Apps Script Team&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;Want to weigh in on this topic?  &lt;a href="http://buzz.google.com/goog.appsecosystem.buzz"&gt;Discuss on Buzz&lt;/a&gt;&lt;/b&gt;&lt;/p&gt;&lt;div&gt;&lt;img width="1" height="1" src="https://blogger.googleusercontent.com/tracker/1377183911445147227-2365824007884455574?l=googleappsdeveloper.blogspot.com" alt=""&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/GoogleAppsDeveloperBlog/~4/LRUdWhcjw3E" height="1" width="1"&gt;&lt;img src="http://feeds.feedburner.com/~r/tobiasz_cudnik_reader/~4/ur6EV4QZWEc" height="1" width="1"/&gt;</content><author><name>Google Apps Developer Blog Editor</name></author><source gr:stream-id="feed/http://googleappsdeveloper.blogspot.com/atom.xml"><id>tag:google.com,2005:reader/feed/http://googleappsdeveloper.blogspot.com/atom.xml</id><title type="html">Google Apps Developer Blog</title><link rel="alternate" href="http://googleappsdeveloper.blogspot.com/" type="text/html" /></source><feedburner:origLink>http://feedproxy.google.com/~r/GoogleAppsDeveloperBlog/~3/LRUdWhcjw3E/gmail-and-document-services-now.html</feedburner:origLink></entry><entry gr:crawl-timestamp-msec="1308407761387"><id gr:original-id="tag:blogger.com,1999:blog-5274051535398117366.post-1591579411792464471">tag:google.com,2005:reader/item/bb31e0f38e5fa422</id><category term="Performance" scheme="http://www.blogger.com/atom/ns#" /><title type="html">window.nextTick</title><published>2011-06-16T11:59:00Z</published><updated>2011-06-16T12:04:32Z</updated><link rel="alternate" href="http://feedproxy.google.com/~r/tobiasz_cudnik_reader/~3/YKmW-EZhO_8/windownexttick.html" type="text/html" /><link rel="replies" href="http://www.nonblocking.io/feeds/1591579411792464471/comments/default" title="Post Comments" type="application/atom+xml" /><link rel="replies" href="http://www.blogger.com/comment.g?blogID=5274051535398117366&amp;postID=1591579411792464471" title="3 Comments" type="text/html" /><link rel="canonical" href="http://www.nonblocking.io/2011/06/windownexttick.html" /><content xml:base="http://www.nonblocking.io/" type="html">Node.js has a special API called &lt;a href="http://nodejs.org/docs/v0.4.8/api/process.html#process.nextTick"&gt;process.nextTick&lt;/a&gt; which schedules a function to be executed immediately the next time the event loop is idle.&lt;div&gt;Web applications often try achieve a similar result using setTimeout. The problem is that setTimeout with a zero time parameter does not schedule for immediately but rather for &lt;a href="http://jsperf.com/smallest-timeout"&gt;some time a little later&lt;/a&gt;. This *can* lead to real performance problems.&lt;/div&gt;&lt;div&gt;I &lt;a href="http://jsperf.com/postmessage"&gt;benchmarked a couple ways to do postMessage&lt;/a&gt; between workers, iframes and on the current window itself. Turns out doing postMessage on your current window might be a really good alternative to implement process.nextTick in browsers.&lt;/div&gt;&lt;div&gt;Please tell me what I did wrong in my benchmark.&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/joose/~4/Us6GdL5__0A" height="1" width="1"&gt;&lt;img src="http://feeds.feedburner.com/~r/tobiasz_cudnik_reader/~4/YKmW-EZhO_8" height="1" width="1"/&gt;</content><author><name>Malte</name></author><source gr:stream-id="feed/http://feeds.feedburner.com/joose"><id>tag:google.com,2005:reader/feed/http://feeds.feedburner.com/joose</id><title type="html">NonBlocking.io - Malte Ubl&amp;#39;s Asynchronous Identity Disorder</title><link rel="alternate" href="http://www.nonblocking.io/" type="text/html" /></source><feedburner:origLink>http://feedproxy.google.com/~r/joose/~3/Us6GdL5__0A/windownexttick.html</feedburner:origLink></entry><entry gr:crawl-timestamp-msec="1308039001552"><id gr:original-id="http://digg.com/news/technology/why_microsoft_has_made_developers_horrified_about_coding_for_windows_8">tag:google.com,2005:reader/item/5605779c20955855</id><title type="html">Why Microsoft has made developers horrified about coding for Windows 8</title><published>2011-06-13T04:35:39Z</published><updated>2011-06-13T04:35:39Z</updated><link rel="alternate" href="http://feedproxy.google.com/~r/tobiasz_cudnik_reader/~3/E8qRGWISA98/why_microsoft_has_made_developers_horrified_about_coding_for_windows_8" type="text/html" /><link rel="canonical" href="http://digg.com/news/technology/why_microsoft_has_made_developers_horrified_about_coding_for_windows_8" /><summary xml:base="http://digg.com/rss/indexprogramming.xml" type="html">Microsoft's Windows 8 demonstration at the D9 conference looked pretty, but carried a chilling message for developers: if they wanted to write for the new operating system, they'd have to use HTML5 and JavaScript. This might seem a crazy move from a company that prides itself on backwards compatibility, but the warning signs have been there for quite some time now.&lt;img src="http://feeds.feedburner.com/~r/tobiasz_cudnik_reader/~4/E8qRGWISA98" height="1" width="1"/&gt;</summary><author gr:unknown-author="true"><name>(author unknown)</name></author><source gr:stream-id="feed/http://digg.com/rss/indexprogramming.xml"><id>tag:google.com,2005:reader/feed/http://digg.com/rss/indexprogramming.xml</id><title type="html">Top News</title><link rel="alternate" href="http://digg.com/rss/indexprogramming.xml" type="text/html" /></source><feedburner:origLink>http://digg.com/news/technology/why_microsoft_has_made_developers_horrified_about_coding_for_windows_8</feedburner:origLink></entry><entry gr:crawl-timestamp-msec="1305138780141"><id gr:original-id="tag:blogger.com,1999:blog-1377183911445147227.post-8751668753780868757">tag:google.com,2005:reader/item/74b38c3574781483</id><category term="Google Tasks API" scheme="http://www.blogger.com/atom/ns#" /><title type="html">Getting Organized with the Tasks API</title><published>2011-05-11T17:05:00Z</published><updated>2011-05-11T18:55:24Z</updated><link rel="alternate" href="http://feedproxy.google.com/~r/tobiasz_cudnik_reader/~3/rBVjGpFsGgY/getting-organized-with-tasks-api.html" type="text/html" /><link rel="replies" href="http://googleappsdeveloper.blogspot.com/feeds/8751668753780868757/comments/default" title="Post Comments" type="application/atom+xml" /><link rel="replies" href="https://www.blogger.com/comment.g?blogID=1377183911445147227&amp;postID=8751668753780868757&amp;isPopup=true" title="36 Comments" type="text/html" /><link rel="canonical" href="http://googleappsdeveloper.blogspot.com/2011/05/getting-organized-with-tasks-api.html" /><content xml:base="http://googleappsdeveloper.blogspot.com/" type="html">&lt;a href="http://code.google.com/apis/tasks"&gt;&lt;img style="float:right;margin:0 0 10px 10px;width:128px;height:128px;border-style:none" src="http://2.bp.blogspot.com/-H5_faVaNceY/TcrCNynuurI/AAAAAAAAAJc/jYuKPjAO1Ic/s320/tasklogo.png" border="0" alt=""&gt;&lt;/a&gt;&lt;a href="http://mail.google.com/tasks"&gt;Google Tasks&lt;/a&gt; helps many of us to remember all those things that keep us busy. Towards the end of last year we asked our users &lt;a href="http://gmailblog.blogspot.com/2011/01/top-tasks-for-google-tasks.html"&gt;what they wanted to see improved with Google Tasks&lt;/a&gt; and an overwhelming request was for the ability to access tasks from anywhere — be it on the move, on the desktop, or through their favorite Web apps.&lt;br&gt;&lt;br&gt;Today, we’re checking off a big to-do from our list and are inviting you to try out the new Google Tasks API. Using the Google Tasks API, developers can — for the very first time — create rich applications which integrate directly with Google Tasks.&lt;br&gt;&lt;br&gt;The Google Tasks API provides developers with a powerful set of API endpoints for &lt;a href="https://code.google.com/apis/tasks/v1/using.html#retrieving_task_lists"&gt;retrieving&lt;/a&gt; and &lt;a href="https://code.google.com/apis/tasks/v1/using.html#updating_task_list"&gt;modifying&lt;/a&gt; Google Tasks content and metadata. It offers a simple, RESTful interface and supports all basic operations required to query, manage and sync a user’s tasks and task lists. The API uses JSON for data representation and works with multiple authentication mechanisms including OAuth 2.0.&lt;br&gt;&lt;br&gt;&lt;table&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;Plain HTTP using JSON&lt;/b&gt;&lt;/td&gt;&lt;td&gt;&lt;b&gt;Using &lt;a href="http://code.google.com/p/google-api-java-client/"&gt;Google API Client Library for Java&lt;/a&gt;&lt;/b&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr valign="top"&gt;&lt;td&gt;&lt;pre&gt;POST /tasks/v1/lists/&amp;lt;list-ID&amp;gt;/tasks&lt;br&gt;Content-Type: application/json&lt;br&gt;...&lt;br&gt;{ title: "Publish blog post" }&lt;/pre&gt;&lt;/td&gt;&lt;td&gt;&lt;pre&gt;Task task = new Task();&lt;br&gt;task.setTitle(&lt;br&gt;    "Publish blog post");&lt;br&gt;client.tasks.insert(&lt;br&gt;    "list-ID", &lt;br&gt;    task).execute();&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;a href="https://code.google.com/apis/tasks/libraries.html"&gt;Client libraries&lt;/a&gt; are provided for several major programming environments and should help you get up and running quickly.&lt;br&gt;&lt;br&gt;The API is available in Labs and can be activated for your project through the &lt;a href="http://code.google.com/apis/console"&gt;API Console&lt;/a&gt;. Get started today by trying the Tasks API yourself using the &lt;a href="http://code.google.com/apis/explorer"&gt;API Explorer&lt;/a&gt; and taking a look at the &lt;a href="http://code.google.com/apis/tasks"&gt;documentation&lt;/a&gt;.&lt;br&gt;&lt;br&gt;&lt;a href="http://code.google.com/p/google-tasks-chrome-extension/"&gt;&lt;img style="display:block;margin:0px auto 10px;text-align:center;width:500px;height:73px;border-style:none" src="http://3.bp.blogspot.com/-mIVR8deW2w0/TcrFDgRM20I/AAAAAAAAAJk/tKP0Ca7Jam4/s600/chromeExtensionTask.png" border="0" alt=""&gt;&lt;/a&gt;&lt;br&gt;If you want to see the API in action check out the Google Tasks Chrome Extension. If you are at Google I/O we invite you to come along and hear the Google Tasks team talk about the new API today.&lt;br&gt;&lt;br&gt;We thank the early adopters that have worked with us and built their own Google Tasks integrations over the last weeks. We’d like to highlight a few of them:&lt;ul&gt;&lt;li&gt;&lt;a href="https://www.google.com/enterprise/marketplace/viewListing?productListingId=5887+4708068531850389144&amp;amp;utm_source=google&amp;amp;utm_medium=blog&amp;amp;utm_campaign=tasks"&gt;Producteev&lt;/a&gt; is a task management platform that lets teams and individuals access their to-dos from a lot of different locations (web, mobile, email, calendars...). You will now have all your Producteev's tasks available in Google Tasks and vice versa!&lt;/li&gt;&lt;li&gt;&lt;a href="https://www.google.com/enterprise/marketplace/viewListing?productListingId=4970+4188150475217982560&amp;amp;utm_source=google&amp;amp;utm_medium=blog&amp;amp;utm_campaign=tasks&amp;amp;pli=1"&gt;Mavenlink&lt;/a&gt;&amp;#39;s project collaboration suite allows you to communicate, share files, track time, invoice, and make or receive payments in one place. With its Google Tasks integration, your Mavenlink project tasks &amp;amp; Google Tasks always stay in sync.&lt;/li&gt;&lt;li&gt;&lt;a href="https://www.google.com/enterprise/marketplace/viewListing?productListingId=3539+9922984539899306906&amp;amp;utm_source=google&amp;amp;utm_medium=blog&amp;amp;utm_campaign=tasks&amp;amp;pli=1"&gt;Manymoon&lt;/a&gt; is the top installed social task and project management app in the Google Apps Marketplace and makes it simple to get work done online with co-workers, partners, and customers. Manymoon's users can now create and view tasks with Gmail and Google Calendar through Google Tasks.&lt;/li&gt;&lt;li&gt;&lt;a href="https://www.google.com/enterprise/marketplace/viewVendorListings?vendorId=2533&amp;amp;utm_source=google&amp;amp;utm_medium=blog&amp;amp;utm_campaign=tasks"&gt;Zoho&lt;/a&gt; offers a suite of online business, collaboration and productivity applications for small businesses. So far they have integrated Zoho CRM &amp;amp; Zoho Projects with the Tasks API.&lt;/li&gt;&lt;/ul&gt;&lt;br&gt;&lt;center&gt;&lt;iframe src="https://docs.google.com/present/embed?id=dfmn3nzp_148gcpmdvgr&amp;amp;autoStart=true&amp;amp;loop=true" frameborder="0" width="410" height="342"&gt;&lt;/iframe&gt;&lt;/center&gt;&lt;br&gt;&lt;b&gt;&lt;a href="http://code.google.com/apis/tasks"&gt;Get Started&lt;/a&gt;&lt;/b&gt; with the Google Tasks API today!&lt;br&gt;&lt;br&gt;&lt;p&gt;&lt;b&gt;Want to weigh in on this topic?  &lt;a href="http://buzz.google.com/goog.appsecosystem.buzz"&gt;Discuss on Buzz&lt;/a&gt;&lt;/b&gt;&lt;/p&gt;&lt;br&gt;&lt;br&gt;&lt;table cellpadding="5" cellspacing="0"&gt;&lt;tbody&gt;&lt;tr style="background-color:#f8f8f8"&gt;&lt;td&gt;&lt;a href="http://1.bp.blogspot.com/-PiZsMQq1KzA/TcrKjYYntbI/AAAAAAAAAJs/olsYRkjwkd0/s1600/fabian.png"&gt;&lt;img style="width:80px;height:80px" src="http://1.bp.blogspot.com/-PiZsMQq1KzA/TcrKjYYntbI/AAAAAAAAAJs/olsYRkjwkd0/s320/fabian.png" border="0" alt=""&gt;&lt;/a&gt;&lt;a href="http://2.bp.blogspot.com/-2MtwBU6Q114/TcrKvwGejYI/AAAAAAAAAJ0/2Rut8bJZe8o/s1600/nicolas.png"&gt;&lt;img style="width:80px;height:80px" src="http://2.bp.blogspot.com/-2MtwBU6Q114/TcrKvwGejYI/AAAAAAAAAJ0/2Rut8bJZe8o/s320/nicolas.png" border="0" alt=""&gt;&lt;/a&gt;&lt;/td&gt;&lt;td valign="top"&gt;&lt;div&gt;Posted by Fabian Schlup &amp;amp; Nicolas Garnier&lt;br&gt;Google Tasks API Team&lt;/div&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;&lt;td&gt;&lt;br&gt;&lt;/td&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div&gt;&lt;img width="1" height="1" src="https://blogger.googleusercontent.com/tracker/1377183911445147227-8751668753780868757?l=googleappsdeveloper.blogspot.com" alt=""&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/GoogleAppsDeveloperBlog/~4/XTYhyZpx60Q" height="1" width="1"&gt;&lt;img src="http://feeds.feedburner.com/~r/tobiasz_cudnik_reader/~4/rBVjGpFsGgY" height="1" width="1"/&gt;</content><author><name>Developer Blog</name></author><source gr:stream-id="feed/http://googleappsdeveloper.blogspot.com/atom.xml"><id>tag:google.com,2005:reader/feed/http://googleappsdeveloper.blogspot.com/atom.xml</id><title type="html">Google Apps Developer Blog</title><link rel="alternate" href="http://googleappsdeveloper.blogspot.com/" type="text/html" /></source><feedburner:origLink>http://feedproxy.google.com/~r/GoogleAppsDeveloperBlog/~3/XTYhyZpx60Q/getting-organized-with-tasks-api.html</feedburner:origLink></entry><entry gr:crawl-timestamp-msec="1305046956375"><id gr:original-id="http://www.engadget.com/2011/05/10/samsung-galaxy-tab-10-1-launching-in-about-a-month-google-giv/">tag:google.com,2005:reader/item/c30789f924b5c322</id><category term="2011" /><category term="android" /><category term="breaking news" /><category term="galaxy tab" /><category term="galaxy tab 10.1" /><category term="GalaxyTab" /><category term="GalaxyTab10.1" /><category term="giveaways" /><category term="google" /><category term="google io" /><category term="google io 2011" /><category term="GoogleIo" /><category term="GoogleIo2011" /><category term="GT-P7510" /><category term="honeycomb" /><category term="honeycomb 3.0" /><category term="Honeycomb3.0" /><category term="io 2011" /><category term="Io2011" /><category term="launch" /><category term="release" /><category term="samsung" /><category term="slate" /><category term="tablet" /><category term="white" /><title type="html">Google gives away 5,000 Samsung Galaxy Tab 10.1 tablets to devs at I/O</title><published>2011-05-10T16:53:00Z</published><updated>2011-05-10T16:53:00Z</updated><link rel="alternate" href="http://feedproxy.google.com/~r/tobiasz_cudnik_reader/~3/0VXgGYu1i9w/" type="text/html" /><summary xml:base="http://www.engadget.com/" type="html">&lt;div style="text-align:center"&gt;
	&lt;a href="http://www.engadget.com/2011/05/10/samsung-galaxy-tab-10-1-launching-in-about-a-month-google-giv/"&gt;&lt;img border="1" hspace="4" src="http://www.blogcdn.com/www.engadget.com/media/2011/05/google-io-2011-day-10273-1305046460.jpg" vspace="4"&gt;&lt;/a&gt;&lt;/div&gt;
Hey, who said we'd only get software news at &lt;a href="http://www.engadget.com/2011/05/10/live-from-google-i-o-2011s-opening-keynote/"&gt;Google I/O&lt;/a&gt;? The Android maker just reminded us that Samsung's &lt;a href="http://www.engadget.com/2011/04/17/samsungs-super-slender-galaxy-tab-10-1-snacks-on-some-honeycomb/"&gt;Galaxy Tab 10.1&lt;/a&gt; tablet (the thin version) will be launching &lt;a href="http://www.engadget.com/2011/03/22/samsung-galaxy-tab-8-9-and-10-1-get-some-competitive-price-tags/"&gt;in a month's time&lt;/a&gt;, and to whet appetites, a white-backed version of the device was shown off on stage. It's described as a limited edition, potentially because it looks to be running stock Android without the TouchWiz UI layer on top, and will be given away to the gathered crowd of 5,000 conference attendees. They'll get it with Honeycomb 3.0 on board, but an update to &lt;a href="http://www.engadget.com/2011/05/10/google-announces-android-3-1/"&gt;3.1&lt;/a&gt; will be forthcoming over the next couple of weeks as well.&lt;br&gt;
&lt;div&gt;&lt;p&gt;&lt;strong&gt;Gallery: &lt;a href="http://www.engadget.com/photos/samsung-galaxy-tab-10-1-limited-edition/"&gt;Samsung Galaxy Tab 10.1 Limited Edition&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;&lt;a href="http://www.engadget.com/photos/samsung-galaxy-tab-10-1-limited-edition/#4122167"&gt;&lt;img src="http://www.blogcdn.com/www.engadget.com/media/2011/05/google-io-2011-day-10273-1305046473_thumbnail.jpg" alt="" title=""&gt;&lt;/a&gt;&lt;a href="http://www.engadget.com/photos/samsung-galaxy-tab-10-1-limited-edition/#4122168"&gt;&lt;img src="http://www.blogcdn.com/www.engadget.com/media/2011/05/google-io-2011-day-10275-1305046473_thumbnail.jpg" alt="" title=""&gt;&lt;/a&gt;&lt;/div&gt;&lt;p style="padding:5px;background:#ddd;border:1px solid #ccc;clear:both"&gt;&lt;a href="http://www.engadget.com/2011/05/10/samsung-galaxy-tab-10-1-launching-in-about-a-month-google-giv/"&gt;Google gives away 5,000 Samsung Galaxy Tab 10.1 tablets to devs at I/O&lt;/a&gt; originally appeared on &lt;a href="http://www.engadget.com"&gt;Engadget&lt;/a&gt; on Tue, 10 May 2011 12:53:00 EDT.  Please see our &lt;a href="http://www.weblogsinc.com/feed-terms/"&gt;terms for use of feeds&lt;/a&gt;.&lt;/p&gt;&lt;h6 style="clear:both;padding:8px 0 0 0;height:2px;font-size:1px;border:0;margin:0;padding:0"&gt;&lt;/h6&gt;&lt;a href="http://www.engadget.com/2011/05/10/samsung-galaxy-tab-10-1-launching-in-about-a-month-google-giv/" rel="bookmark" title="Permanent link to this entry"&gt;Permalink&lt;/a&gt;   |    | &lt;a href="http://www.engadget.com/forward/19936662/" title="Send this entry to a friend via email"&gt;Email this&lt;/a&gt; | &lt;a href="http://www.engadget.com/2011/05/10/samsung-galaxy-tab-10-1-launching-in-about-a-month-google-giv/#comments" title="View reader comments on this entry"&gt;Comments&lt;/a&gt;&lt;img src="http://feeds.feedburner.com/~r/tobiasz_cudnik_reader/~4/0VXgGYu1i9w" height="1" width="1"/&gt;</summary><author><name>Vlad Savov</name></author><source gr:stream-id="feed/http://www.engadget.com/rss.xml"><id>tag:google.com,2005:reader/feed/http://www.engadget.com/rss.xml</id><title type="html">Engadget RSS Feed</title><link rel="alternate" href="http://www.engadget.com" type="text/html" /></source><feedburner:origLink>http://www.engadget.com/2011/05/10/samsung-galaxy-tab-10-1-launching-in-about-a-month-google-giv/</feedburner:origLink></entry><entry gr:crawl-timestamp-msec="1302648269899"><id gr:original-id="http://blogs.jetbrains.com/webide/?p=1903">tag:google.com,2005:reader/item/71e3fe7eb014f734</id><category term="Announcement" /><category term="EAP" /><category term="PhpStorm" /><category term="WebStorm" /><title type="html">PhpStorm &amp;amp; WebStorm 2.1 EAP build 106.444</title><published>2011-04-11T13:24:05Z</published><updated>2011-04-11T13:24:05Z</updated><link rel="alternate" href="http://feedproxy.google.com/~r/tobiasz_cudnik_reader/~3/fnK82VYSwVQ/" type="text/html" /><link rel="canonical" href="http://blogs.jetbrains.com/webide/2011/04/phpstorm-webstorm-2-1-eap-build-106-444/" /><content xml:base="http://blog.jetbrains.com/webide" type="html">&lt;p&gt;PhpStorm &amp;amp; WebStorm 2.1 EAP is started. Build 106.444 is available immediately with pack of new features, important bugfixes, performance and usability improvements. Most notable:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Memory usage&lt;/strong&gt; was improved leading to overall performance improvement, especially for batch code inspection&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Tons of fixes and &lt;/strong&gt;&lt;strong&gt;improvements&lt;/strong&gt; from IntelliJ IDEA platform 10.5 (branch 106) are included starting from this build, including:
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://blogs.jetbrains.com/idea/2011/03/intellij-idea-debugging-javascript-in-google-chrome"&gt;Chrome JavaScript debugging support&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://blogs.jetbrains.com/idea/2011/04/new-in-105-check-todo-patch-into-shelf-gnome-keyring"&gt;Check TODO on commit, patch into Shelf &amp;amp; GNOME Keyring support&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Full details on platform changes in changelogs for builds &lt;a href="http://confluence.jetbrains.net/display/IDEADEV/IDEA+10.5+build+106.330+Release+Notes"&gt;106.330&lt;/a&gt; &amp;amp; &lt;a href="http://confluence.jetbrains.net/display/IDEADEV/IDEA+10.5+build+106.396+Release+Notes"&gt;106.396&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;PHP support enhancements&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Extract function/method&lt;/strong&gt; refactoring implemented for PHP&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Create parameter&lt;/strong&gt; quick fix for PHP “Undefined local variable” inspection&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Code inspections &lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;Detect self assignments&lt;/li&gt;
&lt;li&gt;Illegal type of array key&lt;/li&gt;
&lt;li&gt;Return type inconsistency inspection for mixed “void” &amp;amp; “value” return statements&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;PHP Doc inspections&lt;/strong&gt; for missing and mismatched doc comments with generate or update doc quick fixes, accessible from batch inspection results&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Type inference&lt;/strong&gt; engine and library subs improved&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;JavaScript&lt;/strong&gt; debugger break on exception&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;CSS&lt;/strong&gt; completion for previously used colors&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Exclude single file&lt;/strong&gt; from project by mapping it to plain text. &lt;a href="http://blogs.jetbrains.com/webide/2011/04/exclude-single-file/"&gt;More details in dedicated post&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;HAML&lt;/strong&gt; support bundled&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;.htaccess&lt;/strong&gt; support added, including completion, quick doc, regex fragments and path mapping support. More details to follow in dedicated post&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;HTML&lt;/strong&gt; tag tree highlighting added&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;More details available on build &lt;a href="http://youtrack.jetbrains.net/releaseNotes/WI?q=fix+for:+%7BEAP+106.444%7D"&gt;changelog&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Stay tuned for more info on new features and do not hesitate with your feedback – the 2.1 schedule is pretty tight!&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.jetbrains.net/confluence/display/WI/Web+IDE+EAP"&gt;Download PhpStorm &amp;amp; WebStorm 2.1 EAP build 106.444&lt;/a&gt; for your platform from project EAP page.&lt;br&gt;
Note that release builds will NOT prompt for update and patch is not available for this build.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Develop with pleasure!&lt;/em&gt;&lt;em&gt; &lt;/em&gt;&lt;em&gt; &lt;/em&gt;&lt;em&gt;&lt;/em&gt;&lt;br&gt;
&lt;em&gt;-JetBrains Web IDE Team&lt;/em&gt;&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/jetbrains_webIde/~4/OnoaN42TFwg" height="1" width="1"&gt;&lt;img src="http://feeds.feedburner.com/~r/tobiasz_cudnik_reader/~4/fnK82VYSwVQ" height="1" width="1"/&gt;</content><author><name>Alexey Gopachenko</name></author><source gr:stream-id="feed/http://blogs.jetbrains.com/webide/feed/"><id>tag:google.com,2005:reader/feed/http://blogs.jetbrains.com/webide/feed/</id><title type="html">WebStorm &amp;amp; PhpStorm Blog</title><link rel="alternate" href="http://blog.jetbrains.com/webide" type="text/html" /></source><feedburner:origLink>http://feedproxy.google.com/~r/jetbrains_webIde/~3/OnoaN42TFwg/</feedburner:origLink></entry><entry gr:crawl-timestamp-msec="1298329227367"><id gr:original-id="tag:blogger.com,1999:blog-2250394496987063687.post-7215081220536770865">tag:google.com,2005:reader/item/8cb4e16a09d435e7</id><title type="html">Faster than a speeding rabbit: speed, sync, and settings</title><published>2011-02-17T23:00:00Z</published><updated>2011-02-17T23:17:04Z</updated><link rel="alternate" href="http://feedproxy.google.com/~r/tobiasz_cudnik_reader/~3/wOWi_SmErnY/faster-than-speeding-rabbit-speed-sync.html" type="text/html" /><link rel="replies" href="http://chrome.blogspot.com/feeds/7215081220536770865/comments/default" title="Post Comments" type="application/atom+xml" /><link rel="replies" href="http://chrome.blogspot.com/2011/02/faster-than-speeding-rabbit-speed-sync.html#comment-form" title="0 Comments" type="text/html" /><link rel="canonical" href="http://chrome.blogspot.com/2011/02/faster-than-speeding-rabbit-speed-sync.html" /><content xml:base="http://chrome.blogspot.com/" type="html">&lt;div style="background-color:transparent;margin-bottom:0px;margin-left:0px;margin-right:0px;margin-top:0px"&gt;&lt;span style="background-color:transparent;color:black;font-family:Arial;font-size:10pt;font-style:normal;font-weight:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap"&gt;In the spirit of the lunar new year, we’re excited to kick off the &lt;/span&gt;&lt;a href="http://www.google.com/images?q=lunar+new+year+year+of+the+rabbit&amp;amp;um=1&amp;amp;hl=en&amp;amp;biw=1440&amp;amp;bih=775&amp;amp;tbs=isch:1&amp;amp;tbas=0&amp;amp;source=lnt&amp;amp;sa=X&amp;amp;ei=hs9QTczcAZSosQOm5K3DBg&amp;amp;ved=0CA0QpwUoAA"&gt;&lt;span style="background-color:transparent;color:#000099;font-family:Arial;font-size:10pt;font-style:normal;font-weight:normal;text-decoration:underline;vertical-align:baseline;white-space:pre-wrap"&gt;Year of the Rabbit&lt;/span&gt;&lt;/a&gt;&lt;span style="background-color:transparent;color:black;font-family:Arial;font-size:10pt;font-style:normal;font-weight:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap"&gt; with a slew of enhancements in the Chrome beta channel. Today’s &lt;/span&gt;&lt;a href="http://www.google.com/intl/en/landing/chrome/beta/"&gt;&lt;span style="background-color:transparent;color:#000099;font-family:Arial;font-size:10pt;font-style:normal;font-weight:normal;text-decoration:underline;vertical-align:baseline;white-space:pre-wrap"&gt;new beta&lt;/span&gt;&lt;/a&gt;&lt;span style="background-color:transparent;color:black;font-family:Arial;font-size:10pt;font-style:normal;font-weight:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap"&gt; includes a dramatic improvement in JavaScript speed, new password sync features, and entirely revamped browser settings.&lt;/span&gt;&lt;br&gt;
&lt;span style="background-color:transparent;color:black;font-family:Arial;font-size:10pt;font-style:normal;font-weight:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap"&gt;&lt;/span&gt;&lt;br&gt;
&lt;span style="background-color:transparent;color:black;font-family:Arial;font-size:10pt;font-style:normal;font-weight:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap"&gt;In our new beta release, JavaScript is as quick as a bunny. With a new &lt;/span&gt;&lt;a href="http://blog.chromium.org/2010/12/new-crankshaft-for-v8.html"&gt;&lt;span style="background-color:transparent;color:#000099;font-family:Arial;font-size:10pt;font-style:normal;font-weight:normal;text-decoration:underline;vertical-align:baseline;white-space:pre-wrap"&gt;speed boost&lt;/span&gt;&lt;/a&gt;&lt;span style="background-color:transparent;color:black;font-family:Arial;font-size:10pt;font-style:normal;font-weight:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap"&gt; that we &lt;/span&gt;&lt;a href="http://www.youtube.com/watch?v=uQzAUaZ26co#t=15m18s"&gt;&lt;span style="background-color:transparent;color:#000099;font-family:Arial;font-size:10pt;font-style:normal;font-weight:normal;text-decoration:underline;vertical-align:baseline;white-space:pre-wrap"&gt;previewed in December&lt;/span&gt;&lt;/a&gt;&lt;span style="background-color:transparent;color:black;font-family:Arial;font-size:10pt;font-style:normal;font-weight:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap"&gt;, Chrome’s JavaScript engine V8 runs compute-intensive JavaScript applications even more quickly than before. In fact, this beta release sports a whopping 66% improvement on the &lt;/span&gt;&lt;a href="http://v8.googlecode.com/svn/data/benchmarks/current/run.html"&gt;&lt;span style="background-color:transparent;color:#000099;font-family:Arial;font-size:10pt;font-style:normal;font-weight:normal;text-decoration:underline;vertical-align:baseline;white-space:pre-wrap"&gt;V8 benchmark suite&lt;/span&gt;&lt;/a&gt;&lt;span style="background-color:transparent;color:black;font-family:Arial;font-size:10pt;font-style:normal;font-weight:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap"&gt; over our current stable release.&lt;/span&gt;&lt;br&gt;
&lt;span style="background-color:transparent;color:black;font-family:Arial;font-size:10pt;font-style:normal;font-weight:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap"&gt;&lt;/span&gt;&lt;br&gt;
&lt;img height="268" src="https://lh4.googleusercontent.com/PAxHeU25m_QWU83fp_RAPnrtAaWN_m8XOplzXtMZQW7g5wwGEetXbSmje_y2uZBhZjuaNvJCf6kGPHPSehn0z80mi5h1srPdtpJxpP4wfkqr4uoHTnRoEx2EyPOsx4nw" width="500"&gt;&lt;br&gt;
&lt;br&gt;
&lt;span style="background-color:transparent;color:black;font-family:Arial;font-size:10pt;font-style:normal;font-weight:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap"&gt;This release also includes a preliminary implementation of GPU-accelerated video. Users with capable graphics hardware should see a significant decrease in CPU usage. In full screen mode, CPU usage may decrease by as much as 80%! This means better battery life so you can keep going and going like that &lt;/span&gt;&lt;a href="http://en.wikipedia.org/wiki/Energizer_Bunny"&gt;&lt;span style="background-color:transparent;color:#000099;font-family:Arial;font-size:10pt;font-style:normal;font-weight:normal;text-decoration:underline;vertical-align:baseline;white-space:pre-wrap"&gt;pink bunny in the commercials&lt;/span&gt;&lt;/a&gt;&lt;span style="background-color:transparent;color:black;font-family:Arial;font-size:10pt;font-style:normal;font-weight:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap"&gt;.&lt;/span&gt;&lt;br&gt;
&lt;span style="background-color:transparent;color:black;font-family:Arial;font-size:10pt;font-style:normal;font-weight:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap"&gt;&lt;/span&gt;&lt;br&gt;
&lt;span style="background-color:transparent;color:black;font-family:Arial;font-size:10pt;font-style:normal;font-weight:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap"&gt;For those of you who enjoy the convenience of saving passwords in Chrome, you can &lt;/span&gt;&lt;a href="http://www.google.com/support/chrome/bin/answer.py?hl=en&amp;amp;answer=165139"&gt;&lt;span style="background-color:transparent;color:#000099;font-family:Arial;font-size:10pt;font-style:normal;font-weight:normal;text-decoration:underline;vertical-align:baseline;white-space:pre-wrap"&gt;synchronize your saved passwords&lt;/span&gt;&lt;/a&gt;&lt;span style="background-color:transparent;color:black;font-family:Arial;font-size:10pt;font-style:normal;font-weight:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap"&gt; across multiple computers, along with your bookmarks, preferences, themes, and extensions. For added security, you can choose to encrypt your synced passwords with your own secret sync passphrase. To &lt;/span&gt;&lt;a href="http://www.google.com/support/chrome/bin/answer.py?hl=en&amp;amp;answer=165139"&gt;&lt;span style="background-color:transparent;color:#000099;font-family:Arial;font-size:10pt;font-style:normal;font-weight:normal;text-decoration:underline;vertical-align:baseline;white-space:pre-wrap"&gt;enable sync&lt;/span&gt;&lt;/a&gt;&lt;span style="background-color:transparent;color:black;font-family:Arial;font-size:10pt;font-style:normal;font-weight:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap"&gt;, visit the “Personal Stuff” section of Chrome’s settings dialog.&lt;/span&gt;&lt;br&gt;
&lt;span style="background-color:transparent;color:black;font-family:Arial;font-size:10pt;font-style:normal;font-weight:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap"&gt;&lt;/span&gt;&lt;br&gt;
&lt;span style="background-color:transparent;color:black;font-family:Arial;font-size:10pt;font-style:normal;font-weight:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap"&gt;Speaking of settings, you’ll notice we have reworked the look and feel of the settings dialogs. Instead of opening in a separate window, they now open in a tab. More importantly, we’ve added two new settings features that make it easy to customize Chrome to your liking. Firstly, if you can’t remember where a particular pesky configuration setting is, simply type its name into the search box to see the settings that match as you type. Secondly, you can also now jump directly to most settings pages using their own dedicated URLs, without needing to navigate through a sequence of windows. Here’s a short video of the new settings interface in action:&lt;/span&gt;&lt;br&gt;
&lt;br&gt;
&lt;iframe frameborder="0" height="314" src="http://www.youtube.com/embed/jOxGL29-t_4?rel=0" title="YouTube video player" width="504"&gt;&lt;/iframe&gt;&lt;br&gt;
&lt;br&gt;
&lt;span style="background-color:transparent;color:black;font-family:Arial;font-size:10pt;font-style:normal;font-weight:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap"&gt;As always, we’re eager to get your feedback, and look forward to bringing this basket of beta-fortified carrots to the stable channel over the coming weeks! (For those of you keen for some fun and games in this Year of the Rabbit, we’ll leave you with the mind-bending &lt;/span&gt;&lt;a href="http://www.youtube.com/chromefast"&gt;&lt;span style="background-color:transparent;color:#000099;font-family:Arial;font-size:10pt;font-style:normal;font-weight:normal;text-decoration:underline;vertical-align:baseline;white-space:pre-wrap"&gt;#ThinkFastGame speed challenge&lt;/span&gt;&lt;/a&gt;&lt;span style="background-color:transparent;color:black;font-family:Arial;font-size:10pt;font-style:normal;font-weight:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap"&gt; to try out alongside our new &lt;/span&gt;&lt;a href="http://www.google.com/intl/en/landing/chrome/beta/"&gt;&lt;span style="background-color:transparent;color:#000099;font-family:Arial;font-size:10pt;font-style:normal;font-weight:normal;text-decoration:underline;vertical-align:baseline;white-space:pre-wrap"&gt;beta&lt;/span&gt;&lt;/a&gt;&lt;span style="background-color:transparent;color:black;font-family:Arial;font-size:10pt;font-style:normal;font-weight:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap"&gt;.)&lt;/span&gt;&lt;br&gt;
&lt;span style="background-color:transparent;color:black;font-family:Arial;font-size:10pt;font-style:normal;font-weight:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap"&gt;&lt;/span&gt;&lt;span style="background-color:transparent;color:black;font-family:Arial;font-size:10pt;font-style:normal;font-weight:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap"&gt;&lt;/span&gt;&lt;br&gt;
&lt;span style="background-color:transparent;font-family:Arial;font-size:10pt;font-style:normal;font-weight:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap"&gt;&lt;span style="color:#666666"&gt;Posted by Jeff Chang, Product Manager and Min Li Chan, Product Marketing Manager&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;img width="1" height="1" src="https://blogger.googleusercontent.com/tracker/2250394496987063687-7215081220536770865?l=chrome.blogspot.com" alt=""&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/blogspot/Egta/~4/EUCZ7-_T7RU" height="1" width="1"&gt;&lt;img src="http://feeds.feedburner.com/~r/tobiasz_cudnik_reader/~4/wOWi_SmErnY" height="1" width="1"/&gt;</content><author><name>Google Chrome Blog</name></author><source gr:stream-id="feed/http://chrome.blogspot.com/atom.xml"><id>tag:google.com,2005:reader/feed/http://chrome.blogspot.com/atom.xml</id><title type="html">Google Chrome Blog</title><link rel="alternate" href="http://chrome.blogspot.com/" type="text/html" /></source><feedburner:origLink>http://feedproxy.google.com/~r/blogspot/Egta/~3/EUCZ7-_T7RU/faster-than-speeding-rabbit-speed-sync.html</feedburner:origLink></entry><entry gr:crawl-timestamp-msec="1297726942868"><id gr:original-id="http://www.infoq.com/news/2011/02/IcedRobot">tag:google.com,2005:reader/item/50b63a4ec2104cce</id><title type="html">IcedRobot – An OpenJDK-based Fork of Android</title><published>2011-02-14T10:39:00Z</published><updated>2011-02-14T10:39:00Z</updated><link rel="alternate" href="http://feedproxy.google.com/~r/tobiasz_cudnik_reader/~3/g83itRQH1sc/IcedRobot" type="text/html" /><summary xml:base="http://www.infoq.com/" type="html">A team of developers has announced the intent to fork Android in order to create a new OS based on OpenJDK, escaping Oracle’s patent lawsuits, to make it run on other platforms and operating systems, and to bring it to the desktop. &lt;i&gt;By Abel Avram&lt;/i&gt;&lt;img src="http://feeds.feedburner.com/~r/tobiasz_cudnik_reader/~4/g83itRQH1sc" height="1" width="1"/&gt;</summary><author><name>Abel Avram</name></author><source gr:stream-id="feed/http://www.infoq.com/rss/rss.action?token=JDbLLy8G4YHq6aX9ZVZlUpw3aQtoLBaQ"><id>tag:google.com,2005:reader/feed/http://www.infoq.com/rss/rss.action?token=JDbLLy8G4YHq6aX9ZVZlUpw3aQtoLBaQ</id><title type="html">InfoQ Personalized Feed for Unregistered User - Register to upgrade!</title><link rel="alternate" href="http://www.infoq.com" type="text/html" /></source><feedburner:origLink>http://www.infoq.com/news/2011/02/IcedRobot</feedburner:origLink></entry><entry gr:crawl-timestamp-msec="1297726423360"><id gr:original-id="http://www.engadget.com/2011/02/14/clamcase-ipad-keyboard-case-review/">tag:google.com,2005:reader/item/f099e1db9d4124b6</id><category term="apple" /><category term="bluetooth" /><category term="bluetooth keyboard" /><category term="BluetoothKeyboard" /><category term="clam case" /><category term="clamcase" /><category term="ipad" /><category term="ipad keyboard" /><category term="ipad keyboard case" /><category term="IpadKeyboard" /><category term="IpadKeyboardCase" /><category term="review" /><title type="html">Clamcase iPad keyboard case review</title><published>2011-02-14T18:25:00Z</published><updated>2011-02-14T18:25:00Z</updated><link rel="alternate" href="http://feedproxy.google.com/~r/tobiasz_cudnik_reader/~3/imyJ6xQhaMQ/" type="text/html" /><summary xml:base="http://www.engadget.com/" type="html">&lt;div style="text-align:center"&gt;&lt;a href="http://www.engadget.com/2011/02/14/clamcase-ipad-keyboard-case-review/"&gt;&lt;img vspace="4" hspace="4" border="1" src="http://www.blogcdn.com/www.engadget.com/media/2011/02/clamcase-toppic.jpg" alt=""&gt;&lt;/a&gt;&lt;/div&gt;
We know you've been on pins and needles since we &lt;a href="http://www.engadget.com/2011/02/11/debunk-clamcase-now-shipping-manufacturing-problems-remedied/"&gt;cleared up some of the confusion&lt;/a&gt; regarding the Clamcase, but a review unit finally landed on our doorstep to put through the paces. If you need a refresher, this was one of the earliest iPad keyboard cases to be introduced, but has only started shipping recently after some manufacturing woes. We've had sometime to put this baby through the paces so read past the break for the lowdown.&lt;br&gt;
&lt;div&gt;&lt;p&gt;&lt;strong&gt;Gallery: &lt;a href="http://www.engadget.com/photos/clamcase-ipad-keyboard-case-review/"&gt;Clamcase iPad keyboard case review&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;&lt;a href="http://www.engadget.com/photos/clamcase-ipad-keyboard-case-review/#3877259"&gt;&lt;img src="http://www.blogcdn.com/www.engadget.com/media/2011/02/2011-02-14-clamcase-review-1_thumbnail.jpg" alt="" title=""&gt;&lt;/a&gt;&lt;a href="http://www.engadget.com/photos/clamcase-ipad-keyboard-case-review/#3877260"&gt;&lt;img src="http://www.blogcdn.com/www.engadget.com/media/2011/02/2011-02-14-clamcase-review-2_thumbnail.jpg" alt="" title=""&gt;&lt;/a&gt;&lt;a href="http://www.engadget.com/photos/clamcase-ipad-keyboard-case-review/#3877261"&gt;&lt;img src="http://www.blogcdn.com/www.engadget.com/media/2011/02/2011-02-14-clamcase-review-3_thumbnail.jpg" alt="" title=""&gt;&lt;/a&gt;&lt;a href="http://www.engadget.com/photos/clamcase-ipad-keyboard-case-review/#3877262"&gt;&lt;img src="http://www.blogcdn.com/www.engadget.com/media/2011/02/2011-02-14-clamcase-review-4_thumbnail.jpg" alt="" title=""&gt;&lt;/a&gt;&lt;a href="http://www.engadget.com/photos/clamcase-ipad-keyboard-case-review/#3877263"&gt;&lt;img src="http://www.blogcdn.com/www.engadget.com/media/2011/02/2011-02-14-clamcase-review-5_thumbnail.jpg" alt="" title=""&gt;&lt;/a&gt;&lt;/div&gt;&lt;p&gt;&lt;a href="http://www.engadget.com/2011/02/14/clamcase-ipad-keyboard-case-review/" rel="bookmark"&gt;Continue reading &lt;em&gt;Clamcase iPad keyboard case review&lt;/em&gt;&lt;/a&gt;&lt;/p&gt;&lt;p style="padding:5px;background:#ddd;border:1px solid #ccc;clear:both"&gt;&lt;a href="http://www.engadget.com/2011/02/14/clamcase-ipad-keyboard-case-review/"&gt;Clamcase iPad keyboard case review&lt;/a&gt; originally appeared on &lt;a href="http://www.engadget.com"&gt;Engadget&lt;/a&gt; on Mon, 14 Feb 2011 14:25:00 EDT.  Please see our &lt;a href="http://www.weblogsinc.com/feed-terms/"&gt;terms for use of feeds&lt;/a&gt;.&lt;/p&gt;&lt;h6 style="clear:both;padding:8px 0 0 0;height:2px;font-size:1px;border:0;margin:0;padding:0"&gt;&lt;/h6&gt;&lt;a href="http://www.engadget.com/2011/02/14/clamcase-ipad-keyboard-case-review/" rel="bookmark" title="Permanent link to this entry"&gt;Permalink&lt;/a&gt;   |    | &lt;a href="http://www.engadget.com/forward/19841571/" title="Send this entry to a friend via email"&gt;Email this&lt;/a&gt; | &lt;a href="http://www.engadget.com/2011/02/14/clamcase-ipad-keyboard-case-review/#comments" title="View reader comments on this entry"&gt;Comments&lt;/a&gt;&lt;img src="http://feeds.feedburner.com/~r/tobiasz_cudnik_reader/~4/imyJ6xQhaMQ" height="1" width="1"/&gt;</summary><author><name>Jacob Schulman</name></author><source gr:stream-id="feed/http://www.engadget.com/rss.xml"><id>tag:google.com,2005:reader/feed/http://www.engadget.com/rss.xml</id><title type="html">Engadget RSS Feed</title><link rel="alternate" href="http://www.engadget.com" type="text/html" /></source><feedburner:origLink>http://www.engadget.com/2011/02/14/clamcase-ipad-keyboard-case-review/</feedburner:origLink></entry></feed>
