Email to Torsten Weber
Feed Icon
.NET User Group Leipzig

Fließtext und Quelltext – wie besser verbinden?

Etwas problematisch bei Artikeln oder Büchern in der Domäne der IT sind die begrenzten Möglichkeiten zur Visualisierung des Geschriebenen gegenüber einer Präsentation. Bei Letzterem können Vortragende unter anderem mit der Mimik und Gestik arbeiten. Ich persönlich blende gerne Powerpoint-Folien bei Vorträgen dynamisch ab. Was heißt abblenden? Die Folien werden durch einen schwarzen Bildschirm ersetzt ¹, so dass die Augen der Teilnehmer nach einer "Schrecksekunde" in der Form "Beamer kaputt?", "Vortrag zu Ende?", "war ich eingeschlafen?" sich wieder beim Vortragenden, also bei mir, wiederfinden. In jedem Vortrag, jedem, durchleben Teilnehmer Schwankungen der Phasen ihrer Aufmerksamkeit – das ist nichts neues, das kennt jeder aus der Schule oder von Vorlesungen aus der Universität (und ist der Grund, warum gleich der nächste Absatz kommt). Gegen diese Schwankungen kann man nichts machen, aber ihre Ausschläge kontrollieren und das ist mit "dynamisch abblenden" gemeint, da die Teilnehmer und das Zielpublikum an sich inhomogen sind und so Zeitpunkte dafür immer woanders liegen.

Bei Artikeln und Bücher gibt es naturgemäß weniger solche Variationsmöglichkeiten und schon gar nicht dynamische. Hier arbeiten Autoren daher mit Bildern, mit Vorstellungskraft – auch Visualisierung, aber eben auf einer anderen Ebene. Mir persönlich ist beim Studium der verschiedensten Fachbücher, Artikel, Videos etc. pp. mit Inhalten von PERL, über C#, ASP.NET bis hin zu Unternehmensarchitekturen immer wieder die Trennung von Fließtext und Quelltext geradezu ins Auge gestochen. Ein Autor erklärt etwas, warum beispielsweise gerade ein GC.Collect() in einem Listing auf der nächst folgenden Buchseite und mit vielleicht ganzen 20 Zeilen an irgendeiner Stelle gerade dort so wichtig ist; aber diese Stelle lässt sich beim Blick in den Quelltext nicht direkt, nicht unmittelbar, finden. Die damit mehr oder weniger notwendigen Regressionen, also Rücksprünge im Text, sind nicht gerade sehr förderlich, nicht nur, weil sie Schnelllesen nicht unterstützen, sondern weil es sich scheinbar um zwei Blöcke von Inhalt handelt. Fließtext und Quelltext sind aber nicht disjunkt (im Sinne einer leeren Schnittmenge) zueinander, sie sind eine Einheit – ein Inhalt, ein Bild.

Fließquelltext

Wie könnte man das verbessern?
So ähnlich wie im Blog-Eintrag Sounds bei Visual Studio 2003 vs. Visual Studio 2005.

... mit Ereignissen aufgrund von angestoßenen Builds eines Projektes. Ist der Build eines Projektes erfolgreich, wird die Datei C:\Windows\Media\chimes.wav {2} abgespielt. Hakt es irgendwo und der Build klappt nicht, dagegen die Datei C:\Windows\Media\Windows Critical Stop.wav {3}. Ein sinnvoller Einsatz des Makros liegt außerdem darin, gleich den kompletten Build einer Lösung anzuhalten, wenn ein Build eines Projektes daraus nicht erfolgreich ist und zwar mit: DTE.ExecuteCommand("Build.Cancel") {5}. ...

