Changes between Version 11 and Version 12 of squeak_faq


Ignore:
Timestamp:
10/14/2013 03:59:48 PM (11 years ago)
Author:
willi.mueller
Comment:

fixed markup for AClass>>method, fixed doc links

Legend:

Unmodified
Added
Removed
Modified
  • squeak_faq

    v11 v12  
    1010=== Wo finde ich Dokumentation? ===
    1111
    12 Es gibt für einige Klassen Dokumentation gleich im Browser. Der ? Button zwischen Class und Instance zeigt die Klassenkommentare an.
     12Es gibt für einige Klassen Dokumentation gleich im Browser. Der "?" Button zwischen Class und Instance zeigt die Klassenkommentare an.
    1313Weiterhin findet ihr hier Informationen:
    1414
     
    1616* [http://squeakbyexample.org/ Squeak by Example]
    1717
    18 * [http://static.squeak.org/tutorials/morphic-tutorial-1.html Morphic Tutorial
    19 
    20 * [http://wiki.squeak.org/squeak/30 Squeak-Wiki
     18* [http://static.squeak.org/tutorials/morphic-tutorial-1.html Morphic Tutorial]
     19
     20* [http://wiki.squeak.org/squeak/30 Squeak-Wiki]
    2121
    2222
     
    3333
    3434Zum Einstieg in !Squeak/Smalltalk sind viele gute Bücher kostenlos
    35 verfügbar. Eine gute Übersicht bietet:
    36 [href="http://stephane.ducasse.free.fr/FreeBooks.html Free Books]
     35verfügbar. Eine gute Übersicht bietet [http://stephane.ducasse.free.fr/FreeBooks.html Stephane Ducasse: Free Books]
    3736
    3837
     
    4140=== Wie werden Grafiken im Image verwendet? ===
    4241
    43 Der Dreh und Angelpunkt ist hier die Klasse Form. Die Basis von Form ist die "Squeak Canvas", eine Bitmap, die Bilder enthält, oder auf der gezeichnet werden kann. Diese Objekte können dann in !ImageMorphs verwendet werden. Bei größeren oder vielen Bildern lohnt ein Blick auf die Klassenseite von Form. Da gibt es eine Methode, die aus einer Datei direkt ein Form-Objekt lädt. Ähnliches findet sich auch auf den Klassenseiten von den Klassen PNGReadWriter, JPEGReadWriter, GIFReadWriter und weitere für spezielle Bildformate. Mit Klassen wie !FileDirectory oder !FileUrl kann im Dateisystem navigiert werden. Hierbei gilt es auch zu bedenken, dass die "Pathdelimiter" der Betriebssysteme unterschiedlich sein können (/ oder \). Bilder können auch im Image gespeichert werden. Das hat den Vorteil, das ihr die Bilder über Monticello verwalten könnt und so alle Teammitglieder über das Repository die aktuellen Bilder bekommen. Der große Nachteil ist, dass ihr die Größe des Images aufbläht. Wenn trotz ihr trotz dieses Nachteils Bilder in Methoden und damit im Image speichern wollt, könnt ihr Array-Repräsentationen gewinnen. Dazu laded ihr das Bild, wie oben beschrieben, zuerst in eine Form und aus dieser erzeugt ihr dann das Array (siehe. z.B. ``Form>>storeOn``). Es gibt in Squeak den !ImageReadWriter als abstrakte Klasse und dazu verschiedene Implementierungen für z.B. BMP und PNG (PNGReadWriter, BMPReadWriter). Auf Klassenseite von !ImageReadWriter findet sich dann auch ``ImageWriter ``class>>formFromFileNamed``:``, was in der konkreten Implementierung genutzt werden kann.
     42Der Dreh und Angelpunkt ist hier die Klasse Form. Die Basis von Form ist die "Squeak Canvas", eine Bitmap, die Bilder enthält, oder auf der gezeichnet werden kann. Diese Objekte können dann in !ImageMorphs verwendet werden. Bei größeren oder vielen Bildern lohnt ein Blick auf die Klassenseite von Form. Da gibt es eine Methode, die aus einer Datei direkt ein Form-Objekt lädt. Ähnliches findet sich auch auf den Klassenseiten von den Klassen PNGReadWriter, JPEGReadWriter, GIFReadWriter und weitere für spezielle Bildformate. Mit Klassen wie !FileDirectory oder !FileUrl kann im Dateisystem navigiert werden. Hierbei gilt es auch zu bedenken, dass die "Pathdelimiter" der Betriebssysteme unterschiedlich sein können (/ oder \). Bilder können auch im Image gespeichert werden. Das hat den Vorteil, das ihr die Bilder über Monticello verwalten könnt und so alle Teammitglieder über das Repository die aktuellen Bilder bekommen. Der große Nachteil ist, dass ihr die Größe des Images aufbläht. Wenn trotz ihr trotz dieses Nachteils Bilder in Methoden und damit im Image speichern wollt, könnt ihr Array-Repräsentationen gewinnen. Dazu laded ihr das Bild, wie oben beschrieben, zuerst in eine Form und aus dieser erzeugt ihr dann das Array (siehe. z.B. `Form>>storeOn`). Es gibt in Squeak den !ImageReadWriter als abstrakte Klasse und dazu verschiedene Implementierungen für z.B. BMP und PNG (PNGReadWriter, BMPReadWriter). Auf Klassenseite von !ImageReadWriter findet sich dann auch `ImageWriter `class>>formFromFileNamed`:`, was in der konkreten Implementierung genutzt werden kann.
    4443
    4544
     
    5554=== Wie schaffe ich es, dass ein Morph nicht mehr verschiebbar ist? ===
    5655
    57 Werft einen Blick auf die Methode ``Morph>>lock``.
     56Werft einen Blick auf die Methode `Morph>>lock`.
    5857
    5958
     
    104103=== Wir wollen einen Morph (inklusive Submorphs) als .png Datei abspeichern. ===
    105104
    106 Verwendet dazu ``Morph>>exportAsPng``.
     105Verwendet dazu `Morph>>exportAsPng`.
    107106
    108107
     
    118117=== Gibt es in Squeak eine Möglichkeite Bilder in eine Package einzubetten als Ressource? Oder kann man Bilder nur aus Dateien laden? ===
    119118
    120 Die Klasse !SystemWindow besitzt eine Reihe von Class-methods, die allesamt auf *Image enden. (z.B. ``SystemWindow>>menuBoxImage``)
     119Die Klasse !SystemWindow besitzt eine Reihe von Class-methods, die allesamt auf *Image enden. (z.B. `SystemWindow>>menuBoxImage`)
    121120Diese Methoden geben Arrays zurück, die die Bildinformationen enthalten aus denen dann Form-Objekte erzeugt werden.
    122121Form ist die "Squeak's Canvas". Eine Bitmap, die Bilder enthalten kann oder auf der gezeichnet
     
    131130Mit Klassen wie !FileDirectory oder !FileUrl kann im Dateisystem navigiert werden.
    132131Hierbei gilt es auch zu bedenken, dass die "Pathdelimiter" der Betriebssysteme unterschiedlich
    133 sein können (/ oder \, ). Für Plattformunabnhängigkeit könnt ihr ``GRPlatform>>pathSeparator``.
     132sein können (/ oder \, ). Für Plattformunabnhängigkeit könnt ihr `GRPlatform>>pathSeparator`.
    134133
    135134
     
    137136und damit im Image gespeichert werden sollen, können Array-Repräsentationen
    138137gewonnen werden, indem das Bild, wie oben beschrieben, in eine Form geladen wird
    139 und aus dieser dann das Array (s. z.B. ``Form>>storeOn``).
     138und aus dieser dann das Array (s. z.B. `Form>>storeOn`).
    140139
    141140
     
    159158
    160159Anzumerken ist, dass der von Textmorphs enthaltene Text direkt auf diesem verändert werden kann.
    161 Dabei ist die Eingabe in !TextMorphs durchaus gewollt. Wenn ihr dies verhindern wollt, müsst ihr sie locken. Weiterhin brechen diese Morphs automatisch den Text um, wenn der Platz (definiert durch die Bounds) nicht ausreichend ist. Das so genannte Word Wrapping kann aber auch deaktiviert werden (siehe ``TextMorph>>wrapOnOff``). Wenn in einer Zeile mehr als nur 3-4 Zeichen geschrieben werden sollen, so muss man ihm eben mehr Platz geben also vergrößern. Beide Eigenschaften lassen sich auch mit dem vorgefertigten !TextMorph über Halos und Menüs implementieren.
     160Dabei ist die Eingabe in !TextMorphs durchaus gewollt. Wenn ihr dies verhindern wollt, müsst ihr sie locken. Weiterhin brechen diese Morphs automatisch den Text um, wenn der Platz (definiert durch die Bounds) nicht ausreichend ist. Das so genannte Word Wrapping kann aber auch deaktiviert werden (siehe `TextMorph>>wrapOnOff`). Wenn in einer Zeile mehr als nur 3-4 Zeichen geschrieben werden sollen, so muss man ihm eben mehr Platz geben also vergrößern. Beide Eigenschaften lassen sich auch mit dem vorgefertigten !TextMorph über Halos und Menüs implementieren.
    162161
    163162
     
    218217semaphore wait.
    219218}}}
    220 Für einfache Nebenläufigkeit ohne Synchronisation existiert ``BlockClosure>>fork``.
     219Für einfache Nebenläufigkeit ohne Synchronisation existiert `BlockClosure>>fork`.
    221220{{{
    222221[50000 factorial] forkAt: ProcessScheduler userBackgroundPriority
     
    225224
    226225
    227 === Was ist die richtige Art, Klassenvariablen anzulegen? Auf Instanzseite in ``classVariableNames:`` oder auf Klassenseite in ``instanceVariableNames:``? ===
     226=== Was ist die richtige Art, Klassenvariablen anzulegen? Auf Instanzseite in `classVariableNames:` oder auf Klassenseite in `instanceVariableNames:`? ===
    228227
    229228Dafür ist die instanzseitige Klassenvariable die richtige Wahl. Die klassenseitige Instanzvariable existiert nur auf Grund der Tatsache, dass Squeak ein Metaobjectprotocol besitzt und somit Klassen selbst wieder Instanz einer anderen Klasse sind. Daher besitzen sie auch Instanzvariablen. Allerdings sind die Instanzvariablen auch nur für die Klasse und nicht für Ihre Instanzen einsehbar.
     
    245244=== Hilfe, ich habe hunderte Morphs die alle eine falsche Methode steppen. Was kann ich sie stoppen? ===
    246245
    247 1.) Wenn es sich um eine einzige Methode handelt, könntest du versuchen diese mit einem "User Interrupt" zu unterbrechen: strg/alt und . (!Windows/Linux) bzw. cmd und . (Mac)
     2461.) Wenn es sich um eine einzige Methode handelt, könntest du versuchen diese mit einem "User Interrupt" zu unterbrechen: strg + . (Windows) alt + . (Linux), cmd + . (OS X)
    248247
    249248
     
    504503Das kommt sehr auf eure Netzwerkimplementierung an. Nutz ihr ein Standardprotokoll, so sollte die verwendete Bibliothek im Allgemeinen auch entsprechende Methoden bereitstellen. Häufig sind diese transparent, so dass die Methoden automatisch gerufen werden, sobald ein neuer Request eintrifft. Um Beispiele dafür zu sehen, schaut euch einmal im Image den WAListener an, welcher den Webserver für Seaside implementiert. Dort wird auch gezeigt wie man Prozesse "forked" um mehrere Requests gleichzeitig zu behandeln.
    505504
    506 Von dem Ansatz die ganze Sache in Morphic und dessen #step Methode abzubilden, raten wir schlichtweg ab. Der Grund: die #step Methode ist nur scheinbar parallelisiert und sollte eine Methode auf ``SocketStream>>isDataAvailable`` warten, steht das ganze System. Ihr müsste also auf jeden Fall mit mehreren Prozessen arbeiten. Dafür verwendet ihr wie gesagt die ``fork``-methode.
     505Von dem Ansatz die ganze Sache in Morphic und dessen #step Methode abzubilden, raten wir schlichtweg ab. Der Grund: die #step Methode ist nur scheinbar parallelisiert und sollte eine Methode auf `SocketStream>>isDataAvailable` warten, steht das ganze System. Ihr müsste also auf jeden Fall mit mehreren Prozessen arbeiten. Dafür verwendet ihr wie gesagt die `fork`-methode.
    507506
    508507Um das Warten zu realisieren, schaut euch die Klasse Delay an.
    509508Es gibt aber noch weiter Synchronisationsprimitiven, insbesondere wenn ihr Sockets benutzt:
    510 Je nachdem ob ihr Socket oder !SocketStream verwendet, gibt es entsprechende Methoden die sich schlafen legen bis Daten verfügbar sind, z.B. ``Socket>>waitForData`` (siehe Kommentar).
     509Je nachdem ob ihr Socket oder !SocketStream verwendet, gibt es entsprechende Methoden die sich schlafen legen bis Daten verfügbar sind, z.B. `Socket>>waitForData` (siehe Kommentar).
    511510
    512511Die Netzwerkfähigkeit wäre zwar sicher ein schönes Feature ist aber ohne entsprechende Vorkenntnisse in dem Bereich nicht ganz einfach. Überlegt es euch daher vielleicht, ob ihr dies wirklich implementieren möchtet.
     
    526525Dort habt ihr eine MD5 Klasse. Folgt dem Beispiel in der Methode
    527526#hashStream:. Aber Achtung, [http://de.wikipedia.org/wiki/MD5 MD5] ist sehr unsicher, da sehr leicht Kollisionen gefunden werden können.
    528 Seaside nutzt deswegen üblicherweise den SHA Algorithmus. Diesen könnt ihr bereits in eurem Image finden unter der Klasse ``SecureHashAlgorithm`. Dort schaut euch einfach die Methoden unter dem 'public' Protokoll an.
     527Seaside nutzt deswegen üblicherweise den SHA Algorithmus. Diesen könnt ihr bereits in eurem Image finden unter der Klasse `SecureHashAlgorithm`. Dort schaut euch einfach die Methoden unter dem 'public' Protokoll an.
    529528
    530529
     
    540539'abc' , Character tab , 'abc'
    541540}}}
    542 da ``String>>``,`` die Nachricht #asString an seinen Parameter sendet. Unterschiedlich sieht das nur aus wenn man es per print it (cmd/strg + p) ausgibt, da tab halt je nach Position in unterschiedlicher Länge gerendert wird. Die Strings sind aber gleich (im Sinne von #=).
     541da `String>>`,` die Nachricht #asString an seinen Parameter sendet. Unterschiedlich sieht das nur aus wenn man es per print it (cmd/strg + p) ausgibt, da tab halt je nach Position in unterschiedlicher Länge gerendert wird. Die Strings sind aber gleich (im Sinne von #=).
    543542
    544543Bedenkt bitte, dass ihr bei sehr komplexen String Konkatenationen besser auf Streams zurückgreifen solltet: