<?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>heinitz-it</title>
	<atom:link href="http://heinitz-it.de/feed" rel="self" type="application/rss+xml" />
	<link>http://heinitz-it.de</link>
	<description>Dipl. Ing. (FH), MBA Valentin Heinitz - freiberuflicher Softwareentwickler</description>
	<lastBuildDate>Sun, 22 Aug 2010 16:42:05 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.1</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Selfmade BlackBerry 8800 emergency charger</title>
		<link>http://heinitz-it.de/archives/196</link>
		<comments>http://heinitz-it.de/archives/196#comments</comments>
		<pubDate>Tue, 06 Jul 2010 21:42:14 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[BlackBerry]]></category>

		<guid isPermaLink="false">http://heinitz-it.de/?p=196</guid>
		<description><![CDATA[Today I&#8217;ve got a kind of emergency. The USB-slot of my BlackBerry 8800 has broken. There was no chance to charge the mobile phone with a USB-cable. A broken BlackBerry is bad enough, but the worst thing was &#8211; it happened on a business trip. As I couldn&#8217;t find a cradle charger for BlackBerry 8800 [...]]]></description>
			<content:encoded><![CDATA[<p>Today I&#8217;ve got a kind of emergency. The USB-slot of my BlackBerry 8800 has broken. There was no chance to charge the mobile phone with a USB-cable. A broken BlackBerry is bad enough, but the worst thing was &#8211; it happened on a business trip. As I couldn&#8217;t find a cradle charger for BlackBerry 8800 in any shop around, I decided to make one myself.<br />
My search in Internet for self-made charger HOWTO has brought no results. However it revealed, that I was not the only one owner of BlackBerry 8800 with broken USB-slot. All the question from my fellows in misfortune were in English, which motivated me to write this post.</p>
<p>BlackBerry 8800 has a power-connector on the left side. A multimeter told me, that upper contact was for plus and lower for minus (lower contact is connected to ground).<br />
<a href="http://heinitz-it.de/wp-content/uploads/2010/08/bb_powerconn.jpg"><img src="http://heinitz-it.de/wp-content/uploads/2010/08/bb_powerconn.jpg" alt="" title="bb_powerconn" width="640" height="313" class="alignnone size-full wp-image-227" /></a></p>
<p>I&#8217;ve cut the Slim-USB ending of the USB-cable off and removed 10mm of cladding from power wires. Attention! There is no guarantee, that on your USB-Cable the red wire is + and black is -. Test the polarity with a multimeter first!<br />
<a href="http://heinitz-it.de/wp-content/uploads/2010/07/usbcable.jpg"><img src="http://heinitz-it.de/wp-content/uploads/2010/07/usbcable.jpg" alt="USB Cable" title="usbcable" width="300" height="348" class="alignnone size-full wp-image-230" /></a></p>
<p>A piece of sticky tape did the rest of the job &#8211; connected the wires to the BlackBerry power connector.<br />
<a href="http://heinitz-it.de/wp-content/uploads/2010/07/bbcharger.jpg"><img src="http://heinitz-it.de/wp-content/uploads/2010/07/bbcharger.jpg" alt="" title="bbcharger" width="640" height="384" class="alignnone size-full wp-image-234" /></a></p>
<p>You may ask, how I&#8217;d found out that USB on my laptop is just the source of power BlackBerry 8800 wants? Well the only thing I knew, was It wouldn&#8217;t harm my laptop as USB has built-in short-circuit guard. And for BlackBerry, well I gave it a chance and it worked.</p>
<p>Good luck with charging your phone!<br />
Valentin Heinitz</p>
<p>ATTENTION! Try it on your own risk. I will not take any responsibility for any damage on your BlackBerry or computer. </p>
]]></content:encoded>
			<wfw:commentRss>http://heinitz-it.de/archives/196/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Projekte für Freiberufler &#8211; Liste der Agenturen und Portale für IT Projekte</title>
		<link>http://heinitz-it.de/archives/100</link>
		<comments>http://heinitz-it.de/archives/100#comments</comments>
		<pubDate>Tue, 25 May 2010 16:06:21 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[Automotive]]></category>
		<category><![CDATA[c++]]></category>
		<category><![CDATA[Projects]]></category>

		<guid isPermaLink="false">http://heinitz-it.de/?p=100</guid>
		<description><![CDATA[Dies sind meine &#8220;Fundstellen&#8221; für freiberufliche IT-Projekte. Die Links sind zur Zeit weder sortiert noch katalogisiert. Also gibt die Rehienfolge keine Aussage über die Qualität der Agentur.
Wo auch immer es möglich war, habe ich die Projektliste direkt verlinkt. Ansonsten sind es die Links der Firmen, bei denen es sich anzufragen lohnt. Für alle Hinweise auf [...]]]></description>
			<content:encoded><![CDATA[<p>Dies sind meine &#8220;Fundstellen&#8221; für freiberufliche IT-Projekte. Die Links sind zur Zeit weder sortiert noch katalogisiert. Also gibt die Rehienfolge keine Aussage über die Qualität der Agentur.</p>
<p>Wo auch immer es möglich war, habe ich die Projektliste direkt verlinkt. Ansonsten sind es die Links der Firmen, bei denen es sich anzufragen lohnt. Für alle Hinweise auf ungültige Links bin ich sehr dankbar. Ich würde mich auch auf Eure Linksammlung sehr freuen.</p>
<p>Viel Erfolg bei Eurer Projektsuche!<br />
Valentin Heinitz</p>
<p><a href="http://www.xing.com" target="new">XING</a> In Forum &#8220;Freiberufler Projektmarkt&#8221; Verfügbarkeit posten.<br />
<a href="http://www.megapart.de/index.php?site=partner&#038;sub=p_projekte_start"  target="new">Megapart GmbH</a><br />
<a href="http://www.consileon.de">Consileon</a> IT-Beratung, Karlsruhe. Finanzen, Automotive. Keine Projektausschriebungen auf der Seite.<br />
<a href="http://www.protechnology.de/projects_offers.php"  target="new">ProTechnology</a> IT-Dienstleister, überwiegend MS-Produkte, Dresden<br />
<a href="http://www.aracom.de/projects.html" target="new">AraCom</a> &#8211; Agentur aus Augsburg. uC, C++, Mainframes, Hardwarenahe Projekte überwiegend im Raum München. Es besteht eine Möglichkeit, Projektnewsletters zu abonnieren.<br />
<!-- a href="http://www.quest-online.de/index.php?id=4" target="new">Quest GmbH</a --><br />
<a href="http://www.constaff.com/projekte/" target="new">Constaff</a><br />
<a href="https://www.etengo.de" target="new">Etengo</a><br />
<a href="http://varius-it.com/content/consultants_projekt.php" target="new">http://varius-it.com</a> &#8211; Überwiegend SAP, Finanzen<br />
<a href="http://www.1st-sc.de/karriere/projektangebote/" target="new">1st solution consulting GmbH</a><br />
<a href="http://projects.resoom.de/" target="new">resoom.de</a> Scannt andere Projektportale nach Projekten. Scheint noch nicht ausgereift zu sein, aber man kann schnell rausfinden, welche Portale es gibt.<br />
<a href="https://www.infutura.com" target="new">Infutura</a> Freelance-Portal<br />
<a href="https://www.zeitgeist-at-work.com" target="new">www.zeitgeist-at-work.com</a> &#8211; Suchmaschine für Projekte/Freiberufler<br />
<a href="http://www.reutax.com/de/freelancer/projekte.html" target="new">Reutax</a><br />
<a href="http://www.cs2-informatik.de/index.php?id=107" target="new">www.cs2-informatik.de</a> Projekte überwiegend in D8 Raum. SAP, C++, Java<br />
<a href="http://www.solcom.de/asp/jobportal.aspx" target="new">www.solcom.de</a><br />
<a href="http://www.bsf-consulting.de/web/jobs/wirsuchensie/index.php" target="new">www.bsf-consulting.de</a> Überwiegend Festanstellung<br />
<a href="http://www.request2.de/" target="new">request2</a> &#8211; Keine Projekte aufgelistet, jedoch gute Vermittlungschancen.<br />
<a href="http://www.computerfutures.com/de" target="new">Computerfutures</a><br />
<a href="http://xpsnet.de/6.html" target="new">xpsnet.de</a><br />
<a href="http://www.rosa-ag.de/jobs-itengineering-de.htm" target="new">www.rosa-ag.de</a><br />
<a href="https://www.freelance.de/Projekte/IT-Projekte" target="new">Freelance.de</a><br />
<a href="http://www.future-consulting.de/index.php?id=21" target="new">www.future-consulting.de</a> Überwiegend SAP Projekte in Rhein-Main Region<br />
<a href="http://www.hays.de" target="new">Hays AG &#8211; höflich, fair, kompetent (meine Erfahrung)</a><br />
<a href="http://www.valentum.de/web/pages/engineering-services/karriere/offene-stellen.php" target="new">http://www.valentum.de</a> Projekte und Festanstellung<br />
<a href="http://www.valyue.de/index.php?id=freiberufler" target="new">www.valyue.de</a><br />
<a href="http://www.gft.com/jobs/de/freelancer_area.html" target="new">www.gft.com</a><br />
<a href="http://www.personality-it.de" target="new">www.personality-it.de</a> Gute C++ Projekte.<br />
<a href="http://www.magic-dream-personal.de/kontakt/" target="new">www.magic-dream-personal.de</a> u.A. Automotive Projekte in Rhein-Main und im Norddeutschen Raum<br />
<a href="http://www.centomo.de/index.php?id=26" target="new">www.centomo.de</a> SAP, Automotive, Finanzen<br />
<a href="http://de.progressiverecruitment.com/" target="new">de.progressiverecruitment.com</a><br />
<a href="http://www.harveynash.com/de/jobs/" target="new">www.harveynash.com</a><br />
<a href="http://exco.de" target="new">exco.de</a> Überwiegend Festanstellung<br />
<a href="http://www.talisman-software.com" target="new">www.talisman-software.com</a> Überwiegend Executives<br />
<a href="http://www.freelancermap.de" target="new">www.freelancermap.de</a> Portal für Projekte<br />
<a href="http://www.gulp.de" target="new">www.gulp.de</a> Portal für Projekte<br />
<a href="http://www.projektwerk.de/" target="new">www.projektwerk.de</a> Portal für Projekte<br />
<a href="http://www.goetzfried-ag.com/de/3_0/projektangebote_projekte" target="new">www.goetzfried-ag.com</a> Überwiegend SAP, Finanzen<br />
<a href="http://www.it-jobs.stepstone.de/" target="new">www.it-jobs.stepstone.de</a> Überwiegend Festanstellung<br />
<a href="http://www.elan-it-resource.de" target="new">www.elan-it-resource.de</a> Überwiegend SAP, Finanzen<br />
<a href="http://www.expertnet.de/freelancer.php" target="new">www.expertnet.de</a><br />
<a href="http://www.projekt-pool.de" target="new">www.projekt-pool.de</a><br />
<a href="http://www.bi-fitness.de" target="new">Actinium Consulting GmbH </a> Keine Projektliste auf der Webseite, lohnt sich dennoch Profil einzureichen<br />
<a href="http://www.protechnology.de/projects_offers.php" target="new">ProTechnology &#8211; Gesellschaft für lösungsorientierte Informationstechnologien mbH </a><br />
<a href="http://www.abcona.de" target="new">www.abcona.de</a><br />
<a href="http://www.lenroxx.com" target="new">www.lenroxx.com</a><br />
<a href="http://www.bbv.ch/freelancer" target="new">BBV Software Services AG, hauptsächlich Projekte in Schweiz</a><br />
<a href="http://www.sw-xperts.com/de/it-experten/contracting/" target="new">www.sw-xperts.com</a><br />
<a href="http://www.tekom-gmbh.de/jobsd.htm" target="new">www.tekom-gmbh.de</a><br />
<a href="http://www.dozentenscout.de" target="new">http://www.dozentenscout.de</a> &#8211; Portal zum Anbieten von Vorträgen oder Schulungen<br />
<a href="http://www.bluecarat.eu/projektangebote/freie.htm" target="new">BlueCarat</a> &#8211; Überwiegend Finance/SAP in Frankfurt<br />
<a href="http://www.joinvision.com/" target="new">http://www.joinvision.com/</a> Portal für Freelancer. DE-CH-AT<br />
<a href="http://www.freelance-market.de" target="new">Freelance-Market</a> &#8211; Don&#8217;t call us, we&#8217;ll call you. Möglichkeit, sich als Freelancer einzutragen. Nicht auf IT beschränkt.<br />
<a href="http://www.karriere.at/jobs/edv-it-organisation" target="new">karriere.at &#8211; Portalbereich für IT-Jobs und Projekte in Österreich</a><br />
<a href="http://www.syspoint-consulting.de" target="new">Keine Projektausschreibung auf der Webseite.</a><br />
<a href="http://www.apriori.de/html/recruiting/freelancer.html" target="new">Apriori AG</a> Keine Projektausschreibungen auf der Webseite.<br />
<a href="http://www.computerwoche.de/projektboerse/" target="new">Computerwoche</a> Eine Suchmaschiene der Zeitschrift Computerwoche. Keine eigene Projekte.</p>
]]></content:encoded>
			<wfw:commentRss>http://heinitz-it.de/archives/100/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>GMT (jeeamtee) &#8211; Mein erstes Projekt bei Google-Code</title>
		<link>http://heinitz-it.de/archives/90</link>
		<comments>http://heinitz-it.de/archives/90#comments</comments>
		<pubDate>Sun, 23 May 2010 17:40:55 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[c++]]></category>
		<category><![CDATA[FPGA]]></category>
		<category><![CDATA[hardwarenah]]></category>
		<category><![CDATA[memory]]></category>
		<category><![CDATA[register]]></category>

		<guid isPermaLink="false">http://heinitz-it.de/?p=90</guid>
		<description><![CDATA[GMT ist eine C++ Klasse für Manipulation von Speicherblöcken. Ich habe sie während eines hardware-nahes Projektes implementiert, um die Hardware (FPGA) auf einem Embedded-Board mit einem komfortablen Konsolen-Tool testen zu können.  Eine solche Konsolenapplikation wird mit GMT zu einem Zehnzeiler.
Die ursprüngliche Applikation hieß gmm (Generic Memory Manipulator) und war zum Teil auch beim Kunden [...]]]></description>
			<content:encoded><![CDATA[<p>GMT ist eine C++ Klasse für Manipulation von Speicherblöcken. Ich habe sie während eines hardware-nahes Projektes implementiert, um die Hardware (FPGA) auf einem Embedded-Board mit einem komfortablen Konsolen-Tool testen zu können.  Eine solche Konsolenapplikation wird mit GMT zu einem Zehnzeiler.</p>
<p>Die ursprüngliche Applikation hieß gmm (Generic Memory Manipulator) und war zum Teil auch beim Kunden entwickelt. GMT ( Generic Memory Tool ) wurde neu geschrieben und hat von gmm nur die Idee geerbt. Außerdem habe ich mich entschlossen, das Projekt nicht als eine Applikation zu entwickeln sondern als eine Klasse (oder auch eine winzige Klassenbibliothek).</p>
<p>Die Einfachheit und das Komfort, bei Google Open-Source Projekte zu hosten, hat mich sehr positiv überrascht. Man kann von dem Workflow und von der Projektmanagementumgebung viel lernen. Ich bin mir sicher, es wird nicht mein letztes Google-Code Projekt sein.</p>
<p>Das Projekt ist gehostet bei: <a href="https://code.google.com/p/jeeamtee/">https://code.google.com/p/jeeamtee/</a></p>
<p>Viel Erfolg damit und vielen Dank für alle Anregungen!<br />
Valentin Heinitz</p>
<p>P.S.: Ah ja, warum so seltsamer Name? Der Projektname GMT war bei google-code bereits belegt, deshalb bin ich auf jeeamtee ausgewichen.</p>
]]></content:encoded>
			<wfw:commentRss>http://heinitz-it.de/archives/90/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Fehlermeldungen von GCC in Visual Studio ausgeben</title>
		<link>http://heinitz-it.de/archives/71</link>
		<comments>http://heinitz-it.de/archives/71#comments</comments>
		<pubDate>Tue, 11 May 2010 14:52:19 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[GCC]]></category>
		<category><![CDATA[GNU]]></category>
		<category><![CDATA[IDE]]></category>
		<category><![CDATA[VisualStudio]]></category>

		<guid isPermaLink="false">http://heinitz-it.de/?p=71</guid>
		<description><![CDATA[In vielen C/C++ Embedded-Projekten an denen ich mitgearbeitet habe, wurde als Compiler eine Variante von GCC genommen. Als Entwicklungsumgebung hat allerdings MS Visual Studio gedient. Für Visual Studio als IDE spricht vieles. MSVS ist schnell, bietet sehr gute Navigationsmöglichkeiten und löst die Symbole recht zuverlässig auch bei nicht kompilierbarem Code und losen Source-Dateien auf. (Leider [...]]]></description>
			<content:encoded><![CDATA[<p>In vielen C/C++ Embedded-Projekten an denen ich mitgearbeitet habe, wurde als Compiler eine Variante von GCC genommen. Als Entwicklungsumgebung hat allerdings MS Visual Studio gedient. Für Visual Studio als IDE spricht vieles. MSVS ist schnell, bietet sehr gute Navigationsmöglichkeiten und löst die Symbole recht zuverlässig auch bei nicht kompilierbarem Code und losen Source-Dateien auf. (Leider kann ihmo Eclipse/CDT mit MSVS nicht mithalten und kommt z.B. bei (nicht trivialen) Templates mit der Symbolauflösung schnell durcheinander.)</p>
<p>In der Regel wurde der Buildvorgang mit einem Batch-Skript gestartet und die Buildergebnisse wie Fehler, Warnungen, etc. in eine Log-Datei umgeleitet.<br />
Um eventuelle Fehler zu beseitigen, musste man mühselig nach dem Dateinamen und der Zeilennummer in der Log-Datei suchen und zu der Stelle in Visual Studio manuell gehen.<br />
Da die Fehlerformate von GNU und MSVS unterschiedlich sind, kann Visual Studio mit den GCC Fehlermeldungen nichts anfangen.</p>
<p>Dabei kann ein sehr einfacher Konverter die Arbeit erleichtern, so dass man mit dem Doppelklick auf die Fehlermeldung sofort zur richtigen Stelle gelangt.<br />
Der Fehlerformat von GNU ist:<br />
<code>GCC format:    source.cpp:123: error: a gcc error message</code><br />
Der Fehlerformat von MSVS ist:<br />
<code>MSVC++ format: source.cpp(123) : error: a MSVS error message</code><br />
Der Konverter ist ein Einzeiler:<br />
<code>grep ": error:\|: warning:" "%1" | sed "s/:\([0-9]\+\): \(error\|warning\):/(\1) : \2: /"</code><br />
Es werden UNIX-Tools grep und sed benutzt. Sie dürften auf keinem Entwicklerrechner fehlen, auch unter Windows: <a href="http://gnuwin32.sourceforge.net/">http://gnuwin32.sourceforge.net/</a>.<br />
Der Skript sollte als eine Batch-Datei implementiert werden (einfach die Zeile in z.B. gcc2msvs.bat kopieren), und mit der Fehlerlogdatei als Parameter aufgerufen werden.</p>
<p>Zum Einbinden in Visual Studio benutze ich immer folgendes:<br />
In MSVS Menu anklicken &#8220;Tools->External Tools&#8221;, &#8220;Add&#8221; und folgende Felder ausfüllen:<br />
<em>Title</em>: 	BugFixing<br />
<em>Command</em>:   Path/gcc2msvs.bat<br />
<em>Arguments</em>:	&#8220;Path/GccBuildLogOutput&#8221;<br />
<em>Use Output window</em>: YES</p>
<p>Jetzt kann man sich die Fehlermeldungen vom letzten Build mit &#8220;Tools->BugFixing&#8221; anzeigen lassen. Das Gute daran ist, es funktioniert mit jeder MSVS Instanz, es bedarf keines gültigen Projektes oder Pfadeinstellungen.</p>
<p>Viel Spasß damit und viel Erfolg in Euren Projekten.<br />
Valentin Heinitz</p>
]]></content:encoded>
			<wfw:commentRss>http://heinitz-it.de/archives/71/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>INI-FIle Parser als Einzeiler in Bash</title>
		<link>http://heinitz-it.de/archives/64</link>
		<comments>http://heinitz-it.de/archives/64#comments</comments>
		<pubDate>Tue, 11 May 2010 08:40:14 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[Bash]]></category>
		<category><![CDATA[GREP]]></category>
		<category><![CDATA[INI]]></category>
		<category><![CDATA[Konfiguration]]></category>
		<category><![CDATA[Konvertieren]]></category>
		<category><![CDATA[RegEx]]></category>
		<category><![CDATA[Regular expression]]></category>
		<category><![CDATA[SED]]></category>

		<guid isPermaLink="false">http://heinitz-it.de/?p=64</guid>
		<description><![CDATA[Viele Programme speichern ihre Konfigurationsdaten immer noch im alten INI-Format ab. Das Format ist einfach: es gibt Sektionen, Schlüssel, Werte und Kommentare. Sektionen dürfen nicht ineinander geschachtelt werden, die Schlüssel innerhalb einer Sektion sollen eindeutig sein. Das Format ist zeilenbasiert, die Leerzeichen am Anfang und am Ende eines Tokens werden ignoriert.

[Section]
; Comment
Key = Value

Dieser Einzeiler [...]]]></description>
			<content:encoded><![CDATA[<p>Viele Programme speichern ihre Konfigurationsdaten immer noch im alten INI-Format ab. Das Format ist einfach: es gibt Sektionen, Schlüssel, Werte und Kommentare. Sektionen dürfen nicht ineinander geschachtelt werden, die Schlüssel innerhalb einer Sektion sollen eindeutig sein. Das Format ist zeilenbasiert, die Leerzeichen am Anfang und am Ende eines Tokens werden ignoriert.<br />
<code><br />
[Section]<br />
; Comment<br />
Key = Value<br />
</code></p>
<p>Dieser Einzeiler ist ein Bash-Script zum Lesen der Werte aus solchen INI-Dateien. Das Script wird aufgerufen mit dem Dateinamen, dem Sektionsnamen und mit dem Schlüssel. Der Wert wird auf der Standardausgabe ausgegeben.<br />
<code>cat $INIFILE | sed -n /^\[$SECTION\]/,/^\[.*\]/p | grep "^[:space:]*$ITEM[:space:]*=" | sed s/.*=[:space:]*//</code><br />
Zuerst wird der Inhalt entsprechender Sektion extrahiert. Danach wird die Zeile mit dem Schlüssel=Wert Paar für den gegebenen Schlüssel gefunden und davon der Wert genommen.</p>
<p>Viel Spaß damit, und denkt an XML als eine bessere Alternative für Konfigurationsdateien.<br />
Hier ist das komplette Source-Listing für INI-Reader:<br />
<code><br />
#!/bin/bash<br />
#Valentin Heinitz, www.heinitz-it.de, 2008-11-13<br />
#Reader for MS Windows 3.1 Ini-files<br />
#Usage: inireader.sh <ini-file> <section-name> <item-name><br />
# e.g.: inireader.sh win.ini ERRORS DISABLE<br />
#       would return value "no" from the section of win.ini<br />
#[ERRORS]<br />
#DISABLE=no<br />
INIFILE=$1<br />
SECTION=$2<br />
ITEM=$3<br />
cat $INIFILE | sed -n /^\[$SECTION\]/,/^\[.*\]/p | grep "^[:space:]*$ITEM[:space:]*=" | sed s/.*=[:space:]*//</code></p>
]]></content:encoded>
			<wfw:commentRss>http://heinitz-it.de/archives/64/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Enum2String</title>
		<link>http://heinitz-it.de/archives/27</link>
		<comments>http://heinitz-it.de/archives/27#comments</comments>
		<pubDate>Sat, 20 Mar 2010 22:43:50 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[c++]]></category>
		<category><![CDATA[Codegenerierung]]></category>
		<category><![CDATA[ctaga]]></category>
		<category><![CDATA[Debug]]></category>
		<category><![CDATA[Enum]]></category>
		<category><![CDATA[Trace]]></category>

		<guid isPermaLink="false">http://heinitz-it.de/?p=27</guid>
		<description><![CDATA[Beim Programmieren in C++ ist es oft nützlich, die enum-Werte nicht als Zahlen sondern als mit Ihren Namen als Zeichenketten auszugeben. C++ bietet diese Funktionalität nicht an. Es ist auch gut so, denn die enum-string Konvertierung kann mit kleinem Stück code bewerkstelligt werden. Dieses Code wird nur dann aktiviert, wenn es erforderlich ist - meistens im Entwicklungsstadium und zur Fehlersuche. 
Das hier vorgestellte PERL Skript erzeugt eine C++ Klasse, die viele überladene toString Methoden für alle im Projekt deklarierten Enums bietet.]]></description>
			<content:encoded><![CDATA[<p>Beim Programmieren in C++ ist es oft nützlich, die enum-Werte nicht als Zahlen sondern als Symbole mit ihren Namen auszugeben. C++ bietet diese Funktionalität nicht an. Es kann aber mit kleinem Stück Code bewerkstelligt werden. Dieses Code wird nur dann aktiviert, wenn es erforderlich ist &#8211; meistens im Entwicklungsstadium und zur Fehlersuche.<br />
Das hier vorgestellte Perl Skript erzeugt eine C++ Klasse, die viele überladene toString Methoden für alle im Projekt deklarierten Enums bietet. Außerdem wird hier kurz auf das nutzliche Tool <em>ctags</em> eingegangen.</p>
<p>Um alle enum-Deklarationen im Code zu finden, wäre das Parsen notwendig. C++ Code manuell (mit Perl) zu parsen, ist abenteuerlich. Es gibt eine viel einfachere und sicherere Mögligkeit &#8211; das Tool <a href="http://sourceforge.net/projects/ctags/">ctags</a>.</p>
<p>Für jeden, der mit GNU Tool-Chain arbeitet, ist ctags sicherlich ein Begrif &#8211; das Tool parst Quellcode und erzeugt daraus Symboltabelle. Der Aufruf <code>ctags -R *</code> parst alle Verzeichnisse rekursiv und erzeugt eine Datei namens tags im Arbeitsverzeichnis. Zu jedem Symbol in der tags-Datei gibt es Information, in welcher Datei es deklariert wurde und mit welchem Regulärem Ausdruck es in der Datei zu finden ist. z.B. hier ist ein Ausschnitt aus der einer tags-Datei:<br />
<code><br />
EnumA	inc\enums1.h	/^enum EnumA { eA1, eA2, eA3, };$/;"	g<br />
eA1	inc\enums1.h	/^enum EnumA { eA1, eA2, eA3, };$/;"	e	enum:EnumA<br />
</code><br />
Die erste Zeile besagt, dass in der Datei inc/enum1.h ein neuer Enum-Typ deklariert wird. Die zweite Zeile bedeutet &#8211; &#8220;enum eA1 ist ein enum vom Typ EnumA.&#8221;</p>
<p>Und tatsächlich, in der Testdatei inc/enums1.h findet man das EnumA:<br />
<code>///@file enums1.h<br />
#ifndef ENUMS1_HG_<br />
#define ENUMS1_HG_<br />
enum<br />
EnumA {<br />
eA1, eA2, eA3, };<br />
enum EnumB<br />
{<br />
eB1, // first enum<br />
eB2, eB3=eA3,<br />
//	eBUnused,<br />
/* eBUnused, */eB4<br />
};<br />
typedef enum ECStyle{<br />
eCStyle1=0, eCStyle2=100,<br />
};<br />
typedef enum EStrangeStyle{<br />
eStrangeStyle1, eStrangeStyle2<br />
}EStrangeStyle;<br />
#endif</code><br />
Die Datei enums1.h ist eine gültige C++ Headerdatei. Ich habe dort vier Enumtypen deklariert. Die unterschiedlichen Schreibweisen habe ich absichtlich gewählt, um zu zeigen, dass manuelles Parsen keine triviale Aufgabe wäre. Diese Möglichkeiten, enums in C++ zu deklarieren, sind nicht hypothetisch. Ich habe sie alle schon im produktiven Code gesehen.<br />
(Die Deklaration von EnumA und EnumB ist das, was man normalerweise in C++ benutzt. Die anderen, &#8230; na ja.)<br />
Für Testzwecke habe ich im Verzeichnis inc eine weitere Datei hinterlegt:<br />
<code>///@file enums2.h<br />
#ifndef ENUMS2_HG_<br />
#define ENUMS2_HG_<br />
enum EnumC { eC1, eC2, eC3, };<br />
enum EnumD { eD1, eD2, eD3, };<br />
#endif</code><br />
Das komplete Perl-Skript samt dem Beispielprojekt findest Du unten, am Ende des Artikels. Hier ist eine kurze Erläuterung.</p>
<p>Das folgende Rreguläre Ausdruck enthält 2 &#8220;back-references&#8221; &#8211; Unterausdrucke, die nach dem Anwenden des Hauptausdrucks referenziert werden können. In Perl würden die reservierten Perl-Variablen $1 und $2 die Inhalte von den fettmarkierten Ausdrücken enthalten.<br />
<code>my $pat="^[^\t]+\t<strong>([^\t]+)</strong>\t.*enum:<strong>([a-zA-Z_][a-zA-Z0-9_]*)</strong>";</code><br />
Zum Beispiel, nach Anwenden des oberen RegExp bei folgender Zeile würden  die Perl-Variablen $1 und $2 die fettmarkierten Anteile enthalten:<br />
<code>eA1	<strong>inc\enums1.h</strong> /^	eA1, eA2, eA3, };$/;"	e	enum:<strong>EnumA</strong></code></p>
<p>Folgende Schleife schreibt die gefundenen includes und enums in zwei Listen:<br />
<code>while () {<br />
if (my ($m) = m/$pat/){<br />
push @etypes, $2;<br />
push @includes, $1;<br />
}<br />
}</code><br />
Folgendes Codeschnipsel erzeugt aus beiden Listen, die mehrere gleiche Einträge enthalten können, Unique-Listen:<br />
<code>my %hlp1 = ();<br />
my @uniqenums = grep { ! $hlp1{$_} ++ } @etypes;<br />
my %hlp2 = ();<br />
my @uniqinc = grep { ! $hlp2{$_} ++ } @includes;</code><br />
Nun habe ich alle notwendigen Informationen für die Codegenerierung &#8211; Enum-Typen und Headerdateien.<br />
Es wird eine Utility-Klasse (keine Instanzen möglich/sinnvoll) generiert, die mehrere überladenen statischen toString-Mehtoden hat z.B.:<br />
<code>static const char * toString( EnumA en ) {<br />
switch( en ) {<br />
case eA1: return "eA1";<br />
case eA2: return "eA2";<br />
case eA3: return "eA3";<br />
}<br />
}</code></p>
<p>Außerdem wird in der Klasse eine Testmethode definiert &#8211; static void testEnum2String(), die beim Aufruf alle toString Methoden testet. Enum-Wert und Enum-Symbolname werden auf der Standardausgabe ausgegeben.</p>
<p><strong>Download</strong></p>
<ul>
<li><a href="http://heinitz-it.de/download/enum2string/enum2string.pl.html" target="_new">enum2string.pl &#8211; Perl-Skript</a></li>
<li><a href="http://heinitz-it.de/download/enum2string/enum2string.zip">enum2string.zip &#8211; Das gesamte Beispielprojekt</a></li>
</ul>
<p>Copyright 2010, Valentin Heinitz</p>
]]></content:encoded>
			<wfw:commentRss>http://heinitz-it.de/archives/27/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>