Option Strict Off ... Public Module EnvironmentEvents {1} ... Declare Function PlaySound Lib "winmm.dll" Alias "sndPlaySoundA" _
(ByVal lpszSoundName As String, ByVal uFlags As Long) As Long Const BuildSucceedWaveFile = "C:\Windows\Media\chimes.wav" {2} Const BuildFailedWaveFile = "C:\Windows\Media\Windows Critical Stop.wav" {3} Dim canceled As Boolean = False Private Sub BuildEvents_OnBuildProjConfigDone( _ {4} ByVal Project As String, ByVal ProjectConfig As String, _ ByVal Platform As String, ByVal SolutionConfig As String, _ ByVal Success As Boolean) _ Handles BuildEvents.OnBuildProjConfigDone If Success = False Then DTE.ExecuteCommand("Build.Cancel") {5} canceled = True {6} End If End Sub Private Sub BuildEvents_OnBuildDone(ByVal Scope As EnvDTE.vsBuildScope, _ {7} ByVal Action As EnvDTE.vsBuildAction) Handles BuildEvents.OnBuildDone If Not canceled Then {8} PlayWaveFile(BuildSucceedWaveFile) Else PlayWaveFile(BuildFailedWaveFile) End If canceled = False {9} End Sub Private Sub PlayWaveFile(ByVal soundFile As String) PlaySound(soundFile, &H1 Or &H2) End Sub End Module

Wichtig ist dabei, die Verweise im Quelltext von oben nach unten durchzunummerieren. Damit sind die Verweise im Fließtext zwar durchaus etwas unschön, weil nicht aufsteigend durchnummeriert, aber bei einem Verweis von Fließtext auf Quelltext kann ein Leser intuitiv die gemeinte Stelle im Quelltext finden. Auch umgedreht lässt sich dann im Fließtext die verlassene Stelle wieder besser auffinden.
 
Probieren Sie es aus:
  • Die Arbeit mit der Variable canceled {6, 8, 9} ist deswegen so wichtig, weil sonst bei jedem Build eines Projektes und nicht nur bei der Lösung ein Audioereignis erzeugt wird.
Wie finden Sie das? Über Ihr Feedback in Form von Kommentaren im Blog bzw. gerne auch per E-Mail an info@nahtlos-mobil.de würden wir uns freuen.
 
 
--
 
¹ Gruß an Damir Tomičić, der gerade ein Gadget in seinem Blog erwähnt hat. Mir persönlich gefällt der Logitech Cordless 2.4 GHz Presenter besser. Er liegt augenscheinlich angenehmer als eine Maus bei einer Präsentation in der Hand, zeigt die verbleibende Zeit an (die ein guter Referent natürlich sowieso im Gefühl hat ²), gibt per Vibrationsalarm rechtzeitig vor Ende der Präsentation Bescheid und zeigt den Status der Batterien im Blickfeld an. In dem von Damir erwähnten Gadget wird der Status der Batterien (3 - Battery Life Indicator) unten angezeigt. Unten? An Batterien sollte man also denken, da das Gadget vorwiegend als Maus zum Einsatz kommt. ;)
² Nebenbei, man kann ein Zeitgefühl durch das Kochen von Kaffee oder Tee sehr gut trainieren.
 
Logitech Cordless 2.4 GHz Presenter
Microsoft Wireless Notebook Presenter Mouse 8000

Nein, ich möchte mit diesem Blog-Eintrag keine Werbung in eigener Regie machen. Es ist eine Tatsache,Das Buch Programmieren mit dem .NET Compact Framework - Anwendungsentwicklung für mobile Geräte dass unser Buch Programmieren mit dem .NET Compact Framework – Anwendungsentwicklung für mobile Geräte schon nach nicht mal einem Jahr im Bestand "stark dezimiert" ist. Irgendwie hat Damir Tomičić das Ganze nicht nur da, aber eben gerade auch bei seinem Blog-Eintrag im Oktober 2006 alles wohl schon erahnt. O. k., Damir ist für mich "The Architect" schlechthin und persona grata, eher persona gratissima (für die Nicht-Lateiner – hier gibt es die Erklärung in der deutschen Wikipedia) und als Architekt kann man ganz wie in The Matrix schon mal den Erfolg eher als die Autoren selbst ahnen oder sogar wissen ;), aber das nur ganz am Rande. Zu meiner Schande muss ich gestehen, dass ich gerade verwirrt war und meinte, es ist seit Oktober 2005 auf dem deutschen Markt. Nein, erst seit Oktober 2006 und heute ist es gerade erst Ende Mai 2007. Nun, wie dem auch sei, die Vorbereitungen für die zweite Auflage unseres Buches haben wir fast abgeschlossen. Wir werden dabei das Buch nicht nur einfach durchschauen, sondern auch komplett überarbeiten. Vielen Dank an alle, die eine Rezension geschrieben haben und / oder uns beständig mit Feedback versorgen.

