<?xml version="1.0" encoding="utf-8" ?>

<rss version="2.0" 
   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
   xmlns:admin="http://webns.net/mvcb/"
   xmlns:dc="http://purl.org/dc/elements/1.1/"
   xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
   xmlns:wfw="http://wellformedweb.org/CommentAPI/"
   xmlns:content="http://purl.org/rss/1.0/modules/content/"
   >
<channel>
    
    <title>\Stefan\Blog</title>
    <link>http://www.stefanjahn.de/blog/</link>
    <description>Gedanken und andere Abgründe</description>
    <dc:language>de</dc:language>
    <generator>Serendipity 1.5.5 - http://www.s9y.org/</generator>
    <pubDate>Sat, 13 Aug 2011 14:16:22 GMT</pubDate>

    <image>
        <url>http://stefanjahn.de/data/media/blog/avatar.png</url>
        <title>RSS: \Stefan\Blog - Gedanken und andere Abgründe</title>
        <link>http://www.stefanjahn.de/blog/</link>
        <width>70</width>
        <height>100</height>
    </image>

<item>
    <title>FindAll() des DirectorySearcher und mehr als 1000 Objekte</title>
    <link>http://www.stefanjahn.de/blog/eintrag/2011-08-13-FindAll-des-DirectorySearcher-und-mehr-als-1000-Objekte.html</link>
            <category>C-Sharp</category>
    
    <comments>http://www.stefanjahn.de/blog/eintrag/2011-08-13-FindAll-des-DirectorySearcher-und-mehr-als-1000-Objekte.html#comments</comments>
    <wfw:comment>http://www.stefanjahn.de/blog/wfwcomment.php?cid=1123</wfw:comment>

    <slash:comments>0</slash:comments>
    <wfw:commentRss>http://www.stefanjahn.de/blog/rss.php?version=2.0&amp;type=comments&amp;cid=1123</wfw:commentRss>
    

    <author>nospam@example.com (Stefan Jahn)</author>
    <content:encoded>
    	&lt;p&gt;Wer die Methode &lt;code&gt;FindAll()&lt;/code&gt; des &lt;code&gt;DirectorySearcher&lt;/code&gt;-Objektes benutzt hat, wird bestimmt schon, je nach LDAP-Filter, festgestellt haben das nur maximal 1000 gefundene Objekte zurückgeliefert werden. Das liegt daran das in den Einstellungen des &lt;span class=&quot;caps&quot;&gt;ADS&lt;/span&gt; diese Grenze festgelegt ist. In der Standardeinstellung, wenn man nichts auf dem Server geändert hat, steht der Wert auf 1000.&lt;/p&gt;

	&lt;p&gt;Was tun wenn man nun aber mehr als 1000 Objekte abfragen sollte?&lt;/p&gt;

	&lt;p&gt;Schnell fällt der Blick auf die Eigenschaft &lt;code&gt;SizeLimit&lt;/code&gt; des &lt;code&gt;DirectorySearcher&lt;/code&gt;-Objektes. Setzt man diesen Wert aber auf z.B. 2000 so bekommt man dennoch nur 1000 Objekte mit &lt;code&gt;FindAll()&lt;/code&gt; zurückgeliefert. Man kann mit &lt;code&gt;SizeLimit&lt;/code&gt; die Anzahl der Objekte nach unten begrenzen, aber nicht über die Server-Grenze hinausgehen.&lt;/p&gt;

	&lt;p&gt;Die korrekte Lösung findet man in der Eigenschaft &lt;code&gt;PageSize&lt;/code&gt; des &lt;code&gt;DirectorySearcher&lt;/code&gt;-Objektes. Hat man diesen Wert nicht geändert, so steht er auf 0. Dies bedeutet das maximal die besagten 1000 Objekte &amp;#8211; also die Server-Grenze &amp;#8211; abgefragt werden.&lt;/p&gt;

	&lt;p&gt;&lt;code&gt;searcher.PageSize = 2000&lt;/code&gt;&lt;br /&gt;
Erhöht man nun den Wert auf 2000 so wird man feststellen das man immer noch 1000 Objekte mit &lt;code&gt;FindAll()&lt;/code&gt; geliefert bekommt. Eine Erhöhung des Wertes von &lt;code&gt;PageSize&lt;/code&gt; über die Server-Grenze ist nicht möglich bzw. erlaubt. Der &lt;span class=&quot;caps&quot;&gt;ADS&lt;/span&gt; ignoriert den Wert dann einfach.&lt;/p&gt;

	&lt;p&gt;&lt;code&gt;searcher.PageSize = 1000&lt;/code&gt;&lt;br /&gt;
Setzt man den Wert auf 1000, also auf die Grenze die im &lt;span class=&quot;caps&quot;&gt;ADS&lt;/span&gt; eingestellt ist, so erhält man mit &lt;code&gt;FindAll()&lt;/code&gt; auch mehr als 1000 Objekte. Die Abfrage erfolgt nun Seitenweise im Hintergrund an die &lt;span class=&quot;caps&quot;&gt;ADS&lt;/span&gt;. Hat man &lt;code&gt;PageSize&lt;/code&gt; gesetzt, so sollte man das &lt;code&gt;DirectorySearcher&lt;/code&gt;-Objekt via &lt;code&gt;Dispose()&lt;/code&gt; nach der Benutzung aufräumen.&lt;/p&gt;

&lt;pre&gt;try {
    searcher = new DirectorySearcher();
    searcher.PageSize = 1000;

    // Weitere Einstellungen für searcher

    results = searcher.FindAll();

    // Ergebnis bearbeiten
} catch {
    throw;
}
finally {
    if (searcher != null) searcher.Dispose();
    if (results != null) results.Dispose();
}
 
&lt;/pre&gt; 
    </content:encoded>

    <pubDate>Sat, 13 Aug 2011 16:16:22 +0200</pubDate>
    <guid isPermaLink="false">http://www.stefanjahn.de/blog/eintrag/2011-08-13-1123.html</guid>
    <category>ADS</category>

