Changes between Version 8 and Version 9 of squeak_faq


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

reordering + Class>>Method formatting

Legend:

Unmodified
Added
Removed
Modified
  • squeak_faq

    v8 v9  
    44
    55
     6== Dokumentation ==
     7
     8
     9
     10=== Wo finde ich Dokumentation? ===
     11
     12Es gibt für einige Klassen Dokumentation gleich im Browser. Der ? Button zwischen Class und Instance zeigt die Klassenkommentare an.
     13Weiterhin findet ihr hier Informationen:
     14
     15
     16* [http://squeakbyexample.org/ Squeak by Example]
     17* [http://static.squeak.org/tutorials/morphic-tutorial-1.html Morphic Tutorial
     18* [http://wiki.squeak.org/squeak/30 Squeak-Wiki
     19
     20
     21=== Woher ist gute Einführungsliteratur für !Squeak/Smalltalk zu finden? ===
     22
     23Das Buch [http://www.squeakbyexample.org/ Squeak by Example] ist besonders geeignet, da es explizit auf
     24alle wichtigen Tools in Squeak und auch auf das Morphic-Framework
     25eingeht. Außerdem wird an vielen Beispielen die minimale Syntax und
     26wichtige Konzepte wie die Nachrichtenbasierung erklärt.
     27
     28Weiterhin gibt es noch einige praktische Tutorials zu Morphic
     29im Squeak-Wiki, die auch Hinweise zur Arbeit mit Squeak geben.
     30[http://wiki.squeak.org/squeak/792#Morphic Morphic-Wiki]
     31
     32Zum Einstieg in !Squeak/Smalltalk sind viele gute Bücher kostenlos
     33verfügbar. Eine gute Übersicht bietet:
     34[href="http://stephane.ducasse.free.fr/FreeBooks.html Free Books]
     35
    636
    737== Grafik und Morphic ==
     
    939=== Wie werden Grafiken im Image verwendet? ===
    1040
    11 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 >>formFromFileNamed: fileName, was in der konkreten Implementierung genutzt werden kann.
     41Der 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.
     42
    1243
    1344=== Welche Dateiformate für Bilder sind für Squeak geeignet? ===
     
    2253=== Wie schaffe ich es, dass ein Morph nicht mehr verschiebbar ist? ===
    2354
    24 Werft einen Blick auf die Methode Morph>>lock.
     55Werft einen Blick auf die Methode ``Morph>>lock``.
    2556
    2657
     
    71102=== Wir wollen einen Morph (inklusive Submorphs) als .png Datei abspeichern. ===
    72103
    73 Verwendet dazu Morph>>exportAsPng.
     104Verwendet dazu ``Morph>>exportAsPng``.
    74105
    75106
     
    85116=== Gibt es in Squeak eine Möglichkeite Bilder in eine Package einzubetten als Ressource? Oder kann man Bilder nur aus Dateien laden? ===
    86117
    87 Die Klasse !SystemWindow besitzt eine Reihe von Class-methods, die allesamt auf *Image enden. (z.B. SystemWindow>>menuBoxImage)
     118Die Klasse !SystemWindow besitzt eine Reihe von Class-methods, die allesamt auf *Image enden. (z.B. ``SystemWindow>>menuBoxImage``)
    88119Diese Methoden geben Arrays zurück, die die Bildinformationen enthalten aus denen dann Form-Objekte erzeugt werden.
    89120Form ist die "Squeak's Canvas". Eine Bitmap, die Bilder enthalten kann oder auf der gezeichnet
     
    98129Mit Klassen wie !FileDirectory oder !FileUrl kann im Dateisystem navigiert werden.
    99130Hierbei gilt es auch zu bedenken, dass die "Pathdelimiter" der Betriebssysteme unterschiedlich
    100 sein können (/ oder \, ). Für Plattformunabnhängigkeit könnt ihr GRPlatform>>pathSeparator.
     131sein können (/ oder \, ). Für Plattformunabnhängigkeit könnt ihr ``GRPlatform>>pathSeparator``.
    101132
    102133
     
    104135und damit im Image gespeichert werden sollen, können Array-Repräsentationen
    105136gewonnen werden, indem das Bild, wie oben beschrieben, in eine Form geladen wird
    106 und aus dieser dann das Array (s. z.B. Form>>storeOn).
     137und aus dieser dann das Array (s. z.B. ``Form>>storeOn``).
    107138
    108139
     
    126157
    127158Anzumerken ist, dass der von Textmorphs enthaltene Text direkt auf diesem verändert werden kann.
    128 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.
     159Dabei 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.
    129160
    130161
     
    173204== Image ==
    174205
     206=== Wie erreiche ich Nebenläufigkeit in Squeak? ===
     207
     208Die üblichen Mechanismen Semaphore und Mutex zur Synchronisation mehrerer Prozesse sind in Squeak als Klassen verfügbar.
     209
     210Übliches Vorgehen ist z.B.
     211{{{
     212| semaphore |
     213semaphore := Semaphore new.
     214[ .... do some work ...
     215  semaphore signal ] fork.
     216semaphore wait.
     217}}}
     218Für einfache Nebenläufigkeit ohne Synchronisation existiert ``BlockClosure>>fork``.
     219{{{
     220[50000 factorial] forkAt: ProcessScheduler userBackgroundPriority
     221}}}
     222
     223
     224
     225=== Was ist die richtige Art, Klassenvariablen anzulegen? Auf Instanzseite in ``classVariableNames:`` oder auf Klassenseite in ``instanceVariableNames:``? ===
     226
     227Dafü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.
     228Um Klassenvariablen (sowohl Klasse als auch Instanzen der Klasse können in Methoden darauf zugreifen) zu erhalten, sind somit die instanzseitigen Klassenvariablen die richtige Wahl.
     229Uns hatte man damals für den Singletonfall auch geraten, die Instanzseite zu nehmen, um die Singletoninstanz zu speichern.
     230
     231Erklärung nach http://www.faqs.org/faqs/smalltalk-faq/:
     232
     233    Q6. What are class instance variables?
     234    Ans. Class instance variables are similar to class variables, except that they are created for eachsubclass of the defining class. When a class declares a class instance variable, a new variable is created for each subclass of that class. Each subclass then has its own instance of the variable and retains its own value for the variable, but each subclass has a variable with the same name. Only class methods of a class and its subclasses can refer to class instance variables; instance methods cannot.
     235
     236
     237
    175238=== Wie kann ich ein selbst gespeichertes Image mit der VM öffnen? ===
    176239
     
    194257
    195258Du kannst im Process-Browser mit Rechtsklick->Explore auf den betreffenden Prozess den Object Explorer öffnen, und in diesem dann "self terminate." ausführen.
    196 
    197 
    198 === Wo finde ich Dokumentation? ===
    199 
    200 Es gibt für einige Klassen Dokumentation gleich im Browser. Der ? Button zwischen Class und Instance zeigt die Klassenkommentare an.
    201 Weiterhin findet ihr hier Informationen:
    202 
    203 
    204 * [http://squeakbyexample.org/ Squeak by Example]
    205 * [http://static.squeak.org/tutorials/morphic-tutorial-1.html Morphic Tutorial
    206 * [http://wiki.squeak.org/squeak/30 Squeak-Wiki
    207259
    208260
     
    382434
    383435
    384 
     436== GemStone ==
     437
     438=== Welche Streams verwendet man zum Dateien schreiben auf GemStone? ===
     439
     440Dateibehandlung findet in Gemstone mit Hilfe der Klasse !GsFile statt.
     441In Gemstone gibt es immer die Unterscheidung, ob etwas auf dem Client
     442(also, !GemTools oder seaside-gem) oder Server (also stone) passiert.
     443Darauf beziehen sich dann die entsprechenden *onClient* und *onServer*-
     444methoden auf Klassenseite von !GsFile.
    385445
    386446
     
    416476
    417477
    418 
    419 
    420 == Ohne Kategorie ==
    421 
    422 === Hat Squeak einen Eventhandler für Netzwerkevents? Wie kann man eine Methode aufrufen, sobald Daten angekommen sind? ===
    423 
    424 Das 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.
    425 
    426 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.
    427 
    428 Um das Warten zu realisieren, schaut euch die Klasse Delay an.
    429 Es gibt aber noch weiter Synchronisationsprimitiven, insbesondere wenn ihr Sockets benutzt:
    430 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).
    431 
    432 Die 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.
    433 
    434 
    435 === Wie viel Kommentare sind nötig/erwünscht? ===
    436 
    437 Eine einfache Regel besagt: "So viel wie nötig, so wenig wie möglich".
    438 Schaut euch einfach noch einmal die Idiome zum Kommentieren an (findet ihr
    439 in den Vorlesungsfolien, sowohl von Kent Beck als auch Dave Thomas).
    440 
     478== Patterns ==
    441479
    442480
    443481=== State und Strategy Pattern – Was ist der Unterschied? ===
    444482
    445 Die Strukturen der beiden Muster sind schon sehr ähnlich aber was sie wesentlich unterscheidet ist ihre Intention. Beim State Pattern geht es darum einen Zustand abzubilden und mit diesem verschiedenes Verhalten zu erzeugen. Die Verhaltensvariation unterliegt also der Zustandsklasse und der Client setzt hauptsächlich seinen Zustand und nutzt diesen. Beim Strategy Muster entscheidet der Client aber bewusst ein anderes Verhalten zu benutzen und kennt daher dessen Umsetzung, Vor- und Nachteile. Im GoF Buch gibt es für State das Beispiel der TCP Connection, welche je nach Zustand zwar die selben Nachrichten versteht aber unterschiedlich reagiert.Hingegen beim Strategy
    446 Muster wurde ein Compositor zur Ausgabe von Text gewählt, hier entscheidet der Client ganz bewusst die Ausgabe in TeX oder normalen Text zu rendern
    447 .
     483Die Strukturen der beiden Muster sind schon sehr ähnlich aber was sie wesentlich unterscheidet ist ihre Intention. Beim State Pattern geht es darum einen Zustand abzubilden und mit diesem verschiedenes Verhalten zu erzeugen. Die Verhaltensvariation unterliegt also der Zustandsklasse und der Client setzt hauptsächlich seinen Zustand und nutzt diesen. Beim Strategy Muster entscheidet der Client aber bewusst ein anderes Verhalten zu benutzen und kennt daher dessen Umsetzung, Vor- und Nachteile. Im GoF Buch gibt es für State das Beispiel der TCP Connection, welche je nach Zustand zwar die selben Nachrichten versteht aber unterschiedlich reagiert. Beim Strategy Muster wurde ein Compositor zur Ausgabe von Text gewählt, hier entscheidet der Client ganz bewusst die Ausgabe in TeX oder normalen Text zu rendern .
     484
    448485über die Häufigkeit des Austauschens würde ich jedoch keine Aussage treffen wollen, da dies sehr vom Anwendungsfall abhängt.
    449486Der Zustand der Strategy Algorithmen sollte keinen direkten Einfluss auf den Zustand des Clients haben. Beim State kann das jedoch der Fall sein, z.B. ist die TCPConnection abgebrochen und der Client zeigt eine Fehlermeldung
     
    451488
    452489
    453 === Ist Late Binding das Mittel, um Polymorphie zu erreichen und hat ohne diesen keine Funktion? ===
     490
     491== Ohne Kategorie ==
     492
     493
     494=== Wie viel Kommentare sind nötig/erwünscht? ===
     495
     496Eine einfache Regel besagt: "So viel wie nötig, so wenig wie möglich".
     497Schaut euch einfach noch einmal die Idiome zum Kommentieren sowohl von Kent Beck als auch Dave Thomas an. Diese findet ihr in den [[https://www.hpi.uni-potsdam.de/intern/studium/materialien Vorlesungsfolien und der begleitenden Literatur zur Lehrveranstaltung].
     498
     499
     500=== Hat Squeak einen Eventhandler für Netzwerkevents? Wie kann man eine Methode aufrufen, sobald Daten angekommen sind? ===
     501
     502Das 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.
     503
     504Von 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.
     505
     506Um das Warten zu realisieren, schaut euch die Klasse Delay an.
     507Es gibt aber noch weiter Synchronisationsprimitiven, insbesondere wenn ihr Sockets benutzt:
     508Je 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).
     509
     510Die 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.
     511
     512
     513
     514=== Ist Late Binding nur ein Mittel, um Polymorphie zu erreichen? ===
    454515
    455516Polymorhpie kann auch ohne späte Bindung erreicht werden. Zum Beispiel in C++ stehen polymorphe Methoden schon zur Übersetzungszeit fest, wenn sie nicht mit dem Schlüsselwort "virtual" markiert sind [http://en.wikipedia.org/wiki/Late_binding#Late_binding_in_C.2B.2B Dynamic Dispatch in C++]. Late binding ermöglicht polymorphe Methoden auf Objekten, deren Klasse erst zur Laufzeit bestimmt werden kann.
     
    466527
    467528
    468 === Gibt es in Squeak so etwas wie eine !FileDialog Klasse? ===
    469 
    470 Helfen kann euch hier die Klasse !FileList.
    471 
    472 
    473 === Was ist die richtige Art, Klassenvariablen anzulegen? Auf Instanzseite in ``classVariableNames:`` oder auf Klassenseite in ``instanceVariableNames:``? ===
    474 
    475 Dafü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.
    476 Um Klassenvariablen (sowohl Klasse als auch Instanzen der Klasse können in Methoden darauf zugreifen) zu erhalten, sind somit die instanzseitigen Klassenvariablen die richtige Wahl.
    477 Uns hatte man damals für den Singletonfall auch geraten, die Instanzseite zu nehmen, um die Singletoninstanz zu speichern.
    478 
    479 Erklärung nach http://www.faqs.org/faqs/smalltalk-faq/:
    480 
    481     Q6. What are class instance variables?
    482     Ans. Class instance variables are similar to class variables, except that they are created for eachsubclass of the defining class. When a class declares a class instance variable, a new variable is created for each subclass of that class. Each subclass then has its own instance of the variable and retains its own value for the variable, but each subclass has a variable with the same name. Only class methods of a class and its subclasses can refer to class instance variables; instance methods cannot.
    483 
    484 
    485 === Woher ist gute Einführungsliteratur für Squeak zu finden? ===
    486 
    487 Das Buch [http://www.squeakbyexample.org/ Squeak by Example] ist besonders geeignet, da es explizit auf
    488 alle wichtigen Tools in Squeak und auch auf das Morphic-Framework
    489 eingeht. Außerdem wird an vielen Beispielen die minimale Syntax und
    490 wichtige Konzepte wie die Nachrichtenbasierung erklärt.
    491 
    492 Weiterhin gibt es noch einige praktische Tutorials zu Morphic
    493 im Squeak-Wiki, die auch Hinweise zur Arbeit mit Squeak geben.
    494 [http://wiki.squeak.org/squeak/792#Morphic Morphic-Wiki]
    495 
    496 Zum Einstieg in !Squeak/Smalltalk sind viele gute Bücher kostenlos
    497 verfügbar. Eine gute Übersicht bietet:
    498 [href="http://stephane.ducasse.free.fr/FreeBooks.html Free Books]
    499 
    500 
    501529=== Wie konkateniert man Strings? ===
    502530
     
    510538'abc' , Character tab , 'abc'
    511539}}}
    512 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 #=).
     540da ``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 #=).
    513541
    514542Bedenkt bitte, dass ihr bei sehr komplexen String Konkatenationen besser auf Streams zurückgreifen solltet:
     
    522550
    523551
     552
     553=== Gibt es in Squeak so etwas wie eine !FileDialog Klasse? ===
     554
     555Helfen kann euch hier die Klasse !FileList.
     556
     557
    524558=== Setzt man in Smalltalk nach dem return einen Punkt oder nicht? ===
    525559
     
    527561
    528562
    529 === Welche Streams verwendet man zum Dateien schreiben auf Gemstone? ===
    530 
    531 Dateibehandlung findet in Gemstone mit Hilfe der Klasse !GsFile statt.
    532 In Gemstone gibt es immer die Unterscheidung, ob etwas auf dem Client
    533 (also, !GemTools oder seaside-gem) oder Server (also stone) passiert.
    534 Darauf beziehen sich dann die entsprechenden *onClient* und *onServer*-
    535 methoden auf Klassenseite von !GsFile.
    536 
    537 
    538 === Wie erreiche ich Nebenläufigkeit in Squeak? ===
    539 
    540 Die üblichen Mechanismen Semaphore und Mutex zur Synchronisation mehrerer Prozesse sind in Squeak als Klassen verfügbar.
    541 
    542 Übliches Vorgehen ist z.B.
    543 {{{
    544 | semaphore |
    545 semaphore := Semaphore new.
    546 [ .... do some work ...
    547   semaphore signal ] fork.
    548 semaphore wait.
    549 }}}
    550 Für einfache Nebenläufigkeit ohne Synchronisation existiert BlockClosure>>fork.
    551 {{{
    552 [50000 factorial] forkAt: ProcessScheduler userBackgroundPriority
    553 }}}
     563= Acknowledgments =
     564[[Image(media/icons/silk:user.png, nolink)]] To date the following contributors:
     565 * Developer1
     566 * Developer2