Wenn Sie denken, dass etwas in unserem Buch fehlt, raus oder überarbeitet werden sollte, wenn Sie etwas darin gut finden – können Sie sich gerne bei uns unter info@nahtlos-mobil.de melden. Auch sonst sind wir natürlich über jegliches Feedback jederzeit dankbar. Dankbar ist dabei nicht einfach so als Floskel daher gesagt: An alle Leser, schauen Sie auf Seite 20, wenn Sie Interesse an dem dort erwähnten Angebot haben, melden Sie sich! Übrigens ist "konstruktive Kritik" negativ belegt, genau wie es bei "du hast mich falsch verstanden" der Fall ist. Daher schreiben wir von Feedback und sprechen davon, dass "eventuell etwas verkehrt ausgedrückt ist". Derselbe Sachverhalt, aber neutral dargestellt.

Was haben wir uns vorgenommen?

Jedes Kapitel bekommt neben dem erfolgreichen "Unsere Erfahrungen" noch einen zusätzlichen Absatz "Wie Sie die Inhalte verwenden können". Dieser Absatz soll zeigen, wie die Inhalte der Kapitel für eine Beispielanwendung verwendet werden können, angefangen bei der Idee, über die Konzeption, der Entwicklung bis zur Verteilung. So können die Inhalte besser in Relation, wie ein roter Leitfaden, gesetzt werden. Wer gerne kreuz und quer liest, kann aber auch weiterhin das komplette Buch in dieser Art und Weise lesen, da nur diese Abschnitte auf die vorherigen aufbauen. Natürlich werden auch die Fehler ausgemerzt, wie beispielsweise einem Verweis auf die Lieblingsfarbe eines Autors und einem Hinweis auf etwas Blaues in einem Bild in unserem Buch, das aber selbst in Schwarzweiß gedruckt ist. Keinem ist das so aufgefallen, trotz, dass wir als Autoren fast alle Kapitel gegenseitig quer gelesen, geändert und natürlich auch noch Lektoren es überarbeitet haben. Der Fehlerteufel steckt halt immer im Detail.

Was kommt noch?

Mehr, viel mehr Beispiele und mehr, viel mehr Verweise auf Ressourcen. Warum? Das Buch ist nicht der Stein des Mobile Computing. Wenn wir alles vom Mobile Computing erklären und beschreiben wollten, müssten wir eine Enzyklopädie darüber verfassen, die aber schon bei Drucklegung veraltet wäre. Die kommende Visual Studio-Version mit dem Codenamen "Orcas" lässt schon grüßen. Darum gib es das Verweiswerkzeug, mit dem Verweise ins Internet in der Form Link<Kapitel><fortlaufende Nummer>, also z. B. wie Link0001, aufgelöst werden. Das Verweiswerkzeug gibt es einerseits als Anwendung zur Installation für Ihren Rechner und andererseits als Webanwendung, die z. B. mit http://www.nahtlos-mobil.de/gehezu/?link0001 aufrufbar ist. Genauso funktioniert das Prinzip auch bei den Beispielen und Ressourcen auf der CD-ROM, also CD<Kapitel><fortlaufende Nummer>. Entweder installiert man das Verweiswerkzeug und natürlich auch die Beispiele von der mitglieferten CD-ROM oder ruft einfach alles online, wie mit http://www.nahtlos-mobil.de/cd/?cd1101.zip, ab. 393 solche Verweise auf Ressourcen im Internet gibt es derzeit sowie 157 auf die CD-ROM und davon wiederum auf 138 Beispiele. Das ist uns zu wenig und eines der Arbeitspakete für die zweite Auflage.

Wo gibt es das Verweiswerkzeug? Hier:
nahtlos-mobil.de/werkzeuge/verweiswerkzeug.zip
nahtlos-mobil.de/werkzeuge/verweiswerkzeug64.zip
nahtlos-mobil.de/werkzeuge/verweiswerkzeugItanium.zip

Über Hilfe, Prüfe auf aktuellere Version können Sie die Inhalte des Verweiswerkzeuges aktualisieren.