</item>
<item>
    <title>Roboter selber bauen</title>
    <link>http://www.stefanjahn.de/blog/eintrag/2011-07-27-Roboter-selber-bauen.html</link>
            <category>Mikrocontroller</category>
    
    <comments>http://www.stefanjahn.de/blog/eintrag/2011-07-27-Roboter-selber-bauen.html#comments</comments>
    <wfw:comment>http://www.stefanjahn.de/blog/wfwcomment.php?cid=1122</wfw:comment>

    <slash:comments>0</slash:comments>
    <wfw:commentRss>http://www.stefanjahn.de/blog/rss.php?version=2.0&amp;type=comments&amp;cid=1122</wfw:commentRss>
    

    <author>nospam@example.com (Stefan Jahn)</author>
    <content:encoded>
    	&lt;p&gt;Seit kurzem hab ich einen kleinen Roboter zum Experimentieren von Franzi hier. Der Roboter selber besteht aus einem Mikrocontroller, zwei Servos für den Antrieb, Liniensensor und einen USB-Anschluß. Einen Mikrokontroller zu programmieren &amp;#8211; speziell einen Roboter &amp;#8211; hat mich schon immer fasziniert.&lt;/p&gt;

	&lt;p&gt;&lt;!-- s9ymdb:94 --&gt;&lt;img class=&quot;serendipity_image_center&quot; width=&quot;600&quot; height=&quot;510&quot;  src=&quot;http://www.stefanjahn.de/blog/../data/media/blog/20110727_roboter.jpg&quot;  alt=&quot;&quot; /&gt;&lt;/p&gt;

	&lt;p&gt;Die Hardware und Tools kann man seperat erwerben, komplett oder zum selber bauen. Wer es am Anfang leicht haben will kann auch alles zusammen im &amp;#8220;Lernpaket Roboter selbst bauen&amp;#8221; von &lt;a href=&quot;http://www.franzis.de/&quot;&gt;Franzis&lt;/a&gt; erwerben.&lt;/p&gt;

	&lt;p&gt;Der Roboter enthält zum Glück einen USB-Chip, so das er über eine normale USB-Verbindung mit dem PC programmiert werden kann. Nach dem Anschliessen an den PC installiert Windows kurz einen Treiber und schon meldet sich der Roboter als &amp;#8220;&lt;span class=&quot;caps&quot;&gt;USB&lt;/span&gt; Serial Port&amp;#8221;. Mit dem Programm &amp;#8220;MProg &amp;#8211; Multi-Device &lt;span class=&quot;caps&quot;&gt;EEPROM&lt;/span&gt; Programmer&amp;#8221; erkennt dann auch anstandslos den Mikrocontroller.&lt;/p&gt;

	&lt;p&gt;Der Mikrocontroller &amp;#8211; ein ATmega88, gehört zur &lt;a href=&quot;http://de.wikipedia.org/wiki/Atmel_AVR&quot;&gt;AVR-Controllerfamilie&lt;/a&gt; &amp;#8211; wird für Lernzwecke mit &lt;span class=&quot;caps&quot;&gt;BASIC&lt;/span&gt; programmiert. Dazu liegt dem Paket der Compiler &lt;span class=&quot;caps&quot;&gt;BASCOM-AVR&lt;/span&gt; bei. Die Installation ist schnell erledigt.&lt;/p&gt;

	&lt;p&gt;Und jetzt fangen leider die Probleme an. Ich benutze Windows 7 64Bit. Das Programm &lt;span class=&quot;caps&quot;&gt;BASCOM&lt;/span&gt; lässt sich leider nicht starten. Egal ob als Administrator oder normaler Benutzer. Das Programm stürzt immer wieder mit einer Ausnahmeverletzung ab. Das nächste was mich stutzig macht ist, das ich nur eine Demo-Version habe. Die Demo-Version kann nur Programme bis 4 KB kompilieren. Das soll mich aber erst mal nicht stören, der Absturz ist viel ärgerlicher. Wie man es so oft kennt sind mitgelieferte Programme auf CD ja meistens veraltet. Laut Handbuch kann man eine neue Version &amp;#8211; falls denn vorhanden &amp;#8211; bei &lt;a href=&quot;http://mcselec.com&quot;&gt;&lt;span class=&quot;caps&quot;&gt;MCS&lt;/span&gt; Electronics&lt;/a&gt; runterladen. Dort hab ich dann auch die aktuelle Demo-Version gefunden. Aber selbst die Installation dieses neuen Version brachte keine Besserung. &lt;span class=&quot;caps&quot;&gt;BASCOM&lt;/span&gt; läuft hier nicht auf Windows 7.&lt;/p&gt;

	&lt;p&gt;Jetzt war ich doch schon etwas verärgert, was will ich mit dem Roboter wenn ich ihn nicht programmieren kann? Kurze Suche im Forum brachte mich nicht groß weiter &amp;#8211; einige andere Leute hatten ähnliche Probleme mit Windows 7. Anscheinend gab es aber noch keine Fehlerbehebung. Im Forum bin ich dann aber auf den Hinweis auf das Programm &lt;a href=&quot;http://www.mikrocontroller.net/articles/AVR-Studio&quot;&gt;AVR-Studio&lt;/a&gt; gestoßen. AVR-Studio ist eine &lt;span class=&quot;caps&quot;&gt;IDE&lt;/span&gt; für die AVR-Mikrocontroller. Netter Nebeneffekt dieser Software &amp;#8211; sie ist frei verfügbar und kostet somit nichts, also auch keine Begrenzung auf die 4 KB wie bei &lt;span class=&quot;caps&quot;&gt;BASCOM&lt;/span&gt;. Bei der Firma &lt;a href=&quot;www.atmel.com/avrstudio&quot;&gt;Atmel&lt;/a&gt; kann man AVR-Studio runterladen. Leider ist eine Registrierung erforderlich. Bei &lt;a href=&quot;http://www.mikrocontroller.net&quot;&gt;Mikrocontroller.net&lt;/a&gt; findet man aber diverse &lt;a href=&quot;http://www.mikrocontroller.net/articles/AVR-Studio&quot;&gt;Links für den direkten Download&lt;/a&gt;.&lt;/p&gt;

	&lt;p&gt;Wie man den Informationen von Mikrokontroller.net entnehmen kann ist die Programmierung mit AVR-Studio nur mit Assembler-Code möglich. Assembler? Nein, das ist etwas was ich mir bestimmt nicht mehr antun will. Zum Glück kann man den Controller mit AVR-Studio auch in C programmieren. &lt;del&gt;Man muß davor einfach den &lt;span class=&quot;caps&quot;&gt;GNU&lt;/span&gt; &lt;span class=&quot;caps&quot;&gt;GCC&lt;/span&gt; Compiler für C und C++ für &lt;span class=&quot;caps&quot;&gt;AVR&lt;/span&gt;, kurz &lt;a href=&quot;http://winavr.sourceforge.net/&quot;&gt;WinAVR&lt;/a&gt;, installieren. Wie bei &lt;span class=&quot;caps&quot;&gt;GNU&lt;/span&gt; Compilern üblich ist unbedingt darauf zu achten das das Programmverzeichnis, in dem die Installation erfolgen soll, keine Leerzeichen enthalten soll. Am einfachsten ist es WinAVR in &lt;code&gt;C:\WINAVR&lt;/code&gt; zu installieren. Das Installationsprogramm passt auch automatisch die Umgebungsvariabel &lt;code&gt;PATH&lt;/code&gt; an. Somit kann man einfach auf der Kommandozeile die Conmpilertools, z.B. &lt;code&gt;avr-gcc&lt;/code&gt;, ohne Umwege direkt nutzen.&lt;/del&gt;&lt;/p&gt;

	&lt;p&gt;&lt;del&gt;Hat man WinAVR installiert, so kann nun &lt;span class=&quot;caps&quot;&gt;AVR&lt;/span&gt; Studio installiert werden.&lt;/del&gt; Das Programm AVR-Studio ist ziemlich groß, das Installationspaket umfasst alleine schon 602 MB. Damit AVR-Studio läuft muß bestimmte Software auf dem PC vorhanden sein. Während der Installation wird dies geprüft und ggf. werden die nötigen Tools, z.B. Microsoft Visual Studio 2010 Shell (isoliert) oder &lt;span class=&quot;caps&quot;&gt;AVR&lt;/span&gt; Jungo &lt;span class=&quot;caps&quot;&gt;USB&lt;/span&gt;, vorher installiert.&lt;/p&gt;

	&lt;p&gt;Nun habe ich also AVR-Studio auf meinem PC installiert. Sieht auf den ersten Blick aus wie Microsoft Visual Studio. Mein Experimentierhandbuch enthält aber viele Beispiele für &lt;span class=&quot;caps&quot;&gt;BASCOM&lt;/span&gt; &amp;#8211; also in &lt;a href=&quot;http://de.wikipedia.org/wiki/BASIC&quot;&gt;BASIC&lt;/a&gt; (eine moderne Form davon) geschrieben &amp;#8211; und AVR-Studio nutzt die Programmiersprache &lt;a href=&quot;http://de.wikipedia.org/wiki/C_(Programmiersprache&quot;&gt;C&lt;/a&gt;). Das könnte noch lustig werden die Beispiele von &lt;span class=&quot;caps&quot;&gt;BASIC&lt;/span&gt; nach C zu übersetzen. Mal ganz davon abgesehen das ich nun herausfinde wieviel von dem Wissen meiner Ausbildung über Elektronik noch vorhanden ist. Die Schaltpläne mit Dioden, Widerständen, Kondensatoren, ... im Experimentierhandbuch sehen nicht ganz einfach aus. Mal schauen was die nächste Zeit so bringt.      &lt;/p&gt;

	&lt;p&gt;&lt;strong&gt;Update:&lt;/strong&gt; Mittlerweile habe ich &lt;span class=&quot;caps&quot;&gt;BASCOM&lt;/span&gt; doch noch &amp;#8211; wenn auch nur durch einen Zufall &amp;#8211; zum Laufen bekommen. Windows habe ich vorhin ja schon mal neu gestartet, was ja den Fehler nicht behoben hat. Auch der Versuch &lt;span class=&quot;caps&quot;&gt;BASCOM&lt;/span&gt; mit Admin-Rechte laufen zu lassen schlug fehl. Wenn man sich aber als Administrator bei Windows anmeldet, so werden beim Login-Vorgang mehrere Bibliotheken am System registriert. Dies hat zur Folge das man danach &lt;span class=&quot;caps&quot;&gt;BASCOM&lt;/span&gt; &amp;#8211; auch als normaler Benutzer &amp;#8211; ohne Probleme starten kann. Nun, so habe ich jetzt beide IDEs installiert. Eine &amp;#8211; mit Einschränkung der Programmgröße &amp;#8211; für &lt;span class=&quot;caps&quot;&gt;BASIC&lt;/span&gt; und die andere für die Programmiersprache C. Für die ersten Experimente &amp;#8211; da sie ja auch so im Experimentierhandbuch beschrieben sind &amp;#8211; werde ich wohl &lt;span class=&quot;caps&quot;&gt;BASIC&lt;/span&gt; vorziehen.&lt;/p&gt;

	&lt;p&gt;&lt;strong&gt;Update:&lt;/strong&gt; Bei der aktuellen Version AVR-Studio 5 muß WinAVR nicht mehr installiert werden. Bei der Installation von AVR-Studio wird der entsprechende C-Compiler (im Installationsprogramm als Toolchain gelistet) mitinstalliert. &lt;/p&gt; 
    </content:encoded>

    <pubDate>Wed, 27 Jul 2011 21:09:45 +0200</pubDate>
    <guid isPermaLink="false">http://www.stefanjahn.de/blog/eintrag/2011-07-27-1122.html</guid>
    <category>roboter</category>

