<?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://nerdpress.org/tag/javascript/feed/" rel="self" type="application/rss+xml" />
	<link>http://nerdpress.org</link>
	<description>Just another WordPress site</description>
	<lastBuildDate>Mon, 30 Jan 2012 14:28:23 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
<xhtml:meta xmlns:xhtml="http://www.w3.org/1999/xhtml" name="robots" content="noindex" />
		<item>
		<title>HTML5 &#8211; Sammlung von Ressourcen, Dokus und Browser-Fallbacks</title>
		<link>http://nerdpress.org/2010/11/27/html5-sammlung-von-ressourcen-dokus-und-browser-fallbacks/</link>
		<comments>http://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>
<div class="plus-one-wrap"><g:plusone href="http://nerdpress.org/2010/11/27/html5-sammlung-von-ressourcen-dokus-und-browser-fallbacks/"></g:plusone></div>
<!-- google_ad_section_end -->
]]></content:encoded>
			<wfw:commentRss>http://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://nerdpress.org/2010/06/11/ajax-fake-push-long-polling-mit-html-5-dedicated-worker/</link>
		<comments>http://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>
<div class="plus-one-wrap"><g:plusone href="http://nerdpress.org/2010/06/11/ajax-fake-push-long-polling-mit-html-5-dedicated-worker/"></g:plusone></div>
<!-- google_ad_section_end -->
]]></content:encoded>
			<wfw:commentRss>http://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://nerdpress.org/2010/04/10/next-level-javascript-error-tracking/</link>
		<comments>http://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>
<div class="plus-one-wrap"><g:plusone href="http://nerdpress.org/2010/04/10/next-level-javascript-error-tracking/"></g:plusone></div>
<!-- google_ad_section_end -->
]]></content:encoded>
			<wfw:commentRss>http://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://nerdpress.org/2010/03/29/googlemap-zoom-faktor-automatisch-berechnen/</link>
		<comments>http://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>
<div class="plus-one-wrap"><g:plusone href="http://nerdpress.org/2010/03/29/googlemap-zoom-faktor-automatisch-berechnen/"></g:plusone></div>
<!-- google_ad_section_end -->
]]></content:encoded>
			<wfw:commentRss>http://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://nerdpress.org/2010/03/24/jquery-ui-1-8/</link>
		<comments>http://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>
<div class="plus-one-wrap"><g:plusone href="http://nerdpress.org/2010/03/24/jquery-ui-1-8/"></g:plusone></div>
<!-- google_ad_section_end -->
]]></content:encoded>
			<wfw:commentRss>http://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://nerdpress.org/2010/01/30/symfony-und-das-dojo-build-system/</link>
		<comments>http://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>
<div class="plus-one-wrap"><g:plusone href="http://nerdpress.org/2010/01/30/symfony-und-das-dojo-build-system/"></g:plusone></div>
<!-- google_ad_section_end -->
]]></content:encoded>
			<wfw:commentRss>http://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://nerdpress.org/2010/01/27/juitter-prettydate/</link>
		<comments>http://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>
<div class="plus-one-wrap"><g:plusone href="http://nerdpress.org/2010/01/27/juitter-prettydate/"></g:plusone></div>
<!-- google_ad_section_end -->
]]></content:encoded>
			<wfw:commentRss>http://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://nerdpress.org/2010/01/18/textarea-mit-code-highlighting/</link>
		<comments>http://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>