Verweiswerkzeug für das Buch Programmieren mit dem .NET Compact Framework - Anwendungsentwicklung für mobile Geräte

Häufig kommt man mit einen lösungsorientierten Ansatz bei ganz konkreten Problemstellungen sehr gut voran. Die CodeClips von MSDN Solve sind da ein sehr gutes Beispiel als eine mögliche vorstellbare Form dafür. Problemstellung – Lösung, knackig, kurz, prägnant. Wir haben dafür derzeit Anhang A, der alle Beispiele wie z. B. CD1101 mit einer Überschrift und einer kurzen Beschreibung auflistet. Also welche Problemstellung mit dem jeweiligen Beispiel adressierbar ist. Das lassen wir so, versprochen, da das Feedback dafür hervorragend ist. Wie kann man sich das gelernte bzw. die Inhalte besser merken? Wie kann man der beim Mobile Computing und allgemein immer steiler werdenden Lernkurve besser Herr werden? Wie bekommt man einen besseren Überblick über die sehr große "Wolke" Mobile Computing und deren vielfältigen Teilaspekte wie Integration, Design-Richtlinien, Verteilung oder Sicherheit? Dafür werden u. a. Projekte mit Codenamen "CodeMap" oder "Spaces" gestartet.

Seien Sie gespannt; lassen Sie sich überraschen. Umso näher die zweite Auflage unseres Buches kommt, umso mehr werden wir an dieser Stelle über "CodeMap" & Co. bloggen.

Wann kommt die zweite Auflage?

Wenn sie fertig ist.

Fortsetzung: Programmieren mit dem .NET Compact Framework – zweite Auflage (2)

Post von eBay

29. May 2007

Bei einem Verkauf über die Plattform von eBay mag man bei dem ersten Blick auf das Kleingedruckte und dort bei den Gebühren denken, dass eBay von den letzten Mehrwertsteuererhöhungen (der fachlich korrekte Begriff ist übrigens Umsatzsteuer) nichts gehört hat. 15 % Mehrwertsteuer? Nicht 16 % oder 19 %, wie es in Deutschland seit dem 1. Januar 2007 der Fall ist? Nun die Lösung des "Rätsels" steht im vorherigen Satz: "... wie es in Deutschland seit dem 1. Januar 2007 der Fall ist". In der Hilfe von eBay zur Mehrwertsteuer steht dazu folgendes:

Ab 1. Januar 2007 wird eBay von Personen, die ihren Sitz oder Wohnsitz in Deutschland haben, 15% Mehrwertsteuer (Mehrwertsteuersatz in Luxemburg) einbehalten.

Mehrwertsteuer bei eBay

Geeks und der WAF

28. May 2007

Aus einem Chat mit Roland Weigelt, der bald in Leipzig ist: WAF steht für Wife Acceptance Factor bzw. Women Acceptance Factor. Wer WAF nicht kennt, hier gibt es für das Akronym die Definition aus der deutschen Wikipedia:

... Der Woman Acceptance Factor (engl. für Frauen-Akzeptanz-Faktor, oder auch Wife Acceptance Factor, Ehefrauen-Akzeptanz-Faktor), kurz WAF, bezeichnet scherzhaft die zu erwartende Akzeptanz bzw. Ablehnung einer Anschaffung durch die Ehefrau oder eine Lebensgefährtin in einer Beziehung. Der Begriff beruht auf der klischeehaften Vorstellung, dass Männer technisches „Spielzeug“ wie Computer, Heimkino-Systeme und ähnliches angeblich mit einer gewissen Technikverliebtheit betrachteten und die Nachteile dieser Anschaffungen außer Acht ließen, während Frauen praktische und ästhetische Aspekte in den Vordergrund stellten. Der WAF ist umgekehrt proportional zum Ausmaß des Konfliktes, der durch diese unterschiedlichen Sichtweisen entsteht. Je geringer der WAF, desto mehr Überzeugungsarbeit muss geleistet werden bzw. umso mehr Unzufriedenheit entsteht durch die Anschaffung. Ein WAF von 0 entspricht einer völligen Inakzeptanz und ein WAF von 1 absoluter Begeisterung. ...

