<?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>Sebastians Blog</title>
	<atom:link href="http://sgaul.de/feed/" rel="self" type="application/rss+xml" />
	<link>http://sgaul.de</link>
	<description>Neues aus den Softwareminen...</description>
	<lastBuildDate>Sat, 15 Jun 2013 14:28:18 +0000</lastBuildDate>
	<language>de-DE</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.5.1</generator>
		<item>
		<title>Adaptive Bilder im responsiven Webdesign</title>
		<link>http://sgaul.de/2013/06/15/adaptive-bilder-im-responsiven-webdesign/</link>
		<comments>http://sgaul.de/2013/06/15/adaptive-bilder-im-responsiven-webdesign/#comments</comments>
		<pubDate>Sat, 15 Jun 2013 14:28:05 +0000</pubDate>
		<dc:creator>Sebastian Gaul</dc:creator>
				<category><![CDATA[Internet und Webentwicklung]]></category>
		<category><![CDATA[Adaptive Images]]></category>
		<category><![CDATA[Apache]]></category>
		<category><![CDATA[HTML]]></category>
		<category><![CDATA[OSBN]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Responsive Webdesign]]></category>

		<guid isPermaLink="false">http://sgaul.de/?p=2221</guid>
		<description><![CDATA[Während die Gestaltung für unterschiedlich große Ausgabegeräte mit CSS mittlerweile ganz gut möglich ist, hat responsives Webdesign ein großes Problem: Bilder. Schon für Entwickler ist es nervig, unzählige Größen bereitzustellen. Vollautomatisierte Lösungen, die auch für technisch unversierte Nutzer funktionieren, sind noch um einiges komplizierter. Eine schöner Ansatz, der zumindest einen großen Teil dieses Gebietes abdeckt, bietet Adaptive Images. Die Software habe ich nicht getestet und sie dürfte für viele ohnehin nicht nutzbar sein, da sie PHP und einen Apache Webserver erfordert. Die Idee ist aber gut und einfach umsetzbar. <a href="http://sgaul.de/2013/06/15/adaptive-bilder-im-responsiven-webdesign/">Weiterlesen <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>Während die Gestaltung für unterschiedlich große Ausgabegeräte mit CSS mittlerweile ganz gut möglich ist, hat responsives Webdesign ein großes Problem: Bilder. Schon für Entwickler ist es nervig, unzählige Größen bereitzustellen. Vollautomatisierte Lösungen, die auch für technisch unversierte Nutzer funktionieren, sind noch um einiges komplizierter.</p>
<p>Eine schöner Ansatz, der zumindest einen großen Teil dieses Gebietes abdeckt, bietet <a href="https://github.com/MattWilcox/Adaptive-Images">Adaptive Images</a>. Die Software habe ich nicht getestet und sie dürfte für viele ohnehin nicht nutzbar sein, da sie PHP und einen Apache Webserver erfordert. Die Idee ist aber gut und einfach umsetzbar.<span id="more-2221"></span></p>
<p><a href="http://sgaul.de/wp-content/uploads/2013/06/monitor-smartphone-v3.png"><img src="http://sgaul.de/wp-content/uploads/2013/06/monitor-smartphone-v3.png" alt="monitor-smartphone-v3" width="320" height="200" class="aligncenter size-full wp-image-2231" /></a></p>
<h2>Client: Cookie mit Bildschirmdimensionen setzen</h2>
<p>Wer generell gegen Cookies und Javascript ist kann jetzt aufhören zu lesen. Via JS setzen wir im Head ein(en?) Cookie mittels JS, in dem die maximale Bildschirmgröße gespeichert wird:</p>
<pre>document.cookie = 
    'resolution=' + Math.max(screen.width,screen.height) + '; path=/';</pre>
<p>Da wir das Maximum wählen, können wir sicher sein, dass Bilder auch nach dem Kippen des Gerätes ins Querformat noch ordentlich aussehen.</p>
<p>Das war es auch schon. Der Browser sendet ab sofort bei jedem Aufruf die Auflösung mit. Auch bei Bildern, ob aus Img-Element oder CSS.</p>
<h2>Server: Bildanfrage abfangen, Bild in neuer Größe erzeugen und umleiten</h2>
<p>Serverseitig muss die Anfrage nun auf irgend ein Serverprogramm umgeleitet werden. Dieses kennt den Pfad zum Bild und die gewünschte Dimension. Es nimmt also das Bild, skaliert es herunter und speichert es. Nun schickt es dem Client eine Weiterleitung auf die optimierte Datei. Diese kann sogar permanent sein, da sich die Dimensionen eines Browsers in aller Regel nicht ändern.</p>
<p>Die Skalierung des Bildes ist nur beim ersten mal für eine bestimmte Größe nötig. Später wird auf die bereits erzeugten Varianten verwiesen.</p>
<h2>Nur ein Ansatz</h2>
<p>Dies ist natürlich nur ein Ansatz. Welche Bilder skaliert werden sollen und wodurch diese vom Server erkannt werden muss für jede Website geklärt werden. Zudem sollte man sich Normgrößen überlegen, damit nicht unzählige Varianten ein und der selben Datei wegen zwei Pixeln Unterschied auf der Platte landen.</p>
<p>Gegenüber verbreiteten Ansätzen gibt es einen zentralen Vorteil. Browser müssen nicht erst alle kleinen Bilder laden um im Nachhinein via Javascript zu erfahren, dass sie diese durch für ihre Größe angemessene Varianten ersetzen sollen. Hier lädt der Client ein Bild und der Server liefert ihm was er braucht.</p>
<p>Der Ansatz funktioniert nicht ohne Javascript und Cookies. Sind diese deaktiviert oder nicht vorhanden, erhält der Browser eine Standardversion des jeweiligen Bildes. Die Website funktioniert somit dennoch wie erwartet, nur die Optimierung fehlt.</p>
]]></content:encoded>
			<wfw:commentRss>http://sgaul.de/2013/06/15/adaptive-bilder-im-responsiven-webdesign/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Von Data-Warehouses und Website-Statistiken</title>
		<link>http://sgaul.de/2013/06/09/von-data-warehouses-und-website-statistiken/</link>
		<comments>http://sgaul.de/2013/06/09/von-data-warehouses-und-website-statistiken/#comments</comments>
		<pubDate>Sun, 09 Jun 2013 13:26:42 +0000</pubDate>
		<dc:creator>Sebastian Gaul</dc:creator>
				<category><![CDATA[Internet und Webentwicklung]]></category>
		<category><![CDATA[Software-Entwicklung]]></category>
		<category><![CDATA[Data-Warehouse]]></category>
		<category><![CDATA[Datenbank]]></category>
		<category><![CDATA[Datenintegration]]></category>
		<category><![CDATA[Datenseparation]]></category>
		<category><![CDATA[OSBN]]></category>
		<category><![CDATA[Statistik]]></category>

		<guid isPermaLink="false">http://sgaul.de/?p=2201</guid>
		<description><![CDATA[Schon vor längerer Zeit habe ich im Rahmen meiner damaligen Firma ein Analysewerkzeug für Website-Besuche geschrieben. Leider ist das ganze recht organisch gewachsen, so dass es heute schwer fällt die Software zu verbessern. Wie lässt sich eine belastbare Architektur entwickeln? &#8230; <a href="http://sgaul.de/2013/06/09/von-data-warehouses-und-website-statistiken/">Weiterlesen <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>Schon vor längerer Zeit habe ich im Rahmen meiner damaligen Firma ein Analysewerkzeug für Website-Besuche geschrieben. Leider ist das ganze recht organisch gewachsen, so dass es heute schwer fällt die Software zu verbessern. Wie lässt sich eine belastbare Architektur entwickeln? Ein Stichwort, an dass ich im Zusammenhang mit großen Datenmengen stets denken muss: <a href="http://de.wikipedia.org/wiki/Data-Warehouse">Data-Warehouses</a>.<span id="more-2201"></span><br />
<div id="attachment_2204" class="wp-caption aligncenter" style="width: 447px"><a href="http://sgaul.de/wp-content/uploads/2013/06/website-statistiken.png"><img src="http://sgaul.de/wp-content/uploads/2013/06/website-statistiken.png" alt="Zugriffsstatistiken werden immer wichtiger" width="437" height="213" class="size-full wp-image-2204" /></a><p class="wp-caption-text">Die Farbwahl für Diagramme ist eine Wissenschaft für sich&#8230;</p></div></p>
<h2>Data-Warehouse: Datenintegration und -separation</h2>
<p>Ein Data-Warehouse ist eine Datenbank, die zwei grundlegende Ziele verfolgt:</p>
<ol>
<li><em>Datenintegration</em> aus heterogenen Quellen</li>
<li><em>Separation der Daten</em>; das Data-Warehouse hat keinen Einfluss auf die operativen Daten</li>
</ol>
<h3>Datenintegration</h3>
<p>Beide Aspekte sind für Website-Statistiken höchst relevant. Viele Web-Server stellen mehrere Websites mit unterschiedlichen Technologien bereit. Selbst wenn nicht, möchte ich als Admin die Möglichkeit haben, meinen Apache gegen ein Nginx oder mein Typo 3 gegen ein Wordpress auszutauschen. Heterogene Quellen, in welchen die Daten auflaufen, sind somit zumindest potentiell immer gegeben. Ein weiterer Vorteil: Bin ich auf kein festes Format angewiesen, kann ich auch immer die nativen Mechanismen der verwendeten Software nutzen. Apache, Nginx und Co. loggen ohnehin jeden Besucher mit, eine zusätzliche Erfassung der Daten (wie zum Beispiel durch Piwik) ist oft gar nicht nötig. Ein Data-Warehouse kann diese selbstständig integrieren.</p>
<h3>Datenseparation</h3>
<p>Auch Punkt 2 ist wie fürs Web gemacht: Statistiken sind sicher wichtig, aber nie so, dass sie das eigentliche Webangebot behindern dürften. Ist der Server bereits ausgelastet, so kann ein Aufruf der Statistiken mit unzähligen Leseoperationen und Berechnungen zum großen Problem werden. Spätestes wenn der Speicher voll ist gehen bei kleinen Projekten wie diesem Blog die Lichter aus. Das Prinzip der Datenseparation bietet hier Abhilfe: Die Statistiken werden vollständig von den operativen Daten getrennt. Das Data-Warehouse kann bei Bedarf auf einem anderen Server liegen. </p>
<p>Hierfür müssen die operativen Daten zwar ebenfalls gelesen werden, dies kann in hohen Lastphasen aber einfach unterbunden werden. Der Webserver kann sich auf seinen eigentlichen Job konzentrieren und auch der Statistikaufrufer kriegt schnell und optimiert seine Zahlen. Lediglich Letzterer hat hierbei den Nachteil, dass die Daten nicht mehr ganz in Echtzeit bereitstehen &#8211; was wohl zu verkraften sein dürfte. Das Internet ist zwar schnelllebig, die Zugriffe von vor fünf Minuten sind für die meisten aber aktuell genug.</p>
<h2>Nachteile</h2>
<p>Der Data-Warehouse-Ansatz für die Website-Zugriffsanalyse birgt kaum Probleme. Zwei drängen sich zunächst auf:</p>
<ul>
<li>Keine Echtzeitdaten</li>
<li>Erhöhter Speicherverbrauch durch Datenduplizierung</li>
</ul>
<p>In meinen Augen sind beide Nachteile unkritisch. Die Aktualitätsspanne zwischen Echtzeit- und Data-Warehouse-Daten lässt sich je nach Kapazität beliebig verkleinern. Je öfter die Daten integriert werden, desto weniger Neuerungen sind zu verarbeiten. Selbst minütliche Syncs sind realistisch, wenn man seine Zugriffsspitzen im Blick hat und nach Bedarf das Intervall anpasst.</p>
<p>Der vermehrte Speicherverbrauch war selbst zu Zeiten der Festplattenkrise kein Problem. Wer jeden Tag gigabyteweise Zugriffsdaten wegschreibt hat sicher andere Sorgen als zehn Festplatten im Jahr&#8230;</p>
<h2>Skalierbarkeit und Datenstrukturkonzeption</h2>
<p>Das Konzept Data-Warehouse ist simpel und überzeugend. Für Website-Statistiken überzeugt vor allem die Skalierbarkeit: Vom kleinen PHP-Webspace mit My-SQL-Datenbank kann eine gut konzipierte Datensammlung mitwachsen und auf beliebig große und verteilte Systeme migriert werden.</p>
<p>Zudem bietet dieses Forschungsfeld interessante Ansätze, wie man Daten effizient an das Anwendungsfeld angepasst strukturiert. <em>OLAP-Cubes</em> und <em>Sternschemas</em> für relationale Datenbanken sind wichtige Stichwörter, die jedoch einen eigenen Artikel rechtfertigen.</p>
]]></content:encoded>
			<wfw:commentRss>http://sgaul.de/2013/06/09/von-data-warehouses-und-website-statistiken/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Ruby mit RVM unter Ubuntu installieren</title>
		<link>http://sgaul.de/2013/05/26/ruby-mit-rvm-unter-ubuntu-installieren/</link>
		<comments>http://sgaul.de/2013/05/26/ruby-mit-rvm-unter-ubuntu-installieren/#comments</comments>
		<pubDate>Sun, 26 May 2013 12:18:24 +0000</pubDate>
		<dc:creator>Sebastian Gaul</dc:creator>
				<category><![CDATA[Internet und Webentwicklung]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[OSBN]]></category>
		<category><![CDATA[Rails]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[RVM]]></category>
		<category><![CDATA[Ubuntu]]></category>

		<guid isPermaLink="false">http://sgaul.de/?p=2175</guid>
		<description><![CDATA[Ruby unter Ubuntu zu installieren ist nicht schwer. Es ist in den Paketquellen enthalten und auch das Bauen einer aktuelleren Variante ist nicht wirklich kompliziert. Ein Problem ist jedoch, dass Ruby noch stark in der Entwicklung steckt und auch kleine &#8230; <a href="http://sgaul.de/2013/05/26/ruby-mit-rvm-unter-ubuntu-installieren/">Weiterlesen <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>Ruby unter Ubuntu zu installieren ist nicht schwer. Es ist in den Paketquellen enthalten und auch das Bauen einer aktuelleren Variante ist nicht wirklich kompliziert. Ein Problem ist jedoch, dass Ruby noch stark in der Entwicklung steckt und auch kleine Versionssprünge große Änderungen mit sich bringen können. Mit Paketquellen ist es schwierig überall genau die Version bereit zu stellen, für die man gerade entwickelt. Selberbauen wird schnell nervig, sobald mehrere Ruby-Versionen parallel benötigt werden.</p>
<p>Gerade der letzte Punkt wird oft ignoriert, kommt aber schneller als man denkt: Gerade bei einer Entwicklung wie bei Ruby entsteht das Bedürfnis, für die neue Projektversion auch die neue Ruby-Version zu nutzen. Es empfiehlt sich daher, diesen Punkt von Anfang an zu beachten und Ruby auf eine eigene Versionverwaltung zu stellen: <a href="https://rvm.io/">RVM</a>. Der Ruby Version Manager kann automatisch bestimmte Ruby-Versionen installieren und parallel unterschiedliche Versionen laufen lassen.<span id="more-2175"></span></p>
<p><a href="http://sgaul.de/wp-content/uploads/2013/05/ruby-logo-R1.png"><img src="http://sgaul.de/wp-content/uploads/2013/05/ruby-logo-R1.png" alt="ruby-logo-R" width="281" height="322" class="aligncenter size-full wp-image-2183" /></a></p>
<h2>Installation unter Ubuntu 12.04, 12.10 und 13.04</h2>
<p>Die Installation macht weitgehend alles selbst, nur mit den Abhängigkeiten hatte ich etwas zu kämpfen. Für 12.04 und 12.10 bin ich auf die folgenden gekommen, damit alles reibungslos funktioniert. Für 13.04 konnte ich das noch nicht testen, die Liste sollte aber auch hier funktionieren oder zumindest ein guter Ansatzpunkt sein:</p>
<h3>Abängigkeiten</h3>
<pre>sudo apt-get install curl git-core patch build-essential bison \
  zlib1g-dev libssl-dev libxml2-dev \
  libxml2-dev sqlite3 libsqlite3-dev autotools-dev \
  libxslt1-dev libyaml-0-2 autoconf automake libreadline6-dev \
  libyaml-dev libtool libgdbm-dev libncurses5-dev pkg-config \
  libffi-dev libpq-dev libpq-dev</pre>
<p><small>Die Liste ist eine Erweiterung von <a href="http://ruby-auf-schienen.de/3.2/rails3-install-ubuntu.html">einem Artikel von Ruby auf Schienen</a>.</small></p>
<h3>Installation im Userspace</h3>
<p>Der Rest läuft wie von selbst. Im Userspace installiert man das RVM über ein Skript (Administratoren und andere Besorgte gucken natürlich vorher, was das Skript macht, bevor sie es ausführen):</p>
<pre>curl -L https://get.rvm.io | bash -s stable</pre>
<p>Nach einem Neuladen des Terminals sollte RVM bereit sein und alle verfügbaren Versionen auflisten:</p>
<pre>source ~/.bashrc
rvm list known</pre>
<h2>Erste Schritte mit NVM</h2>
<h3>Ruby 1.9.3 installieren</h3>
<pre>rvm install 1.9.3</pre>
<h3>1.9.3 in der aktuellen Shell aktivieren</h3>
<p>Sind mehrere Versionen installiert, lässt sich mit <code>rvm use</code> eine bestimmte für das aktuelle Terminal aktivieren:</p>
<pre class="highlighted"><strong>rvm use 1.9.3
ruby --version</strong>
ruby 1.9.3p194 (2012-04-20 revision 35410) [x86_64-linux]</pre>
<h3>Rails 3.2</h3>
<p>Ab dieser Stelle lässt sich Ruby wie gewohnt über mit <code>gem</code> konfigurieren, so dass die Rails-Installation keine Überraschungen birgt:</p>
<pre>gem install rails --version '~> 3.2.0'</pre>
]]></content:encoded>
			<wfw:commentRss>http://sgaul.de/2013/05/26/ruby-mit-rvm-unter-ubuntu-installieren/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Die Champions League und die mediale Grundversorgung</title>
		<link>http://sgaul.de/2013/05/25/die-champions-league-und-die-mediale-grundversorgung/</link>
		<comments>http://sgaul.de/2013/05/25/die-champions-league-und-die-mediale-grundversorgung/#comments</comments>
		<pubDate>Sat, 25 May 2013 18:49:44 +0000</pubDate>
		<dc:creator>Sebastian Gaul</dc:creator>
				<category><![CDATA[Allgemein]]></category>
		<category><![CDATA[Champions League]]></category>
		<category><![CDATA[Rundfunkgebühren]]></category>
		<category><![CDATA[ZDF]]></category>

		<guid isPermaLink="false">http://sgaul.de/?p=2171</guid>
		<description><![CDATA[Laut Spiegel kostet die Champions-League-Free-TV-Lizenz geschätzte 54 Millionen pro Saison. Ein Bürger zahlt monatlich 17,98 Euro für den öffentlich-rechtlichen Rundfunk. Er wird nicht ganz 80, fängt aber erst als Erwachsener an zu zahlen. Vielleicht sind das 60 Jahre&#8230; 17,98 Euro &#8230; <a href="http://sgaul.de/2013/05/25/die-champions-league-und-die-mediale-grundversorgung/">Weiterlesen <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>Laut Spiegel kostet die <a href="http://www.spiegel.de/sport/fussball/tv-coup-zdf-sichert-sich-die-champions-league-a-755097.html">Champions-League-Free-TV-Lizenz geschätzte 54 Millionen pro Saison</a>. Ein Bürger zahlt monatlich 17,98 Euro für den öffentlich-rechtlichen Rundfunk. Er wird nicht ganz 80, fängt aber erst als Erwachsener an zu zahlen. Vielleicht sind das 60 Jahre&#8230;</p>
<pre>          17,98 Euro
*            12
=        215,76 Euro
   
  50 000 000,00 Euro
/        215,76 Euro
=    231 738,97

     231 738,97
/            60
=      3 862,32</pre>
<p>Über 3000 Menschen zahlen ihr ganzes Leben lang Gebühren, um in der Halbzeitpause zehn Minuten Heute-Journal statt Werbung zu sehen. Das wird man wohl gemeint haben, als man den öffentlich-rechtlichen Rundfunk für die mediale „Grundversorgung“ erfunden hat.</p>
]]></content:encoded>
			<wfw:commentRss>http://sgaul.de/2013/05/25/die-champions-league-und-die-mediale-grundversorgung/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Git-Merge-Konflikte mit Diff3 einfacher lösen</title>
		<link>http://sgaul.de/2013/05/25/git-merge-konflikte-mit-diff3-einfacher-losen/</link>
		<comments>http://sgaul.de/2013/05/25/git-merge-konflikte-mit-diff3-einfacher-losen/#comments</comments>
		<pubDate>Sat, 25 May 2013 17:40:40 +0000</pubDate>
		<dc:creator>Sebastian Gaul</dc:creator>
				<category><![CDATA[Software-Entwicklung]]></category>
		<category><![CDATA[Git]]></category>
		<category><![CDATA[OSBN]]></category>

		<guid isPermaLink="false">http://sgaul.de/?p=2162</guid>
		<description><![CDATA[Merge-Konflikte zu beheben ist nicht immer leicht: &#60;&#60;&#60;&#60;&#60;&#60;&#60; HEAD customer.setPriority(42); ======= client.setPriority(32); &#62;&#62;&#62;&#62;&#62;&#62;&#62; master Customer oder Client? 42 oder 32? Die richtige Lösung muss aus dem umliegenden Code abgeleitet werden. Hier kann es wie so oft helfen, den letzten gemeinsamen &#8230; <a href="http://sgaul.de/2013/05/25/git-merge-konflikte-mit-diff3-einfacher-losen/">Weiterlesen <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>Merge-Konflikte zu beheben ist nicht immer leicht:</p>
<pre>&lt;&lt;&lt;&lt;&lt;&lt;&lt; HEAD
customer.setPriority(42);
=======
client.setPriority(32);
&gt;&gt;&gt;&gt;&gt;&gt;&gt; master</pre>
<p>Customer oder Client? 42 oder 32? Die richtige Lösung muss aus dem umliegenden Code abgeleitet werden. Hier kann es wie so oft helfen, den letzten gemeinsamen Stand der Versionen zu sehen.<span id="more-2162"></span></p>
<pre>git config --global merge.conflictstyle diff3</pre>
<p>Ab sofort erscheint bei Konflikten mittig die ursprüngliche Variante. Durch diese wird ohne weiteres Code-Studium deutlich, welche Änderungen jeweils gemacht wurden und übernommen werden sollten:</p>
<pre>&lt;&lt;&lt;&lt;&lt;&lt;&lt; HEAD
customer.setPriority(42);
||||||| merged common ancestors
client.setPriority(42);
=======
client.setPriority(32);
&gt;&gt;&gt;&gt;&gt;&gt;&gt; master</pre>
<p>Im Beispiel wurde <code>client</code> in <code>customer</code> umbenannt und die Priorität auf 32 reduziert. Die sinnvolle Lösung ist demnach:</p>
<pre>customer.setPriority(32);</pre>
<p>Die ursprüngliche Darstellung lässt sich durch den Wert <code>merge</code> wiederherstellen:</p>
<pre>git config --global merge.conflictstyle merge</pre>
]]></content:encoded>
			<wfw:commentRss>http://sgaul.de/2013/05/25/git-merge-konflikte-mit-diff3-einfacher-losen/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Dateien nach LOC auflisten</title>
		<link>http://sgaul.de/2013/05/07/dateien-nach-loc-auflisten/</link>
		<comments>http://sgaul.de/2013/05/07/dateien-nach-loc-auflisten/#comments</comments>
		<pubDate>Tue, 07 May 2013 16:14:49 +0000</pubDate>
		<dc:creator>Sebastian Gaul</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[Software-Entwicklung]]></category>
		<category><![CDATA[Bash]]></category>

		<guid isPermaLink="false">http://sgaul.de/?p=2155</guid>
		<description><![CDATA[Das einfachste, aber manchmal durchaus ausreichende Maß für Komplexität sind die guten alten Lines of Code. Hier ein kleiner Schnipsel, um in der Bash alle Ruby-Dateien des aktuellen Verzeichnisses und aller Unterverzeichnisse aufzulisten: find . -name '*.rb' -print0 &#124; xargs &#8230; <a href="http://sgaul.de/2013/05/07/dateien-nach-loc-auflisten/">Weiterlesen <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>Das einfachste, aber manchmal durchaus ausreichende Maß für Komplexität sind die guten alten Lines of Code. Hier ein kleiner Schnipsel, um in der Bash alle Ruby-Dateien des aktuellen Verzeichnisses und aller Unterverzeichnisse aufzulisten:</p>
<pre>find . -name '*.rb' -print0 | xargs -0 wc -l | sort -n</pre>
<p>Das funktioniert natürlich mit jeder beliebigen Sprache. Einfach die Dateiendung im Find-Befehl anpassen.</p>
]]></content:encoded>
			<wfw:commentRss>http://sgaul.de/2013/05/07/dateien-nach-loc-auflisten/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Umfrage: Die beste Schriftart für Programmierer</title>
		<link>http://sgaul.de/2013/05/05/umfrage-die-beste-schriftart-fur-programmierer/</link>
		<comments>http://sgaul.de/2013/05/05/umfrage-die-beste-schriftart-fur-programmierer/#comments</comments>
		<pubDate>Sun, 05 May 2013 21:19:29 +0000</pubDate>
		<dc:creator>Sebastian Gaul</dc:creator>
				<category><![CDATA[Software-Entwicklung]]></category>
		<category><![CDATA[OSBN]]></category>
		<category><![CDATA[Schriftart]]></category>

		<guid isPermaLink="false">http://sgaul.de/?p=2148</guid>
		<description><![CDATA[Auf der Website Slant läuft derzeit eine Umfrage nach der besten Programmierschriftart. Ganz oben ist derzeit das freie Source Code Pro, insgesamt werden über 30, zum Großteil quelloffene oder zumindest gratis nutzbare Alternativen in Bildform vorgestellt. Für jeden Entwickler einen &#8230; <a href="http://sgaul.de/2013/05/05/umfrage-die-beste-schriftart-fur-programmierer/">Weiterlesen <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>Auf der Website Slant läuft derzeit eine <a href="http://slant.co/topics/67/~what-are-the-best-programming-fonts">Umfrage nach der besten Programmierschriftart</a>. Ganz oben ist derzeit <a title="Adobe mit freier Programmierschriftart" href="http://sgaul.de/2012/09/28/adobe-mit-freier-programmierschriftart/">das freie Source Code Pro</a>, insgesamt werden über 30, zum Großteil quelloffene oder zumindest gratis nutzbare Alternativen in Bildform vorgestellt. Für jeden Entwickler einen Blick wert&#8230;</p>
<p><span id="more-2148"></span></p>
<div id="attachment_1435" class="wp-caption aligncenter" style="width: 310px"><a href="http://sgaul.de/wp-content/uploads/2012/09/adobe-source-code-font.png"><img class="size-full wp-image-1435" alt="Adobe Source Code Pro" src="http://sgaul.de/wp-content/uploads/2012/09/adobe-source-code-font.png" width="300" /></a><p class="wp-caption-text">Adobe Source Code Pro</p></div>
]]></content:encoded>
			<wfw:commentRss>http://sgaul.de/2013/05/05/umfrage-die-beste-schriftart-fur-programmierer/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Rostock zählt seine Hunde</title>
		<link>http://sgaul.de/2013/04/18/rostock-zahlt-seine-hunde/</link>
		<comments>http://sgaul.de/2013/04/18/rostock-zahlt-seine-hunde/#comments</comments>
		<pubDate>Thu, 18 Apr 2013 16:54:43 +0000</pubDate>
		<dc:creator>Sebastian Gaul</dc:creator>
				<category><![CDATA[Allgemein]]></category>
		<category><![CDATA[Rostock]]></category>

		<guid isPermaLink="false">http://sgaul.de/?p=2145</guid>
		<description><![CDATA[Gerade hat eine Dame der Stadt bei mir geklingelt. Sie mache eine Umfrage für eine Hundezählung. Was es nicht alles gibt. Da drängt sich doch die Frage auf, ob das nicht eine subtile Methode zur Aufspürung von Steuerhinterziehern ist, die &#8230; <a href="http://sgaul.de/2013/04/18/rostock-zahlt-seine-hunde/">Weiterlesen <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>Gerade hat eine Dame der Stadt bei mir geklingelt. Sie mache eine Umfrage für eine Hundezählung. Was es nicht alles gibt. </p>
<p>Da drängt sich doch die Frage auf, ob das nicht eine subtile Methode zur Aufspürung von Steuerhinterziehern ist, die ihre Tierchen nicht ordnungsgemäß angemeldet haben. Ein paar Leckerlis in die Tasche und der Schwarzbello wird sich schon verraten&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://sgaul.de/2013/04/18/rostock-zahlt-seine-hunde/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>SQL-Datenbankänderungen testen</title>
		<link>http://sgaul.de/2013/04/14/sql-datenbankanderungen-testen/</link>
		<comments>http://sgaul.de/2013/04/14/sql-datenbankanderungen-testen/#comments</comments>
		<pubDate>Sun, 14 Apr 2013 16:53:11 +0000</pubDate>
		<dc:creator>Sebastian Gaul</dc:creator>
				<category><![CDATA[Software-Entwicklung]]></category>
		<category><![CDATA[Datenbank]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[OSBN]]></category>
		<category><![CDATA[PostgreSQL]]></category>

		<guid isPermaLink="false">http://sgaul.de/?p=2128</guid>
		<description><![CDATA[Manchmal dauert es ein wenig, bis man auf das Offensichtliche kommt. Ich habe hin und her überlegt, wie ich ein Update und Alter Table testen kann, ohne die Daten zu gefährden. Die Lösung ist elementarer Bestandteil einer jeden SQL-Datenbank: Eine &#8230; <a href="http://sgaul.de/2013/04/14/sql-datenbankanderungen-testen/">Weiterlesen <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>Manchmal dauert es ein wenig, bis man auf das Offensichtliche kommt. Ich habe hin und her überlegt, wie ich ein Update und Alter Table testen kann, ohne die Daten zu gefährden. Die Lösung ist elementarer Bestandteil einer jeden SQL-Datenbank: Eine Transaktion.</p>
<h2>Transaktionen in PostgreSQL</h2>
<pre>begin;
alter table mytable rename column id to name;
\d mytable</pre>
<p><span id="more-2128"></span></p>
<pre>
         Table "public.mytable"
   Column   |   Type     |   Modifiers   
------------+------------+--------------
 name       | bigint     | not null
</pre>
<pre>rollback;
\d</pre>
<pre>
         Table "public.mytable"
   Column   |   Type     |   Modifiers   
------------+------------+--------------
 id         | bigint     | not null
</pre>
<p>Sind die vorgenommenen Änderungen korrekt, können sie mit <code>commit;</code> übernommen werden. Der offizielle SQL-Befehl zum Starten einer Transaktion ist <code>start transaction;</code>. Allerdings unterstützen alle mir bekannten Datenbanken die etwas handlichere Form <code>begin;</code>.</p>
<h3>Verschachtelte Transaktionen: Savepoints</h3>
<p>Ist der Test komplexer, so dass man Transaktionen schachteln möchte, kann man sogenannte <a href="http://www.postgresql.org/docs/9.1/static/sql-savepoint.html">Savepoints</a> verwenden.</p>
<pre>begin;
-- Änderung 1
savepoint sp1;
-- Änderung 2a
rollback to savepoint sp1; -- 2a zurücknehmen
-- Änderung 2b
rollback; -- 2b und 1 zurücknehmen
</pre>
<h2>Transaktionen in MySQL</h2>
<p>Die PostgreSQL-Beispiele werden auch von MySQL unterstützt.</p>
]]></content:encoded>
			<wfw:commentRss>http://sgaul.de/2013/04/14/sql-datenbankanderungen-testen/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Android: Display-Rotation abschalten</title>
		<link>http://sgaul.de/2013/04/14/android-display-rotation-abschalten/</link>
		<comments>http://sgaul.de/2013/04/14/android-display-rotation-abschalten/#comments</comments>
		<pubDate>Sun, 14 Apr 2013 13:09:06 +0000</pubDate>
		<dc:creator>Sebastian Gaul</dc:creator>
				<category><![CDATA[Software]]></category>
		<category><![CDATA[Android]]></category>
		<category><![CDATA[Galaxy Nexus]]></category>

		<guid isPermaLink="false">http://sgaul.de/?p=2123</guid>
		<description><![CDATA[Wer kennt das nicht? Ob im Bett oder im Weltraum, manchmal macht der Lagesensor des Telefons nur Ärger. Wie schön wäre es, könnte man den Bildschirm im Hoch- oder Querformat feststellen. Tief in den Einstellungen lässt sich die Automatik zwar abschalten, eine schnell greifbare Lösung ist das aber nicht. Ähnlich umständlich sind Apps oder Widgets zur Fixierung, stets muss man die aktuelle App verlassen. Auto-Rotate Status Bar Switch nistet sich hingegen ins Benachrichtigungssystem ein, das man stets von oben herunterziehen kann. <a href="http://sgaul.de/2013/04/14/android-display-rotation-abschalten/">Weiterlesen <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>Wer kennt das nicht? Ob im Bett oder im Weltraum, manchmal macht der Lagesensor des Telefons nur Ärger. Wie schön wäre es, könnte man den Bildschirm im Hoch- oder Querformat feststellen. Tief in den Einstellungen lässt sich die Automatik zwar abschalten, eine schnell greifbare Lösung ist das aber nicht. Ähnlich umständlich sind Apps oder Widgets zur Fixierung, stets muss man die aktuelle App verlassen. <a href="https://play.google.com/store/apps/details?id=com.friedflow.autorotate">Auto-Rotate Status Bar Switch</a> nistet sich hingegen ins Benachrichtigungssystem ein, das man stets von oben herunterziehen kann.<span id="more-2123"></span> Auf meinem Galaxy Nexus funktioniert das tadellos.</p>
<div id="attachment_2124" class="wp-caption aligncenter" style="width: 310px"><a href="http://sgaul.de/wp-content/uploads/2013/04/Auto-Rotate-Switch-Android.png"><img class="size-full wp-image-2124" alt="Umschalter im Benachrichtigungsmenü" src="http://sgaul.de/wp-content/uploads/2013/04/Auto-Rotate-Switch-Android.png" width="300" height="255" /></a><p class="wp-caption-text">Umschalter im Benachrichtigungsmenü</p></div>
<p>Sicher ist es nicht optimal, den Benachrichtigungsbereich zu missbrauchen. Dennoch stufe ich den praktischen Nutzen hier höher als meinen Sinn für Ordnung ein.</p>
<p>Dennoch wäre es schön, wenn Google so etwas nativ im Schnellauswahlmenü hinter dem Knopf oben rechts im Benachrichtigungsbereich integrieren könnte&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://sgaul.de/2013/04/14/android-display-rotation-abschalten/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>