</item>
<item>
    <title>Dateinamen von JPEG-Fotos um Zeitangabe ergänzen</title>
    <link>http://www.stefanjahn.de/blog/eintrag/2011-07-20-Dateinamen-von-JPEG-Fotos-um-Zeitangabe-ergaenzen.html</link>
            <category>Fotografie</category>
            <category>Scripte</category>
    
    <comments>http://www.stefanjahn.de/blog/eintrag/2011-07-20-Dateinamen-von-JPEG-Fotos-um-Zeitangabe-ergaenzen.html#comments</comments>
    <wfw:comment>http://www.stefanjahn.de/blog/wfwcomment.php?cid=1121</wfw:comment>

    <slash:comments>0</slash:comments>
    <wfw:commentRss>http://www.stefanjahn.de/blog/rss.php?version=2.0&amp;type=comments&amp;cid=1121</wfw:commentRss>
    

    <author>nospam@example.com (Stefan Jahn)</author>
    <content:encoded>
    	&lt;p&gt;Ein aufregender Tag oder Aktion und man hat viele Fotos mit seiner Digitalkamera gemacht. Wohlmöglich überspielt man die Fotos nicht sofort auf den PC, und so sammeln sich nach und nach immer mehr Fotos auf der Speicherkarte. Man hat dann viele Dateien mit folgendem Schema &amp;#8211; oder ähnlichem, je nach Digitalkamera &amp;#8211; auf der Speicherkarte:&lt;/p&gt;

	&lt;ul&gt;
		&lt;li&gt;IMG_0001.&lt;span class=&quot;caps&quot;&gt;JPG&lt;/span&gt;&lt;/li&gt;
		&lt;li&gt;IMG_0002.&lt;span class=&quot;caps&quot;&gt;JPG&lt;/span&gt;&lt;/li&gt;
		&lt;li&gt;IMG_0003.&lt;span class=&quot;caps&quot;&gt;JPG&lt;/span&gt;&lt;/li&gt;
		&lt;li&gt;IMG_0004.&lt;span class=&quot;caps&quot;&gt;JPG&lt;/span&gt;&lt;/li&gt;
		&lt;li&gt;IMG_0005.&lt;span class=&quot;caps&quot;&gt;JPG&lt;/span&gt;&lt;/li&gt;
		&lt;li&gt;...&lt;/li&gt;
	&lt;/ul&gt;

	&lt;p&gt;Mit diesen Dateinamen lässt sich später nur schwer zuordnen welches Foto von welcher Aktion ist. Erst recht dann wenn man mehrmals eine Datei mit identischem Namen in verschiedenen Verzeichnissen hat. Die Fotos sollten sortiert werden. Ich selber bevorzuge bei meinen Dateinamen folgendes Schema:&lt;/p&gt;

	&lt;ul&gt;
		&lt;li&gt;&lt;strong&gt;Schema:&lt;/strong&gt; [Jahr][Monat][Tag]_[Stunde][Minute]_[Name des Fotos]_[Nummerierung].jpg&lt;/li&gt;
		&lt;li&gt;&lt;strong&gt;Beispiel:&lt;/strong&gt; 20100703_16h56m_wanderung_bernau_001.jpg&lt;/li&gt;
	&lt;/ul&gt;

	&lt;p&gt;Mit diesem Schema hab ich immer sofort im Blick wann das Foto gemacht worden ist und um welche Aktion/Thema es sich handelt.&lt;/p&gt;

	&lt;p&gt;Die entsprechenden Zeitangaben sollen dabei direkt aus den &lt;a href=&quot;http://de.wikipedia.org/wiki/Exif&quot;&gt;EXIF-Daten&lt;/a&gt; des Fotos übernommen werden. Somit ist also vor dem Fotografieren zu achten, das das Datum/Uhrzeit der Digitalkamera korrekt eingestellt ist.&lt;/p&gt;

	&lt;p&gt;Wie aber die Fotos nun entsprechend so umbenennen? Alle Dateinamen von Hand umbenennen ist zu aufwendig. Mit einem entsprechenden Fotobetrachter, z.B. &lt;a href=&quot;http://free.zoner.com&quot;&gt;Zoner Photo Studio&lt;/a&gt;, kann man alle Dateien gleichzeitig mit entsprechenden Vorgaben umbenennen. Dies funktioniert recht gut, hat aber den Nachteil das man &amp;#8211; wenn man erneut Fotos auf den PC überspielt &amp;#8211; wieder von Neuem die entsprechenden Vorgaben machen muß.&lt;/p&gt;

	&lt;p&gt;Will man es schneller machen und immer wieder das gleiche Schema bei den Dateinamen benutzen, so kann man das Tool &lt;a href=&quot;http://www.sentex.net/~mwandel/jhead/&quot;&gt;jhead&lt;/a&gt; auf der Kommandozeile benutzen:&lt;/p&gt;

	&lt;p&gt;&lt;code&gt;jhead -nf[Formatstring] *.jpg&lt;/code&gt; (oder entsprechender Filter)&lt;/p&gt;

	&lt;p&gt;Als Formatstring kann man alle Angaben machen die die Funktion &lt;a href=&quot;http://php.net/manual/de/function.strftime.php&quot;&gt;strftime&lt;/a&gt; unterstützt. Folgende Möglichkeiten (Auszug) stehen zur Verfügung:&lt;/p&gt;

	&lt;ul&gt;
		&lt;li&gt;&lt;code&gt;%a&lt;/code&gt; &amp;#8211; abgekürzter Name des Wochentages&lt;/li&gt;
		&lt;li&gt;&lt;code&gt;%A&lt;/code&gt; &amp;#8211; ausgeschriebener Name des Wochentages&lt;/li&gt;
		&lt;li&gt;&lt;code&gt;%b&lt;/code&gt; &amp;#8211; abgekürzter Name des Monats&lt;/li&gt;
		&lt;li&gt;&lt;code&gt;%B&lt;/code&gt; &amp;#8211; ausgeschriebener Name des Monats&lt;/li&gt;
		&lt;li&gt;&lt;code&gt;%c&lt;/code&gt; &amp;#8211; Wiedergabewerte für Datum und Zeit&lt;/li&gt;
		&lt;li&gt;&lt;code&gt;%C&lt;/code&gt; &amp;#8211; Jahrhundert (Jahr geteilt durch 100, gekürzt auf Integer, Wertebereich 00 bis 99)&lt;/li&gt;
		&lt;li&gt;&lt;code&gt;%d&lt;/code&gt; &amp;#8211; Tag des Monats als Zahl (Bereich 01 bis 31)&lt;/li&gt;
		&lt;li&gt;&lt;code&gt;%H&lt;/code&gt; &amp;#8211; Stunde als Zahl im 24-Stunden-Format (Bereich 00 bis 23)&lt;/li&gt;
		&lt;li&gt;&lt;code&gt;%I&lt;/code&gt; &amp;#8211; Stunde als Zahl im 12-Stunden-Format (Bereich 01 bis 12)&lt;/li&gt;
		&lt;li&gt;&lt;code&gt;%j&lt;/code&gt; &amp;#8211; Tag des Jahres als Zahl (Bereich 001 bis 366)&lt;/li&gt;
		&lt;li&gt;&lt;code&gt;%m&lt;/code&gt; &amp;#8211; Monat als Zahl (Bereich 01 bis 12)&lt;/li&gt;
		&lt;li&gt;&lt;code&gt;%M&lt;/code&gt; &amp;#8211; Minute als Dezimal-Wert&lt;/li&gt;
		&lt;li&gt;&lt;code&gt;%R&lt;/code&gt; &amp;#8211; Zeit in der 24-Stunden-Formatierung&lt;/li&gt;
		&lt;li&gt;&lt;code&gt;%S&lt;/code&gt; &amp;#8211; Sekunden als Dezimal-Wert&lt;/li&gt;
		&lt;li&gt;&lt;code&gt;%T&lt;/code&gt; &amp;#8211; aktuelle Zeit, genau wie %H:%M:%S&lt;/li&gt;
		&lt;li&gt;&lt;code&gt;%y&lt;/code&gt; &amp;#8211; Jahr als 2-stellige-Zahl (Bereich 00 bis 99)&lt;/li&gt;
		&lt;li&gt;&lt;code&gt;%Y&lt;/code&gt; &amp;#8211; Jahr als 4-stellige-Zahl inklusive des Jahrhunderts&lt;/li&gt;
	&lt;/ul&gt;

	&lt;p&gt;&lt;code&gt;jhead&lt;/code&gt; selber stellt noch folgende eigene Platzhalter zur Verfügung:&lt;/p&gt;

	&lt;ul&gt;
		&lt;li&gt;&lt;code&gt;%i&lt;/code&gt; &amp;#8211; Fortlaufende Nummerierung. Will man führende Nullen vor der Nummerierung haben, so muß man die Anzahl der Stellen angeben. Für &amp;#8220;001&amp;#8221;, also 3 Stellen, benutzt man &lt;code&gt;%03i&lt;/code&gt;.&lt;/li&gt;
		&lt;li&gt;&lt;code&gt;%f&lt;/code&gt; &amp;#8211; Ursprünglicher Dateiname&lt;/li&gt;
	&lt;/ul&gt;

	&lt;p&gt;Will man die Fotos nun nach dem Oben genannten Schema umbenennen, so benutz man folgenden Befehl:&lt;/p&gt;

	&lt;p&gt;&lt;code&gt;jhead -nf%Y%m%d_%Hh%Mm_wanderung_bernau_%03i *.jpg&lt;/code&gt;&lt;/p&gt;

	&lt;p&gt;Man erhält dann folgendes Ergebnis:&lt;/p&gt;

	&lt;ul&gt;
		&lt;li&gt;20100703_16h56m_wanderung_in_bernau_001.jpg&lt;/li&gt;
		&lt;li&gt;20100703_16h56m_wanderung_in_bernau_002.jpg&lt;/li&gt;
		&lt;li&gt;20100703_16h57m_wanderung_in_bernau_003.jpg&lt;/li&gt;
		&lt;li&gt;20100703_16h58m_wanderung_in_bernau_004.jpg&lt;/li&gt;
		&lt;li&gt;20100703_16h58m_wanderung_in_bernau_005.jpg&lt;/li&gt;
		&lt;li&gt;...&lt;/li&gt;
	&lt;/ul&gt;

	&lt;p&gt;&lt;strong&gt;Hinweis:&lt;/strong&gt; Aus Sicherheitsgründen (verschiedene Betriebssysteme) und der Einfachheitshalber sollten keine Leerstellen und Sonderzeichen im Dateinamen benutzt werden.&lt;/p&gt;

	&lt;p&gt;Gehören nicht alle Fotos im Verzeichnis zum gleichen Thema (Wanderung in Bernau), so muß man natürlich die Fotos vorher auf verschiedene Verzeichnisse aufteilen. Im selben Vorgang löscht man am besten auch noch alle Fotos die man nicht haben will, z.B. weil sie Unscharf sind. Dadurch ist sichergestellt das man später auch eine fortlaufende Nummerierung ohne Lücken hat. Natürlich kann man den Befehl nach Löschvorgängen immer wieder erneut anwenden.&lt;/p&gt;

	&lt;p&gt;Soweit so gut. Die Fotos haben nun den entsprechenden Dateinamen. Wer Lust hat kann auch gleich noch das Dateidatum/-Uhrzeit auf die ausgelesenen Werte setzen. Dies geschieht mit folgendem Befehl:&lt;/p&gt;

	&lt;p&gt;&lt;code&gt;jhead -ft *.jpg&lt;/code&gt;&lt;/p&gt;

	&lt;p&gt;Wenn man sich die Befehle nicht merken kann oder nicht immer wieder erneut eingeben will, so kann man auch ein kleines Script schreiben. Hier mein Script dafür:&lt;/p&gt;

	&lt;p&gt;&lt;strong&gt;Script:&lt;/strong&gt; &lt;code&gt;photo_rename.cmd&lt;/code&gt;&lt;/p&gt;