Gruß an Uwe Baumann, Dirk Primbs und Damir Tomičić mit denen ich Shop-Gelegenheiten wie diese hier, hier und hier ausgetauscht habe. Wie auch immer, denkt beim Kauf eines USB Hamsterrads oder eines USB Kühl-Kissens an diesen "Faktor". O. k., der Kauf eines USB-Gadgets ist durch die in der Regel viel geringeren Anschaffungskosten sehr viel wahrscheinlicher, als der eines 30-Zoll-Displays wie es sie von Apple gibt. Nicht wahr Roland? Probieren wir es trotzdem. ;)

USB Raketenstation – Stuff für Geeks

PS: Hier gibt es die Definition von Geek und hier die Definition von Nerd. Hier gibt es einen Kommentar mit 10 Gründen, warum Geeks die besseren Liebhaber sind.

Aktualisierung: Eine benutzerdefinierte Ansicht für den Ordner Junk-E-Mail gibt es hier.
---

Mittwoch, 23. Mai 2007: Von 8:00 - 12:00 Uhr sind alleine 116 Junk-E-Mails aufgelaufen (ist auch kein Wunder). Gruß an alle Spammer - nein ich brauche wirklich keine Pillen und abnehmen muss ich auch nicht.

116 Junk-E-Mails in 4 Stunden – neuer Rekord

Ich habe mich, seitdem Uwe Baumann in Leipzig war und eines meiner Makros für seinen TechTalk "Schneller codieren – Visual Studio .NET Extensibility" gegen eine Lizenz (ein Bier) verwendet hat, nicht weiter großartig mit der Programmierung von Makros für Visual Studio 2003 oder Visual Studio 2005 beschäftigt. Wozu auch, denn mit Werkzeugen wie ReSharper von JetBrains, von dem man übrigens beim Vortrag von Roland Weigelt über die Erweiterbarkeit von Visual Studio eine Lizenz gewinnen kann, kann viel fehlende Funktionalität von Visual Studio erschlagen werden. Bei Visual Studio 2003, übrigens auch bei Visual Studio 2005, wurde dem Softwareentwickler zugemutet, einzelne Ordner in der Projektmappe selber wieder zu schließen. Über das Kontextmenü ging das nicht. Also musste ein Makro her, welches das übernommen hat. So weit so gut zu dem Makro für Uwe's TechTalk.

Geöffnete Ordner in Visual Studio 2005 – diesselben Probleme wie in Visual Studio 2003
Abb. 1: Geöffnete Ordner in Visual Studio 2005.

Bei Visual Studio 2005 vermisse ich die Unterstützung von Ereignissen für Sounds. Visual Studio 2003 konnte das für die vielfältigsten Ereignisse, Visual Studio 2005 kann es nur noch, wenn ein Haltepunkt erreicht wird. Bei mittleren bis großen Softwareentwicklungsprojekten ist das durchaus für den einen oder andern ärgerlich, weil trotz und gerade deswegen, wegen Mehrkernprozessoren, 4 GB RAM und mehr, 1 TB RAID 0+1 und höher, Builds zwar noch ihre Zeit brauchen, aber man bequem weiterarbeiten kann. Ohne Feedback, ähnlich wie bei einer Tastatur die Taktilität, muss man ein ungefähres Zeitgefühl haben oder in Visual Studio nach dem Status eines Builds ständig nachschauen. Vielleicht rüstet Microsoft es ja auch im nächsten Service Pack für Visual Studio 2005 wieder nach? Wer weiß das schon so genau, daher habe ich ein Makro geschrieben.

Audioereignisse bei Visual Studio 2005
Abb. 2: Audioereignisse bei Visual Studio 2005 – nur noch für Haltepunkte.

