<?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>Reality.SYS &#187; tutorial</title>
	<atom:link href="http://www.brakmic.de/index.php/tag/tutorial/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.brakmic.de</link>
	<description>is corrupted! Reboot Universe? (y/n)</description>
	<lastBuildDate>Mon, 05 Apr 2010 10:50:50 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=abc</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Armstrong on Software: Erlang &amp; SMP</title>
		<link>http://www.brakmic.de/index.php/2009/02/28/armstrong-on-software-erlang-smp/</link>
		<comments>http://www.brakmic.de/index.php/2009/02/28/armstrong-on-software-erlang-smp/#comments</comments>
		<pubDate>Sat, 28 Feb 2009 10:17:31 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Coding]]></category>
		<category><![CDATA[Erlang]]></category>
		<category><![CDATA[Tutorials]]></category>
		<category><![CDATA[concurrency]]></category>
		<category><![CDATA[COP]]></category>
		<category><![CDATA[parallel]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[tutorial]]></category>
		<category><![CDATA[video]]></category>

		<guid isPermaLink="false">http://www.brakmic.de/?p=395</guid>
		<description><![CDATA[]]></description>
			<content:encoded><![CDATA[<p><object width="443" height="329" data="http://video.google.com/googleplayer.swf?docid=-1363340548829250196&amp;hl=un&amp;fs=true" type="application/x-shockwave-flash"><param name="id" value="VideoPlayback" /><param name="src" value="http://video.google.com/googleplayer.swf?docid=-1363340548829250196&amp;hl=un&amp;fs=true" /></object></p>
<p>Nachdem der ganze Wahnsinn in Sachen immer-schnellere-CPUs-jedes-Jahr an physikalischen Grenzen scheiterte, werden neue (bzw. seit langem bekannte, aber nicht beachtete) Wege beschritten. Joe Armstrong hat in seinem Vortrag bei der Erlang Exchange 2008 über skalierbare Software, Concurrency und Fehlertoleranz gesprochen. Die Slides findet man <a href="http://skillsmatter.com/custom/presentations/keynote_joearmstrong.pdf" target="_blank">hier</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.brakmic.de/index.php/2009/02/28/armstrong-on-software-erlang-smp/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Building a transactional distributed data store with Erlang</title>
		<link>http://www.brakmic.de/index.php/2009/02/28/building-a-transactional-distributed-data-store-with-erlang/</link>
		<comments>http://www.brakmic.de/index.php/2009/02/28/building-a-transactional-distributed-data-store-with-erlang/#comments</comments>
		<pubDate>Sat, 28 Feb 2009 09:54:40 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Coding]]></category>
		<category><![CDATA[Erlang]]></category>
		<category><![CDATA[Tutorials]]></category>
		<category><![CDATA[concurrency]]></category>
		<category><![CDATA[COP]]></category>
		<category><![CDATA[parallel]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[tutorial]]></category>
		<category><![CDATA[video]]></category>

		<guid isPermaLink="false">http://www.brakmic.de/?p=388</guid>
		<description><![CDATA[
Bei der Erlang Exchange 2008 Konferenz wurde das vom Zuse Institut Berlin und onScale Solutions GmbH entwickelte data-store System vorgestellt. Im Vortrag kommen so wichtige Themen wie Distributed Hashtables (DHTs), transaction layer und schnelle application layer für tausendfache Lese-/Schreibzugriffe vor. Weitere Podcasts zum Thema Erlang, fehlertolerante Systeme und Concurrency kann man hier abrufen. Der originale [...]]]></description>
			<content:encoded><![CDATA[<p><object width="463" height="337" data="http://video.google.com/googleplayer.swf?docid=6981137233069932108&amp;hl=un&amp;fs=true" type="application/x-shockwave-flash"><param name="id" value="VideoPlayback" /><param name="src" value="http://video.google.com/googleplayer.swf?docid=6981137233069932108&amp;hl=un&amp;fs=true" /></object></p>
<p>Bei der Erlang Exchange 2008 Konferenz wurde das vom Zuse Institut Berlin und onScale Solutions GmbH entwickelte data-store System vorgestellt. Im Vortrag kommen so wichtige Themen wie Distributed Hashtables (DHTs), transaction layer und schnelle application layer für tausendfache Lese-/Schreibzugriffe vor. Weitere Podcasts zum Thema Erlang, fehlertolerante Systeme und Concurrency kann man <a href="http://skillsmatter.com/go/erlang" target="_blank">hier</a> abrufen. Der originale Link zum obigen Podcast ist <a href="http://skillsmatter.com/podcast/erlang/building-a-transactional-distributed-data-store-with-erlang" target="_blank">hier </a>zu finden und die Slides <a href="http://skillsmatter.com/custom/presentations/reinefeld_erlang_exchange.pdf" target="_blank">hier</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.brakmic.de/index.php/2009/02/28/building-a-transactional-distributed-data-store-with-erlang/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Komfortables Erlang-Coding mit Distel und Emacs</title>
		<link>http://www.brakmic.de/index.php/2009/02/22/komfortables-erlang-coding-mit-distel-und-emacs/</link>
		<comments>http://www.brakmic.de/index.php/2009/02/22/komfortables-erlang-coding-mit-distel-und-emacs/#comments</comments>
		<pubDate>Sun, 22 Feb 2009 13:05:58 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Coding]]></category>
		<category><![CDATA[Erlang]]></category>
		<category><![CDATA[Tutorials]]></category>
		<category><![CDATA[distel]]></category>
		<category><![CDATA[emacs]]></category>
		<category><![CDATA[tutorial]]></category>

		<guid isPermaLink="false">http://www.brakmic.de/?p=342</guid>
		<description><![CDATA[Die Erlang-Shell ist zu Anfang sicherlich völlig ausreichend, um sich mit der Sprache vertraut zu machen, im weiteren Verlauf aber wird man früher oder später eine passende IDE benötigen. Für Erlang existiert zwar (glücklicherweise!) keine &#8220;Standard IDE&#8221;, jedoch hat sich Emacs als de-facto Stadard-Editor durchgesetzt. Daher wird dieser hier vorgestellt, wie auch eine Emacs-Erweiterung namens [...]]]></description>
			<content:encoded><![CDATA[<p>Die Erlang-Shell ist zu Anfang sicherlich völlig ausreichend, um sich mit der Sprache vertraut zu machen, im weiteren Verlauf aber wird man früher oder später eine passende IDE benötigen. Für Erlang existiert zwar (glücklicherweise!) keine &#8220;Standard IDE&#8221;, jedoch hat sich Emacs als de-facto Stadard-Editor durchgesetzt. Daher wird dieser hier vorgestellt, wie auch eine Emacs-Erweiterung namens &#8220;Distel&#8221;, welche nützliche Emacs um nützliche Funktionen erweitert. So kann man nach Distel-Installation von Emacs aus die Erlang-Shells starten, Compilieren, Debuggen etc.</p>
<p>Als Erstes benötigen wir Emacs, welcher für verschiedene Betriebssysteme bereits vorkompiliert im Netz gefunden werden kann. Ich bevorzuge <a href="http://ourcomments.org/Emacs/EmacsW32.html" target="_blank">EmacsW32</a>, wenn ich unter Windows entwickle, aber dies sich ja nur eine Geschmackssache. Auf jeden Fall wird Emacs benötigt.</p>
<p>Danach holen wir uns mit Subversion die Distel-Sourcen:<br />
<strong>svn checkout http://distel.googlecode.com/svn/trunk/ distel</strong></p>
<p>Diese Sourcen werden mit &#8220;make&#8221; kompiliert. Unter Unix/Linux geht dies recht einfach, für Windows muss zuerst die passende POSIX-Umgebung geschaffen werden. Mit Cygwin geht dies am besten und einfachsten. Für alle, die wenig Lust auf Cygwin und die ganzen Compile-Vorgänge haben, gibt es ein <a href="http://www.brakmic.de/download/erlang/distel.zip">Zip-Paket zum Download</a>, welches die ganze Distel-Verzeichnisstruktur beinhaltet (mit bereits kompilierten Dateien). Meine Erlang-Version zum Zeitpunkt der Kompilierung war 5.6.5.</p>
<p>Nachdem Distel-Sourcen übersetzt bzw. heruntergeladen worden sind, sollen diese im Verzeichnis<strong> ERLANG_HOME</strong>\lib\distel abgelegt werden.</p>
<p>Am Ende solltet ihr eine solche Struktur haben:</p>
<p><img class="alignnone size-full wp-image-343" title="distel_pfad" src="http://www.brakmic.de/wp-content/2009/02/distel_pfad.jpg" alt="distel_pfad" width="343" height="410" /></p>
<p>Jetzt müssen wir der Erlang-Umgebung einen Pfad mehr verpassen, damit die Distel-Binaries verfügbar sind. Im Verzeichnis <strong>ERLANG_HOME</strong>\usr wird eine Datei namens <strong>.erlang</strong> (Punkt nicht vergessen!) angelegt, sofern sie nicht bereits vorhanden ist. Diese erweitert man um folgenden Eintrag</p>
<p><strong>code:add_pathz(&#8220;<span style="color: #ff0000;">ERLANG_HOME</span>/lib/distel/ebin&#8221;).</strong></p>
<p>Jezt passen wir Emacs an und erstellen, sofern nicht vorhanden, eine Datei namens<strong> .emacs</strong> in eurem Benutzer-Homeverzeichnis. Wenn man sich nicht sicher ist, wie das Homeverzeichnis heißt, einfach auf der Kommandozeile Folgendes eingeben: <strong>echo %HOME%</strong></p>
<p>Bei Unix/Linux-Usern schaut das Ganze <em>ein bisserl</em> anders aus. <img src='http://www.brakmic.de/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p>Dort hilft ein &#8220;env&#8221; auf der Konsole bzw. <strong>echo $HOME</strong>.</p>
<p>Im Home-Verzeichnis wird die zuvor erwähnte Datei um folgende Einträge erweitert:</p>
<p><span style="color: #339966;">;; Erlang Paths</span><span style="color: #808000;"><br />
(setq load-path (cons  &#8220;</span><span style="color: #808000;"><span style="color: #ff0000;"><strong>ERLANG_HOME</strong></span></span><span style="color: #808000;">/</span><span style="color: #808000;">lib/tools-2.6.2/emacs&#8221; load-path))<br />
(setq erlang-root-dir &#8220;</span><span style="color: #808000;"><span style="color: #ff0000;"><strong>ERLANG_HOME</strong></span></span><span style="color: #808000;">&#8220;)<br />
(setq exec-path (cons &#8220;</span><span style="color: #808000;"><span style="color: #ff0000;"><strong>ERLANG_HOME</strong></span></span><span style="color: #808000;"><strong></strong>/bin&#8221; exec-path))<br />
(require &#8216;erlang-start)</span></p>
<p><span style="color: #339966;">;; This is needed for Distel setup</span><br />
<span style="color: #808000;">(let ((distel-dir &#8220;<span style="color: #ff0000;"><strong>ERLANG_HOME</strong></span>/lib/distel/elisp&#8221;))<br />
(unless (member distel-dir load-path)<br />
<span style="color: #339966;">;; Add distel-dir to the end of load-path</span><br />
(setq load-path (append load-path (list distel-dir)))))<br />
(require &#8216;distel)<br />
(distel-setup)</span></p>
<p><span style="color: #339966;">;; Some Erlang customizations</span><br />
<span style="color: #808000;">(add-hook &#8216;erlang-mode-hook<br />
(lambda ()<br />
<span style="color: #339966;">;; when starting an Erlang shell in Emacs, default in the node name</span><br />
(setq inferior-erlang-machine-options &#8216;(&#8220;-sname&#8221; &#8220;emacs&#8221;))<br />
<span style="color: #339966;">;; add Erlang functions to an imenu menu</span><br />
(imenu-add-to-menubar &#8220;imenu&#8221;)))</span></p>
<p><span style="color: #339966;">;; A number of the erlang-extended-mode key bindings are useful in the shell too</span><br />
<span style="color: #808000;">(defconst distel-shell-keys<br />
&#8216;((&#8220;\C-\M-i&#8221;   erl-complete)<br />
(&#8220;\M-?&#8221;      erl-complete)<br />
(&#8220;\M-.&#8221;      erl-find-source-under-point)<br />
(&#8220;\M-,&#8221;      erl-find-source-unwind)<br />
(&#8220;\M-*&#8221;      erl-find-source-unwind))</span><br />
<span style="color: #339966;">;; Additional keys to bind when in Erlang shell.&#8221;)</span><br />
<span style="color: #808000;">(add-hook &#8216;erlang-shell-mode-hook<br />
(lambda ()<br />
<span style="color: #339966;">;; add some Distel bindings to the Erlang shell</span><br />
(dolist (spec distel-shell-keys)<br />
(define-key erlang-shell-mode-map (car spec) (cadr spec)))))</span></p>
<p>Ein Beispiel für <span style="color: #ff0000;"><strong>ERLANG_HOME</strong></span> wäre <strong>C:/Programme/erl5.6.5</strong></p>
<p><span style="color: #808000;"><span style="color: #000000;">Und auch für diesen Schritt habe ich ein entsprechendes <a href="http://www.brakmic.de/download/erlang/config_files.zip">Download</a> vorbereitet, falls man doch wenig Lust hat, sich in die Emacs-Lisp-Syntax einzuarbeiten. <img src='http://www.brakmic.de/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </span></span></p>
<p><span style="color: #808000;"><span style="color: #000000;">Jedoch sollten die Pfade angepasst werden und auch muss man daraus achten, dass die eventuell vorhandenen Leerzeilen in Windows Pfaden umgangen werden. </span></span></p>
<p><span style="color: #808000;"><span style="color: #000000;">Jetzt können wir Emacs starten und sich mit dem neue Erlang-Modus vertraut machen. Um diesen zu aktivieren, muss eine *.erl-Datei geladen werden.</span></span></p>
<p><span style="color: #808000;"><span style="color: #000000;"><img class="alignnone size-full wp-image-345" title="emacs_erlang_mode1" src="http://www.brakmic.de/wp-content/2009/02/emacs_erlang_mode1.jpg" alt="emacs_erlang_mode1" width="696" height="352" /><br />
</span></span></p>
<p><span style="color: #808000;"><span style="color: #000000;">Daneben ist noch ein weiteres Menü namens <em>imenu</em> vorhanden, welches vor allem bei umfangreichen Quellcodes recht nützlich ist, da es sämtliche Funktionen auflistet, die aktuell vorhanden sind. Diese kann man dann direkt ansteuern. Um eine Erlang-Shell zu starten, wählt man den Menüpunkt <em>Shell/Start New Shel</em>l aus.</span></span></p>
<p><span style="color: #808000;"><span style="color: #000000;"><img class="alignnone size-full wp-image-346" title="start_new_shell" src="http://www.brakmic.de/wp-content/2009/02/start_new_shell.jpg" alt="start_new_shell" width="696" height="362" /></span></span></p>
<p><span style="color: #808000;"><span style="color: #000000;">Als Ergebnis erhält man automatisch eine neue Shell innerhalb der Emacs-Umgebung.</span></span></p>
<p><span style="color: #808000;"><span style="color: #000000;"><img class="alignnone size-full wp-image-347" title="new_shell" src="http://www.brakmic.de/wp-content/2009/02/new_shell.jpg" alt="new_shell" width="696" height="293" /><br />
</span></span></p>
<p><span style="color: #808000;"><span style="color: #000000;">In dieser kann man z.B. die über Emacs kompilierten Erlang-Quellcodes starten. Würden wir den angezeigten Code kompilieren wollen, so wäre die Vorgehensweise wie folgt:</span></span></p>
<p><span style="color: #808000;"><span style="color: #000000;"><img class="alignnone size-full wp-image-348" title="compile_buffer" src="http://www.brakmic.de/wp-content/2009/02/compile_buffer.jpg" alt="compile_buffer" width="695" height="368" /></span></span></p>
<p><span style="color: #808000;"><span style="color: #000000;">Übrigens: das Wechseln zwischen verschiedenen &#8220;Buffers&#8221;, denn auch eine Erlang-Shell in Emacs ist &#8220;nur&#8221; ein weiterer Buffer, geschieht über den Menüpunkt &#8220;Buffers&#8221;. Dort wählt man einfach den gewünschten Buffer aus (hier den Quellcode) und anschließend startet man das Kompilieren desselben über <em>Erlang/Compile/Compile Buffer</em>. Wenn alles ordentlich verlaufen ist, erhält man folgendes Ergebnis:</span></span></p>
<p><span style="color: #808000;"><span style="color: #000000;"><img class="alignnone size-full wp-image-349" title="compile_ergebnis" src="http://www.brakmic.de/wp-content/2009/02/compile_ergebnis.jpg" alt="compile_ergebnis" width="656" height="744" /></span></span></p>
<p><span style="color: #808000;"><span style="color: #000000;">Es wird also die zuvor geöffnete Shell benutzt, um den Quellcode zu kompilieren. Hätten wir keine Shell zuvor aufgemacht, so würde Emacs automatisch eine entsprechende starten. Jetzt können wir auch direkt in derselben Shell das Kompilat starten:</span></span></p>
<p><span style="color: #808000;"><span style="color: #000000;"><img class="alignnone size-full wp-image-350" title="kompilat_starten" src="http://www.brakmic.de/wp-content/2009/02/kompilat_starten.jpg" alt="kompilat_starten" width="656" height="366" /></span></span></p>
<p><span style="color: #808000;"><span style="color: #000000;">Dies wäre ein typischer Vorgang beim Entwickeln unter Emacs/Distel. Zuerst den Code im Buffer eingeben (oder Teile davon) und dann schrittweise testen. Ferner bietet Distel auch die Möglichkeit an, bestimmte Code-Skeletons automatisch einzufügen. Hier ein Beispiel mit einem einfachen Server-Skeleton:</span></span></p>
<p><span style="color: #808000;"><span style="color: #000000;"><img class="alignnone size-full wp-image-351" title="small_server_skeleton" src="http://www.brakmic.de/wp-content/2009/02/small_server_skeleton.jpg" alt="small_server_skeleton" width="699" height="742" /></span></span></p>
<p><span style="color: #808000;"><span style="color: #000000;">Ein weiteres, äußerst nützliches Feature von Distel ist die Debugging-Funktionalität. Um diese zu nützen benötigt man neben einem geladenen Quellcode auch eine laufende Erlang-Shell. Sind diese vorhanden, wird aus dem Quellcode-Buffer (dieser muss über Buffer-Menü gewählt werden!)  eine Connection zur bereits gestarteten Shell aufgebaut. Dazu bedient man sich des folgenden Menüpunktes:</span></span></p>
<p><span style="color: #808000;"><span style="color: #000000;"><img class="alignnone size-full wp-image-353" title="conntect_to_node" src="http://www.brakmic.de/wp-content/2009/02/conntect_to_node.jpg" alt="conntect_to_node" width="656" height="366" /></span></span></p>
<p><span style="color: #808000;"><span style="color: #000000;"><em>Es ist natürlich auch möglich, all diese Optionen direkt über Tasktenkombinationen auszuwählen.</em> <img src='http://www.brakmic.de/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </span></span></p>
<p><span style="color: #808000;"><span style="color: #000000;">Direkt nachdem wir die Option aktiviert haben, werden wir nach dem Namen des Erlang-Nodes gefragt, welcher in der unten eingeblendeten Zeile eingegeben werden muss. Der Node-Name setzt sich immer aus <em>Node-Name@Maschinen-Name</em> zusammen. Am einfachsten ist es, sich über das Buffer-Menü zu vergewissern wie der Node heißt. Und falls wir mehrere haben, wählt man einen aus.<br />
</span></span></p>
<p><span style="color: #808000;"><span style="color: #000000;"><img class="alignnone size-full wp-image-354" title="node_eingeben" src="http://www.brakmic.de/wp-content/2009/02/node_eingeben.jpg" alt="node_eingeben" width="694" height="101" /></span></span></p>
<p><span style="color: #808000;"><span style="color: #000000;">Nachdem der Node konnektiert wurde, muss natürlich der Quellcode kompiliert werden, damit das Debugging auch einen Sinn macht. Jedoch werden wir diesmal nicht den Menüpunk <em>Erlang/Compile/Compile Buffer</em> wählen, sondern direkt über die Erlang-Shell kompilieren. Dies hat damit zu tun, dass wir für das Debugging zusätzliche Informationen in unserem Kompilat bereitstellen müssen (sog. Debug-Infos). Deswegen brauchen wird einen leicht erweiterten Kommandoaufruf in der Zeile. Wir wählen also die Erlang-Shell und geben Folgendes ein (&#8220;func1&#8243; wird natürlich nicht immer vorkommen müssen, sondern der Name eurer *.erl-Datei):</span></span></p>
<p><span style="color: #808000;"><span style="color: #000000;"><img class="alignnone size-full wp-image-360" title="compile_mit_debug_info1" src="http://www.brakmic.de/wp-content/2009/02/compile_mit_debug_info1.jpg" alt="compile_mit_debug_info1" width="695" height="216" /><br />
</span></span></p>
<p><span style="color: #808000;"><span style="color: #000000;"><br />
</span></span></p>
<p><span style="color: #808000;"><span style="color: #000000;">Danach müss das fertig kompilierte Modul neu geladen werden. Dies erfolgt über folgenden Menüpunkt:</span></span></p>
<p><span style="color: #808000;"><span style="color: #000000;"><img class="alignnone size-full wp-image-356" title="module_neu_laden" src="http://www.brakmic.de/wp-content/2009/02/module_neu_laden.jpg" alt="module_neu_laden" width="681" height="574" /></span></span></p>
<p><span style="color: #808000;"><span style="color: #000000;">Und auch hier muss der Name des Moduls in unten eingeblendeter Zeile eingegeben werden. Standardmäßig wird das aktuell kompilierte Modul vorgeschlagen, sodass man diesen nur noch bestätigen muss. Ist alles erfolgreich verlaufen, wird in der Zeile folgende Nachricht angezeigt (mit entsprechendem Modulnamen):</span></span></p>
<p><span style="color: #808000;"><span style="color: #000000;"><img class="alignnone size-full wp-image-357" title="module_neu_laden_ok" src="http://www.brakmic.de/wp-content/2009/02/module_neu_laden_ok.jpg" alt="module_neu_laden_ok" width="694" height="94" /></span></span></p>
<p><span style="color: #808000;"><span style="color: #000000;">Jetzt aktivieren wir das Debugging:</span></span></p>
<p><span style="color: #808000;"><span style="color: #000000;"><img class="alignnone size-full wp-image-358" title="debugging_aktivieren" src="http://www.brakmic.de/wp-content/2009/02/debugging_aktivieren.jpg" alt="debugging_aktivieren" width="844" height="609" /></span></span></p>
<p><span style="color: #808000;"><span style="color: #000000;">Ist alles gut verlaufen, meldet sich Emacs mit folgender Meldung zurück:</span></span></p>
<p><span style="color: #808000;"><span style="color: #000000;"><img class="alignnone size-full wp-image-361" title="interpreting_started" src="http://www.brakmic.de/wp-content/2009/02/interpreting_started.jpg" alt="interpreting_started" width="694" height="65" /></span></span></p>
<p><span style="color: #808000;"><span style="color: #000000;">Danach können wir in unserem Quellcode z.B. einen Breakpoint setzen, welcher dann zur Laufzeit die Abarbeitung anhalten wird. Dazu setzen wird den Cursor an die gewünschte Position und wählen diesen Menüpunkt aus:</span></span></p>
<p><span style="color: #808000;"><span style="color: #000000;"><img class="alignnone size-full wp-image-363" title="breakpoint_menu" src="http://www.brakmic.de/wp-content/2009/02/breakpoint_menu.jpg" alt="breakpoint_menu" width="694" height="574" /></span></span></p>
<p><span style="color: #808000;"><span style="color: #000000;">Automatisch wird die ausgesuchte Zeile rot markiert. Will man den Breakpoint entfernen, muss nur derselbe Menüpunkt gewählt werden (oder, wie immer, die passende Tastenkombination eingegeben werden).</span></span></p>
<p><span style="color: #808000;"><span style="color: #000000;"><img class="alignnone size-full wp-image-364" title="breakpoint_setzen1" src="http://www.brakmic.de/wp-content/2009/02/breakpoint_setzen1.jpg" alt="breakpoint_setzen1" width="695" height="397" /><br />
</span></span></p>
<p><span style="color: #808000;"><span style="color: #000000;"> Jetzt rufen wir die markierte Funktion in der Erlang-Shell auf. Direkt nachdem sie gestartet wurde, wird ein neuer Debug-Buffer aktiviert, in welchem die Infos zu unserem Breakpoint und seiner momentanen Ausführung aufgelistet sind.</span></span></p>
<p><span style="color: #808000;"><span style="color: #000000;"><img class="alignnone size-full wp-image-366" title="debug_konsole1" src="http://www.brakmic.de/wp-content/2009/02/debug_konsole1.jpg" alt="debug_konsole1" width="694" height="411" /></span></span></p>
<p><span style="color: #808000;"><span style="color: #000000;">Man sieht unten, dass noch kein Ergebnis der Funktion double(12) zurückgegeben worden ist. Dies ist ein Zeichen, dass die weitere Ausführung ab jetzt auch schrittweise erfolgen kann. Um den angezeiten Prozess manuell zu debuggen, positioniert man den Cursor auf die gewünschte Zeile (in diesemFalle ist es nur eine, was aber nicht immer sein muss). Dann drück man einmal auf ENTER und automatisch wechselt Emacs zum Quellcode genau an die Stelle wo das Debugging markiert wurde. Man erkennt es auch am grünen Pfeil direkt neben der Quellcode-Zeile. In der unteren Fensterhälfte sieht man den momentanen Status der eingesetzten Variablen (in diesem Falle ist X = 12, was unserer Eingabe beim Funktionsaufruf entspricht).<br />
</span></span></p>
<p><span style="color: #808000;"><span style="color: #000000;"><img class="alignnone size-full wp-image-367" title="in_debugging_mode" src="http://www.brakmic.de/wp-content/2009/02/in_debugging_mode.jpg" alt="in_debugging_mode" width="696" height="664" /><br />
</span></span></p>
<p><span style="color: #808000;"><span style="color: #000000;">Jetzt hat man die Wahl zwischen diesen Optionen, welche über die Tastatur eingegeben werden:</span></span></p>
<ul>
<li><strong>h</strong>: Anzeige verfügbarer Kommandos.</li>
<li><strong>q</strong>: Debug-Anzeige beenden (der gedebuggte Prozess wird aber nicht geschlossen)</li>
<li><strong>SPC</strong>: Nächster Schritt.</li>
<li><strong>n</strong>: Über den Ausdruck hinausgehen.</li>
<li><strong>u</strong>: Nach oben zum nächsten Stack-Frame.</li>
<li><strong>d</strong>: Nach unten zum nächsten Stack-Frame.</li>
<li><strong>c</strong>: Fortsetzen bis zum (eventuell) nächsten Breakpoint.</li>
<li><strong>b</strong>: Breakpoint auf der aktuellen Zeile setzen/entfernen.</li>
</ul>
<h3>Man sieht, dass eine schnelle und komfortable Entwicklung auch mit Erlang möglich ist. <img src='http://www.brakmic.de/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </h3>
<h3>Viel Spaß mit Erlang, Emacs &amp; Distel!</h3>
]]></content:encoded>
			<wfw:commentRss>http://www.brakmic.de/index.php/2009/02/22/komfortables-erlang-coding-mit-distel-und-emacs/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Erlang Einführung &#8211; Teil 2 &#8211; Funs / Higher Order Functions</title>
		<link>http://www.brakmic.de/index.php/2009/01/31/erlang-einfuhrung-teil-2-funs-higher-order-functions/</link>
		<comments>http://www.brakmic.de/index.php/2009/01/31/erlang-einfuhrung-teil-2-funs-higher-order-functions/#comments</comments>
		<pubDate>Sat, 31 Jan 2009 14:55:03 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Coding]]></category>
		<category><![CDATA[Erlang]]></category>
		<category><![CDATA[Standard]]></category>
		<category><![CDATA[Tutorials]]></category>
		<category><![CDATA[COP]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[tutorial]]></category>

		<guid isPermaLink="false">http://www.brakmic.de/?p=205</guid>
		<description><![CDATA[Leider habe ich viel zu lange auf den zweiten Teil der Einführung in Erlang warten lassen. Und bevor ich überhaupt mit Ausreden anfange, fange ich lieber mit ganz konkreten Beispielen an.
Gegeben ist folgender Quellcode, welcher ein Programm zum Berechnen des Quadrats einer beliebigen Zahl bildet:

Das Programm besteht aus zwei Teilen, den Modulattributen und Funktionen.
Modulattribute sind [...]]]></description>
			<content:encoded><![CDATA[<p>Leider habe ich viel zu lange auf den zweiten Teil der Einführung in Erlang warten lassen. Und bevor ich überhaupt mit Ausreden anfange, fange ich lieber mit ganz konkreten Beispielen an.</p>
<p>Gegeben ist folgender Quellcode, welcher ein Programm zum Berechnen des Quadrats einer beliebigen Zahl bildet:</p>
<p><a href="http://www.brakmic.de/wp-content/2009/01/func1_code1.jpg"><img class="alignnone size-full wp-image-213" title="func1_code1" src="http://www.brakmic.de/wp-content/2009/01/func1_code1.jpg" alt="" width="500" height="350" /></a></p>
<p>Das Programm besteht aus zwei Teilen, den Modulattributen und Funktionen.<br />
Modulattribute sind in diesem Falle <strong>-module(func1)</strong> und <strong>-export([double/1])</strong>.</p>
<p>Modulattributen können sowohl vom Entwickler selbst definiert, wie auch aus einem Satz von Standardvorgaben eingesetzt werden.<br />
Die Attribute <strong>-module</strong> und <strong>-export</strong> gehören zum Erlang-Standard, wobei <strong>-module</strong> zwingend ist, während <strong>-export</strong> nur dann eingesetzt werden sollte, wenn man bestimmte Funktionen für den Zugriff von Außen freigeben möchte. In diesem Falle ist es die Funktion <em>double</em>, die z.B. von der Erlang-Shell aus aufgerufen werden soll. Jede Erlang-Quelldatei muss eine Angabe über den aktuellen Modulnamen tragen und zwar innerhalb der Klammern des Attributen <strong>-module</strong>. Somit ist der Name der *.erl-Datei gleichzeitig auch der Name des Moduls. Nachdem dieses beispielsweise über den Aufruf <strong>c(MODULNAME).</strong> in der Shell kompiliert worden ist, wird eine neue Bytecode-Datei namens <em>MODULNAME.beam</em> angelegt. Und genau diese ist für die eigentliche Ausführung in der Erlang Virtual Machine gedacht. Dies ist mit Java *.class-Dateien vergleichbar, die aus gewöhnlichen *.java-Dateien gebildet werden, um dann in der JVM als Bytecode ausgeführt zu werden. Und wie bei sonstigen Erlang-Anweisungen auch, müssen diese beiden Attribute mit einem Punkt abgeschlossen werden.</p>
<p>Jedoch sollte noch geklärt werden, was die Angabe [double/1] zu bedeuten hat. Nun, da Funktionen mehrere Argumente akzeptieren können und in mehrfacher Ausführung vorhanden sein dürfen (d.h. mit gleichem Funktionsnamen, jedoch unterschiedlicher Anzahl von erwarteten Argumenten), ist die Angabe des Funktionsnames zusammen mit Slash + Zahl für die Anzeige der &#8220;Stelligkeit&#8221; (engl. &#8220;Arity&#8221;) einer Funktion notwendig. Mit &#8220;Stelligkeit&#8221; ist hier die Anzahl der &#8220;erwarteten Argumenten-Stellen&#8221; gemeint. Da unsere double-Funktion nur ein Argument erwartet, nämlich X, ist ihre Stelligkeit &#8220;eins&#8221; (1). Hätten wir z.B. weitere <em>double</em>-Funktionen, so müssten sich diese in der Stelligkeit voneinander unterscheiden, um von Erlang akzeptiert zu werden.</p>
<p>Nachdem wir mit Attributen dem Compiler die Umgebung vorgestellt haben, widmen wir uns der Funktion <em>double</em>. Sie besteht, nach Erlang-Terminologie, aus einem <strong>Head</strong>und einem <strong>Body</strong>. Zwischen diesen befindet sich ein stilisierter Pfeil, der vom Head auf den Body zeigt. Der Head ist dabei immer mit einem Funktionsnamen gefolgt von einem Klammerpaar und (optional) mit einer Argumentenliste innerhalb dieser versehen. Dabei werden mehrere Argumente durch Kommata voeinander getrennt. Als Argumente können sowohl Variablen wie auch Atome eingesetzt werden. Mit &#8220;Atome&#8221; sind konstante, nicht-numerische Werte gemeint, welche immer mit einem Kleinbuchstaben beginnen (im Gegensatz zu Variablen, welche immer mit einem Großbuchstaben anfangen). In unserem Falle kann <em>double </em>einen beliebigen Wert annehmen, welcher dann im Body mit sich selbst multipliziert wird. Und auch hier ist am Ende ein Punkt zu setzen.</p>
<p>Die Kompilierung des Programms ist denkbar einfach: Erlang-Shell starten und mit <strong>c(func1).</strong> die <em>func1.erl</em>-Datei kompilieren. Als Ergebnis erhält man ein sog. Tupel, welches aus dem Namen des Moduls und einem Atom &#8220;ok&#8221; besteht. Somit hat uns Erlang-Umgebung die Info geliefert, dass die Kompilierung erfolgreich verlaufen ist.</p>
<p><a href="http://www.brakmic.de/wp-content/2009/01/func1_compile_output.jpg"><img class="alignleft size-full wp-image-210" title="func1_compile_output" src="http://www.brakmic.de/wp-content/2009/01/func1_compile_output.jpg" alt="" width="776" height="297" /></a></p>
<p>Da ich lokal das Ganze über Emacs laufen lasse, schaut bei mir die Ausgabe vielleicht etwas komplexer aus, als sie vielleicht sein sollte. Dennoch ist die Vorgehensweise dieselbe.</p>
<p>Jetzt können wir die exportierte Funktion <em>double </em>aufrufen. Dabei übergeben wir ihr den erwarteten Zahlenwert.</p>
<p><a href="http://www.brakmic.de/wp-content/2009/01/func1_double.jpg"><img class="alignleft size-full wp-image-211" title="func1_double" src="http://www.brakmic.de/wp-content/2009/01/func1_double.jpg" alt="" width="778" height="327" /></a></p>
<p>Als Ergebnis erhalten wir <strong>144</strong>, was dem Quadrat von <strong>12 </strong>entspricht. Der Aufruf selber ist recht einfach und erinnert entfernt an das Programmieren in C++, wenn es darum geht, die einzelnen Methoden den passenden Klassen/Namespaces zuzuordnen. In C++ wird die Zuordnung über sog. &#8220;<em>Bereichsauflösungsoperatoren</em>&#8221; erledigt (d.h. mit <strong>KLASSE::METHODE</strong>). Ähnlich wird auch bei Erlang verfahren, z.B. wenn es darum geht, die passende Funktion eines Moduls aufzurufen. Da es wohl recht viele &#8220;double&#8221;-Funktionen geben darf, muss sichergestellt werden, dass sowohl die richtige aufgerufen, wie auch die passende &#8220;Stelligkeit&#8221; befolgt wird. Es sind also zwei Sachen zu beachten: die passende Funktion über (optional viele) Module hinweg und dann noch die Funktion mit der gewünschten Stelligkeit (&#8220;Arity&#8221;) innerhalb eines Moduls. Hier ein leicht erweitertes Beispiel mit unserem bisherigen Modul.</p>
<p><a href="http://www.brakmic.de/wp-content/2009/01/func1_double_arity.jpg"><img class="alignnone size-full wp-image-214" title="func1_double_arity" src="http://www.brakmic.de/wp-content/2009/01/func1_double_arity.jpg" alt="" width="754" height="502" /></a></p>
<p>Jetzt beinhaltet unser Modul eine weitere Version der <em>double</em>-Funktion. Diesmal ohne Argumente, d.h. mit Stelligkeit Null (0). Über diese Änderung muss auch der Compiler informiert werden, sofern wir vor haben, eine weitere Funktion zu exportieren. Daher wird die Liste in <strong>-export</strong> um einen Eintrag mehr erweitert. Die Listen werden in Erlang übrigens immer mit eckigen Klammern angegeben und ihre Elemente durch Kommata voneinander getrennt. In diesem Falle wäre es <strong>[double/0,double/1]</strong>. Nachdem wir die neue Modulversion kompiliert haben (in der unteren Fensterhälfte zu sehen), wird die neue <em>double</em>-Funktion aufgerufen (diesmal mit leeren Klammern, aber immer zusammen mit dem Modulnamen). Als Ergebnis erhält man <strong>4</strong>, was genau den Vorgaben im Funktions-Body entspricht. So einfach kann Erlang sein. <img src='http://www.brakmic.de/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Das ist aber nicht alles, denn in Erlang können Funktionen mehr als nur Werte zurückgeben und in mehrfacher Ausführung gleichzeitig vorhanden sein. In Erlang können Funktionen auch neue Funktionen als Ergebnis zurückgeben.</p>
<p>Noch einmal, zur Wiederholung: Funktionen können in Erlang neue Funktionen als Ergebnis zurückgeben. Oder Erlang-like ausgedrückt: wir können &#8220;higher-order-functions&#8221; basteln.</p>
<p>Hier ein kleines Beispiel:</p>
<p><a href="http://www.brakmic.de/wp-content/2009/01/multiply_shell_code.jpg"><img class="alignnone size-full wp-image-215" title="multiply_shell_code" src="http://www.brakmic.de/wp-content/2009/01/multiply_shell_code.jpg" alt="" width="658" height="402" /></a></p>
<p>Wir haben eine Variable <em>Multiply</em>, welche keinen direkten Wert zugewiesen bekommt, sondern vielmehr ein zunächst sonderbares Konstrukt:</p>
<p><strong>fun(X,Y) -&gt; 3 * (X + Y) end.</strong></p>
<p>Was meint man damit?</p>
<p>Nun, die Bezeichnung <strong>fun</strong> habe ich mir, schon mal im Voraus, nicht ausgedacht, denn diese gehört zum Sprachumfang von Erlang. Dabei meinen wir mit dem Einsatz von <strong>fun</strong>, dass hier eine neue Funktion mit <strong>3 * (X + Y) end.</strong> aufgebaut werden sollte. Dies bedeutet, dass wir in <strong>fun(X,Y)</strong> die Elemente eingesetzt haben wollen, welche später (im Funktions-Body) an die Stellen zum Einsatz kommen werden, wo jetzt <strong>3 * (X + Y) end.</strong> steht, um einen neuen Wert zu berechnen. Somit steht Multiply stellvertretend für eine dahinter &#8220;eingebettete&#8221; Funktion, welche eben zwei Werte erwartet und nach einem bestimmten Algorithmus (hier: 3 * (X + Y)) rechnet. Diese &#8220;innere&#8221; Funktion wird auch durch das spezielle Schlüsselword end. auch explizit beendet. Ein fun wird immer mit einem end. abgeschlossen, damit Erlang diese richtig zuordnen und bei Bedarf auch &#8220;als Rückgabe-Wert&#8221; liefern kann.</p>
<p>Deshalb ist die Shell-Info beim ersten, oben abgebildeten Aufruf eben kein <em>berechneter</em> Wert, sondern vielmehr eine Erlang-Info die mit <strong>#Fun&lt;erl_eval </strong>anfängt. Diese recht kryptische Ausgabe sollte aber niemanden verwirren, denn es handelt sich nur um Erlang-Internals, die für die Entwicklung selbst unerheblich sind. Wichtig ist nur zu wissen, dass damit Erlang zu verstehen gibt, dass es die Vorgaben <em>evaluiert</em> hat und in Zukunft überall dort wo <em>Multiply </em>steht eben diesen Algorithmus aktivieren wird. Ein simples Aufrufen von <em>Multiply(3,3)</em> gibt 18 aus und somit ist die Abarbeitung erfolgreich verlaufen. Für alle Entwickler die schon mal mit anonymen Funktionen zu tun hatten: &#8220;<em>ja, dies sind anonyme Funktionen in Erlang</em>&#8220;, was an sich kein Wunder ist, da anonyme Funktionen aus der funktionalen Programmierung kommen und Erlang eben &#8220;so ziemlich&#8221; funktional ist. <img src='http://www.brakmic.de/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p>Dies ist aber auch nicht alles, denn mit funs kann man noch viel mehr machen, wie in diesem Beispiel hier:</p>
<p><a href="http://www.brakmic.de/wp-content/2009/01/moremultiply_shell_code.jpg"><img class="alignnone size-full wp-image-216" title="moremultiply_shell_code" src="http://www.brakmic.de/wp-content/2009/01/moremultiply_shell_code.jpg" alt="" width="726" height="475" /></a></p>
<p>Hier haben wir einen weiteren <em>Level-Of-Indirection</em> eingebaut und eine <strong>fun </strong>deklariert, die wiederum eine weitere <strong>fun </strong>beinhaltet. Um die Verwirrung aber schon zu Anfang zu ersticken, fangen wir ganz langsam an und schauen uns die einzelnen Bestandteile genauer an:</p>
<p><em>MoreMultiply </em>bekommt Folgendes zugewiesen: <strong>fun(HowMuch) -&gt; (EINE WEITERE FUN EINGEBETTET)</strong></p>
<p>Wie wir schon im ersten Beispiel erfahren haben, können Variablen eingebettete <em>funs </em>beinhalten. Hier aber befindet sich aber in der ersten <em>fun</em> <strong>fun(HowMuch)</strong> eine weitere <em>fun</em>, welche wir aus Gründen der Übersichtlichkeit nicht aufgeschrieben haben.</p>
<p>Was hat dies zu bedeuten?</p>
<p>Ganz einfach: die erste <em>fun </em>(nennen wir diese &#8220;die äußere&#8221;) erwartet ein Argument, welcher dann in der zweiten (der &#8220;inneren&#8221;) <em>fun </em>eingebettet wird. Die innere <em>fun </em>beinhaltet aber mehr als nur die Variable <strong>HowMuch</strong>, nämlich <strong>Value * HowMuch</strong>. Dies bedeutet, dass die innere <em>fun </em>erst gar nicht rechnen könnte, wenn die äußere <em>fun </em>keinen Wert an sie liefern würde. Und genau hier liegt die Bedeutung in dieser scheinbar unnötig komplexen Verzahnung. Die innere <em>fun </em>ist nämlich eine <strong>VERALLGEMEINERTE </strong>Ausführung eines einfachen Multiplikators, welcher aber eben nicht selber vorgibt, wie eines seiner Elemente multipliziert wird. Die <strong>SPEZIALISIERUNG </strong>also, in diesem Falle die Angabe <strong>HowMuch </strong>kommt aus der äußeren <em>fun</em>. Somit ist die Arbeitsteilung klar: die äußere <em>fun </em>sagt, wer der Multiplikator ist und die innere benutzt diesen dann, um kommende Werte (d.h. <strong>Value</strong>) mit ihm zu multiplizieren. Deshalb ist der Rückgabewert von <strong>MoreMultiply </strong>eben nicht ein berechnter Wert, sondern vielmehr eine der vielen möglichen <span style="text-decoration: underline;">Spezialisierungen </span>der inneren <em>fun</em>. Und erst mit dieser zurückgegebenen Spezialisierung können Berechnungen durchgeführt werden. So wie im Beispiel oben. Und auch hier meldet sich zuerst die Erlang-Shell und gibt die Erfolgsmeldung aus, dass die Evaluierung OK sei. Danach weisen wir einer neuen Variable die von uns gewünschte Spezialisierung zu (der Name der Variable sollte sinnvollerweise die Spezialisierung dokumentieren). In diesem Falle haben wir uns entschieden, dass die innere <em>fun </em>alle zukünftigen Werte mal 2 nehmen soll. Daher auch die Angabe <strong>MoreMultiply(2)</strong>. Jetzt können wir die in <strong>MakeDouble</strong> abgelegte (innere) <em>fun </em>anwenden und geben eine 5 ein. Das Ergebnis ist erst jetzt mathematischer Natur und heißt 10.</p>
<p>Eigentlich einfach, nur es braucht Zeit, bis man sich vom alltäglichen Schema <strong>WERTEINGABE -&gt; BERECHNUNG -&gt; AUSGABE</strong> befreit hat. Hier wird eben <strong>ALGORITHMUSAUFBAU -&gt; WERTEINGABE -&gt; BERECHNUNG -&gt; AUSGABE</strong> angewandt. Wir basteln uns zuerst den Algorithmus zusammen und setzen ihn erst später ein. Fast so wie mit Möbeln bei Ikea <img src='http://www.brakmic.de/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p>So, das war&#8217;s für heute. Viel Spaß mit Erlang.</p>
<p><a href="http://www.brakmic.de/wp-content/2009/01/func1_double_arity.jpg"><br />
</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.brakmic.de/index.php/2009/01/31/erlang-einfuhrung-teil-2-funs-higher-order-functions/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>An Introduction to Erlang &#8211; bei Onlamp</title>
		<link>http://www.brakmic.de/index.php/2009/01/27/an-introduction-to-erlang-bei-onlamp/</link>
		<comments>http://www.brakmic.de/index.php/2009/01/27/an-introduction-to-erlang-bei-onlamp/#comments</comments>
		<pubDate>Tue, 27 Jan 2009 19:05:58 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Coding]]></category>
		<category><![CDATA[Erlang]]></category>
		<category><![CDATA[Tutorials]]></category>
		<category><![CDATA[COP]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[tutorial]]></category>

		<guid isPermaLink="false">http://www.brakmic.de/?p=198</guid>
		<description><![CDATA[These days, the functional languages are all the rage. You see more and more hackers from the traditionally vanilla languages trying out things like Haskell or Scheme or OCaml. Breaking away from an imperative tradition forces us to think in a different way, which is always a good thing.
Recently, I&#8217;ve heard a lot about Erlang, [...]]]></description>
			<content:encoded><![CDATA[<p><em>These days, the functional languages are all the rage. You see more and more hackers from the traditionally vanilla languages trying out things like Haskell or Scheme or OCaml. Breaking away from an imperative tradition forces us to think in a different way, which is always a good thing.</p>
<p>Recently, I&#8217;ve heard a lot about Erlang, especially from curious members of the Ruby community. This article is the result of my quick dive into the language, and will hopefully serve as a starting point for anyone else who&#8217;s been hearing the buzz, but hasn&#8217;t taken the plunge yet.</em></p>
<p><a href="http://www.onlamp.com/pub/a/onlamp/2007/09/13/introduction-to-erlang.html?page=1">ONLAMP TUTORIAL</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.brakmic.de/index.php/2009/01/27/an-introduction-to-erlang-bei-onlamp/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Erlang &#8211; Tutorial &#8211; Lennart Öhman</title>
		<link>http://www.brakmic.de/index.php/2009/01/20/176/</link>
		<comments>http://www.brakmic.de/index.php/2009/01/20/176/#comments</comments>
		<pubDate>Tue, 20 Jan 2009 10:07:37 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Coding]]></category>
		<category><![CDATA[Erlang]]></category>
		<category><![CDATA[concurrency]]></category>
		<category><![CDATA[COP]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[tutorial]]></category>
		<category><![CDATA[video]]></category>

		<guid isPermaLink="false">http://www.brakmic.de/?p=176</guid>
		<description><![CDATA[The programming language Erlang, new if even known at all to most computer programmers, secretly celebrates its 20th birthday year 2007. Erlang was developed with goals such as high-availability, &#8220;prototypeability&#8221;/maintainability and scalability over an at design time unknown number of CPUs. All goals are still challenges in software development. The scalability property has however reached [...]]]></description>
			<content:encoded><![CDATA[<p><span id="long-desc" style="display: inline;">The programming language Erlang, new if even known at all to most computer programmers, secretly celebrates its 20th birthday year 2007. Erlang was developed with goals such as high-availability, &#8220;prototypeability&#8221;/maintainability and scalability over an at design time unknown number of CPUs. All goals are still challenges in software development. The scalability property has however reached another dimension due to the past few years development in the field of common and affordable multi core processors. This talk will cover the history of Erlang, demonstrate major design goals with a few programming examples and also touch on the subject of the future of Erlang. The speaker, Mr Lennart Ohman, has been working with Erlang since 1992 in different positions. Amongst many things Mr Ohman was actively involved in the development of the OTP framework, which is an architecture framework for Erlang based software. At present he is managing director of the consultancy company Sjöland &amp; Thyselius Telecom AB.</span></p>
<p><object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="728" height="120" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="id" value="VideoPlayback" /><param name="src" value="http://video.google.com/googleplayer.swf?docid=240707194662243675&amp;hl=de&amp;fs=true" /><embed id="VideoPlayback" type="application/x-shockwave-flash" width="500" height="500" src="http://video.google.com/googleplayer.swf?docid=240707194662243675&amp;hl=de&amp;fs=true"></embed></object></p>
]]></content:encoded>
			<wfw:commentRss>http://www.brakmic.de/index.php/2009/01/20/176/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Erlang &#8211; Einführung</title>
		<link>http://www.brakmic.de/index.php/2008/10/11/erlang-einfuhrung/</link>
		<comments>http://www.brakmic.de/index.php/2008/10/11/erlang-einfuhrung/#comments</comments>
		<pubDate>Sat, 11 Oct 2008 22:11:25 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Coding]]></category>
		<category><![CDATA[Erlang]]></category>
		<category><![CDATA[Tutorials]]></category>
		<category><![CDATA[beispiele]]></category>
		<category><![CDATA[computer]]></category>
		<category><![CDATA[concurrency]]></category>
		<category><![CDATA[einfuehrung]]></category>
		<category><![CDATA[information]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[tutorial]]></category>
		<category><![CDATA[tutorium]]></category>

		<guid isPermaLink="false">http://www.brakmic.de/index.php/2008/10/11/erlang-einfuhrung/</guid>
		<description><![CDATA[Erlang ist eine mehrzweck (general-purpose) Programmierspache, welche vor allem das Paradigma der Nebenläufigkeit (Concurrency) implementiert. Ferner ist sie stark von der funktionalen Programmierung beeinflusst worden, wobei man hier aber nicht sagen kann, dass es sich bei Erlang um eine rein funktionale Sprache handelt. Um sich von allgegenwärtigen OO-Sprachen abzugrenzen, wird der Begriff der &#8220;Concurrency Oriented [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://de.wikipedia.org/wiki/Erlang_(Programmiersprache)">Erlang</a> ist eine mehrzweck (general-purpose) Programmierspache, welche vor allem das Paradigma der <a href="http://de.wikipedia.org/wiki/Nebenl%C3%A4ufigkeit">Nebenläufigkeit (Concurrency)</a> implementiert. Ferner ist sie stark von der funktionalen Programmierung beeinflusst worden, wobei man hier aber nicht sagen kann, dass es sich bei Erlang um eine rein funktionale Sprache handelt. Um sich von allgegenwärtigen OO-Sprachen abzugrenzen, wird der Begriff der &#8220;Concurrency Oriented Programming Language&#8221; gebraucht, um den Fokus auf die Entwicklung von nebenläufigen, oft auf mehrere Prozessoren oder gar Netzwerke verteilten Applikationen zu betonen. Was Objekte für OO-Sprachen wie C++, Java oder C# sind, sind Prozesse für Erlang. Jedoch sind Prozesse in der Erlang-Welt nicht mit OO-Prozessen bzw. &#8220;Threads&#8221; zu vergleichen. So gibt es in Erlang kein Shared Memory und Locks sind auch nicht vorhanden. In Erlang läuft so ziemlich alles anders ab. So sind auch Variablen auch nicht so sehr &#8220;variabel&#8221;, wie man es von anderen Sprachen gewohnt ist. Auch was den allgemeinen Aufbau der Sprache angeht, so schaut man beim ersten Male fast wirklich &#8220;in die Röhre&#8221;, wenn man so eine erl-Datei in den Editor geladen hat.</p>
<p>Um den Schrecken aber nicht allzu sehr zu steigern (denn schließlich sollen ja paar Leute dieses Tutorial lesen), kümmern wir uns erst einmal um die Einrichtung der Erlang-Umgebung. Vergleichbar mit der JVM für Java oder .NET für C#, muss auch für Erlang bestimmte Vorarbeit geleistet werden, um an die Sprache (und den ganzen Rest) ranzukommen. Denn Erlang ist nicht nur eine Sprache, sondern auch eine Laufzeitumgebung (so ähnlich wie JVM oder .NET) wie auch eine Bibliothek. Da diese Dreigliedrigkeit aber eine recht hohe Komplexität in sich birgt, werden wir uns Schritt für Schritt der Programmiersprache Erlang nähern und mittels Erlang-Shell die <em>Laufzeitumgebung Erlang</em> kennenlernen, wie auch die <em>Erlang-Bibliothek</em>.</p>
<p>Die erste Anlaufstelle für Erlang/OTP is <a href="http://www.erlang.org" target="_blank">www.erlang.org</a> (ja, eigentlich heißt es nicht bloß &#8220;Erlang&#8221;, sondern immer <strong>Erlang/OTP</strong>&#8230;Erklärung kommt später noch). Dort geht man auf Downloads und lädt sich die entsprechenden Binaries (es gibt sie für verschiedene Systeme, in diesem Tutorial wird Win32-Version eingesetzt). Die Installation wird per Installer durchgeführt und bereitet keinerlei Schwierigkeiten. Wer auf Linux-Version setzt, kann z.B. unter Debian (oder auch Ubuntu) mit einem einfachen <em>apt-get install erlang </em>die ganzen Binaries holen. Wer zuerst das ganze System lokal kompiliert haben möchte, muss mehrere Schritte gehen:</p>
<p><em><strong>$</strong> tar -xzf otp_src_R12B-4.tar.gz<br />
<strong>$</strong> cd otp_src_R12B-4<br />
<strong>$</strong> ./configure<br />
<strong>$</strong> make<br />
<strong>$</strong> sudo make install</em></p>
<p>Bei der Installation unter Windows wird man folgendes Fenster zu sehen bekommen:</p>
<p><img src="http://brakmic.de/images/erlang/install_1.jpg" /></p>
<p>Erlang-Installer erkennt automatisch, ob bestimmte DLLs bereits unter Windows vorhanden sind.</p>
<p>Danach geht es weiter zum Einrichten des Install-Verzeichnisses.</p>
<p><img src="http://brakmic.de/images/erlang/install_2.jpg" /></p>
<p>Noch den Menüeintrag setzen und mit der Installation kann begonnen werde.</p>
<p><img src="http://brakmic.de/images/erlang/install_3.jpg" /></p>
<p>Die wichtigste Schnittstelle zu Erlang ist sicherlich die Erlang-Shell, welche von der Kommandozeile aus per <em>erl.exe</em> aufgerfuen wird. Es existiert auch eine eigenständige Shell-Applikation, die über Windows-Menüs aufgerufen werden kann (<em>werl.exe</em>). Um ein ordentliches Arbeiten innerhalb der DOS-Konsole zu gewährleisten, sollte die PATH-Variable unter Windows um den Pfad zum Erlang-BIN-Verzeichnis gesetzt werden (z.B. C:/Programme/erl5.6.4/bin).</p>
<p><img src="http://brakmic.de/images/erlang/werl_1.jpg" /></p>
<p>Wie man unschwer erkennen kann, ist meine Shell etwas &#8220;gesprächiger&#8221; als erwartet, da hier einige Verzeichnisse zusätzlich ausgegeben wurden. Dies liegt an der Anpassung einer speziellen <strong>.erlang</strong> Datei aus dem <em>usr</em>-Verzeichnis der Erlang-Installation. Diese Datei benutze ich vor allem, um eigene Quellcode-Verzeichnisse der Erlang-Shell bekannt zu machen. So muss ich dann bei der Kompilierung von der Shell aus keine langen Pfadangaben machen. Zusätzlich habe ich der <em>.erlang</em>-Datei die Pfadangabe einiger Emacs-Module angehängt (diese werden aber jetzt (noch) übersprungen). Erlang ist schon ungewöhnlich genug. Wenn ich jetzt noch mit Emacs anfangen würde, dann würde das Tutorial wirklich niemand mehr lesen wollen <img src='http://www.brakmic.de/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p>Eine mögliche <em>.erlang</em>-Datei könnte bspw. so ausschauen:</p>
<p><strong>io:format</strong>(&#8220;Lese .erlang aus ~p~n~n&#8221;,<br />
[element(2, <strong>file:get_cwd()</strong>)]).<br />
<em>% Erlang Code Path</em><br />
<strong>io:format</strong>(&#8220;Wechsle ins &#8220;).<br />
<strong>c:cd</strong>(&#8220;K:/desk/eigene/Codes/erlang&#8221;).<br />
<strong>io:format</strong>(&#8220;\nQuellcodes sind in ~p~n~n&#8221;, [element(2, <strong>file:get_cwd()</strong>)]).</p>
<p>Hier wird eine Ausgabe getätigt (<em>io:format</em>) inklusive der Information zum Verzeichnis, in welchem sich <em>.erlang</em> befindet (<em>file:get_cwd()</em>).  Danach wechselt die Shell mit <em>c:cd()</em> ins Quellcode-Verzeichnis und gibt wieder eine Information per <em>io:format</em> aus. Wie man merkt, sind einige der Sachen schon &#8220;bekannt&#8221; und erinnern sehr stark an bekannte DOS oder POSIX-Kommandos. Dennoch werden wir nicht von diesen Befehlen aus die Sprache Erlang anfassen und widmen uns lieber der Shell und ihren Besonderheiten. Denn, wer Erlang programmieren will, der macht es zuerst über die Shell. Es bringt bei Erlang wirklich nicht viel, wenn man sich auf irgendwelche Codes stürzt, diese schnell &#8220;mal eben&#8221; in irgendeinen Editor eingibt und dann versucht zu kompilieren. Erstens, es würde nicht einfach so gehen, denn selbst der Erlang-Compiler will von der Shell aus bedient werden (zumindest für den Anfang) und zweitens ist Erlang an einigen Stellen derart besonders, dass diese abgetippten Programme eh nicht verstanden werden könnten, selbst wenn sie zum Laufen gebracht worden wären. Also, ab zur Shell, ein paar Befehle eingeben:</p>
<p><img src="http://brakmic.de/images/erlang/werl_2.jpg" /></p>
<p>So, in der ersten Zeile haben wir 10 + 100, dann eine weitere Zeile mit einem Punkt und dann dahinter das Ergebnis 110. Was hat das zu bedeuten? Ganz einfach zwei Dinge: in Erlang kann man direkt rechnen, ohne viele Umwege (also nix da mit <em>int x = 10; int y = 100; int ergebnis = x + y;</em>). Und was die Befehlsfolge angeht, so muss jede Anweisung mit einem Punkt enden, damit sie auch richtig interpretiert werden kann. Daher tat die Maschine nichts, als wir 100 eingegeben haben, denn es gab (noch) keinen <em>Abschlusspunkt</em>! Beim zweiten Versuch mit gleichen Operanden sehen wir, dass es sofort zum Ergebnis kommt. Das ist aber noch nicht die Welt und an sich auch keine Überraschung, denn auch andere Sprachen können &#8220;sowas&#8221; <img src='http://www.brakmic.de/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p>Übrigens, vorangegangene Befehle können in der Erlang-Shell einfach mit den Pfeiltasten wieder hervorgeholt werden.  Oder aber mit Emacs-Befehlen (<em>CTRL+P</em>,<em> CTRL+N</em>). Im Allgemeinen ist das Editorsystem Emacs sehr empfehlenswert, wenn man mit Erlang zu tun hat. So existieren einige sehr gute Module für Erlang (mit Debugging-Möglichkeiten, Shell-Integration etc.). Jedoch kann z.Zt. auf Emacs verzichtet werden, da wir noch lernen, mit Erlang zu gehen. Fliegen werden wir (hoffentlich) später. Jetzt geben wir Folgendes in Erlang ein und tauchen so langsam in die seltsame Welt ein:</p>
<p><img src="http://brakmic.de/images/erlang/werl_3.jpg" /></p>
<p>Wie wir sehen, muss bei Variablendeklaration kein expliziter Datentyp angegeben werden. Denn Erlang ist eine dynamisch getypte Sprache und somit entfällt das Vorgeben der zu erwarteten Datentypen.  Jedoch ist dies nicht die ganze Wahrheit, denn passt jetzt auf, was passiert, wenn man versucht, der angeblichen &#8220;Variablen&#8221; <em>VariableX </em>einen neuen Wert zuzuweisen.</p>
<p><img src="http://brakmic.de/images/erlang/werl_4.jpg" /></p>
<p>Da meldet sich die Shell mit der Info, dass Werte nicht übereinstimmen! Aber, wir wollten doch nicht <em>vergleichen</em>, sondern <em>zuweisen</em>. Was ist denn hier passiert? Eigentlich ist die Erklärung ganz einfach zu verstehen, es sei den, man hat ein Leben lang nur mit &#8220;gewöhnlichen&#8221; Sprachen zu tun gehabt. Also, das Gleichheitszeichen ist kein Zuweisungsoperator, nicht einmal beim ersten Male, als <em>VariableX = 10</em>. stand. Nein, es gibt keine eigentlichen Zuweisungen in Erlang, denn auch die <em>VariableX </em>ist keine Variable, da man ihren Wert nicht wie bei vielen anderen Sprachen beliebig ändern kann. Vielmehr ist Erlang beim Interpretieren von Anweisungen an &#8220;Pattern Matching&#8221; angelehnt. D.h., dass beim ersten Male die Shell eben den Wert auf der rechten Seite (10) dem <em>Pattern </em>VariableX gleichgesetzt hat (oder in der Erlang-Terminologie &#8220;<em>variable was bound</em>&#8220;). In Erlang gibt es also nur <em>gebundene </em>und <em>ungebundene </em>Variablen. Alles andere entfällt. Deshalb gab es auch beim zweiten Versuch eine Fehlermeldung, weil eine gebundene Variable vor einen neuen Wert gesetzt wurde und gemäß Pattern Matching dieser Ausdruck als <em>unwahr </em>zu gelten hatte. Und das ist wiederum der Grund für die auf den ersten Blick seltsame Fehlermeldung, die besagt, dass der rechtsseitige Wert keine Entsprechung auf der linken Seite hatte. Dies ist sicherlich eine der wichtigsten (und wohl auch ungewöhnlichsten) Eigenschaften von Erlang. Variablen sind nämlich viel mehr den mathematischen Variablen ähnlich (so wie wir es eben in der Schule gelernt haben) und Operatoren wie das Gleichheitszeichen sind wirklich zum Vergleichen da und nicht für die gewohnte Wertezuweisung. Also, verkürzt: es gibt nur ungebundene und gebundene Variablen und alles wird per Pattern-Matching (<em>Musterüberprüfung</em>) erledigt. Und da Mathematik in ihrer abstraktesten Definition nichts anderes als die &#8220;Wissenschaft von Mustern&#8221; sei, ist es wohl mehr als logisch, dass mathematisch-orientierte Erlang-Variablen eben nach &#8220;Musterüberprüfung&#8221; verarbeitet werden und nicht durch stumpfe Wertezuweisung. In der Tat ist jede Erlang-Variable nichts anderes als ein gewöhnliches Pattern (&#8220;Muster&#8221;) und dementsprechend geht der Erlang-Interpreter so vor, wenn er zum ersten Mal auf einen Ausdruck wie z.B. <em>VariableX = 10</em>. stößt:</p>
<p>MUSTER &#8220;VariableX&#8221; erkannt, jedoch ist &#8220;VariableX&#8221; noch UNGEBUNDEN.</p>
<p>Setze MUSTER &#8220;VariableX&#8221; in VERBINDUNG zu 10, weil ein GLEICHHEITSZEICHEN zwischen diesen beiden steht.</p>
<p>Kommt es später zu einem neuen Pattern wie <em>VariableX = 200.</em>, gibt es sofort eine Fehlermeldung, da eben das zuvor erkannte Muster nicht mehr auf diesem neuen abgebildet werden kann. Würdet ihr jetzt aber noch einmal VariableX = 10. eingeben, so gäbe es keine Fehlermeldung, sondern bloß die Ausgabe 10. D.h. das erste Muster ist als wahr erkannt worden.</p>
<p><img src="http://brakmic.de/images/erlang/werl_5.jpg" /></p>
<p>So, das wär&#8217;s dann für&#8217;s Erste und ich hoffe, dass ein paar von euch dabei geblieben sind und tatsächlich diese abschließenden Worte lesen. Ganz zu Anfang dieses ersten Tutorials versprach ich zu erklären, was <strong>Erlang/OTP</strong> bedeutet. Ganz einfach: OTP steht für &#8220;<em>The Open Telecommunication Platform</em>&#8221; und stammt aus den Laboren der Firma Ericsson, welche auch die Sprache Erlang entwickelt hat. OTP ist eine spezielle Middleware mit dem Fokus auf den Aufbau von verteilten, hochverfügbaren Systemen. Dies bedeutet, dass Erlang zu Anfang für kommerzielle Projekte eingesetzt wurde. Erst später ist die Sprache zum OpenSource erklärt worden. Somit ist Erlang eine der wenigen Sprachen, die in einer kontrollierten Umgebung entwickelt, später dann bei einem internationalen Konzern auf &#8220;Herz und Nieren&#8221; geprüft (vor allem was Skalierbarkeit, Geschwindigkeit und Concurrency angeht) und erst danach in die OpenSource-Hände übergeben wurde.</p>
<p>Der Name &#8220;Erlang&#8221; selbst ist zu Ehren des Wissenschaftlers <a href="http://de.wikipedia.org/wiki/Agner_Krarup_Erlang">Agner Krarup Erlang</a> als Bezeichner für die Sprache gewählt worden (auch wenn die Ähnlichkeit zu &#8220;<em><strong>Er</strong>icsson <strong>Lang</strong>uage</em>&#8221; nicht von der Hand zu weisen ist).</p>
<p>Weiterführende Informationen:</p>
<p><a href="http://www.erlang.org/doc/getting_started/part_frame.html">http://www.erlang.org/doc/getting_started/part_frame.html </a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.brakmic.de/index.php/2008/10/11/erlang-einfuhrung/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Groovy Tutorial &#8211; Teil 2</title>
		<link>http://www.brakmic.de/index.php/2008/03/30/groovy-tutorial-teil-2/</link>
		<comments>http://www.brakmic.de/index.php/2008/03/30/groovy-tutorial-teil-2/#comments</comments>
		<pubDate>Sun, 30 Mar 2008 18:37:01 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Tutorials]]></category>
		<category><![CDATA[compiler]]></category>
		<category><![CDATA[console]]></category>
		<category><![CDATA[Groovy]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[jvm]]></category>
		<category><![CDATA[kompilieren]]></category>
		<category><![CDATA[konsole]]></category>
		<category><![CDATA[scripting]]></category>
		<category><![CDATA[skripte]]></category>
		<category><![CDATA[tutorial]]></category>

		<guid isPermaLink="false">http://www.brakmic.de/index.php/2008/03/30/groovy-tutorial-teil-2/</guid>
		<description><![CDATA[Willkommen zum zweiten Teil des Groovy-Tutorials!
Wie zuletzt angekündigt, widmen wir unsere Aufmerksamkeit den Closures widmen. Jedoch klären wir zuerst, was denn diese Closures sind? Der Begriff ist, wie 99% anderer auch, aus dem Englischen und hat im einfachsten Sinne etwas mit dem &#8220;Abschließen&#8221; von Code zu tun. Im Deutschen werden diese als Funktionsabschlüsse  bezeichnet. [...]]]></description>
			<content:encoded><![CDATA[<p>Willkommen zum zweiten Teil des Groovy-Tutorials!</p>
<p>Wie zuletzt angekündigt, widmen wir unsere Aufmerksamkeit den <em>Closures</em> widmen. Jedoch klären wir zuerst, was denn diese <em>Closures</em> sind? Der Begriff ist, wie 99% anderer auch, aus dem Englischen und hat im einfachsten Sinne etwas mit dem &#8220;Abschließen&#8221; von Code zu tun. Im Deutschen werden diese als <em>Funktionsabschlüsse</em>  bezeichnet. <em>Closures</em> sind aber weder irgendein neuer Hype-Begriff, noch handelt es sich um eine komplexe Struktur. Per Definition handelt es sich bei Closures um Gebilde, die ihren Definitionskontext reproduzieren können, selbst wenn dieser von außen nicht mehr sichtbar, d.h. nicht existent ist. Praktisch orientierten Leuten kann man sicherlich einfacher damit helfen, indem man den Begriff der <em>Anonymen Methoden</em> und/oder der <em>inneren Klassen</em> in den Raum wirft. Genauso wie eine <em>Anonyme Methode</em> von außen nicht direkt ansprechbar ist (da ihr &#8220;Definitionskontext&#8221; unsichtbar ist, d.h. diese nicht über einen typischen <em>Funktionskopf</em> verfügen), so kann auch eine Closure in Groovy ohne einen Direktaufruf angewandt werden. Und nicht nur in Groovy, denn Closures sind schon seit der Programmiersprache LISP im Einsatz. Aber, schauen wir uns einfach ein Beispiel an, welches mit dem Auslesen von Dateien zu tun hat.</p>
<p><u><strong>CLOSURES</strong></u></p>
<p><img src="http://img89.imageshack.us/img89/5135/closuresgy1.jpg" alt="Closures mit Groovy" border="1" height="231" width="535" /></p>
<p>Eine Klasse FileReader sorgt in ihrer statischen Main-Methode dafür, dass eine vorgegebene Datei mittels einer Closure ausgelesen wird. Die ganze Arbeit wird in diesem Abschnitt erledigt:</p>
<p><img src="http://img442.imageshack.us/img442/4301/closures2kp9.jpg" alt="Closures mit Groovy - Code" border="1" /></p>
<p>Das Objekt <em>file</em> ermöglicht mittels der Methode <em>eachLine</em> das zeilenweise Auslesen der Datei. Um sich den typischen Boilerplate-Code zu sparen, werden keine typischen &#8220;ist-die-Datei-zu-Ende&#8221;-<em>while</em>-Schleifen implementiert. Stattdessen wird <em>eachLine</em> syntaktisch so behandelt, als ob man genau an dieser Stelle eine neue Methode definiert. Man beachte die {}-Klammern, die bei Methodenaufrufen eigentlich nichts zu suchen haben. Eine Closure wird in diesem Beispiel als eine Referenz übergeben, was wiederum bedeutet, dass Closures Objekte sind.</p>
<p>Zugegeben, all das klingt recht unsinnig und man braucht schon seine Zeit, um sich damit anzufreunden, aber eigentlich ist eine Closure bloß eine Ansammlung von Code, welche sich eben wie ein Objekt verhält und dementsprechend übergeben werden kann. Zugleich aber kann sie wie eine Methode agieren, Parameter entgegennehmen und Werte zurückgeben. Mehr ist nicht drin. Wohl zum Glück <img src='http://www.brakmic.de/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p>Im Falle der Anwendung von nur einem Parameter, bietet sich an, die interne Groovy-Variable <em>it</em> anzuwenden:</p>
<p><img src="http://img266.imageshack.us/img266/4629/closures3vh5.jpg" alt="Closures mit Groovy - Code 2" border="1" /></p>
<p>Jedoch bleibt die Frage im Raum, wo der eigentliche Nutzen von Closures zu finden ist? Ruft man sich in Erinnerung den zahlreichen Code, den man &#8220;drumherum&#8221; schreiben muss, nur um eine Collection zu durchwandern, oder aber eine Datei zu bearbeiten, so ist der Vorteil von Closures auf der Hand. Aber nicht nur die schnellere Erledigung von wiederkehrenden und somit auch langweiligen Aufgaben kann elegant mit Closures erledigt werden. Etwas Anderes, das nicht sofort ins Auge springt, lässt sich sehr einfach mit Closures erledigen. Und das ist die Trennung der Steuerungslogik vom aktuell zu bearbeitenden Code. Gesetzt den Fall, dass die obige Klasse nicht einfach die Datei auslesen muss, sondern auch jedes Zeichen in jeder gefundenen Zeile einzeln ausgeben soll, was müsste im Code getan werden?</p>
<p>Genau, nur der Code innerhalb der geschweiften Klammern muss geändert werden und die Steuerung selbst kann erhalten bleiben. Da bei jedem <em>eachLine</em>-Aufruf die Closure auf&#8217;s Neue aufgerufen wird, ist es klar, dass dieser Code nichts mit dem übrigen zu tun hat und problemlos ausgetauscht werden kann.</p>
<p><img src="http://img182.imageshack.us/img182/1592/closures4ap9.jpg" alt="Closures mit Groovy - Code 3" border="1" height="74" width="256" /></p>
<p>Hier lernen wir auch zugleich die Verarbeitung von Collections kennen. Und somit auch eine weitere Besonderheit von Groovy: alles kann zu einer Collection werden, denn alles ist ein Objekt und alle Objekte sind Collections von Daten und Methoden.</p>
<p>Warum ist das aber so?</p>
<p>Nun, es hat damit zu tun, dass in Groovy alle Objekte als <em>Iterable</em> gelten können und somit durchsuchbar sind. Da Groovy die Basisklasse <em>Object</em> von Java nicht nur übernommen, sondern diese auch um eine ganze Reihe von nützlichen Methoden erweitert hat, haben alle Subklassen von Groovy die Möglichkeit, unter anderem, auch spezielle Iteratoren zu implementieren, ohne auf die strukturierte Programmierung wie z.B. <em>for</em>-Schleifen zurückgreifen zu müssen. Stattdessen kann jedes denkbare Objekt &#8220;seine&#8221; Closures anwenden und innerhalb dieser Iteratoren laufen lassen.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.brakmic.de/index.php/2008/03/30/groovy-tutorial-teil-2/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Groovy Tutorial &#8211; Teil 1</title>
		<link>http://www.brakmic.de/index.php/2008/02/17/groovy-tutorial-teil-1/</link>
		<comments>http://www.brakmic.de/index.php/2008/02/17/groovy-tutorial-teil-1/#comments</comments>
		<pubDate>Sun, 17 Feb 2008 14:01:58 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Tutorials]]></category>
		<category><![CDATA[compiler]]></category>
		<category><![CDATA[console]]></category>
		<category><![CDATA[Groovy]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[jvm]]></category>
		<category><![CDATA[kompilieren]]></category>
		<category><![CDATA[konsole]]></category>
		<category><![CDATA[scripting]]></category>
		<category><![CDATA[skripte]]></category>
		<category><![CDATA[tutorial]]></category>

		<guid isPermaLink="false">http://www.brakmic.de/index.php/2008/02/17/groovy-tutorial-teil-1/</guid>
		<description><![CDATA[Selten habe ich mich über eine neue Programmiersprache so sehr gefreut wie es im Falle von Groovy gewesen ist. Ich muss zugeben, zuerst war ich sehr skeptisch als ich las, dass es sich um eine &#8220;Skriptsprache&#8221; handeln sollte. Jedoch begriff ich später, dass das Ganze nicht so einfach und geradlinig ist, wie es auf den [...]]]></description>
			<content:encoded><![CDATA[<p>Selten habe ich mich über eine neue Programmiersprache so sehr gefreut wie es im Falle von Groovy gewesen ist. Ich muss zugeben, zuerst war ich sehr skeptisch als ich las, dass es sich um eine &#8220;Skriptsprache&#8221; handeln sollte. Jedoch begriff ich später, dass das Ganze nicht so einfach und geradlinig ist, wie es auf den ersten Blick scheint. Groovy ist mehr. Sehr viel mehr. Z.B. ist Groovy die zweite Standardsprache der JVM (Java Virtual Machine), welche von Sun für diese Position zertifiziert wurde. Neben Java ist Groovy die einzige Sprache, die bisher diesen Titel tragen durfte. Dies spricht vor allem für die Themen Kompatibilität und Wiederverwendbarkeit von bereits entwickelten Java-Klassen. Groovy ist aber nicht nur eine Spache die auf Java basiert, Groovy _ist_ Java, schaut nur auf den ersten Blick nicht danach aus. Die Unterschiede sind sicherlich wesentlich geringer als z.B. zwischen Java und Jython oder gar Ruby, jedoch ist Groovy auch eine eigenständige, mit bestimmten Merkmalen versehen Sprache, die man bei Java nicht ohne Weiteres finden kann.</p>
<p>Z.B. ist es bei Java ein Unding, wenn man sog. <a title="Closures" href="http://en.wikipedia.org/wiki/Closure_(computer_science)" target="_blank">Closures</a> entwickeln möchte. Da hat man früher oder später mit <a title="Inner Classes mit Java" href="http://www.artima.com/weblogs/viewpost.jsp?thread=180638" target="_blank">inneren Klassen</a> zu tun und allerlei Problemen in Sachen Zugriffsrechte auf Klassenmember.</p>
<p>Auch ist Java keine <a title="Dynamic Language" href="http://en.wikipedia.org/wiki/Dynamic_programming_language" target="_blank">dynamische Sprache</a>, da deren Compiler im Voraus wissen muss, welchen Datentypen man benutzen wird, um eine bestimmte Variable zu initialisieren. Bei Groovy hingegen ist es ein Leichtes, eine Variable anzulegen und ihren Inhalt dann später, also per <a title="Late Binding" href="http://en.wikipedia.org/wiki/Late_binding" target="_blank"><em>late-binding</em></a> festzulegen.</p>
<p>Bei Java gibt es die <a title="Operatorüberladung" href="http://en.wikipedia.org/wiki/Operator_overloading" target="_blank">Operatorüberladung</a> nicht, weil man diese von C++ her bekannte Eigenschaft nicht weiter verwenden wollte. Nun, bei Groovy hat man diese Möglichkeit wieder.</p>
<p>Mit Groovy lassen sich sowohl reine Java-Applikationen entwicklen, als auch simple Skripte. Das Beste daran ist es, dass man als Programmierer/User gar nicht merkt, wie die ganzen Vorgänge im Hintergrund erledigt werden, denn ein Groovy-Programm wird auf die gleiche Art und Weise behandelt wie ein Skript oder gar ein Webservice. Auch ist es möglich mit Groovy COM-Komponenten zu steuern, Windows-Servies zu schreiben, Servlets usw. usf.</p>
<p>Da ich aber der Meinung bin, dass man alle Vorzüge (und auch Nachteile) der Sprachen erst durch deren Benutzung erkennen kann, zeige ich anhand einiger Beispiele in diesem und den nächsten Tutorials, was Groovy ist, was es kann und wozu es, meiner Meinung nach, gut ist.</p>
<p><span style="font-weight: bold; text-decoration: underline;">INSTALLATION</span></p>
<p>Zuerst installieren wir aber den ganzen Batzen:</p>
<p><strong>a)</strong> Um Groovy zu benutzen, muss man natürlich das jeweilige Package <a title="Groovy herunterladen" href="http://groovy.codehaus.org/Download" target="_blank">herunterladen</a>.</p>
<p><span style="font-weight: bold">b)</span> Unter Windows entpackt man das Paket oder aber lädt den Installer herunter. Damit Groovy laufen kann, benötigt es natürlich eine zuvor installierte <a title="Java Development Kit herunterladen" href="http://java.sun.com/javase/downloads/?intcmp=1281" target="_blank">Java-Umgebung</a>. Am besten ist die neue 1.6-er Version, auch wenn 1.5-er ihren Dienst tun würde. Jedoch schlägt die Benutzung von GraphicsPad unter Java 1.5 fehl, sodass ich doch die 1.6-er empfehle.</p>
<p><strong>c)</strong> Vor der Installation sollte man sich auch vergewissern, dass JAVA_HOME unter den Umgebungsvariablen eingerichtet ist. Im PATH-Eintrag unter den Systemvariablen ist ebenfalls ein Eintrag %JAVA_HOME%\bin zu setzen, damit Groovy und seine Tools die Java-Komponenten finden können. Genauso muss auch GROOVY_HOME gesetzt werden. Und auch hier soll ein Eintrag %GROOVY_HOME%\bin im PATH stehen. Damit kann man wichtige Konsolentools von Groovy in der Kommandozeile anwenden.</p>
<p><strong>d)</strong> Während der Installation wird man unter Windows eine Empfehlung erhalten, dass man doch ein paar zusätzliche Komponenten installieren sollte. Dieser Empfehlung sollte man nachgehen, da diese Komponenten viele nützliche Libs mit sich bringen, die man vielleicht später nützen wird.</p>
<p><strong>e)</strong> Nachdem das Ganze installiert worden ist, wählt man im Menü Programme/Groovy den Eintrag &#8220;Starte GroovyConsole&#8221; aus. Auf den ersten Blick ist das neue Fenster recht &#8220;langweilig&#8221; anzusehen und man kann sich fragen, &#8220;wozu das Ganze&#8221;. Nun, jetzt beginnt der eigentliche Spaß, denn Groovy ist minimalistisch in Sachen Code-Vorarbeit und megalomanisch in Sachen Codier-Möglichkeiten. Denn Groovy ist aus zwei Gründen entstanden: einerseits ist Java als Sprache recht klein, jedoch sind die verschiedenen Libs derart mannigfaltig und aufgebläht, dass man sich nicht mehr fragen muss, ob in Java &#8220;etwas realisierbar ist&#8221;, sondern nur &#8220;womit ist dieses etwas zu realisieren&#8221;? Zweitens ist Java als Sprache in heutiger Zeit eher in eine solche Position geraten, neue Features einzufügen, wenn die Konkurrenz welche auf den Markt bringt. Das beste Beispiel ist C#3.0. Diese Version hat einige Elemente aus der funktionalen Programmierung übernommen, darunter auch die zuvor angesprochenen Closures, also wird sofort ein entsprechender Java-Standard gebastelt. C#3.0 implementiert LINQ (Language Integrated Queries) für eine vereinfachte DB-Verwaltung, also macht es Java nach. Usw. usf. Java ist eindeutig in einer defensiven Position, was eigentlich kein Grund zur Trauer wäre, denn nur so können Programmiersprachen (und andere IT-Komponenten) auf ihre Tauglichkeit getestet werden. Schließlich ist C# als Antwort auf Java entwickelt worden, nachdem Microsoft mit dem seligen <a title="J++" href="http://en.wikipedia.org/wiki/J%2B%2B" target="_blank">J++</a> baden gegangen ist. Irgendwo las ich, dass J++ nichts anderes als ein Programmiersprachenexperiment war, um Java auf seine Vor- und Nachteile zu testen. Nun, Microsofties haben es gelernt und .NET ist die Antwort darauf. Aber, nicht nur MS lernt es, Andere tun es ebenfalls. Und Groovy ist so eine Antwort. Jedoch nicht nur auf C#, sondern auf viele andere Sprachen wie z.B. Python und Ruby. Sie alle haben ihre Vorteile und vor allem was Python und Ruby (on Rails) angeht, so sind die beiden Sprachen als wahre Überflieger (oder Hypes?) zu bezeichnen. Nun, Python nicht gerade als Hype, aber Ruby on Rails auf jeden Fall.</p>
<p>Und so ist Groovy entstanden. Als ein natürlicher Evolutionsschritt. Manche sprechen schon davon, <a title="Groovy will replace Java" href="http://java.dzone.com/news/groovy-will-replace-java-langu" target="_blank">dass Groovy eines Tages Java ablösen wird</a>, aber das ist eine andere Liga in der wir hier nicht spielen.</p>
<p><span style="font-weight: bold; text-decoration: underline;">GROOVY KONSOLE</span></p>
<p>Sehen wir uns man die <em>GroovyConsole</em> an.</p>
<p><img src="http://img409.imageshack.us/img409/2646/groovyconsolenk0.jpg" alt="GroovyConsole" width="454" height="418" /></p>
<p>GroovyConsole besteht aus zwei Teilen. Im oberen werden die Quellcodes eingegeben und im unteren sieht man die Ergebnisse der Ausführung. Groovy-Codes werden entweder über das Menü &#8220;Script&#8221; gestartet oder aber durch STRG+R.</p>
<p>Nun geben wir im Edit-Fenster folgenden, hochkomplexen Code ein:</p>
<p><em>println &#8216;hello, world&#8217;</em></p>
<p>Ein STRG+R führt das Ganze aus.</p>
<p><img src="http://img442.imageshack.us/img442/5510/hellono4.jpg" border="0" alt="Hello World" /></p>
<p>Nun, das Kommando ist an sich nichts Neues, würde man sagen. Jedoch ist jeder geübte Java-Programmierer sofort überrascht, wie es zur Ausgabe kommen kann, wo doch die elementarsten Java-Standards nicht eingehalten worden sind. Und Groovy ist doch Java, oder? So gibt es weder Klammern, noch Semikolons und auch keine <em>import</em>-Anweisungen. Nun, Groovy braucht keine Klammern immer und überall, wenn dies nicht nötig ist und Semikolons am Ende einer Befehlsfolge sind kein Muss mehr, sondern nur optional. Wer will, der kann ruhig klammern und Semikolons anwenden. Es ändert sich aber nichts an der Code-Ausführung. Außerdem braucht man folgende Klassen nicht mehr explizit zu importieren, da Groovy dies für uns automatisch erledigt. Selbst das <em>return</em>-Schlüsselwort ist optional (oh, Schreck!..*hihi*)</p>
<ul>
<li>java.io.*</li>
<li>java.lang.*</li>
<li>java.math.BigDecimal</li>
<li>java.math.BigInteger</li>
<li>java.net.*</li>
<li>java.util.*</li>
<li>groovy.lang.*</li>
<li>groovy.util.*</li>
</ul>
<p>Eine ganze Menge wird da im Hintergrund vorbereitet, ohne dass man dafür irgendetwas tun muss. Groovy heißt nicht ohne Grund &#8220;groovy&#8221;. Aber dies liegt nicht nur an der Tatsache, dass diese Elemente automatisch mit dabei sind, sondern, dass so mancher Boiler-Plate-Code nicht mehr geschrieben werden muss. Hier ein typisches Beispiel in Java und dann ein in Groovy. Als Java-IDE wird Eclipse 3.3.1.1 benutzt.</p>
<p>Es wird eine simple Klasse <em>JDemo.java</em> mit einer Membervariable und zwei Accessors angelegt. Diese Klasse wird dann von einer anderen <em>JTester.java</em> benutzt, um den Wert der Membervariable zu manipulieren und auszugeben. Wie in Java typisch, werden die beiden Getter- und Setter-Methoden mit einem &#8220;get&#8221; respektive &#8220;set&#8221; Präfix versehen.</p>
<p><img src="http://img167.imageshack.us/img167/4388/jdemojavatx3.jpg" border="1" alt="JDemo Klasse" width="447" height="404" /></p>
<p>Und die <em>JTester.java</em>:</p>
<p><img src="http://img168.imageshack.us/img168/2442/jtesterjavavd1.jpg" border="1" alt="JTester Klasse" width="448" height="368" /></p>
<p>Hier ist nichts Besonderes fest zu stellen, da solche Vorgänge in Java x-fach durchgeführt werden. Was hier zu sehen ist, überrascht wirklich niemanden. Es wird eine Klasse instantiiert, einmal die <em>Setter</em>-Methode aufgerufen und ein Wert übergeben. Dieser wird dann auf der Konsole per <em>Getter</em>-Methode <em>getText()</em> ausgegeben.</p>
<p><img src="http://img107.imageshack.us/img107/3963/eclipseexecutionym5.jpg" border="1" alt="Eclipse Ausführung" width="438" height="142" /></p>
<p>Schauen wir uns aber dieselbe Implementierung in Groovy mal an.</p>
<p>Zuerst wird eine Klasse <em>GDemo.groovy</em> angelegt die der Klasse <em>JDemo.java</em> entspricht:</p>
<p><img src="http://img145.imageshack.us/img145/2821/gdemogroovydc9.jpg" border="1" alt="GDemo Klasse" width="374" height="309" /></p>
<p>Dann wird eine weitere Datei, <em>GTester.groovy</em>, angelegt:</p>
<p><img class="size-full wp-image-330 alignnone" title="gtestergroovy1" src="http://www.brakmic.de/wp-content/2008/02/gtestergroovy1.jpg" alt="gtestergroovy1" width="354" height="256" /></p>
<p>In Groovy-Skripten, wie diesem hier, können Anweisungen ohne eine explizite Klassendefinition stehen. Und wie man unschwer erkennen kann, bediene ich mich hier zweier Accessoren der <em>GDemo</em>-Klasse, ohne dass diese explizit angelegt worden sind. Wie ist das möglich?</p>
<p>Die Antwort auf diese Frage kommt gleich. <img src='http://www.brakmic.de/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p><span style="font-weight: bold; text-decoration: underline;">COMPILER &amp; SKRIPTE</span></p>
<p>Sehen wir uns zuerst die ganzen Kompilier- und Skriptvorgänge an.</p>
<p>Bevor diese beiden Quellcodes angewandt werden können, müssen sie natürlich kompiliert werden (ja, auch die Skriptdatei <em>GTester.groovy</em> wird kompiliert). Da Groovy eigentlich Java ist, wäre es sicherlich möglich alles per <em>javac</em> zu erledigen. Da aber dies ein Groovy-Tutorial ist, sehen wir uns mal die Kompilierung mit Groovy an.</p>
<p>Um Kompilieren zu können braucht man entweder einen IDE-Plugin, wie z.B. den für Eclipse, oder aber eine Kommandozeile. Für dieses kleine Beispiel reicht aber die Kommandozeile völlig aus. Um aus <em>GDemo.groovy</em> eine vollwertige Java-Class zu machen, bedarf es folgender Befehlsfolge:</p>
<p><img src="http://img204.imageshack.us/img204/5766/groovycam6.jpg" alt="groovyc Kommando" width="314" height="35" /></p>
<p>Analog zu <em>javac</em> gibt es also einen Compiler <em>groovyc</em>, welcher mit vorangestelltem Schalter <em>-d</em> die neu kompilierten Klassen in das Verzeichnis <em>classes</em> setzt. Sicherlich kann man auch andere Bezeichnungen für das Class-Verzeichnis wählen, aber <em>classes</em> macht irgendwie am meisten Sinn, oder?</p>
<p>Nachdem die Kompilierung (hoffentlich) fehlerfrei zu Ende gegangen ist, findet man im Verzeichnis <em>classes</em> eine neue Datei:</p>
<p><img src="http://img90.imageshack.us/img90/6213/classesmg5.jpg" alt="Inhalt des Verzeichnisses classes" width="490" height="92" /></p>
<p>Damit haben wir die Gewissheit, dass unsere Groovy-Klasse <em>GDemo.groovy</em> von der JVM (Java Virtual Machine) verstanden und ausgeführt werden kann. Jetzt wollen wir die Skriptdatei <em>GTester.groovy</em> benutzen, um auf die Daten von <em>GDemo.groovy</em> zuzugreifen. Und genau an dieser Stelle haben wir es mit einem großen Vorteil von Groovy zu tun, passt gut auf:</p>
<p><img src="http://img402.imageshack.us/img402/7932/groovyqj9.jpg" alt="groovy Aufruf" width="563" height="43" /></p>
<p>Hier wird die eigentlich noch nicht kompilierte Klasse <em>GTester.groovy</em> ausgeführt, indem man <em>einfach so</em> den Interpreter <em>groovy</em> anwendet! Wie geht das denn?</p>
<p>Nun, Groovy war für mich am Anfang auch &#8220;nur&#8221; eine weitere Skriptsprache, bis ich begriffen habe, wie Groovy vorgeht und was Groovy eigentlich ist. Es dürfte auch jedem klar sein, dass Groovy im Grunde genommen Java ist. Aber nicht nur! Groovy ist auch eine Ansammlung von, nennen wir es, <em>Abkürzungen</em>, welche das Leben eines typischen Java-Programmierers erleichtern. So ist z.B. das Auslesen von Dateien unter Groovy ein Leichtes, da man nicht mehr mit den ganzen Streams und Buffern zu tun hat. Man sagt einfach &#8220;gib die Datei aus und zwar zeilenweise&#8221; und schon geschieht es, dank der &#8220;Abkürzungen&#8221;. So ist auch der obige Aufruf auch eine Art Abkürzung, indem man eben nicht explizit kompilieren muss, sondern einfach den Interpreter aufruft und lässig sagt &#8220;hier die Datei mit Anweisungen, kümmere dich mal drum, weil ich keine so große Lust habe, den Compiler immer und immer wieder aufzurufen&#8221;. Man übergibt den Namen der Datei plus den Pfad zur speziellen Groovy-Klassensammlung und zum <em>class</em>-Pfad wo sich die Klasse <em>GDemo.class</em> befindet. Das ist alles. Und in einer IDE ist es noch wesentlich leichter, da man dort überhaupt nichts mehr sieht. Bis auf die Ergebnisse, natürlich <img src='http://www.brakmic.de/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p>Der ganze Vorgang des Kompilierens von <em>GTester.groovy</em> (denn es wird schon kompiliert!) läuft völlig transparent ab. Groovy ist nämlich gar keine Skript-Sprache. Groovy tut nur so, indem es den Anschein weckt, dass die ganzen Kommandos in einer Groovy-Datei zeilenweise, ähnlich wie bei BATCH-Files, ausgeführt werden. Dem ist aber nicht so, denn alle Groovy-Dateien werden zuerst kompiliert und dann ausgeführt. Lediglich die Transparenz der Aufrufe (auch eine Anwendung der &#8220;Abkürzungsphilosophie&#8221;) sorgt dafür, dass man das Gefühl hat, man hätte es hier mit einer Skriptsprache zu tun.</p>
<p>In meinem Beispiel bediente ich mich einer weiteren Umgebungsvariable GROOVY_EMBED. Dies ist zwar keine Vorgabe und ohnehin kein Muss, jedoch erleichtert einem das Arbeiten, wenn man mal in Zukunft eine neue Version von Groovy und seinen Klassen installieren würde. So verweist bei mir GROOVY_EMBED auf den Pfad <em>C:\Programme\Groovy\Groovy-1.5.4\embeddable</em> in welchem sich die aktuelle Version der Groovy-Klassen <em>groovy-all-1.5.4.jar</em> befindet. Bei einer neuen Version müsste man eigentlich nur die Versionsnummer anpassen, da der Rest der gleiche bleibt. Es ist aber jedem selbst überlassen, wie er(sie) dieses erledigt. Und unter einer IDE ist es eh eine Sache von ein paar Klicks unter den Projektoptionen. Es ist aber auf jeden Fall wichtig zu wissen, dass ohne diese Klassen keine <em>skriptähnliche</em> Groovy-Datei kompiliert werden kann.</p>
<p>Schauen wir uns jetzt die Ausgabe des Aufrufs an:</p>
<p><img src="http://img253.imageshack.us/img253/7492/ausgabexz4.jpg" alt="Ausgabe" width="123" height="34" /></p>
<p>An sich nichts Besonderes wäre da nicht die schon gestellte Frage gewesen, wie es zu dieser Ausgabe kommen konnte, wenn wir in unserer <em>GDemo</em>-Klasse gar keine <em>Getter</em> und <em>Setter</em> Methoden eingetragen haben?</p>
<p>Wie kann man eine Klassenmethode aufrufen, wenn in der Klassendefinition keine angegeben worden ist?</p>
<p>Nun, auch hier gilt der Grundsatz, dass alle Abkürzungen angewandt werden können, sofern diese auch möglich sind. Also braucht man bei Groovy für eine Membervariable keine expliziten <em>Accessoren</em> zu setzen. Vielmehr ist es möglich, im Code der aufrufenden Klasse auch direkt den Variablennamen zu setzen, als ob man direkt die Memebervariable anspricht. Also ist z.B. <em>gdemo.text = &#8220;Demo Text&#8221;</em> möglich. Dies bedeutet aber nicht, dass wirklich die Memebervariable selbst aufgerufen wird, sondern es handelt sich ebenfalls um eine Abkürzung, die das explizite Anwenden des setText-Accessors unnötig macht. Abkürzungen ohne Ende, nicht wahr?</p>
<p>Das ist aber nicht alles, denn die oben angeführten Zeilenkommandos für die Kompilierung können ebenfalls abgekürzt werden. Ich habe sie aber aus rein pädagogischen Gründen angeführt, denn es macht ja bekanntlich mehr Sinn, wenn man weiß auf was man verzichten kann, als wenn man nicht einmal wüsste, was wichtig ist.</p>
<p>Also ist es auch möglich, beide Dateien <em>GDemo.groovy</em> und <em>GTester.groovy</em> anzulegen und nur den Interpreter groovy auszuführen. Und schon wäre die Klasse <em>GDemo.groovy</em> im Hintergrund kompiliert worden, damit dann das Skript <em>GTester.groovy</em> ordentlich ausgeführt werden kann. Sie glauben es nicht? O.K., hier der Beweis:</p>
<p>Wir löschen die zuvor erstellte Klassendatei <em>GDemo.class</em> und das Verzeichnis <em>classes</em>.</p>
<p><img src="http://img263.imageshack.us/img263/245/deleteclasesom7.jpg" alt="Lösche Verzeichnis classes" width="427" height="43" /></p>
<p>Danach vergewissern wir uns, dass im Verzeichnis <em>gdemo</em> nichts außer den beiden Groovy-Dateien vorhanden ist:</p>
<p><img src="http://img98.imageshack.us/img98/893/gdemoverzeichniszr2.jpg" alt="gdemo Verzeichnis" width="487" height="97" /></p>
<p>Und jetzt führen wir <em>GTester.groovy</em> mit dem Interpreter <em>groovy</em> aus:</p>
<p><img src="http://img444.imageshack.us/img444/7420/groovycausfhrungbx6.jpg" alt="groovyc Ausführung" width="516" height="40" /></p>
<p><img src="http://img527.imageshack.us/img527/6938/demotexted8.jpg" alt="Demo Text Ausgabe" width="83" height="22" /></p>
<p>Oh Yes, es funktioniert!</p>
<p>Was passiert denn eigentlich mit <em>GDemo.groovy</em>, wenn wir den Interpreter anweisen, <em>GTester.groovy</em> auszuführen? Nun, da <em>GTester.groovy</em> einige Male auf die <em>GDemo</em>-Klasse zugreift, muss der Interpreter dafür sorgen, dass <em>GDemo.groovy</em> zuerst kompiliert wird, denn ansonsten würde es Fehlermeldungen hageln. Und genau das wird auch im Hintergrund erledigt, bevor <em>GTester.groovy</em> zum Einsatz kommt. Wir haben quasi ein Skript-Feeling inklusive Compiling-Power, ohne aber die ganzen Kommandos selber eingeben zu müssen.</p>
<p>So, damit ist der erste Teil unseres kleinen Tutorials zu Ende. Im nächsten Teil zeige ich, wie mit Groovy problemlos <em>Closures</em>, <em>Listen</em> und <em>Maps</em> angewandt werden können und vielleicht noch ein paar kleine Kniffe mehr&#8230;bis dann!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.brakmic.de/index.php/2008/02/17/groovy-tutorial-teil-1/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
	</channel>
</rss>