&lt;pre&gt;@echo off

if &amp;#34;%1&amp;#34;==&amp;#34;&amp;#34; goto KeinParameter

jhead -nf%%Y%%m%%d_%%Hh%%Mm_%1_%%03i *.jpg
jhead -ft *.jpg

goto Ende

:KeinParameter
echo Fehler   : Kein Parameter angegeben.
echo Benutzung: photo_rename [Titel]
goto Ende

:Ende
 
&lt;/pre&gt; 
    </content:encoded>

    <pubDate>Wed, 20 Jul 2011 20:53:41 +0200</pubDate>
    <guid isPermaLink="false">http://www.stefanjahn.de/blog/eintrag/2011-07-20-1121.html</guid>
    <category>EXIF</category>
<category>jhead</category>
<category>Kommandozeile</category>

</item>
<item>
    <title>JPEG-Fotos via Kommandozeile drehen</title>
    <link>http://www.stefanjahn.de/blog/eintrag/2011-07-19-JPEG-Fotos-via-Kommandozeile-drehen.html</link>
            <category>Fotografie</category>
            <category>Scripte</category>
    
    <comments>http://www.stefanjahn.de/blog/eintrag/2011-07-19-JPEG-Fotos-via-Kommandozeile-drehen.html#comments</comments>
    <wfw:comment>http://www.stefanjahn.de/blog/wfwcomment.php?cid=1120</wfw:comment>

    <slash:comments>0</slash:comments>
    <wfw:commentRss>http://www.stefanjahn.de/blog/rss.php?version=2.0&amp;type=comments&amp;cid=1120</wfw:commentRss>
    

    <author>nospam@example.com (Stefan Jahn)</author>
    <content:encoded>
    	&lt;p&gt;Man kennt das Übel: man macht mit seiner Digitalkamera viele schöne Fotos, mal Hochformat, mal Querformat. Und dann, wenn man die Fotos am PC anschauen will ist ein Teil der Fotos &amp;#8211; meistens die im Hochformat &amp;#8211; verkehrtherum. Zu allen Überdruss zeigen manche Programme die Fotos korrekt an und andere wiederum nicht.&lt;/p&gt;

	&lt;p&gt;Wenn man eine gute Digitalkamera hat speichert diese die Orientierung/Ausrichtung des Fotos direkt in die JPEG-Datei. Die Orientierung/Ausrichtung ist eine von vielen Infos die man in den &lt;a href=&quot;http://de.wikipedia.org/wiki/Exif&quot;&gt;EXIF-Daten&lt;/a&gt; des Fotos findet. So kann man hier z.B. auch nachschauen wie das Foto belichtet worden ist oder was für eine Brennweite man benutzt hat. Die meisten Digitalkameras auf dem Markt unterstützen mittlerweile diesen Standard.&lt;/p&gt;

	&lt;p&gt;Je nach Programm was man für die Anzeige der Fotos auf dem PC benutzt wird die Info der Orientierung/Ausrichtung ausgewertet und somit das Foto korrekt dargestellt. Leider machen dies nicht alle Programme und so kann es von Vorteil sein wenn man alle Fotos korrekt dreht. Dies kann man auf verschiedene Arten durchführen:&lt;/p&gt;

	&lt;ul&gt;
		&lt;li&gt;&lt;strong&gt;Von Hand, einzelnd:&lt;/strong&gt; Man schaut sich jedes Foto einzelnd in der Vorschau unter Windows an und dreht das Foto entsprechend.&lt;/li&gt;
		&lt;li&gt;&lt;strong&gt;Von Hand, mehrere:&lt;/strong&gt; Man benutzt einen beliebigen Fotobetrachter, z.B. &lt;a href=&quot;http://www.xnview.com/de/&quot;&gt;XnView&lt;/a&gt; oder &lt;a href=&quot;http://free.zoner.com/&quot;&gt;Zoner Photo Studio&lt;/a&gt;, und markiert in der Übersicht alle entsprechenden Fotos. Diese kann man dann mit einem Klick nach rechts oder links drehen.&lt;/li&gt;
		&lt;li&gt;&lt;strong&gt;Automatisches Drehen, mit GUI:&lt;/strong&gt; Diverse Fotobetrachter, z.B. &lt;a href=&quot;http://www.xnview.com/de/&quot;&gt;XnView&lt;/a&gt;, können auch alle Fotos automatisch drehen. Unter XnView findet man diese Funktion unter dem Menüpunkt &lt;code&gt;Werkzeug / Stapelverarbeitung&lt;/code&gt;. Hier kann man dann die Option &lt;code&gt;Bild / Verlustfreies Drehen&lt;/code&gt; benutzen.&lt;/li&gt;
	&lt;/ul&gt;

	&lt;p&gt;Ich selber drehe aber alle Fotos automatisch mit Hilfe des kleinen, mächtigen Tools &lt;a href=&quot;http://www.sentex.net/~mwandel/jhead/&quot;&gt;jhead&lt;/a&gt; auf der Kommandozeile:
	&lt;ol&gt;
		&lt;li&gt;Eingabeaufforderung starten.&lt;/li&gt;
		&lt;li&gt;In das entsprechende Verzeichnis der Fotos wechseln.&lt;/li&gt;
		&lt;li&gt;Alle Fotos automatisch drehen mit: &lt;code&gt;jhead -autorot *.jpg&lt;/code&gt; (oder entsprechender Filter)&lt;/li&gt;
	&lt;/ol&gt;&lt;/p&gt;

	&lt;p&gt;Diese Variante geht ziemlich schnell. &lt;code&gt;jhead&lt;/code&gt; kann noch wesentlich mehr &amp;#8230; aber darüber ein andern mal.&lt;/p&gt;

	&lt;p&gt;&lt;strong&gt;Hinweis:&lt;/strong&gt; Das Tool &lt;code&gt;jhead&lt;/code&gt; benötigt zusätzlich das Kommandozeilentool &lt;a href=&quot;http://jpegclub.org/jpegtran/&quot;&gt;jpegtran&lt;/a&gt;. &lt;/p&gt; 
    </content:encoded>

    <pubDate>Tue, 19 Jul 2011 16:55:57 +0200</pubDate>
    <guid isPermaLink="false">http://www.stefanjahn.de/blog/eintrag/2011-07-19-1120.html</guid>
    <category>EXIF</category>