Im Gegensatz zu einer Lösung im Web, überprüft mein Makro nicht die Zeichenfolge im Ausgabe-Fenster von Visual Studio 2005, sondern arbeitet über BuildEvents_OnBuildProjConfigDone(...) Handles BuildEvents.OnBuildProjConfigDone {4} mit Ereignissen aufgrund von angestoßenen Builds eines Projektes. Ist der Build eines Projektes erfolgreich, wird die Datei C:\Windows\Media\chimes.wav {2} abgespielt. Hakt es irgendwo und der Build klappt nicht, dagegen die Datei C:\Windows\Media\Windows Critical Stop.wav {3}. Ein sinnvoller Einsatz des Makros liegt außerdem darin, gleich den kompletten Build einer Lösung anzuhalten, wenn ein Build eines Projektes daraus nicht erfolgreich ist und zwar mit: DTE.ExecuteCommand("Build.Cancel") {5}. Damit nicht bei jedem Build eines Projektes, sondern nur bei der Lösung als solches eine Datei abgespielt wird, muss noch mit der Variable canceled {6, 8, 9} gearbeitet und die Entscheidung, welche Datei abzuspielen ist, in der Methode BuildEvents_OnBuildDone {7} getroffen werden.

Option Strict Off ... Public Module EnvironmentEvents {1} ... Declare Function PlaySound Lib "winmm.dll" Alias "sndPlaySoundA" _
(ByVal lpszSoundName As String, ByVal uFlags As Long) As Long Const BuildSucceedWaveFile = "C:\Windows\Media\chimes.wav" {2} Const BuildFailedWaveFile = "C:\Windows\Media\Windows Critical Stop.wav" {3} Dim canceled As Boolean = False Private Sub BuildEvents_OnBuildProjConfigDone( _ {4} ByVal Project As String, ByVal ProjectConfig As String, _ ByVal Platform As String, ByVal SolutionConfig As String, _ ByVal Success As Boolean) _ Handles BuildEvents.OnBuildProjConfigDone If Success = False Then DTE.ExecuteCommand("Build.Cancel") {5} canceled = True {6} End If End Sub Private Sub BuildEvents_OnBuildDone(ByVal Scope As EnvDTE.vsBuildScope, _ {7} ByVal Action As EnvDTE.vsBuildAction) Handles BuildEvents.OnBuildDone If Not canceled Then {8} PlayWaveFile(BuildSucceedWaveFile) Else PlayWaveFile(BuildFailedWaveFile) End If canceled = False {9} End Sub Private Sub PlayWaveFile(ByVal soundFile As String) PlaySound(soundFile, &H1 Or &H2) End Sub End Module

Danke an Dirk Primbs, der gerade auf VB abfährt, für den Tipp zu Handles. Es war dann doch viel einfacher als gedacht, dass Makro muss in EnvironmentEvents {1} eingefügt werden. Wo findet man das? Über den Makro-Explorer in Visual Studio [ALT + F8] und dort einfach auf das entsprechende Makro doppelt klicken.

EvironmentsEvents – Ort für die Reaktion auf Ereignisse in Makros bei Visual Studio 2005
Abb. 3: In EvironmentsEvents muss das Makro eingefügt werden.

Makro-Explorer in Visual Studio 2005
Abb. 4: Makro-Explorer in Visual Studio 2005.

PS: Nein Alex, das ist kein VBA. ;)

Declare Function PlaySound Lib "winmm.dll" Alias "sndPlaySoundA" _
   (ByVal lpszSoundName As String, ByVal uFlags As Long) As Long
Const BuildSucceedWaveFile = "C:\Windows\Media\chimes.wav"
Const BuildFailedWaveFile = "C:\Windows\Media\Windows Critical Stop.wav"
Dim canceled As Boolean = False

Private Sub BuildEvents_OnBuildProjConfigDone( _
    ByVal Project As String, ByVal ProjectConfig As String, _
    ByVal Platform As String, ByVal SolutionConfig As String, _
    ByVal Success As Boolean) _
    Handles BuildEvents.OnBuildProjConfigDone

    If Success = False Then
        DTE.ExecuteCommand("Build.Cancel")
        canceled = True
    End If
End Sub

Private Sub BuildEvents_OnBuildDone(ByVal Scope As EnvDTE.vsBuildScope, _
    ByVal Action As EnvDTE.vsBuildAction) Handles BuildEvents.OnBuildDone
    If Not canceled Then
        PlayWaveFile(BuildSucceedWaveFile)
    Else
        PlayWaveFile(BuildFailedWaveFile)
    End If

    canceled = False
End Sub

Private Sub PlayWaveFile(ByVal soundFile As String)
    PlaySound(soundFile, &H1 Or &H2)
End Sub
Download (1,07 KB)