<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0">
<channel>
<title>Mike's Website</title>
<link>http://unckel.de</link>
<description>Code-Snippets, Projekte, Ideen und Reisebilder von Mike Unckel</description>
<copyright>(c) Mike Unckel</copyright>
<ttl>5</ttl>
<item>
<title>Links rund um HTML5</title>
<description><![CDATA[<ul>
<li><a href="http://praegnanz.de/weblog/htmlcssjs-kickstart">HTML5/CSS/JS-Kickstart 1.4</a></li>
<li><a href="http://html5boilerplate.com/">HTML5 ★ Boilerplate - HTML5 Template</a></li>
<li><a href="http://diveintohtml5.org/">Dive Into HTML5</a></li>
<li><a href="https://developer.mozilla.org/en/HTML/Canvas">MDC - HTML-Element: Canvas</a></li>
<li>Schöner malen mit <a href="http://processingjs.org/">Processing.js</a></li>
</ul>

<p>...to be continued...</p>]]></description>
<link>http://unckel.de/v6/post.aspx?id=261</link>
<pubDate> / </pubDate>
</item>
<item>
<title>Position eines Street View-Panoramas über Panorama-ID ermitteln (Google Maps Javascript API V3)</title>
<description><![CDATA[<p>Jedes Panorama hat eine eindeutige ID. (IDs sind nur während einer Session stabil!) Über die Methode <a href="http://code.google.com/apis/maps/documentation/javascript/reference.html#StreetViewPanorama">getLinks()</a> werden zum aktuellen Street View-Panorama ein Array der verbundenen Straßen mit Name, Richtung und IDs der nächsten Panoramen zurückgeliefert. Leider aber nicht die einzelnen Positionen.</p>
 
<p>Eine Möglichkeit bietet die <a href="http://code.google.com/apis/maps/documentation/javascript/reference.html#StreetViewService">StreetViewService-Klasse</a>. Die Methode getPanoramaById() liefert dazu ein StreetViewPanoramaData-Objekt zurück welches unter anderem die Position enthält.</p>

<pre class="brush: js; gutter: false;">
//...

var sv = new google.maps.StreetViewService();
var panoramaLinks = panorama.getLinks();
for (var i in panoramaLinks) {
  sv.getPanoramaById(panoramaLinks[i].pano, processSVData)
}

//...
 
function processSVData(data, status) {
  if (status == google.maps.StreetViewStatus.OK) {
    alert(data.location.latLng);
  }
}
</pre>

 
<p>Jetzt ist man in der Lage z.B. die Positionen der nächsten Panoramen auf einer Karte zu markieren oder die Entfernungen zur aktuellen Position auszurechnen. Letzteres ist wiederum wichtig wenn es um eine möglichste genaue Simulation einer virtuellen Fahrt durch Street View geht.</p>

<p>Bei kurzen Tests rund um den Globus, scheinen die Panoramen immer mindestens 10 m Abstand zu haben. Eine Unterschreitung habe ich nie gesehen. Auf Landstraßen können es auch schon mal über 40 m sein.</p>

<p>Link: <a href="http://code.google.com/apis/maps/documentation/javascript/">Google Maps Javascript API V3</a></p>

<em>(Stichworte: google, street view, api, location, position, distance)</em>]]></description>
<link>http://unckel.de/v6/post.aspx?id=260</link>
<pubDate> / </pubDate>
</item>
<item>
<title>.NET: Webcam in Windows Forms-Anwendung mit OpenCV über Emgu CV-Wrapper integrieren</title>
<description><![CDATA[<p>Hier ein "HelloWorld"-Beispiel, wie man eine USB-Cam in einer Visual Studio Windows Forms-Anwendung in C# einbindet. Über den <a href="http://www.emgu.com/">Emgu CV-.Net-Wrapper</a> wird die <a href="http://opencv.willowgarage.com/">OpenCV Library</a> (Open Source <a href="http://en.wikipedia.org/wiki/Computer_vision">Computer Vision</a>) verwenden. Diese enthält unzählige Algorithmen für die Bildverarbeitung und maschinelles Sehen. Also z.B. Filter, Gesichts- und Bewegungserkennung usw. Das ganze ist auch ziemlich schnell in der Verarbeitung.</p>

<p>Getestet und programmiert mit Visual Studio 2008 mit SP1 (ServicePack ist wichtig) auf Windows 7 (32) und Windows XP (32).</p>

<strong>Vorgehen:</strong>
<ol style="margin-left:10px; padding-left:10px;">
<li>Download Emgu inkl. OpenCV: libemgucv-2.1.0.793-win32.exe von <a href="http://sourceforge.net/projects/emgucv/files/">http://sourceforge.net/projects/emgucv/files/</a> (prinzipiell benötigt man nur die paar DLLs beim Download sind aber noch Beispiele, eine Doku usw. dabei.)</li>
<li>Bei der Installation die vorgewählten Optionen belassen.</li>
<li>Neues Windows Forms-Anwendung-Projekt anlegen und Timer und PictureBox in die Form setzen.</li>
<li>Alle relevanten OpenCV- und Emgu-DLLs in den Anwendungsordner (\bin) kopieren und auf die Emgu-DLLs in Visual Studio verweisen.</li>
</ol>

<pre class="brush: c-sharp; gutter: false;">
using System;
using System.Drawing;
using System.Windows.Forms;

using Emgu.CV;
using Emgu.CV.Structure;

namespace WebCamSimpleTest
{
  public partial class Form1 : Form
  {
    private Capture capture;

    public Form1()
    {
      InitializeComponent();
    }

    private void Form1_Load(object sender, EventArgs e)
    {
      capture = new Capture(0); // 0 = get first cam
      timer1.Interval = 40;     // 40 ms = 25 fps
      timer1.Enabled = true;
    }

    private void timer1_Tick(object sender, EventArgs e)
    {
      using (Image&lt;Bgr, byte&gt; nextFrame = capture.QueryFrame())
      {
        pictureBox1.Image = nextFrame2.ToBitmap();
      }
    }
  }
}</pre>]]></description>
<link>http://unckel.de/v6/post.aspx?id=259</link>
<pubDate> / </pubDate>
</item>
<item>
<title>SQL: Duplikate mit Anzahl ausgeben</title>
<description><![CDATA[<p>Ausgabe aller Duplikate (einer Spalte) und deren Anzahl per SQL ermitteln.</p>

<pre class="brush: sql; gutter:false;">
SELECT Spalte, (COUNT(*)-1) AS Anzahl
FROM Tabelle
GROUP BY Spalte
HAVING COUNT(*)>1
ORDER BY COUNT(*) DESC;
</pre>

<table class="contentDataTable">
    <thead>
        <tr>
            <th>Spalte</th>
            <th>Anzahl</th>
        </tr>
    </thead>
    <tbody>
        <tr>
            <td>A. Müller</td>
            <td>5</td>
        </tr>
        <tr>
            <td>B. Schneider</td>
            <td>2</td>
        </tr>
        <tr>
            <td>W. Weber</td>
            <td>1</td>
        </tr>
    </tbody>
</table>]]></description>
<link>http://unckel.de/v6/post.aspx?id=257</link>
<pubDate> / </pubDate>
</item>
<item>
<title>PHP: CSV lesen und HTML-Tabellen erzeugen</title>
<description><![CDATA[Kurz und bündig...

<pre class="brush: php; light: true">
&lt;?php

// Konfiguration
$csvFile = &quot;daten.csv&quot;;
$firstRowHeader = true;
$maxRows = 10;

// Daten auslesen und Tabelle generieren
$handle = fopen($csvFile, &quot;r&quot;);
$counter = 0;
echo &quot;&lt;table class=\&quot;csvTable\&quot;&gt;&quot;;
while(($data = fgetcsv($handle, 999, &quot;;&quot;)) &amp;&amp; ($counter &lt; $maxRows)) {

	echo &quot;&lt;tr&gt;&quot;;
	if(($counter == 0) &amp;&amp; $firstRowHeader) {
		echo &quot;&lt;th&gt;&quot;.$data[0].&quot;&lt;/th&gt;&quot;;
		echo &quot;&lt;th&gt;&quot;.$data[1].&quot;&lt;/th&gt;&quot;;
		echo &quot;&lt;th&gt;&quot;.$data[2].&quot;&lt;/th&gt;&quot;;
	}
	else {
		echo &quot;&lt;td&gt;&quot;.$data[0].&quot;&lt;/td&gt;&quot;;
		echo &quot;&lt;td&gt;&quot;.$data[1].&quot;&lt;/td&gt;&quot;;
		echo &quot;&lt;td&gt;&quot;.$data[2].&quot;&lt;/td&gt;&quot;;
	}
	echo &quot;&lt;/tr&gt;&quot;;

	$counter++;
}
echo &quot;&lt;/table&gt;&quot;;	

fclose($handle);

?&gt;
</pre>]]></description>
<link>http://unckel.de/v6/post.aspx?id=256</link>
<pubDate> / </pubDate>
</item>
<item>
<title>Javascript: Einfacher Spamschutz für E-Mail-Adressen</title>
<description><![CDATA[<p>Einfacher aber effektiver Spamschutz für E-Mail-Adressen mit Javascript und <a href="http://jquery.com/">jQuery</a>.<br />
Ist JavaScript deaktiviert, erscheint nur <strong>info [at] domain.com</strong>.</p>

<pre class="brush: js; gutter: false;">
&lt;script type=&quot;text/javascript&quot; src=&quot;jquery.js&quot;&gt;&lt;/script&gt;
&lt;script type=&quot;text/javascript&quot;&gt;

$(document).ready(function(){
  $('.email').each(function(index) {
    var pA = $(this).text();
    var pAA = pA.replace(&quot; [at] &quot;, &quot;&amp;#64;&quot;);
    $(this).html(&quot;&lt;a href=\&quot;mailto:&quot; + pAA + &quot;\&quot;&gt;&quot; + pAA + &quot;&lt;/a&gt;&quot;);
  });
});

&lt;/script&gt;
</pre>

<p>Aus: <strong>info [at] domain.com</strong><br />
wird: <strong><a href="mailto:info@domain.com">info@domain.com</a></strong></p>

<p>Im Quelltext die E-Mail-Adressen in span-Tags mit der Klasse "email" setzen:<br />
<strong>&lt;span class=&quot;email&quot;&gt;info [at] domain.com&lt;/span&gt;</strong></p>
		
<p>D.h. alle Elemente mit der Klasse "email" werden in les- und klickbare E-Mail-Adressen umgewandelt.</p>

<p><strong>Ohne jQuery</strong> könnte es z.B. so aussehen:</p>

<pre class="brush: js; gutter: false;">
&lt;script type=&quot;text/javascript&quot;&gt;

function convertMailAddress() {
  var emailElements;
  if (document.getElementsByClassName)
    emailElements = document.getElementsByClassName(&quot;email&quot;);
  else
    emailElements = document.getElementsByClassNameForOldies(&quot;email&quot;);
  var elementContent, replaceContent;
  for (var i=0; i&lt;emailElements.length; i++) {
    elementContent = emailElements[i].innerHTML;
    replaceContent = elementContent.replace(&quot; [at] &quot;, &quot;&amp;#64;&quot;);
    emailElements[i].innerHTML =
      &quot;&lt;a href=\&quot;mailto:&quot; + replaceContent + &quot;\&quot;&gt;&quot; + replaceContent + &quot;&lt;/a&gt;&quot;;
  }
}

// http://javascript.about.com/library/bldom08.htm
document.getElementsByClassNameForOldies = function(cl) {
  var retnode = [];
  var myclass = new RegExp('\\b'+cl+'\\b');
  var elem = this.getElementsByTagName('*');
  for (var i = 0; i &lt; elem.length; i++) {
    var classes = elem[i].className;
    if (myclass.test(classes)) retnode.push(elem[i]);
  }
  return retnode;
};

window.onload = convertMailAddress;

&lt;/script&gt;
</pre>
]]></description>
<link>http://unckel.de/v6/post.aspx?id=255</link>
<pubDate> / </pubDate>
</item>
<item>
<title>Google Chrome Erweiterungen</title>
<description><![CDATA[<p>Google Chrome ist schön schlank, schnell und jeder Tab läuft in einem eigenen Prozess. Folgende Erweiterungen hab ich (als Webworker) mal installiert und bin recht zufrieden damit.</p>

<p><strong>PageRank</strong><br />
Zeigt den Google PageRank der Seite an.<br />
<a href="https://chrome.google.com/extensions/detail/pneoplpmnpjoioldpodoljacigkahohc">https://chrome.google.com/extensions/detail/pneoplpmnpjoioldpodoljacigkahohc</a></p>
	
<p><strong>Pendule</strong><br />
Web developer tools.<br />
<a href="https://chrome.google.com/extensions/detail/gbkffbkamcejhkcaocmkdeiiccpmjfdi">https://chrome.google.com/extensions/detail/gbkffbkamcejhkcaocmkdeiiccpmjfdi</a></p>

<p><strong>W3C (x)HTML Validator</strong><br />
Stimmt alles soweit? Gut! ;)<br />
<a href="https://chrome.google.com/extensions/detail/fdicklfajomdgpciofajkedchajbnhkk">https://chrome.google.com/extensions/detail/fdicklfajomdgpciofajkedchajbnhkk</a></p>

<p><strong>Docs-Viewer für PDF/PowerPoint</strong><br />
Vorschau von PDFs, PowerPoint und anderen Dokumente im Google Docs-Viewer.<br />
<a href="https://chrome.google.com/extensions/detail/nnbmlagghjjcbdhgmkedmbmedengocbn">https://chrome.google.com/extensions/detail/nnbmlagghjjcbdhgmkedmbmedengocbn</a></p>

<p>addon, plugins</p>]]></description>
<link>http://unckel.de/v6/post.aspx?id=254</link>
<pubDate> / </pubDate>
</item>
<item>
<title>Wordpress Plugins beim Einsatz als CMS</title>
<description><![CDATA[<p><a href="http://wordpress.org/">Wordpress</a> eignet sich für kleine, einfache Websites auch ganz gut als CMS. Es ist schnell eingerichtet, bietet viele Erweiterungen und ganz wichtig - der Kunde findet sich sehr schnell zurecht. Oft habe ich sogar nur am Telefon "geschult".<br />
Grundlage ist immer ein einfaches CMS-Template. Artikel, Kommentare usw. – alles was nicht gebraucht wird ist deaktiviert.</p>

<p>Neben den bekannten z.B. Kontaktformular-Plugins, kommt man aber um ein paar weitere nicht herum (ich zumindest), weil Wordpress in der Version 2.9.2 das (noch) nicht bietet.</p>

<p><strong>Page Links To</strong><br />
Leitet einen Menüpunkt, was ja einer Seite entspricht, auf eine beliebige URL um.<br />
<a href="http://wordpress.org/extend/plugins/page-links-to/">http://wordpress.org/extend/plugins/page-links-to</a></p>

<p><strong>Exclude Pages</strong><br />
Versteckt Menüpunkte in der Navigation.<br />
<a href="http://wordpress.org/extend/plugins/exclude-pages/">http://wordpress.org/extend/plugins/exclude-pages</a></p>

<p><strong>Breadcrumb NavXT</strong><br />
Fügt eine "Brotkrummen-Navigation" ein, mit vielen Einstellungsmöglichkeiten.<br />
<a href="http://wordpress.org/extend/plugins/breadcrumb-navxt/">http://wordpress.org/extend/plugins/breadcrumb-navxt</a></p>

<p><strong>TinyMCE Advanced</strong><br />
Erweitert den Standard-Editor TinyMCE um etliche Funktionen.<br />
<a href="http://wordpress.org/extend/plugins/tinymce-advanced/">http://wordpress.org/extend/plugins/tinymce-advanced</a></p>

<p><strong>Google XML Sitemaps</strong><br />
Stellt eine Sitemap für Suchmaschinen zur Verfügung.<br />
<a href="http://wordpress.org/extend/plugins/google-sitemap-generator/">http://wordpress.org/extend/plugins/google-sitemap-generator</a></p>

<p><em>- to be continued -</em></p>
]]></description>
<link>http://unckel.de/v6/post.aspx?id=253</link>
<pubDate> / </pubDate>
</item>
<item>
<title>Photoshop: Mehr als 31 Zeichen lange Dateinamen unter "Für Web Speichern..."</title>
<description><![CDATA[<p>Ggf. möchte man mehr als 31 Zeichen lange Dateinamen vergeben. Photoshop schneidet die aber aus Gründen der Kompatibilität zu MAC OS9 und Unix die Namen ab. Dies läst sich einfach ändern - ist aber gut versteckt: (Unter CS2 Win.)</p>

<ul>
<li>Im Fenster "Für Web speichern..." neben den Voreinstellungen auf den kleinen Pfeil klicken</li>
<li>Dort "Ausgabeeinstellungen bearbeiten..." wählen</li>
<li>Dann über die der Auswahlliste zu "Dateien speichern" springen</li>
<li>Und hier dann im Bereich "Dateinamenkompatibilität" MAC OS 9 und Unix deaktivieren</li>
</ul>
]]></description>
<link>http://unckel.de/v6/post.aspx?id=252</link>
<pubDate> / </pubDate>
</item>
<item>
<title>Mehrsprachige Websites kodieren</title>
<description><![CDATA[<p>Ich musste mal ein PHP-Frameworks für englische, russische, chinesische und arabische Inhalte entwickeln. Im Internet findet sich dazu auch eine Vielzahl von Artikeln, über die "richtige" Kodierung von mehrsprachigen Websites. Wie lassen sich also z.B. kyrillische, chinesische oder auch arabische Zeichen korrekt darstellen. Leider widersprechen sich manche der Tipps.</p>

Daher nun meine Vorgehendweise (getestet auf PC, MAC, Linux mit jeweils unterschiedlichen Browsern):
<ul>
  <li>erst mal muss eine Schrift mit entsprechende Zeichenumfang installiert sein (z.B. Arial Unicode)</li>
  <li>mit einem UTF-8-fähigen Editor arbeiten (sollen die Meisten können)</li>
  <li>alle Dateien als UTF-8 ohne BOM kodieren</li>
  <li>Tag-Attribute im HTML-Head entsprechend anpassen, hier z.B. für arabisch:</li>
</ul>
 
<pre class="brush: c-sharp; gutter: false;">&lt;html xmlns=&quot;http://www.w3.org/1999/xhtml&quot; xml:lang=&quot;ar&quot; lang=&quot;ar&quot; dir=&quot;rtl&quot;&gt;
&lt;meta http-equiv=&quot;Content-Type&quot; content=&quot;text/html; charset=utf-8&quot; /&gt;
</pre>

<p><br /><img src="data/files/notepad-php-code.gif" alt="" border="1" /><br /> 
<em>Code-Ausschnitt als Beispiel</em></p>

<p><br /><img src="data/files/notepad-format.gif" alt="" /><br /> 
<em>Einstellungen zum Format im Freeware-Editor Notepad++</em></p> 

<p><br /><strong>Mehr Infos dazu:</strong></p>

<p>Unicode Open-Source-Editor Nodepad++<br />
<a href="http://notepad-plus.sourceforge.net/">http://notepad-plus.sourceforge.net/</a></p>
 
<p>Infos zu UTF-8<br />
<a href="http://de.wikipedia.org/wiki/UTF-8">http://de.wikipedia.org/wiki/UTF-8</a></p>

<p>Infos zu BOM (Byte Order Mark)<br />
<a href="http://de.wikipedia.org/wiki/Byte_Order_Mark">http://de.wikipedia.org/wiki/Byte_Order_Mark</a></p>
 
<p>Grundlagen der Zeichenkodierung<br />
<a href="http://toscho.de/2008/grundlagen-zeichenkodierung/">http://toscho.de/2008/grundlagen-zeichenkodierung/</a></p>]]></description>
<link>http://unckel.de/v6/post.aspx?id=251</link>
<pubDate> / </pubDate>
</item>
<item>
<title>Harmonische Farben finden</title>
<description><![CDATA[<p>Hier ein paar Online-Tools zum Zusammenstellen harmonischer Farben:</p>

<p>ColorJack > Sphere<br />
<a href="http://www.colorjack.com/sphere/">http://www.colorjack.com/sphere/</a></p>

<p>ColorBlender<br />
<a href="http://colorblender.com/">http://colorblender.com/</a></p>

<p>Color Schemer Online<br />
<a href="http://www.colorschemer.com/online.html">http://www.colorschemer.com/online.html</a></p>

<p>Adobe Kuler<br />
<a href="http://kuler.adobe.com/">http://kuler.adobe.com/</a></p>]]></description>
<link>http://unckel.de/v6/post.aspx?id=250</link>
<pubDate> / </pubDate>
</item>
<item>
<title>Photoshop: ICO-Format (Windows Icons, Favicons) direkt speichern</title>
<description><![CDATA[<p>Photoshop kann auch in der aktuellen Version (CS4) noch immer nicht direkt das .ico-Dateiformat erstellen. Dabei benötigt man das Format z.B. für Favicons für Websites.</p>

<p>Mit den kostenlosen kleinen Format-Plugin von <a href="http://www.telegraphics.com.au">www.telegraphics.com.au</a> geht's dann trotzdem! Einfach unter <a href="http://www.telegraphics.com.au/sw/#icoformat">www.telegraphics.com.au/sw/#icoformat</a> die Datei ICOFormat.8bi herunterladen und in den Ordner: <em>C:\Programme\Adobe\Adobe Photoshop CSX\Zusatzmodule\Dateiformat</em> (bzw. <em>C:\Program Files\Adobe\Adobe Photoshop CSX\Plugins\File Formats</em>)  kopieren.</p>

<p>Über "Speichern unter..." dann das *.ICO-Format auswählen.</p>

<p>Gesehen bei:<br />
<a href="http://www.tipps-tricks-kniffe.de/photoshop-ico-mit-photoshop-ico-dateien-icons-erstellen/">www.tipps-tricks-kniffe.de/photoshop-ico-mit-photoshop-ico-dateien-icons-erstellen/</a><br />
<a href="http://www.photoshop-weblog.de/10-kostenlose-plugins/">www.photoshop-weblog.de/10-kostenlose-plugins/</a></p>

<p>Schöne Icons gibt's unter anderem bei <a href="http://www.iconfinder.net/">www.iconfinder.net</a></p>]]></description>
<link>http://unckel.de/v6/post.aspx?id=249</link>
<pubDate> / </pubDate>
</item>
<item>
<title>ASP.NET: Einfache Log-Datei schreiben</title>
<description><![CDATA[<p>Muss mal schnell was mitgeloggt werden, bietet sich z.B. der StreamWriter an.</p>

<pre class="brush: c-sharp; gutter: false;">
using System.IO;
...
string fileName = String.Format("log-{0}.txt", DateTime.Now.ToString("yyyy-MM-dd"));
string dataRow = String.Format("{0}; {1}; {2}", DateTime.Now, var1, var2);

StreamWriter myFile = new StreamWriter(Server.MapPath("~/App_Data/" + fileName), true);
myFile.WriteLine(dataRow);
myFile.Close();
</pre>]]></description>
<link>http://unckel.de/v6/post.aspx?id=247</link>
<pubDate> / </pubDate>
</item>
<item>
<title>ASP.NET: Twitter Feeds per XmlDataSource- und Repeater-Control in Websites einbinden</title>
<description><![CDATA[<p>RSS- bzw. Atom-Feeds von Twitter, Blogs usw. lassen sich sehr einfach mit dem XmlDataSource-Control in die eigene Website einbinden. Dazu ist quasi keine einzige Zeile "richtiger" Code notwendig, sonder lediglich zwei ASP.NET-Controls.</p>

<p>Das Beispiel bezieht sich explizit auf einen Twitter Atom-Feed, lässt sich aber an jeden beliebigen anderen Feed anpassen. Wichtig: Immer genau die XML-Struktur des Feeds über die Quelltextansicht anschauen. Bei Twitter sieht das z.B. so aus:</p>

<pre class="brush: xml; gutter: false;">
&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;
&lt;rss xmlns:atom=&quot;http://www.w3.org/2005/Atom&quot; version=&quot;2.0&quot;&gt;
  &lt;channel&gt;
    &lt;title&gt;Twitter / unckel&lt;/title&gt;
    &lt;link&gt;http://twitter.com/unckel&lt;/link&gt;
    &lt;atom:link type=&quot;application/rss+xml&quot; href=&quot;http://twitter.com/statuses/user_timeline/23050865.rss&quot; rel=&quot;self&quot;/&gt;
    &lt;description&gt;Twitter updates from unckel designworks / unckel.&lt;/description&gt;
    &lt;language&gt;en-us&lt;/language&gt;
    &lt;ttl&gt;40&lt;/ttl&gt;
  &lt;item&gt;
    &lt;title&gt;unckel: tweet tweet!&lt;/title&gt;
    &lt;description&gt;unckel: tweet tweet!&lt;/description&gt;
    &lt;pubDate&gt;Wed, 18 Nov 2009 07:45:26 +0000&lt;/pubDate&gt;
    &lt;guid&gt;http://twitter.com/unckel/statuses/5821036943&lt;/guid&gt;
    &lt;link&gt;http://twitter.com/unckel/statuses/5821036943&lt;/link&gt;
  &lt;/item&gt;
  &lt;item&gt;
    ... usw ...
  &lt;/item&gt;
  &lt;/channel&gt;
&lt;/rss&gt;</pre>

<p>Wichtig ist hier also der Inhalt der &lt;items&gt; und das wären insbesondere &lt;title&gt;, &lt;pubDate&gt; und &lt;link&gt;.</p>

<pre class="brush: c-sharp; gutter: false;">
&lt;asp:XmlDataSource ID=&quot;XmlDataSource1&quot; runat=&quot;server&quot; 
	DataFile=&quot;http://twitter.com/statuses/user_timeline/23050865.rss&quot;
	XPath=&quot;rss/channel/item&quot; EnableCaching=&quot;false&quot; /&gt;

&lt;asp:Repeater ID=&quot;Repeater1&quot; runat=&quot;server&quot; DataSourceID=&quot;XmlDataSource1&quot;&gt;
&lt;ItemTemplate&gt;
	&lt;a href=&quot;&lt;%# XPath(&quot;link&quot;) %&gt;&quot;&gt;&lt;%# XPath(&quot;title&quot;) %&gt;&lt;/a&gt;&lt;br /&gt;
	&lt;%# XPath(&quot;pubDate&quot;) %&gt;&lt;br /&gt;
	&lt;hr /&gt;
&lt;/ItemTemplate&gt;
&lt;/asp:Repeater&gt;</pre>

<p>Einfach! Oder?</p>]]></description>
<link>http://unckel.de/v6/post.aspx?id=246</link>
<pubDate> / </pubDate>
</item>
<item>
<title>Photoshop-Warnung: Einige Namen der zu speichernden Dateien enthalten nichtlateinische Zeichen...</title>
<description><![CDATA[<p>Verwendent man im Photoshop die Funktion "Für Webspeichern...", erscheint folgende Meldung auch dann, wenn der Dateinamen gar keine nicht-lateinischen Zeichen beinhaltet.</p>

<img src="data/files/photoshop-error-non-latin.png" alt="Einige Namen der zu speichernden Dateien enthalten nichtlateinische Zeichen, die mit einigen Web-Browsern und Servern nicht kompatibel sind." /><br />
<em>"Einige Namen der zu speichernden Dateien enthalten nichtlateinische Zeichen, die mit einigen Web-Browsern und Servern nicht kompatibel sind."</em>

<p>Das passiert, weil man wahrscheinliche das Bild in einem <strong>Ordner bzw. Unterordner versucht zu speichern, welche Sonderzeichen enthalten!</strong></p>
]]></description>
<link>http://unckel.de/v6/post.aspx?id=245</link>
<pubDate> / </pubDate>
</item>
<item>
<title>ASP.NET: Tipps zu Server.MapPath</title>
<description><![CDATA[<pre class="brush: c-sharp; gutter: false;">
 currDir = Server.MapPath(".");
 parentDir = Server.MapPath("..");
 rootDir = Server.MapPath("/");
</pre>

<p>Will man Server.MapPath in Klassen verwenden > dann:</p>

<pre class="brush: c-sharp; gutter: false;">
  HttpContext.Current.Server.MapPath();
</pre>

<p>Quellen:<br />
<a href="http://www.devx.com/vb2themax/Tip/18488">http://www.devx.com/vb2themax/Tip/18488</a><br />
<a href="http://glengamoi.com/forums/p/3066/10836.aspx">http://glengamoi.com/forums/p/3066/10836.aspx</a><br />
<a href="http://msdn.microsoft.com/de-de/library/system.web.httpserverutility.mappath(VS.80).aspx">http://msdn.microsoft.com/de-de/library/system.web.httpserverutility.mappath(VS.80).aspx</a></p>
]]></description>
<link>http://unckel.de/v6/post.aspx?id=244</link>
<pubDate> / </pubDate>
</item>
<item>
<title>ASP.NET: Canonical-Link-Tag dynamisch anpassen und einfügen</title>
<description><![CDATA[<p>Doppelte Inhalte mögen Suchmaschinen bekanntermaßen nicht. Doch meistens können Webseiten über <strong>http://domain.de</strong> und <strong>http://www.domain.de</strong> erreicht werden. Für die Suchmaschine sind das zwei unterschiedliche Dinge.</p>

Ein recht einfacher Ansatz mit ASP.NET kann so aussehen:

<pre class="brush: c-sharp; gutter: false;">
// using System.Web.UI.HtmlControls;

HtmlLink canonicalLink = new HtmlLink();
canonicalLink.Attributes["rel"] = "canonical";
canonicalLink.Href = Request.Url.AbsoluteUri.Replace("www.", "");
Page.Header.Controls.Add(canonicalLink);
</pre>

<p>Das ganze kommt dann z.B. in den Event-Handler Page_Load (Master-Datei, Basisklasse, ...). Es wird dann im HTML-Head der Seite das entsprechende Tag erzeugt:<br />
<strong>&lt;link rel="canonical" href="http://domain.de/site.aspx" /&gt;</strong></p>

<p>Über <strong>Request.Url.AbsoluteUri</strong> wird die aktuelle URL samt Host und Parametern ermittelt und per <strong>Replace("www.", "")</strong> einfach, sofern vorhanden, das "www." entfernt. Aber Vorsicht: Alle Fundstellen mit "www." werden entfernt! Also auch etwaige übergebenen Parameter > d.h bei Bedarf nachbessern.</p>

<p>Alternativ kann aber auch per 301-Redirect in der global.asax umgeleitet werden.<br/>Das könnte dann wie folgt aussehen:</p>

<pre class="brush: c-sharp; gutter: false;">
&lt;%@ Application Language="C#" %&gt;
&lt;script runat="server"&gt;
void Application_BeginRequest(object sender, EventArgs e)
{
  string url = HttpContext.Current.Request.Url.ToString().ToLower();
  
  if (!url.StartsWith("http://domain.de"))
  {
    // alle auf .de leiten
    url = url.Replace("domain.net", "domain.de");
    url = url.Replace("domain.com", "domain.de");
  
    // "www." entfernen
    url = url.Replace("http://www.domain", "http://domain");

    // permanente (301) Umleitung
    HttpContext.Current.Response.Status = "301 Moved Permanently";
    HttpContext.Current.Response.AddHeader("Location", url);
  }
}
&lt;/script&gt;
</pre>

<p>Hier wird jeden Anfrage geprüft und ggf. auf die bevorzugte Domain per 301 umgeleitet - sprich das "www." einfach entfernt.</p>
]]></description>
<link>http://unckel.de/v6/post.aspx?id=242</link>
<pubDate> / </pubDate>
</item>
<item>
<title>MS-DOS: Warten-Befehl</title>
<description><![CDATA[<p>Da es unter MS DOS (Windows XP!) leider keinen Befehl wie wait oder sleep gibt und auch <a href="http://forum.chip.de/windows-xp/dos-befehl-choice-xp-904922.html">kein choice mehr</a> in der Standard-Installation vorhanden ist, kann man sich aber mit <a href="http://de.wikipedia.org/wiki/Ping_(Daten%C3%BCbertragung)http://de.wikipedia.org/wiki/Ping_(Daten%C3%BCbertragung)">ping</a> behelfen! Nicht die feine englische Art aber es funktionert.</p>

Das X durch eine Zahl (= Sekunden) ersetzen:
<pre class="brush: plain; gutter: false;">
ping -n X 127.0.0.1>nul
</pre>]]></description>
<link>http://unckel.de/v6/post.aspx?id=240</link>
<pubDate> / </pubDate>
</item>
<item>
<title>ASP.NET: Telefonliste mit Initiale per Repeater auflisten</title>
<description><![CDATA[<p>Hier mal ein Quick 'n' Dirty-Ansatz einer Telefonliste mit Initalen. Wir schreiben einfach eine Methode <span style="font-family: Courier New;">SetInitial</span>, &uuml;bergeben den Nachnamen im Repeater per <span style="font-family: Courier New;">Eval</span> und bekommen eine HTML-Tabellen-Zeile zur&uuml;ck.</p>
<p><img src="data/files/initial.gif" alt="" /></p>

<strong>.aspx</strong>
<pre class="brush: sql; gutter: false;">
&lt;asp:Repeater ID=&quot;Repeater1&quot; runat=&quot;server&quot;&gt;
  &lt;HeaderTemplate&gt;
    &lt;table&gt;
  &lt;/HeaderTemplate&gt;
  &lt;ItemTemplate&gt;
    &lt;%#SetInitial(Eval(&quot;Nachname&quot;).ToString())%&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;a href=&quot;profil.aspx?ID=&lt;%#Eval(&quot;ID&quot;)%&gt;&quot;&gt;
        &lt;%#Eval(&quot;Nachname&quot;)%&gt;, &lt;%#Eval(&quot;Vorname&quot;)%&gt;&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;&lt;%#Eval(&quot;Telefon&quot;)%&gt;&lt;/td&gt;
      &lt;td&gt;&lt;%#Eval(&quot;EMail&quot;)%&gt;&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/ItemTemplate&gt;
  &lt;FooterTemplate&gt;
    &lt;/table&gt;
  &lt;/FooterTemplate&gt;
&lt;/asp:Repeater&gt;
</pre>

<strong>.aspx.cs</strong>
<pre class="brush: sql; gutter: false;">
// C#
private char initialOld;

public string SetInitial(string lastName)
{
  char initial = Convert.ToChar(lastName.Substring(0, 1).ToUpper());

  if (initial == '&#196;') initial = 'A'; // Umlaute werden unter den
  if (initial == '&#220;') initial = 'U'; // dazugeh&#246;rigen Vokaln gelisten
  if (initial == '&#214;') initial = 'O';

  if (initialOld != initial)
  {
    initialOld = initial;
    return string.Format(@&quot;
     &lt;tr&gt;
       &lt;td colspan=&quot;&quot;3&quot;&quot;&gt;
         &lt;span class=&quot;&quot;initial&quot;&quot;&gt;&lt;br/&gt;&amp;nbsp;&lt;br/&gt;{0}&lt;/span&gt;
         &lt;a name=&quot;&quot;i{1}&quot;&quot;&gt;&lt;/a&gt;&lt;span&gt;&lt;a href=&quot;&quot;#top&quot;&quot;&gt;zum Index&lt;/a&gt;&lt;/span&gt;
         &lt;hr /&gt;
       &lt;/td&gt;
     &lt;/tr&gt;&quot;, initial, initial);
  }
  else
  {
    return null;
  }
}
</pre>]]></description>
<link>http://unckel.de/v6/post.aspx?id=239</link>
<pubDate> / </pubDate>
</item>
<item>
<title>C#: Fundstelle eines Suchbegriffs markieren</title>
<description><![CDATA[<p>Hebt den Suchbegriff an der Funstelle hervor, &auml;hnlich den Suchmaschinen. Die Anzahl der Zeichen vor und nach der Fundstelle kann angegeben werden.<br />
<br />
<strong>Beispiel:</strong> Suche nach &quot;nur&quot; im Text &quot;Ich bin nur ein kleiner Text.&quot;<br />
<br />
<strong>Ergebnis </strong>(4 Zeichen vor und nach der Funsstelle): ...bin <b>nur</b> ein...</p>
<pre class="brush: c-sharp; gutter: false;">
// C#
public static string MarkReference(string text, string search, int num)
{
    string referenceText = text.Trim();
    string searchWord = search.Trim();
    string moreLeftTag = &quot;...&quot;, moreRightTag = &quot;...&quot;;
    int searchWordStartPos = 
           referenceText.IndexOf(searchWord, StringComparison.CurrentCultureIgnoreCase);
    if (searchWordStartPos >= 0)
    {
        int referenceTextLength = referenceText.Length;
        int searchWordLength = searchWord.Length;
        int resultLeftLength = num, resultRightLength = num;
        int resultLeftStartPos = searchWordStartPos - resultLeftLength;
        int resultRightStartPos = searchWordStartPos + searchWordLength;

        if (resultLeftStartPos < 0)
        {
            resultLeftLength = resultLeftLength + resultLeftStartPos;
            resultLeftStartPos = 0;
            moreLeftTag = &quot;&quot;;
         }

         if ((resultRightStartPos + resultRightLength) > referenceTextLength)
         {
             resultRightLength = referenceTextLength - resultRightStartPos;
             moreRightTag = &quot;&quot;;
         }

         return String.Format(&quot;{0}{1}<span id="\&quot;highlight\&quot;">{2}</span>{3}{4}&quot;,
                moreLeftTag,
                referenceText.Substring(resultLeftStartPos, resultLeftLength),
                referenceText.Substring(searchWordStartPos, searchWordLength),
                referenceText.Substring(resultRightStartPos, resultRightLength),
                moreRightTag);
    }
    else
    {
        return null; // gibt's nicht...
    }
}
</pre>]]></description>
<link>http://unckel.de/v6/post.aspx?id=237</link>
<pubDate> / </pubDate>
</item>
</channel>
</rss>