<category>jhead</category>
<category>Kommandozeile</category>

</item>
<item>
    <title>Rock-Shandy - Durstlöscher für die heißen Tage</title>
    <link>http://www.stefanjahn.de/blog/eintrag/2011-07-12-Rock-Shandy-Durstloescher-fuer-die-heissen-Tage.html</link>
            <category>Allgemeines</category>
    
    <comments>http://www.stefanjahn.de/blog/eintrag/2011-07-12-Rock-Shandy-Durstloescher-fuer-die-heissen-Tage.html#comments</comments>
    <wfw:comment>http://www.stefanjahn.de/blog/wfwcomment.php?cid=1118</wfw:comment>

    <slash:comments>0</slash:comments>
    <wfw:commentRss>http://www.stefanjahn.de/blog/rss.php?version=2.0&amp;type=comments&amp;cid=1118</wfw:commentRss>
    

    <author>nospam@example.com (Stefan Jahn)</author>
    <content:encoded>
    	&lt;p&gt;Bei meiner Reise in Namibia haben wir bei dem heißen Wetter immer wieder mal einen Rock-Shandy getrunken. Dies ist ein erfrischender, leicht bitter schmeckender, Durstlöscher den ich so nur aus Namibia kenne. Er lässt sich relativ leicht zubereiten und schmeckt &amp;#8211; jetzt bei diesen Temperaturen draußen &amp;#8211; auch hier immer noch sehr gut.&lt;/p&gt;

	&lt;p&gt;Ihr benötigt ein großes Glas &amp;#8211; z.B. ein Weizenglas &amp;#8211; und füllt dies mit 1/2 Sprite und 1/2 Mineralwasser (mit Kohlensäure). Nun rundet ihr das Ganze ab in dem ihr ein paar Spritzer Angostura (ein Bitterlikör) hinzugibt. Der obere Teil des Getränkes müsste sich nun rot verfärben. Je nach eigenem Geschmack mehr oder weniger Angostura hinzugeben. Nun noch eins, zwei Eiswürfel rein und fertig ist der Durstlöscher.&lt;/p&gt;

	&lt;p&gt;Genießt es. &lt;/p&gt; 
    </content:encoded>

    <pubDate>Tue, 12 Jul 2011 21:27:02 +0200</pubDate>
    <guid isPermaLink="false">http://www.stefanjahn.de/blog/eintrag/2011-07-12-1118.html</guid>
    <category>Getränk</category>
