<?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>[ˈeks&#039;rei] α</title>
	<atom:link href="http://xrayalpha.de/blog/feed/" rel="self" type="application/rss+xml" />
	<link>http://xrayalpha.de/blog</link>
	<description></description>
	<lastBuildDate>Mon, 16 Jan 2012 14:09:05 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.2</generator>
		<item>
		<title>Scrollable Area und jQuery &#8211; Probleme und Lösungen</title>
		<link>http://xrayalpha.de/blog/2012/01/15/scrollable-area-und-jquery-probleme-und-losungen/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=scrollable-area-und-jquery-probleme-und-losungen</link>
		<comments>http://xrayalpha.de/blog/2012/01/15/scrollable-area-und-jquery-probleme-und-losungen/#comments</comments>
		<pubDate>Sun, 15 Jan 2012 16:31:20 +0000</pubDate>
		<dc:creator>julian</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[Javascript]]></category>
		<category><![CDATA[jQuery]]></category>
		<category><![CDATA[jScrollpane]]></category>
		<category><![CDATA[Scrollbar]]></category>

		<guid isPermaLink="false">http://xrayalpha.de/blog/?p=276</guid>
		<description><![CDATA[Seit nun über einem Jahr arbeite ich an einem großen Projekt im Bereich Gebäudeverwaltung. Es geht darum eine Vielzahl an Bestands- und Revisionsunterlagen einfach verwalten zu können um eine Immobilie kostenoptimiert betreiben zu können. In der Praxis gilt es, riesige &#8230; <a href="http://xrayalpha.de/blog/2012/01/15/scrollable-area-und-jquery-probleme-und-losungen/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Seit nun über einem Jahr arbeite ich an einem großen Projekt im Bereich Gebäudeverwaltung. Es geht darum eine Vielzahl an Bestands- und Revisionsunterlagen einfach verwalten zu können um eine Immobilie kostenoptimiert betreiben zu können.</p>
<p>In der Praxis gilt es, riesige Datenmengen für den User sinnvoll aufzubereiten und eine einfache Lösung bereitzustellen, mit der der Benutzer arbeiten kann.</p>
<p>Für die Auflistung von verbauten Teilen innerhalb eines Gebäudes sollte eine sogenannte &#8220;Scrollable Area&#8221; zum Einsatz kommen. Ein Bereich also, in dem der Benutzer sich durch alle Bauteile scrollen kann.<span id="more-276"></span></p>
<div id="attachment_280" class="wp-caption aligncenter" style="width: 510px"><a href="http://xrayalpha.de/blog/wp-content/uploads/scrollable.png"><img class="size-full wp-image-280" title="Scrollable Area" src="http://xrayalpha.de/blog/wp-content/uploads/scrollable.png" alt="" width="500" height="142" /></a><p class="wp-caption-text">Eine &quot;Scrollable Area&quot; mit custom Scrollbar</p></div>
<h2>jScrollpane</h2>
<p>Durch die Vorgabe des Designs mussten wir eine Lösung finden, die es uns erlaubt, die Scrollbar optisch anzupassen. Wagt man eine Suche mit Google nach Stichwörtern wie &#8220;Scrollpane jQuery&#8221; stößt man zügig auf das jQuery Plugin &#8220;<a href="http://jscrollpane.kelvinluck.com/">jScrollpane</a>&#8220;.<br />
Dieses sollte also nun bei uns zum Einsatz kommen.<br />
Vorteile hierbei waren die Kompatibilität zu diversen Browsern sowie die ausführliche API.</p>
<p>Die Umsetzung von jScrollpane ist recht schnell erklärt und lässt sich am Besten mit folgendem Bild veranschaulichen:</p>
<p><a href="http://xrayalpha.de/blog/wp-content/uploads/scrollable-2.png"><img class="aligncenter size-full wp-image-283" title="scrollable-2" src="http://xrayalpha.de/blog/wp-content/uploads/scrollable-2.png" alt="" width="500" height="246" /></a></p>
<p>Der rote Container ist ein Wrapper, der die CSS Eigenschaft <em>overflow: hidden; </em>besitzt. Dieser legt zusätzlich die Höhe und Breite des scrollbaren Bereichs fest.<br />
Der grüne Container beinhaltet den eigentlichen Content. Durch Scrollen wird nun der grüne Bereich nach oben oder unten geschoben.</p>
<p><a href="http://xrayalpha.de/blog/wp-content/uploads/scrollable-3.png"><img class="aligncenter size-full wp-image-284" title="scrollable-3" src="http://xrayalpha.de/blog/wp-content/uploads/scrollable-3.png" alt="" width="500" height="246" /></a></p>
<p>In der Theorie funktioniert das wunderbar für kleine statische Bereiche. Dafür wurde das Plugin wohl auch geschrieben. Nachdem ich ein paar Benchmarks gemacht hatte, wurde mir aber rasch klar, dass das für unsere Anwendung nicht ohne Weiteres funktioniert.</p>
<h2>Probleme</h2>
<p>Bei uns ist der Anwendungsfall etwas komplexer: Der Inhalt wird per Ajax Call geladen.<br />
Anschließend muss die Scrollbar reinintialisiert werden. Außerdem haben wir teilweise große Datenmengen die angezeigt werden müssen. Bei einer Tabelle mit 1000 Einträgen war die Bedienung schon sehr hakelig. Bei 5000 Einträgen unbenutzbar.</p>
<h2><strong>Lösung 1: Endlos-Scrolling</strong></h2>
<p><strong> </strong>Die erste Lösung bestand in einer Art &#8220;Endlos-Scrolling&#8221;. Beim ersten Aufruf der Tabelle werden 100 Einträge geladen. Kommt der Benutzer zu dessen Ende, werden die nächsten 100 Einträge geladen und unten angehängt. Hierdurch wird die Erstinitialisierung deutlich schneller und blockiert nicht mehr das Frontend für einige Sekunden während das jQuery Plugin die Größe der Scrollbar berechnet.<br />
In unter 3% der Fälle muss tatsächlich Content nachgeladen werden, da der Benutzer die Suchfunktion bemüht und somit deutlich schneller am Ziel ist.</p>
<p>Trotzdem bestand immernoch das ursprüngliche Problem: Sind in der Tabelle mehr als 1000 Einträge, wird die gesamte Seite unbenutzbar.<br />
Die denkbar einfachste Lösung wäre die Standard-Scrollbar gewesen, um dessen Darstellung sich der Browser selbst kümmert. Dies war aber mit dem Kunden nicht zu vereinbaren, da hierbei das Aussehen der Scrollbar nicht angepasst werden kann.</p>
<h2>Lösung 2: Mein eigenes Plugin</h2>
<p>Ich wusste, irgendwie muss ich das vorhandene Design mit der Browser Scrollbar kombinieren.<br />
Die angestrebte Lösung nach etwas Brainstorming ist denkbar einfach:</p>
<p><a href="http://xrayalpha.de/blog/wp-content/uploads/scrollable-42.png"><img class="aligncenter size-full wp-image-291" title="scrollable-4" src="http://xrayalpha.de/blog/wp-content/uploads/scrollable-42.png" alt="" width="509" height="1279" /></a></p>
<p>Ich habe einen normalen <em>&lt;div&gt; </em>mit der CSS-Eigenschaft <em>overflow: scroll;</em>. Dieser sorgt für den Scrollbaren Bereich. Über den vom Browser erzeugten Scrollbalken liegt mein Eigener. Mithilfe von jQuery fange ich das <em>.scroll()</em> Event ab und positioniere meinen eigenen Balken.<br />
Insgesamt waren für diese Lösung nur ungefähr 200 Zeilen Code nötig. Das proof-of-concept hatte ich an einem Abend geschrieben.<br />
Die Hauptarbeit bestand in der Berechnung der Höhe des Scrollbalkens sowie dessen Positionierung. Das Scrollen per Drag &amp; Drop sowie Pfeiltasten waren dann nurnoch Fleißarbeit.</p>
<p><a href="http://xrayalpha.de/blog/wp-content/uploads/scrollable-5.png"><img class="aligncenter size-full wp-image-292" title="scrollable-5" src="http://xrayalpha.de/blog/wp-content/uploads/scrollable-5.png" alt="" width="502" height="636" /></a></p>
<p>Das Scrollen von einer Tabelle mit 10000 Rows ist immernoch ohne merkbare Performance Einbußen möglich.</p>
<p>Veröffentlichen werde ich das geschriebene Plugin vorerst nicht, da dafür noch diverse Anpassungen nötig sind. Solltet ihr dennoch Interesse daran haben, schreibt mir doch eine kurze Mail.</p>
]]></content:encoded>
			<wfw:commentRss>http://xrayalpha.de/blog/2012/01/15/scrollable-area-und-jquery-probleme-und-losungen/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Englische Serien und Deutsche Untertitel &#8211; Die Entstehung</title>
		<link>http://xrayalpha.de/blog/2012/01/12/englische-serien-und-deutsche-untertitel-die-entstehung/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=englische-serien-und-deutsche-untertitel-die-entstehung</link>
		<comments>http://xrayalpha.de/blog/2012/01/12/englische-serien-und-deutsche-untertitel-die-entstehung/#comments</comments>
		<pubDate>Thu, 12 Jan 2012 12:18:28 +0000</pubDate>
		<dc:creator>julian</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[Unterhaltung]]></category>
		<category><![CDATA[Subfactory]]></category>
		<category><![CDATA[Subtitle]]></category>

		<guid isPermaLink="false">http://xrayalpha.de/blog/?p=263</guid>
		<description><![CDATA[Ich schaue gerne Serien. Am liebsten im Originalton. Da Serien doch unterschiedlich schwer zu verstehen sind, nehme ich gerne die vielen kostenlosen Untertitel (Sub) in Anspruch. Diese werden von fleißigen Usern erstellt und sind meistens mehr als brauchbar. Im deutschen &#8230; <a href="http://xrayalpha.de/blog/2012/01/12/englische-serien-und-deutsche-untertitel-die-entstehung/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Ich schaue gerne Serien. Am liebsten im Originalton.<br />
Da Serien doch unterschiedlich schwer zu verstehen sind, nehme ich gerne die vielen kostenlosen Untertitel (Sub) in Anspruch. Diese werden von fleißigen Usern erstellt und sind meistens mehr als brauchbar.</p>
<p>Im deutschen Raum gibt es zwei große Communitys, die sich der Erstellung der Untertitel widmen: <a title="TV 4 User" href="http://tv4user.de" target="_blank">TV4User</a> und <a title="Subcentral" href="http://subcentral.de" target="_blank">Subcentral</a>.<br />
Beide Seiten sind in einem großen Forum organisiert. Es gibt Unterforen für jede nur denkbare Serie und die Auswahl ist jeweils riesig. Untertitel erscheinen meiner Erfahrung nach durchschnittlich 5-7 Tage nach der Ausstrahlung im Amerikanischen Fernsehen (&#8220;Airdate&#8221;).</p>
<p><span id="more-263"></span></p>
<p>Nachdem ich diesen Service nun seit Jahren dankend in Anspruch nehme, wollte ich den Prozess dahinter kennenlernen, den ich im Folgenden erläutern werde. Bei meinen Nachforschungen habe ich mit einigen, sogenannten, &#8220;Subbern&#8221; gesprochen, die mir den Ablauf in ihren Teams geschildert haben. Dabei musste ich leider auch feststellen, dass die Subber-Gemeinde eine sehr eingeschworene Gesellschaft ist. Meine Anfragen wurden häufig misstrauisch nach ihrem Grund hinterfragt. Oft habe ich die Frage gestellt, was sich denn am bisherigen Arbeitsablauf verändern ließe. Jedesmal musste ich hören, dass der Prozess so wunderbar funktioniere. Verbesserungen sind hier nicht erwünscht.</p>
<h2>Schritt 1: Die Beschaffung</h2>
<p>Alles beginnt mit der Beschaffung der originalen Subs. Nach einem Gesetz in den Vereinigten Staaten müssen die Fernsehsender nach der Ausstrahlung einer Episode englische Untertitel, für beispielweise Hörgeschädigte, bereitstellen.<br />
Diese Subs sind frei verfügbar und dienen als Vorlage für deutsche Übersetzungen.<br />
<a title="addic7ed.com" href="http://addic7ed.com">addic7ed</a>  sei an dieser Stelle als Quelle genannt.</p>
<h2>Schritt 2: Vorbearbeitung und Timings</h2>
<p>Nachdem sich der originale Sub im Besitz des Teamleiters befindet, macht er sich daran, den Sub zu bearbeiten. Zuerst fliegen häufig Items heraus, die nur für Hörgeschädigte relevant sind. Das sind Dinge wie z.B. Gesang oder Lachen. Entfernt werden diese mit einem einfachen Texteditor. Danach wird der bearbeitete Sub in ein Programm wie <a href="http://www.urusoft.net/products.php" target="_blank">Subtitle Workshop</a> geladen. Dieses Programm erlaubt es, einen Videoclip anzusehen und parallel dazu den Sub zu bearbeiten. In diesem Schritt wird überprüft, ob die Untertitel zur richtigen Zeit (&#8220;Timing&#8221;) erscheinen. Ist dies nicht der Fall, werden die Items umpositioniert. Ein Sub mit falschen Timings ist unbrauchbar.</p>
<h2>Schritt 3: Verteilung und Übersetzung</h2>
<p>Besteht ein Team aus mehreren Übersetzern, wird der Sub nun vom Teamleiter in einzelne Teile zerlegt. Diese Fallen nicht unbedingt gleich groß aus, da auf die Fähigkeiten und Geschwindigkeit des einzelnen Übersetzers Rücksicht genommen wird.<br />
Das zerlegen passiert wieder mit einem einfachen Texteditor. Wie aufwendig und nervig diese Arbeit ist, kann sich jeder vorstellen.</p>
<p>Ist die Datei zerteilt, beginnt die Verteilung der einzelnen Stücke. Die Kommunikation findet über IM Dienste wie ICQ, per E-Mail oder über foreninterne Nachrichtensysteme statt.<br />
Hat der Übersetzer seinen Teil erhalten, beginnt er mit der Übersetzung, wobei hier wieder <a href="http://www.urusoft.net/products.php" target="_blank">Subtitle Workshop</a> zum Einsatz kommt.<br />
Bei der Übersetzung selber sind einige Dinge zu beachten, auf die ich an dieser Stelle mangels Kompetenz nicht eingehen kann. Ein Beispiel für eine Schwierigkeit ist aber die Unterscheidung zwischen &#8220;Sie&#8221; und &#8220;Du&#8221; im Deutschen, da sich der Unterschied aus dem englischen Original nicht erschließen lässt.</p>
<h2>Schritt 4: Korrektur</h2>
<p>Wurde die Übersetzung der einzelnen Teile fertiggestellt, gehen diese zurück an denjenigen, der für die Korrektur verantwortlich ist. Dieser setzt alles wieder zusammen und beginnt mit der Korrektur. Abermals wird die Episode parallel geschaut, um auch kontextuelle Fehler beseitigen zu können. Zusätzlich wird auf die Timings und auf die Länge der einzelnen Items geachtet. Diese sollten maximal zwei Zeilen mit jeweils nicht mehr als 50 Zeichen aufweisen.</p>
<h2>Schritt 5: Verteilung an den User</h2>
<p>Ist die gesamte Untertitel-Datei fertig, wird sie gepackt und in den passenden Forenthread hochgeladen, von wo sie für den Endbenutzer dann zum herunterladen bereit steht.</p>
<h1>Mein Fazit:</h1>
<p>Dieser gesamte Prozess ist durch seine jetzige Koordination und Kommunikation ziemlich zeitaufwendig. Da ich dieser Community gerne etwas zurückgeben würde, bin ich aktuell damit beschäftigt, technische Lösungen zu finden, um den Arbeitsablauf zu vereinfachen.<br />
Ein Ansatz dafür ist eine Zentralisierung des Workflows in einer Software auf Webbasis, welche ich zur Zeit beispielhaft implementiere.</p>
<p><strong>Über Fragen und Anmerkungen würde ich mich sehr freuen.</strong></p>
]]></content:encoded>
			<wfw:commentRss>http://xrayalpha.de/blog/2012/01/12/englische-serien-und-deutsche-untertitel-die-entstehung/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Android Entwickler gesucht</title>
		<link>http://xrayalpha.de/blog/2011/12/15/android-entwickler-gesucht/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=android-entwickler-gesucht</link>
		<comments>http://xrayalpha.de/blog/2011/12/15/android-entwickler-gesucht/#comments</comments>
		<pubDate>Thu, 15 Dec 2011 08:24:19 +0000</pubDate>
		<dc:creator>julian</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[Android]]></category>

		<guid isPermaLink="false">http://xrayalpha.de/blog/?p=249</guid>
		<description><![CDATA[Für unsere laufende Projektentwicklung und neue Projekte suchen wir derzeit Java-Entwickler (Android) (m/w) auf Vollzeitbasis in München. &#160; &#160; &#160; Wir bieten: sehr gute Aufstiegsmöglichkeiten in einem jungen, dynamischen Unternehmen Webprojekte und Entwicklung von mobilen Applikationen enge Zusammenarbeit mit Markengrößen &#8230; <a href="http://xrayalpha.de/blog/2011/12/15/android-entwickler-gesucht/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p><a href="http://xrayalpha.de/blog/wp-content/uploads/android-logo-white.png"><img class="alignleft size-thumbnail wp-image-253" title="android-logo-white" src="http://xrayalpha.de/blog/wp-content/uploads/android-logo-white-150x150.png" alt="" width="150" height="150" /></a>Für unsere laufende Projektentwicklung und neue Projekte suchen wir derzeit Java-Entwickler (Android) (m/w) auf Vollzeitbasis in München.</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><span id="more-249"></span></p>
<p>&nbsp;</p>
<p><strong>Wir bieten:</strong></p>
<ul>
<li>sehr gute Aufstiegsmöglichkeiten in einem jungen, dynamischen Unternehmen</li>
<li>Webprojekte und Entwicklung von mobilen Applikationen</li>
<li>enge Zusammenarbeit mit Markengrößen wie Samsung und jungen, aufstrebenden Unternehmen</li>
<li>regelmäßige Weiterbildungsmaßnahmen</li>
<li>eigene Projektverantwortung</li>
<li>nettes und sympathisches Arbeitsklima</li>
</ul>
<p><strong>Aufgaben:</strong></p>
<ul>
<li>Weiterentwicklung von bestehenden mobilen Applikationen, großen Portalen, CM Systemen oder Community Plattformen</li>
<li>Konzeption und Entwicklung von neuen mobilen Applikationen oder Webapplikationen</li>
<li>Eigenverantortliches und zuverlässiges Arbeiten</li>
</ul>
<p><strong>Anforderungen:</strong></p>
<ul>
<li>sehr gute Kenntnisse in Java, MySQL, Javascript, HTML und CSS</li>
<li>Erfahrung mit der Erstellung von mobilen Applikationen für Android</li>
<li>Erfahrung mit PHP wünschenswert</li>
</ul>
<p><a href="http://spinsoft.de/Kontakt/Jobs/Java-Android-Entwickler">http://spinsoft.de/Kontakt/Jobs/Java-Android-Entwickler</a></p>
]]></content:encoded>
			<wfw:commentRss>http://xrayalpha.de/blog/2011/12/15/android-entwickler-gesucht/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Test: iRobot Roomba 563PET</title>
		<link>http://xrayalpha.de/blog/2010/07/14/test-irobot-roomba-563pet/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=test-irobot-roomba-563pet</link>
		<comments>http://xrayalpha.de/blog/2010/07/14/test-irobot-roomba-563pet/#comments</comments>
		<pubDate>Wed, 14 Jul 2010 08:13:00 +0000</pubDate>
		<dc:creator>julian</dc:creator>
				<category><![CDATA[Gadgets]]></category>

		<guid isPermaLink="false">http://nerdbeere.org/blog/2010/07/14/test-irobot-roomba-563pet/</guid>
		<description><![CDATA[Als Gadget Geek bin ich permanent auf der Suche nach witzigen Gadgets für Daheim und Unterwegs. Nun, nachdem wir ohnehin einen Staubsauger brauchten, haben wir uns einen Roomba zugelegt. Für die Unwissenden unter euch: Die Firma iRobot produziert für den &#8230; <a href="http://xrayalpha.de/blog/2010/07/14/test-irobot-roomba-563pet/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Als Gadget Geek bin ich permanent auf der Suche nach witzigen Gadgets für Daheim und Unterwegs. Nun, nachdem wir ohnehin einen Staubsauger brauchten, haben wir uns einen Roomba zugelegt. Für die Unwissenden unter euch: Die Firma iRobot produziert für den Heimanwender Roboter, die einem in der täglichen Hausarbeit zur Hand gehen.</p>
<blockquote><p>&#8220;Als Gadget Geek bin ich permanent auf der Suche nach witzigen Gadgets&#8221;</p></blockquote>
<p>Erstmal schreckt natürlich der stolze Preis von ca. 380€ ab, davon haben wir uns allerdings nicht beeindrucken lassen. Über Amazon wurde dann bestellt und eine Woche später (letzten Samstag) war das Gerät fertig aufgeladen und einsatzbereit. Eine dicke Anleitung in mehreren Sprachen liegt bei, wurde aber ignoriert. Die Steuerung ist quasi intuitiv, viel falsch machen kann man da nicht.</p>
<p><span id="more-188"></span></p>
<p>Zuerst wurde das Wohnzimmer um herumstehende Gegenstände bereinigt, dann ging es los. Ein Druck auf &#8220;Clean&#8221; und ein Sound in feinster 8-bit Super Mario manier ertönt. Dann legt unser &#8220;Devastator&#8221; los.</p>
<p>Er fährt gerade aus, kommt an unseren Schrank, dreht sich und fährt mit seiner äußeren Bürste schön am Schrank entlang. Oh, ein Hindernis. Das erkennt der Roomba und umfährt es erfolgreich. Nach zwei Stunden saugen meldet er Vollzug und begibt sich automatisch wieder zu seiner Aufladestation um auf Säuberung zu warten.</p>
<p>Der Geräuschpegel hält sich während der gesamten Putzorgie völlig im Rahmen. Er ist wesentlich leiser als ein Staubsauger. Das liegt primär daran, dass das Gerät mehr mit Bürsten als staubsaugertypisch mit einem Vaccum zu arbeiten. Das Ergebnis überrascht, viel hatten wir uns nicht erhofft, aber nach den ersten Tests wollen wir ihn nicht mehr hergeben.</p>
<p>Natürlich ersetzt er keinen normalen Staubsauger. Ecken erreicht er nicht vollständig, geschweige denn von Schränken oder ähnlichem. Als ideale Ergänzung werden wir uns also noch einen kleinen Handstaubsauger zulegen.</p>
<p>Die Zeitsteuerung wurde noch nicht vollständig getestet, auch die virtuellen Wände mussten bisher echten Hindernissen weichen. Über Stufen von 2cm kommt er übrigens nicht drüber, da auch diese als Hindernis erkannt werden.</p>
<p>Bilder und Videos sowie meine Langzeiterfahrung werde ich noch nachreichen, sobald es mehr zu berichten gibt. Wer das Geld in eine Haushaltshilfe investieren kann und will, der sollte sich den Roomba mal ansehen. Die Zeit, die man dadurch Spart ist Gold wert, im wahrsten Sinne des Wortes.</p>
]]></content:encoded>
			<wfw:commentRss>http://xrayalpha.de/blog/2010/07/14/test-irobot-roomba-563pet/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Tutorial: Facebook Connect</title>
		<link>http://xrayalpha.de/blog/2010/06/11/tutorial-facebook-connect/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=tutorial-facebook-connect</link>
		<comments>http://xrayalpha.de/blog/2010/06/11/tutorial-facebook-connect/#comments</comments>
		<pubDate>Fri, 11 Jun 2010 08:12:17 +0000</pubDate>
		<dc:creator>julian</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[Facebook Connect]]></category>

		<guid isPermaLink="false">http://nerdbeere.org/blog/?p=179</guid>
		<description><![CDATA[Ich habe mich vor ein paar Wochen mal mit OAuth und Facebook Connect ausseinandergesetzt. Falls jemand das in Zukunft vorhat, für den hab ich jetzt ein cooles Tutorial: http://net.tutsplus.com/tutorials/php/how-to-authenticate-your-users-with-facebook-connect/ Möglicherweise finde ich nach meinem Urlaub ja Zeit, das ganze anschaulich &#8230; <a href="http://xrayalpha.de/blog/2010/06/11/tutorial-facebook-connect/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Ich habe mich vor ein paar Wochen mal mit OAuth und Facebook Connect ausseinandergesetzt.<br />
Falls jemand das in Zukunft vorhat, für den hab ich jetzt ein cooles Tutorial:</p>
<blockquote><p><a href="http://net.tutsplus.com/tutorials/php/how-to-authenticate-your-users-with-facebook-connect/" target="_blank">http://net.tutsplus.com/tutorials/php/how-to-authenticate-your-users-with-facebook-connect/</a></p></blockquote>
<p>Möglicherweise finde ich nach meinem Urlaub ja Zeit, das ganze anschaulich in CakePHP zu implementieren, schließlich könnte man das ja immer mal wieder brauchen.<br />
Ich brauch es ua. für Meetr.</p>
]]></content:encoded>
			<wfw:commentRss>http://xrayalpha.de/blog/2010/06/11/tutorial-facebook-connect/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Quicktip: Auth Component von CakePHP und ihre Tücken</title>
		<link>http://xrayalpha.de/blog/2010/06/08/quicktip-auth-component-von-cakephp-und-ihre-tucken/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=quicktip-auth-component-von-cakephp-und-ihre-tucken</link>
		<comments>http://xrayalpha.de/blog/2010/06/08/quicktip-auth-component-von-cakephp-und-ihre-tucken/#comments</comments>
		<pubDate>Tue, 08 Jun 2010 10:23:47 +0000</pubDate>
		<dc:creator>julian</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[CakePHP]]></category>

		<guid isPermaLink="false">http://nerdbeere.org/blog/?p=165</guid>
		<description><![CDATA[Die Auth Component von CakePHP ist ein einfach zu bedienendes aber schönes Werkzeug um schnell einen Login auf die Beine zu stellen. Leider hatte ich immer wieder komische Probleme damit bzw. es lief anfänglich nie wie ich wollte. Hier ein &#8230; <a href="http://xrayalpha.de/blog/2010/06/08/quicktip-auth-component-von-cakephp-und-ihre-tucken/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Die Auth Component von CakePHP ist ein einfach zu bedienendes aber schönes Werkzeug um schnell einen Login auf die Beine zu stellen. Leider hatte ich immer wieder komische Probleme damit bzw. es lief anfänglich nie wie ich wollte.</p>
<p>Hier ein paar Dinge die man wissen sollte:<br />
<strong>1.</strong> Passwörter werden mit der Methode Auth::password gehasht. Dem liegt standardmäßig ein salted SHA1 Hashing Verfahren zugrunde.<br />
Beispiel:</p><pre class="crayon-plain-tag"><code>$this-&gt;data['User']['password'] = $this-&gt;Auth-&gt;password($this-&gt;data['User']['password']);
$this-&gt;User-&gt;create();
$this-&gt;User-&gt;save($this-&gt;data);</code></pre><p><strong>2.</strong> Cake Konvention für das DisplayField ist, dass der Feldname &#8220;name&#8221; sein muss. Die Auth Component erwartet aber, dass der Username auch &#8220;username&#8221; heißt, sonst funktioniert das ganze nicht.</p>
<p>Man kann sich hiermit Abhilfe schaffen:</p><pre class="crayon-plain-tag"><code>function beforeFilter() {
        parent::beforeFilter();
	$this-&gt;Auth-&gt;fields['username'] = 'name';
}</code></pre><p><strong>3.</strong> Um einzelne Actions von der Auth Component zu befreien gibt es Auth::allow.</p>
<p>Beispiel:</p><pre class="crayon-plain-tag"><code>function beforeFilter() {
        parent::beforeFilter();
        // Einzelne Actions erlauben:
        $this-&gt;Auth-&gt;allow('index', 'foobar');
        // Alle Actions erlauben:
        $this-&gt;Auth-&gt;allow('*');
}</code></pre>
]]></content:encoded>
			<wfw:commentRss>http://xrayalpha.de/blog/2010/06/08/quicktip-auth-component-von-cakephp-und-ihre-tucken/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Kommentar: Keynote Apple WWDC 2010</title>
		<link>http://xrayalpha.de/blog/2010/06/07/kommentar-keynote-wwdc-2010/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=kommentar-keynote-wwdc-2010</link>
		<comments>http://xrayalpha.de/blog/2010/06/07/kommentar-keynote-wwdc-2010/#comments</comments>
		<pubDate>Mon, 07 Jun 2010 16:37:38 +0000</pubDate>
		<dc:creator>julian</dc:creator>
				<category><![CDATA[Gadgets]]></category>
		<category><![CDATA[Hardware]]></category>

		<guid isPermaLink="false">http://nerdbeere.org/blog/?p=95</guid>
		<description><![CDATA[Selbstversuch: Ich werde hier in meinen eigenen virtuelle 4 Wänden mal versuchen die Keynote der diesjährigen WWDC etwas (auf meine Weise) zu begleiten. 20:56: Schade, das wars auch schon. Kein OS 10.6.4, keine neuen Macs, kein kostenloses Mobile Me.. Danke &#8230; <a href="http://xrayalpha.de/blog/2010/06/07/kommentar-keynote-wwdc-2010/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p><strong>Selbstversuch: Ich werde hier in meinen eigenen virtuelle 4 Wänden mal versuchen die Keynote der diesjährigen WWDC etwas (auf meine Weise) zu begleiten.</strong></p>
<p><strong>20:56</strong>: Schade, das wars auch schon. Kein OS 10.6.4, keine neuen Macs, kein kostenloses Mobile Me..<br />
Danke fürs Lesen, ich hoffe ich hab dem ganzen übertriebenen Geschwafel eine etwas eigene Note geben können.</p>
<p><strong>20:54</strong>: &#8220;I put up this slide a little earlier this year. It represents what Apple is all about. We&#8217;re not just a tech company. Apple is more than that. It&#8217;s tech and <strong>humanity</strong>. It&#8217;s the hardware and the software working together. It&#8217;s not just a great new camera system, it&#8217;s the editing too, it&#8217;s not just a front-facing camera, it&#8217;s that plus 18 months of work on the software side. It&#8217;s the complete solution, so all of us don&#8217;t have to be system integrators.&#8221; Ein Wort: FOXCONN!11</p>
<p><strong>20:52</strong>: &#8220;This is going to change everything&#8230; all over again.&#8221; Na da bin ich gespannt. Die Welt an Revolutionen ist es jetzt auch nicht.</p>
<p><strong>20:50</strong>. Sie zeigen gerade ein Video über die Produktion. Komisch, von Foxconn und den unmenschlichen Bedingungen dort für deren Arbeiter ist aber keine Rede.</p>
<p><strong>20:47</strong>: Kostenloses Update auf iOS4? Was ist denn mit Apple los? Das ältere Geräte nicht alle Features unterstützen werden, wussten wir ja schon. Und am 21. Juni beginnt der Rollout, da bin ich doch garnicht da!</p>
<p><strong>20:43</strong>: Vorverkauf startet Morgen in einer Woche. Auch für Deutschland.</p>
<p><strong>20:41</strong>: Der Preis: 299$ die 32GB Variante, $199 die 16GB Variante. Mit Vertrag bei AT&amp;T, scheinbar exklusiv. Lief deren Vertrag nicht dieses Jahr aus? Wurde ja über WiMAX spekuliert.</p>
<p><strong>20:40</strong>: Oh, ziemlich cool. Sehe ich richtig, dass das iphone 4 ua. SIP untersützt? Das wäre ja mal was.</p>
<p><strong><span id="more-95"></span>20:37</strong>: Facetime ist übrigens WiFi only, mein HTC konnte das über UMTS auch, tolle Wurst. Das mit dem WiFi ausschalten wird irgendwie zum running Gag. Aber eventuell kann man ja tolle Sachen mit der Front Kamera anstellen, wenn das die API zulässt.</p>
<p><strong>20:33</strong>: Facetime! Toll, Videcalls, das konnte ja mein uraltes HTC schon.. Ist jetzt auch nicht so, als wäre das irgendwie ein sinnvolles Feature, ernsthaft.</p>
<p><strong>20:32</strong>: Oh, da ist noch was.. SPANNUNG!1</p>
<p><strong>20:30</strong>: Noch ein Zitat: &#8220;und steve was machen wir heute nacht&#8221; &#8211; &#8220;das selbe wie jeden abend&#8230;&#8221;. So, that is iAd..</p>
<p><strong>20:28</strong>: Immernoch iAds, gut, das ist eigentlich eine Entwicklerkonferenz, aber jetzt ist es auch wieder gut. Letztes Jahr ging die Keynote übrigens 1.5h ziemlich genau, das wird knapp.</p>
<p><strong>20:22</strong>: Ich vergaß: iAds ist die Nummer 8, also auch nichts wirklich Neues, da bin ich eher gespannt, mit was da Google kontert. Immerhin ist Werbung ja deren Territorium.</p>
<p><strong>20:21</strong>: Über den einen oder anderen Kommentar würde ich mich übrigens freuen, ein paar Leser habe ich ja. :)</p>
<p><strong>20:20</strong>: *gähn* Wo bleibt das Mobile Me Update?</p>
<p><strong>20:17</strong>: #7 ist iBooks für das iPhone. Oh WOW!1 Nicht überraschend und auch irgendwie sinnfrei. Auf dem Display lässt sich imo nicht sinnvoll lesen, das hab ich schon versucht. Wenns das jetzt zum iPhone 4 war, bin ich trotzdem begeistert. Es ist ein schönes Gerät mit konsequenten Erweiterungen im Bezug auf Hardware, Software und Design. Was erwarten wir denn mehr?</p>
<p><strong>20:16</strong>: Oh, eine quasi final version des iOS4 kommt wohl schon Heute zu den Entwicklern.</p>
<p><strong>20:15</strong>: Haha, Bing Integration. Was ist denn hier los? Nicht, dass das nicht zuvor schom rumored wurde, aber lustig finde ich es allemal. Yahoo kommt auch an Board.</p>
<p><strong>20:11</strong>: Über iOS4 berichten spar ich mir jetzt, das hatten wir wirklich schon, und bis jetzt kam da auch nichts Neues. Die Inbox sieht übrigens wesentlich aufgeräumter aus. Wenn das Teil nun auch noch IMAP Ordner automatisch syncen würde, wäre ich sogar zufrieden.</p>
<p><strong>20:09</strong>: &#8220;Neuigkeit&#8221; #6: iOS4 formerly known as iPhone OS4. Ach komm Steve, das kennen wir doch schon.</p>
<p><strong>20:08</strong>: Steve bittet das Publikum ihr WiFi und 3g auszuschalten, warum auch immer. Da hagelts sicher gleich wieder Hausverbote, wenn das jemand nicht macht.. wie Engadget beispielsweise.</p>
<p><strong>20:04</strong>: &#8220;Isn&#8217;t that awesome? So iMovie for iPhone&#8230; you&#8217;ll be able to buy this for $4.99&#8230; if we approve it.&#8221; hahahaa.. Preislich hält sich das ja noch im Rahmen. Für Pages, Numbers und Keynote zahlt man stolze 7.99€</p>
<p><strong>20:03</strong>: Gibt wohl 5 Unterschiedliche Themen, die sich je nach Standpunkt der aufgenommen Videos adden.  5?</p>
<p><strong>20:02</strong>: Übergänge, Photos, Hintergrundmusik, Schneiden von Clips, Projekte.. scheint alles da zu sein. Aber ehrlich, wer will das denn auf dem iPhone machen? Anyways, cooles Gadget und zum Android User Ärgern langts allemal!</p>
<p><strong>20:00</strong>: Der vollkommen richtige Weg: iMovie für das iPhone. Da spricht jetzt der Chefentwickler drüber.</p>
<p><strong>19:58</strong>: WAT? 720p Video recording bei 30fps? Das will ich mit eigenen Augen sehen. Ich möchte kurz einen Kumpel zitieren, dem ich nur voll zustimmen kann: &#8220;das teil is einfach mal ein arschtritt für alle anderen smartphonehersteller&#8221;</p>
<p><strong>19:56</strong>: Neuerung #5: Ein ganz neues Kamerasystem. Scheinbar ein neuer Sensor der bessere Bilder im Dunkeln macht? Die Megapixel wurden auf 5 erhöht, was jetzt aber niemanden wirklich überraschen dürfte. Oh, digital Zoom gibts jetzt auch.</p>
<p><strong>19:54</strong>: Steve zeigt grad, wie die Beschleunigungssensoren um eine weitere Achse ergänzt wurden.. mit &#8220;Jenga&#8221;.</p>
<p><strong>19:52</strong>: Das iPhone 4 untersützt nun also auch den WLAN n-Standard, da würde mich interessieren in welchem Netz der im Endeffekt funkt. 5GHZ? Man weiß es nicht. Bei den anderen technischen Details lese ich soweit nichts spektakulär Neues raus.. A4 Chip, HSUPA und &#8220;dual mic noise suppression&#8221; wären hier zu erwähnen.</p>
<p><strong>19:48</strong>: Werden hochskaliert.. &#8220;It makes it so your apps run automatically on this, but it renders your text and controls in the higher resolution..&#8221;. Was mir nicht gefällt, auch im iPhone 4 kommt dieser Miko-Sim Rotz, wieso?! Ist da kein Platz? Ich mein, das hat bisher auch funktioniert.</p>
<p><strong>19:47</strong>: &#8220;Existing apps look better&#8221; Aha, darüber haben wir uns gerade schon unterhalten. Werden die hochskaliert?</p>
<p><strong>19:46</strong>: Ah, Technische Stats: IPS Display und ne Auflösung von 960&#215;640.. nicht schlecht!</p>
<p><strong>19:45</strong>: Die Bilder des Retina Displays scheinen schärfer zu sein, aber irgendwie auch dunkler.</p>
<p><strong>19:44</strong>: Ist gut, ihr könnt den GSM Jammer wieder ausmachen, genug den guten Steve geärgert.<br />
Der hat nämlich grad kein Netz um Safari zu zeigen.</p>
<p><strong>19:38:</strong> Sie haben zudem die Anzahl der Pixel vervierfacht. Dadurch steigt die mögliche Auflösung, oder? Jedenfalls soll wohl das Anti Aliasing besser klappen.</p>
<p><strong>19:36:</strong> Krass, ich bin begeistert. Das Teil sieht WIRKLICH gut aus. Achja: LED Flash!!111</p>
<p><strong>19:33</strong>: &#8220;You ain&#8217;t seen it&#8230;&#8221; Ja, das neue iPad Mini.. aeh iPhone wurde angekündigt, gerade eben: iPhone 4. Die Bilder sehen vielversprechend aus. Bin gespannt.</p>
<p><strong>19:29</strong>: Steve ist wieder da: &#8220;You know we give 70% of revenue to developers.&#8221; Schön formuliert. Auf gut Deutsch, sie behalten 30%!?</p>
<p><strong>19:26</strong>: Nichts Interessantes und/oder Neues bisher. Einen Guitar Hero Verschnitt gibt es schon seit Ewigkeiten im Appstore und nennt sich Tap Tap. ist sogar recht unterhaltsam.</p>
<p><strong>19:25:</strong> Oh, awesome: GUITAR HERO!1 Das hätte man vorhersehen können.</p>
<p><strong>19:21</strong>: Vergesst das mit dem Streaming, das sind die Idioten hinter Farmville.</p>
<p><strong>19:20</strong>: Ein Vertreter von Zynga ist auf der Bühne, jetzt wirds für die Gamer unter uns interessant. Die haben, wenn ich mich nicht irre, schon demonstriert, wie man WoW auf das iPad streamed.<br />
Aber keine Ahnung, wie sie das mit der Steuerung hinbekommen wollen, auch bei anderen Spielen.</p>
<p><strong>19:16</strong>: Jetzt spricht der gute Steve über den App approval process, gabs da nicht einige Beschwerden? mh. Jedenfalls werden 95% der submitteten Apps innerhalb von 7 Tagen zugelassen, gut zu wissen.<br />
&#8220;Wer Pornos haben möchte, soll sich Android kaufen.&#8221; Davon ist hier grad keine Rede ;)</p>
<p><strong>19:11</strong>: 22% der verkauften Ebooks werden jetzt schon über iBooks verkauft, das hätte ich tatsächlich nicht gedacht. Aber ganz ehrlich, wer hat sich bis dato Ebooks <strong>gekauft</strong>?</p>
<p><strong>19:08</strong>: Toll das mit den iPhone Apps auf dem iPad, sehen hochskaliert zum Glück auch nicht scheiße aus. Bislang nur etwas Gesülze rund um das iPad. Jetzt werden wohl ein paar Apps vorgestellt. Nothing new here.</p>
<p><strong>19:05</strong>: &#8220;It is magical, I know it because I got this email: I was sitting in a café with my iPad, and it got a girl interested in me!.&#8221; &#8220;So there&#8217;s proof.&#8221; Huge cheers.<br />
Das ist auch der Grund, wieso ich mir das Teil gekauft hab..</p>
<p><strong>19:00</strong>: &#8220;What a Wonderful World&#8221; Welche Welt meinen die eigentlich?</p>
<p><strong>18:58</strong>: Geht wohl langsam los.</p>
<p><strong>18:56</strong>: Dass Heute das neue iPad Mini mit Telefonoption angekündigt wird ist beschlossene Sache, oder?</p>
<p><strong>18:53:</strong> Erwartet hier bitte keinen Fanboy Livestream, ich werde vermutlich primär darüber Bericht erstatten, was mir nicht gefällt.</p>
<p><strong>18:47</strong>: Nichts Neues bisher. Solange ich auf den Start warte, kann ich euch ja verraten, was mich Heute besonders interessiert: Kostenloses Mobile Me.. das wars auch schon, bin ja noch voller Hoffnung.</p>
<p><strong>18:43</strong>: Würde ja lachen, wenn Steve die Leute von Gizmodo erstmal persönlich raus zitiert. Die haben ja Hausverbot.</p>
<p><strong>18:39</strong>: Hier der Link: <a href="http://www.engadget.com/2010/06/07/steve-jobs-live-from-wwdc-2010" target="_blank">http://www.engadget.com/2010/06/07/steve-jobs-live-from-wwdc-2010</a></p>
<p><strong>18:37</strong>: Ich sitze jetzt gespannt vor meinem iMac und verfolge den Live Feed von Engadget, bis jetzt nichts Erwähnenswertes, mal abgesehen von der Jazz Musik..</p>
]]></content:encoded>
			<wfw:commentRss>http://xrayalpha.de/blog/2010/06/07/kommentar-keynote-wwdc-2010/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Magic Mouse und die Mausgeschwindigkeit</title>
		<link>http://xrayalpha.de/blog/2010/05/17/magic-mouse-und-die-mausgeschwindigkeit/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=magic-mouse-und-die-mausgeschwindigkeit</link>
		<comments>http://xrayalpha.de/blog/2010/05/17/magic-mouse-und-die-mausgeschwindigkeit/#comments</comments>
		<pubDate>Mon, 17 May 2010 20:08:43 +0000</pubDate>
		<dc:creator>julian</dc:creator>
				<category><![CDATA[Gadgets]]></category>
		<category><![CDATA[Hardware]]></category>

		<guid isPermaLink="false">http://nerdbeere.org/blog/?p=75</guid>
		<description><![CDATA[Seit Samstag bin ich ja stolzer Besitzer eines 27&#8243; iMacs und hab nun diese grausame Magic Mouse. Zwei Wochen werd ich mir die jetzt mal antun, danach entscheide ich mich, ob ich sie weiter nutzen möchte. Jedenfalls störte mich von &#8230; <a href="http://xrayalpha.de/blog/2010/05/17/magic-mouse-und-die-mausgeschwindigkeit/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Seit Samstag bin ich ja stolzer Besitzer eines 27&#8243; iMacs und hab nun diese grausame Magic Mouse.<br />
Zwei Wochen werd ich mir die jetzt mal antun, danach entscheide ich mich, ob ich sie weiter nutzen möchte.</p>
<p>Jedenfalls störte mich von Anfang an die Geschwindigkeit des Mauszeigers die sich unter OSX nicht sonderlich hoch einstellen lässt. Dies lässt sich aber durch einen Einzeiler in der Konsole beheben:</p>
<pre class="crayon-plain-tag"><code>defaults write -globalDomain com.apple.mouse.scaling -float 8.0</code></pre><p>
(Ausloggen und Einloggen um die Veränderungen in Kraft treten zu lassen)</p>
<p>Max unter OSX: 3.0<br />
Meine Einstellung: 8.0</p>
<p>So läuft das wesentlich besser.</p>
]]></content:encoded>
			<wfw:commentRss>http://xrayalpha.de/blog/2010/05/17/magic-mouse-und-die-mausgeschwindigkeit/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Kaffeekassen App Download</title>
		<link>http://xrayalpha.de/blog/2010/05/14/kaffeekassen-app-download/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=kaffeekassen-app-download</link>
		<comments>http://xrayalpha.de/blog/2010/05/14/kaffeekassen-app-download/#comments</comments>
		<pubDate>Fri, 14 May 2010 10:11:45 +0000</pubDate>
		<dc:creator>julian</dc:creator>
				<category><![CDATA[Development]]></category>

		<guid isPermaLink="false">http://nerdbeere.org/blog/?p=72</guid>
		<description><![CDATA[Wegen riesiger Resonanz (Einer um genau zu sein..) bezüglich der, in CakePHP geschriebenen, Kaffeekassen App werd ich den Code einfach mal zum Download bereitstellen. SQL Dump ohne Daten liegt auch bei. Hier findet ihr die Files. Installation: 1. Entpacken 2. &#8230; <a href="http://xrayalpha.de/blog/2010/05/14/kaffeekassen-app-download/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p></a>Wegen riesiger Resonanz (Einer um genau zu sein..) bezüglich der, in CakePHP geschriebenen, Kaffeekassen App werd ich den Code einfach mal zum Download bereitstellen. SQL Dump ohne Daten liegt auch bei.</p>
<blockquote><p><a href="http://dl.dropbox.com/u/908091/cafe_app.rar">Hier</a> findet ihr die Files.</p></blockquote>
<p>Installation:<br />
1. Entpacken<br />
2. Datenbank importieren und app/config/database.php anpassen<br />
3. Benutzer anlegen: localhost/sprit.cafe/users<br />
4. Kaffee eintragen </p>
]]></content:encoded>
			<wfw:commentRss>http://xrayalpha.de/blog/2010/05/14/kaffeekassen-app-download/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>CakePHP Twitter Datasource</title>
		<link>http://xrayalpha.de/blog/2010/05/12/cakephp-twitter-datasource/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=cakephp-twitter-datasource</link>
		<comments>http://xrayalpha.de/blog/2010/05/12/cakephp-twitter-datasource/#comments</comments>
		<pubDate>Wed, 12 May 2010 09:32:07 +0000</pubDate>
		<dc:creator>julian</dc:creator>
				<category><![CDATA[Development]]></category>

		<guid isPermaLink="false">http://nerdbeere.org/blog/?p=68</guid>
		<description><![CDATA[Habe neulich für Meetr den Twitter Datasource von Alex Ciobanu (iscandr) für 1.2.6 bzw. 1.3 optimiert, nachdem es mit einem Commit zu Fehlern kam. Folgender Commit hat den Fehler verursacht: http://github.com/cakephp/cakephp1x/commit/60465287445f546ea85ee12827772c06055984f7 Der ursprüngliche Code findet sich hier: http://bakery.cakephp.org/articles/view/twitter-datasource Der neue &#8230; <a href="http://xrayalpha.de/blog/2010/05/12/cakephp-twitter-datasource/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Habe neulich für Meetr den Twitter Datasource von Alex Ciobanu (iscandr) für 1.2.6 bzw. 1.3 optimiert, nachdem es mit einem Commit zu Fehlern kam.</p>
<p>Folgender Commit hat den Fehler verursacht:<br />
<a href="http://github.com/cakephp/cakephp1x/commit/60465287445f546ea85ee12827772c06055984f7">http://github.com/cakephp/cakephp1x/commit/60465287445f546ea85ee12827772c06055984f7</a><br />
<span id="more-68"></span><br />
Der ursprüngliche Code findet sich hier:<br />
<a href="http://bakery.cakephp.org/articles/view/twitter-datasource">http://bakery.cakephp.org/articles/view/twitter-datasource</a></p>
<p>Der neue Code:</p><pre class="crayon-plain-tag"><code>* @copyright (c) 2009 Alexandru Ciobanu
 * @license http://www.opensource.org/licenses/mit-license.php The MIT License
 * @link http://bakery.cakephp.org/articles/view/twitter-datasource
 * @created May 4, 2009
 * @version 0.2
 *
 * @modified by Julian (nerdbeere)
 */ App::import('Core', array('Xml', 'HttpSocket')); 
  
class TwitterSource extends DataSource 
{ 
    var $username = &quot;&quot;; 
    var $password = &quot;&quot;; 
    var $description = &quot;Twitter API&quot;; 
    var $Http = null; 
  
    function __construct($config) { 
        parent::__construct($config); 
        $this-&gt;Http =&amp; new HttpSocket(); 
        $this-&gt;username = $this-&gt;config['username']; 
        $this-&gt;password = $this-&gt;config['password']; 
    } 
  
  
    /** 
     * Returns a single status, specified by the id parameter below. 
     * The status's author will be returned inline. 
     * 
     * @param string id Required. The numerical ID or username of the status you're trying to retrieve. 
     * @see http://groups.google.com/group/twitter-development-talk/web/api-documentation 
     */ 
    function status_show($id) { 
        $url = &quot;http://twitter.com/statuses/show/{$id}.xml&quot;; 
        return $this-&gt;__process($this-&gt;Http-&gt;get($url)); 
    } 
  
    function user_show($id=false, $params = array()) { 
        $url = &quot;http://twitter.com/users/show&quot;; 
        if($id != false) { 
            $url .= &quot;/{$id}.xml&quot;; 
        } else { 
            $url .= &quot;.xml&quot;; 
        } 
        return $this-&gt;__process($this-&gt;Http-&gt;get($url, $params, $this-&gt;__getAuthHeader())); 
    } 
  
    /** 
     * Returns the 20 most recent statuses from non-protected users 
     * who have set a custom user icon.  Does not require authentication. 
     * 
     * @param array params Optional. parameters passed to the query 
     * @see http://groups.google.com/group/twitter-development-talk/web/api-documentation 
     */ 
    function status_public_timeline($params=array()) { 
        $url = 'http://twitter.com/statuses/public_timeline.xml'; 
        return $this-&gt;__process($this-&gt;Http-&gt;get($url, $params)); 
    } 
  
    /** 
     * Returns the 20 most recent statuses posted in the last 24 hours from the authenticating 
     * user and that user's friends.  It's also possible to request another user's 
     * friends_timeline via the id parameter below. 
     * 
     * @param string id Optional. Specifies the ID or screen name of the user for whom to return the friends_timeline
     * @param array params Optional. parameters passed to the query 
     * @see http://groups.google.com/group/twitter-development-talk/web/api-documentation 
     */ 
    function status_friends_timeline($id=false, $params = array()) { 
        $url = 'http://twitter.com/statuses/friends_timeline'; 
        if($id != false) { 
            $url .= &quot;/{$id}.xml&quot;; 
        } else { 
            $url .= &quot;.xml&quot;; 
        } 
        return $this-&gt;__process($this-&gt;Http-&gt;get($url, $params)); 
    } 
  
    /** 
     * Returns the 20 most recent statuses posted in the last 24 hours from the authenticating user. 
     * It's also possible to request another user's timeline via the id parameter below. 
     * 
     * @param string id Optional. Specifies the ID or screen name of the user for whom to return the friends_timeline.
     * @param array params Optional. parameters passed to the query 
     * @see http://groups.google.com/group/twitter-development-talk/web/api-documentation 
     */ 
    function status_user_timeline($id=false, $params = array()) { 
        $url = 'http://twitter.com/statuses/user_timeline'; 
        if($id != false) { 
            $url .= &quot;/{$id}.xml&quot;; 
        } else { 
            $url .= &quot;.xml&quot;; 
        } 
  
        return $this-&gt;__process($this-&gt;Http-&gt;get($url, $params)); 
    } 
  
    /** 
     * Updates the authenticating user's status.  Requires the status parameter specified below. 
     * 
     * @param string status Required.  The text of your status update. 
     *              Be sure to URL encode as necessary.  Must not be more than 160 characters 
     *              and should not be more than 140 characters to ensure optimal display. 
     * @see http://groups.google.com/group/twitter-development-talk/web/api-documentation 
     */ 
    function status_update($status) { 
        $url = &quot;http://twitter.com/statuses/update.xml&quot;; 
        return $this-&gt;__process($this-&gt;Http-&gt;post($url, array('status' =&gt; $status), $this-&gt;__getAuthHeader())); 
    } 
  
    /** 
     * Returns the 20 most recent replies 
     * (status updates prefixed with @username posted by users who 
     * are friends with the user being replied to) 
     * to the authenticating user. 
     * 
     * @param array params Optional. Parameters passed to the query 
     * @see http://groups.google.com/group/twitter-development-talk/web/api-documentation 
     */ 
    function status_replies($params = array()) { 
        $url = &quot;http://twitter.com/statuses/replies.xml&quot;; 
        return $this-&gt;__process($this-&gt;Http-&gt;get($url, $params, $this-&gt;__getAuthHeader())); 
    } 
  
    /** 
     * Destroys the status specified by the required ID parameter. 
     * 
     * @param string id Required.  The ID of the status to destroy. 
     * @see http://groups.google.com/group/twitter-development-talk/web/api-documentation 
     */ 
    function status_destroy($id) { 
        $url = &quot;http://twitter.com/statuses/destroy/{$id}.xml&quot;; 
        return $this-&gt;__process($this-&gt;Http-&gt;get($url, null, $this-&gt;__getAuthHeader())); 
    } 
  
    /** 
     * Returns up to 100 of the authenticating user's friends who have most recently updated, each with current status inline.
     * It's also possible to request another user's recent friends list via the id parameter below. 
     * 
     * @param string id Optional.  The ID or screen name of the user for whom to request a list of friends. 
     * @param array params Optional. Parameters passed to the query 
     * @see http://groups.google.com/group/twitter-development-talk/web/api-documentation 
     */ 
    function user_friends($id=false, $params = array()) { 
        $url = &quot;http://twitter.com/statuses/friends&quot;; 
        if($id != false) { 
            $url .= &quot;/{$id}.xml&quot;; 
        } else { 
            $url .= &quot;.xml&quot;; 
        } 
        return $this-&gt;__process($this-&gt;Http-&gt;get($url, $params, $this-&gt;__getAuthHeader())); 
    } 
  
    /** 
     * Returns the authenticating user's followers, each with current status inline. 
     * 
     * @param array params Optional. Parameters passed to the query 
     * @see http://groups.google.com/group/twitter-development-talk/web/api-documentation 
     */ 
    function user_followers($params = array()) { 
        $url = &quot;http://twitter.com/statuses/followers.xml&quot;; 
        return $this-&gt;__process($this-&gt;Http-&gt;get($url, $params, $this-&gt;__getAuthHeader())); 
    } 
  
    /** 
     * Returns a list of the users currently featured on the site with their current statuses inline. 
     * 
     * @see http://groups.google.com/group/twitter-development-talk/web/api-documentation 
     */ 
    function user_featured() { 
        $url = &quot;http://twitter.com/statuses/featured.xml&quot;; 
        return $this-&gt;__process($this-&gt;Http-&gt;get($url)); 
    } 
  
    /** 
     * Returns a list of the 20 most recent direct messages sent to the authenticating user. 
     * 
     * @param array params Optional. Parameters passed to the query. 
     * @see http://groups.google.com/group/twitter-development-talk/web/api-documentation 
     */ 
    function direct_messages($params = array()) { 
        $url = &quot;http://twitter.com/direct_messages.xml&quot;; 
        return $this-&gt;__process($this-&gt;Http-&gt;get($url, $params, $this-&gt;__getAuthHeader())); 
    } 
  
    /** 
     * Returns a list of the 20 most recent direct messages sent by the authenticating user. 
     * 
     * @param array params Optional. Parameters passed to the query. 
     * @see http://groups.google.com/group/twitter-development-talk/web/api-documentation 
     */ 
    function direct_messages_sent($params = array()) { 
        $url = &quot;http://twitter.com/direct_messages/sent.xml&quot;; 
        return $this-&gt;__process($this-&gt;Http-&gt;get($url, $params, $this-&gt;__getAuthHeader())); 
    } 
  
    /** 
     * Sends a new direct message to the specified user from the authenticating user. 
     * 
     * @param string user Required.  The ID or screen name of the recipient user. 
     * @param string text Required.  The text of your direct message. 
     *              Be sure to URL encode as necessary, and keep it under 140 characters. 
     * @see http://groups.google.com/group/twitter-development-talk/web/api-documentation 
     */ 
    function direct_messages_new($user, $text) { 
        $url = &quot;http://twitter.com/direct_messages/new.xml&quot;; 
        $params = array('user' =&gt; $user, 'text' =&gt; $text); 
        return $this-&gt;__process($this-&gt;Http-&gt;post($url, $params, $this-&gt;__getAuthHeader())); 
    } 
  
    /** 
     * Destroys the direct message specified in the required ID parameter. 
     * 
     * @param string id Required.  The ID of the direct message to destroy. 
     * @see http://groups.google.com/group/twitter-development-talk/web/api-documentation 
     */ 
    function direct_messages_destroy($id) { 
        $url = &quot;http://twitter.com/direct_messages/destroy/{$id}.xml&quot;; 
        return $this-&gt;__process($this-&gt;Http-&gt;get($url, null, $this-&gt;__getAuthHeader())); 
    } 
  
    /** 
     * Befriends the user specified in the ID parameter as the authenticating user. 
     * 
     * @param string id Required.  The ID or screen name of the user to befriend. 
     * @see http://groups.google.com/group/twitter-development-talk/web/api-documentation 
     */ 
    function friendship_create($id) { 
        $url = &quot;http://twitter.com/friendships/create/{$id}.xml&quot;; 
        return $this-&gt;__process($this-&gt;Http-&gt;post($url, null, $this-&gt;__getAuthHeader())); 
    } 
  
    /** 
     * Discontinues friendship with the user specified in the ID parameter as the authenticating user. 
     * 
     * @param string id Required.  The ID or screen name of the user with whom to discontinue friendship. 
     * @see http://groups.google.com/group/twitter-development-talk/web/api-documentation 
     */ 
    function friendship_destroy($id) { 
        $url = &quot;http://twitter.com/friendships/destroy/{$id}.xml&quot;; 
        return $this-&gt;__process($this-&gt;Http-&gt;get($url, null, $this-&gt;__getAuthHeader())); 
    } 
  
    /** 
     * Returns an HTTP 200 OK response code and a format-specific response if authentication was successful. 
     * 
     * @see http://groups.google.com/group/twitter-development-talk/web/api-documentation 
     */ 
    function account_verify_credentials() { 
        $url = &quot;http://twitter.com/account/verify_credentials.xml&quot;; 
        return $this-&gt;__process($this-&gt;Http-&gt;get($url, null, $this-&gt;__getAuthHeader())); 
    } 
  
    /** 
     * Ends the session of the authenticating user, returning a null cookie. 
     * 
     * @see http://groups.google.com/group/twitter-development-talk/web/api-documentation 
     */ 
    function account_end_session() { 
        $url = &quot;http://twitter.com/account/end_session&quot;; 
        $this-&gt;Http-&gt;get($url, null, $this-&gt;__getAuthHeader()); 
    } 
  
    /** 
     * Returns 80 statuses per page for the authenticating user, ordered by descending date of posting. 
     * 
     * @param integer page Optional. Retrieves the 80 next most recent statuses. 
     * @see http://groups.google.com/group/twitter-development-talk/web/api-documentation 
     */ 
    function account_archive($page=1) { 
        $url = 'http://twitter.com/statuses/user_timeline.xml'; 
        return $this-&gt;__process($this-&gt;Http-&gt;get($url, array('page' =&gt; $page), $this-&gt;__getAuthHeader())); 
    } 
  
    /** 
     * Updates the location attribute of the authenticating user, 
     * as displayed on the side of their profile and returned in various API methods. 
     * 
     * @param string location The location of the user.  Please note this is not normalized, geocoded, or translated to latitude/longitude at this time.
     * @see http://groups.google.com/group/twitter-development-talk/web/api-documentation 
     */ 
    function account_update_location($location) { 
        $url = 'http://twitter.com/account/update_location.xml'; 
        return $this-&gt;__process($this-&gt;Http-&gt;get($url, array('location' =&gt; $location), $this-&gt;__getAuthHeader())); 
    } 
  
    /** 
     * Sets which device Twitter delivers updates to for the authenticating user. 
     * Sending none as the device parameter will disable IM or SMS updates. 
     * 
     * @param string device  Must be one of: sms, im, none. 
     * @see http://groups.google.com/group/twitter-development-talk/web/api-documentation 
     */ 
    function account_update_delivery_device($device) { 
        $url = 'http://twitter.com/account/update_delivery_device.xml'; 
        return $this-&gt;__process($this-&gt;Http-&gt;get($url, array('device' =&gt; $device), $this-&gt;__getAuthHeader())); 
    } 
  
    /** 
     * Returns the 20 most recent favorite statuses for the authenticating user 
     * or user specified by the ID parameter in the requested format. 
     * 
     * @param string id Optional.  The ID or screen name of the user for whom to request a list of favorite statuses.
     * @param array params Optional. Parameters passed to the query 
     * @see http://groups.google.com/group/twitter-development-talk/web/api-documentation 
     */ 
    function favorites($id = false, $params = array()) { 
        $url = &quot;http://twitter.com/favorites&quot;; 
        if($id != false) { 
            $url .= &quot;/{$id}.xml&quot;; 
        } else { 
            $url .= &quot;.xml&quot;; 
        } 
        return $this-&gt;__process($this-&gt;Http-&gt;get($url, $params, $this-&gt;__getAuthHeader())); 
    } 
  
    /** 
     * Favorites the status specified in the ID parameter as the authenticating user. 
     * 
     * @param string id Required.  The ID of the status to favorite. 
     * @see http://groups.google.com/group/twitter-development-talk/web/api-documentation 
     */ 
    function favorites_create($id) { 
        $url = &quot;http://twitter.com/favorites/create/{$id}.xml&quot;; 
        return $this-&gt;__process($this-&gt;Http-&gt;get($url, null, $this-&gt;__getAuthHeader())); 
    } 
  
    /** 
     * Un-favorites the status specified in the ID parameter as the authenticating user. 
     * 
     * @param string id Required.  The ID of the status to un-favorite. 
     * @see http://groups.google.com/group/twitter-development-talk/web/api-documentation 
     */ 
    function favorites_destroy($id) { 
        $url = &quot;http://twitter.com/favorites/destroy/{$id}.xml&quot;; 
        return $this-&gt;__process($this-&gt;Http-&gt;get($url, null, $this-&gt;__getAuthHeader())); 
    } 
    /** 
     * Search for keyword using the twitter search API 
     * 
     * @param string $keyword 
     * @param string $language 
     * @see http://search.twitter.com/api 
     */ 
    function search($keyword, $language = 'all', $rpp = '10'){ 
        $url = &quot;http://search.twitter.com/search.atom?q=$keyword&amp;lang=$language&amp;rpp=$rpp&quot;; 
        return $this-&gt;__process($this-&gt;Http-&gt;get($url)); 
    } 
  
    /** 
     * Enables notifications for updates from the specified user to the authenticating user. 
     * 
     * @param string id Required.  The ID or screen name of the user to follow. 
     * @see http://groups.google.com/group/twitter-development-talk/web/api-documentation 
     */ 
    function notifications_follow($id) { 
        $url = &quot;http://twitter.com/notifications/follow/{$id}.xml&quot;; 
        return $this-&gt;__process($this-&gt;Http-&gt;get($url, null, $this-&gt;__getAuthHeader())); 
    } 
  
    /** 
     * Disables notifications for updates from the specified user to the authenticating user. 
     * 
     * @param string id Required.  The ID or screen name of the user to leave. 
     * @see http://groups.google.com/group/twitter-development-talk/web/api-documentation 
     */ 
    function notifications_leave($id) { 
        $url = &quot;http://twitter.com/notifications/leave/{$id}.xml&quot;; 
        return $this-&gt;__process($this-&gt;Http-&gt;get($url, null, $this-&gt;__getAuthHeader())); 
    } 
  
    /** 
     * Blocks the user specified in the ID parameter as the authenticating user. 
     * Returns the blocked user in the requested format when successful. 
     * 
     * @param string id The ID or screen_name of the user to block 
     * @see http://groups.google.com/group/twitter-development-talk/web/api-documentation 
     */ 
    function block_create($id) { 
        $url = &quot;http://twitter.com/blocks/create/{$id}.xml&quot;; 
        return $this-&gt;__process($this-&gt;Http-&gt;get($url, null, $this-&gt;__getAuthHeader())); 
    } 
  
    /** 
     * Un-blocks the user specified in the ID parameter as the authenticating user. 
     * Returns the un-blocked user in the requested format when successful. 
     * 
     * @param string id The ID or screen_name of the user to block 
     * @see http://groups.google.com/group/twitter-development-talk/web/api-documentation 
     */ 
    function block_destroy($id) { 
        $url = &quot;http://twitter.com/blocks/destroy/{$id}.xml&quot;; 
        return $this-&gt;__process($this-&gt;Http-&gt;get($url, null, $this-&gt;__getAuthHeader())); 
    } 
  
    /** 
     * Returns the string &quot;ok&quot; in the requested format with a 200 OK HTTP status code. 
     * 
     * @see http://groups.google.com/group/twitter-development-talk/web/api-documentation 
     */ 
    function help_test() { 
        $url = 'http://twitter.com/help/test.xml'; 
        return $this-&gt;__process($this-&gt;Http-&gt;get($url)); 
    } 
  
    /** 
     * Returns the same text displayed on http://twitter.com/home when 
     * a maintenance window is scheduled, in the requested format. 
     * 
     * @see http://groups.google.com/group/twitter-development-talk/web/api-documentation 
     */ 
    function help_downtime_schedule() { 
        $url = 'http://twitter.com/help/downtime_schedule.xml'; 
        return $this-&gt;__process($this-&gt;Http-&gt;get($url)); 
    } 
    /** 
     * Credentials array for method with mandatory auth 
     * @return array credentials 
     */ 
    function __getAuthHeader() { 
        return array('auth' =&gt; array('method' =&gt; 'Basic', 
                                     'user' =&gt; $this-&gt;username, 
                                     'pass' =&gt; $this-&gt;password 
        ) 
        ); 
    } 
  
    /** 
     * 
     * @param string data to process 
     * @return array Twitter API response 
     */ 
    function __process($response) { 
        $xml = new XML($response); 
        $array = $xml-&gt;toArray(); 

        $xml-&gt;__destruct(); 
        $xml = null; 
        unset($xml); 
  
        return $array; 
    } 
} 
?&gt;</code></pre>
]]></content:encoded>
			<wfw:commentRss>http://xrayalpha.de/blog/2010/05/12/cakephp-twitter-datasource/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

