<?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>Martin Abraham</title>
	<atom:link href="https://mabraham.de/feed/" rel="self" type="application/rss+xml" />
	<link>https://mabraham.de</link>
	<description>Web, DevOps, Agile &#38; Meer</description>
	<lastBuildDate>Tue, 05 Mar 2019 21:18:42 +0000</lastBuildDate>
	<language>de-DE</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=5.6.10</generator>
	<item>
		<title>Testprojekt encode-decode.com online!</title>
		<link>https://mabraham.de/testprojekt-encode-decode-com-online/</link>
					<comments>https://mabraham.de/testprojekt-encode-decode-com-online/#respond</comments>
		
		<dc:creator><![CDATA[Martin Abraham]]></dc:creator>
		<pubDate>Fri, 03 Feb 2017 00:05:11 +0000</pubDate>
				<category><![CDATA[Alle]]></category>
		<guid isPermaLink="false">https://mabraham.de/?p=1392</guid>

					<description><![CDATA[<p>Während meiner Arbeitszeit bei der checkdomain GmbH befasse ich immer mehr mit Strukturarbeit, z.B. der Optimierung unseres agilen Softwareentwicklungsprozesses; schleichend rück das Coden immer weiter in den Hintergrund. Dieser Wandel macht Spass, da man spürt, &#8230; <a href="https://mabraham.de/testprojekt-encode-decode-com-online/">Weiterlesen</a></p>
<p>Der Beitrag <a rel="nofollow" href="https://mabraham.de/testprojekt-encode-decode-com-online/">Testprojekt encode-decode.com online!</a> erschien zuerst auf <a rel="nofollow" href="https://mabraham.de">Martin Abraham</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>Während meiner Arbeitszeit bei der <a href="https://www.checkdomain.de" target="_blank">checkdomain GmbH</a> befasse ich immer mehr mit Strukturarbeit, z.B. der Optimierung unseres agilen Softwareentwicklungsprozesses; schleichend rück das Coden immer weiter in den Hintergrund. Dieser Wandel macht Spass, da man spürt, wie es uns voran bringt. Um aber beim Coden in der Übung zu bleiben, habe ich die letzten Abende das kleine Projekt <a href="http://encode-decode.com">encode-decode.com</a> auf Symfony-Basis realisiert.
</p>
<p>Auf <a href="http://encode-decode.com">encode-decode.com</a> kann man Strings mit den bekanntesten Algorithmen enkodierten und dekodieren, verschlüsseln und entschlüsseln sowie Hashes berechnen. Keine Raketenwissenschaft, aber für mich ein Spielplatz für Experimente jeder Art, z.B. mit der Symfony-Komponente Translation.
</p>
<p>Happy Encoding!</p>
<p>Der Beitrag <a rel="nofollow" href="https://mabraham.de/testprojekt-encode-decode-com-online/">Testprojekt encode-decode.com online!</a> erschien zuerst auf <a rel="nofollow" href="https://mabraham.de">Martin Abraham</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://mabraham.de/testprojekt-encode-decode-com-online/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>SEPA direct debits cashed twice at Deutsche Bank</title>
		<link>https://mabraham.de/sepa-direct-debits-cashed-twice-at-deutsche-bank/</link>
					<comments>https://mabraham.de/sepa-direct-debits-cashed-twice-at-deutsche-bank/#respond</comments>
		
		<dc:creator><![CDATA[Martin Abraham]]></dc:creator>
		<pubDate>Fri, 03 Jun 2016 07:17:50 +0000</pubDate>
				<category><![CDATA[Alle]]></category>
		<category><![CDATA[deutsche bank]]></category>
		<category><![CDATA[sepa]]></category>
		<guid isPermaLink="false">https://mabraham.de/?p=1384</guid>

					<description><![CDATA[<p>This morning I was afraid about SEPA direct debits cashed twice on my account at Deutsche Bank. According to the technical support of Deutsche Bank it is a bigger problem . Deutsche Bank is working &#8230; <a href="https://mabraham.de/sepa-direct-debits-cashed-twice-at-deutsche-bank/">Weiterlesen</a></p>
<p>Der Beitrag <a rel="nofollow" href="https://mabraham.de/sepa-direct-debits-cashed-twice-at-deutsche-bank/">SEPA direct debits cashed twice at Deutsche Bank</a> erschien zuerst auf <a rel="nofollow" href="https://mabraham.de">Martin Abraham</a>.</p>
]]></description>
										<content:encoded><![CDATA[<div id="attachment_1385" style="width: 310px" class="wp-caption alignleft"><a href="https://mabraham.de/wp-content/uploads/2016/06/sepa-direct-debit-cashed-twice-deutsche-bank.png" rel="attachment wp-att-1385"><img aria-describedby="caption-attachment-1385" loading="lazy" class="size-medium wp-image-1385" src="https://mabraham.de/wp-content/uploads/2016/06/sepa-direct-debit-cashed-twice-deutsche-bank-300x257.png" alt="SEPA direct debits cashed twice" width="300" height="257" srcset="https://mabraham.de/wp-content/uploads/2016/06/sepa-direct-debit-cashed-twice-deutsche-bank-300x257.png 300w, https://mabraham.de/wp-content/uploads/2016/06/sepa-direct-debit-cashed-twice-deutsche-bank-768x658.png 768w, https://mabraham.de/wp-content/uploads/2016/06/sepa-direct-debit-cashed-twice-deutsche-bank-1024x878.png 1024w" sizes="(max-width: 300px) 100vw, 300px" /></a><p id="caption-attachment-1385" class="wp-caption-text">SEPA direct debits cashed twice</p></div>
<p>This morning I was afraid about SEPA direct debits cashed twice on my account at Deutsche Bank.</p>
<p>According to the technical support of Deutsche Bank it is a bigger problem . Deutsche Bank is working hard on a solution which is to be expected , at best, yet this morning . Fees for returned direct debits etc. are not to be expected .</p>
<p>Research in my personal environment confirms, that it is a bigger problem. 5 out of 5 accounts (100%) are affected. Also standing orders are apparently affected. While there will be no major impact for private clients, i am very curious how automatic accounting systems in companys will cope with the problem.</p>
<p>Der Beitrag <a rel="nofollow" href="https://mabraham.de/sepa-direct-debits-cashed-twice-at-deutsche-bank/">SEPA direct debits cashed twice at Deutsche Bank</a> erschien zuerst auf <a rel="nofollow" href="https://mabraham.de">Martin Abraham</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://mabraham.de/sepa-direct-debits-cashed-twice-at-deutsche-bank/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Das Ende der Netzneutralität war gestern</title>
		<link>https://mabraham.de/das-ende-der-netzneutralitaet-war-gestern/</link>
					<comments>https://mabraham.de/das-ende-der-netzneutralitaet-war-gestern/#respond</comments>
		
		<dc:creator><![CDATA[Martin Abraham]]></dc:creator>
		<pubDate>Wed, 16 Sep 2015 23:13:47 +0000</pubDate>
				<category><![CDATA[Alle]]></category>
		<category><![CDATA[Off-Topic]]></category>
		<category><![CDATA[netzneutralität]]></category>
		<category><![CDATA[telekom]]></category>
		<guid isPermaLink="false">https://mabraham.de/?p=1438</guid>

					<description><![CDATA[<p>Netzbetreiber  fühlen sich von der Gewinnschöpfung im Internet ausgeschlossen. Mit "double paid traffic" versucht die Telekom wie einst Comcast 2013 in der USA dies zu ändern und läutet damit das Ende der Netzneutralität ein. <a href="https://mabraham.de/das-ende-der-netzneutralitaet-war-gestern/">Weiterlesen</a></p>
<p>Der Beitrag <a rel="nofollow" href="https://mabraham.de/das-ende-der-netzneutralitaet-war-gestern/">Das Ende der Netzneutralität war gestern</a> erschien zuerst auf <a rel="nofollow" href="https://mabraham.de">Martin Abraham</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>Werbung von der Telekom erhalten viele deutsche Haushalte. Wer sich die Zeit nimmt, das Angebot zu studieren, wird dort keinen Hinweis finden, dass er während der Vertragslaufzeit damit rechnen muss, dass die Telekom seinen Datenverkehr als Daten zweiter Klasse behandelt. Und doch ist dies inzwischen die Realität. &#8211; Wie kann es dazu kommen?</p>
<p>Es gibt keinen Serviceanbieter, der innerhalb seines eigenen Netzes alle Nutzer und Anbieter miteinander verbinden kann. Wenn ein Provider Datenverkehr an einen anderen übergibt, geschieht dies aufgrund einer Vereinbarung, in der sich die Anbieter auf ein weitgehend kostenneutrales Peering oder einen kostenpflichtigen Datentransit verständigen; Mischformen sind ebenfalls möglich. Wesentlich für einen gut funktionierenden Datenstrom sind die Kapazitäten an den Knotenpunkten. Werden die Kapazitäten dem Datenverkehr nicht angepasst, kommt es zu Störungen. Geschieht dies absichtlich, ist der Grundsatz der Gleichbehandlung aller Daten im Netz verletzt, die Netzneutralität nicht gesichert.</p>
<p>Einigen großen Kommunikationsunternehmen wie der Telekom ist der wachsende Datenverkehr, wie er zum Beispiel von Content-Anbietern beim Streaming verursacht wird, ein Dorn im Auge. Sie fühlen sich bei der Gewinnschöpfung übergangen und korrigieren dies dadurch, dass sie Datenengpässe im Internet gezielt zulassen. Dies hat zur Folge, dass die datenintensiven Dienste nur noch eingeschränkt von den Endkunden nutzbar sind. Der Content-Anbieter ist gezwungen, sich eine zusätzliche Anbindung hinzuzukaufen, um den Engpass zu umgehen. Diese Praxis ist nicht nur in Europa zu beobachten: Ein vergleichbares Szenario spielte sich 2013 in den USA ab. Netflix musste zur Sicherstellung seines Streaming-Angebots einen kostenpflichtigen Vertrag dem Internetprovider Comcast abschließen. Dieses Prinzip nennt sich &#8222;double paid traffic&#8220;: Der Netzbetreiber lässt den Datenverkehr vom Kunden über seinen Vertrag bezahlen und zusätzlich vom Content-Anbieter. Wohlgemerkt: Es handelt sich hier nicht um technische Probleme, sondern um ein passiv-destruktives Verhalten und eine gewollte Verletzung der Netzneutralität.</p>
<p>Die Telekom hat sich hierzu folgende Sprachregelung ausgedacht: &#8222;Managed Services&#8220; sollen das Best-Effort-Internet ergänzen. Das klingt an sich erst einmal vernünftig. Nur leider ist den Sprachschöpfern dabei entgangen, dass durch die Praxis der &#8222;Managed Services&#8220; das Best-Effort-Internet keines mehr ist, sondern eine Dienstleistung zweiter Klasse. Dass die Telekom hier völlig unbekümmert über Servicequalitäten entscheiden will, die in laufenden Verträgen über lange Zeit festgelegt sind, stößt erwartungsgemäß auf Widerstand. Auch das blatante Argument, dabei könne sich eine Umsatzbeteiligung von ein paar Prozent jedes Unternehmen leisten, sorgt für Unmut. Welcher Unternehmer lässt sich schon gerne auf solche Weise in seine unternehmerischen Freiheiten hineinreden? Es ist kein Wunder, dass Kritiker des Telekom-Ansatzes sich gelegentlich an mittelalterliche Praktiken erinnert fühlen und das Modell mit einer Wegemaut oder einem Zehnten vergleichen. </p>
<p>Die Debatte um die Erhaltung der Netzneutralität macht deutlich, dass ein Kernpunkt der massive Vertrauensverlust ist, den sich die Telekom in den letzten Jahren erarbeitet hat. Einer der größten Fehler, den sie begeht, ist die mangelnde Transparenz. Die Telekom beklagt gerne den Gegenwind, den sie in dieser Debatte zu spüren bekommt. Und doch liegt der Hauptgrund hierfür bei ihr selbst: Kunden, die der Telekom aufgrund eigener Erfahrungen den Rücken gekehrt haben, stehen den Argumenten mit begründeter Skepsis gegenüber. Gleiches gilt für Geschäftspartner und Unternehmen wie Init7, Cogent, Level 3, die sich über die destruktive Peering Policy beschweren. Die Telekom argumentiert gerne mit der Notwendigkeit der Neuerungen &#8211; nur bleibt sie den Nachweis hierfür ebenso schuldig wie die Erklärung, warum Datenstaus nicht auf andere Weise vermieden werden können.</p>
<p>Eine Ungleichbehandlung von Daten im Internet ist nicht hinnehmbar, schon gar nicht auf die Weise, wie es jetzt schon geschieht und wie es als Geschäftsmodell verbindlich eingeführt werden soll. Das Internet ist eine globale Nutzergemeinschaft, deren Stärke in innovativem Denken, Kreativität und möglichst ungehindertem Austausch liegt. Dass ein Unternehmen seine Marktstellung dazu ausnutzt, um einseitig seine Interessen durchzusetzen und die Interessen anderer zu blockieren, ist inakzeptabel. Die Netzneutralität ist ein ganz wesentliches Merkmal des Internets und sie muss in Zukunft auch erhalten werden. Der Telekom stünde gut an, sich mit dem Gedanken auseinanderzusetzen, dass es keiner der eigenen Kunden gut findet, wenn sich ein Internetprovider herausnimmt, den Kundendatenverkehr nach Gutdünken unterschiedlich zu behandeln und die Nutzung des Internets zu behindern. Denn eines ist in der aktuellen Diskussion um die Netzneutralität klar zu erkennen: Die Telekom hat immer noch nicht verstanden, was für das Internet und seine Nutzer wichtig ist.</p>
<p>Der Beitrag <a rel="nofollow" href="https://mabraham.de/das-ende-der-netzneutralitaet-war-gestern/">Das Ende der Netzneutralität war gestern</a> erschien zuerst auf <a rel="nofollow" href="https://mabraham.de">Martin Abraham</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://mabraham.de/das-ende-der-netzneutralitaet-war-gestern/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>&#8222;Refugees welcome&#8220; Banner für Deine Website</title>
		<link>https://mabraham.de/refugees-welcome-banner-fuer-deine-website/</link>
					<comments>https://mabraham.de/refugees-welcome-banner-fuer-deine-website/#respond</comments>
		
		<dc:creator><![CDATA[Martin Abraham]]></dc:creator>
		<pubDate>Sun, 13 Sep 2015 12:42:33 +0000</pubDate>
				<category><![CDATA[Off-Topic]]></category>
		<category><![CDATA[Projekte]]></category>
		<category><![CDATA[refugees]]></category>
		<category><![CDATA[refugees welcome]]></category>
		<guid isPermaLink="false">https://mabraham.de/?p=1373</guid>

					<description><![CDATA[<p>Bekunde Solidarität mit den Flüchtlingen und binde Solidaritäts-Banner in deine Website ein. <a href="https://mabraham.de/refugees-welcome-banner-fuer-deine-website/">Weiterlesen</a></p>
<p>Der Beitrag <a rel="nofollow" href="https://mabraham.de/refugees-welcome-banner-fuer-deine-website/">&#8222;Refugees welcome&#8220; Banner für Deine Website</a> erschien zuerst auf <a rel="nofollow" href="https://mabraham.de">Martin Abraham</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>Das Theme Flüchtlinge ist allgegenwärtig. Die gleichzeitig aufkeimende rechte Gewalt in Deutschland sehe ich mit Besorgnis. Über <u>refugees are welcome</u> möchte ich Website-Betreibern auf einfache Art und Weise die Möglichkeit geben, ihre Solidarität mit den Flüchtlingen auszudrücken und ein Zeichen gegen rechte Gewalt zu setzen.
</p>
<p>
Auf der Website werden Solidaritäts-<u">Banner</u> in verschiedenen Größen angeboten. Das Angebot steckt noch in den Anfängen und wird fortlaufend ausgebaut.</p>
<p>Der Beitrag <a rel="nofollow" href="https://mabraham.de/refugees-welcome-banner-fuer-deine-website/">&#8222;Refugees welcome&#8220; Banner für Deine Website</a> erschien zuerst auf <a rel="nofollow" href="https://mabraham.de">Martin Abraham</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://mabraham.de/refugees-welcome-banner-fuer-deine-website/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>jQuery prop(), attr() und val() richtig verwenden</title>
		<link>https://mabraham.de/jquery-prop-attr-val-richtig-verwenden/</link>
					<comments>https://mabraham.de/jquery-prop-attr-val-richtig-verwenden/#comments</comments>
		
		<dc:creator><![CDATA[Martin Abraham]]></dc:creator>
		<pubDate>Thu, 10 Jul 2014 20:32:08 +0000</pubDate>
				<category><![CDATA[Alle]]></category>
		<category><![CDATA[Webdesign]]></category>
		<category><![CDATA[Webdevelopment]]></category>
		<category><![CDATA[dom]]></category>
		<category><![CDATA[Html]]></category>
		<category><![CDATA[jQuery]]></category>
		<guid isPermaLink="false">http://mabraham.de/?p=1305</guid>

					<description><![CDATA[<p>Mit jQuery 1.6 wurde die jQuery-Funktion prop() zum Zugriff auf Element-Eigenschaften eingeführt. Im gleichen Zuge wurde die jQuery-Funktion attr() auf den Zugriff auf Element-Attribute reduziert. Diese Artikel erklärt die Unterschiede zwischen Attributen (attributes) Eigenschaften (properties) &#8230; <a href="https://mabraham.de/jquery-prop-attr-val-richtig-verwenden/">Weiterlesen</a></p>
<p>Der Beitrag <a rel="nofollow" href="https://mabraham.de/jquery-prop-attr-val-richtig-verwenden/">jQuery prop(), attr() und val() richtig verwenden</a> erschien zuerst auf <a rel="nofollow" href="https://mabraham.de">Martin Abraham</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>
Mit jQuery 1.6 wurde die jQuery-Funktion <code>prop()</code> zum Zugriff auf Element-Eigenschaften eingeführt. Im gleichen Zuge wurde die jQuery-Funktion <code>attr()</code> auf den Zugriff auf Element-Attribute reduziert. Diese Artikel erklärt die Unterschiede zwischen
</p>
<ul>
<li><a href="#attribute">Attributen (attributes)</a></li>
<li><a href="#properties">Eigenschaften (properties)</a></li>
<li><a href="#values">Werten (values)</a></li>
</ul>
<p>
und zeigt, wann die jQuery-Funktionen
</p>
<ul>
<li><a href="#attr">attr()</a></li>
<li><a href="#prop">prop()</a></li>
<li><a href="#val">val()</a></li>
</ul>
<p>
verwendet werden sollten. Für Ungeduldige gibt es eine am Ende eine <a href="#fazit">Zusammenfassung</a>.
</p>
<p>Wer tiefer in JQuery einsteigen möchte und ein gutes deutschsprachiges Buch sucht, dem empfehle ich <a href="http://www.amazon.de/gp/product/3836226383/ref=as_li_ss_tl?ie=UTF8&#038;camp=1638&#038;creative=19454&#038;creativeASIN=3836226383&#038;linkCode=as2&#038;tag=mabraham-21">jQuery: Das Praxisbuch (Galileo Computing)</a><img loading="lazy" src="http://ir-de.amazon-adsystem.com/e/ir?t=mabraham-21&#038;l=as2&#038;o=3&#038;a=3836226383" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" />.
</p>
<h2 id="attribute">Was ist ein Attribut (attribute)?</h2>
<p>
Unter einem Attribut versteht man eine Zusatzinformation zu einem HTML-Element im HTML-Quelltext. Attribute bestehen aus einem Name-Wert-Paar, so hat das folgende Input-Element
</p>
<p><code></p>
<pre>
    &lt;input type="checkbox" value="1" checked="checked" /&gt;
</pre>
<p></code></p>
<p>
die Attribute <code>Type</code>, <code>Value</code> und <code>Checked</code>. Die Name-Wert-Paare sind wie folgt
</p>
<table>
<tr>
<th>Name</th>
<th>Wert</th>
</tr>
<tr>
<td>type</td>
<td>checkbox</td>
</tr>
<tr>
<td>value</td>
<td>1</td>
</tr>
<tr>
<td>checked</td>
<td>checked</td>
</tr>
</table>
<p>Ein Attribute behält im Webbrowser immer seinen initialen Wert, es sei denn der HTML-Quelltext wird überschrieben. Wird im Browser in einem Select-Element ein anderes als das initial über das Attribute <code>selected</code> ausgewählte Option-Element ausgewählt, so ändert sich weder der Wert des Attributs <code>selected</code> im initial ausgewählten, noch wird das Attribut <code>selected</code> im neu ausgewählten Element gesetzt.</p>
<h2 id="properties">Was ist eine Eigenschaft (property)?</h2>
<p>
Der Browser erzeugt aus dem HTML-Quelltext ein internes Modell. Neben Diese Modell, bzw. seine Schnittstelle wird auch als Document-Object-Model bezeichnet. Für jedes Attribut eines HTML-Elements existiert eine korrespondierende Eigenschaft (property) im entsprechenden Objekt (object). Neben diesen Eigenschaften (properties) besitzen die Objekte noch weitere, für welche keine korrespondierenden Attribute existieren. Beispiele solcher Properties sind
</p>
<ul>
<li><code>window.location</code></li>
<li><code>selectedIndex</code></li>
<li><code>tagName</code></li>
<li><code>nodeName</code></li>
<li><code>nodeType</code></li>
<li><code>ownerDocument</code></li>
<li><code>defaultChecked</code></li>
<li><code>defaultSelected</code></li>
</ul>
<p>
Zur Laufzeit arbeitet der Browser Vereinfacht dargestellt auf den Objekten im DOM. Eigenschaften von Objekten (Knoten) im DOM können anders als Attribute ihre Werte ändern, z.B. wenn eine Eingabe gemacht oder ein Wert in einem Select-Element ausgewählt wird. Auch können die Werte programmatisch über das DOM ausgelesen oder verändert werden.
</p>
<h2 id="values">Was ist ein Wert (value)?</h2>
<p>
In Formularfeldern wie <code>input</code>, <code>select</code>, <code>textarea</code> gibt es das Attribut/die Eigenschaft <code>value</code>, welches den Wert der Felder enthält. Über das Attribut <code>value</code> kann ein Text angegeben werden, mit dem das Feld vorbelegt wird. In der Eigenschaft value ist der aktuelle Wert des Feldes abrufbar.
</p>
<p><code></p>
<pre>
    &lt;input type="text" value="foo" /&gt;
</pre>
<p></code></p>
<h2 id="attr">jQuery attr()</h2>
<p>
Über die jQuery Funktion <code>attr()</code> kann lesend und schreibend auf die Werte von Attributen zugegriffen werden. Ausgehend von den HTML-Elementen
</p>
<p><code></p>
<pre>
    &lt;a name="Baum" /&gt;
    &lt;a name="Blume" href="blume.html" /&gt;
</pre>
<p></code></p>
<p>
Beim Lesezugriff wird der Wert des angegebenen Attributs im ersten Element der Auswahl zurückgegeben.
</p>
<p><code></p>
<pre>
    $('a').attr('alt');
    // Ergebnis: "Baum"
    
    $('a').attr('href');
    // Ergebnis: "undefined"
</pre>
<p></code></p>
<p>
Beim Schreibzugriff werden die Attributwerte in allen Elementen der Auswahl überschrieben
</p>
<p><code></p>
<pre>
    $('a').attr('href', 'neu.html');
    // Ergebnis: Alle Links zeigen nun auf 'neu.html'
</pre>
<p></code></p>
<h3>Unterschiede jQuery 1.5.*, 1.6.0 und 1.6.1+</h3>
<p>
Bis jQuery 1.5.* gab die jQuery-Funktion <code>attr()</code> neben den Werten der angefragten Attribute besonders im Kontext von Formularen häufig auch Werte von Eigenschaften (properties) zurück und wurde mangels Alternativen zum Zugriff auf beide von Entwicklern verwendet.
</p>
<p>
Mit jQuery 1.6.0 wurde <code>attr()</code> strikt auf den Zugriff aut HTML-Attribute eingeschränkt. Dies führte zu vielen Inkompatibilitäten mit älterem Code und löste eine große Debatte aus.
</p>
<p>
Mit jQuery 1.6.1+ wurde die jQuery-Funktion <code>attr()</code> aus Gründen der Abwärtskompatibilität wieder weitgehend an die Funktionsweise vor 1.6.0 angeglichen. Kleine Unterschiede bleiben allerdings. So wird für die Attribute/Eigenschaften <code>checked</code> und <code>selected</code> statt wie bisher <code>true</code>/<code>false</code> nun in gängigen Browsern String <code>"checked"</code> bzw. <code>undefined</code> zurückgeben.
</p>
<table>
<tr>
<th>Attribut/Eigenschaft</th>
<th>Rückgabewert jQuery 1.5.4</th>
<th>Rückgabewert jQuery 1.6.1+</th>
</tr>
<tr>
<td>$(&#8218;input:checkbox&#8216;).attr(&#8218;checked&#8216;)</td>
<td>true/false</p>
<td>&#8222;checked&#8220;/undefined</td>
</tr>
<tr>
<td>$(&#8218;option&#8216;).attr(&#8217;selected&#8216;)</td>
<td>true/false</p>
<td>&#8222;selected&#8220;/undefined</td>
</tr>
</table>
<h3>Verwendung von jQuery attr()</h3>
<p>
Laut <a href="http://blog.jquery.com/2011/05/12/jquery-1-6-1-released/" rel="nofollow" target="_blank">Dokumentation</a> soll die jQuery-Funktion <code>attr()</code> ab 1.6.1 zum Zugriff auf nicht boolsche Attribute/Eigenschaften verwendet werden. Also weitgehend äquivalent zu seiner Verwendung vor jQuery 1.6.
</p>
<p>
Abweichend davon empfehle ich <code>attr()</code> nur für den den Zugriff auf nicht boolsche Attribute zu verwenden, einfach aus Gründe der Sauberkeit. Auch gibt es hierdurch einen marginalen Performancevorteil, da die jQuery-Funktion <code>attr()</code> beim Zugriff auf Properties auf <code>prop()</code> zurückgreift.
</p>
<h2 id="prop">jQuery prop()</h2>
<p>
Ab jQuery 1.6.0 kann über die Funktion <code>prop()</code> auf die aktuellen Werte von Objekt-Eigenschaften zugegriffen werden.
</p>
<p>
Ausgehend von den HTML-Elementen:
</p>
<p><code></p>
<pre>
    &lt;input type="checkbox" /&gt;
    &lt;input type="checkbox" checked="checked" /&gt;
</pre>
<p></code></p>
<p>
kann wie folgt die Eigenschaft <code>checked</code> des ersten Elements in der Auswahl geprüft werden:
</p>
<p><code></p>
<pre>
    $('input:checkbox').prop('checked');
    /* Ergebnis: false */
</pre>
<p></code></p>
<p>
Der Wert der Eigenschaft <code>checked</code> kann wie folgt für alle Elemente der Auswahl geändert werden:
</p>
<p><code></p>
<pre>
    $('input:checkbox').prop('checked', false);
    /* Ergebnis: Keine Checkbox mehr ausgewählt */
</pre>
<p></code></p>
<p>
Speziell bei der Arbeit mit Formularen bietet sich die Verwendung von jQuery <code>prop()</code> zum Zugriff auf die boolschen Eigenschaften <code>checked</code> und <code>selected</code> an.
</p>
<table>
<tr>
<th>Attribut/Eigenschaft</th>
<th>Rückgabewert jQuery 1.5.4</th>
<th>Rückgabewert jQuery 1.6.1+</th>
</tr>
<tr>
<td>$(&#8218;input:checkbox&#8216;).prop(&#8218;checked&#8216;)</td>
<td>nicht unterstützt</p>
<td>true/false</td>
</tr>
<tr>
<td>$(&#8218;input:checkbox&#8216;).prop(&#8217;selected&#8216;)</td>
<td>nicht unterstützt</p>
<td>true/false</td>
</tr>
</table>
<h3>Verwendung von jQuery prop()</h3>
<p>
Laut <a href="http://blog.jquery.com/2011/05/12/jquery-1-6-1-released/" rel="nofollow" target="_blank">Dokumentation</a> soll <code>prop()</code> nur für den Zugriff auf boolsche Eigenschaften und solche, für die kein äquivalentes Attribut existiert, verwendet werden.
</p>
<p>
Abweichend davon empfehle ich die jQuery-Funktion <code>prop()</code> für den Zugriff auf alle Eigenschaften (properties) sowie auf boolsche Attribute.
</p>
<h2 id="val">jQuery val()</h2>
<p>
Für den Zugriff auf Werte von Formularfeldern wurde die jQuery-Funktion <code>val()</code> eingeführt, über die auf die  Eigenschaft <code>value</code> der Felder zugegriffen werden kann. Außerhalb von Formularfeldern ist <code>val()</code> ohne Bedeutung.
</p>
<p>
Ausgehend von den HTML-Elementen:
</p>
<p><code></p>
<pre>
    &lt;input type="text" value="abc" /&gt;
    &lt;input type="text" value="def" /&gt;
</pre>
<p></code><br />
kann wie folgt die Eigenschaft <code>value</code> des ersten Elements in der Auswahl geprüft werden:<br />
<code></p>
<pre>
    $('input:text').val();
    /* Ergebnis: false */
</pre>
<p></code></p>
<p>
Der Wert der Eigenschaft <code>value</code> kann wie folgt für alle Elemente der Auswahl geändert werden:
</p>
<p><code></p>
<pre>
    $('input:text').val('ghi');
    /* Ergebnis: Alle Input-Felder werden mit ghi belegt */
</pre>
<p></code></p>
<h3>Verwendung von jQuery val()</h3>
<p>
Für die einen steht <code>val()</code> für bessere Lesbarkeit, für mich ist die weitere Verwendung von <code>val()</code> seit der Einführung von <code>prop()</code> unnötig, da ebenfalls über <code>prop()</code> auf die Eigenschaft zugegriffen werden kann.
</p>
<h2 id="fazit">Zusammenfassung</h2>
<p>
Unter einem Attribute versteht man eine Zusatzinformation zu einem HTML-Element im HTML-Quelltext. Attribute ändern Ihren Wert zur Laufzeit nicht. Aus dem HTML-Quelltext erzeugt der Browser zur Laufzeit das Document-Object-Model (DOM). HTML-Elemente werden im DOM durch Objekte repräsentiert. Properties sind Eigenschaft eines Objekts, die sich zur Laufzeit ändern können.
</p>
<p>
jQuery <code>attr()</code> sollte nur noch für den Zugriff auf nicht boolsche Attribute verwendet werden. Auf boolsche Attribute (<code>checked</code>, <code>selected</code>, etc.) sowie auf alle Properties kann mit jQuery <code>prop()</code> zugegriffen werden. Die Verwendung von jQuery <code>val()</code> zum Zugriff auf die Eigenschaft value von Formularfeldern kann aufgrund besserer Lesbarkeit prop() vorgezogen werden.
</p>
<p>
Ich hoffe, mit diesem Artikel etwas Licht in das Thema &#8222;jQuery prop() attr() val()&#8220; gebracht zu haben. Auch wenn die Änderung jetzt schon einige Zeit her ist stiftet dieses Thema leider immer noch Verwirrung.</p>
<p>Der Beitrag <a rel="nofollow" href="https://mabraham.de/jquery-prop-attr-val-richtig-verwenden/">jQuery prop(), attr() und val() richtig verwenden</a> erschien zuerst auf <a rel="nofollow" href="https://mabraham.de">Martin Abraham</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://mabraham.de/jquery-prop-attr-val-richtig-verwenden/feed/</wfw:commentRss>
			<slash:comments>2</slash:comments>
		
		
			</item>
		<item>
		<title>PHP 5.3 EOL &#8211; Höchste Zeit für Update auf PHP 5.4+</title>
		<link>https://mabraham.de/php-5-3-eol-hoechste-zeit-fuer-update-auf-php-5-4/</link>
					<comments>https://mabraham.de/php-5-3-eol-hoechste-zeit-fuer-update-auf-php-5-4/#respond</comments>
		
		<dc:creator><![CDATA[Martin Abraham]]></dc:creator>
		<pubDate>Sun, 15 Jun 2014 20:46:53 +0000</pubDate>
				<category><![CDATA[Alle]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[Sicherheit]]></category>
		<category><![CDATA[Webdevelopment]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[phpcs]]></category>
		<guid isPermaLink="false">http://mabraham.de/?p=1293</guid>

					<description><![CDATA[<p>PHP 5.3 hat am 10. Juli 2014 sein End of Life (EOL) erreicht. Mit einem Update auf PHP 5.4 kommen 22 nicht rückwärtskompatible Änderungen, die zu Problemen mit älterem Code führen können. Wie untersucht man nun größere Mengen an Sourcecode automatisch auf Inkompatiblitäten? <a href="https://mabraham.de/php-5-3-eol-hoechste-zeit-fuer-update-auf-php-5-4/">Weiterlesen</a></p>
<p>Der Beitrag <a rel="nofollow" href="https://mabraham.de/php-5-3-eol-hoechste-zeit-fuer-update-auf-php-5-4/">PHP 5.3 EOL &#8211; Höchste Zeit für Update auf PHP 5.4+</a> erschien zuerst auf <a rel="nofollow" href="https://mabraham.de">Martin Abraham</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>
PHP 5.3 hat am 10. Juli 2014 sein End of Life (EOL) erreicht. Am 11. Juli 2013 erschien das <a href="http://php.net/releases/5_3_27.php" target="_blank">letzten regulären Release 5.3.27</a>. Ein Jahr danach endet der reguläre Bereitstellungszeitraum für Sicherheitspatches für PHP 5.3.
</p>
<p>
Höchste Zeit für ein Versionsupdate. Doch mit einem Update auf PHP 5.4+ kommen 22 nicht rückwärtskompatible Änderungen, die zu Problemen führen können, besonders mit älterem Code. Eine <a href="http://php.net/manual/en/migration54.incompatible.php" target="_blank" rel="nofollow">List der nicht rückwärtskompatiblen Änderungen</a> ist <a href="http://php.net/manual/en/migration54.incompatible.php" target="_blank" rel="nofollow">hier</a> zu finden.
</p>
<p>
Am bedeutesten sollten in diesem Zusammenhang die Einstellung der folgenden Features sein:
</p>
<ul>
<li><a href="http://www.php.net/manual/de/ini.core.php#ini.register-globals" target="_blank" rel="nofollow">Register globals</a></li>
<li><a href="http://www.php.net/manual/de/language.references.pass.php" target="_blank" rel="nofollow">Call-time pass by reference</a></li>
<li><a href="http://www.php.net/manual/de/features.safe-mode.php" target="_blank" rel="nofollow">Safe mode</a></li>
<li><a href="http://www.php.net/manual/de/security.magicquotes.php" target="_blank" rel="nofollow">Magic Quote</a></li>
</ul>
<h2>Automatische Suche nach PHP 5.4 Inkompatibilitäten in PHP-Sourcecode</h2>
<p>
Doch wie überprüft man effizient größere Mengen an Quelltext auf Inkompatibilitäten? Keine Panik, hierfür hat <a href="http://techblog.wimgodden.be/2012/03/04/php-5-4-compatibility-checks-using-php_codesniffer/" target="_blank" rel="nofollow">Wim Godden</a> hat ein <a href="https://github.com/wimg/PHPCompatibility" target="_blank" rel="nofollow">Ruleset für PHP_CodeSniffer</a> (phpcs) bereitgestellt.<br />
Über <a href="http://pear.php.net/manual/en/package.php.php-codesniffer.php" target="_blank" rel="nofollow">phpcs</a> sollte sich so ein Großteil der Inkompatibilitäten vor dem Version-Update ausfindig machen lassen.
</p>
<p>
Um die restlichen Inkompatibilitäten nach dem Update schnell ausfindig zu machen bietet sich die Verwendung eines Error-Aggregators wie <a href="https://github.com/getsentry/sentry" target="_blank" rel="nofollow">Sentry</a> an.</p>
<p>Der Beitrag <a rel="nofollow" href="https://mabraham.de/php-5-3-eol-hoechste-zeit-fuer-update-auf-php-5-4/">PHP 5.3 EOL &#8211; Höchste Zeit für Update auf PHP 5.4+</a> erschien zuerst auf <a rel="nofollow" href="https://mabraham.de">Martin Abraham</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://mabraham.de/php-5-3-eol-hoechste-zeit-fuer-update-auf-php-5-4/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>MySQL Query Logging/ Query Monitoring</title>
		<link>https://mabraham.de/mysql-query-logging-query-monitoring/</link>
					<comments>https://mabraham.de/mysql-query-logging-query-monitoring/#respond</comments>
		
		<dc:creator><![CDATA[Martin Abraham]]></dc:creator>
		<pubDate>Mon, 13 May 2013 19:54:19 +0000</pubDate>
				<category><![CDATA[Alle]]></category>
		<category><![CDATA[Datenbanken]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[logging]]></category>
		<category><![CDATA[Mysql]]></category>
		<category><![CDATA[shell]]></category>
		<guid isPermaLink="false">http://mabraham.de/?p=1238</guid>

					<description><![CDATA[<p>MySQL bietet mit <a href="http://dev.mysql.com/doc/refman/5.7/en/query-log.html" target="_blank" rel="nofollow">General Query Log</a> eine leichtgewichtige Funktion, die das Loggen aller eingehenden Queries in ein Logfile ermöglicht. Im Folgenden wird die Verwendung beschrieben. <a href="https://mabraham.de/mysql-query-logging-query-monitoring/">Weiterlesen</a></p>
<p>Der Beitrag <a rel="nofollow" href="https://mabraham.de/mysql-query-logging-query-monitoring/">MySQL Query Logging/ Query Monitoring</a> erschien zuerst auf <a rel="nofollow" href="https://mabraham.de">Martin Abraham</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>Möchte man eine Übersicht aller auf einem MySQL-Server verarbeiteter Queries, bietet sich das Zwischenschalten von <a href="http://dev.mysql.com/downloads/mysql-proxy/" target="_blank" rel="nofollow">MySQL Proxy</a> an. Während der Entwicklung bietet MySQL mit <a href="http://dev.mysql.com/doc/refman/5.7/en/query-log.html" target="_blank" rel="nofollow">General Query Log</a> eine leichtgewichtige Alternative, die sich auf das Loggen aller eingehenden Queries in ein Logfile beschränkt. </p>
<p>Den aktuellen Status kann man im MySQL Client wie folgt erfragen:</p>
<pre class="brush: bash; title: ; notranslate">
mysql&gt; SHOW VARIABLES LIKE &quot;general_log%&quot;;

+------------------+----------------------------+
| Variable_name    | Value                      |
+------------------+----------------------------+
| general_log      | OFF                        |
| general_log_file | /var/run/mysqld/mysqld.log |
+------------------+----------------------------+
</pre>
<p>Im Beispiel ist das General Log deaktiviert und die Datei <code>/var/run/mysqld/mysqld.log</code> als Logdatei voreingestellt.</p>
<p>Aktivieren lässt sich das General Log via:</p>
<pre class="brush: bash; title: ; notranslate">
mysql&gt; SET GLOBAL general_log = 'ON';
</pre>
<p>Wieder deaktivieren lässt es sich via:</p>
<pre class="brush: bash; title: ; notranslate">
mysql&gt; SET GLOBAL general_log = 'OFF';
</pre>
<p>Eingehende Queries kann man in der Shell fortlaufend ausgeben via:</p>
<pre class="brush: bash; title: ; notranslate">
tail -f /var/run/mysqld/mysqld.log
</pre>
<p>Der Beitrag <a rel="nofollow" href="https://mabraham.de/mysql-query-logging-query-monitoring/">MySQL Query Logging/ Query Monitoring</a> erschien zuerst auf <a rel="nofollow" href="https://mabraham.de">Martin Abraham</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://mabraham.de/mysql-query-logging-query-monitoring/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>DoctrineExtensions mit Symfony2 &#038; Doctrine2 verwenden</title>
		<link>https://mabraham.de/doctrineextensions-mit-symfony2-doctrine2-verwenden/</link>
					<comments>https://mabraham.de/doctrineextensions-mit-symfony2-doctrine2-verwenden/#respond</comments>
		
		<dc:creator><![CDATA[Martin Abraham]]></dc:creator>
		<pubDate>Tue, 07 May 2013 18:35:27 +0000</pubDate>
				<category><![CDATA[Alle]]></category>
		<category><![CDATA[Datenbanken]]></category>
		<category><![CDATA[Doctrine]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[Symfony2]]></category>
		<category><![CDATA[doctrine2]]></category>
		<category><![CDATA[Mysql]]></category>
		<category><![CDATA[mysql specific]]></category>
		<category><![CDATA[symfony2]]></category>
		<guid isPermaLink="false">http://mabraham.de/?p=1227</guid>

					<description><![CDATA[<p>Dieser Artikel beschreibt wie man die DoctrineExtensions von Benjamin Eberle in Symfony2 &#038; Doctrine2 integriert, um MySQL-spezifische Funktionen innerhalb von Doctrine zu nutzen. <a href="https://mabraham.de/doctrineextensions-mit-symfony2-doctrine2-verwenden/">Weiterlesen</a></p>
<p>Der Beitrag <a rel="nofollow" href="https://mabraham.de/doctrineextensions-mit-symfony2-doctrine2-verwenden/">DoctrineExtensions mit Symfony2 &#038; Doctrine2 verwenden</a> erschien zuerst auf <a rel="nofollow" href="https://mabraham.de">Martin Abraham</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>Wie viele andere verwende ich als relationales Datenbankmanagementsystem (RDBMS) weitgehend MySQL. Leider unterstützt Doctrine2 von Haus aus keine/kaum MySQL-spezifische Funktionen wie beispielsweise <code>IFNULL</code>. Diese Lücke schließen die <a target="_blank" rel="nofollow" href="https://github.com/beberlei/DoctrineExtensions">DoctrineExtensions</a> von <a target="_blank" rel="nofollow" href="http://www.beberlei.de/">Benjamin Eberlei</a>. Dieser Artikel beschreibt wie man die DoctrineExtensions in Symfony2 &#038; Doctrine2 integriert.</p>
<p>Unter <a target="_blank" rel="nofollow" href="https://packagist.org/packages/beberlei/DoctrineExtensions">packagist.org</a> steht ein Paket für die Installation via <a target="_blank" rel="nofollow" href="http://getcomposer.org/">Composer</a> bereit. </p>
<p>Zur Installation wird die die <code>composer.json</code> im Hauptverzeichnis des Projekts um die folgende Zeile im Bereich <code>require</code> ergänzt.</p>
<pre class="brush: jscript; title: ; notranslate">
    &quot;require&quot;: {
        [..]
        # folgende Zeile einfügen
        &quot;beberlei/DoctrineExtensions&quot;: &quot;dev-master&quot;
        [..]
    }
</pre>
<p>Die eigentliche Installation wird via </p>
<pre class="brush: jscript; title: ; notranslate">
php composer.phar update beberlei/DoctrineExtensions
</pre>
<p>angestoßen und abgeschlossen.</p>
<p>Die in den Erweiterungen enthaltenen MySQL-spezifischen Funktionen findet man anschließend im Verzeichnis <code>vendor/beberlei/DoctrineExtension/lib/DoctrineExtensions/Query/Mysql</code>. Um nun beispielsweise die Funktion <code>IFNULL</code>  zu Doctrine hinzuzufügen, genügt es unter <code>app/config/config.php</code> die folgenden zwei Zeile im Bereich <code>doctrine:orm:dql</code> hinzuzufügen. Nebenbei: <code>DoctrineExtensions\Query\Mysql</code> ist der Namespace der MySQL-spezifischen Funktionen in der Extension.</p>
<pre class="brush: jscript; title: ; notranslate">
[..]
doctrine:
    orm:
        dql:
            # folgende zwei Zeilen hinzufügen.
            string_functions:
                ifnull: DoctrineExtensions\Query\Mysql\IfNull
[..]
</pre>
<p>Anschießend kann die neue Funktion in Symfony verwendet werden.</p>
<pre class="brush: php; title: ; notranslate">
$qb = $this-&gt;getManager()-&gt;createQueryBuilder();
$qb -&gt;select(array('b'))
    -&gt;addSelect('IFNULL(b.price, 1) AS HIDDEN hiddenprice')
    -&gt;from(FooBundle:Bar, 'b')
    -&gt;where(hiddenprice &lt;= 1);
</pre>
<p>Viel Vergnügen!</p>
<p>Der Beitrag <a rel="nofollow" href="https://mabraham.de/doctrineextensions-mit-symfony2-doctrine2-verwenden/">DoctrineExtensions mit Symfony2 &#038; Doctrine2 verwenden</a> erschien zuerst auf <a rel="nofollow" href="https://mabraham.de">Martin Abraham</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://mabraham.de/doctrineextensions-mit-symfony2-doctrine2-verwenden/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>mod_rewrite cheatsheet</title>
		<link>https://mabraham.de/mod_rewrite-cheatsheet/</link>
					<comments>https://mabraham.de/mod_rewrite-cheatsheet/#comments</comments>
		
		<dc:creator><![CDATA[Martin Abraham]]></dc:creator>
		<pubDate>Sat, 13 Apr 2013 08:55:20 +0000</pubDate>
				<category><![CDATA[Alle]]></category>
		<category><![CDATA[Projekte]]></category>
		<category><![CDATA[Webdevelopment]]></category>
		<category><![CDATA[apache]]></category>
		<category><![CDATA[cheatsheet]]></category>
		<category><![CDATA[mod_rewrite]]></category>
		<guid isPermaLink="false">http://mabraham.de/?p=1193</guid>

					<description><![CDATA[<p>Der mod_rewrite Cheatsheet bietet eine praktische Übersicht aller bedeutenden Aspekte von mod_rewrite. Weiter bietet der mod_rewrite Cheatsheet standardisierte Lösungen für häufige Praxisfälle, ohne dabei zu sehr in die Tiefe zu gehen. <a href="https://mabraham.de/mod_rewrite-cheatsheet/">Weiterlesen</a></p>
<p>Der Beitrag <a rel="nofollow" href="https://mabraham.de/mod_rewrite-cheatsheet/">mod_rewrite cheatsheet</a> erschien zuerst auf <a rel="nofollow" href="https://mabraham.de">Martin Abraham</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>Das Apache Webserver Modul <a href="http://mod-rewrite-cheatsheet.com/" target="_BLANK">mod_rewrite</a> ermöglicht die Abbildung generischer Urls (<code>http://mabraham.de/page.php?cat=1&page=3&locale=de</code>) in Suchmaschinen-freundliche (Onpage-SEO) und für Menschen verständliche Urls (<code>http://mabraham.de/mod_rewrite-cheatsheet</code>). Jeder Webentwickler muss sich heutzutage mit einer Rewrite Engines wie mod_rewrite befassen, jedoch meist zu selten um Routinen aufzubauen.</p>
<p>Der <a href="http://mod-rewrite-cheatsheet.com/" target="_BLANK">mod_rewrite Cheatsheet</a> bietet eine praktische Übersicht aller bedeutenden Aspekte von mod_rewrite. Weiter bietet der <a href="http://mod-rewrite-cheatsheet.com/" target="_BLANK">mod_rewrite Cheatsheet</a> standardisierte Lösungen für häufige Praxisfälle, ohne dabei zu sehr in die Tiefe zu gehen.</p>
<p>Der Beitrag <a rel="nofollow" href="https://mabraham.de/mod_rewrite-cheatsheet/">mod_rewrite cheatsheet</a> erschien zuerst auf <a rel="nofollow" href="https://mabraham.de">Martin Abraham</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://mabraham.de/mod_rewrite-cheatsheet/feed/</wfw:commentRss>
			<slash:comments>4</slash:comments>
		
		
			</item>
		<item>
		<title>Doctrine 2.3: Datenbank Schema Generierung und Character Sets (charset)</title>
		<link>https://mabraham.de/doctrine-2-3-datenbank-schema-generierung-und-character-sets-charset/</link>
					<comments>https://mabraham.de/doctrine-2-3-datenbank-schema-generierung-und-character-sets-charset/#respond</comments>
		
		<dc:creator><![CDATA[Martin Abraham]]></dc:creator>
		<pubDate>Thu, 11 Apr 2013 21:07:12 +0000</pubDate>
				<category><![CDATA[Alle]]></category>
		<category><![CDATA[Datenbanken]]></category>
		<category><![CDATA[Webdevelopment]]></category>
		<category><![CDATA[doctrine2]]></category>
		<category><![CDATA[encoding]]></category>
		<category><![CDATA[symfony2]]></category>
		<guid isPermaLink="false">http://mabraham.de/?p=1183</guid>

					<description><![CDATA[<p>Seit Doctrine 2.3 wird unabhängig von der Konfiguration der Applikation oder des Datenbankservers grundsätzlich von <code>utf8</code> als Encoding und <code>utf8_unicode_ci</code> als Collation ausgegangen. Um ein abweichendes Encoding wie <code>Latin1</code> verwenden zu können, muss dies in der Definition der Entität explizit angeben. Der Artikel beschreibt das hierfür notwendige Vorgehen. <a href="https://mabraham.de/doctrine-2-3-datenbank-schema-generierung-und-character-sets-charset/">Weiterlesen</a></p>
<p>Der Beitrag <a rel="nofollow" href="https://mabraham.de/doctrine-2-3-datenbank-schema-generierung-und-character-sets-charset/">Doctrine 2.3: Datenbank Schema Generierung und Character Sets (charset)</a> erschien zuerst auf <a rel="nofollow" href="https://mabraham.de">Martin Abraham</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>In <a href="http://symfony-project.org/" rel="nofollow">Symfony2</a> / <a href="http://www.doctrine-project.org/" rel="nofollow">Doctrine2</a> Projekten können Entitäten u.a. in YAML definiert und das Datenbank Schema via <code>app/console doctrine:schema:create</code> generiert werden. In Doctrine 2.3 machte mir dabei eine kleine Änderung bezüglich der Behandlung von Encoding und Collation Probleme. </p>
<p>Seit 2.3 wird unabhängig von der Konfiguration der Applikation oder des Datenbankservers grundsätzlich von <code>utf8</code> als Encoding und <code>utf8_unicode_ci</code> als Collation ausgegangen. Um ein abweichendes Encoding wie <code>Latin1</code> verwenden zu können, muss dies in der Definition der Entität explizit angeben. </p>
<p>Um beispielsweise in der Entität <code>Task</code> <code>latin1/latin1_swedish_ci</code> verwenden, muss die Definition wie folgt erweitert werden:</p>
<pre class="brush: css; title: ; notranslate">
Acme\Entity\Task:
  type: entity
  table: Task
  [..]
  
# begin: charset/ collation

  options:
    charset: &quot;latin1&quot;
    collate: &quot;latin1_swedish_ci&quot;

# end: charset/ collation start

  id:
    id:
      type: integer
      generator: { strategy: AUTO }
  [..]
</pre>
<p>Im <a href="http://www.doctrine-project.org/jira/browse/DDC-2139" rel="nofollow">folgenden Support-Ticket</a> bestätigt Benjamin Eberlei von Doctrine dieses Verhalten. Doctrine setzt <code>utf8/utf8-general-ci</code> als Standard fest. Möchte man hiervon abweichen, muss man dies explizit angeben.</p>
<p>Der Beitrag <a rel="nofollow" href="https://mabraham.de/doctrine-2-3-datenbank-schema-generierung-und-character-sets-charset/">Doctrine 2.3: Datenbank Schema Generierung und Character Sets (charset)</a> erschien zuerst auf <a rel="nofollow" href="https://mabraham.de">Martin Abraham</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://mabraham.de/doctrine-2-3-datenbank-schema-generierung-und-character-sets-charset/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