<category>Rezept</category>

</item>
<item>
    <title>Alle E-Mails via POP3 löschen</title>
    <link>http://www.stefanjahn.de/blog/eintrag/2011-07-12-Alle-E-Mails-via-POP3-loeschen.html</link>
            <category>Perl</category>
    
    <comments>http://www.stefanjahn.de/blog/eintrag/2011-07-12-Alle-E-Mails-via-POP3-loeschen.html#comments</comments>
    <wfw:comment>http://www.stefanjahn.de/blog/wfwcomment.php?cid=1117</wfw:comment>

    <slash:comments>0</slash:comments>
    <wfw:commentRss>http://www.stefanjahn.de/blog/rss.php?version=2.0&amp;type=comments&amp;cid=1117</wfw:commentRss>
    

    <author>nospam@example.com (Stefan Jahn)</author>
    <content:encoded>
    	&lt;p&gt;Mittlerweile hat wohl jeder im Internet eine E-Mail-Adresse. Der klassische Weg auf die E-Mails zuzugreifen ist mit Hilfe eines E-Mails-Clients und den Protokollen POP3 oder gar, was noch besser ist, &lt;span class=&quot;caps&quot;&gt;IMAP&lt;/span&gt;. Die meisten Leute werden aber nur die Weboberfläche ihres E-Mail-Providers kennen.&lt;/p&gt;

	&lt;p&gt;Diese Weboberflächen sind mehr oder weniger gut gemacht. Manche sind von der Funktionalität echt super durchdacht, andere aber leider mehr als mangelhaft. Wer eine E-Mail-Adresse hat kennt auch das leidige Problem mit &lt;span class=&quot;caps&quot;&gt;SPAM&lt;/span&gt;, unerwünschter E-Mail. Bei den meisten Providern enthält der E-Mail-Service auch einen SPAM-Filter.&lt;/p&gt;

	&lt;p&gt;Es gibt aber noch Provider wo das nicht der Fall ist. Oder man hat vergessen diesen anzuschalten. Wenn man jetzt längere Zeit nicht in das Postfach schaut können sich da gerne hunderte bis tausende von Mails ansammeln. Diese nun über die Weboberfläche zu löschen ist nicht immer komfortabel bzw. lässt sich schnell erledigen.&lt;/p&gt;

	&lt;p&gt;So hatte ich letztens den Fall das ich über 5000 Mails im Postfach eines Webmaster-Accounts löschen musste. Die Weboberfläche lies immer nur das Löschen von 20 Mails zu. Mal ganz davon abgesehen das zwischen jedem Aufruf der Löschfunktion etliche Sekunden verstrichen sind &amp;#8211; sprich, die Weboberfläche vom Provider war quälend langsam.&lt;/p&gt;

	&lt;p&gt;Wie nun am einfachsten alle E-Mails löschen? Ich könnte natürlich meinen E-Mail-Client einrichten das er die E-Mails abholt und gleich via POP3 löscht. Das bedeutet aber das ich alle E-Mails zuerst runterladen müsste. Dies ist aber unerwünscht. Ich entschied mich für folgendes kleines Perl-Script das alle E-Mails im Postfach direkt via POP3 löscht:&lt;/p&gt;

&lt;pre&gt;#!/usr/bin/perl
use Net::POP3;

print &amp;#34;Loesche alle E-Mails vom POP3-Server...\n&amp;#34;;

$server   = &amp;#34;pop3.example.com&amp;#34;;             # POP3-Server
$user     = &amp;#34;peter.mustermann;example.com&amp;#34;; # Benutzername
$password = &amp;#34;geheim&amp;#34;;                       # Passwort

$pop = Net::POP3-&amp;#62;new($server);
die &amp;#34;FEHLER: Kann keine Verbindung herstellen!&amp;#34; unless $pop;

$total = $pop-&amp;#62;login($user, $password);
die &amp;#34;FEHLER: Keine Mails vorhanden oder kann keine Verbindung herstellen!&amp;#34; unless $total;

print &amp;#34;Anahl: $total\n&amp;#34;;

for($i = 0; $i&amp;#60;$total; $i++) {
    print &amp;#34;- #$i\n&amp;#34;;
    $pop-&amp;#62;delete($i);
}

$pop-&amp;#62;quit();

exit 0;
&lt;/pre&gt;

	&lt;p&gt;Bitte mit Vorsicht benutzen! Alle E-Mails werden ohne Nachfrage gelöscht. &lt;/p&gt; 
    </content:encoded>

    <pubDate>Tue, 12 Jul 2011 14:00:47 +0200</pubDate>
    <guid isPermaLink="false">http://www.stefanjahn.de/blog/eintrag/2011-07-12-1117.html</guid>
    <category>E-Mail</category>
<category>POP3</category>

</item>
<item>
    <title>DataTable sortieren</title>
    <link>http://www.stefanjahn.de/blog/eintrag/2011-07-11-DataTable-sortieren.html</link>
            <category>C-Sharp</category>
    
    <comments>http://www.stefanjahn.de/blog/eintrag/2011-07-11-DataTable-sortieren.html#comments</comments>
    <wfw:comment>http://www.stefanjahn.de/blog/wfwcomment.php?cid=1116</wfw:comment>

    <slash:comments>0</slash:comments>
    <wfw:commentRss>http://www.stefanjahn.de/blog/rss.php?version=2.0&amp;type=comments&amp;cid=1116</wfw:commentRss>
    

    <author>nospam@example.com (Stefan Jahn)</author>
    <content:encoded>
    	&lt;p&gt;Wenn man Tabellen mit Daten aus einer Datenbank füllt ist die Sortierung eigentlich kein Problem. Man gestaltet entsprechend die Datenbankabfrage (&lt;span class=&quot;caps&quot;&gt;SQL&lt;/span&gt;) und sortiert die Datensätze schon beim Einlesen der Daten.&lt;/p&gt;

	&lt;p&gt;Was ist aber wenn man die Datensätze schon in einer &lt;code&gt;DataTable&lt;/code&gt; vorliegen hat, z.B. bei einer manuell gefüllten Tabelle, und diese nun sortieren will? Die Klasse &lt;code&gt;DataTable&lt;/code&gt; selber stellt keine Funktion zur Sortierung zur Verfügung.&lt;/p&gt;

	&lt;p&gt;Man kann den Umweg über ein &lt;code&gt;DataView&lt;/code&gt; nehmen. Ein &lt;code&gt;DataView&lt;/code&gt; kann man nach jeder beliebigen Spalte sortieren lassen.&lt;/p&gt;

