TUI programmieren [C]
Re: TUI programmieren [C]
Es dauert zwar noch, doch wenn es soweit ist: wie soll ich den Header posten?
1500 Zeilen passen wohl kaum in eine Nachricht. und diese 1500 zeilen sind nur der Großteil der Library. Eine IO-Library gibt es auch noch. Und noch einen Beispiel-Code. und noch ne Erklärung.
Kann man nicht eine Funktion einbauen, mit der man ZIPs hochladen kann? Ich fände es unschön, so ein unvollendetes Projekt auf meiner Homepage zu veröffentlichen, da es ja nur die Library und kein Nützliches Programm ist...
1500 Zeilen passen wohl kaum in eine Nachricht. und diese 1500 zeilen sind nur der Großteil der Library. Eine IO-Library gibt es auch noch. Und noch einen Beispiel-Code. und noch ne Erklärung.
Kann man nicht eine Funktion einbauen, mit der man ZIPs hochladen kann? Ich fände es unschön, so ein unvollendetes Projekt auf meiner Homepage zu veröffentlichen, da es ja nur die Library und kein Nützliches Programm ist...
Re: TUI programmieren [C]
Mit einer Möglichkeit hier ZIPs hochzuladen kann ich selber nicht dienen, aber du kannst doch das ZIP auf deine HP legen und hier einen Link dafür posten, ganz ohne das du dafür deine HP-Dateien veränderst. So habe ich es auch mit meinemoDOSseus hat geschrieben:Es dauert zwar noch, doch wenn es soweit ist: wie soll ich den Header posten?
1500 Zeilen passen wohl kaum in eine Nachricht. und diese 1500 zeilen sind nur der Großteil der Library. Eine IO-Library gibt es auch noch. Und noch einen Beispiel-Code. und noch ne Erklärung.
Kann man nicht eine Funktion einbauen, mit der man ZIPs hochladen kann? Ich fände es unschön, so ein unvollendetes Projekt auf meiner Homepage zu veröffentlichen, da es ja nur die Library und kein Nützliches Programm ist...
Textbetrachter gemacht, denn meine derzeite HP hat rein gar nichts mit DOS zu tun, weil ich dort nur eine Seite für selbstgebastelte Maps(FreecracMaps) für ein Windows-Egoshooter anbiete.
...
1500+ Zeilen für Librarys empfinde ich schon ohne sie je gesehen zu haben als gewaltig viele.
Dirk
Re: TUI programmieren [C]
Muss ich ma gucken wo ich sie hinlege.
Mein Projekt-browser ist ja in PHP geschrieben und sobald ich was in /files/ hochlade, wirds auch angezeigt (hab ich ja extra so programmiert).
Naja ich mach einfach mal nen neuen ordner /dos/.
Wenn ich fertig bin veröffentliche ich den Link hier. Hab aber derzeit klausuren-Phase.
Mein Projekt-browser ist ja in PHP geschrieben und sobald ich was in /files/ hochlade, wirds auch angezeigt (hab ich ja extra so programmiert).
Naja ich mach einfach mal nen neuen ordner /dos/.
Wenn ich fertig bin veröffentliche ich den Link hier. Hab aber derzeit klausuren-Phase.
Re: TUI programmieren [C]
Ach so, damit habe ich keine Erfahrung, PHP/CGI darf ich auf meiner HP vom meinem ISP nicht benutzen und so habe ich dort nur eine (self)html mit einem Texteditor geschrieben.oDOSseus hat geschrieben:Muss ich ma gucken wo ich sie hinlege.
Mein Projekt-browser ist ja in PHP geschrieben und sobald ich was in /files/ hochlade, wirds auch angezeigt (hab ich ja extra so programmiert).
Prima und lasse dir ruhig damit Zeit. Es eilt ja nicht.Naja ich mach einfach mal nen neuen ordner /dos/.
Wenn ich fertig bin veröffentliche ich den Link hier. Hab aber derzeit klausuren-Phase.
Dirk
Re: TUI programmieren [C]
1749 Zeilen nur der Header.
der IO Header hat nochmal 179.
Fenster kann man verschieben
ich kann Felder mit Strings lesen
Ich habe Checkboxen.
fehlen noch Textareas
aber ich glaube die werden ziemlich heftig
eine scrollbar lasse ich glaube ich erstmal weg.
Wenn ich die habe, kann der Header auch in die beta-release gehen.
Dann werde ich ihn wahrscheinlich erstmal etwas beschleunigen, aufmotzen oder was auch immer. Ich glaube da geht noch ne ganze Menge und die Zeilen werden dann auch weniger.
mfG.
der IO Header hat nochmal 179.
Fenster kann man verschieben
ich kann Felder mit Strings lesen
Ich habe Checkboxen.
fehlen noch Textareas
aber ich glaube die werden ziemlich heftig
eine scrollbar lasse ich glaube ich erstmal weg.
Wenn ich die habe, kann der Header auch in die beta-release gehen.
Dann werde ich ihn wahrscheinlich erstmal etwas beschleunigen, aufmotzen oder was auch immer. Ich glaube da geht noch ne ganze Menge und die Zeilen werden dann auch weniger.
mfG.
Re: TUI programmieren [C]
Die Produktion hakt im Moment ein wenig.
Textareas sind noch mehr als erwartet.
Man muss nen Zeilenumbruch berechnen
Man hat ein Sichtfeld
Wenn man mit den Cursertasten navigiert muss man gucken ob man nicht schon in die nächste Zeile muss (auch abhängig vom Zeilenumbruch)
Nach jedem neuen Zeichen muss man den Zeilenumbruch neu berechnen
Und so weiter.
Einfach eine sehr lästige angelegenheit.
Im inet gibts natürlich auch keinen Beispielcode. wie auch xD
mfG
Textareas sind noch mehr als erwartet.
Man muss nen Zeilenumbruch berechnen
Man hat ein Sichtfeld
Wenn man mit den Cursertasten navigiert muss man gucken ob man nicht schon in die nächste Zeile muss (auch abhängig vom Zeilenumbruch)
Nach jedem neuen Zeichen muss man den Zeilenumbruch neu berechnen
Und so weiter.
Einfach eine sehr lästige angelegenheit.
Im inet gibts natürlich auch keinen Beispielcode. wie auch xD
mfG
Re: TUI programmieren [C]
Das mit den Textareas krieg ich nicht gebacken...
Ich google mal obs was vergleichbare gibt.
Denke aber eher nicht
wenn jemand ne idee hat wie man das ändern einer Textarea per tastatur organisieren kann, wobei man beachten musst, dass es an jedem alpha-numerischen Zeichen einen Zeilchenumbruch geben könnte und man ja auch mitten drin was ändern müssen kann, kann mir gerne ein paar anreize geben.
Ich google mal obs was vergleichbare gibt.
Denke aber eher nicht
wenn jemand ne idee hat wie man das ändern einer Textarea per tastatur organisieren kann, wobei man beachten musst, dass es an jedem alpha-numerischen Zeichen einen Zeilchenumbruch geben könnte und man ja auch mitten drin was ändern müssen kann, kann mir gerne ein paar anreize geben.
Re: TUI programmieren [C]
Ich hab so etwas schin öfter mal programmiert. Auf den Textmode bezogen (alle Zeichen gleich breit), ist es etwas einfacher als in Grafikmode und Proportionalschrift.
So mache ich den Zeilenumbruch
Erstmal die erste Zeile:
Man weiß, wie breit der zur Verfügung stehende Platz für den Text ist. Dann setzt man eine Variable genau auf das letzte Zeichen der Zeile plus 1. Ist dieses Zeichen ein Leerzeichen, so überspringt man dieses (ignoriert es bei der Ausgabe) und geht weiter zur nächsten Zeile.
Ist das Zeichen KEIN Leerzeichen, so geht man auf das letzte Zeichen der Zeile und prüft nun rückwärts bis zum ersten Zeichen der Zeile auf irgend ein "Trenn-Zeichen" (Leerzeichen oder, wenn man will, auch z.B. Bindestrich oder sowas). Hat man ein Trenn-Zeichen gefunden, BEVOR man an der ersten Position angelangt ist, so erfolgt hier der Umbruch. Das heißt: Man läßt das Trennzeichen stehen, füllt die restliche Zeile mit Leerzeichen auf. Dann geht man in die nächste Zeile und fängt dort eine Textzeile an, die ab Position des Trennzeichens plus 1 geht.
Es gibt noch ein Problem, das zu bewältigen ist, nämlich, wenn im Text ein Wort/Zeichenkette kommt, die keine Trennzeichen enthält und länger ist als die zur Verfügung stehende Textfensterbreite. In diesem Fall würde man beim "Rückwärts-Suchen" des Trennzeichens ganz vorn ankommen. Das ist ein Sonderfall. In dem Fall muß man leider das Wort zerschneiden, d.h. man tut so, als würde es genau an der Textbreite getrennt. (Was bleibt einem sonst auch übrig?)
Hinweis: Beim Editieren des Textes wird sich das Ganze dabei immer nur auf die aktuelle und nachfolgende Zeilen auswirken - oder in einem Spezialfall höchstens auf die vorhergehende der aktuellen Zeile (wenn man am Anfang der aktuellen Zeile ein Wort, das zu lang für die vorige Zeile war, so verkürzt, daß es im Freiraum der vorigen Zeile jetzt Platz hat - dann würde es wieder auf die vorige Zeile gehen.
Achso: Sollte ein "Zeilenendezeichen" im Text gefunden werden (ENTER, LINEFEED, oder was immer man jeweils als Zeilenendezeichen benutzen will). ist das ein erzwungener Zeilenumbruch - hier wird dann immer umgebrochen.
Ich gehe natürlich davon aus, daß man Anzeige und Ausgabe immer trennt. D.h. intern hat man den Text als ... Array oder sonstige eindimensionale Datenstruktur liegen und die Ausgabe ist eben nur für den User.
Vielleicht ist noch zu beachten, daß wenn umgebrochen wird, sich der Cursor innerhalb des TEXTES nicht ändert, wohl aber innerhalb der Anzeige sich die Cursorposition ändern kann. Und: Man ändert ZUERST die Cursorposition und DANN testet man, ob die Y-Cursorposition (die Zeile) evtl. oberhalb der oberen Textfensterzeile oder unterhalb der unteren Textfensterzeile befindet. In diesem Fall muß der Text gescrollt (oder neu aufgebaut) werden - der Cursor muß ja immer im Textfenster sichtbar bleiben.
Ich hoffe, daß diese kleinen Anregungen weiterhelfen können.
So mache ich den Zeilenumbruch
Erstmal die erste Zeile:
Man weiß, wie breit der zur Verfügung stehende Platz für den Text ist. Dann setzt man eine Variable genau auf das letzte Zeichen der Zeile plus 1. Ist dieses Zeichen ein Leerzeichen, so überspringt man dieses (ignoriert es bei der Ausgabe) und geht weiter zur nächsten Zeile.
Ist das Zeichen KEIN Leerzeichen, so geht man auf das letzte Zeichen der Zeile und prüft nun rückwärts bis zum ersten Zeichen der Zeile auf irgend ein "Trenn-Zeichen" (Leerzeichen oder, wenn man will, auch z.B. Bindestrich oder sowas). Hat man ein Trenn-Zeichen gefunden, BEVOR man an der ersten Position angelangt ist, so erfolgt hier der Umbruch. Das heißt: Man läßt das Trennzeichen stehen, füllt die restliche Zeile mit Leerzeichen auf. Dann geht man in die nächste Zeile und fängt dort eine Textzeile an, die ab Position des Trennzeichens plus 1 geht.
Es gibt noch ein Problem, das zu bewältigen ist, nämlich, wenn im Text ein Wort/Zeichenkette kommt, die keine Trennzeichen enthält und länger ist als die zur Verfügung stehende Textfensterbreite. In diesem Fall würde man beim "Rückwärts-Suchen" des Trennzeichens ganz vorn ankommen. Das ist ein Sonderfall. In dem Fall muß man leider das Wort zerschneiden, d.h. man tut so, als würde es genau an der Textbreite getrennt. (Was bleibt einem sonst auch übrig?)
Hinweis: Beim Editieren des Textes wird sich das Ganze dabei immer nur auf die aktuelle und nachfolgende Zeilen auswirken - oder in einem Spezialfall höchstens auf die vorhergehende der aktuellen Zeile (wenn man am Anfang der aktuellen Zeile ein Wort, das zu lang für die vorige Zeile war, so verkürzt, daß es im Freiraum der vorigen Zeile jetzt Platz hat - dann würde es wieder auf die vorige Zeile gehen.
Achso: Sollte ein "Zeilenendezeichen" im Text gefunden werden (ENTER, LINEFEED, oder was immer man jeweils als Zeilenendezeichen benutzen will). ist das ein erzwungener Zeilenumbruch - hier wird dann immer umgebrochen.
Ich gehe natürlich davon aus, daß man Anzeige und Ausgabe immer trennt. D.h. intern hat man den Text als ... Array oder sonstige eindimensionale Datenstruktur liegen und die Ausgabe ist eben nur für den User.
Vielleicht ist noch zu beachten, daß wenn umgebrochen wird, sich der Cursor innerhalb des TEXTES nicht ändert, wohl aber innerhalb der Anzeige sich die Cursorposition ändern kann. Und: Man ändert ZUERST die Cursorposition und DANN testet man, ob die Y-Cursorposition (die Zeile) evtl. oberhalb der oberen Textfensterzeile oder unterhalb der unteren Textfensterzeile befindet. In diesem Fall muß der Text gescrollt (oder neu aufgebaut) werden - der Cursor muß ja immer im Textfenster sichtbar bleiben.
Ich hoffe, daß diese kleinen Anregungen weiterhelfen können.
Re: TUI programmieren [C]
Hey super, ich mache das exakt genauso. Das ist ja schonmal ne super Bestätigung, dass wir da beide gleich rangehenDOSferatu hat geschrieben:Ich hab so etwas schin öfter mal programmiert. Auf den Textmode bezogen (alle Zeichen gleich breit), ist es etwas einfacher als in Grafikmode und Proportionalschrift.
So mache ich den Zeilenumbruch
Erstmal die erste Zeile:
Man weiß, wie breit der zur Verfügung stehende Platz für den Text ist. Dann setzt man eine Variable genau auf das letzte Zeichen der Zeile plus 1. Ist dieses Zeichen ein Leerzeichen, so überspringt man dieses (ignoriert es bei der Ausgabe) und geht weiter zur nächsten Zeile.
Ist das Zeichen KEIN Leerzeichen, so geht man auf das letzte Zeichen der Zeile und prüft nun rückwärts bis zum ersten Zeichen der Zeile auf irgend ein "Trenn-Zeichen" (Leerzeichen oder, wenn man will, auch z.B. Bindestrich oder sowas). Hat man ein Trenn-Zeichen gefunden, BEVOR man an der ersten Position angelangt ist, so erfolgt hier der Umbruch. Das heißt: Man läßt das Trennzeichen stehen, füllt die restliche Zeile mit Leerzeichen auf. Dann geht man in die nächste Zeile und fängt dort eine Textzeile an, die ab Position des Trennzeichens plus 1 geht.
Es gibt noch ein Problem, das zu bewältigen ist, nämlich, wenn im Text ein Wort/Zeichenkette kommt, die keine Trennzeichen enthält und länger ist als die zur Verfügung stehende Textfensterbreite. In diesem Fall würde man beim "Rückwärts-Suchen" des Trennzeichens ganz vorn ankommen. Das ist ein Sonderfall. In dem Fall muß man leider das Wort zerschneiden, d.h. man tut so, als würde es genau an der Textbreite getrennt. (Was bleibt einem sonst auch übrig?)
Auf die Idee, nur die Text ab eine Zeile höher neu zu verarbeiten bin ich irgendwie noch nicht gekommen, werde ich aber mit einbeziehen.Hinweis: Beim Editieren des Textes wird sich das Ganze dabei immer nur auf die aktuelle und nachfolgende Zeilen auswirken - oder in einem Spezialfall höchstens auf die vorhergehende der aktuellen Zeile (wenn man am Anfang der aktuellen Zeile ein Wort, das zu lang für die vorige Zeile war, so verkürzt, daß es im Freiraum der vorigen Zeile jetzt Platz hat - dann würde es wieder auf die vorige Zeile gehen.
Achso: Sollte ein "Zeilenendezeichen" im Text gefunden werden (ENTER, LINEFEED, oder was immer man jeweils als Zeilenendezeichen benutzen will). ist das ein erzwungener Zeilenumbruch - hier wird dann immer umgebrochen.
Ja aber selbstverständlich.Ich gehe natürlich davon aus, daß man Anzeige und Ausgabe immer trennt. D.h. intern hat man den Text als ... Array oder sonstige eindimensionale Datenstruktur liegen und die Ausgabe ist eben nur für den User.
Das habe ich mir auch schon gedacht, aber es hakt an einer Sache: Wenn ich den cursor horizontal verschiebe, wie finde ich raus, ob der in die nächste Zeile muss? bzw. wie finde ich heraus bei welcher Position im String die Zeile auf dem Schirm anfängt? (das wäre ja der nötige Schritt)Vielleicht ist noch zu beachten, daß wenn umgebrochen wird, sich der Cursor innerhalb des TEXTES nicht ändert, wohl aber innerhalb der Anzeige sich die Cursorposition ändern kann. Und: Man ändert ZUERST die Cursorposition und DANN testet man, ob die Y-Cursorposition (die Zeile) evtl. oberhalb der oberen Textfensterzeile oder unterhalb der unteren Textfensterzeile befindet. In diesem Fall muß der Text gescrollt (oder neu aufgebaut) werden - der Cursor muß ja immer im Textfenster sichtbar bleiben.
Das hast du =)Ich hoffe, daß diese kleinen Anregungen weiterhelfen können.
Re: TUI programmieren [C]
Jetzt wo du das Problem mal genauer umschreibst da erinnere ich mich auch wieder daran das es ganz schön kniffelig werden kann. Von diesen Problemen sieht der Anwender wenn alles so läuft wie es soll überhaupt nichts.DOSferatu hat geschrieben:Ich hab so etwas schin öfter mal programmiert. Auf den Textmode bezogen (alle Zeichen gleich breit), ist es etwas einfacher als in Grafikmode und Proportionalschrift.
So mache ich den Zeilenumbruch
Erstmal die erste Zeile:
Man weiß, wie breit der zur Verfügung stehende Platz für den Text ist. Dann setzt man eine Variable genau auf das letzte Zeichen der Zeile plus 1. Ist dieses Zeichen ein Leerzeichen, so überspringt man dieses (ignoriert es bei der Ausgabe) und geht weiter zur nächsten Zeile.
Ist das Zeichen KEIN Leerzeichen, so geht man auf das letzte Zeichen der Zeile und prüft nun rückwärts bis zum ersten Zeichen der Zeile auf irgend ein "Trenn-Zeichen" (Leerzeichen oder, wenn man will, auch z.B. Bindestrich oder sowas). Hat man ein Trenn-Zeichen gefunden, BEVOR man an der ersten Position angelangt ist, so erfolgt hier der Umbruch. Das heißt: Man läßt das Trennzeichen stehen, füllt die restliche Zeile mit Leerzeichen auf. Dann geht man in die nächste Zeile und fängt dort eine Textzeile an, die ab Position des Trennzeichens plus 1 geht.
Es gibt noch ein Problem, das zu bewältigen ist, nämlich, wenn im Text ein Wort/Zeichenkette kommt, die keine Trennzeichen enthält und länger ist als die zur Verfügung stehende Textfensterbreite. In diesem Fall würde man beim "Rückwärts-Suchen" des Trennzeichens ganz vorn ankommen. Das ist ein Sonderfall. In dem Fall muß man leider das Wort zerschneiden, d.h. man tut so, als würde es genau an der Textbreite getrennt. (Was bleibt einem sonst auch übrig?)
Hinweis: Beim Editieren des Textes wird sich das Ganze dabei immer nur auf die aktuelle und nachfolgende Zeilen auswirken - oder in einem Spezialfall höchstens auf die vorhergehende der aktuellen Zeile (wenn man am Anfang der aktuellen Zeile ein Wort, das zu lang für die vorige Zeile war, so verkürzt, daß es im Freiraum der vorigen Zeile jetzt Platz hat - dann würde es wieder auf die vorige Zeile gehen.
Achso: Sollte ein "Zeilenendezeichen" im Text gefunden werden (ENTER, LINEFEED, oder was immer man jeweils als Zeilenendezeichen benutzen will). ist das ein erzwungener Zeilenumbruch - hier wird dann immer umgebrochen.
Ich gehe natürlich davon aus, daß man Anzeige und Ausgabe immer trennt. D.h. intern hat man den Text als ... Array oder sonstige eindimensionale Datenstruktur liegen und die Ausgabe ist eben nur für den User.
Vielleicht ist noch zu beachten, daß wenn umgebrochen wird, sich der Cursor innerhalb des TEXTES nicht ändert, wohl aber innerhalb der Anzeige sich die Cursorposition ändern kann. Und: Man ändert ZUERST die Cursorposition und DANN testet man, ob die Y-Cursorposition (die Zeile) evtl. oberhalb der oberen Textfensterzeile oder unterhalb der unteren Textfensterzeile befindet. In diesem Fall muß der Text gescrollt (oder neu aufgebaut) werden - der Cursor muß ja immer im Textfenster sichtbar bleiben.
Ich hoffe, daß diese kleinen Anregungen weiterhelfen können.
Nur Programmierer die sich einem vergleichbaren Problem schon einmal gewidmet haben können das wirklich nachvollziehen.
Dirk
Re: TUI programmieren [C]
Diese Position müsste sich doch aus den verwendeten Werten errechnen lassen, ggf. muss dafür ein früherer Wert gerettet werden, falls ein Wert nicht mehr vorhanden ist um die Berechnung vorzunehmen. Ohne Codebeispiel fällt es mir jedoch immer schwer solche Probleme woran ich nicht aktuell selber arbeite zu erkennen.oDOSseus hat geschrieben:Das habe ich mir auch schon gedacht, aber es hakt an einer Sache: Wenn ich den cursor horizontal verschiebe, wie finde ich raus, ob der in die nächste Zeile muss? bzw. wie finde ich heraus bei welcher Position im String die Zeile auf dem Schirm anfängt? (das wäre ja der nötige Schritt)
Dirk
Re: TUI programmieren [C]
Ich könnte ne Routine schreiben um für eine ganz bestimmte Zeile die Position im String zu bestimmen, wo sie gebrochen wird.
Diese Position merk ich mir dann und wenn der cursor sie erreicht, wird er umgebrochen.
Poroblem: Ich muss diese Poition bei jedem Druck neu bestimmen und dabei ja alle vorangegangenen Zeilenbrüche analysieren.
Lösung:
Ich merke mir auch die Stelle wo die Zeile anfängt und berechne dann immer neu anhand dieser Stelle, wo der umbruch stattfindet. Klingt das intelligent? Ich bin mir noch nich so sicher.
Diese Position merk ich mir dann und wenn der cursor sie erreicht, wird er umgebrochen.
Poroblem: Ich muss diese Poition bei jedem Druck neu bestimmen und dabei ja alle vorangegangenen Zeilenbrüche analysieren.
Lösung:
Ich merke mir auch die Stelle wo die Zeile anfängt und berechne dann immer neu anhand dieser Stelle, wo der umbruch stattfindet. Klingt das intelligent? Ich bin mir noch nich so sicher.
Re: TUI programmieren [C]
Das hört sich gut an.oDOSseus hat geschrieben:Ich könnte ne Routine schreiben um für eine ganz bestimmte Zeile die Position im String zu bestimmen, wo sie gebrochen wird.
Diese Position merk ich mir dann und wenn der cursor sie erreicht, wird er umgebrochen.
Poroblem: Ich muss diese Poition bei jedem Druck neu bestimmen und dabei ja alle vorangegangenen Zeilenbrüche analysieren.
Lösung:
Ich merke mir auch die Stelle wo die Zeile anfängt und berechne dann immer neu anhand dieser Stelle, wo der umbruch stattfindet. Klingt das intelligent? Ich bin mir noch nich so sicher.
Dirk
Re: TUI programmieren [C]
Die Motivation is sehr klein immo, weil die textearea mehr stress als spaß macht und die Ferien werde ich mit Praktikum und lernen verbringen. Demnach wird sich das hinziehen.
ich WERDE es 100 PROZENTIG vollenden. dauert halt nur.
mfG
ich WERDE es 100 PROZENTIG vollenden. dauert halt nur.
mfG
Re: TUI programmieren [C]
Gut zu wissen, ich kann warten so lange es eben dauert. Rom ist auch nicht an einem Tag erbaut worden.oDOSseus hat geschrieben:Die Motivation is sehr klein immo, weil die textearea mehr stress als spaß macht und die Ferien werde ich mit Praktikum und lernen verbringen. Demnach wird sich das hinziehen.
ich WERDE es 100 PROZENTIG vollenden. dauert halt nur.
mfG
Dirk