<div class="plus-one-wrap"><g:plusone href="http://nerdpress.org/2010/01/18/textarea-mit-code-highlighting/"></g:plusone></div>
<!-- google_ad_section_end -->
]]></content:encoded>
			<wfw:commentRss>http://nerdpress.org/2010/01/18/textarea-mit-code-highlighting/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Audio auf Webseiten mit SoundManager 2</title>
		<link>http://nerdpress.org/2009/11/29/audio-auf-webseiten-mit-soundmanager-2/</link>
		<comments>http://nerdpress.org/2009/11/29/audio-auf-webseiten-mit-soundmanager-2/#comments</comments>
		<pubDate>Sun, 29 Nov 2009 14:28:15 +0000</pubDate>
		<dc:creator>Max Girkens</dc:creator>
				<category><![CDATA[API]]></category>
		<category><![CDATA[Audio]]></category>
		<category><![CDATA[HTML]]></category>
		<category><![CDATA[Javascript]]></category>
		<category><![CDATA[mySound]]></category>
		<category><![CDATA[mySoundObject]]></category>
		<category><![CDATA[peakData]]></category>
		<category><![CDATA[soundManager]]></category>
		<category><![CDATA[Sounds]]></category>
		<category><![CDATA[waveform]]></category>

		<guid isPermaLink="false">http://nerdpress.org/?p=625</guid>
		<description><![CDATA[Audio auf Webseiten ist ja immer so ein Thema. Die &#8220;nativen&#8221; HTML &#8220;Möglichkeiten&#8221; lassen wir mal lieber aussen vor. Des Rätsels Lösung ist ja eigentlich meistens Flash &#8211; so auch bei Soundmanager 2. Nur bleibt Flash hier komplett im Hintergrund und wird nur als &#8220;Ausgabegerät&#8221; missbraucht. Sounds lassen sich dann mittles einer wirklich mal sehr [...]]]></description>
			<content:encoded><![CDATA[
<!-- google_ad_section_start -->
<p>Audio auf Webseiten ist ja immer so ein Thema.<br />
Die &#8220;nativen&#8221; HTML &#8220;Möglichkeiten&#8221; lassen wir mal lieber aussen vor.</p>
<p>Des Rätsels Lösung ist ja eigentlich meistens Flash &#8211; so auch bei <a href="http://www.schillmania.com/projects/soundmanager2">Soundmanager 2</a>.<br />
Nur bleibt Flash hier komplett im Hintergrund und wird nur als &#8220;Ausgabegerät&#8221; missbraucht.</p>
<p>Sounds lassen sich dann mittles einer wirklich mal <strong>sehr</strong> coolen JS API einbinden, triggern und noch einiges mehr.<br />
Dazu ist das ganze auch noch <a href="http://www.schillmania.com/projects/soundmanager2/doc/">hervorragend dokumentiert</a>.<span id="more-625"></span></p>
<p>Im einfachsten Fall sieht sowas dann so aus:</p>
<pre class="brush: jscript; title: ; notranslate">
var mySoundObject = soundManager.createSound({
 id: 'mySound',
 url: '/audio/mysoundfile.mp3'
});

mySoundObject.play();
</pre>
<p>soweit so praktisch schonmal.<br />
Die <a href="http://www.schillmania.com/projects/soundmanager2/demo/mpc/">Performance</a> ist übrigens ebensfalls hervorragend.</p>
<p>Richtig gut wird es dann, wenn man Flash 9 vorrausetzt:</p>
<pre class="brush: jscript; title: ; notranslate">
waveformData array:
256 waveform data values available while playing sound

eqData array:
256 EQ spectrum data values available while playing sound

peakData object:
Left and right channel peak/volume data available while playing sound
</pre>
<p>damit lassen sich dann mal eben eigene Meter Darstellungen skripten. In JS.</p>
<pre class="brush: jscript; title: ; notranslate">
someSoundObject.whileplaying = function() {
  // Move 256 absolutely-positioned 1x1-pixel DIVs, for example (ugly, but works)
  var gPixels = document.getElementById('graphPixels').getElementsByTagName('div');
  var gScale = 32; // draw -32 to +32px from &quot;zero&quot; (i.e., center Y-axis point)
  for (var i=0; i&lt;256; i++) {
    graphPixels[i].style.top = (gScale+Math.ceil(this.waveformData[i]*-gScale))+'px';
  }
}
</pre>
<p>HTML Canvas beispiel : <a href="http://www.schillmania.com/projects/soundmanager2/demo/360-player/canvas-visualization.html">http://www.schillmania.com/projects/soundmanager2/demo/360-player/canvas-visualization.html</a></p>
<p>benutzt wird das ganze übrigens unter anderem von:<br />
<a href="http://muxtape.com/">http://muxtape.com/</a><br />
<a href="http://thecloudplayer.com/">http://thecloudplayer.com/</a><br />
<a href="http://8tracks.com/">http://8tracks.com/</a><br />
und natürlich <a href="http://openchords.org">http://openchords.org</a>  ;)</p>
<div class="plus-one-wrap"><g:plusone href="http://nerdpress.org/2009/11/29/audio-auf-webseiten-mit-soundmanager-2/"></g:plusone></div>
<!-- google_ad_section_end -->
]]></content:encoded>
			<wfw:commentRss>http://nerdpress.org/2009/11/29/audio-auf-webseiten-mit-soundmanager-2/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>lawnchair &#8211; a client side JSON document store</title>
		<link>http://nerdpress.org/2009/11/25/lawnchair-a-client-side-json-document-store/</link>
		<comments>http://nerdpress.org/2009/11/25/lawnchair-a-client-side-json-document-store/#comments</comments>
		<pubDate>Wed, 25 Nov 2009 13:04:01 +0000</pubDate>
		<dc:creator>Max Girkens</dc:creator>
				<category><![CDATA[JS]]></category>
		<category><![CDATA[async]]></category>
		<category><![CDATA[couch]]></category>
		<category><![CDATA[Javascript]]></category>
		<category><![CDATA[Json]]></category>
		<category><![CDATA[Lawnchair]]></category>

		<guid isPermaLink="false">http://nerdpress.org/?p=618</guid>
		<description><![CDATA[Sorta like a couch except smaller and outside JSON Daten clientseitig speichern und verfügbar halten. &#8220;stores&#8221; nennt Lawnchair das dann. Eigentlich ähnlich wie bei Propel und co. Nur halt ohne DB. ich würde sagen die Syntax spricht in dem Fall für sich selbst:]]></description>
			<content:encoded><![CDATA[
<!-- google_ad_section_start -->
<blockquote><p>Sorta like a couch except smaller and outside</p></blockquote>
<p>JSON Daten clientseitig speichern und verfügbar halten. </p>
<p>&#8220;stores&#8221; nennt <a href="http://brianleroux.github.com/lawnchair/">Lawnchair</a> das dann.<br />
Eigentlich ähnlich wie bei Propel und co. Nur halt ohne DB.</p>
<p>ich würde sagen die Syntax spricht in dem Fall für sich selbst:<span id="more-618"></span></p>
<pre class="brush: jscript; title: ; notranslate">
var people = new Lawnchair('people');

// Saving a document
var me = {name:'brian'};
people.save(me);

// Saving a document async
people.save({name:'frank'}, function(r) {
    console.log(r);
});

// Specifying your own key
people.save({key:'whatever', name:'dracula'});

// Get that document
people.get(me.key, function(r){
    console.log(r);
});

// Returns all documents as an array to a callback
people.all(function(r){
    console.log(r);
});

// List all with shortcut syntax
people.all('console.log(r)');

// Remove a document directly
people.get(me.key, function(r){
    people.remove(me);
});

// Remove a document by key
people.save({key:'die', name:'duder'});
people.remove('die');

// Destroy all documents
people.nuke();
</pre>
<div class="plus-one-wrap"><g:plusone href="http://nerdpress.org/2009/11/25/lawnchair-a-client-side-json-document-store/"></g:plusone></div>
<!-- google_ad_section_end -->
]]></content:encoded>
			<wfw:commentRss>http://nerdpress.org/2009/11/25/lawnchair-a-client-side-json-document-store/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
	</channel>
</rss>

