<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Nerdpress.org &#187; Javascript</title>
	<atom:link href="http://www.nerdpress.org/tag/javascript/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.nerdpress.org</link>
	<description>^__^</description>
	<lastBuildDate>Thu, 03 May 2012 15:03:19 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.2</generator>
<xhtml:meta xmlns:xhtml="http://www.w3.org/1999/xhtml" name="robots" content="noindex" />
		<item>
		<title>Hosting multiple Express (node.js) apps on port 80</title>
		<link>http://www.nerdpress.org/2012/04/20/hosting-multiple-express-node-js-apps-on-port-80/</link>
		<comments>http://www.nerdpress.org/2012/04/20/hosting-multiple-express-node-js-apps-on-port-80/#comments</comments>
		<pubDate>Fri, 20 Apr 2012 03:40:31 +0000</pubDate>
		<dc:creator>Max Girkens</dc:creator>
				<category><![CDATA[Admin]]></category>
		<category><![CDATA[Express]]></category>
		<category><![CDATA[node.js]]></category>
		<category><![CDATA[socket.io]]></category>
		<category><![CDATA[vServer]]></category>
		<category><![CDATA[express]]></category>
		<category><![CDATA[Javascript]]></category>
		<category><![CDATA[proxy]]></category>
		<category><![CDATA[sockets]]></category>

		<guid isPermaLink="false">http://nerdpress.org/?p=2144</guid>
		<description><![CDATA[In the last days, i was trying to find a solution hosting multiple Express apps on my vServer the same Server. Starting with Apache and mod_proxy, i ended up with a plain node solution, which i really like. Let&#8217;s take a quick look on some different approaches out there: &#8212;1&#8212; Using apache on port 80 [...]]]></description>
			<content:encoded><![CDATA[
<!-- google_ad_section_start -->
<p>In the last days, i was trying to find a solution hosting multiple <a href="http://expressjs.com/">Express</a> apps on <del datetime="2012-04-19T00:40:35+00:00">my vServer </del>the same Server.</p>
<p>Starting with <a href="http://www.apache.org/">Apache</a> and <a href="http://httpd.apache.org/docs/2.0/mod/mod_proxy.html">mod_proxy</a>, i ended up with a plain node solution, which i really like.<span id="more-2144"></span></p>
<p><a href="http://nerdpress.org/wp-content/uploads/2012/04/node-http-proxy-haz-colors.png" rel="lightbox[post-2144]" title=""><img class="alignnone size-full wp-image-2146" src="http://nerdpress.org/wp-content/uploads/2012/04/node-http-proxy-haz-colors.png" alt="Node-http-proxy-haz-colors in " width="527" height="106" /></a></p>
<p>Let&#8217;s take a quick look on some different approaches out there:</p>
<p><strong>&#8212;1&#8212;</strong></p>
<p>Using apache on port 80 as a proxy</p>
<pre class="brush: bash; title: ; notranslate">
ProxyPass /nodeurls/ http://localhost:9000/
ProxyPassReverse /nodeurls/ http://localhost:9000/
</pre>
<p>via <a href="http://stackoverflow.com/questions/6109089/how-do-i-run-node-js-on-port-80">stackoverflow</a></p>
<p>&#8211; no websockets<br />
++ probably the easiest way to integrate with your running AMPP-stack</p>
<p><strong>&#8212;2&#8212;</strong></p>
<p>Using a node.js app on port 80 as a Wrapper for other node apps.</p>
<pre class="brush: jscript; title: ; notranslate">
express.createServer()
  .use(express.vhost('hostname1.com', require('/path/to/hostname1').app)
  .use(express.vhost('hostname2.com', require('/path/to/hostname2').app)
.listen(80)
</pre>
<p>via <a href="http://stackoverflow.com/questions/9332865/how-should-i-organize-multiple-express-servers-on-the-same-system">stackoverflow</a></p>
<p>++ you can use websockets on port 80<br />
&#8211; apps crash/restart/stop globally<br />
&#8211;what about your apache or the like?</p>
<p><strong>&#8212;3&#8212;</strong></p>
<p>Using node.js with node-http-proxy on port 80</p>
<pre class="brush: jscript; title: ; notranslate">
var http = require('http')
, httpProxy = require('http-proxy');

httpProxy.createServer({
  hostnameOnly: true,
  router: {
    //web-development.cc
    'www.my-domain.com': '127.0.0.1:3001',
    'www.my-other-domain.de' : '127.0.0.1:3002'
  }
}).listen(80);
</pre>
<p>++ proxy websockets to any port<br />
&#8211; you might need to move your old web server to another port</p>
<p>The really cool thing about using node-http-proxy is its capability of proxying websockets.<br />
So you can have your apps running independtly on different ports while serving everything to the user over port 80 and use stuff like <a href="http://socket.io/">socket.io</a>.</p>
<p>Since i&#8217;m new to node.js and miles away from beeing a admin, any feedback is highly appreciated :)</p>
<!-- google_ad_section_end -->
]]></content:encoded>
			<wfw:commentRss>http://www.nerdpress.org/2012/04/20/hosting-multiple-express-node-js-apps-on-port-80/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>run JavaScript code in PHP 5.3 with the v8js extension</title>
		<link>http://www.nerdpress.org/2012/03/09/run-javascript-code-in-php-5-3-with-the-v8js-extension/</link>
		<comments>http://www.nerdpress.org/2012/03/09/run-javascript-code-in-php-5-3-with-the-v8js-extension/#comments</comments>
		<pubDate>Thu, 08 Mar 2012 23:14:10 +0000</pubDate>
		<dc:creator>Max Girkens</dc:creator>
				<category><![CDATA[JS]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[homebrew]]></category>
		<category><![CDATA[Javascript]]></category>
		<category><![CDATA[pecl]]></category>
		<category><![CDATA[v8js.so]]></category>

		<guid isPermaLink="false">http://nerdpress.org/?p=2102</guid>
		<description><![CDATA[&#8230;for some reason i needed to get t h i s to work before going to sleep. I&#8217;m running OSX 10.7.3 with macports which usually does the job, but  Google&#8217;s V8 Javascript Engine is not available as a port yet. So&#8230; homebrew to the rescue: installed it: and installed v8 wait, this seems too easy. [...]]]></description>
			<content:encoded><![CDATA[
<!-- google_ad_section_start -->
<p>&#8230;for some reason i needed to get <strong><a href="http://php.net/manual/en/book.v8js.php">t h i s</a></strong> to work before going to sleep.</p>
<p>I&#8217;m running OSX 10.7.3 with <a href="http://www.macports.org/">macports</a> which usually does the job, but  <a href="http://code.google.com/p/v8/">Google&#8217;s V8 Javascript Engine</a> is not available as a port yet.<span id="more-2102"></span></p>
<p>So&#8230; <a href="http://mxcl.github.com/homebrew/">homebrew</a> to the rescue:</p>
<p>installed it:</p>
<pre class="brush: bash; title: ; notranslate">
/usr/bin/ruby -e &quot;$(/usr/bin/curl -fsSL https://raw.github.com/gist/323731)&quot;
</pre>
<p>and installed v8</p>
<pre class="brush: bash; title: ; notranslate">
brew install v8
</pre>
<p>wait, this seems <a href="http://www.youtube.com/watch?v=jWI8w9kLAks">too easy</a>.</p>
<p>PECL installed some beta version of the PHP extension.</p>
<pre class="brush: bash; title: ; notranslate">
sudo pecl install channel://pecl.php.net/v8js-0.1.2
</pre>
<p>added</p>
<pre class="brush: bash; title: ; notranslate">extension=v8js.so</pre>
<p>to the php.ini file.</p>
<p>und bitteschön:</p>
<pre class="brush: php; title: ; notranslate">

$v8 = new V8Js();
var_dump($v8-&gt;executeString(&quot;

//hey i'm Javascript Code

//INSIDE PHP !

//wow.
var hello = 'Hallo';

function helloWorld( string ){
return hello + ' ' + string;
}

helloWorld('World');

&quot;));
</pre>
<p>Such things might come in handy one day, <a href="https://plus.google.com/115423703838305233565/posts/VtskgWhB3kV">you know</a>.</p>
<!-- google_ad_section_end -->
]]></content:encoded>
			<wfw:commentRss>http://www.nerdpress.org/2012/03/09/run-javascript-code-in-php-5-3-with-the-v8js-extension/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>HTML5 &#8211; Sammlung von Ressourcen, Dokus und Browser-Fallbacks</title>
		<link>http://www.nerdpress.org/2010/11/27/html5-sammlung-von-ressourcen-dokus-und-browser-fallbacks/</link>
		<comments>http://www.nerdpress.org/2010/11/27/html5-sammlung-von-ressourcen-dokus-und-browser-fallbacks/#comments</comments>
		<pubDate>Sat, 27 Nov 2010 16:48:43 +0000</pubDate>
		<dc:creator>Johannes Heinen</dc:creator>
				<category><![CDATA[CSS]]></category>
		<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[articles]]></category>
		<category><![CDATA[authoring]]></category>
		<category><![CDATA[canvas]]></category>
		<category><![CDATA[css3]]></category>
		<category><![CDATA[geolocation]]></category>
		<category><![CDATA[HTML]]></category>
		<category><![CDATA[Html5]]></category>
		<category><![CDATA[Javascript]]></category>
		<category><![CDATA[links]]></category>
		<category><![CDATA[localstorage]]></category>
		<category><![CDATA[ressources]]></category>
		<category><![CDATA[tutorials]]></category>
		<category><![CDATA[WebWorker]]></category>

		<guid isPermaLink="false">http://nerdpress.org/?p=1225</guid>
		<description><![CDATA[Hier mal eine anfänglich kleine Sammlung zum Thema HTML 5 generell &#8211; grob kategorisiert. Vervollständigungen und Streichungen willkommen. Cross Browser Helper Html 5 Validator (en) http://html5.validator.nu/ Html5 Browser capability test (en) http://html5test.com/ Html readyness &#8211; fancy browser comparison (en) http://html5readiness.com/ Modernizr &#8211; Cross-Browser Html5 &#038; CSS3 Support (en) http://www.modernizr.com/ Html5Shiv &#8211; Html5 for IE (en) [...]]]></description>
			<content:encoded><![CDATA[
<!-- google_ad_section_start -->
<p>Hier mal eine anfänglich kleine Sammlung zum Thema HTML 5 generell &#8211; grob kategorisiert. Vervollständigungen und Streichungen willkommen.</p>
<p><span id="more-1225"></span></p>
<h2>Cross Browser Helper</h2>
<h3>Html 5 Validator (en)</h3>
<p><a href="http://html5.validator.nu/">http://html5.validator.nu/</a></p>
<h3>Html5 Browser capability test (en)</h3>
<p><a href="http://html5test.com/">http://html5test.com/</a></p>
<h3>Html readyness &#8211; fancy browser comparison (en)</h3>
<p><a href="http://html5readiness.com/">http://html5readiness.com/</a></p>
<h3>Modernizr &#8211; Cross-Browser Html5 &#038; CSS3 Support (en)</h3>
<p><a href="http://www.modernizr.com/">http://www.modernizr.com/</a></p>
<h3>Html5Shiv &#8211; Html5 for IE (en)</h3>
<p><a href="http://code.google.com/p/html5shiv/">http://code.google.com/p/html5shiv/</a></p>
<h3>IE-7 js &#8211; Standard complient IE 7 (en)</h3>
<p><a href="http://code.google.com/p/ie7-js/">http://code.google.com/p/ie7-js/</a></p>
<h3>Html 5 CSS-Reset (en)</h3>
<p><a href="http://html5reset.org/ ">http://html5reset.org/ </a><br />
<a href="http://html5doctor.com/html-5-reset-stylesheet/">http://html5doctor.com/html-5-reset-stylesheet/</a></p>
<h3>HTML 5 Boilerplate &#8211; Best Practices, Scripts und Server-Konfigurationen</h3>
<p><a href="http://html5boilerplate.com/">http://html5boilerplate.com/</a> (en)<br />
<a href="http://de.html5boilerplate.com/">http://de.html5boilerplate.com/</a> (de)</p>
<h2>Audio/Video</h2>
<h3>Html 5 Audio and Video &#8211; What you must know (en)</h3>
<p><a href="http://net.tutsplus.com/tutorials/html-css-techniques/html5-audio-and-video-what-you-must-know/">http://net.tutsplus.com/tutorials/html-css-techniques/html5-audio-and-video-what-you-must-know/</a></p>
<h3>Video accessiblity (en)</h3>
<p>http://wearehugh.com/public/2010/08/html5-video-accessibility/<a href="http://wearehugh.com/public/2010/08/html5-video-accessibility/">Your text to link&#8230;</a></p>
<h2>Canvas</h2>
<h3>Canvas cheat sheet (en)</h3>
<p><a href="http://blog.nihilogic.dk/2009/02/html5-canvas-cheat-sheet.html">http://blog.nihilogic.dk/2009/02/html5-canvas-cheat-sheet.html</a></p>
<h3>Reference Guide (de)</h3>
<p><a href="http://canvas.quaese.de/">http://canvas.quaese.de/</a></p>
<h3>Canvas beginners guides (en)</h3>
<p><a href="http://www.brighthub.com/internet/web-development/articles/38744.aspx">http://www.brighthub.com/internet/web-development/articles/38744.aspx</a><br />
<a href="http://www.visitmix.com/Articles/Translating-CANVAS-with-HTML5">http://www.visitmix.com/Articles/Translating-CANVAS-with-HTML5</a></p>
<h3>Canvas demos &#038; tutorials (en)</h3>
<p><a href="http://www.canvasdemos.com/">http://www.canvasdemos.com/</a></p>
<h2>Cookbooks &#038; Tutorials</h2>
<h3>WHATWG Weblog (en)</h3>
<p><a href="http://blog.whatwg.org/">http://blog.whatwg.org/</a></p>
<h3>Html 5 laboratory (en)</h3>
<p><a href="http://www.html5laboratory.com/">http://www.html5laboratory.com/</a></p>
<h3>Dive into Html 5 (en)</h3>
<p><a href="http://diveintohtml5.org/">http://diveintohtml5.org/</a></p>
<h3>Html5 Playground (en)</h3>
<p><a href="http://www.html5rocks.com/">http://www.html5rocks.com/</a></p>
<h3>Tag reference (en)</h3>
<p><a href="http://www.w3schools.com/html5/html5_reference.asp">http://www.w3schools.com/html5/html5_reference.asp</a></p>
<h3>Fancy tag reference (en)</h3>
<p><a href="http://joshduck.com/periodic-table.html">http://joshduck.com/periodic-table.html</a></p>
<h3>Html5 Techniques &#8211; Ultimate collection of tutorials (en)</h3>
<p><a href="http://www.tutoriallounge.com/2010/11/html5-techniques-ultimate-collection-of-tutorials/">http://www.tutoriallounge.com/2010/11/html5-techniques-ultimate-collection-of-tutorials/</a></p>
<h3>Useful html 5 code snippets (en)</h3>
<p><a href="http://www.onextrapixel.com/2010/11/15/useful-html5-code-snippets-you-can-use-today/">http://www.onextrapixel.com/2010/11/15/useful-html5-code-snippets-you-can-use-today/</a></p>
<h3>Geolocation using the Google API (en)</h3>
<p><a href="http://papermashup.com/html5-geo-location-using-the-google-api/">http://papermashup.com/html5-geo-location-using-the-google-api/</a></p>
<h3>Fun with html5 forms</h3>
<p><a href="http://thinkvitamin.com/code/fun-with-html5-forms/">http://thinkvitamin.com/code/fun-with-html5-forms/</a></p>
<h2>Blog-Artikel &#038; andere Quellen</h2>
<h3>Webkrauts Artikel zum Thema (de)</h3>
<p><a href="http://www.webkrauts.de/category/html5-einfuehrung/">http://www.webkrauts.de/category/html5-einfuehrung/</a></p>
<h3>What beautiful Html5 code looks like (en)</h3>
<p><a href="http://css-tricks.com/what-beautiful-html-code-looks-like/">http://css-tricks.com/what-beautiful-html-code-looks-like/</a></p>
<h3>48 Flash killing HTML 5 demos (en)</h3>
<p><a href="http://www.hongkiat.com/blog/48-excellent-html5-demos/">http://www.hongkiat.com/blog/48-excellent-html5-demos/</a></p>
<h3>HTML 5 facts &#038; myths (en)</h3>
<p><a href="http://www.smashingmagazine.com/2010/09/23/html5-the-facts-and-the-myths/">http://www.smashingmagazine.com/2010/09/23/html5-the-facts-and-the-myths/</a></p>
<h3>Learning to love html 5 (en)</h3>
<p><a href="http://www.smashingmagazine.com/2010/11/10/learning-to-love-html5/">http://www.smashingmagazine.com/2010/11/10/learning-to-love-html5/</a></p>
<h3>Designing a html 5 layout from scratch (en)</h3>
<p><a href="http://www.smashingmagazine.com/2009/08/04/designing-a-html-5-layout-from-scratch/">http://www.smashingmagazine.com/2009/08/04/designing-a-html-5-layout-from-scratch/</a></p>
<!-- google_ad_section_end -->
]]></content:encoded>
			<wfw:commentRss>http://www.nerdpress.org/2010/11/27/html5-sammlung-von-ressourcen-dokus-und-browser-fallbacks/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Ajax (Fake) Push: Long Polling mit HTML 5 WebWorker</title>
		<link>http://www.nerdpress.org/2010/06/11/ajax-fake-push-long-polling-mit-html-5-dedicated-worker/</link>
		<comments>http://www.nerdpress.org/2010/06/11/ajax-fake-push-long-polling-mit-html-5-dedicated-worker/#comments</comments>
		<pubDate>Fri, 11 Jun 2010 11:28:23 +0000</pubDate>
		<dc:creator>Johannes Heinen</dc:creator>
				<category><![CDATA[AJAX]]></category>
		<category><![CDATA[JS]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Ajax]]></category>
		<category><![CDATA[Comet]]></category>
		<category><![CDATA[Html5]]></category>
		<category><![CDATA[Javascript]]></category>
		<category><![CDATA[Long Poll]]></category>
		<category><![CDATA[Push]]></category>
		<category><![CDATA[Threads]]></category>
		<category><![CDATA[WebWorker]]></category>
		<category><![CDATA[Worker]]></category>

		<guid isPermaLink="false">http://nerdpress.org/?p=1037</guid>
		<description><![CDATA[Push-Mechanismen im Web sind mittlerweile weit verbreitet &#8211; die Anforderungen an die Infrastruktur aber recht hoch. Nichts geht ohne Plugins (Flash, Applet, WebSocket) &#8211; dann braucht man mindestens einen zweiten Server, der via persistenter Verbindung Nachrichten verteilt. Bedient man sich herkömmlicher JavaScript-Technik, muss man mit aynchronen Ajax-Requests herumkaspern, sich mit Timeouts, Memory-Leaks und Cross-Domain-Sicherheitspolicen herumschlagen. [...]]]></description>
			<content:encoded><![CDATA[
<!-- google_ad_section_start -->
<p>Push-Mechanismen im Web sind mittlerweile weit verbreitet &#8211; die Anforderungen an die Infrastruktur aber recht hoch. Nichts geht ohne Plugins (Flash, Applet, WebSocket) &#8211; dann braucht man mindestens einen zweiten Server, der via persistenter Verbindung Nachrichten verteilt. </p>
<p><span id="more-1037"></span></p>
<p>Bedient man sich herkömmlicher JavaScript-Technik, muss man mit aynchronen Ajax-Requests herumkaspern, sich mit Timeouts, Memory-Leaks und Cross-Domain-Sicherheitspolicen herumschlagen. Und auch hier kommt man nicht herum, den Server zu tweaken oder gleich einen zweiten aufzusetzen, der ausschließlich auf Polls oder Long-Polls trainiert ist.</p>
<p>Gerade in der PHP-Welt ist es nicht einfach, einen üblichen LAMP-Stack soweit zu bringen, dass so etwas auch unter Last funktioniert &#8211; Java ist da wie immer weiter und bietet mit <a href="http://java.sun.com/products/jms/">JMS</a> ein einheitliches Interface &#8211; da gibt es Software für den gewöhnlichen Servletcontainer, im Anwendungsserver muss das laut Spezifikation sogar im Lieferumfang enthalten sein.</p>
<p>Möchte man trotzdem mit &#8220;Bordmitteln&#8221; mal schnell eine Chatbox aufsetzen, führt Longpolling + Ajax eigentlich schnell zu einem akzeptablen Ergebnis &#8211; nichts für Millionen konkurrierende Zugriffe, aber immerhin eine nette Spielerei für zwischendurch. Wäre da nicht ständiges Warten auf die Response, das sich nach einiger Zeit einerseits mit einer merklichen Ruckelorgie bemerkbar macht oder gar den Mauszeiger in eine ewiglich drehende Sanduhr verwandelt.</p>
<h4>HTML 5 to the rescue&#8230;</h4>
<p>HTML 5 kann sogenannte Dedicated Worker &#8211; &#8220;echte&#8221; Workerthreads auf Betriebssystemebene, die man mit einer Zeile spawnen kann.</p>
<pre class="brush: jscript; title: ; notranslate">
new Worker('meinScript.js')
</pre>
<p>Innerhalb eines Threads kann man lang laufende Rechenoperationen im Hintergrund verstecken &#8211; warum also nicht auch einen Ajax-Request? Allerdings haben diese Threads einen Nachteil: Aus Sicherheitsgründen laufen sie in einem klar abgegrenzten Scope, in dem sozusagen nichts vorhanden ist. Auch keine Referenz auf das document-Object der Elternseite. Das stoppt die meisten Javascript-Bibliotheken, wie bspw. JQuery. Man muss sich also mit Bordmitteln begnügen.</p>
<p>Eine Methode, die einen Worker initialisiert, könnte so aussehen:</p>
<pre class="brush: jscript; title: ; notranslate">
    _initializeLongPoll: function()
    {
      var messenger = this;

      var worker = new Worker('my-ajax-worker.js');
        worker.onmessage = function(event)
        {
          var json = jQuery.parseJSON(event.data);

          // NEUE CHAT-NACHRICHT ERZEUGEN
          messenger.$_list.append($('&lt;li class=&quot;messenger-list-item&quot;&gt;'
            + '&lt;strong class=&quot;messenger-list-item-author&quot;&gt;' + json.author + '&lt;/strong&gt;'
            + '&lt;span class=&quot;messenger-list-item-message&quot;&gt;' + json.text + '&lt;/span&gt;&lt;/li&gt;'));
        };
    }
</pre>
<p>&#8220;my-ajax-worker.js&#8221; ist ausschließlich für den Ajax-Request zuständig. Hier wird ein dynamisches Javascript in einem Symfony-Projekt generiert:</p>
<pre class="brush: jscript; title: ; notranslate">

    var onLoad = function()
    {
      var output = httpRequest.responseText;
      if (output) {

        // DELEGIERT DIE RESPONSE ZURÜCK.
        postMessage(output.trim());

        // ERZEUGE NEUEN XmlHttpRequest
        httpRequest = initRequest();
      }
    };

    // WIR SPAREN UND DEN X-BROWSER XmlHttpRequest-KRAM
    var httpRequest = initRequest();
</pre>
<p>Details zum serverseitigen Script möchte ich an dieser Stelle vernachlässigen, im Grunde funktioniert es folgendermaßen: Es arbeitet so lange, bis eine Änderung festzustellen ist. Erst bei Änderung wird die Response an den Client ausgeliefert (darum heißt es &#8220;Long-Polling&#8221;, weil ein Request ganz schön lange dauern kann):</p>
<pre class="brush: java; title: ; notranslate">
while(true)
{
  if(newData())
  {
    return getNewData()
  }
  sleep(5);
}
</pre>
<p>Der Kram funktioniert natürlich nur in HTML5-Browsern, die das Worker-Objekt unterstützen. Dazu zählen Firefox 3.6, Google Chrome und natürlich Safari. Ob Opera es beherrscht, weiß ich nicht, ob der IE 8 es beherrscht, bezweifle ich. Aber wie gesagt: Es ist nur eine Spielerei und keine produktiv geeignete Anwendung. Demnächst schau ich mir auch mal die WebSocket API an&#8230;</p>
<h4>Known Issues</h4>
<p>Vorsicht mit <a href="http://php.net/manual/de/function.session-start.php">session_start()</a> und konkurrierenden (asynchronen) HTTP-Zugriffen. Im User-Sessionscope wird der Apache immer auf das Schließen einer Session warten, bis er dem nächsten Request erlaubt, die Session wieder &#8220;aufzunehmen&#8221;. Und im Normalfall dauert eine User-Session genau so lange wie die Request-Lifetime. Das führt dazu, dass bei 4 gleichzeitig abgefeuerten XmlHttpRequests diese trotzdem als Stack nach dem FIFO-Prinzip abgehandelt werden. Man verliert somit den Vorteil der Asynchronität. Es ist also zwingend erforderlich, die Session bereits vor dem Long-Poll-Loop abzuschließen (durch den Aufruf von <a href="http://php.net/manual/en/function.session-write-close.php">session_write_close()</a>;</p>
<!-- google_ad_section_end -->
]]></content:encoded>
			<wfw:commentRss>http://www.nerdpress.org/2010/06/11/ajax-fake-push-long-polling-mit-html-5-dedicated-worker/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Next Level Javascript Error Tracking</title>
		<link>http://www.nerdpress.org/2010/04/10/next-level-javascript-error-tracking/</link>
		<comments>http://www.nerdpress.org/2010/04/10/next-level-javascript-error-tracking/#comments</comments>
		<pubDate>Sat, 10 Apr 2010 12:11:03 +0000</pubDate>
		<dc:creator>Max Girkens</dc:creator>
				<category><![CDATA[AJAX]]></category>
		<category><![CDATA[JS]]></category>
		<category><![CDATA[Ajax]]></category>
		<category><![CDATA[Error]]></category>
		<category><![CDATA[Exceptionhub]]></category>
		<category><![CDATA[Javascript]]></category>
		<category><![CDATA[Tracking]]></category>

		<guid isPermaLink="false">http://nerdpress.org/?p=914</guid>
		<description><![CDATA[Exceptionhub protokolliert clientseitig auftretende Javascript Fehler. * Logs all JavaScript errors (local or remote) * Provides a stack trace to find the cause in all browsers * Groups errors by cause * Development and Production modes * RSS feeds for errors Einfach einbinden via Javascript im Seitenheader. Dann kriegt man schöne Statistiken über Javascript Fehler [...]]]></description>
			<content:encoded><![CDATA[
<!-- google_ad_section_start -->
<p><a href="http://www.exceptionhub.com/">Exceptionhub</a> protokolliert clientseitig auftretende Javascript Fehler.</p>
<blockquote><p>
    *  Logs all JavaScript errors (local or remote)<br />
    * Provides a stack trace to find the cause in all browsers<br />
    * Groups errors by cause<br />
    * Development and Production modes<br />
    * RSS feeds for errors
</p></blockquote>
<p>Einfach einbinden via Javascript im Seitenheader. Dann kriegt man schöne Statistiken über Javascript Fehler mit Browser und OS Infos, Mail-Notifications usw.<br />
<span id="more-914"></span><br />
Ein bißchen wie Google Analytics.</p>
<p>Das ganze ist (noch) kostenlos während der betaPhase.</p>
<p>Auf die Idee clientseitige Fehler via Ajax auf dem Server zu loggen, wäre ich irgendwie garnicht gekommen. <a href="http://www.the-art-of-web.com/javascript/ajax-onerror/">Andere</a> <a href="http://www.codeproject.com/kb/Ajax/LogClientSideJSErrors2Srv.aspx">Leute schon</a>.<br />
Trotzdem wundert es mich in Nachhinein fast dass es da nichts verbreiteteres gibt.<br />
Das schreit ja eigentlich nach einem Symfony Plugin, oder?</p>
<p>:)</p>
<!-- google_ad_section_end -->
]]></content:encoded>
			<wfw:commentRss>http://www.nerdpress.org/2010/04/10/next-level-javascript-error-tracking/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Googlemap Zoom-Faktor automatisch berechnen</title>
		<link>http://www.nerdpress.org/2010/03/29/googlemap-zoom-faktor-automatisch-berechnen/</link>
		<comments>http://www.nerdpress.org/2010/03/29/googlemap-zoom-faktor-automatisch-berechnen/#comments</comments>
		<pubDate>Mon, 29 Mar 2010 15:03:28 +0000</pubDate>
		<dc:creator>Max Girkens</dc:creator>
				<category><![CDATA[JS]]></category>
		<category><![CDATA[boundaries]]></category>
		<category><![CDATA[googleMaps]]></category>
		<category><![CDATA[Javascript]]></category>
		<category><![CDATA[zoom]]></category>

		<guid isPermaLink="false">http://nerdpress.org/?p=900</guid>
		<description><![CDATA[pushing the boundaries um den ZoomFaktor auf GoogleMaps dynamisch zu setzen, je nachdem wie viele Marker man wo hat, kann man GLatLngBounds benutzen. Mit jedem Marker der dazukommt erweitert man dann einfach die Grenzen: und schon kann man komfortabel Zoom und Center-Punkt rausbekommen. So das alle Marker sichtbar sind.]]></description>
			<content:encoded><![CDATA[
<!-- google_ad_section_start -->
<blockquote><p>
pushing the boundaries
</p></blockquote>
<p>um den ZoomFaktor auf GoogleMaps dynamisch zu setzen,<br />
je nachdem wie viele Marker man wo hat, kann man <a href="http://code.google.com/intl/de-DE/apis/maps/documentation/reference.html#GLatLngBounds">GLatLngBounds</a> benutzen.<br />
<span id="more-900"></span></p>
<pre class="brush: jscript; title: ; notranslate">
var bounds = new GLatLngBounds();
</pre>
<p>Mit jedem Marker der dazukommt erweitert man dann einfach die Grenzen:</p>
<pre class="brush: jscript; title: ; notranslate">
bounds.extend( myGLatLng );
</pre>
<p>und schon kann man komfortabel Zoom und Center-Punkt rausbekommen.<br />
So das alle Marker sichtbar sind.</p>
<pre class="brush: jscript; title: ; notranslate">
map.setCenter ( bounds.getCenter(), map.getBoundsZoomLevel(bounds) );
</pre>
<!-- google_ad_section_end -->
]]></content:encoded>
			<wfw:commentRss>http://www.nerdpress.org/2010/03/29/googlemap-zoom-faktor-automatisch-berechnen/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>jQuery UI 1.8</title>
		<link>http://www.nerdpress.org/2010/03/24/jquery-ui-1-8/</link>
		<comments>http://www.nerdpress.org/2010/03/24/jquery-ui-1-8/#comments</comments>
		<pubDate>Wed, 24 Mar 2010 14:12:20 +0000</pubDate>
		<dc:creator>Max Girkens</dc:creator>
				<category><![CDATA[jQuery]]></category>
		<category><![CDATA[JS]]></category>
		<category><![CDATA[Javascript]]></category>
		<category><![CDATA[Jquery]]></category>
		<category><![CDATA[Widgets]]></category>

		<guid isPermaLink="false">http://nerdpress.org/?p=879</guid>
		<description><![CDATA[die jQuery UI ist jetzt in Version 1.8 erschienen. neben einer optimierten Codebasis jQuery UI Core 71% smaller gibt es auch wieder ein paar neue Widgets. Wie z.B. das position widget, das ausgefallenere Positionierungs-Spielereien erlaubt: &#8220;linke obere Ecke von diesem Element -20px 10px von der rechten unteren Ecke von $(&#8216;#parent&#8217;) positionieren.&#8221; Kann man dann natürlich [...]]]></description>
			<content:encoded><![CDATA[
<!-- google_ad_section_start -->
<p>die jQuery UI ist jetzt in <a href="http://blog.jqueryui.com/2010/03/jquery-ui-18/">Version 1.8</a> erschienen.</p>
<p>neben einer optimierten Codebasis </p>
<blockquote><p>
jQuery UI Core 71% smaller
</p></blockquote>
<p>gibt es auch wieder ein paar neue Widgets.</p>
<p>Wie z.B. das <a href="http://jqueryui.com/demos/position">position widget</a>, das ausgefallenere Positionierungs-Spielereien erlaubt:<br />
<span id="more-879"></span><br />
&#8220;linke obere Ecke von diesem Element -20px 10px von der rechten unteren Ecke von $(&#8216;#parent&#8217;) positionieren.&#8221;</p>
<pre class="brush: jscript; title: ; notranslate">
function position() {
  $('#positionable').position({
    my: 'left top',
    at: 'right bottom',
    of: $('#parent'),
    offset: '-20 10'
  });
}
</pre>
<p>Kann man dann natürlich auch an Events hängen:</p>
<pre class="brush: jscript; title: ; notranslate">
$(&quot;#parent&quot;).draggable({
  drag: function() { position(); }
});
</pre>
<p>Auch ein Autocomplete-Widget ist jetzt dabei (endlich !:)<br />
sieht auch gut aus <a href="http://jqueryui.com/demos/autocomplete">auf den ersten Blick.<br />
</a></p>
<!-- google_ad_section_end -->
]]></content:encoded>
			<wfw:commentRss>http://www.nerdpress.org/2010/03/24/jquery-ui-1-8/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Symfony und das Dojo Build System</title>
		<link>http://www.nerdpress.org/2010/01/30/symfony-und-das-dojo-build-system/</link>
		<comments>http://www.nerdpress.org/2010/01/30/symfony-und-das-dojo-build-system/#comments</comments>
		<pubDate>Sat, 30 Jan 2010 15:18:47 +0000</pubDate>
		<dc:creator>Johannes Heinen</dc:creator>
				<category><![CDATA[AJAX]]></category>
		<category><![CDATA[Dojo Toolkit]]></category>
		<category><![CDATA[JS]]></category>
		<category><![CDATA[Deployment]]></category>
		<category><![CDATA[Dojo]]></category>
		<category><![CDATA[Dojo 1.4]]></category>
		<category><![CDATA[framework]]></category>
		<category><![CDATA[Javascript]]></category>

		<guid isPermaLink="false">http://nerdpress.org/?p=787</guid>
		<description><![CDATA[Das Dojo Toolkit bietet neben den offensichtlichen Features eines Full-Stack-Frameworks unter anderem mehrere &#8220;environment aware&#8221; Debug-Modi und eine Sammlung vonBuild-Scripten, die es dem Entwickler erlauben, das Framework zusammen mit den eigenen Frontend-Scripten und Stylesheets zu &#8220;kompilieren&#8221; und somit Bandbreite zu sparen bzw. Ladezeiten zu minimieren. Dojo Baukausten Standardmäßig lädt der Dojo-Core alle benötigten Pakete, die [...]]]></description>
			<content:encoded><![CDATA[
<!-- google_ad_section_start -->
<p>Das <a href="http://www.dojotoolkit.org/">Dojo Toolkit</a> bietet neben den offensichtlichen Features eines Full-Stack-Frameworks unter anderem mehrere &#8220;environment aware&#8221; Debug-Modi und eine Sammlung vonBuild-Scripten, die es dem Entwickler erlauben, das Framework zusammen mit den eigenen Frontend-Scripten und Stylesheets zu &#8220;kompilieren&#8221; und somit Bandbreite zu sparen bzw. Ladezeiten zu minimieren.</p>
<p><span id="more-787"></span></p>
<h3>Dojo Baukausten</h3>
<p>Standardmäßig lädt der Dojo-Core alle benötigten Pakete, die mittels dojo.require() angefordert werden, via XmlHttpRequest vom Server. Das kann je nach Projektumfang schonmal einige Sekunden in Anspruch nehmen, wenn plötzlich gefühlte 200 Sub-Requests beim Pageload abgefeuert werden.</p>
<p>Wenn es generell ans Deployment eines Web-Projekts geht, ist man daran interessiert, die Ladezeit von Scriptdateien oder Stylesheets zu minimieren, indem man zum Beispiel im ersten Schritt alle referenzierten Script-/CSS-Dateien in eine große Datei überträgt und damit konsolidiert. Dies kann mitunter mit Aufwand verbunden sein, wenn viele Scripte copied &amp; pasted werden müssen, außerdem scheint diese Vorgehensweise nicht besonders elegant, noch dazu Fehleranfällig.</p>
<p>Im zweiten Schritt nutzt man üblicherweise so etwas wie Code-Obfuscating oder Code-Minimizing. Diese Techniken dienen in erster Linie dazu, die Datenmenge von Script-Quellen zu minimieren und damit die Downloadzeiten zu beschleunigen. Dies geschieht wiederum mit Hilfe von Shellscripten oder Mini-Programmen, die Quelltexte parsen und dann je nach Voreinstellung White-Spaces und Kommentare entfernen oder den ganzen Code überarbeiten, indem bspw. Variablennamen durch möglichst kleine Buchstabenkombinationen ersetzt werden um die Zeilenlänge zu begrenzen. Der Betrachter sieht dann in der Quelltextansicht nur noch eine lange, einzeilige &#8220;Code-Wurst&#8221;.   &#8220;Disassembling&#8221; ist hier nur mit Aufwand möglich, aber prinzipiell eben das: möglich.</p>
<p>Die Dojo-Build-Tools automatisieren beide Schritte, wobei Schritt 1, die Code-Konsolidierung, durch das Dojo-Pakagesystem ermöglicht wird und Schritt 2 durch einen eingebauten Obfuscator, alternativ kann der <a href="http://code.google.com/closure/compiler/">Google Closure Compiler</a> verwendet werden. Die Werkzeuge bestehen aus einigen .jar-Dateien, die in jeder halbwegs aktuellen <a href="http://java.com/en/download/">Java Virtual Machine</a> laufen und mittels $ java &#8211;classpath &#8230; aufgerufen werden. Ein paar freundlicherweise beigelegte Shellscripte bzw. .bat-Dateien vereinfachen den Aufruf.</p>
<p>Die Datei build.sh beispielsweise benötigt mindestens einen Zielparameter &#8220;profile&#8221;, der den Pfad zur Profildatei enthält. Diese Datei besteht aus einem JSON-Objekt und konfiguriert die Projektumgebung. Hier kann der Entwickler alle Dateien bzw. Namensräume angeben, die der Compiler berücksichtigen soll.</p>
<p>Optional anzugeben ist die Behandlung von CSS-Dateien, die Code-Minimierungsstrategie und so weiter. Ein $ build.sh liefert eine gut dokumentierte Liste der möglichen Argumente.</p>
<p>Somit lassen sich automatisiert alle eigenen Javascripts und die des Dojo Frameworks zusammen mit CSS-Stylesheets für die Produktionsumgebung &#8220;fit machen&#8221; und optimieren. Dokumentiert ist das ganze wie immer mäßig auf dem <a href="http://dojocampus.org">dojocampus</a>.</p>
<h3>Dojo und Symfony</h3>
<p>Im Entwickleralltag möchte man seine Entwicklungsumgebungen zentral verwalten. Im Symfony-Kontext gibt es bspw. standardmäßig die Environments &#8220;Prod&#8221;, &#8220;Int&#8221; und &#8220;Dev&#8221;. Alle drei Umgebungen nutzen unterschiedliche Datenbanken, Loggingeinstellungen und so weiter. Natürlich liegt es nahe, die einzelnen Dojo-Builds ebenfalls &#8220;environment-aware&#8221; zu konfigurieren. Dies ist mit einigen einfachen Schritten erledigt, so könnte man bspw. das Script-Verzeichnis umgebungsabhängig verwalten. Doch so richtig optimal ist das nicht, und vor allem: Die Dojo-Build-Tools haben in der Form keine Entsprechnung als Symfony-Task, die Verheiratung wirkt also etwas widerwillig.</p>
<p>In so einem Fall lohnt sich natürlich der Blick ins Symfony Plugin Repository, und siehe da, das <a href="http://www.symfony-project.org/plugins/sfDojoPlugin">sfDojoPlugin</a> erledigt den Job. Installieren, Dojo als Dependency herunterladen (ein großer Vorteil, somit ist man nicht auf eine eventuell veraltete bundled Version angewiesen), Filter einfügen, fertig. Schon gibt es einen neuen Symfony Task Namespace &#8220;dojo&#8221;.</p>
<p>$ symfony dojo:build-for-prod</p>
<p>kompiliert dann die Javascripts für die Produktionsumgebung, ohne dass zusätzlicher Konfigurationsaufwand anfällt. Das ganze funktioniert durch eine Namensraum-Konvention der Ordner, in denen das Plugin einerseits die Dojo-Sourcen erwartet und andererseits die komplierten Scriptdateien ablegt.</p>
<p>Ein weiteres Killer-Feature ist das einfache Injizieren von PHP-Variablen in den Javascript-Context, das hier weitestgehend automatisiert abläuft. Interessant in diesem Zusammenhang wäre vielleicht noch zu wissen, in wie weit die I18N-Features des Symfony-Frameworks mit denen der Dojo-Welt verheiratet sind.</p>
<p>Dojo passt also ab Werk bereits hervorragend in jedes Symfony-Projekt, und mit dem sfDojoPlugin lässt sich die Integration nahtlos bewerkstelligen. Hat man sich einmal an die schlechte Dokumentation und die wirklich steile Lernkurve gewöhnt, lässt man mit Dojo meiner Meinung nach in Punkto Stabilität, Funktionsumfang und Projektunterstützung erstmal so ziemlich alles andere hinter sich.</p>
<h3>Links</h3>
<p>Dojo Toolkit: <a href="http://www.dojotoolkit.org/">http://www.dojotoolkit.org/</a></p>
<p>sfDojoPlugin: <a href="http://www.symfony-project.org/plugins/sfDojoPlugin">http://www.symfony-project.org/plugins/sfDojoPlugin</a></p>
<p>Eine Beispielimplementierung einer Webbasierten GUI-Komponente für die Build-Tools, leider auf Basis einer veralteten Version : <a href="http://build.dojotoolkit.org/0.4.2/web/buildscripts/webbuild/">http://build.dojotoolkit.org/0.4.2/web/buildscripts/webbuild/</a></p>
<p>Ebenfalls veraltet, aber sicher einen Blick wert: GUI für die Dojo Build Tools, Eclipse-basiert: <a href="http://shaneosullivan.wordpress.com/2007/01/29/second-beta-of-dojobuilder-released/">http://shaneosullivan.wordpress.com/2007/01/29/second-beta-of-dojobuilder-released/</a></p>
<!-- google_ad_section_end -->
]]></content:encoded>
			<wfw:commentRss>http://www.nerdpress.org/2010/01/30/symfony-und-das-dojo-build-system/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Juitter prettyDate</title>
		<link>http://www.nerdpress.org/2010/01/27/juitter-prettydate/</link>
		<comments>http://www.nerdpress.org/2010/01/27/juitter-prettydate/#comments</comments>
		<pubDate>Wed, 27 Jan 2010 11:07:42 +0000</pubDate>
		<dc:creator>Ivo Bathke</dc:creator>
				<category><![CDATA[jQuery]]></category>
		<category><![CDATA[JS]]></category>
		<category><![CDATA[Javascript]]></category>
		<category><![CDATA[Jquery]]></category>
		<category><![CDATA[Twitter]]></category>

		<guid isPermaLink="false">http://nerdpress.org/?p=769</guid>
		<description><![CDATA[Juitter ist ein Twitter Widget basierend auf jQuery. Damit kann man Twitter nach gewissen Keywords durchsuchen und die Anzeige als Widget mit wenig Code auf seiner Seite einbinden. Das alles ist rein clientseitig, was es noch einfacher macht. Das geht so: Juitter (1.0) runterladen, in sein Projekt kopieren. Javascript einbinden: Container in die Seite einbinden: [...]]]></description>
			<content:encoded><![CDATA[
<!-- google_ad_section_start -->
<p><a href="http://juitter.com/">Juitter</a> ist ein Twitter Widget basierend auf jQuery. Damit kann man Twitter nach gewissen Keywords durchsuchen und die Anzeige als Widget mit wenig Code auf seiner Seite einbinden. Das alles ist rein clientseitig, was es noch einfacher macht.</p>
<p>Das geht so:<br />
Juitter (1.0) <a href="http://juitter.com/juitter100.zip">runterladen</a>, in sein Projekt kopieren.<br />
<span id="more-769"></span><br />
Javascript einbinden:</p>
<pre class="brush: xml; title: ; notranslate">
&lt;script language=&quot;javascript&quot; src=&quot;/app/js/jquery-1.3.1.min.js&quot; type=&quot;text/javascript&quot;&gt;&lt;/script&gt;
&lt;script language=&quot;javascript&quot; src=&quot;/app/js/jquery.juitter.js&quot; type=&quot;text/javascript&quot;&gt;&lt;/script&gt;
&lt;script language=&quot;javascript&quot; src=&quot;/app/js/system.js&quot; type=&quot;text/javascript&quot;&gt;&lt;/script&gt;
</pre>
<p>Container in die Seite einbinden:</p>
<pre class="brush: xml; title: ; notranslate">
&lt;div id=&quot;juitterContainer&quot;&gt;&lt;/div&gt;
</pre>
<p>CSS einfügen:</p>
<pre class="brush: css; title: ; notranslate">
#juitterContainer { overflow: auto; padding: 2px; font-size: 12px; height: 650px; width: 419px; border: 1px solid silver }
/*JUITTER PLUGIN CSS*/
#juitterContainer .twittList{margin:0;padding:0;} /* UL that will contain the list of tweets */
/* Bellow the list of tweets &quot;&lt;li&gt;&quot; */
#juitterContainer .twittLI{list-style:none;background:#EEFDEA;margin:0;padding:5px 0 0 0;border-bottom:dashed 1px #CAF8C9;padding:3px;clear:both;height:55px;}
#juitterContainer .twittList SPAN.time{color:#777;font-size:0.9em}
#juitterContainer .twittList A{color:#006600;} /*Links inside the tweets list */
/* Bellow the CSS for the avatar image */
#juitterContainer .juitterAvatar{float:left;border:solid 1px #D3EECA;background:#FFF;margin-right:5px;padding:2px;width:48px;;height:48px;}
#juitterContainer .jRM{float:right;clear:both} /*read it on twitter link*/
#juitterContainer .extLink{} /*CSS for the external links*/
#juitterContainer .hashLink{} /*CSS for the hash links
*/ /*end of Juitter CSS*/
</pre>
<p>und fertig!</p>
<p>Die Konfiguration geht in der <em>system.js</em>.<br />
Dort kann man die zu suchenden Keywords einstellen, die Update Intervalle und noch einiges mehr.</p>
<p>Was noch etwas verbesserungswürdig ist, ist die Datumsanzeige, hier nimmt Juitter ganz einfach das von Twitter übergebene RFC 2822 Datum und stellt es dar.</p>
<p>Das geht auch schöner!<br />
Dazu hab ich das<a href="http://bassistance.de/jquery-plugins/jquery-plugin-prettydate/"> jQuery PrettyDate Plugin</a> genommen und mit Juitter gebündelt.<br />
Also Plugin noch einbinden:</p>
<pre class="brush: xml; title: ; notranslate">

&lt;script language=&quot;javascript&quot; src=&quot;/app/js/jquery.prettydate.js&quot; type=&quot;text/javascript&quot;&gt;&lt;/script&gt;
</pre>
<p>Dann Juitter ein wenig aufgebohrt, so dass man nun in der <em>system.js</em> eine dateFormat option hat:</p>
<pre class="brush: jscript; title: ; notranslate">
//set your Date Format:
//locale: uses JS toLocaleString
//pretty: uses prettyformat like so: 3 Days ago
//normal: RFC 2822 formatted date

dateFormat: &quot;pretty&quot;
</pre>
<p>Sprach Einstellungen für prettyDate sind auch möglich:</p>
<pre class="brush: jscript; title: ; notranslate">
$.prettyDate.messages = {
now : &quot;gerade eben&quot;,
minute : &quot;vor einer Minute&quot;,
minutes : $.prettyDate.template(&quot;vor {0} Minuten&quot;),
hour : &quot;vor einer Stunde&quot;,
hours : $.prettyDate.template(&quot;vor {0} Stunden&quot;),
yesterday : &quot;Gestern&quot;, days : $.prettyDate.template(&quot;vor {0} Tagen&quot;),
weeks : $.prettyDate.template(&quot;vor {0} Wochen&quot;)

}
</pre>
<p>Und schon ist es ein bißchen schicker!<br />
Den Bundle gibts hier (<a href="http://nerdpress.org/wp-content/uploads/2010/01/juitter.dateimproved.zip">juitter.dateimproved</a>) zum download.<br />
Alles weitgehend ungetested und ohne Gewähr.<br />
Bleibt zu hoffen, dass es in die nächste Juitter Version integriert wird.</p>
<!-- google_ad_section_end -->
]]></content:encoded>
			<wfw:commentRss>http://www.nerdpress.org/2010/01/27/juitter-prettydate/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Textarea mit Code Highlighting</title>
		<link>http://www.nerdpress.org/2010/01/18/textarea-mit-code-highlighting/</link>
		<comments>http://www.nerdpress.org/2010/01/18/textarea-mit-code-highlighting/#comments</comments>
		<pubDate>Mon, 18 Jan 2010 16:35:25 +0000</pubDate>
		<dc:creator>Ivo Bathke</dc:creator>
				<category><![CDATA[JS]]></category>
		<category><![CDATA[CodeMirror]]></category>
		<category><![CDATA[HTML]]></category>
		<category><![CDATA[Javascript]]></category>

		<guid isPermaLink="false">http://nerdpress.org/?p=733</guid>
		<description><![CDATA[Um eine HTML Textarea mit Code Highlighting zu versehen muss man ein bißchen tricksen. Zum Glück gibts ja da schon fertige Libs, die das erledigen. Sucht man mit Google, findet man schnell dieses hier: http://codepress.sourceforge.net/ Dies wird aber scheinbar nicht weiterentwickelt und hat zudem einige Bugs. Weiterhin gibts dann http://sourcepad.org. Das sieht ganz gut aus, [...]]]></description>
			<content:encoded><![CDATA[
<!-- google_ad_section_start -->
<p>Um eine HTML Textarea mit Code Highlighting zu versehen muss man ein bißchen tricksen.<br />
Zum Glück gibts ja da schon fertige Libs, die das erledigen.<br />
Sucht man mit Google, findet man schnell dieses hier:</p>
<p><a href="http://codepress.sourceforge.net/ " target="_blank">http://codepress.sourceforge.net/ </a><br />
Dies wird aber scheinbar nicht weiterentwickelt und hat zudem einige Bugs.<br />
<span id="more-733"></span><br />
Weiterhin gibts dann <a href="http://sourcepad.org" target="_blank">http://sourcepad.org</a>.<br />
Das sieht ganz gut aus, für meine Zwecke schon zu gut, daher habe ich mich für dieses entschieden:<br />
<a href="http://marijn.haverbeke.nl/codemirror" target="_blank">http://marijn.haverbeke.nl/codemirror</a></p>
<p>Also der CodeMirror:<br />
Installation ist einfach:<br />
Runterladen, die nötigen Files einbinden:</p>
<pre class="brush: xml; title: ; notranslate">
&lt;script type=&quot;text/javascript&quot; src=&quot;js/codemirror.js&quot;&gt;&lt;/script&gt;
&lt;link rel=&quot;stylesheet&quot; type=&quot;text/css&quot; href=&quot;css/docs.css&quot;&gt;
</pre>
<p>Den linenumber style setzen (warum das nicht in der docs.css schon drin, fragt man sich?)</p>
<pre class="brush: xml; title: ; notranslate">
&lt;style type=&quot;text/css&quot;&gt;
      .CodeMirror-line-numbers {
        width: 2.2em;
        color: #aaa;
        background-color: #eee;
        text-align: right;
        padding-right: .3em;
        font-size: 10pt;
        font-family: monospace;
        padding-top: .4em;
      }
&lt;/style&gt;
</pre>
<p>Eine Textarea anlegen:</p>
<pre class="brush: xml; title: ; notranslate">
&lt;textarea id=&quot;code&quot; name=&quot;PAGE_CONTENT&quot;&gt;&lt;/textarea&gt;
</pre>
<p>und das Highlighting aktivieren:</p>
<pre class="brush: jscript; title: ; notranslate">
    var editor = CodeMirror.fromTextArea('code', {
    height: &quot;350px&quot;,
    width: &quot;700px&quot;,
    parserfile: &quot;parsexml.js&quot;,
    stylesheet: &quot;css/xmlcolors.css&quot;,
    path: &quot;js/&quot;,
    continuousScanning: 500,
    lineNumbers: true
  });
</pre>
<p>Das wars schon.<br />
Die Konfigurationsmöglichkeiten werden im Manual ganz gut erklärt, da gibts dann weitere Infos.</p>
<p>Spannend wirds allerdings wenn nun die Form submitted werden soll um den geänderten Code zu verarbeiten.<br />
Denn der Trick bei dieser, wie auch bei den anderen Libs ist, dass das die Textarea unsichtbar gemacht wird und stattdessen ein iFrame gerendert wird mit dem Highlighting.</p>
<p>Submitted man nun die Form, wird natürlich nicht der aktuelle Inhalt übertragen sondern unverändert der alte.<br />
Um zu erreichen, dass der neue Inhalt übertragen wird, muss man vorher den Code aus dem iFrame holen und in die ursprungliche Textarea setzen.<br />
Daher besser keinen Submit Button benutzen, da ein Submit direkt feuert.<br />
Besser ein onclick auf einen normalen Button und eine javascript funktion zwischenschalten die den Transfer übernimmt und danach submittet.<br />
CodeMirror bietet dafür, sehr praktisch, eine Funktion an, die einem den geänderten Code liefert: getCode()<br />
Als prototype event sehe das dann so aus:</p>
<pre class="brush: jscript; title: ; notranslate">
//button id=save
Event.observe('save','click',function(event) {
 	 	  $('code').value = editor.getCode();
		  $('form').submit();//die form mit id = form
});
</pre>
<p>So siehts aus:<br />
<a href="http://nerdpress.org/wp-content/uploads/2010/01/codemirror.jpg" rel="lightbox[post-733]" title=""><img class="alignnone size-medium wp-image-732" src="http://nerdpress.org/wp-content/uploads/2010/01/codemirror-300x154.jpg" alt="Codemirror-300x154 in " width="300" height="154" /></a></p>
<p>coole sache!</p>
<!-- google_ad_section_end -->
]]></content:encoded>
			<wfw:commentRss>http://www.nerdpress.org/2010/01/18/textarea-mit-code-highlighting/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
	</channel>
</rss>

