<?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>Pascal Precht - Web Stuff</title>
	<atom:link href="http://hopelessart.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://hopelessart.com</link>
	<description></description>
	<lastBuildDate>Sun, 08 Apr 2012 08:45:40 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>The Zone™</title>
		<link>http://hopelessart.com/2011/12/14/the-zone%e2%84%a2/</link>
		<comments>http://hopelessart.com/2011/12/14/the-zone%e2%84%a2/#comments</comments>
		<pubDate>Wed, 14 Dec 2011 22:47:57 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://hopelessart.com/?p=238</guid>
		<description><![CDATA[Vor einiger Zeit habe ich einen sehr interessanten Artikel von Paul Stamatiou gelesen, in dem er beschreibt, welche drei Dinge er braucht um besonders produktiv zu sein. Wer die Coding-Plattform GitHub kennt und schon einige Artikel oder Talks von denen &#8230; <a href="http://hopelessart.com/2011/12/14/the-zone%e2%84%a2/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Vor einiger Zeit habe ich einen sehr interessanten <a title="Coding Zone" href="http://paulstamatiou.com/coding-zone">Artikel von Paul Stamatiou</a> gelesen, in dem er beschreibt, welche drei Dinge er braucht um besonders produktiv zu sein. Wer die Coding-Plattform <a href="http://github.com">GitHub</a> kennt und schon einige Artikel oder Talks von denen gelesen oder gesehen hat, weiß das diese Art von Produktivsein auch als The Zone™ bekannt ist. Paul geht in seinem Artikel also näher darauf ein, wie er in seine persönliche Zone™ gelangt. Ich finde die Idee ziemlich cool, weswegen ich euch nun zeigen möchte, wie ich in meine persönlich Zone™ gelange.</p>
<h2>Die Umgebung</h2>
<p>Bevor ich loslegen kann, muss die Location stimmen. Man mag jetzt glauben, das da nur zwei Varianten zur Auswahl stehen, nämlich Home Office und der heiß geliebte Arbeitsplatz. Wenn ihr euch selbst einen gefallen tun wollt, bremst euch und die bestehenden Möglichkeiten nicht aus. Beschränkt euch nicht auf diese zwei Optionen. Wie wär&#8217;s mit einem netten Cafe in der Stadt? Ich war selbst sehr verwundert, als ich feststellte, wie sehr man sich in einer anderen Umgebung konzentrieren kann. Wenn dann noch das <a href="http://www.starbucks.de/">Käffchen</a> stimmt, kann&#8217;s losgehen. Also nach Feierabend, anstatt zuhause, gern mal in einer neutralen Umgebung hacken!</p>
<h2>Das Setup</h2>
<p>Nachdem die Location also festgelegt ist, kann die Maschine gestartet werden. Im Laufe der Zeit stellt man schnell fest, welche Apps man irgendwie IMMER braucht. Folgende Apps starte ich also als Anmeldeobjekte, um mir ein paar Klicks zu sparen (Zeit sich &#8216;nen Kaffee zu holen):</p>
<p>Da wäre zum Beispiel der schönste Mail-Client auf Erden namens <a href="http://sparrowmailapp.com/">Sparrow</a> und das mit mehr Funktionalität bepackte <a href="http://iterm.sourceforge.net/">iTerm</a>, zum Rumrocken auf der Konsole. Als Webentwickler braucht man natürlich auch sämtliche Browser und Profilemanager. Hier beschränke ich mich aber auf Chrome. Außerdem habe ich im Hintergrund immer meinen Twitter-Client laufen, um regelmäßig von Growl benachrichtigt zu werden, dass neue Tweets eintrudeln. Ich verwende keine IDE. Letztes Jahr habe ich <a href="http://www.vim.org/">Vim</a> geheiratet. Und wer will schon, dass seine Frau permanent neben einen steht. Vim wird also erst dann gestartet, wenn&#8217;s nötig ist. Um schlussendlich wirklich gar nichts zu verpassen, wartet mein <a href="http://reederapp.com/">Reeder</a> ebenfalls auf entsprechendes Futter sämtlicher Feeds.</p>
<p>So sieht&#8217;s aus. Aber nicht nur der Twitter-Client, auch Sparrow ist mit Growl verknüpft, was dafür sorgt, dass ich nicht ständig aus der Zone™ rausgerissen werde. Growl&#8217;s Notifications sind dezent genug, um nicht abzulenken.</p>
<h2>Musik</h2>
<p>Der nächste Schritt zur vollständigen Isolierung. Paul hat in seinem Artikel nicht unrecht.&#8221;An endless supply of new beats works wonders.&#8221; &#8211; Yepp. Songs von Justice, Daft Punk aber auch Skrillex und sämtliche Tracks von UKF Dupstep ziehen mich in die tiefsten Tiefen der Zone™. Komischerweise lässt es sich bei Drum&#8217;n'Bass auch schneller Tippen. Um Musik zu hören nutze ich keine Cloud-Dienste. Meine iTunes-Library ist gefüllt mit vielen verschieden Songs unterschiedlicher Genres. Da kommen gern mal so Wiedergabelisten mit Namen wie &#8220;Hacking&#8221; oder &#8220;Send the Geek the Zone™&#8221; zustande.</p>
<p>Wenn nicht zuhause, sondern in irgendeinem <a href="http://starbucks.de">Cafe meiner Wahl</a>, macht&#8217;s natürlich mehr Sinn, anstatt einer entsprechenden Anlage, zu den guten alten <a href="http://www.titus.de/de_DE/Jungs/Detail/Accessories/Kopfh%F6rer/566664/Domepiece-Wiig.html">Over-Ear-Headphones</a> zurück zugreifen.</p>
<h2>The Zone™</h2>
<p>Ab jetzt befinde ich mich in meiner persönlichen Zone™. Natürlich kommt es immer wieder vor, dass irgendwelche Kräfte von außen auf einen einwirken, die dann schließlich doch dafür sorgen, die Zone™ zu verlassen. Trotzdem bin ich unter diesen Voraussetzungen weitaus produktiver. In den Abendstunden, ab 23 Uhr, bekomme noch das Sahnehäubchen der Konzentration. </p>
<p>Wie gelangt ihr in eure Zone™?</p>
]]></content:encoded>
			<wfw:commentRss>http://hopelessart.com/2011/12/14/the-zone%e2%84%a2/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Surfen mit dem Raben &#8211; An introduction to Raven</title>
		<link>http://hopelessart.com/2011/11/01/surfen-mit-dem-raben-an-introduction-to-raven/</link>
		<comments>http://hopelessart.com/2011/11/01/surfen-mit-dem-raben-an-introduction-to-raven/#comments</comments>
		<pubDate>Tue, 01 Nov 2011 21:46:48 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://hopelessart.com/?p=219</guid>
		<description><![CDATA[Heute bin ich zufällig durch einen Tweet in meiner Timeline auf Raven gestoßen. Der smarte Webkit-Browser für Mac. Dieser Browser ist für mich definitiv ein weiterer Grund ein stolzer Mac-User zu sein. Nachdem ich mir die einzelnen Features näher auf &#8230; <a href="http://hopelessart.com/2011/11/01/surfen-mit-dem-raben-an-introduction-to-raven/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Heute bin ich zufällig durch einen <a href="https://twitter.com/#!/natekoechley/status/131403711137329152">Tweet</a> in meiner Timeline auf <a href="http://raven.io">Raven</a> gestoßen. Der smarte Webkit-Browser für Mac. Dieser Browser ist für mich definitiv ein weiterer Grund ein stolzer Mac-User zu sein. Nachdem ich mir die einzelnen Features näher auf der Website angesehen habe, beschloss ich, diesem Browser einen Versuch zu geben und herauszufinden, ob er wirklich so smart ist, wie es promoted wird. Da ich der Meinung bin das es sehr wichtig ist, Informationen und Wissen mit der Community zu teilen, walte ich an dieser Stelle nun meines Amtes und gebe meinen ersten Eindruck weiter.</p>
<h2>Wie Sparrow und Twitter &#8211; Smartbar rocks!</h2>
<p>Nach dem ersten Start von Raven fällt eines besonders schnell auf: die <span class="code">Smartbar</span>. Was bei Raven als Smartbar bezeichnet wird, hat sich bereits in Apps wie <a href="http://itunes.apple.com/de/app/twitter/id409789998?mt=12">Twitter for Mac</a> und dem absolut schlanken Mail-Client <a href="http://sparrowmailapp.com/">Sparrow</a> als sehr sinnvoll erwiesen. Übersichtlich und auf&#8217;s wichtigste reduziert hat man Zugriff auf Timelines der verschiedenen Twitter-Accounts bei Twitter for Mac und auf beliebig viele Postfächer bei Sparrow. Bei Raven hat man die Möglichkeit, sämtliche <span class="code">Web Apps</span> aus dem <a href="http://start.raven.io/">Web App Shop</a> zu installieren. Diese werden dann automatisch der Smartbar hinzugefügt und schon hat man schnellen Zugriff auf die jeweilige App.</p>
<p><img class="alignnone" src="http://hopelessart.com/wp-content/uploads/2011/11/raven-start.png" alt="" width="650" /></p>
<p>Letztendlich ist der Aufruf einer solchen Web App bei Raven nichts anderes, als das Aufrufen einer bestimmten URL. Das schöne dabei: Bestimmte Web Apps bieten entsprechende &#8220;Unterbereiche&#8221;, die ebenfalls über die Smartbar aufzurufen sind. Auch bei diesen handelt es sich um nichts anderes als das Aufrufen einer bestimmten URL, man spart sich aber das Tippen und hat noch eher das <span class="code">Look &amp; Feel</span> einer nativen App. Da sich Raven zur Zeit noch in der Betaphase befindet, ist das Angebot an Apps eher mager. Das macht aber nichts, wenn man sich in erster Linie mit weitverbreiteten Apps wie Facebook und Instapaper oder iCloud und Amazon, zufrieden geben kann.</p>
<p>Ich persönlich bin ein großer Freund dieser Smartbar. Erstmals bei Tweetie und dann bei Twitter for Mac kam ich das erste Mal in den Genuss einer solchen Art von GUI. Klar. Irgendwo ist es auch Geschmackssache. Ich mag&#8217;s. Das ist auch einer der Gründe gewesen, warum ich mich auf <a href="http://sparrowmailapp.com/">Sparrow</a> eingelassen habe und ich bereue es auf gar keinen Fall!</p>
<h2>Weitere &#8220;smarte&#8221; Einzelheiten</h2>
<p>Alles was mich bei Raven überzeugt, steht offenbar in Verbindung mit der Smartbar. Was mir nämlich ebenfalls sehr gefällt, ist z.B. der Zugriff auf die eigene History. Diese ist, wie nicht schwer zu erwarten, über die Smartbar erreichbar und bietet eine Sparrow-ähnliche Ansicht der zuletzt besuchten Seiten. Selbstverständlich ist es auch hier möglich, nach bestimmten Dingen zusuchen, indem man die sich über der History befindenden Suchleiste verwendet.<br />
<img src="http://hopelessart.com/wp-content/uploads/2011/11/raven-history.png" width="650" /><br />
Zum Schluss möchte ich noch gern auf den besonders coolen Download-Bereich von Raven hinweisen. Auch hier ist es möglich, sämtliche Downloads die mit Raven getätigt wurden nach bestimmten Suchkriterien zu filtern und zu finden. Aus einer direkt getätigten Suche, erhält man hier nach dem selektieren eines Files, dessen Informationen über Dateigröße, Dateityp, sowie die Herkunft. An dieser Stelle ist es sogar möglich ausgewählte Files aus dem Interface heraus in den Papierkorb zu schmeißen, oder im Finder zu öffnen.<br />
<img src="http://hopelessart.com/wp-content/uploads/2011/11/raven-downloads.png" width="650"/></p>
<h2>Fazit</h2>
<p>Wer ein Freund von der Smartbar-GUI ist und bereits Erfahrungen in der Handhabung mit Twitter for Mac oder Sparrow gesammelt hat, wird sich in Raven sehr schnell zurecht finden und es höchstwahrscheinlich mögen. Da sich das Projekt noch in der Betaphase befindet, gibt es noch einige kleine Bugs, die aber sicherlich gefixed werden. Ich denke man kann noch eine Menge cooler Features erwarten. Da Raven zum kostenlosen Download bereit steht, würde ich jedem Mac-User empfehlen, es einfach mal zu probieren. Wer&#8217;s nicht mag, wirft&#8217;s einfach wieder weg.</p>
]]></content:encoded>
			<wfw:commentRss>http://hopelessart.com/2011/11/01/surfen-mit-dem-raben-an-introduction-to-raven/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Hannover.js die Zweite</title>
		<link>http://hopelessart.com/2011/10/28/hannover-js-die-zweite/</link>
		<comments>http://hopelessart.com/2011/10/28/hannover-js-die-zweite/#comments</comments>
		<pubDate>Fri, 28 Oct 2011 10:34:47 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://hopelessart.com/?p=212</guid>
		<description><![CDATA[Diesen Monat gab es wieder ein Meetup der JavaScript-Enthusiasten aus Hannover. Neben Schülern der Dr. Buhmann Schule, Köpfe von Neoskop (Marcel Böttcher, Philipp Wanning) und anderen diversen Gesichtern, gab es diesmal Teilnehmer wie Sascha Reuter die sich bereits einen Namen &#8230; <a href="http://hopelessart.com/2011/10/28/hannover-js-die-zweite/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Diesen Monat gab es wieder ein Meetup der JavaScript-Enthusiasten aus Hannover. Neben Schülern der Dr. Buhmann Schule, Köpfe von <a href="http://neoskop.de">Neoskop</a> (<a href="http://twitter.com/#!/73inches">Marcel Böttcher</a>, <a href="http://twitter.com/#!/PhilippWanning/">Philipp Wanning</a>) und anderen diversen Gesichtern, gab es diesmal Teilnehmer wie <a href="http://twitter.com/#!/sreuter/">Sascha Reuter</a> die sich bereits<br />
einen Namen im Web gemacht haben! </p>
<p>Das Meetup bestand wieder aus drei Talks. Neben &#8220;Usability Aspects&#8221; von <a href="http://twitter.com/#!/medienkueche/">Normen Ludwig</a>, &#8220;Rocking the fugly form elements&#8221; von <a href="http://twitter.com/#!/73inches/">Marcel Böttcher</a> und <a href="http://twitter.com/#!/bisonfute">Christian Haller</a> gab es noch einen Talk von meiner Wenigkeit über JavaScript Performance mit &#8220;Making your JavaScript faster&#8221;.</p>
<p>Normen Ludwig klärte darüber auf, was Usability eigentlich ist und bedeutet.Er ging auf die sogenannte Gebrauchstauglichkeit ein und wies besonders darauf hin, das weniger mehr ist. &#8220;Minimalism in design&#8221; ist also das Stichwort, während er auf die &#8220;Effizienz der Handhabung&#8221; einging und es nicht nur die Benutzer sind, die damit leben müssen. Entwickler sind auch Benutzer und sollten ihre selbst entwickelten APIs unter Usability aspekten entwerfen.</p>
<p>Marcel Böttcher von <a href="http://neoskop.de/">Neoskop</a> und Christian Haller stellten ihr eigenes jQuery-Plugin <a href="http://twitter.com/#!/rockjsnet/">rock.js</a> vor. Rock.js hilft dabei sämtliche standard HTML Form Elemente auf einfachste Weise zu stylen. &#8220;Wir planen die Stable&#8221; war eine Aussage, die darauf hoffen lässt, dass dieses Plugin bald für den Produktiveinsatz verfügbar ist.</p>
<p>Zu guter Letzt durfte meine Wenigkeit auf die Stage und den Leuten erzählen, wo in JavaScript Performance Probleme auftauchen und wie man sie vermeiden kann. Dazu zählten Themen wie Scope Management, Datenzugriff, Schleifen das DOM und in Verbindung damit, Reflow. Der interessanteste Teil war offenbar der Reflow-Part, weils für so ziemlich jeden was Neues war.</p>
<p>Im Großen und Ganzen wieder ein cooles Meetup gewesen! Man trifft alte Gesichter wieder und lernt neue kennen. Also für jeden, der noch nicht auf den Geschmack gekommen ist: jeder vierte Donnerstag im Monat findet ein Hannover.js Meetup statt! Fotos gibt es übrigens <a href="http://www.flickr.com/photos/hannoverjs/sets/72157627992752240/">hier</a>!</p>
<p>Hier noch ein paar interessante Links:</p>
<p>- <a href="http://hannoverjs.de/">Hannoverjs.de &#8211; Offizielle Website</a><br />
- <a href="http://neoskop.de/">Neoskop &#8211; Offizielle Website</a><br />
- <a href="http://medien-kueche.de/">Medienküche &#8211; Offizielle Website</a><br />
- <a href="http://twitter.com/#!/tapeup/">Tapeup</a><br />
- <a href="http://edelstall.de/">EDELSTALL Coworkingspace</a><br />
- <a href="http://doctape.com/">Doctape &#8211; Offizielle Website</a></p>
<p>Talk bezogen:</p>
<p>- <a href="http://rockjs.net/">rock.js</a><br />
- <a href="http://speakerdeck.com/u/pascalprecht/p/making-your-javascript-faster/">Slides &#8211; Making your JavaScript faster</a></p>
]]></content:encoded>
			<wfw:commentRss>http://hopelessart.com/2011/10/28/hannover-js-die-zweite/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Modern HTML5 Presentations</title>
		<link>http://hopelessart.com/2011/10/26/modern-html5-presentations/</link>
		<comments>http://hopelessart.com/2011/10/26/modern-html5-presentations/#comments</comments>
		<pubDate>Wed, 26 Oct 2011 23:08:38 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://hopelessart.com/?p=189</guid>
		<description><![CDATA[An dieser Stelle möchte ich kurz auf ein kleines Side-Projekt hinweisen. Ich habe mich vor einiger Zeit mal gefragt, warum sich ein Webdeveloper überhaupt noch mit Apps wie PowerPoint oder Keynote rumschlagen soll (womit ich jetzt nicht sagen will, dass &#8230; <a href="http://hopelessart.com/2011/10/26/modern-html5-presentations/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>An dieser Stelle möchte ich kurz auf ein kleines Side-Projekt hinweisen. Ich habe mich vor einiger Zeit mal gefragt, warum sich ein Webdeveloper überhaupt noch mit Apps wie PowerPoint oder Keynote rumschlagen soll (womit ich jetzt nicht sagen will, dass Keynote bescheiden zu bedienen ist), wenn man doch ganz gut in der Lage ist, sich seine Präsentationen zu coden!</p>
<h2>TodoMVC als Inspiration</h2>
<p><a href="http://addyosmani.com/">Addy Osmani</a> hat bereits eine coole Anwendung gebaut, die als eine Art &#8220;Probier-mal-ein-bisschen-rum-und-finde-heraus-was-dir-am-besten-passt&#8221;-Plattform dient und auf den Namen <a href="http://addyosmani.github.com/todomvc/">TodoMVC</a> getauft. Ich persönlich finde diesen Ansatz total klasse und dachte mir, sowas in der Richtung muss es auch für JavaScript Libraries geben, die für Slides gedacht sind! Aus diesem Grund habe ich also TodoMVC als Vorlage verwendet und eine, für sich eigene, Plattform erstellt, die genau diesen Zweck erfüllt!</p>
<h2>Was so cool daran ist</h2>
<p>Jeder da draußen kann diese Plattform verwenden und rumprobieren. Ebenfalls kann jeder da draußen seinen Teil dazu beitragen und ein eigenes Beispiel mit irgendeiner anderen JavaScript (Slide) Library hinzufügen. Somit haben alle was davon! Zur Zeit gibt es nur eine kleine Live-Demo zu <a href="http://markdalgleish.com/projects/fathom/">Fathom.js</a>, aber es stehen bereits Demos mit anderen Libraries in Aussicht! Wer also Lust oder Interesse hat irgendwas beizutragen, oder vielleicht einfach nur ein bisschen stöbern möchte: Der Sourcecode befindet sich auf <a href="https://github.com/Pascalprecht/Modern-HTML5-Presentations/">Github</a> und wartet nur darauf zu wachsen! Wer sich die Plattform direkt ansehen will, <a href="http://pascalprecht.github.com/Modern-HTML5-Presentations/">hier</a> geht&#8217;s lang!</p>
<p>Im Anschluss ein kleiner Einblick:</p>
<p><img alt="" src="http://hopelessart.com/wp-content/uploads/2011/10/Modern-HTML5-Presentations.png" title="Modern HTML5 Presentations Screenshot" class="alignnone" width="650" /></p>
<h3 style="border-bottom: #CCC 1px solid; padding-bottom: 5px;">Links</h3>
<p>- <a href="http://pascalprecht.github.com/Modern-HTML5-Presentations/">Modern HTML5 Presentations</a><br />
- <a href="http://addyosmani.github.com/todomvc/">TodoMVC</a><br />
- <a href="http://markdalgleish.com/projects/fathom/">Fathom.js</a></p>
]]></content:encoded>
			<wfw:commentRss>http://hopelessart.com/2011/10/26/modern-html5-presentations/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Singleton in JavaScript</title>
		<link>http://hopelessart.com/2011/10/23/singleton-in-javascript/</link>
		<comments>http://hopelessart.com/2011/10/23/singleton-in-javascript/#comments</comments>
		<pubDate>Sun, 23 Oct 2011 17:15:25 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://hopelessart.com/?p=161</guid>
		<description><![CDATA[Leute die bereits wissen was Entwurfsmuster &#8211; oder auch Design Patterns &#8211; sind, kennen in der Regel das sogenannte Singleton Pattern. Christoph Witting hat hier bereits einen entsprechenden Artikel für .NET-Entwickler geschrieben. Die Idee des Singleton Patterns besteht also darin, &#8230; <a href="http://hopelessart.com/2011/10/23/singleton-in-javascript/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Leute die bereits wissen was Entwurfsmuster &#8211; oder auch Design Patterns &#8211; sind, kennen in der Regel das sogenannte Singleton Pattern.<a href="http://cool4tool.de"> Christoph Witting</a> hat <a href="http://cool4tool.de/2011-07-06/creational-pattern-part-i-singleton-in-vb-net">hier</a> bereits einen entsprechenden Artikel für .NET-Entwickler geschrieben. Die Idee des Singleton Patterns besteht also darin, nur eine Instanz einer bestimmten Klasse zu haben.<br />
Wenn also ein zweites Objekt dieser Klasse erzeugt wird, handelt es sich um die exakt gleiche Instanz wie die der Ersten. Werfen wir einen Blick auf JavaScript, stellen wir schnell fest, dass es keine Klassen gibt. Wie also soll ein Muster dieser Art in JavaScript implementiert werden?!</p>
<h2>In JavaScript sind Objekte niemals gleich</h2>
<p>Es klingt ein bisschen verwirrend, aber es ist nunmal so. Wenn wir ein neues Objekt in JavaScript erstellen, gibt es kein anderes Objekt, das gleich ist, und das neue Objekt ist schon ein Singleton. Schauen wir uns folgendes Codebeispiel an, lässt sich schnell erkennen, das die Erzeugung eines Objektes mit Objekt-Literalen ein Singleton ins Leben ruft.</p>
<pre class="brush: js;">
var myObj = {
    myAttribute: 'JS is awesome!'
};

var myObj2 = {
    myAttribute: 'JS is awesome!'
};

myObj === myObj2    // false
myObj == myObj2    // false
</pre>
<p>Also grundsätzlich gilt: Immer dann, wenn ein Objekt mit Objekt-Literalen erzeugt wird, erstellt man eigentlich ein Singleton.</p>
<h2>Singleton mit new-Konstruktor</h2>
<p>Eine weitere Möglichkeit ein Singleton zu erzeugen ist die mit der Verwendung von <span class="code">new</span>. Es gibt Fälle, in denen ist es gewollt ein Objekt immer mit dem <span class="code">new</span>-Operator zu instanziieren. Auch hier gilt: Bei jeder Erzeugung einer solchen Instanz wird immer auf das gleiche Objekt gezeigt. So könnte also die Schnittstelle aussehen, wenn man das Singleton-Pattern mit der Verwendung von <span class="code">new</span> implementiert:</p>
<pre class="brush: js;">
var numberOne = new Singleton();
var numberTwo = new Singleton();

numberOne === numberTwo;  // true
</pre>
<p>Letztendlich wird also nur bei <span class="code">numberOne</span> die eigentliche Instanz erzeugt. Jeder weitere Aufruf von &#8220;new Singleton();&#8221; erzeugt nichts weiter als eine Referenz auf die bereits bestehende Instanz. Wie lässt sich das Ganze aber nun umsetzen?</p>
<p>Grundsätzlich gibt es mehrere Möglichkeiten das obige Ziel zu erreichen. Die stumpfste, die mir als erstes in den Sinn kommt, wäre die Verwendung einer globalen Variable, in der eine entsprechende Instanz gespeichert wird. Das das nicht sonderlich vom Vorteil ist, wissen wir. Der globale Namensraum sollte freigehalten werden. Zudem könnte unter diesen Umständen der Wert unserer globalen Variable jeder Zeit von außen geändert werden.</p>
<p>Weg Nummer zwei wäre der Konstruktor-Funktion für <span class="code">Singleton</span> eine statische Eigenschaft hinzuzufügen, welche die Instanz hält. Da Funktionen in JavaScript auch nur Objekte sind, ist das kein Problem. Ein Ansatz wie <span class="code">Singleton.__instance</span> wäre also denkbar. Nur gibt&#8217;s auch hier wie immer einen Haken. Statische Eigenschaften eines Objektes in dieser Form sind ebenfalls global öffentlich. Das wiederum bedeutet, das auch in diesem Fall der Wert der Eigenschaft einfach von außen geändert werden kann.</p>
<p>Zu guter Letzt wäre es möglich, ein Closure zu erzeugen, wodurch wir eine mögliche Eigenschaft <span class="code">__instance</span> in eine Art gefaketen privaten Scope holen.</p>
<h2>Gehn wir&#8217;s an!</h2>
<pre class="brush: js;">
function Singleton () {

    if (typeof Singleton.__instance === "object") {
        return Singleton.__instance;
    }

    Singleton.__instance = this;
}

var numberOne = new Singleton();
var numberTwo = new Singleton();

numberOne === numberTwo; // true
</pre>
<p>Hier sehen wir die Lösung mit der Instanz als statische Eigenschaft. Unwahrscheinlich, aber nicht unmöglich ist hier, <span class="code">__instance</span> von außen einfach zu ändern.<br />
Schauen wir uns nun einen möglichen Lösungsweg mit der Instanz in einem Closure an.</p>
<pre class="brush: js;">
function Singleton() {

    var __instance = this;

    Singleton = function () {
        return __instance;
    }
}

var numberOne = new Singleton();
var numberTwo = new Singleton();

numberOne === numberTwo; // true
</pre>
<p>Hier wird also beim ersten Aufruf ganz normal <span class="code">this</span> zurück gegeben. Bei jedem weiteren Aufruf wird die mit bereits <span class="code">this</span> versehende Variable <span class="code">__instance</span> zurück gegeben, da sich der Konstruktor &#8220;Singleton&#8221; selbst definiert. Der Konstruktor wird also beim ersten Aufruf überschrieben, hierbei handelt es sich übrigens um eine &#8220;Lazy Function definition&#8221;.<br />
Allerdings gibt es hier den Nachteil, dass die neugeschriebene Funktion alle Eigenschaften verliert, die zwischen der initialen Definition und der Redefinition hinzugefügt wurden.<br />
Hier mal ein konkreter Fall:</p>
<pre class="brush: js;">
Singleton.prototype.something = false;

var singleton = new Singleton();

Singleton.prototype.somethingelse = true;

var singleton2 = new Singleton();

// Und nun der Test
singleton.something; //false
singleton2.something; // false

singleton.somethingelse; // undefined
singleton2.somethingelse; // undefined

singleton.constructor.name; // "Singleton"

singleton.constructor === Singleton; // false
</pre>
<p>Durch die Redefinition zeigt <span class="code">singleton.constructor</span> nicht mehr auf den Konstruktor <span class="code">Singleton()</span>. Um das zu fixen kann man ein paar Kniffe verwenden.</p>
<pre class="brush: js;">
function Singleton() {

    var __instance;

    Singleton = function Singleton() {
        return __instance;
    }

    Singleton.prototype = this;

    __instance = new Singleton();
    __instance.constructor = Singleton;

    return __instance;
}

// Und nochmal testen
Singleton.prototype.something = false;
var singleton = new Singleton();

Singleton.prototype.somethingelse = false;
var singleton2 = new Singleton();

singleton === singleton2; // true
singleton.constructor === Singleton; // true
</pre>
<p>Perfekt! Fertig ist unser Singleton! Zur Verschönerung packen wir alles nochmal in eine Immediate Function. So wird beim ersten Aufruf des Konstruktors ein Objekt erzeugt und der &#8220;privaten&#8221; Variable <span class="code">__instance</span> zugewiesen. Bei jedem weiteren Aufruf wird einfach diese zurück gegeben. Somit haben wir ein kleines Modul geschaffen, welches uns unser Singleton erzeugt.</p>
<pre class="brush: js;">
var Singleton;

(function () {
    var __instance;

    Singleton = function Singleton() {

        if (__instance) {
            return __instance;
        }
    };
}());
</pre>
]]></content:encoded>
			<wfw:commentRss>http://hopelessart.com/2011/10/23/singleton-in-javascript/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>DOM Scripting mit weniger Kopfschmerzen</title>
		<link>http://hopelessart.com/2011/10/03/dom-scripting-mit-weniger-kopfschmerzen/</link>
		<comments>http://hopelessart.com/2011/10/03/dom-scripting-mit-weniger-kopfschmerzen/#comments</comments>
		<pubDate>Mon, 03 Oct 2011 21:20:45 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://hopelessart.com/?p=136</guid>
		<description><![CDATA[JavaScript. Die Sprache des Webs. So sehr diese Sprache auch im Web verwendet wird, wirkt sie auf viele Entwickler auf dem ersten und vielleicht auch zweiten Blick doch recht&#8230; schmutzig. Nicht ganz unschuldig daran ist die inkonsistente Implementierung der DOM-Methoden. &#8230; <a href="http://hopelessart.com/2011/10/03/dom-scripting-mit-weniger-kopfschmerzen/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>JavaScript. Die Sprache des Webs. So sehr diese Sprache auch im Web verwendet wird, wirkt sie auf viele Entwickler auf dem ersten und vielleicht auch zweiten Blick doch recht&#8230; schmutzig. Nicht ganz unschuldig daran ist die inkonsistente Implementierung der DOM-Methoden. Viele Entwickler greifen aus solch einem Grund auf JavaScript-Bibliotheken zurück, die die Implementierung der DOM-Methoden abstrahieren und somit ein angenehmes Arbeiten mit dem DOM ermöglichen (wie z.B. jQuery). Doch was wenn mal keine &#8220;Ich-bin-so-wunderbar&#8221;-JavaScript-Bibliothek wie jQuery gewünscht ist (nicht zuletzt aus dem Grund, weil sie gar nicht soooo Wunderbar ist)?</p>
<h2>DOM-Zugriff</h2>
<p>Der wahrscheinlich größte Knackpunkt am DOM Scripting ist wohl das DOM selbst. Das klingt im ersten Moment recht widersprüchlich und wenn Ich es nicht besser wüsste, ist es das auch. Der Grund dafür ist, dass das DOM getrennt von der JavaScript-Engine implementiert ist, was auch gar nicht so undurchdacht ist, da man ja nicht zwangsweise immer auf das DOM zugreifen möchte.</p>
<p>Allerdings bringt genau dies seine Nachteile mit sich. Jeder Zugriff auf das DOM dauert. Das wiederum bedeutet, dass man die Zugriffe auf das DOM möglichst gering halten sollte. Nur wie soll das funktionieren, wenn wir doch ständig das DOM manipulieren wollen? Es gibt da ein paar Kniffe, die unserem Problem entgegen wirken.</p>
<p>Wenn Ihr euch <a href="http://hopelessart.com/2011/06/29/ein-bisschen-was-uber-performance-in-javascript/">Ein bisschen was über Performance in JavaScript</a> bereits durchgelesen habt, kennt Ihr ja schon den kleinen Trick mit dem Zwischenspeichern um eure Schleifen schneller zu machen. Nun wollen wir aber auf das DOM zugreifen, was uns doch eine Menge Steine in den Weg legt, was unsere Performance angeht.</p>
<pre class="brush: js;">
for (i = 0; i < 100; i += 1) {
    document.getElementById("foo").innerHTML += i + ", ";
}
</pre>
<p>Autsch. Wie Ihr seht, wird hier im obigen Code hundertmal iteriert. Und bei jedem Durchlauf wird auf das DOM zugegriffen. Eine sehr kostspielige Angelegenheit. Das muss nicht sein. Im folgenden Code reduzieren Wir die Zugriffe auf ein einziges Mal. Dies bedeteut zwar mehr Code, aber es lohnt sich. Je nach Browser ist der Code zehn- bis hundertfach schneller!</p>
<pre class="brush: js;">
var i, content = "";
for (i = 0; i < 100; i += 1) {
    content += i + ", ";
}
document.getElementById("foo").innerHTML += content;
</pre>
<p>Ähnliches Vorgehen können Wir auch bei Veränderungen von Attributen vornehmen. Auch hier gilt: Zwischenspeichern rettet eurer App das Leben!</p>
<pre class="brush: js;">
// nicht gut
var padding = document.getElementById("foo").style.padding,
    margin = document.getElementById("foo").style.margin;

// awesome
var style = document.getElementById("foo").style,
    padding = style.padding,
    margin = style.margin;
</pre>
<p>Ein weiterer guter und auch schneller Weg ist die Verwendung von Selektions-Apis. Neuere Browsers und ab IE 8 aufwärts bieten diese APIs um auf DOM-Elemente zuzugreifen. Die Selektor-Methoden sind immer schneller als eine selbst vorgenommene Selektion über andere DOM-Methoden. Gängige JavaScript-Bibliotheken verwenden diese APIs bereits, man sollte also immer auf dem aktuellsten Stand sein.</p>
<pre class="brush: js;">
// ein bestimmtes Element
document.querySelector("#foo");

// Elemente mit einer bestimmten Klasse
document.querySelectorAll("#foo .selected");
</pre>
<p>&nbsp;</p>
<h2>Das DOM verändern</h2>
<p>Selbstverständlich wollen Wir, nachdem Wir drauf zugegriffen und genug rumgerockt haben, das DOM unseren Wünschen entsprechend manipulieren. Aber auch hier haben Wir das Problem, dass die meisten Änderungen am DOM eine Menge Zeit kosten. Das Anpassen des DOM kann dazu führen, dass der Browser den Fensterinhalt neu ausgibt und häufig den "Fluss" der Elemente neu berechnet. Man spricht hier auch vom sogenannten <span class="code">Reflow</span>. Paul Irish geht in einem seiner <a href="http://dl.dropbox.com/u/39519/talks/gperf/index.html">Screencasts</a> näher drauf ein.</p>
<p>Nehmen Wir also an, Wir wollen einen Unterbaum erzeugen... Grundsätzlich könnte man es so machen:</p>
<pre class="brush: js;">
var p, t;

p = document.createElement("p");
t = document.createTextNode("Text");

p.appendChild(t);
document.body.appendChild(p);

p = document.createElement("p");
t = document.createTextNode("Another one.");

p.appendChild(t);
document.body.appendChild(p);
</pre>
<p>Kann man bringen, ist aber alles andere schön. Es gibt einen besseren Weg. Wir können nämlich ein sogenanntes Dokumenten-Fragment erzeugen. Auf diesem rocken Wir rum, bis wir der Meinung sind, dass alle unsere Änderungen an das eigentliche Dokument gehängt werden können. Seht selbst.</p>
<pre class="brush: js;">
var p, t, f;

f = document.createDocumentFragment();

p = document.createElement("p");
t = document.createTextNode("awesome");

p.appendChild(t);
f.appendChild(p);

p = document.createElement("p");
t = document.createTextNode("even more awesome");

p.appendChild(t);
f.appendChild(p);

document.body.appendChild(f);
</pre>
<p>Und schon haben Wir anstatt zwei nur noch eine Aktualisierung, was bedeutet, dass auch nur ein <span class="code">Reflow</span> erzeugt wird. </p>
]]></content:encoded>
			<wfw:commentRss>http://hopelessart.com/2011/10/03/dom-scripting-mit-weniger-kopfschmerzen/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Präsentationen teilen &#8211; Und das auf angenehme Weise</title>
		<link>http://hopelessart.com/2011/09/26/prasentationen-teilen-und-das-auf-angenehme-weise/</link>
		<comments>http://hopelessart.com/2011/09/26/prasentationen-teilen-und-das-auf-angenehme-weise/#comments</comments>
		<pubDate>Mon, 26 Sep 2011 21:00:40 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://hopelessart.com/?p=123</guid>
		<description><![CDATA[Hier ein kurzer Beitrag für alle Geeks, die viel Wert auf Sharing und Talks legen. Seit heute ist Speaker Deck raus aus der Beta und somit frei für jeden! Was Speaker Deck so besonders macht Klar. Es gibt SlideShare. Und &#8230; <a href="http://hopelessart.com/2011/09/26/prasentationen-teilen-und-das-auf-angenehme-weise/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Hier ein kurzer Beitrag für alle Geeks, die viel Wert auf Sharing und Talks legen. Seit heute ist <a href="http://speakerdeck.com/">Speaker Deck</a> raus aus der Beta und somit frei für jeden!</p>
<h2>Was Speaker Deck so besonders macht</h2>
<p>Klar. Es gibt <a href="http://slideshare.net/">SlideShare</a>. Und ja. SlideShare bietet einem auch genau dass, was mach will: Präsentationen jeglicher Formate uploaden und teilen. Also was ist so besonders an Speaker Deck? Speaker Deck ist einfach. Speaker Deck ist schön. Und ganz wichtig: Speaker Deck ist frei von nerviger Werbung!</p>
<p>Während man auf SlideShare direkt nach dem Login schnell auf das neuste Sortiment von Zalando stößt und anschließend von einem &#8211; nur relativ &#8211; übersichtlichen Design &#8220;erschlagen&#8221; wird, wird man bei Speaker Deck mit einem schicken, frischen und minimalistischen Design begrüßt. Völlig reduziert aufs wesentliche zieht der Dienst schnell seine Aufmerksamkeit auf sich. Man findet sich schnell zurecht, da man kein vollgepumptes Drop-Down-Menü bedienen muss, bei dem ein Großteil der Features eh nicht genutzt wird.</p>
<div class="wp-caption alignnone" style="width: 655px"><img class=" " title="Uploading &quot;Win at live with JavaScript Patterns&quot;" src="http://hopelessart.com/wp-content/uploads/2011/09/speaker-deck-upload.png" alt="Uploading &quot;Win at live with JavaScript Patterns&quot;" width="645" height="444" /><p class="wp-caption-text">Hier lade Ich grad meine Slides von Hannover.js hoch</p></div>
<p>Zudem akzeptiert Speaker Deck nur das Format von PDF-Dateien. Ob das nun ein Vor- bzw. Nachteil ist, lässt sich meiner Meinung nach nicht sagen. Wer PowerPoint Präsentationen erzeugen kann, kann auch PDF&#8217;s erzeugen. Ein Vorteil bringt es auf jeden Fall mit sich: Während die Dimensionen einer SlideShare Präsentation begrenzt sind, sobald man diese auf anderen Websites einbindet (und die Präsentation als <span class="code">.pptx</span> o.ä. geuploaded wurde), sind mit PDF formatierten Slides natürlich keine Grenzen gesetzt.</p>
<h2>Fazit</h2>
<p>Ich bin bereits zu Speaker Deck geswitched. Das Design und die Bedienbarkeit haben mich klar überzeugt. Und dass Ich mir bei Speaker Deck keine Zalando Werbung ansehen muss, habe Ich ja bereits erwähnt. Wer also viel Wert auf schlanke GUI&#8217;s legt, die auch noch schön sind, ist bei Speaker Deck gut aufgehoben! Wen&#8217;s interessiert: <a href="http://speakerdeck.com/u/pascalprecht/p/win-at-live-with-javascript-patterns">Hier</a> gibt es die Slides von Hannover.js</p>
]]></content:encoded>
			<wfw:commentRss>http://hopelessart.com/2011/09/26/prasentationen-teilen-und-das-auf-angenehme-weise/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>JSLint an deiner Seite</title>
		<link>http://hopelessart.com/2011/09/23/jslint-an-deiner-seite/</link>
		<comments>http://hopelessart.com/2011/09/23/jslint-an-deiner-seite/#comments</comments>
		<pubDate>Fri, 23 Sep 2011 16:23:02 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://hopelessart.com/?p=106</guid>
		<description><![CDATA[An dieser Stelle möchte Ich kurz auf JSLint hinweisen. JSLint ist ein Tool zum Verbessern der Code-Qualität von JavaScript-Programmen. Entwickelt wurde JSLint von Douglas Crockford, der JavaScript-Guru schlecht hin. Aber was macht JSLint so sonderbar? Ganz einfach. JSLint überprüft euren &#8230; <a href="http://hopelessart.com/2011/09/23/jslint-an-deiner-seite/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p><img class="aligncenter" src="http://www.jslint.com/jslint.gif" alt="" /><br />
An dieser Stelle möchte Ich kurz auf <a href="http://www.jslint.com/">JSLint</a> hinweisen. JSLint ist ein Tool zum Verbessern der Code-Qualität von JavaScript-Programmen. Entwickelt wurde JSLint von <a href="http://www.crockford.com/">Douglas Crockford</a>, der JavaScript-Guru schlecht hin. Aber was macht JSLint so sonderbar? Ganz einfach. JSLint überprüft euren JavaScript-Code nach bestimmten Paradigmen und macht euch anschließend auf Dinge aufmerksam, die zu verbessern sind.</p>
<h2>Das Gute an JSLint</h2>
<p>Kurz gesagt, gibt es an JSLint nichts, was nicht gut ist. JSLint macht euren JavaScript-Code besser. Zu Anfang werdet Ihr wahrscheinlich feststellen, dass euer JavaScript-Code gar nicht mal sooo geil ist, wie ihr bis dahin gedacht habt. Da es in JavaScript Unmengen an Möglichkeiten gibt, bestimmte Dinge zu lösen, ist es nichts Ungewöhnliches, die Best-Practices nicht von vorn herein drauf zu haben. Wenn JSLint euch sagt, dass irgendetwas nicht mit eurem Code stimmt, nimmt es euch zu Herzen und lernt aus diesen, Ich nenne es mal, &#8220;Fehlern&#8221;.</p>
<p>Selbstverständlich ist man zu nichts in der Welt gezwungen. Also mal ganz abgesehen davon, dass ihr auch getrost auf die Hilfe von JSLint verzichten könnt, habt ihr die Möglichkeit JSLint euren Erwartungen anzupassen. Auf der Seite seht ihr viele Konfigurationsmöglichkeiten, die die Analyse von JSLint in Hinblick auf euren Code beeinflussen. So könnt ihr zum Beispiel angeben, dass JSLint den &#8220;use-strict&#8221;-Mode tolerieren soll/kann. Und wenn ihr aus philosophischen Gründen lieber die <span class="code">++</span> und <span class="code">&#8211;</span> anstatt der <span class="code">+= 1</span> und <span class="code">-= 1</span> Schreibweise verwendet, um während einer Iteration auf- und abzuzählen, lässt sich auch dies mit Leichtigkeit bewerkstelligen. Dazu muss man zum Beispiel nur den Haken bei &#8220;Tolerate ++ and &#8211;&#8221; setzen und schon ignoriert JSLint diese Fälle, beziehungsweise toleriert sie. Übersteht euer Code eine Analyse von JSLint fehlerfrei, könnt ihr sicher sein, dass euer Code konsistent ist und schon mal keine Tippfehler enthält.</p>
<h2>JSLint und Vim sind ein Team</h2>
<p>Ich weiß ja nicht wie&#8217;s euch geht &#8211; aber Ich liebe <a href="http://vim.org">Vim</a>! Vim hat schon einige Jahre auf den Buckel und erscheint im ersten Licht als einfacher Texteditor. Aber der Schein trügt! Vim ist unglaublich mächtig. Sei es allein die persönliche Konfiguration, welche man diesem Editor unterziehen kann oder die Erweiterung des Texteditors zu einer, im Produktivbereich nutzbaren, IDE. Für Vim-User ist es bestimmt keine großes Unterfangen &#8211; Ich habe mich tierisch gefreut, als Ich darauf gestoßen bin &#8211; aber für die, die Vim möglicherweise weniger gut kennen: Ja! Es gibt auch ein passendes <a href="https://github.com/hallettj/jslint.vim">Plugin für JSLint</a>!</p>
<p>Ein JSLint-Plugin für Vim&#8230; Was soll das wohl bringen? Eigentlich liegt es klar auf der Hand. Für den Fall, dass ihr diesen Artikel lest, dadurch das erste Mal auf JSLint stoßt und wirklich vor habt, euren JavaScript-Code regelmäßig durch den Fleischwolf zu ziehen, werdet ihr sehr schnell feststellen, dass es recht nervig sein kann seinen JavaScript-Code aus der IDE in die Textarea zu kopieren. Wie einer meiner <a href="http://fhildebrandt.de/">Lieblings-Geeks</a> auch gern sagt:&#8221;Automatisiert &#8211; ist schön!&#8221;. Und genau das bewirkt das Plugin für Vim. Es ist so einfach zu installieren wie alle anderen Plugins für Vim. Eine Installationsbeschreibung findet ihr <a href="http://www.vim.org/scripts/script.php?script_id=2729">hier</a>.</p>
<p>Nachdem ihr das Plugin installiert habt, brauch ihr nichts weiter tun als das Kommando &#8220;:JSLintUpdate&#8221; auszuführen. Vim prüft nun bei jeder Änderung die ihr in eurem grade zu bearbeitenden File durchführt (sofern dies ein <span class="code">.js</span>-File ist), ob dieser JSLint übersteht. Vielmehr &#8211; JSLint wird direkt in Vim ausgeführt! Ihr erhaltet genau die gleichen Meldungen wie auf der <a href="http://jslint.com/">Website</a>; und nicht nur dass, Vim markiert alle Stellen in euren JavaScript-Code, an der JSLint gemeckert hat. Ist das nicht Klasse? Einfach mit dem Cursor über eine entsprechend markierte Stelle fahren und ihr erhaltet die Fehlermeldung in der Kommandozeile.</p>
<h2>Ein bekanntes Problem</h2>
<p>Leider kommt es bei einigen Installationen des Plugins zu einem Problem. Sobald das Plugin installiert ist, und ihr ein <span class="code">.js</span>-File öffnet, dies aber noch <strong>keinen</strong> JavaScript-Code enthält, bricht das Plugin zusammen und wirft folgende Fehlermeldung: &#8220;Could not invoke JSLint!&#8221;. Leider kann Ich nicht genau sagen, wie es zu diesem Fehler kommt, da ich aus dem Code des Plugins nicht schlau wurde. Aber kein Problem, es gibt ja Google und Google ist auch unser Freund. Wenn man weiß, wie man etwas in die Suchleiste eingeben kann um etwas zu suchen (&#8230;). Ich habe also recherchiert und bin öfters auf Beiträge gestoßen, bei denen Leute das gleiche Problem hatten. Schlussendlich gibt es einen Workaround. Hier der <a href="https://github.com/hallettj/jslint.vim/issues/13/#issuecomment-1625219">Issue</a> dazu. Damit dieser Workaround funktioniert, muss man allerdings <a href="http://nodejs.org/">Node</a> installiert haben. Das sollte aber wohl auch kein Problem sein.</p>
]]></content:encoded>
			<wfw:commentRss>http://hopelessart.com/2011/09/23/jslint-an-deiner-seite/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>JavaScript-Objekte erzeugen &#8211; wie man&#8217;s richtig macht</title>
		<link>http://hopelessart.com/2011/07/04/javascript-objekte-erzeugen-wie-mans-richtig-macht/</link>
		<comments>http://hopelessart.com/2011/07/04/javascript-objekte-erzeugen-wie-mans-richtig-macht/#comments</comments>
		<pubDate>Mon, 04 Jul 2011 08:11:09 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://localhost/hp-new/?p=86</guid>
		<description><![CDATA[Wenn man sich ein bisschen mit JavaScript befasst hat, fällt einem schnell auf, dass es viele verschiedene Wege gibt, verschiedene Dinge zu tun. Dies gilt zum Beispiel für Arrays, Objekten und auch Funktionen. Eigentlich sind natürlich alle diese Datentypen Objekte &#8230; <a href="http://hopelessart.com/2011/07/04/javascript-objekte-erzeugen-wie-mans-richtig-macht/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Wenn man sich ein bisschen mit JavaScript befasst hat, fällt einem schnell auf, dass es viele verschiedene Wege gibt, verschiedene Dinge zu tun. Dies gilt zum Beispiel für Arrays, Objekten und auch Funktionen. Eigentlich sind natürlich alle diese Datentypen Objekte in JavaScript. Es gibt drei Wege, Objekte in JavaScript zu erzeugen. Jeder dieser Wege bietet Vor- und Nachteile. Ich möchte euch zeigen, wie man es auf jeden Fall nicht tun sollte und natürlich auch, warum das Ganze so ist.</p>
<h2>Der Objekt-Konstruktor</h2>
<p>Der erste und stumpfsinnigste Weg ein Objekt zu erzeugen, ist mit Hilfe des Objekt-Konstruktors. Dieser Konstruktor bringt einige Kniffe mit sich, dazu komm Ich gleich. Hier erstmal ein Beispiel, wie die Verwendung eines Objekt-Konstruktors aussieht.</p>
<pre class="brush: js;">var Car = new Object();
Car.color = "#000000";

console.log(Car.constructor === Object);    // true
console.log(Car.color); // "#000000"</pre>
<p>Damit zeige ich euch wahrscheinlich nichts Neues. Aber schauen wir uns den Code mal genauer an. Wir erzeugen also ein Objekt <span class="code">Car</span> mit Hilfe des Objekt-Konstruktors. Das Ergebnis ist wie erwartet, wir erhalten ein Objekt und können dieses mit Eigenschaften und Methoden füllen. Würden wir an Stelle des Objekt-Konstruktors Objekt-Literale verwenden, erhalten wir das gleiche Ergebnis.</p>
<h2>Objekt-Literale</h2>
<pre class="brush: js;">var Car = {};    // leeres Objekt
Car.color = "#000000";

// Oder alles in einem Rutsch

var Car = {
    color: "#000000"
};</pre>
<p>Mit diesem Code erhalten wir also das gleiche Ergebnis, wie mit der Verwendung des Objekt-Konstruktors. Aber welche Variante soll man denn nun verwenden? Ganz einfach. Vergleichen wir beide Lösungen, stellen wir schnell fest, dass das Schreiben von Objekt-Literalen weniger Arbeit in Anspruch nimmt &#8211; also weniger Code. Ein weiter Grund den Objekt-Konstruktor <strong>nicht</strong> zu verwenden ist folgender:</p>
<p>Man kann dem Objekt-Konstruktor einen Parameter mitgeben. Das Ergebnis einer Objektinstanziierung mit Verwendung dieser Parameter kann sehr verwirrend sein. Übergeben wir nämlich einen Parameter, delegiert JavaScript die Objekterzeugung direkt weiter an einen der primitiven Datentypen. Hier ein Code zur Verdeutlichung.</p>
<pre class="brush: js;">var o = new Object();
console.log(o.constructor === Object);   // true

var o = new Object(2);
console.log(o.constructor === Number);   // true

var o = new Object(true);
console.log(o.constructor === Boolean);    // true</pre>
<p>Ouh. Habt ihr das gewusst? Also. Wenn es keinen Grund gibt, den Objekt-Konstruktor zu verwenden, verzichtet drauf. Verwendet lieber Objekt-Literale. Hier gibt es keine hässlichen Seiteneffekte und schlankeren Code hat man auch noch dazu.</p>
<h2>Die Konstruktor-Funktion</h2>
<p>Der dritte Weg ein Objekt zu erzeugen, wäre eine selbst implementierte Konstruktor-Funktion. In so einem Fall macht man nichts weiter, als eine Funktion zu definieren, welche irgendwas macht. Anschließend kann diese Funktion als Konstruktor-Funktion verwendet werden, in dem man den <span class="code">new</span>-Operator benutzt, um ein Objekt zu erzeugen. Und auch hier gibt es einige Kniffe. Schaut selbst.</p>
<pre class="brush: js;">function Car(manufacturer) {
    this.manufacturer = manufacturer;
    this.engineStarted = false;

    this.startEngine = function() {
        if (this.engineStarted === false) {
            this.engineStarted = true;
        }
    };
}

var bmw = new Car('BMW');
bmw.startEngine();</pre>
<p>Nun haben wir einen simplen Konstruktor um Autos zu erzeugen. Einen Haken hat dieses Muster allerdings noch. Angenommen, ein weiterer Entwickler verwendet euren Code und möchte ebenfalls Autos erzeugen, weiß allerdings nicht, dass er den <span class="code">new</span>-Operator verwenden muss. Momentmal&#8230; &#8220;verwenden MUSS&#8221;?! Yepp. Wird die Konstruktor-Funktion ohne <span class="code">new</span>-Operator aufgerufen, befindet sich unser Konstruktor nicht im Objekt-Kontext und ist nichts weiter, als eine normale Funktion. Was wiederum bedeutet, das <span class="code">this</span> keine Referenz auf unser Auto ist, sondern auf das globale Objekt zeigt. Keine Sorge. Auch für diesen Fall gibt es natürlich eine schöne Lösung.</p>
<h2>Das &#8220;new&#8221; erzwingen</h2>
<p>Mit dem Erzwingen ist an dieser Stelle aber nicht gemeint, den Benutzer eures Codes zu zwingen den <span class="code">new</span>-Operator zu verwenden und er andernfalls mächtigen Ärger bekommt, sondern viel mehr, die interne Nutzung von <span class="code">new</span> ohne es explizit aufrufen zu müssen bzw. auf jeden Fall unser das entsprechende Objekt zurück zugeben. Das Ergebnis soll also so aussehen, dass es möglich ist, unsere Konstruktor-Funktion entweder mit, oder ohne <span class="code">new</span> aufzurufen, man aber trotzdem das gleiche Ergebnis erhält. Nämlich unser Objekt.</p>
<p>Um das in die Wege zu leiten, gibt es mehrere Möglichkeiten. Die erste Möglichkeit wäre die Verwendung von <span class="code">that</span>. Anstatt also innerhalb unseres Konstruktors auf <span class="code">this</span> zu referenzieren, erzeugen wir ein leeres Objekt mit den Objekt-Literalen, füllen dies mit Eigenschaften und Methoden und geben dieses auch zurück. Somit bekommen wir in jedem fall unser Objekt.</p>
<pre class="brush: js;">function Car(manufacturer) {
    var that = {};

    that.manufacturer = manufacturer;
    that.engineStarted = false;

    that.startEngine = function() {
        if (that.engineStarted === false) {
            that.engineStarted = true;
        }
    };

    return that;
}

var bmw = new Car('BMW');
bmw.startEngine();

var vw = Car('VW');
vw.startEngine();</pre>
<p><span class="code">that</span> ist in diesem Fall ein eingespielter Bezeichner. Man könnte auch einen anderen Namen verwenden. Wie man sieht, bekommen wir unser Auto-Objekt, selbst wenn wir unsere Konstruktor-Funktion nicht mit dem <span class="code">new</span>-Operator aufrufen.</p>
<p>Die zweite Variante wäre einfach ein anonymes Objekt zurück zugeben. Hat ein bisschen was vom Modul-Pattern und ist im Großen und Ganzen eine etwas kürzere Variante des obigen Codes.</p>
<pre class="brush: js;">function Car(manufacturer) {
    return {
        manufacturer: manufacturer,
        engineStarted: false,
        startEngine: function () {
            if (this.engineStarted === false) {
                this.engineStarted = true;
            }
        }
    };
}</pre>
<p>Easy hah? Nur gibt es &#8211; wie immer &#8211; bei diesen beiden Lösungswegen ein Problem. Da wir nicht <span class="code">this</span> zurück geben (was wir auch nicht explizit tun müssen, da JavaScript in einem Objekt-Kontext ganz von allein <span class="code">this</span> zurück gibt), sondern einfach ein weiteres Objekt zurück geben, um dieses auf jeden Fall zu erhalten, geht der Prototype unseres Konstruktors verloren. Also brauchen wir eine Lösung, in der wir sicher stellen, das unser Konstruktor in jedem Fall mit <span class="code">new</span> aufgerufen wird. Klingt ein bisschen verdreht, ist aber gar nicht so schwer. Wir müssen nicht weiter tun, als zu prüfen, ob es sich bei <span class="code">this</span> im aktuellen Kontext um eine Referenz auf unser Auto-Objekt handelt. Ist dies nicht der Fall, müssen wir es eben explizit mit <span class="code">new</span> erzwingen.</p>
<pre class="brush: js;">function Car() {

    if (!(this instance of Car)) {
        return new Car();
    }

    this.prop = "this is a property";
}

Car.prototype.vehicle = "Bus";

var car = new Car();
var second_car = Car();

console.log(car.prop); // "this is a property"
console.log(second_car.prop); // "this is a property"

console.log(car.vehicle); // "Bus"
console.log(second_car.vehicle); // "Bus"</pre>
]]></content:encoded>
			<wfw:commentRss>http://hopelessart.com/2011/07/04/javascript-objekte-erzeugen-wie-mans-richtig-macht/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Ein bisschen was über Performance in JavaScript</title>
		<link>http://hopelessart.com/2011/06/29/ein-bisschen-was-uber-performance-in-javascript/</link>
		<comments>http://hopelessart.com/2011/06/29/ein-bisschen-was-uber-performance-in-javascript/#comments</comments>
		<pubDate>Wed, 29 Jun 2011 15:52:42 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://localhost/hp-new/?p=76</guid>
		<description><![CDATA[Performance ist wichtig. Das wissen wir. In JavaScript gibt es ein paar kleine Tricks, die dafür sorgen, euren Code schneller zu machen! Arrays sind eine wunderbare Erfindung, dass muss Ich euch wohl kaum erzählen. Über Arrays iterieren zu können, ist &#8230; <a href="http://hopelessart.com/2011/06/29/ein-bisschen-was-uber-performance-in-javascript/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Performance ist wichtig. Das wissen wir. In JavaScript gibt es ein paar kleine Tricks, die dafür sorgen, euren Code schneller zu machen! Arrays sind eine wunderbare Erfindung, dass muss Ich euch wohl kaum erzählen. Über Arrays iterieren zu können, ist noch viel toller! Allerdings kann die ein oder andere Loop dafür sorgen, eure Applikation langsamer zu machen.</p>
<h2>Caching rettet eurer App das leben</h2>
<p>Denkt man kurz darüber nach, mag es auf den ersten Blick kaum Dinge geben, die man an einer for-Schleife ändern sollte, um diese performanter zu machen. Aber der Teufel steckt im Detail. Besonders die Verwendung der hauseigenen <span class="code">length</span>-Eigenschaft kann in Verbindung einer for-Schleife eine Menge Zeit kosten. Hier mal ein üblicher Fall.</p>
<pre class="brush: js;">for (var i = 0; i &lt; my_array.length; i++) {
    // mach was
}</pre>
<p>Was wir hier sehen ist nichts sonderlich Ungewöhnliches. Wir haben unser Array und verwenden dessen Länge, um über einen bestimmten Bereich zu iterieren und irgendwas zu machen. Ganz normale Schleife, ganz normale Verwendung. Und genau das ist das Problem. Im obigen Code, muss bei jedem Durchlauf die Länge unseres Arrays ermittelt werden und zwar ganz allein durch den Aufruf der <span class="code">length</span>-Eigenschaft.</p>
<p>Würden wir nun über das DOM iterieren, arbeiten wir mit HTMLCollection-Objects. Und das, meine Damen und Herren, reißt unsere Performance NOCH ein Stückchen runter ins verderben. Und zwar ein ziemlich Großes. Wenn man sich das mal durch den Kopf gehen lässt, schreit es förmlich nach Optimierung. Warum? Ganz einfach. Die Länge unseres Arrays ist in diesem Fall konstant. Es muss nicht jedes mal ermittelt werden. Was also tun? Es ist einfach. Die Länge des Arrays muss nur zwischen gespeichert werden.</p>
<pre class="brush: js;">for(var i = 0; var length = my_array.length; i &lt; length; i++) {
    // mach was
}</pre>
<p>Und schon haben wir das Problem umgangen. Die Länge unseres Arrays wird initial einmal einer Variablen zugewiesen und von dort an als konstanter Wert verwendet, um den Bereich für die Iteration festzulegen.</p>
<p>Wir können den Code noch ein bisschen verkürzen, in dem wir das Single-Var-Pattern verwenden. Damit sparen wir uns die <span class="code">var</span>-Anweisungen innerhalb der for-Schleife:</p>
<pre class="brush: js;">var i = 0,
    my_array = [],
    length;

    for (; length = my_array.length; i &lt; length; i++;) {
        // mach was
    }</pre>
<p>Oder wir lassen <span class="code">length</span> einfach weg und zählen von <span class="code">i</span> auf 0 runter &#8211; noch weniger Code!</p>
<pre class="brush: js;">var i = my_array.length;

for(; i &gt; 0; i--) {
    // mach was
}</pre>
<p>Cool! Und es geht NOCH kürzer!! Wie? Mit einer while-Schleife</p>
<pre class="brush: js">var i = my_array.length;

while(i--) {
    // mach was
}</pre>
<p>Awesome! Dieser Code übersteht JSLint zwar nicht, aber wenn wir unsere Prioritäten ein wenig verlegen, sollte das kein Problem sein.</p>
]]></content:encoded>
			<wfw:commentRss>http://hopelessart.com/2011/06/29/ein-bisschen-was-uber-performance-in-javascript/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