&lt;pre&gt;DataView view = new DataView( table );
view.Sort = &amp;#34;[Spaltenname]&amp;#34;;
table     = view.ToTable();
&lt;/pre&gt;

	&lt;p&gt;Beispiel:&lt;/p&gt;

&lt;pre&gt;DataTable table = new DataTable();

table.Columns.Add( new DataColumn( &amp;#34;Nachname&amp;#34;, typeof( string )));
table.Columns.Add( new DataColumn( &amp;#34;Vorname&amp;#34;, typeof( string )));

table.Rows.Add( new object[] { &amp;#34;de Burgh&amp;#34;, &amp;#34;Chris&amp;#34; } );
table.Rows.Add( new object[] { &amp;#34;Minogue&amp;#34;, &amp;#34;Kylie&amp;#34; } );
table.Rows.Add( new object[] { &amp;#34;Oldfield&amp;#34;, &amp;#34;Mike&amp;#34; } );
table.Rows.Add( new object[] { &amp;#34;Brightman&amp;#34;, &amp;#34;Sarah&amp;#34; } );

DataView view = new DataView( table );
view.Sort = &amp;#34;Nachname&amp;#34;;
table     = view.ToTable();
&lt;/pre&gt;

	&lt;p&gt;Als Werte für den Property &lt;code&gt;Sort&lt;/code&gt; kann man auch mehere Spalten oder sogar die Sortierrichtung angeben, so wie man es vom Sort-Syntax bei &lt;span class=&quot;caps&quot;&gt;SQL&lt;/span&gt; gewohnt ist:&lt;/p&gt;

&lt;pre&gt;view.Sort = &amp;#34;Nachname, Vorname&amp;#34;;
view.Sort = &amp;#34;Nachname DESC&amp;#34;;
view.Sort = &amp;#34;Nachname DESC, Vorname&amp;#34;; 
&lt;/pre&gt; 
    </content:encoded>

    <pubDate>Mon, 11 Jul 2011 21:01:42 +0200</pubDate>
    <guid isPermaLink="false">http://www.stefanjahn.de/blog/eintrag/2011-07-11-1116.html</guid>
    <category>DataTable</category>
<category>DataView</category>

</item>
<item>
    <title>Mehrfachen Start eines Programmes verhindern</title>
    <link>http://www.stefanjahn.de/blog/eintrag/2011-07-11-Mehrfachen-Start-eines-Programmes-verhindern.html</link>
            <category>C-Sharp</category>
    
    <comments>http://www.stefanjahn.de/blog/eintrag/2011-07-11-Mehrfachen-Start-eines-Programmes-verhindern.html#comments</comments>
    <wfw:comment>http://www.stefanjahn.de/blog/wfwcomment.php?cid=1115</wfw:comment>

    <slash:comments>0</slash:comments>
    <wfw:commentRss>http://www.stefanjahn.de/blog/rss.php?version=2.0&amp;type=comments&amp;cid=1115</wfw:commentRss>
    

    <author>nospam@example.com (Stefan Jahn)</author>
    <content:encoded>
    	&lt;p&gt;Je nach Art des Programmes ist es unerwünscht bzw. kann sogar zu Fehlern oder Nebenwirkungen führen wenn man dieses mehrmals startet. Wie aber nun herausfinden ob das eigene Programm schon läuft?&lt;/p&gt;

	&lt;p&gt;Dafür kann man sich die &lt;code&gt;Mutex&lt;/code&gt;-Klasse aus &lt;code&gt;System.Threading&lt;/code&gt; zu nutze machen.&lt;/p&gt;

&lt;pre&gt;using System;
using System.Threading;

class Program
{
    private static Mutex mutex;

    public static void Main( string[] args )
    {
        // Falls Programm schon laeuft neuen Start verhindern.
        if ( IsRunning() ) return;

        Console.WriteLine( &amp;#34;Hello World&amp;#34; );
        Console.ReadLine();
    }


    /// &amp;#60;summary&amp;#62;
    /// Pruefen ob Programm schon laueft.
    /// &amp;#60;/summary&amp;#62;
    /// &amp;#60;returns&amp;#62;True = Programm laeuft schon&amp;#60;/returns&amp;#62;
    public static bool IsRunning() {
        // Eindeutige Programmkennung erzeugen
        mutex = new Mutex( false, System.Reflection.Assembly.GetExecutingAssembly().GetName().Name+&amp;#34;_MultiStartPrevent&amp;#34; );
		
        if ( mutex.WaitOne( 0, true ) ) return false;
        return true;
    }
}
 
&lt;/pre&gt; 
    </content:encoded>

    <pubDate>Mon, 11 Jul 2011 20:29:22 +0200</pubDate>
    <guid isPermaLink="false">http://www.stefanjahn.de/blog/eintrag/2011-07-11-1115.html</guid>
    <category>Threading</category>

</item>
<item>
    <title>LINQ-Abfrage in DataTable umwandeln</title>
    <link>http://www.stefanjahn.de/blog/eintrag/2011-07-06-LINQ-Abfrage-in-DataTable-umwandeln.html</link>
            <category>C-Sharp</category>
    
    <comments>http://www.stefanjahn.de/blog/eintrag/2011-07-06-LINQ-Abfrage-in-DataTable-umwandeln.html#comments</comments>
    <wfw:comment>http://www.stefanjahn.de/blog/wfwcomment.php?cid=1114</wfw:comment>

    <slash:comments>0</slash:comments>
    <wfw:commentRss>http://www.stefanjahn.de/blog/rss.php?version=2.0&amp;type=comments&amp;cid=1114</wfw:commentRss>
    

    <author>nospam@example.com (Stefan Jahn)</author>
    <content:encoded>
    	&lt;p&gt;Seit C# 3.0 kann man ja via &lt;span class=&quot;caps&quot;&gt;LINQ&lt;/span&gt; eine Datenbank abfragen. Eine schöne Sache. Ab und zu, für bestimmte Zwecke, benötigt man aber immer noch die Ergebnisse als klassische &lt;code&gt;DataTable&lt;/code&gt;. Wie wandelt man nun das Ergebnis einer LINQ-Abfrage in eine &lt;code&gt;DataTable&lt;/code&gt; um?&lt;/p&gt;

	&lt;p&gt;Hier die LINQ-Abfrage die mir mein Adressbuch ausliest:&lt;/p&gt;

&lt;pre&gt;DataContext context = new DataContext();
var query = from s in context.Personen
            orderby s.Nachname
            select s;
&lt;/pre&gt;

	&lt;p&gt;Die Datensätze hat man nun in &lt;code&gt;query&lt;/code&gt;. Man könnte jetzt nun mit foreach jeden einzelnen Datensatz abfragen und in eine &lt;code&gt;DataTable&lt;/code&gt; ablegen. Es geht aber noch etwas einfacher:&lt;/p&gt;

&lt;pre&gt;using System;
using System.Data;
using System.Data.SqlClient;
using System.Linq;

/// &amp;#60;summary&amp;#62;
/// Ergebnis einer LINQ-Abfrage in eine DataTable umwandeln.
/// &amp;#60;/summary&amp;#62;
/// &amp;#60;param name=&amp;#34;query&amp;#34;&amp;#62;Abfrageergebnis&amp;#60;/param&amp;#62;
/// &amp;#60;param name=&amp;#34;context&amp;#34;&amp;#62;Context&amp;#60;/param&amp;#62;
/// &amp;#60;returns&amp;#62;Tabelle&amp;#60;/returns&amp;#62;
public DataTable ConvertLinqToDatatable( IQueryable query, DataContext context )
{
    DataTable table = null;
    IDbCommand cmd = null;
    SqlDataAdapter adapter = null;

    try
    {
        // LINQ-Abfrage in Tabelle speichern
        cmd = context.GetCommand( query );
        adapter = new SqlDataAdapter();
        adapter.SelectCommand = (SqlCommand)cmd;
        table = new DataTable();

        cmd.Connection.Open();
        adapter.FillSchema( table, SchemaType.Source );
        adapter.Fill( table );

        return table;
    }
    catch
    {
        throw;
    }
    finally
    {
        if ( table != null ) table.Dispose();
        if ( adapter != null ) adapter.Dispose();

        if ( cmd != null )
        {
            cmd.Connection.Close();
            cmd.Dispose();
        }
    }
}
&lt;/pre&gt;

	&lt;p&gt;Somit einfach wie gewohnt eine LINQ-Abfrage durchführen und dann das Ergbnis mit der Funktion &lt;code&gt;ConvertLinqToDatatable()&lt;/code&gt; umwandeln lassen:&lt;/p&gt;

&lt;pre&gt;DataContext context = new DataContext();
var query = from s in context.Personen
            orderby s.Nachname
            select s;

DataTable = ConvertLinqToDatatable( query, context ); 
&lt;/pre&gt; 
    </content:encoded>

    <pubDate>Wed, 06 Jul 2011 22:23:02 +0200</pubDate>
    <guid isPermaLink="false">http://www.stefanjahn.de/blog/eintrag/2011-07-06-1114.html</guid>
    <category>DataTable</category>
<category>Linq</category>

</item>
<item>
    <title>20 Dinge, die ich über Browser und das Web gelernt habe</title>
    <link>http://www.stefanjahn.de/blog/eintrag/2011-06-28-20-Dinge,-die-ich-ueber-Browser-und-das-Web-gelernt-habe.html</link>
            <category>Webdesign</category>
    
    <comments>http://www.stefanjahn.de/blog/eintrag/2011-06-28-20-Dinge,-die-ich-ueber-Browser-und-das-Web-gelernt-habe.html#comments</comments>
    <wfw:comment>http://www.stefanjahn.de/blog/wfwcomment.php?cid=1113</wfw:comment>

    <slash:comments>0</slash:comments>
    <wfw:commentRss>http://www.stefanjahn.de/blog/rss.php?version=2.0&amp;type=comments&amp;cid=1113</wfw:commentRss>
    

    <author>nospam@example.com (Stefan Jahn)</author>
    <content:encoded>
    	&lt;p&gt;Das interessante Buch von &lt;a href=&quot;http://www.google.com&quot;&gt;Google&lt;/a&gt; mit dem Titel &amp;#8220;20 things I learned about browsers and the web&amp;#8221; gibt es nun auch auf Deutsch. Google hat die deutsche Fassung als HTML5 realisiert. Echt hübsch gemacht.&lt;/p&gt;

	&lt;p&gt;Das Buch &lt;a href=&quot;http://www.20thingsilearned.com/de-DE/home&quot;&gt;20 Dinge, die ich über Browser und das Web gelernt habe&lt;/a&gt; erklärt auf leicht verständliche Art so Themen wie Browser, &lt;span class=&quot;caps&quot;&gt;HTML&lt;/span&gt;, &lt;span class=&quot;caps&quot;&gt;CSS&lt;/span&gt;, IP, ... Hier das Inhaltsverzeichnis:&lt;/p&gt;

	&lt;ol&gt;
		&lt;li&gt;Was ist das Internet?&lt;/li&gt;
		&lt;li&gt;Cloud Computing&lt;/li&gt;
		&lt;li&gt;Web-Apps&lt;/li&gt;
		&lt;li&gt;&lt;span class=&quot;caps&quot;&gt;HTML&lt;/span&gt;, JavaScript, &lt;span class=&quot;caps&quot;&gt;CSS&lt;/span&gt; und mehr&lt;/li&gt;
		&lt;li&gt;HTML5&lt;/li&gt;
		&lt;li&gt;3D im Browser&lt;/li&gt;
		&lt;li&gt;Ode an den Browser&lt;/li&gt;
		&lt;li&gt;Plug-ins&lt;/li&gt;
		&lt;li&gt;Browser-Erweiterungen&lt;/li&gt;
		&lt;li&gt;Browser-Synchronisierung&lt;/li&gt;
		&lt;li&gt;Browser-Cookies&lt;/li&gt;
		&lt;li&gt;Browser und Datenschutz&lt;/li&gt;
		&lt;li&gt;Malware, Phishing und Sicherheitsrisiken&lt;/li&gt;
		&lt;li&gt;So schützen Moderne Browser vor Malware und Phishing&lt;/li&gt;
		&lt;li&gt;Sicherheit durch Webadressen&lt;/li&gt;
		&lt;li&gt;IP-Adressen und &lt;span class=&quot;caps&quot;&gt;DNS&lt;/span&gt;&lt;/li&gt;
		&lt;li&gt;Online-Überprüfung&lt;/li&gt;
		&lt;li&gt;Schritthalten mit dem Web&lt;/li&gt;
		&lt;li&gt;Open Source und Browser&lt;/li&gt;
		&lt;li&gt;19 Dinge später …&lt;/li&gt;
	&lt;/ol&gt;

	&lt;p&gt;Der &lt;a href=&quot;http://code.google.com/p/20thingsilearned/&quot;&gt;Quellcode der HTML5-Seite&lt;/a&gt; hat Google unter der Lizenz &lt;span class=&quot;caps&quot;&gt;GNU&lt;/span&gt; &lt;span class=&quot;caps&quot;&gt;GPL&lt;/span&gt; v2 veröffentlicht. So kann sich jeder anschauen wie die hübsche Seite gemacht worden ist.&lt;/p&gt;

	&lt;p&gt;Kleiner Wermutstropfen was HTML5 angeht, im Internet-Explorer funktioniert die Seite &amp;#8211; zumindest die Animationen &amp;#8211; nicht so wie gewünscht. Den Inhalt des Buches kann man aber trotzdem ohne Probleme lesen. Mit den Browsern &lt;a href=&quot;http://www.mozilla.com/de/firefox/&quot;&gt;Firefox&lt;/a&gt;, &lt;a href=&quot;http://www.google.com/chrome/&quot;&gt;Chrome&lt;/a&gt; und &lt;a href=&quot;http://www.opera.com&quot;&gt;Opera&lt;/a&gt; kann ich keine Probleme entdecken.&lt;/p&gt;

	&lt;p&gt;Quelle: &lt;a href=&quot;http://www.googlewatchblog.de/2011/06/20-dinge-die-ich-ueber-browser-und-das-web-gelernt-habe/&quot;&gt;GoogleWatchBlog&lt;/a&gt; &lt;/p&gt; 
    </content:encoded>

    <pubDate>Tue, 28 Jun 2011 22:10:44 +0200</pubDate>
    <guid isPermaLink="false">http://www.stefanjahn.de/blog/eintrag/2011-06-28-1113.html</guid>
    <category>Buch</category>
<category>Google</category>
<category>HTML</category>

</item>

</channel>
</rss>
