<?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 Gamnitzer</title>
	<atom:link href="http://martin-gamnitzer.de/feed/" rel="self" type="application/rss+xml" />
	<link>http://martin-gamnitzer.de</link>
	<description></description>
	<lastBuildDate>Wed, 17 Jun 2015 09:01:35 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>daily</sy:updatePeriod>
	<sy:updateFrequency>4</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
		<item>
		<title>Kommentar zur 1. leipziger &#8220;Nerd Nite&#8221;</title>
		<link>http://martin-gamnitzer.de/2011/01/kommentar-zur-1-leipziger-nerd-nite/?piwik_campaign=rss&#038;piwik_kwd=kommentar-zur-1-leipziger-nerd-nite</link>
		<comments>http://martin-gamnitzer.de/2011/01/kommentar-zur-1-leipziger-nerd-nite/#comments</comments>
		<pubDate>Thu, 13 Jan 2011 23:49:49 +0000</pubDate>
		<dc:creator>martin</dc:creator>
				<category><![CDATA[Allgemein]]></category>

		<guid isPermaLink="false">http://martin-gamnitzer.de/?p=85</guid>
		<description><![CDATA[Heute Abend wurde im Beyerhaus die erste leipziger Nerd Nite abgehalten.Nerd Nites bestehen aus kurzen Vorträgen zu wissenschatlichen Spezialthemen (meist aktuelle Ergbenisse der eigenen wissenschaftlichen Arbeit) und anschließenden Diskussions- und Fragerunden.Der Saal im Beyerhaus war heute Abend jedenfalls sehr gut gefüllt (vorrangig mit Studierenden). Neben der angekündigten &#8220;Wissenschaft mit Bier&#8221; gab es leider auch noch [...]]]></description>
			<content:encoded><![CDATA[<p>Heute Abend wurde im Beyerhaus die erste leipziger Nerd Nite abgehalten.<br />Nerd Nites bestehen aus kurzen Vorträgen zu wissenschatlichen Spezialthemen (meist aktuelle Ergbenisse der eigenen wissenschaftlichen Arbeit) und anschließenden Diskussions- und Fragerunden.<br />Der Saal im Beyerhaus war heute Abend jedenfalls sehr gut gefüllt (vorrangig mit Studierenden).  Neben der angekündigten &#8220;Wissenschaft mit Bier&#8221; gab es leider auch noch jede Menge Nikotin.<br />
Geleitet wurde die Veranstaltung durch zwei recht clowneske, übtrieben stereotype Nerds, die zwischen den Vorträgen mäßig komische Spiele organisierten und Biergutscheine verteilten.
</p>
<p>Die drei Vorträge des Abends kamen dann aus ganz unterschiedlichen Fachrichtungen.<br />Den Anfang machte Björn Fischer mit einem kurzen Abriss des Steuerrechts für gemeinnützige Vereine mit einem Schwerpunkt auf der diffizilen Abgrenzung zwischen Spenden und Sponsoring. Das ist vielleicht nicht unbedingt sehr wissenschaftlich, aber auch nicht übertrieben nerdig und war für einige Anwesende von aktuellem Interesse.</p>
<p>Ihm folgte Oliver Jan Wagner vom Max Planck Institut für evolutionäre Antropologie mit einem Projekt zur langfristen Sammlung und automatisierter Analyse von Schimpansenlauten. Hier wurde ganz deutlich, was man auf einer Nerd Nite nicht machen darf: einen gewöhnlichen wissenschaftlichen Vortag halten. Wissenschaftliche Vorträge unter Gleichgesinnten sind in der Regel sehr speziell, komplex und für aussensthende kaum nachzuvollziehen. Bei einem inhomogenen Publikum führt das schnell zu langer Weile und &#8211; wie sich heute deutlich zeigte &#8211; einem steigenden Lärmpegel bei denen, die eigentlich nur zuhören sollten.</p>
<p>Vortrag Nummer 3 war der für mich spannenste und gelungenste: Jan-Ole Reichardt vom Translationszentrum für Regenerative Medizin Leipzig  präsentierte eine ethisch-philosophische Risikobewertung der Xenotransplantation, insbesondere bezogen auf Schweine. Dabei ging es nicht um die oft anzutreffenden Vorbehalte, tierische Teile im Menschen zu verbauen, sondern um handfeste Gefahren, die durch das Einbringen tierischer Krankheitserreger in den Menschen entstehen können, wie diese Gefahren zu bewerten sind und welche gesellschaftlichen Diskussionen dadurch im Vorraus angestoßen werden sollten.<br />
Wenn es gelingt, zukünftige Vorträge auf diesem Niveau anzubieten (und man vielleicht eine rauchfreie Räumlichkeit anbietet), kann sich die Nerd Nite in Leipzig zu einem spannenden Treffen wissenschaftlich Interessierter aller Fachbereiche etablieren.</p>
<p>Die nächste Nerd Nite findet übrigens am 10. Februar 2011 statt. Wer nicht nur zuhören, sondern selber referieren möchte, kann sich über <a href="mailto:presse@beyerhaus.de">presse@beyerhaus.de</a> anmelden.</p>
<p><b>Update (14.01.2011):</b></p>
<ul>
<li>Nico hat <a href="http://nkblog.nkdev.de/nerd-nite/" target="_blank">seine Sicht auf die Nerd Nite</a> niedergeschrieben. Seinen Ausführungen kann ich mich vollständig anschließen.</li>
<li>Mittlerweile hat auch die <a href="http://nachrichten.lvz-online.de/gestaltete-specials/campus_online/studentenleben/erste-leipziger-nerd-nite-im-beyerhaus-fachmaenner-auf-der-buehne/r-studentenleben-a-69836.html" target="_blank">LVZ</a> über die Nerd Nite berichtet und hat zusätzlich ein Video im Angebot.</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://martin-gamnitzer.de/2011/01/kommentar-zur-1-leipziger-nerd-nite/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>HD-Button für den HTML5-Videoplayer „VideoJS“</title>
		<link>http://martin-gamnitzer.de/2010/11/hd-button-fur-den-html5-videoplayer-videojs/?piwik_campaign=rss&#038;piwik_kwd=hd-button-fur-den-html5-videoplayer-videojs</link>
		<comments>http://martin-gamnitzer.de/2010/11/hd-button-fur-den-html5-videoplayer-videojs/#comments</comments>
		<pubDate>Mon, 15 Nov 2010 16:03:18 +0000</pubDate>
		<dc:creator>martin</dc:creator>
				<category><![CDATA[Allgemein]]></category>

		<guid isPermaLink="false">http://martin-gamnitzer.de/?p=83</guid>
		<description><![CDATA[<p>VideoJS gehört zur Gruppe der modernen JavaScript-Videoplayer, welche die HTML5-Funktionen zur Videowiedergabe nutzen und erweitern.<br />Bisher habe ich aber noch keinen Player finden können, der einen Wechsel der Videoqualität erlaubt, wie man das bspw. von Vimeo oder Youtube kennt. Scheinbar wird diese Funktion aber von vielen vermisst (zumindest wurde das Problem mehrfach an mich herangetragen), sodass ich mich hingestetzt und eine passende Erweiterung geschrieben habe.</p>]]></description>
			<content:encoded><![CDATA[<p><i><a href="#english">Jump to english version.</a></i></p>
<p><a href="http://videojs.com">VideoJS</a> gehört zur Gruppe der modernen JavaScript-Videoplayer, welche die HTML5-Funktionen zur Videowiedergabe nutzen und erweitern.<br />Bisher habe ich aber noch keinen Player finden können, der einen Wechsel der Videoqualität erlaubt, wie man das bspw. von Vimeo oder Youtube kennt. Scheinbar wird diese Funktion aber von vielen vermisst (zumindest wurde das Problem mehrfach an mich herangetragen), sodass ich mich hingestetzt und eine passende Erweiterung geschrieben habe.<br />Ich habe mich für VideoJS als Grundlage entschieden, da der Code sehr übersichtlich geschrieben ist und sich gut erweitern lies. Das Prinzip dürfte aber auch auf andere HTML5-Player übertragbar sein.</p>
<p>Zwar gibt es bereits einen <a href="http://geryit.com/blog/2010/07/custom-html5-video-player-with-hd-option/">HD-Switch für VideoJS</a>, diese Lösung finde ich jedoch nicht zufriedenstellend, da das Video dort in einem iFrame geladen und beim Wechsel zu HD der ganze Frame neu geladen wird. Das funktioniert, ist aber nicht hübsch.</p>
<p><a href="/videojs-test/demo.html" target="_blank" title="Öffnet die HD-Demo in einem neuen Reiter">Hier geht&#8217;s zur Demo.</a></p>
<p class="downloadLink"><a href="/videojs-hdswitch.zip" title="Download der HD-Erweiterung für VideoJS als ZIP-Archiv">Download der HD-Erweiterung für VideoJS (zip)</a></p>
<h2>Benutzung</h2>
<h3>1. Vorbereiten der Videos</h3>
<p>Für jeden Codec werden offensichtlich zwei Videos in unterschiedlichen Qualitäten benötigt. Bei der Benennung ist zu beachten, dass sich die HD-Version von der normalen durch ein Suffix unterscheiden muss. Das Suffix lautet „_hd“, lässt sich per Konfiguration aber auch ändern.<br />Ein Beispiel: Das Standard-Video heißt „einFilm.ogv“. Daraus ergibt sich für die HD-Version der Name „einFilm_hd.ogv“. Außerdem müssen die Videos im selben Ordner liegen.</p>
<h3>2. Einbinden der Erweiterung</h3>
<p>Die Erweiterung besteht aus einer Javascript- und einer Stylesheet-Datei, die NACH den VideoJS-Dateien eingeunden werden müssen. Das sollte dann in etwa so aussehen:</p>

<div class="wp_codebox"><table><tr id="p831"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
</pre></td><td class="code" id="p83code1"><pre class="html" style="font-family:monospace;">&lt;head&gt;
  &lt;!-- [...] --&gt;
  &lt;script src=&quot;video.js&quot; type=&quot;text/javascript&quot; charset=&quot;utf-8&quot;&gt;&lt;/script&gt;
  &lt;script src=&quot;videojs-hdswitch.js&quot; type=&quot;text/javascript&quot; charset=&quot;utf-8&quot;&gt;&lt;/script&gt;
  &lt;link rel=&quot;stylesheet&quot; href=&quot;video-js.css&quot; type=&quot;text/css&quot; media=&quot;screen&quot; title=&quot;Video JS&quot; charset=&quot;utf-8&quot;&gt;
  &lt;link rel=&quot;stylesheet&quot; href=&quot;videojs-hdswitch.css&quot; type=&quot;text/css&quot; media=&quot;screen&quot; title=&quot;Video JS&quot; charset=&quot;utf-8&quot;&gt;
  &lt;!-- [...] --&gt;
&lt;/head&gt;</pre></td></tr></table></div>

<h3>3. Startskript</h3>
<p>Das funktioniert wie immer bei VideoJS, zusätzlich kann man aber mit der Option „hdSuffix“ ein anderes Suffix defnieren:</p>

<div class="wp_codebox"><table><tr id="p832"><td class="line_numbers"><pre>1
2
3
4
5
</pre></td><td class="code" id="p83code2"><pre class="javascript" style="font-family:monospace;"><span style="color: #339933;">&lt;</span>script type<span style="color: #339933;">=</span><span style="color: #3366CC;">&quot;text/javascript&quot;</span> charset<span style="color: #339933;">=</span><span style="color: #3366CC;">&quot;utf-8&quot;</span><span style="color: #339933;">&gt;</span>
  VideoJS.<span style="color: #660066;">setupAllWhenReady</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#123;</span>
    hdSuffix<span style="color: #339933;">:</span> <span style="color: #3366CC;">&quot;_high-def&quot;</span>
  <span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #339933;">&lt;/</span>script<span style="color: #339933;">&gt;</span></pre></td></tr></table></div>

<h3>4. Einbinden der Videos</h3>
<p>Hier gibt es keinen Unterschied zum normalen VideoJS, da die Namen der HD-Videos per Javascript über das definierte Suffix ermittelt werden.</p>
<p>Das war&#8217;s &#8211; mehr gibt es nicht zu tun.</p>
<p>&nbsp;</p>
<h2>Funktionsweise und Codediskussion</h2>
<p>Die Video-Implementierung in HTML 5 erlaubt es, mehrere Videos mit unterschiedlichen Codecs einzubinden. So kann sich jeder Browser das Video suchen, welches ihm am Besten gefällt. Gibt man aber mehrere Videos mit gleichem Codec an, nimmt der Browser das erste und ignoriert den Rest. Um nun mehere Videos (in unterschiedlicher Qualität) einzubinden, müssten wir noch eine zweite Datei angeben (je Codec) und dann per Javascript umschalten. Dabei sind mir zwei praktikable Lösungen in den Sinn gekommen:</p>
<ol>
<li>Innerhalb des Video-Tags gibt es außer den Source-Tags noch ein weiteres (zum Beispiel &#8220;div&#8221;), das widerum die source-Tags der HD-Version enthält. Also in der Art:

<div class="wp_codebox"><table><tr id="p833"><td class="line_numbers"><pre>1
2
3
4
5
6
</pre></td><td class="code" id="p83code3"><pre class="html" style="font-family:monospace;">&lt;video&gt;
  &lt;source src=&quot;meinVideo.ogv&quot; type='video/ogg; codecs=&quot;theora, vorbis&quot;'&gt;
  &lt;div&gt;
    &lt;source src=&quot;meinVideo-HD.ogv&quot; type='video/ogg; codecs=&quot;theora, vorbis&quot;'&gt;
  &lt;/div&gt;
&lt;/video&gt;</pre></td></tr></table></div>

</li>
<li>Die Videos folgen einem Benennungsschema, wodurch sich der Name der HD-Version automatisch ergibt, zum Beispiel durch Anfügen eines Suffix, wie ich es im eben gezeigten Codeschnipsel bereits eingebaut habe.</li>
</ol>
<p>Wie oben bereits erwläutert, habe mich für die zweite Variante entschieden. Diese entpricht meinem bevorzugten Programmierstil <a href="http://de.wikipedia.org/wiki/Konvention_vor_Konfiguration">„convention over configuration“</a> besser.</p>
<p>Damit war es „nur“ nötig, einen weiteren Button im Player zu platzieren und beim Klick darauf das entrechende Video zu laden. <b>Werfen wir einen Blick auf das Javascript:</b></p>

<div class="wp_codebox"><table><tr id="p834"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
</pre></td><td class="code" id="p83code4"><pre class="javascript" style="font-family:monospace;">VideoJS.<span style="color: #660066;">prototype</span>.<span style="color: #660066;">oldControlBar</span> <span style="color: #339933;">=</span> VideoJS.<span style="color: #660066;">prototype</span>.<span style="color: #660066;">buildControlBar</span><span style="color: #339933;">;</span>
VideoJS.<span style="color: #660066;">prototype</span>.<span style="color: #660066;">buildControlBar</span> <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">oldControlBar</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">hdControl</span> <span style="color: #339933;">=</span> _V_.<span style="color: #660066;">createElement</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;li&quot;</span><span style="color: #339933;">,</span> <span style="color: #009900;">&#123;</span> className<span style="color: #339933;">:</span> <span style="color: #3366CC;">&quot;vjs-hd-control vjs-sd&quot;</span><span style="color: #339933;">,</span> innerHTML<span style="color: #339933;">:</span> <span style="color: #3366CC;">&quot;&lt;span&gt;HD&lt;/span&gt;&quot;</span> <span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">controls</span>.<span style="color: #660066;">appendChild</span><span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">hdControl</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">hdControl</span>.<span style="color: #660066;">addEventListener</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;click&quot;</span><span style="color: #339933;">,</span> <span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">onHdControlClick</span>.<span style="color: #660066;">context</span><span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">this</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> <span style="color: #003366; font-weight: bold;">false</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #000066; font-weight: bold;">if</span><span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">typeof</span> <span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">options</span>.<span style="color: #660066;">hdSuffix</span> <span style="color: #339933;">==</span> <span style="color: #3366CC;">&quot;undefined&quot;</span><span style="color: #009900;">&#41;</span>
		<span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">options</span>.<span style="color: #660066;">hdSuffix</span> <span style="color: #339933;">=</span><span style="color: #3366CC;">&quot;_hd&quot;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #006600; font-style: italic;">// listen to clicks on HD button</span>
VideoJS.<span style="color: #660066;">prototype</span>.<span style="color: #660066;">onHdControlClick</span> <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span>event<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
    <span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span><span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">videoIsHd</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #003366; font-weight: bold;">var</span> isPause <span style="color: #339933;">=</span> <span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">video</span>.<span style="color: #660066;">paused</span><span style="color: #339933;">;</span>
        <span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">videoIsHd</span> <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">true</span><span style="color: #339933;">;</span>
        <span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">hdControl</span>.<span style="color: #660066;">className</span> <span style="color: #339933;">=</span> <span style="color: #3366CC;">&quot;vjs-hd-control vjs-hd&quot;</span><span style="color: #339933;">;</span>
        <span style="color: #000066; font-weight: bold;">if</span><span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">typeof</span> <span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">sdSrc</span> <span style="color: #339933;">==</span> <span style="color: #3366CC;">&quot;undefined&quot;</span><span style="color: #009900;">&#41;</span>
        <span style="color: #009900;">&#123;</span>
            <span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">sdSrc</span> <span style="color: #339933;">=</span> <span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">video</span>.<span style="color: #660066;">currentSrc</span><span style="color: #339933;">;</span>
            <span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">hdSrc</span> <span style="color: #339933;">=</span> <span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">sdSrc</span>.<span style="color: #660066;">slice</span><span style="color: #009900;">&#40;</span><span style="color: #CC0000;">0</span><span style="color: #339933;">,</span><span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">sdSrc</span>.<span style="color: #660066;">length</span><span style="color: #339933;">-</span><span style="color: #CC0000;">4</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">+</span> <span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">options</span>.<span style="color: #660066;">hdSuffix</span> <span style="color: #339933;">+</span> <span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">sdSrc</span>.<span style="color: #660066;">slice</span><span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">sdSrc</span>.<span style="color: #660066;">length</span><span style="color: #339933;">-</span><span style="color: #CC0000;">4</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span>
        <span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">video</span>.<span style="color: #660066;">src</span> <span style="color: #339933;">=</span> <span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">hdSrc</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span> <span style="color: #000066; font-weight: bold;">else</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">videoIsHd</span> <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">false</span><span style="color: #339933;">;</span>
        <span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">hdControl</span>.<span style="color: #660066;">className</span> <span style="color: #339933;">=</span> <span style="color: #3366CC;">&quot;vjs-hd-control vjs-sd&quot;</span><span style="color: #339933;">;</span>
        <span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">video</span>.<span style="color: #660066;">src</span> <span style="color: #339933;">=</span> <span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">sdSrc</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #006600; font-style: italic;">//copy status (play,pause)</span>
    <span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">video</span>.<span style="color: #660066;">load</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>isPause<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">onPause</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span> <span style="color: #000066; font-weight: bold;">else</span> <span style="color: #009900;">&#123;</span>
       <span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">video</span>.<span style="color: #660066;">play</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p>Um den HD-Button einzubauen, muss man die Funktion &#8220;buildControlBar&#8221; erweitern. Das geht in Javascript sehr einfach: Man speichert die alte Funktion in einer Variable (Zeile 1), definiert die Funktion neu (Zeile 2), ruft die in der Variable gespeicherte Funktion wieder auf (Zeile 3) und fügt seinen neuen Code an.</p>
<p>Dann muss für das Klick-Event noch eine Funktion angelegt werden (Zeile 12 ff.). Wenn man den Button das erste Mal anklickt, wird der Dateiname des Standard-Videos gespeichert und der neue Name ermittelt (Zeilen 17-21). Klickt man nochmal (und wechselt damit zum Standard-Video) wird der ursprüngliche Dateiname ausgelesen und an das video-Objekt übergeben.</p>
<p>Nachdem die Videoquelle festgelegt wurde, muss das Video geladen werden (Zeile 30). Zum Abschluss wird noch dafür gesorgt, dass der vorherige Abspielzustand (Play/Pause) wieder aufgenommen wird.</p>
<p>&nbsp;</p>
<p><b>Nun noch die neuen Stylesheets:</b></p>

<div class="wp_codebox"><table><tr id="p835"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
</pre></td><td class="code" id="p83code5"><pre class="css" style="font-family:monospace;"><span style="color: #808080; font-style: italic;">/* change position and width of standard control elements */</span>
<span style="color: #6666ff;">.video-js-box</span> ul<span style="color: #6666ff;">.vjs-controls</span> <span style="color: #00AA00;">&#123;</span><span style="color: #000000; font-weight: bold;">padding-right</span><span style="color: #00AA00;">:</span> <span style="color: #933;">196px</span><span style="color: #00AA00;">;</span><span style="color: #00AA00;">&#125;</span>
ul<span style="color: #6666ff;">.vjs-controls</span> <span style="color: #00AA00;">&gt;</span> li<span style="color: #6666ff;">.vjs-time-control</span>       <span style="color: #00AA00;">&#123;</span> <span style="color: #000000; font-weight: bold;">width</span><span style="color: #00AA00;">:</span> <span style="color: #933;">75px</span><span style="color: #00AA00;">;</span> <span style="color: #000000; font-weight: bold;">right</span><span style="color: #00AA00;">:</span> <span style="color: #933;">121px</span><span style="color: #00AA00;">;</span> <span style="color: #00AA00;">&#125;</span>
ul<span style="color: #6666ff;">.vjs-controls</span> <span style="color: #00AA00;">&gt;</span> li<span style="color: #6666ff;">.vjs-volume-control</span>     <span style="color: #00AA00;">&#123;</span> <span style="color: #000000; font-weight: bold;">width</span><span style="color: #00AA00;">:</span> <span style="color: #933;">50px</span><span style="color: #00AA00;">;</span> <span style="color: #000000; font-weight: bold;">right</span><span style="color: #00AA00;">:</span> <span style="color: #933;">66px</span><span style="color: #00AA00;">;</span> <span style="color: #00AA00;">&#125;</span>
ul<span style="color: #6666ff;">.vjs-controls</span> <span style="color: #00AA00;">&gt;</span> li<span style="color: #6666ff;">.vjs-fullscreen-control</span> <span style="color: #00AA00;">&#123;</span> <span style="color: #000000; font-weight: bold;">width</span><span style="color: #00AA00;">:</span> <span style="color: #933;">25px</span><span style="color: #00AA00;">;</span> <span style="color: #000000; font-weight: bold;">right</span><span style="color: #00AA00;">:</span> <span style="color: #933;">36px</span><span style="color: #00AA00;">;</span> <span style="color: #00AA00;">&#125;</span>
<span style="color: #808080; font-style: italic;">/* add new stylesheets for HD-Button */</span>
<span style="color: #6666ff;">.vjs-hd-control</span><span style="color: #00AA00;">&#123;</span><span style="color: #000000; font-weight: bold;">right</span><span style="color: #00AA00;">:</span><span style="color: #933;">3px</span><span style="color: #00AA00;">;</span>line-<span style="color: #000000; font-weight: bold;">height</span><span style="color: #00AA00;">:</span><span style="color: #933;">32px</span><span style="color: #00AA00;">;</span>padding-<span style="color: #000000; font-weight: bold;">right</span><span style="color: #00AA00;">:</span><span style="color: #933;">4px</span>!important<span style="color: #00AA00;">;</span>font-<span style="color: #000000; font-weight: bold;">size</span><span style="color: #00AA00;">:</span><span style="color: #933;">11px</span><span style="color: #00AA00;">;</span>cursor<span style="color: #00AA00;">:</span><span style="color: #993333;">pointer</span><span style="color: #00AA00;">;</span><span style="color: #00AA00;">&#125;</span>
<span style="color: #6666ff;">.vjs-hd-control</span> span<span style="color: #00AA00;">&#123;</span><span style="color: #000000; font-weight: bold;">display</span><span style="color: #00AA00;">:</span><span style="color: #993333;">block</span><span style="color: #00AA00;">;</span>width<span style="color: #00AA00;">:</span><span style="color: #933;">20px</span><span style="color: #00AA00;">;</span>height<span style="color: #00AA00;">:</span><span style="color: #933;">12px</span><span style="color: #00AA00;">;</span>float<span style="color: #00AA00;">:</span><span style="color: #000000; font-weight: bold;">left</span><span style="color: #00AA00;">;</span>color<span style="color: #00AA00;">:</span><span style="color: #cc00cc;">#fff</span><span style="color: #00AA00;">;</span>margin-<span style="color: #000000; font-weight: bold;">top</span><span style="color: #00AA00;">:</span><span style="color: #933;">-3px</span><span style="color: #00AA00;">;</span>font-weight<span style="color: #00AA00;">:</span><span style="color: #993333;">bold</span><span style="color: #00AA00;">;</span>font-<span style="color: #000000; font-weight: bold;">size</span><span style="color: #00AA00;">:</span><span style="color: #933;">12px</span><span style="color: #00AA00;">;</span> <span style="color: #000000; font-weight: bold;">margin-left</span><span style="color: #00AA00;">:</span><span style="color: #933;">5px</span><span style="color: #00AA00;">;</span><span style="color: #00AA00;">&#125;</span>
<span style="color: #6666ff;">.vjs-hd-control</span> span<span style="color: #00AA00;">&#123;</span><span style="color: #000000; font-weight: bold;">color</span><span style="color: #00AA00;">:</span><span style="color: #cc00cc;">#808080</span><span style="color: #00AA00;">;</span> <span style="color: #000000; font-weight: bold;">font-family</span><span style="color: #00AA00;">:</span><span style="color: #993333;">sans-serif</span><span style="color: #00AA00;">;</span><span style="color: #00AA00;">&#125;</span>
<span style="color: #6666ff;">.vjs-hd-control</span> span<span style="color: #3333ff;">:hover</span><span style="color: #00AA00;">,</span> <span style="color: #6666ff;">.vjs-hd-control</span><span style="color: #6666ff;">.vjs-hd</span> span <span style="color: #00AA00;">&#123;</span><span style="color: #000000; font-weight: bold;">color</span><span style="color: #00AA00;">:</span><span style="color: #cc00cc;">#0066ff</span><span style="color: #00AA00;">;</span><span style="color: #00AA00;">&#125;</span></pre></td></tr></table></div>

<p>Da der HD-Button nach rechts außen soll, wird der Ladebalken verkürzt und die Bereiche für Lautstärke und Fullscreen nach links verschoben.<br />Im zweiten Teil wird der HD-Button definiert und positioniert. Im HD-Modus und beim Darüberfahren mit der Maus spendieren wir ihm noch eine andere Textfarbe. Und das war es dann auch schon.</p>
<p>&nbsp;</p>
<p><a name="english"></a></p>
<h1>HD Switch in VideoJS</h1>
<p>HTML5 gives us the chance to watch videos in a browser without using flash. By now, several javascript based players are build around these functionalities in order to add new features and skins. Sadly, non of them offers a hd switch, like the ones we know from Vimeo or Youtube. Many developers seem to miss this, so I tried to extend an existing player.<br />
I choose <a href="http://videojs.com">VideoJS</a>, because it&#8217;s code is very readable and relatively easy to extend.</p>
<p>I should mention that <a href="http://geryit.com/blog/2010/07/custom-html5-video-player-with-hd-option/">one hd switch for VideoJS</a> is already existing, but I&#8217;m not satisfied with this implementation. There, the player is wrapped in an iFrame. By clicking the hd switch, the whole iFrame will be reloaded with another video source. It works, but it&#8217;s not neat.</p>
<p><a href="/videojs-test/demo.html" target="_blank" title="Open the demo in a new tab">Watch a sample.</a></p>
<p class="downloadLink"><a href="/videojs-hdswitch.zip" title="Download der HD-Erweiterung für VideoJS als ZIP-Archiv">Download the hd extension for VideoJS (zip)</a></p>
<p>&nbsp;</p>
<h2>Usage</h2>
<h3>1. Prepare the videos</h3>
<p>Evidently we need two videos for every codec, one in standard and one in hd quality. The hd video must have the same name as the the standard video plus a suffix (default is &#8220;_hd&#8221;). Let&#8217;s say our video is called &#8220;aGreatFilm.ogv&#8221;, the hd version must be named &#8220;aGreatFilm_hd.ogv&#8221;.<br />You can define another suffix in the VideoJS configuration.</p>
<h3>2. Include the files</h3>
<p>The extensions consists of two files, one javascript and one stylesheet file. They must be included after the the VideoJS files. It should look like this:</p>

<div class="wp_codebox"><table><tr id="p836"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
</pre></td><td class="code" id="p83code6"><pre class="html" style="font-family:monospace;">&lt;head&gt;
  &lt;!-- [...] --&gt;
  &lt;script src=&quot;video.js&quot; type=&quot;text/javascript&quot; charset=&quot;utf-8&quot;&gt;&lt;/script&gt;
  &lt;script src=&quot;videojs-hdswitch.js&quot; type=&quot;text/javascript&quot; charset=&quot;utf-8&quot;&gt;&lt;/script&gt;
  &lt;link rel=&quot;stylesheet&quot; href=&quot;video-js.css&quot; type=&quot;text/css&quot; media=&quot;screen&quot; title=&quot;Video JS&quot; charset=&quot;utf-8&quot;&gt;
  &lt;link rel=&quot;stylesheet&quot; href=&quot;videojs-hdswitch.css&quot; type=&quot;text/css&quot; media=&quot;screen&quot; title=&quot;Video JS&quot; charset=&quot;utf-8&quot;&gt;
  &lt;!-- [...] --&gt;
&lt;/head&gt;</pre></td></tr></table></div>

<h3>3. Activate the script</h3>
<p>You don&#8217;t need to do anything here, but you may define another suffix like this:</p>

<div class="wp_codebox"><table><tr id="p837"><td class="line_numbers"><pre>1
2
3
4
5
</pre></td><td class="code" id="p83code7"><pre class="javascript" style="font-family:monospace;"><span style="color: #339933;">&lt;</span>script type<span style="color: #339933;">=</span><span style="color: #3366CC;">&quot;text/javascript&quot;</span> charset<span style="color: #339933;">=</span><span style="color: #3366CC;">&quot;utf-8&quot;</span><span style="color: #339933;">&gt;</span>
  VideoJS.<span style="color: #660066;">setupAllWhenReady</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#123;</span>
    hdSuffix<span style="color: #339933;">:</span> <span style="color: #3366CC;">&quot;_high-def&quot;</span>
  <span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #339933;">&lt;/</span>script<span style="color: #339933;">&gt;</span></pre></td></tr></table></div>

<h3>4. Write the HTML part</h3>
<p>You can use the normal HTML5 code here because the hd videos will be selected automatically.</p>
<p>&nbsp;</p>
<p>That&#8217;s it!</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<h2>Probleme? Anregungen? Lob? Immer her damit!</h2>
]]></content:encoded>
			<wfw:commentRss>http://martin-gamnitzer.de/2010/11/hd-button-fur-den-html5-videoplayer-videojs/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Leserbrief zu Tagung in Leipzig diskutiert: Kann man Zukunft mit Dynamischen Systemen simulieren?</title>
		<link>http://martin-gamnitzer.de/2010/06/leserbrief-zu-tagung-in-leipzig-diskutiert-kann-man-zukunft-mit-dynamischen-systemen-simulieren/?piwik_campaign=rss&#038;piwik_kwd=leserbrief-zu-tagung-in-leipzig-diskutiert-kann-man-zukunft-mit-dynamischen-systemen-simulieren</link>
		<comments>http://martin-gamnitzer.de/2010/06/leserbrief-zu-tagung-in-leipzig-diskutiert-kann-man-zukunft-mit-dynamischen-systemen-simulieren/#comments</comments>
		<pubDate>Mon, 21 Jun 2010 14:26:18 +0000</pubDate>
		<dc:creator>martin</dc:creator>
				<category><![CDATA[Allgemein]]></category>

		<guid isPermaLink="false">http://martin-gamnitzer.de/?p=65</guid>
		<description><![CDATA[<p>Am 17.06.2010 wurde in der Leipziger Internetzeitung (in einer Ankündigung für eine Konferenz rund um "System Dynamics")  die Vorstellung geäußert, dass wir weniger politische/soziale/wirtschaftliche Probleme hätten, wenn Modellierungswerkzeuge auch außerhalb der Ingenieurwissenschaften verbreiteter wären:<br />
<a href="http://www.l-iz.de/Bildung/Forschung/2010/06/Kann-man-Zukunft-mit-Dynamischen-Systemen-simulieren.html">Tagung in Leipzig diskutiert: Kann man Zukunft mit Dynamischen Systemen simulieren?</a></p>
<p>Mir erschien der Tenor in diesem Artikel als zu optimistisch. Deshalb habe ich ein paar Zeilen dazu geschrieben, um die Aussage zu relativieren.</p>]]></description>
			<content:encoded><![CDATA[<p>Am 17.06.2010 wurde in der Leipziger Internetzeitung (in einer Ankündigung für eine Konferenz rund um &#8220;System Dynamics&#8221;)  die Vorstellung geäußert, dass wir weniger politische/soziale/wirtschaftliche Probleme hätten, wenn Modellierungswerkzeuge auch außerhalb der Ingenieurwissenschaften verbreiteter wären:<br />
<a href="http://www.l-iz.de/Bildung/Forschung/2010/06/Kann-man-Zukunft-mit-Dynamischen-Systemen-simulieren.html">Tagung in Leipzig diskutiert: Kann man Zukunft mit Dynamischen Systemen simulieren?</a></p>
<p>Mir erschien der Tenor in diesem Artikel als zu optimistisch. Deshalb habe ich ein paar Zeilen dazu geschrieben, um die Aussage zu relativieren. Diesen Leserbrief kann man nun auch hier nachlesen, das Original natürlich auch <a  href="http://www.l-iz.de/Interaktiv/Leserbriefe/2010/06/Tagung-Leipzig-Zukunft-in-dynamischen-Modellen-Leserbrief.html">bei der L-IZ</a>.</p>
<p>&nbsp;</p>
<p>Fehlentscheidungen in der Politik sind nicht nur auf mangelnde Weitsicht zurückzuführen. Die finanziellen Engpässe europäischer Staaten oder die Klimaveränderung sind keine Ereignisse, die plötzlich und unerwartet über uns hereinbrechen: Wer über seinen Verhältnissen lebt, muss damit rechnen, dass es nicht ewig so weitergehen wird.</p>
<p>Dafür braucht man keine rechnergestützte Modellbildung. Was fehlt, ist nicht Fähigkeit, Komplexität zu erfassen, sondern bereits die mangelnde Bereitschaft dazu oder der ehrliche Vorsatz, Probleme grundlegend und im Interesse der Betroffenen zu lösen.</p>
<p>Wenn aber das geschehen würde, dass man sich ernsthaft und frei von kleinkarierten parteipolitischen oder lobbyistischen Zwängen mit einem Problem auseinandersetzt, würden sich zumindest grobe Lösungsstrategien nur durch Gedankenmodelle ergeben, ohne ein einziges Mal eine Simulation anwerfen zu müssen. Aber das Denken in komplexen Zusammenhängen ist nicht nur von Politikern zu erwarten, sondern betrifft alle Menschen und ihre Entscheidungsfindung: Für die Erkenntnis, dass es nicht gut sein kann, wenn man innerhalb von hundert Jahren großzügig Rohstoffe verbrennt, derer Herstellung mehrere Millionen Jahre in Anspruch genommen hat, sollte man keinen Rechner brauchen.</p>
<p>Der Sinn der rechnergestützten Modellbildung entsteht aus meiner Sicht vor allem dann, wenn es um das Abschätzen konkreter Maßnahmen geht. Also beispielsweise der Frage, wie hoch eine Transaktionssteuer ausfallen muss, um einen optimalen Effekt zu erzielen, ohne dabei die Finanzmärkte zum Erlahmen zu bringen.</p>
<p>Aber wenn man anfängt, rechnergestützte Modellbildung einzusetzen, ohne vorher ein umfassendes Bewusstsein für Komplexität zu schaffen, verkommt sie zu einem Werkzeug für Berater. Und diesem Werkzeuge wird &#8211; eben weil es niemand ausser den Beratern versteht &#8211; schnell der gleiche Ruf anhängen wie es bei Studien und Statistiken bereits der Fall ist. Sie erscheinen artifiziell und willkürlich interpretierbar.</p>
]]></content:encoded>
			<wfw:commentRss>http://martin-gamnitzer.de/2010/06/leserbrief-zu-tagung-in-leipzig-diskutiert-kann-man-zukunft-mit-dynamischen-systemen-simulieren/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Anmerkungen zu Amflora (Update)</title>
		<link>http://martin-gamnitzer.de/2010/03/anmerkungen-zu-amflora/?piwik_campaign=rss&#038;piwik_kwd=anmerkungen-zu-amflora</link>
		<comments>http://martin-gamnitzer.de/2010/03/anmerkungen-zu-amflora/#comments</comments>
		<pubDate>Thu, 04 Mar 2010 09:17:35 +0000</pubDate>
		<dc:creator>martin</dc:creator>
				<category><![CDATA[Allgemein]]></category>
		<category><![CDATA[Amflora]]></category>
		<category><![CDATA[Genetik]]></category>

		<guid isPermaLink="false">http://martin-gamnitzer.de/?p=22</guid>
		<description><![CDATA[<p>Ich habe nicht vor, in diesem Artikel eindeutig Stellung für oder gegen Amflora zu beziehen. Gerade radikale Positionen, wie sie z.B. von Greenpeace vertreten werden, halte ich für wenig hilfreich, wenn es um mehr als bloßen Populismus geht. In diesem Sinne soll dieser Artikel vor allem Argumente und Informationen bündeln, um insbesondere fachfremden Lesern eine vernünftige Grundlage zur eigenen Meinungsbildung zu liefern.</p>]]></description>
			<content:encoded><![CDATA[<p>Update am 23.09.2010: Beschreibung der Unterschiede zwischen Bioplant-Kartoffel und Amflora korrigiert.</p>
<p><strong>Vorbemerkung: Ich habe nicht vor, in diesem Artikel eindeutig Stellung für oder gegen Amflora zu beziehen. Gerade radikale Positionen, wie sie z.B. von Greenpeace<sup><a href="#q1">[1]</a></sup> vertreten werden, halte ich für wenig hilfreich, wenn es um mehr als bloßen Populismus geht. In diesem Sinne soll dieser Artikel vor allem Argumente und Informationen bündeln, um insbesondere fachfremden Lesern eine vernünftige Grundlage zur eigenen Meinungsbildung zu liefern.</strong></p>
<h2>Was ist Amflora und warum wird der Anbau kritisiert?</h2>
<p>Amflora ist eine gentisch veränderte Industriekartoffel mit hohem Anteil Amylopektin<sup><a href="#q2">[2]</a></sup>, dafür aber kaum Amylose<sup><a href="#q3">[3]</a></sup>. Amflora ist nicht zum direkten Verzehr, sondern zur Stärkegewinnung gedacht (schmeckt auch nicht). Einsatzgebiete sind insbesodnere Papier-, Garn- und Klebstofffertigung.</p>
<p>Sieht man von radikalen Gentechnik-Gegner ab, steht diese Modifikaton auch nicht in der Kritik. Als problematisch wird das verwendete Markergen Neomycin-Phosphotransferase II (im Folgenden NPTII) angesehen. Dieses Gen ist ein Antibiotika-Resistenzgen, insbesondere gegen die Wirkstoffe Kanamycin und Neomycin.<br />
Die letzten zwei Sätze werfen einige Fragen auf, die ich systematisch behandeln möchte.</p>
<h3>Wofür werden Markergene gebraucht?</h3>
<p>Das gezielte Einschleusen einzelner Gene in Zellen ist zwar ein alltäglicher Vorgang, aber die Erfolgsquote ist meist gering &#8211; nur wenige der behandelten Zellen nehmen die neue Sequenz auf. Es müssen also immer viele Zelle &#8220;behandelt&#8221; werden. Und anschließend muss man natürlich herausfinden, welche der Zelle das neue Gen aufgenommen haben. Und genau dafür brauchen wir die Markergene.</p>
<h3>Aber warum werden dafür Antibiotika-Resistenzgene verwendet?</h3>
<p>Weil die Analyse, welche Zellen das Antibiotikum aufgenommen haben, über genau diese Eigenschaft stattfindet, da Kanamycin für Pflanzenzellen toxisch ist. Nur Zellen mit dem Resistenzgen überstehen die Behandlung mit dem Antibiotikum. Und durch die enge Kopplung unseres eigentlichen Gens und des Markergens gilt: Ist das Markergen drin, sind beide drin.</p>
<h3>Wofür werden Kanamycin und Neomycin eingesetzt?</h3>
<p>Beide Antibiotika werden in der Veterinärmedizin zur Behandlung von Magen-Darm-Infektionen &#8211; insbesondere bei Haustieren &#8211; eingesetzt.<br />
In der Humanmedizin wird Kanamycin in Form von Augentropfen und -salben zur Behandlung bakterieller Augeninfektionen eingesetzt. Außerdem ist es ein Reserveantibiotikum für die Behandlung multiresistenter Tuberkulose. Neomycin wird bei kleineren Schleimhautinfektionen verwendet.</p>
<h3>Wieso kann eine kanamycin-resistente Kartoffel ein Problem sein?</h3>
<p>Eines ist klar: Eine Kartoffel ist kein Tuberkulose-Erreger. Also ist es augenscheinlich unerheblich, ob die Kartoffel gegen ein Antibiotikum resistent ist. Allerdings neigen gerade Mikroorganismen dazu, untereinander Gensequenzen auszutauschen. Man nennt das &#8220;horizontalen Gentransfer&#8221;. Mittlerweile gilt es zudem als erwiesen, dass es auch einen Gentransfer zwsichen Pflanzen und Bakterien geben kann &#8211; also auch von der Knolle in den Tuberkulose-Erreger<sup><a href="#q4">[4]</a></sup>.<br />
Nur: Die Wahrscheinlichkeit dafür ist extrem gering, vor allem bei der Kartoffel, die gar nicht gegessen wird. Doch selbst wenn jemand eine Amflora-Kartoffel isst, wird ihr genetisches Material höchstwahrscheinlich durch die Verdauung zerstört, bevor ein Erreger im Margen-Darm-Trakt überhaupt die Chance bekommt, es zu assimilieren. Was bleibt ist die Feststellung, dass ein Gentransfer möglich, aber äußerst unwahrscheinlich ist.</p>
<p>In diesem Zusammenhang soll noch erwähnt werden, dass NPTII nicht im Labor entwickelt wurde, sondern ohnehin in vielen Krankheitserregern vorhanden ist. Diese nehmen wir durch den Verzehr von Obst und Gemüse auch immer wieder auf. Im Stuhl der meisten Menschen lassen sich demnach auch Bakterien, die NPTII tragen, ermitteln. Die Wahrscheinlichkeit, dass es zwischen diese Bakterien und denen, die mit Neomycin und Kanamycin behandelt werden, zu einem Genaustausch kommt, ist wesentlich höher als der Austausch zwischen der Knolle und dem Errgener.</p>
<h2>Noch mehr Informationen</h2>
<p>Amflora ist nicht mehr ganz jung. Ganze 13 Jahre dauerte das Zulassungsverfahren für die EU. Mittlweile hat sich die Gentechnik weiterentwickelt und es gibt eine Reihe von Verfahren, um die Markergene wieder zu entfernen oder ganz ohne Markergene auszukommen. Auch die europäische Behörde für Lebensmittelsicherheit (EFSA) hat ihre Zulassungsregeln verschärft<sup><a href="#q5">[5]</a></sup>. So sind viele Markergene gar nicht mehr oder nur eingschränkt erlaubt. NPTII bleibt weiterhin uneingeschränkt verwendbar, eben aufgrund der oben aufgeführten Argumente. Ich empfinde diese Punkte (Zulassungszeit und Regelverschärfung) auch als wichtige Argumente gene all jede, die der EFSA (oder anderen in den Zulassungsprozess involvierten Institutionen) Käuflichkeit vorwerfen.</p>
<p>Unabhängig von Amflora werden auch anderen Kartoffelsorten mit dem gleichen Ziel, aber anderen Methoden, entwickelt. Die Firma Bioplant<sup><a href="#q6">[6]</a></sup> hat eine Kartoffel entwickelt, die <del datetime="2010-09-23T06:12:44+00:00">das gleiche genetische Material enthält wie Amflora &#8211; nur ohne Markergen.</del> die gleichen Eigenschaften wie Amflora hat. Möglich wurde dies durch ein recht junges Verfahren names &#8220;TILLING&#8221;, bei dem das Ergbut gezielt durch die Anwendung mutagener Substanzen verändert wird. Neben dem Fehlen des Markergens unterscheiden sich die Kartoffeln genetisch dadurch, dass bei Bioplant das für die Amlyoseproduktion verantwortliche Gen inaktiv ist, wohingegen bei Amflora ein komplementäres Gen eingebracht wurde, um die Wirkung von jenem zu unterdrücken.<br />
Diese Kartoffel kann aber im Gegensatz zu Amflora ohne weiter Zulassung angebaut werden! Denn die europäischen Zulassungsrichtlinien orientieren sich an der Erzeugung der Pflanze, nicht an ihren Eigenschaften. Hier besteht aus meiner Sicht enormer Handlungsbedarf. Vor allem dann, wenn genetisch veränderte Pflanzen auf den Markt kommen, die wie Amflora erzeugt werden, aber ohne Markergen auskommen.</p>
<p>Als radikales Argument gegen Amflora muss unbedingt noch das Vorsorge-Prinzip erwähnt werden. Auch wenn die Gefahr eines Gentransfers extrem gering ist, so ist sie nicht auszuschließen. Da wir durch den oftmals sorglosen Umgang mit Antibiotika bereits mit vielen Resistenzen konfrontiert sind, müssen die verbleibenden wirksamen Antibiotika unbedingt geschützt werden. Demnach dürften genetisch veränderten Pflanzen generell keine Resistenzgene enthalten.<br />
Unabhängig von den konkreten Zulassungsregeln wird dieser Fall aus meiner Sicht ohnehin in (naher) Zukunft erreicht werden, eben durch die erwähnten weiterentwickelten Verfahren.</p>
<h2>Die Monopolbilung durch Monsanto und BASF</h2>
<p>Als weiteres Argument gegen die Zulassung genetisch veränderter Pflanzen wird die Monopolbildung durch Firmen wie Monsanto (Bt-Mais) und BASF ins Feld geführt. Insbesondere die Versuche seitens Monsanto, Pflanzen (bzw. deren genetisches Material) patentieren zu lassen, sind äußerst kritisch zu sehen. Allerdings wird diese Vorgehenweise verständlich, wenn man bedenkt, welcher Aufwand nötig war, um die Produkte zur Zulassung zu bringen (Bt-Mais hat seine bekanntlich wieder verloren). Das macht die Sache aber nicht besser.</p>
<p>Mir ist aber besonders wichtig darauf hinzuweisen, dass das genetische Verfahren und die konkrete Situation am Markt zwei verschiedene Dinge sind, die nicht durcheinander gebracht werden dürfen. Wenn Unternehmen Monopole bilden, ist das kein Argument gegen Gentechnik, sondern ein Problem der Regeln am Markt.<br />
Unternehmen lassen sich in ihrem Tun durch Gesetze einschränken &#8211; Gene nicht!</p>
<p>Ich hoffe, dass meine Ausführungen verständlich waren und helfen, die Problematik besser zu verstehen. Wie immer freue ich mich über Feedback und auch weiterführende Fragen.</p>
<hr /><strong>Quellennachweise</strong></p>
<p><sup><a name="q1"></a></sup> <a title="Die Gen-Kartoffel von BASF" href="http://www.greenpeace.de/themen/gentechnik/anbau_genpflanzen/artikel/die_gen_kartoffel_von_basf/">Greenpeace: Die Gen-Kartoffel von BASF</a></p>
<p><sup><a name="q2"></a></sup> <a title="Amylopektin" href="http://de.wikipedia.org/wiki/Amylopektin">Amylopektin bei Wikipedia</a></p>
<p><sup><a name="q3"></a></sup> <a title="Amylose" href="http://de.wikipedia.org/wiki/Amylose">Amylose bei Wikipedia</a></p>
<p><sup><a name="q4"></a></sup> <a title="Horizontal Gene Transfer" href="http://www.i-sis.org.uk/horizontalGeneTransfer.php">Horizontal Gene Transfer from GMOs Does Happen</a></p>
<p><sup><a name="q5"></a></sup> <a title="Stellungnahme des ZKBS" href="http://www.biosafety.be/ARGMO/Documents/bijlage6.pdf">Allgemeine Stellungnahme der ZKBS, Az.: 6790-10-62 (PDF!)</a></p>
<p><sup><a name="q6"></a></sup> <a title="Bioplant" href="http://www.bioplant.de">Bioplant</a></p>
]]></content:encoded>
			<wfw:commentRss>http://martin-gamnitzer.de/2010/03/anmerkungen-zu-amflora/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>NoIpPlugin v 0.2</title>
		<link>http://martin-gamnitzer.de/2010/02/noipplugin-v-0-2/?piwik_campaign=rss&#038;piwik_kwd=noipplugin-v-0-2</link>
		<comments>http://martin-gamnitzer.de/2010/02/noipplugin-v-0-2/#comments</comments>
		<pubDate>Thu, 25 Feb 2010 09:22:39 +0000</pubDate>
		<dc:creator>martin</dc:creator>
				<category><![CDATA[Allgemein]]></category>
		<category><![CDATA[IP]]></category>
		<category><![CDATA[Piwik]]></category>
		<category><![CDATA[Plugin]]></category>

		<guid isPermaLink="false">http://martin-gamnitzer.de/?p=25</guid>
		<description><![CDATA[<p>Für alle, die hier neu ankommen, noch ein paar einleitende Worte: Das Speichern der IP-Adresse von Webseitenbesuchern wird in Deutschland zunehmend kritisch betrachtet und ist strenggenommen nicht erlaubt. Grundlage dafür ist das Telemediengesetz, welches zur Speicherung personenbezogener Daten das explizite Einverständnis des Nutzers voraussetzt. Nun kann man stundenlang darüber diskutieren, ob eine IP-Adresse als personenbezogen angesehen werden kann. Tatsache ist aber, dass Aufsichtsbehörden wie der Düsseldorfer Kreis dies so sehen. Wer also ein rechtssicheres Webtracking nutzen möchte, kann leider nicht mehr auf Google Analytics zurückgreifen. Doch auch selbst gehostete Lösungen wie Piwik speichern die IP-Adressen. Das hier beschriebene Piwik-Plugin setzt an dieser Stelle an, um Trackingdaten besser zu anonymisieren.</p>]]></description>
			<content:encoded><![CDATA[</p>
<p><b>UPDATE 2010-03-20:</b> <a href="http://piwik.org/" title="Piwik" >Piwik 0.55</a> ist fertig und ich biete damit mein Plugin nicht mehr zum Download an. Bitte nutzt stattdessen das Core-Plugin &#8220;AnonymizeIP&#8221;.</p>
<p><b>UPDATE 2010-02-28:</b> Das Plugin wird in einer erweiterten Form in der nächsten Piwik-Version (0.55) vorhanden sein. Neu hinzugekommen ist die Möglichkeit, in der Konfiguration die Anzahl der zu löschenden Oktette einzustellen. Wer will, kann es sich schon vorher aus dem <a href="http://dev.piwik.org/trac/changeset/1877">Piwik-SVN</a> holen.<br />
Bis zum Erscheinen der Version 0.55 wird das NoIpPlugin hier aber noch verfügbar bleiben.<br />Ich bedanke mich für alle Anregungen und Diskussionen, insbesondere bei <a href="http://www.braekling.de/web-development/2758-mal-wieder-piwik-und-anonymisierte-ips.html">André Bräkling</a>.</p>
</p>
<p><a href="#english"><b>See english version below.</b></a></p>
<p>Für Eilige:<br />
<a style="font-size:18px; text-decoration:line-through; font-weight:bold; color:#050590; ">Download NoIpPlugin v 0.2</a></p>
<p><a href="http://dev.piwik.org/trac/ticket/1168">Das Plugin im Piwik-Trac</a></p>
<h2>Worum geht es?</h2>
<p>Für alle, die hier neu ankommen, noch ein paar einleitende Worte: Das Speichern der IP-Adresse von Webseitenbesuchern wird in Deutschland zunehmend kritisch betrachtet und ist strenggenommen nicht erlaubt. Grundlage dafür ist das Telemediengesetz, welches zur Speicherung personenbezogener Daten das explizite Einverständnis des Nutzers voraussetzt. Nun kann man stundenlang darüber diskutieren, ob eine IP-Adresse als personenbezogen angesehen werden kann. Tatsache ist aber, dass Aufsichtsbehörden wie der Düsseldorfer Kreis dies so sehen. Wer also ein rechtssicheres Webtracking nutzen möchte, kann leider nicht mehr auf Google Analytics zurückgreifen. Doch auch selbst gehostete Lösungen wie Piwik speichern die IP-Adressen. Das hier beschriebene Piwik-Plugin setzt an dieser Stelle an, um Trackingdaten besser zu anonymisieren.</p>
<p><span id="more-25"></span></p>
<h2>Die Umsetzung</h2>
<p>Wie in <a href="/post/4/Piwik+ohne+IP-Speicherung+-+mit+Plugin/">der ersten Fassung</a> bleibt das Plugin ziemlich simpel. Geändert wurde vor allem der Hook: Musste man in Version 0.1 noch auf die richtige Reihenfolge der Plugins achten, kommt jetzt der Hook &#8220;Tracker.saveVisitorInformation&#8221; zum Einsatz. Dieser wird direkt vor dem Speichern aufgerufen. Andere Plugins wie GeoIP haben ihre Arbeit dann schon beendet.<br />
Außerdem werden die IP-Adressen jetzt nicht mehr mit einer Null überschrieben, sondern um die letzen beiden Blöcke gekürzt, wie bei <a href="http://www.braekling.de/web-development/2758-mal-wieder-piwik-und-anonymisierte-ips.html">André Bräkling</a> beschrieben. Die Kürzung zu Beginn, noch vor dem GeoIP-Plugin, schenke ich mir. Die Gründe führe ich weiter unten aus. Im Augenblick sehe ich auch keinen Vorteil, die gekürzten IP-Adressen zu speichern. Aber auch keinen Nachteil.</p>
<h2>Diskussion</h2>
<h3>Trackingfehler</h3>
<p>In der ersten Version des NoIP-Plugins wurde die IP-Adresse einfach mit einer Null überschrieben. Das erfüllt soweit seinen Zweck. Allerdings kam im Piwik-Trac <a href="http://dev.piwik.org/trac/ticket/692">an anderer Stelle</a> die Sorge auf, dass dieses Verfahren Nutzer mit deaktivierten Cookies falsch zählt. Ist dem so?<br />
Holen wir etwas aus: Wird eine Webseite aufgerufen, versucht Piwik herauszufinden, ob es sich um einen neuen oder wiederkehrenden Besucher handelt. Diese Aufgabe übernimmt die Funktion <i>recognizeTheVisitor</i> in der Datei <i>/core/Tracker/Visit.php</i>. Dabei wird zuerst geprüft, ob ein Cookie gesetzt ist. Wenn nicht, wird über die gesamte Client-Konfiguration sowie die IP-Adresse ein Hash gebildet &#8211; ein mehr oder weniger individueller Fingerabdruck des Gastrechners. Ebenso enthält die log_visit-Tabelle diesen Hash (in der Spalte <i>config_md5config</i>). Der Hash-Wert des Besuchers wird mit den Daten in der Tabelle verglichen. Wird der Eintrag gefunden, handelt es sich um einen wiederkehrenden Besucher. Wenn nun alle IP-Adressen sehr früh durch eine Null ersetzt werden, würden zwei unterschiedliche Besucher mit der gleichen Rechnerkonfiguration als ein Besucher gezählt werden.<br />In meinem Plugin wird die IP-Adresse aber erst vor der Speicherung gekürzt. Zu diesem Zeitpunkt ist der Hash schon längst gebildet.</p>
<h3>Kürzung vor der Weiterverarbeitung</h3>
<p>André erwähnt in seinem weiter oben verlinkten Artikel, dass es nötig sein kann, die IP-Adresse bereits vor der Ermittlung der Stadt durch das GeoIP-Plugin kürzen zu müssen. Ich habe auf diesen Schritt in meinem Plugin verzichtet. Erstens, weil es wieder die Frage aufwirft, an welcher Stelle ich die erste Kürzung vornehmen kann, ohne im Core rumspielen zu müssen. Das würde einfacher werden, wenn man das Hook-System um eine Ausführungspriorität erweitern würde, wie im <a href="http://dev.piwik.org/trac/ticket/1169">Ticket #1169</a> beschrieben. Zweitens, weil die Ermittlung der Stadt aus der IP-Adresse lokal geschiet und kein externer Service die IP-Adresse sieht.</p>
<h3>Hash statt Kürzung</h3>
<p>Im Piwik-Trac wurde auch vorgeschlagen, statt der Null einen MD5-Hash der IP-Adresse zu speichern. Das hätte zur Folge, dass die Spalte <i>location_ip</i> von &#8220;bigint unsignend&#8221; auf &#8220;varchar(32)&#8221; geändert werden müsste. Außerdem nützt diese Form der Anonymisierung nicht viel. Denn wenn ich (oder die Staatsanwaltschaft) herausfinden möchte, ob sich ein Nutzer mit einer bestimmten IP-Adresse auf meiner Seite aufgehalten hat, kann man natürlich die dann bekannte IP-Adresse hashen und mit den Datenbankeinträgen vergleichen. Nur andersherum geht es nicht.</p>
</p>
<p>&#8212;&#8212;&#8212;-</p>
<p>Wie immer freue ich mich über Rückmeldungen. Wenn wir uns auf diese Lösung als Konsenz verständigen können, werde ich versuchen, sie als Funktion für die kommende Piwik-Version 0.6 einzubringen. <a href="http://dev.piwik.org/trac/ticket/692">Ein Ticket dafür</a> gibt schon lange.</p>
<h1>&nbsp;</h1>
<p><a name="english">English version</a></p>
<h2>What is this about?</h2>
<p>Some introductive words for all new visitors: In Germany, saving the IP address of a website visitor is not allowed. It&#8217;s said that the IP is personal data and a client must agree to the storage of his data explicitly. Therefore, tools like Google Analytics should not be used. But even software like Piwik saves the IP addresses. This Plugin was constructed to guarantee better Anonymity.</p>
<h2>The Implementation</h2>
<p>Like the <a href="/post/4/Piwik+ohne+IP-Speicherung+-+mit+Plugin/">first version</a>, this plugin is very simple. The most important change is the used hook: In version 0.1, the order of the plugins was important. But now, I use &#8220;Tracker.saveVisitorInformation&#8221;, which is executed directly before saving to the database. Other plugins like GeoIp are already finished.<br />
Furthermore, the IP addresses aren&#8217;t replaced by zero, but trimmed to two blocks, following the <a href="http://www.braekling.de/web-development/2758-mal-wieder-piwik-und-anonymisierte-ips.html">suggestion of André Bräkling</a>. But I skipped the first trimming. I will explain my reasons later. And I don&#8217;t get the point of saving the short IP instead of zero, neither is it a drawback.</p>
<h2>Discussion</h2>
<h3>Tracking faults</h2>
<p>In the first version of this plugin, the IP was substituted for zero. It worked well, but it was mentioned in the <a href="http://dev.piwik.org/trac/ticket/692">Piwik-Trac</a> that this could create wrong counts of users without cookie support. Is this true?<br />
Let&#8217;s have a detailed look: If a website is called, Piwik tries to find out if the user is a new one ore a returning visitor. This is done by the function <i>recognizeTheVisitor</i> in <i>/core/Tracker/Visit.php</i>. At first, Piwik checks the cookie. Without it, Piwik creates a hash across the client configuration and the IP address &#8211; some kind of fingerprint. Moreover this hash is saved in the visitor_log table (in the column <i>config_md5config</i>). The hash of the current visitor must be compared with the the hashes in the database. If the entry was found, we have a returning visitor. But when all IP addresses would be zero, two clients with the same configuration would look the same.<br />My plugin avoids this situation. The IP is trimmed (or deleted) right beforen saving to the database, after the creation of the hash.</p>
<h3>Trim before process</h3>
<p>André mentions in his article, that it could be necessary to skip the last block of an IP before analysing the city with GeoIP. I&#8217;ve skipped this step. Firstly, it&#8217;s tricky to find the right position without hacking the core. This would be easier with the solution suggested in <a href="http://dev.piwik.org/trac/ticket/1169">ticket #1169</a>. Secondly, because to whole processing is done on the same server. Only in case we use a remote service, trimming would be necessary.</p>
<h3>Hashing instead of trimming</h3>
<p>There are suggestions in the Piwik Trac, that the IP should be hashed instead of deleted. This would mean to change the column location_ip from &#8220;bigint unsigned&#8221; to &#8220;varchar(32)&#8221;. Moreover this kind of anonymisation is not satisfying. If we want to know if a user with a known IP address has visited our site, we just need to hash the IP and check it against the database. Only the other way round is impossible.</p>
</p>
<p>&#8212;&#8212;&#8212;-</p>
<p>As always, I&#8217;m happy to get feedback. If everyone can agree to this solution, I will try to implement it into the next release of Piwik. There is <a href="http://dev.piwik.org/trac/ticket/692">a ticket for this topic</a> long ago.</p>
]]></content:encoded>
			<wfw:commentRss>http://martin-gamnitzer.de/2010/02/noipplugin-v-0-2/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>Piwik ohne IP-Speicherung &#8211; mit Plugin</title>
		<link>http://martin-gamnitzer.de/2010/02/piwik-ohne-ip-speicherung-mit-plugin/?piwik_campaign=rss&#038;piwik_kwd=piwik-ohne-ip-speicherung-mit-plugin</link>
		<comments>http://martin-gamnitzer.de/2010/02/piwik-ohne-ip-speicherung-mit-plugin/#comments</comments>
		<pubDate>Thu, 18 Feb 2010 09:13:28 +0000</pubDate>
		<dc:creator>martin</dc:creator>
				<category><![CDATA[Allgemein]]></category>
		<category><![CDATA[IP]]></category>
		<category><![CDATA[Piwik]]></category>
		<category><![CDATA[Plugin]]></category>

		<guid isPermaLink="false">http://martin-gamnitzer.de/?p=20</guid>
		<description><![CDATA[<p>Die Trackingsoftware <a href="http://piwik.org">Piwik</a> wird zunehmend populär, dank der Unterstützung durch OpenX und gerade in Deutschland durch die Ansicht, dass IP-Adressen personenbezogene Daten sind und deren Speicherung die explizite Erlaubnis des Seitenbesuchers bedürfen.<br />
Doch der Wechsel zu Piwik allein reicht nicht - auch Piwik speichert die IP-Adressen. Aber da die Software auf dem eigenen Server läuft, kann man sie nach eigenen Wünschen und Vorstellungen verändern.<br />
Die IP-Adressen lassen sich auf viele Wege entfernen - vom einfachen Hack bis zum Plugin.</p>]]></description>
			<content:encoded><![CDATA[</p>
<p><b>Update 2010-02-25: Diese Version ist veraltet. Der neuen <a href="http://martin-gamnitzer.de/post/5/NoIpPlugin+v+0.2">Version 0.2 habe ich einen eigenen Artikel</a> gewidmet.</b></p>
<p><b>Update 2010-02-22: Das <a href="http://dev.piwik.org/trac/ticket/1168">Plugin</a> findet man jetzt auch im Piwik-Trac.</b></p>
</p>
<p>Die Trackingsoftware <a href="http://piwik.org">Piwik</a> wird zunehmend populär, dank der Unterstützung durch OpenX und gerade in Deutschland durch die Ansicht, dass IP-Adressen personenbezogene Daten sind und deren Speicherung die explizite Erlaubnis des Seitenbesuchers bedürfen.<br />
Doch der Wechsel zu Piwik allein reicht nicht &#8211; auch Piwik speichert die IP-Adressen. Aber da die Software auf dem eigenen Server läuft, kann man sie nach eigenen Wünschen und Vorstellungen verändern.<br />
Die IP-Adressen lassen sich auf viele Wege entfernen &#8211; vom einfachen Hack bis zum Plugin (das am Artikelende verfügbar ist).</p>
<h2>1. Stufe: Quick &#038; Dirty</h2>
<p>Der sicherlich <a href="http://www.braekling.de/web-development/1847-piwik-keine-ip-adressen-speichern.html">populärste Hack</a> lässt sich in nur einer Zeile realisieren: In der Datei <i>/core/Tracker/Visit.php</i> wird der Wert &#8220;location_ip&#8221; im Array &#8220;visitorInfo&#8221; einfach mit einer Null statt der IP belegt.</p>
<p>Soweit so einfach. Wenn wir Piwik aber nun erweitern wollen &#8211; sagen wir durch das Plugin <a href="http://dev.piwik.org/trac/ticket/45">&#8220;GeoIP&#8221;</a> &#8211; bekommen wir ein Problem: Das Plugin benötigt die IP-Adresse, um daraus auf die Stadt des Besuchers zu schließen. Dummerweise steht an der entsprechenden Stelle eine Null.</p>
<h2>2. Stufe: Sicher ist sicher</h2>
<p>Der alte Hack muss raus, die IP-Adresse muss an anderer Stelle gelöscht werden. Ein optimaler Ort scheint die Funktion &#8220;saveVisitorInformation&#8221; zu sein, auch diese liegt in <i>/core/Tracker/Visit.php</i>.<br />
In dieser Funktion wird das Array &#8220;visitorInfo&#8221; in der Datenbank gespeichert. Also ändern wir den Wert direkt vor der Speicherung. Und für den Fall, dass ein anderes Plugin danach nochmal auf die IP-Adresse zugreifen muss, schreiben wir sie zurück ins Array.<br />
Konkret heißt das: Wir suchen in der Funktion &#8220;saveVisitorInformation&#8221; die Zeile</p>
<pre>
Piwik_Tracker::getDatabase()->query( "INSERT INTO [...] ");
</pre>
<p>Direkt DAVOR beginnt unser Hack mit diesen zwei Zeilen:</p>
<pre>
$ipHelper = $this->visitorInfo['location_ip'];
$this->visitorInfo['location_ip'] = 0;
</pre>
<p>Und direkt nach dem Query erfolgt der Abschluss:</p>
<pre>
$this->visitorInfo['location_ip'] = $ipHelper;
</pre>
<p>Fertig!
</p>
</p>
<h2>3. Stufe: Vom Hack zum Plugin</h2>
<p>Solche Hacks haben natürlich immer ihre Nachteile und sollten möglichst vermieden werden. Denn mit dem nächsten Update sind die Änderungen dahin und wenn man sie nicht dokumentiert hat, fängt man wieder von vorne an. Auch gibt es viele Nutzer, die zwar eine einfache LAMP-Anwedung auf ihrem Server oder Webspace zum Laufen bringen können, aber nie etwas im Quellcode ändern würden &#8211; &#8220;man könnte ja was kaputt machen&#8221;.</p>
<p>Der nächste logische Schritt ist also die Überführung des Hacks in ein Plugin. Wie so ein Piwik-Plugin aufgebaut ist, zeigt das ExamplePlugin, auch das GeoIP-Plugin kann als Anregung genutzt werden. Kern unseres Mini-Plugins ist eigentlich nur ein Hook für das Event &#8220;Tracker.newVisitorInformation&#8221; und eine gekoppelte Funktion, die mal wieder im Array visitInfo die IP mit eine Null überschreibt. Doch genau diese Aktion hat uns zu Beginn Kopfzerbrechen bereitet! Deshalb ist es wichtig, dass unser Plugin erst nach dem GeoIP Plugin ausgeführt wird. Dazu reicht es, diese Reihenfolge auch beim Aktivieren der Plugins zu beachten. Zur Sicherheit hilft auch noch ein Blick in die <i>config/config.ini.php</i> im Bereich &#8220;[Plugin_Tracker]&#8220;. Hier sollte GeoIP an zweiter Stelle,  nach &#8220;Provider&#8221; aufgelistet sein.</p>
<p>Noch ein kleiner Tipp, weil wir gerade in der Konfiguration herumspielen: Wer es nicht mag, dass Piwik standardmäßig den gestrigen Tag anzeigt, fügt am Ende noch zwei Zeilen ein:</p>
<pre>
[General]
default_day = "today"
</pre>
</p>
<p>Zurück zum Plugin. Hier kann es nun heruntergeladen werden:</p>
<p style="font-size:18px; font-weight:bold; text-decoration:line-through; color:#050590;">Download NoIpPlugin.zip</p>
<p>Die Installation läuft wie bei allen Piwik-Plugins: Die Zip-Datei in den Ordner &#8220;plugins/&#8221; schieben und entpacken (oder lokal entpacken und per FTP in den Ordner schieben), im Backend aktivieren und ggf. kontrollieren, dass die Reihenfolge wie oben beschrieben eingehalten wird.<br />Wenn alles funktioniert, zeichnet GeoIP die Städte weiterhin auf, statt der IP steht nur noch eine &#8220;0&#8243; in der Datenbank. Wenn man alte Datensätze auch noch bereinigen will, sollte man im MySQL-Client seiner Wahl noch &#8220;UPDATE piwik_visitor_log&#8221; SET location_ip = 0&#8243; ausführen.</p>
<p>Ich hoffe, alle Nutzer kommen damit klar. Ich freue mich über Feedback.</p></p>
]]></content:encoded>
			<wfw:commentRss>http://martin-gamnitzer.de/2010/02/piwik-ohne-ip-speicherung-mit-plugin/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Zum Neustart des LVB Internetauftritts</title>
		<link>http://martin-gamnitzer.de/2010/01/zum-neustart-des-lvb-internetauftritts/?piwik_campaign=rss&#038;piwik_kwd=zum-neustart-des-lvb-internetauftritts</link>
		<comments>http://martin-gamnitzer.de/2010/01/zum-neustart-des-lvb-internetauftritts/#comments</comments>
		<pubDate>Sat, 02 Jan 2010 09:10:18 +0000</pubDate>
		<dc:creator>martin</dc:creator>
				<category><![CDATA[Allgemein]]></category>
		<category><![CDATA[Leipzig]]></category>
		<category><![CDATA[LVB]]></category>

		<guid isPermaLink="false">http://martin-gamnitzer.de/?p=17</guid>
		<description><![CDATA[<p>Gestern hat die Leipziger Verkehrbetriebe GmbH eine komplette Überarbeitung <a href="http://lvb.de/">ihrer Webseiten</a> fertiggestellt und veröffentlicht – ein eigenes „LVB-Internet“, wie in der <a href="http://www.lvb.de/Informationen/Nachrichten/2,1,YTozOntzOjc6ImNvbW1hbmQiO3M6MTA6InNob3dEZXRhaWwiO3M6NjoiZW50aXR5IjtzOjQ6IjEyNjIiO3M6ODoicmVkaXJlY3QiO2I6MTt9">Presseerklärung</a> nachzulesen ist.</p>]]></description>
			<content:encoded><![CDATA[<p>Gestern hat die Leipziger Verkehrbetriebe GmbH eine komplette Überarbeitung <a href="http://lvb.de/">ihrer Webseiten</a> fertiggestellt und veröffentlicht – ein eigenes „LVB-Internet“, wie in der <a href="http://www.lvb.de/Informationen/Nachrichten/2,1,YTozOntzOjc6ImNvbW1hbmQiO3M6MTA6InNob3dEZXRhaWwiO3M6NjoiZW50aXR5IjtzOjQ6IjEyNjIiO3M6ODoicmVkaXJlY3QiO2I6MTt9">Presseerklärung</a> nachzulesen ist.</p>
<p>Erste Reaktionen ließen nicht lange auf sich warten. Während die <a href="http://nachrichten.lvz-online.de/leipzig/citynews/lvb-wollen-mit-neuer-internetseite-internationale-massstaebe-setzen/r-citynews-a-10992.html">Leipziger Volkszeitung</a> und die <a href="http://www.l-iz.de/Bildung/Medien/2010/01/Leipziger-Verkehrsbetriebe-mischen-Web-Auftritt-auf.html">Leipziger Internetzeitung</a> den neuen Auftritt loben und ihn für „sichtbar kundenorientiert“ (l-iz) halten, sind die meisten <a href="http://twitter.com/#search?q=%23lvb">Kommentare bei Twitter</a> von Ablehnung und Entsetzen geprägt.</p>
<p>Heute werde ich mich an einer tiefergehenden Analyse und Bewertung des neuen Auftritts versuchen.</p>
<h2>Das Design – der erste Eindruck</h2>
<p>Bei meinem ersten Besuch des neuen Internets (sic!)  war ich vor allem geplättet – so viel grau, der gestreifte Hintergrund, ein fetter gelber Streifen am unteren Bildschirmrand, eine Orientierung viel mir schwer.</p>
<p>Darin manifestiert sich der aus meiner Sicht stärkste Kritikpunkt an dem Webangebot der LVB: Farbgestaltung und Kontraste scheinen in der Usabilitybetrachtung untergegangen zu sein. Das ein gestreifter Hintergund vor zehn Jahren modern war, darüber könnte man hinwegsehen. Doch die insgesamt dunkle Erscheinung ist problematisch. Es gibt viele künstlerisch wertvolle und beeindruckend gestaltete Webseiten mit einem dunklen Farbthema, keine Frage. Aber wir reden hier nicht über die Portfolioseiten eines Grafikdesigners, sonder über ein Portal eines lokalen Verkehrsbetriebes. Funktionalität und einfache Nutzbarkeit sollten hier an erster Stelle stehen. Und dazu gehören auch gute Kontraste sowie die optische Hervorhebung der wichtigsten Funktionen. Bei der LVB springen nur aktuelle Warnmeldungen sowie der (völlig sinnlose, platzfressende) Balken am unteren Fensterrand ins Auge.</p>
<p>Nicht minder entsetzt war ich von der Geschwindigkeit der Seite. Ganze zehn Sekunden dauerte das Laden der Startseite! Doch war dies vielleicht nur Folge des hohen Ansturms nach dem Relaunch. Heute läuft die Seite einigermaßen flott und würde auch noch etwas besser laufen, wenn nicht auf jeder Seite der Versuch scheitern würde, Piwik korrekt einzubinden.</p>
<p>Insgesamt bin ich von dem neuen Design sehr enttäuscht. Die Liste an ungenügenden Umsetzungen ließe sich noch eine Weile erweitern, für mich ist dies aber genug des Bashings.</p>
<h2>Funktionen im Detail</h2>
<p>Nachdem der erste Eindruck sich gesetzt hat, kann man nun in die Tiefe gehen. Tatsächlich finden sich auf der Startseite wichtige und oft genutzte Funktionen recht zentral und somit schnell auffindbar.</p>
<p>Bisher habe ich die Seiten der LVB nur genutzt, um Verbindungsinformationen zu suchen, also fange auch jetzt damit an. Die automatische Vorschläge bei der Haltestelleneingabe und die AJAX-gestützte Suche finde ich prima, aber auch zeitgemäß. Sehr gut gelungen finde ich die Integration von Google Maps, die nicht nur Ziel- und Endhaltstelle, sondern auch den Fahrtweg mit allen Zwischenhalten anzeigt.  Dummerweise ist die Karte riesig, die Auflistung der konkreten Fahrtzeiten musste ich erstmal suchen – bei einer „Standard-“Auflösung von 1024&#215;768 Pixeln sind sie ohne Scrollen nicht mehr zu sehen.</p>
<p>Wenn ich eine hübsche „Web-2.0-Funktion“ sehe, muss ich immer gleich JavaScript deaktivieren und testen, ob es auch ohne geht – immerhin erhebt man bei der LVB auch den Anspruch der Barrierefreiheit. Aber es geht leider nicht! Die Eingabefelder sind gesperrt, man kann nicht mal hineinschreiben. Jedoch: Wenn man noch einen Schritt extremer wird und die Stylesheets deaktiviert, geht es wieder.</p>
<p>Insgesamt hebt sich diese Funktion sehr positiv von der alten Umsetzung ab, hat aber einige nicht unwesentliche Schwächen.</p>
<p>Der zweite Hauptmenüpunkt – „Tarife“ – enthält eine Reihe fragwürdiger Piktogramme, die Auflistung der einzelnen Tarifoptionen ist aber übersichtlich und selbsterklärend. Auffällig ist hier aber, das der Beschreibungstext im Gegensatz zur restlichen Seite schwarz auf weißem Grund ist -Teilweise mit Scrollbalken, z.B. bei „Servicestellen“ oder den Pressemitteilungen. Es wirkt völlig unpassend und provisorisch/unfertig.</p>
<p>„Interessant“ ist auch die Suchfunktion. Leider habe ich bisher noch keinen Suchbegriff finden können, der dem System bekannt ist. Aber vielleicht kommt das ja noch. Ebenso wie die Mehrsprachigkeit, welche laut l-iz erst im Februar kommen soll.</p>
<p>Die meisten anderen Funktionen habe ich nie genutzt und werde sie wahrscheinlich auch nicht nutzen, so dass ich hier auch keine Kritik abgegeben kann.</p>
<h2>Fazit</h2>
<p>Die Seite bietet einige hübsche Funktionen, um das „Erlebnis“ für den Nutzer möglichst sinnvoll zu gestalten. Damit hebt sich das Angebot der LVB definitiv von vergleichbaren Seiten in der Branche ab. Insgesamt wirkt die Seite aber völlig unfertig. Grundsätzliche Regeln der Usability oder Barrierefreiheit werden ignoriert. Und doch wird der Anspruch erhoben, barrierefrei zu sein und ein Produkt geschaffen zu haben, dass „den Anforderungen der nächsten Jahre gerecht wird“ (Peter Nebe, LVB).</p>
<p>Man kann nicht sagen, dass die 50.000 € für dieses Projekt in den Sand gesetzt wurden. Aber mit einigen einfachen Mitteln hätte man den Wert dieser Seiten erheblich steigern können.  Hier wurde eine gute Chance vertan, etwas wirklich innovatives zu schaffen. Schade.</p>
<p><strong>Nachtrag:</strong> Daniel Große war schneller und hat bereits <a href="http://www.danielgrosse.com/blog/2010/01/20/die-lvb-und-die-sache-mit-dem-internet/">seine Analyse der LVB-Seiten</a> veröffentlicht.  Er geht noch auf einige weitere Aspekte wie Suchmaschinenoptimierung ein, die Grundaussage deckt sich mit meinen Ansichten.</p>
]]></content:encoded>
			<wfw:commentRss>http://martin-gamnitzer.de/2010/01/zum-neustart-des-lvb-internetauftritts/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

<!-- Performance optimized by W3 Total Cache. Learn more: http://www.w3-edge.com/wordpress-plugins/

Minified using memcached
Page Caching using memcached
Database Caching using memcached

Served from: martin-gamnitzer.de @ 2018-05-09 17:00:17 -->