Changes between Version 1 and Version 2 of squeak_faq


Ignore:
Timestamp:
10/14/2013 12:20:01 PM (11 years ago)
Author:
willi.mueller
Comment:

First conversion of /squeakfaq html in wiki

Legend:

Unmodified
Added
Removed
Modified
  • squeak_faq

    v1 v2  
    22
    33= Squeak FAQ =
    4 
    5 ''Just some words to explain the basic use case of this project. Maybe some related work.''
    6 
    7 {{{
    8 #!div style="clear:both;"
    9 }}}
     4== Wie werden Grafiken im Image verwendet? ==
     5
     6Der 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.
     7
     8
     9== Welche Dateiformate für Bilder sind für Squeak geeignet? ==
     10
     11Benutzt hier am besten PNG, JPG oder BMP. Zum Einlesen bietet sich dann beispielweise die ReadWriter Klassen an. Übrigens können Forms auch mit Transparenz umgehen.
     12
     13
     14== Können ImageMorph bzw. deren enthaltene Form mit Alphatranparenz umgehen? Wie können ganze Morphs ausgeblendet werden? ==
     15
     16Verwendet die Methode hide, um einen Morph sofort ohne Fade Out zu verstecken. Denkt bitte daran, dass ausgeblendete Morphs dennoch im Speicher verbleiben. Eine Squeak-Methoden-Suche nach "alpha" (eine Nachricht, die wahrscheinlich Konstrukte haben wird, bei denen man eine Transparenz einstellen kann) liefert eine Klasse namens: AnimAlphaBlendingCanvas.
     17
     18
     19== Wie sind meine Zugangsdaten zu Squeaksource? ==
     20
     21Benutzername ist der HPI Benutzername und das Password wurde dir per Mail geschickt. Bitte ändere dein initiales Passwort.
     22
     23
     24== Wie kann ich ein selbst gespeichertes Image mit der VM öffnen? ==
     25
     26Ändere je nach Betriebssystem die .ini oder die .sh Datei. Falls du beim starten der VM einen Dialog haben möchtest, in dem du die Imagedatei auswählen kannst, musst du nur den Pfad zum Image setzen.
     27
     28
     29== Hilfe, ich habe hunderte Morphs die alle eine falsche Methode steppen. Was kann ich sie stoppen? ==
     30
     311.) 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)
     32
     33
     342.) Du kannst in Squeak jeder Klasse >>allInstances senden und bekommst dann eine Liste, die alle Objekte der Klasse enthält. An diese Liste können dann mit dem Collection Protocol (z.B. do:) Nachrichten an alle Objekte geschickt werden. Somit kannst du die Objekte bearbeiten oder mittels stopStepping zum Stillstand bringen.
     35
     36
     37== Wie schaffe ich es, dass ein Morph nicht mehr verschiebbar ist? ==
     38
     39Werft einen Blick auf die Methode Morph>>lock...
     40
     41
     42== Wie kann man Soundeffekte im Image abspielen? ==
     43
     44Beispiel: (SampledSound fromWaveFileNamed: 'daffyduck1.wav') play.
     45Allgemein lohnt sich ein Blick auf die SoundSystem Klassen, z.B. BaseSoundSystem und die ganze Sound-Synthesis Kathegorie.
     46
     47
     48== Wo finde ich Dokumentation? ==
     49
     50Es gibt für einige Klassen Dokumentation gleich im Browser. Der ? Button zwischen Class und Instance zeigt die Klassenkommentare an.
     51Weiterhin findet ihr hier Informationen:
     52
     53
     54Squeak by Example
     55Morphic Tutorial
     56Squeak-Wiki
     57
     58
     59== Wie wird Text formatiert? ==
     60
     61In Squeak gibt es auch für Text einen bestimmten Morph. Den TextMorph. Der hat auch weitere Halos, die einem erlauben mögliche Kombinationen aus Schriftarten und Schriftgrößen zu betrachten.
     62
     63Ein Beispiel für sehr großen Text:
     64
     65TextMorph new
     66contents: (Text string: 'very important text' attribute: TextEmphasis italic);
     67beAllFont: (StrikeFont familyName: #BitstreamVeraSans pointSize: 120);
     68openInWorld.
     69
     70
     71== Unser Spiel basiert auf Stepping und ruckelt!?! Was können wir tun? ==
     72
     73Das Stepping Model von Morphic ist relativ einfach und basiert auf einem Prozess, welcher alle stepping Methoden ausführt, wenn ihre stepTime abgelaufen ist. Im Umkehrschluss heißt das aber auch je mehr #step Methoden, je häufiger aufgerufen werden, desto mehr Zeit wird zwischen einzelnen Schritten benötigt (da mehr berechnet wird). Die #stepTime gibt dabei einen Wunschwert an, nach dem die #step Methode wieder aufgerufen werden soll. Nun kann es aber sein, dass die step Methoden soviel zu tun haben (oder andere Prozesse), dass die Überprüfung nur alle 50 ms ausgeführt wird und somit kann eine Zeit von 33 ms nicht garantiert werden. Allerdings wird durch die beschriebene Bewegung eine explizite #runStepMethods Message an die Welt gesendet, welcher die Abarbeitung aller #steps triggered. Das heißt der UI Prozess löst bei seiner Reaktivierung eine neu Berechnung aus.
     74
     75Also kommen wir zu möglichen Lösungen:
     76
     77In Preferences gibt es eine Option "higher performance" diese sorgt  für ein häufigeres updaten des UI Prozesses, dass könnte ggf. helfen.
     78
     79
     80
     81Anstatt häufig kleine Schritte auszuführen, kann  ggf. eine größere Schrittweite die Animation flüßiger wirken lassen.
     82
     83
     84Eine richtige Game Loop  implementieren (Design Pattern für Spiele), welche abhängig von der verstrichenen Zeit die Animation berechnet und somit immer gewährleistet, dass unabhängig von der Performance die Animation zu einem Zeitpunkt überall gleich weit ist (ruckelnd oder nicht). Dann würdet ihr komplett auf das Stepping Protokoll verzichten.
     85
     86
     87== Wie werden Transformationen auf einen Morph angewandt? ==
     88
     89Transformationen können mit einem TransformationMorph realisiert werden:
     90
     91morph := RectangleMorph new openInWorld.
     92transform := morph addFlexShell. "Creates a TransformationMorph"
     93transform openInWorld.
     94transform angle: 45 degreesToRadians.
     95transform scale: 3.
     96
     97
     98== Wie werden plattformunabhängige Datei-Zugriffe realisiert? ==
     99
     100Unabhängige Trennzeichen bekommt ihr mit den Methoden: separator, pathSeparator,separatorString und pathSeparator.
     101Ebenso kapselt die Klasse URI alle notwendigen Plattform-Mappings hervorragend.
     102
     103
     104== Wo finden die Konsultationen statt? ==
     105
     106In der Kommunikationszone C.E.
     107
     108
     109== Wie kann ich die Ausführung in meinem Images unterbrechen? ==
     110
     111Indem ihr einen Interrupt an das Image sendet. Das geht mit: Strg + . bzw. Alt + . bzw. CMD + . (Je nach OS).
     112
     113
     114== Wie können mehrere Schritte rückgängig gemacht werden? ==
     115
     116In den Einstellungen findet sich die Option "multipleTextUndo". Aktiviert diese und ihr könnt mehrere Schritte rückgängig machen. Mittels Strg + z bzw cmd + z könnt ihr die letzte Änderung rückgängig machen. Mehrmals zurück geht lediglich über Squeaks changes. Klickt dazu im Browser auf versions und wählt eure letzte Änderung aus.
     117
     118
     119== Wie bindet man das eigene Projekt in den Objects Explorer ein? ==
     120
     1211.) ObjectsTool erstellt die angezeigten Kategorien in dem es einfach alle Morphklassen nach einem bestimmten Selektor durchsucht und nur diese hinzufügt. Man benötigt also einen Morph und zwar den Morph, der das Spiel darstellt (z.B. BlyPacmanApp). 
     1222.) Auf der Klassenseite des Morphs wird eine Kategorie "parts bin" benötigt und in dieser eine Methode #descriptionForPartsBin. Das ist der Hook für ObjectsTool.
     123    descriptionForPartsBin
     124
     125    ^ self
     126        partName: 'Pacman'
     127        categories: #('SWA11')
     128        documentation: 'Pretty nice Pacman clone for SWA 09/10.'
     129
     130Dabei kann mit einem vierten Parameter auch ein Beispielbild angegeben werden (siehe z.B. AudioChatGUIdescriptionForPartsBin, self ... sampleImageForm:). Ansonsten wird ein kleines Icon automatisch erstellt. 
     1313.) Damit sollte der Morph in dem ObjectsTool erscheinen. Allerdings kann es sein, dass der Morph nicht richtig initialisiert wird (z.B. das Extent nicht stimmt).
     132
     133  Wenn man ein Objekt aus dem ObjectsTool zieht, wird der jeweiligen Klasse #newStandAlone als Nachricht gesendet. Die Methode dazu sieht wie folgt aus.
     134    newStandAlone
     135
     136        ^ self basicNew initializeToStandAlone"
     137
     138Während Morph #initializeToStandAlone einfach auf #initialize zurückführt, überschreiben andere Morphs die Methode (z.B. PasteUpMorph) und setzen z.B. die Größe. Falls das der Fall ist, kann man die #initializeToStandAlone einfach überschreiben:
     139
     140    initializeToStandAlone
     141
     142        super initializeToStandAlone.
     143        self initialize.
     144
     145p.s. Weitere Infos im Squeak-Wiki:
     146[1]
     147[2]
     148
     149
     150== Ich kann in Squeak nur in Fenstern tippen für die ich auch den Mausfokus habe. Wie kann ich das ändern? ==
     151
     152Teil der Vorlesung ist es euch darin zu schulen als Programmierer einen Paradigmenwechsel zu durchlaufen. Dazu gehören nicht nur Umstellungen in der Formulierung von Programmcode, sondern auch wie ihr den Code aufschreibt. Die Angelegenheit mit dem Mausfokus ist also schon so gewollt und nach etwas Eingewöhnungszeit auch sehr praktisch, da man sich nämlich den Klick spart (was meist zu erhöhter Produktivität führt). Man muss natürlich aufpassen nicht ungewollt an die Maus zu kommen. Daher ist meine Empfehlung es so zu lassen, wie es ist bzw. prüft, dass euer Benutzerinterface später auch mit der default Einstellung funktioniert wie gewollt. Wenn ihr die Option trotzdem ändern wollt, kann man im World-Menu unter "Preferences" den Preference Browser öffnen. Dort einfach nach "mouse" suchen, und man stößt auf die zwei Optionen "mouseClickForKeyboardFocus" und "mouseOverForKeyboardFocus": Diese einfach umstellen.
     153
     154
     155== Wie kann man einem SystemWindow ein Icon geben? ==
     156
     157Schau dir mal die "initialization" Kategorie bei den SystemWindow Methoden an: Dort wirst du die labelArea finden, die u.a. auch für die Buttons und den Titel verantwortlich ist. Der labelArea kannst du auch Morphs hinzufügen. Einfach mal im Explorer (Alt+Shift+I auf "SystemWindow new openInWorld") ausprobieren.
     158
     159
     160== In welcher Auflösung soll das fertige Spiel laufen? ==
     161
     162Das ist euch generell freigestellt.
     163
     164Wenn ihr das Spiel auf dem XO in Vollbild laufen lassen wollt, dann solltet ihr eine etwas höhere Auflösung einplanen. Der XO-1 hat eine Auflösung von 1200x900. (XO Specs)
     165
     166
     167== Hat Squeak einen integrierten Eventhandler für Netzwerkevents? Gibt es
     168also die Möglichkeit, dass eine Methode, die nicht blockierend prüft, ob
     169Pakete empfangen wurden, irgendeine Methode aufruft, sobald Daten
     170angekommen sind? ==
     171
     172Das 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.
     173
     174Von 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.
     175
     176Um das Warten zu realisieren, schaut euch die Klasse Delay an.
     177Es gibt aber noch weiter Synchronisationsprimitiven, insbesondere wenn ihr Sockets benutzt:
     178Je 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).
     179
     180Die 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.
     181
     182
     183== Wie stelle ich die letzten Codeänderungen wieder her, nachdem mein Image abgestürzt ist? ==
     184
     185In der Liste der Screencasts findest du ein
     186(Video) dazu. Grob machst du Folgendes:
     187Öffne dein Squeak Image, World Menü, changes, recently logged changes... .Wähle in dem aufkommenden Menü dein bevorzugtes Datum aus (meistens das oberste). Danach kommt ein weiteres Tool in dem alle Codefragmente aber auch do its gespeichert sind. Wähle nun diese aus, welche für dich relevant sind (somit vermeidest du den selben Fehler noch einmal mit hinein zuladen). Zum Schluss nur noch auf file in und fertig!
     188
     189
     190== Wie erstelle ich das SAR-Archiv für die Abgabe? ==
     191
     192Bei SARs handelt es sich nur um ZIPs mit etwas Smalltalk Quellcode (preamble, postscript Dateien). Ihr könnt sie einfach von Hand erstellen. Daher wäre es schön, wenn ihr einfach alles in ein ZIP packt, die 1-2 Zeilen Code zum Laden des MCZ Packages schreibt und dann gebündelt in einem SAR abgebt. Denkt daran, dass ihr auch Ressourcen wie Bilder und Audiodateien mit reinpackt und beim Installieren des SARs extrahiert.
     193
     194Hier findet ihr grundlegende Informationen und Tools, die euch bei der Erstellung helfen:
     195
     196SAR-Installer HowTo
     197
     198SAR-Installer Dokumentation
     199
     200
     201== Wie finde ich heraus auf welcher Plattform mein Image gerade läuft? ==
     202
     203Seht euch die Klasse Smalltalkimage an. Per
     204Smalltalkimage current plattformName
     205erhaltet ihr informationen über das ausführende Betriebssystem und könnt ggf. eure Keymappings sowie andere plattformabhängige Informationen anpassen.
     206
     207
     208== Wie viel Kommentare sind nötig/erwünst? ==
     209
     210Eine einfache Regel besagt: "So viel wie nötig, so wenig wie möglich".
     211Schaut euch einfach noch einmal die Idiome zum Kommentieren an (findet ihr
     212in den Vorlesungsfolien, sowohl von Kent Beck als auch Dave Thomas).
     213
     214
     215== Ich würde gerne Objekte wie z.B. Forms so kodieren, dass ich sie als
     216"normalen Text" so ähnlich wie base64 klassenseitig abspeichern kann. ==
     217
     218Zum Serialisieren von Objekten gibt es in Squeak die Methoden #storeOn: bzw #readFrom:
     219
     220Hier der Code dazu:
     221stream := WriteStream on: (String new).
     222objectToSerialize storeOn: stream.
     223deserializedObject := Object readFrom: stream
     224
     225Überlegt euch aber gut, warum ihr das Serialisieren überhaupt benötigt. Für den Umfang dieser Vorlesung reicht das Speichern des Zustandes im Image meist völlig aus.
     226
     227
     228== State und Strategy scheinen äußerst ähnliche Patterns zu sein.
     229Wo ist denn genau der Unterschied? ==
     230
     231Die 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
     232 Nachrichten versteht aber unterschiedlich reagiert. Hingegen beim Strategy
     233 Muster wurde ein Compositor zur Ausgabe von Text gewählt, hier entscheid
     234et der Client ganz bewusst die Ausgabe in TeX oder normalen Text zu rendern
     235.
     236über die Häufigkeit des Austauschens würde ich jedoch keine Aussage treffen wollen, da dies sehr vom Anwendungsfall abhängt.
     237Der Zustand der Strategy Algorithmen sollte keinen direkten Einfluss auf den Zustand des Clients haben. Beim State kann das jedoch der Fall sein, z.B.
     238 ist die TCPConnection abgebrochen und der Client zeigt eine Fehlermeldung
     239durch diesen neuen Zustand.
     240
     241
     242== Soweit ich Polymorphie und Late Binding verstehe, ist doch letzteres
     243das Mittel, um Polymorphie zu erreichen, und hat ohne diesen
     244eigentlich keine wirkliche Funktion? ==
     245
     246Polymorhpie 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. Es stimmt jedoch, dass late binding polymorphe Methoden auf Objekten ermöglicht, deren Klasse erst zur Laufzeit bestimmt werden kann.
     247
     248Vererbung und Polymorphie sind nicht notwendig, um objektorientierte Abstraktion zu ermöglichen; Sie werden jedoch aus praktischen Gründen in OO-Sprachen sehr gerne eingesetzt. Die Darstellung von OOP zieht oft fälschlicherweise diese beiden Konzepte als zentral und unabdingbar heran. Sprachen wie z. B. JavaScript und Self nutzen Delegation an Stelle von Vererbung. Sie sind unzweifelhaft objektorientiert, kommen aber auch ohne Klassen aus.
     249
     250
     251== Ist in Squeak eine Implementierung der MD5-Verschlüsselung vorhanden? ==
     252
     253Das Cryptography package sollte alle notwendigen Funktionen liefern.
     254Dort habt ihr eine MD5 Klasse. Folgt dem Beispiel in der Methode
     255#hashStream:. Aber Achtung, (MD5) ist sehr unsicher, da sehr leicht Kollisionen gefunden werden können.
     256Seaside 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.
     257
     258
     259== Wir benötigen für unser Konferenzsystem "clean" URLs, also URLs ohne _s und _k , wie zum Beispiel bei Squeaksource (etwa: http://www.squeaksource.com/UffnKoppConference) um auch einen direkten Link zu einer Unterseite angeben zu können.
     260Wie lässt sich das bewerkstelligen? ==
     261
     262Schaut euch einmal den Teil des Tutorials an:
     263Model Overview
     264
     265Unter dem Punkt static Urls solltet ihr fündig werden. Sollte es nicht mehr funktionieren (wegen der neuen Seaside Version) so sagt mir noch einmal bescheid.
     266
     267
     268== Gibt es in Squeak so etwas wie eine FileDialog Klasse? ==
     269
     270Helfen kann euch hier die Klasse FileList.
     271
     272
     273== Wie ist die exakte Funktionsweise der WAFileLibrary Klasse? ==
     274
     275Schau dir dafür einmal die Klasse: WAFileLibraryDemo an.
     276
     277Ebenso findest du im Seaside Image unter den Demos den WAUploadFunctionalTest
     278http://localhost:8080/tests/alltests/
     279
     280Bzw. in unserem Tutorial gibt es auch einen entsprechenden Abschnitt:
     281Model
     282
     283Die WAFileLibrary ist nicht dafür gedacht als eine langfristige Lösung zu fungieren. Sie ist eine einfache Art Dateien bereitzustellen. Aber sowohl durch ihre Ablage der Daten im Image als auch der vergleichsweise langsamen Zugriffszeit auf diese Daten sollte sie immer nur temporär benutzt werden. Sie hat aber auch Vorteile, wie z.B. den leichten Austauschen von Dateien über Monticello. Bessere Lösung um auf statische Dateien zuzugreifen findet ihr ebenso im Tutorial (selbes Kapitel weiter unten).
     284
     285Bei deinem Beispiel würde an der Klasse AClassName die Methode #fooBar aufgerufen werden. Hier dispatcht Seaside ein wenig mit Meta-Programming. Aber dieses Schema ist konstant und kann über den File Upload Dialog soweit umgangen werden, dass ihr die Klasse gar nicht anfassen braucht. Zum Hochladen von Dateien habe ich bereits in einer vergangenen Mail auf der Liste etwas geschrieben, da hier das Tutorial nicht mehr aktuell ist.
     286
     287Durch die begrenzten Möglichkeiten der WAFileLibrary sind Unterordner so weit ich weiß nicht möglich aber ggf. wurde das in der neuen Seaside Version auch geändert.
     288
     289
     290== Wir wollen einen Morph (inklusive Submorphs) als .png Datei abspeichern. ==
     291
     292Verwendet dazu Morph>>exportAsPng.
     293
     294
     295== Ich möchte einige Farben in einem Array speichern und die nach belieben
     296einer Variablen zuweisen, die für die Hintergrundfarbe eines Morphs
     297zuständig ist. Wie kann man das am besten erreichen? ==
     298
     299Das ColorArray scheint seiner Implementierung zu Folge etwas speicherfreundlicher zu sein als ein normales Array mit Color Objekten. Diese besondere Art kodiert Farben in ihre 32 Bit Repräsentation und speichert diese ab also genau 4 Byte. Beim näheren betrachten der Color Class fällt allerdings auf, dass Farben durchaus mehr Speicher in Anspruch nehmen können (durch cache Mechanismen usw.). Daher kann es in bestimmten Situation sinnvoll sein (wenn viele Farben benötigt werden z.B. in einem Bitmap oder einer Colorform) diese in nur 4 Byte abzulegen. Vermutlich kann hier auch die VM etwas optimieren, wenn grundsätzlich 4 Byte pro Element festgelegt sind.
     300
     301
     302== Es gibt in Squeak scheinbar zwei Möglichkeiten klassenseitige Variablen anzulegen: Einmal indem man auf Instanzseite in der Klassendefinition unter
     303"classVariableNames:" die gewünschten Variablen beginnend mit einem Großbuchstaben einträgt oder auf Klassenseite unter "instanceVariableNames:" entsprechend mit einem Großbuchstaben. Welche ist denn die "richtige" Art? ==
     304
     305Dafü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.
     306Um Klassenvariablen im eigentlichen Sinne -- Sowohl Klasse als auch Instanzen der Klasse können in Methoden darauf zugreifen -- zu erhalten, sind somit die instanzseitigen Klassenvariablen die richtige Wahl.
     307Uns hatte man damals für den Singletonfall auch geraten, die Instanzseite zu nehmen, um die Singletoninstanz zu speichern.
     308
     309Erklärung nach http://www.faqs.org/faqs/smalltalk-faq/:
     310
     311Q6. What are class instance variables?
     312Ans. 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.
     313
     314
     315== Wie bringe ich eine Seaside Applikation in einen Deployment modus? Wie schalte ich insbesondere die Toolbar aus? ==
     316
     317Programmatisch kann man es wie folgt lösen:
     318
     319| app deployedApplicationDefaults |
     320    app :=3D self setupWCR.
     321    deployedApplicationDefaults :=3D
     322        WAAdmin applicationDefaults copy
     323            removeParent: WADevelopmentConfiguration    instance;
     324            yourself.
     325    app configuration
     326        removeParent: WAAdmin applicationDefaults;
     327        addParent: deployedApplicationDefaults.
     328
     329Die Methode self setupWCR legt dabei unseren Einstiegspunkt sowie seineKonfiguration fest. Das kannst du z.B. so machen:
     330
     331| app |
     332    app :=3D DeineRootComponentKlasse registerAsApplication: 'test'
     333    app
     334        preferenceAt: #sessionClass put: DeineSessionClass;
     335        "... weitere konfiguration".
     336    ^ app
     337
     338ich würde es ganz einfach wie folgt machen. Nimm dein aktuelles Image und -save as... mit einem Namen wie "100710_DigitalSimulatorWeb_Deployment.image". In diesem Image entfernst du einfach die entsprechenden Packages.
     339
     340
     341== Gibt es eine gute Möglichkeit in Squeak/Morphic mit Vektorgraphikenzu arbeiten? Am besten wäre natürlich SVG. ==
     342
     343Squeak hat von Haus aus keinen SVG Support. Es gibt aber die SVGMorph Package
     344von Gary Chambers, die ihr euch einfach per Installation der entsprechenden .mcz
     345in des Image holen könnt.
     346Finden könnt ihr diese Package hier:
     347
     348SVGMorph
     349
     350
     351== Gibt es in Squeak eine Möglichkeite Bilder in eine Package einzubetten
     352als Ressource? Oder kann man Bilder nur aus Dateien laden? ==
     353
     354Die Klasse SystemWindow besitzt eine Reihe von Class-methods, die allesamt auf *Image enden. (z.B. SystemWindow>>menuBoxImage)
     355Diese Methoden geben Arrays zurück, die die Bildinformationen enthalten aus denen dann Form-Objekte erzeugt werden.
     356Form ist die "Squeak's Canvas". Eine Bitmap, die Bilder enthalten kann oder auf der gezeichnet
     357werden kann. Diese Objekte können dann in ImageMorphs verwendet werden (Der dazu ähnliche SketchMorph ist veraltet).
     358
     359
     360Bei größeren oder vielen Bildern lohnt ein Blick auf die Klassenseite von Form.
     361Da gibt es eine Methode, die aus einer Datei direkt ein Form-Objekt lädt.
     362Ähnliches findet sich auch auf den Klassenseiten von den Klassen PNGReadWriter, JPEGReadWriter, GIFReadWriter und weitere für spezielle Bildformate.
     363
     364
     365Mit Klassen wie FileDirectory oder FileUrl kann im Dateisystem navigiert werden.
     366Hierbei gilt es auch zu bedenken, dass die "Pathdelimiter" der Betriebssysteme unterschiedlich
     367sein können (/ oder \, ). Für Plattformunabnhängigkeit könnt ihr GRPlatform>>pathSeparator.
     368
     369
     370Wenn Bilder in Methoden (Was nicht unbedingt zu empfehlen ist)
     371und damit im Image gespeichert werden sollen, können Array-Repräsentationen
     372gewonnen werden, indem das Bild, wie oben beschrieben, in eine Form geladen wird
     373und aus dieser dann das Array (s. z.B. Form>>storeOn).
     374
     375
     376Das Speichern von Bildern im "Quellcode"/Image hat den einfachen Vorteil, dass ihr sie mit allen Teammitgliedern mit Hilfe des Monticello Source Code Repository teilen könnt. Bei externen Dateien muss leider ein anderer Weg (z.B. SVN) genutzt werden. Dennoch würden wir externe Dateien immer bevorzugen (welche nur bei Bedarf geladen und im Image gecached werden), da sie das Image klein halten. Unser Plan gegen Ende des Semester ist es alle Projekte in ein Image zu laden, daher ist es auch hier sinnvoll eure Resourcen extern im Dateisystem zu halten. Denkt bitte auch daran einen Unterordner für euer Projekt innerhalb des Squeak Verzeichnisses zu nutzen.
     377
     378
     379== Woher ist gute Einführungsliteratur für Squeak zu finden? ==
     380
     381Zum Einstieg in Squeak/Smalltalk sind viele gute Bücher kostenlos
     382verfügbar.
     383
     384Eine gute Übersicht bietet an dieser Stelle:
     385Free Books
     386
     387Das Buch "Squeak by Example" ist besonders geeignet, da es explizit auf
     388alle wichtigen Tools in Squeak und auch auf das Morphic-Framework
     389eingeht. Außerdem wird an vielen Beispielen die minimale Syntax und
     390wichtige Konzepte wie die Nachrichtenbasierung erklärt.
     391
     392Weiterhin gibt es noch einige praktische Tutorials zu Morphic
     393im Squeak-Wiki, die auch Hinweise zur Arbeit mit Squeak geben.
     394Morphic-Wiki
     395
     396
     397== Gibt es eine Möglichkeit Soundeffekte aus Dateien zu laden und abzuspielen? ==
     398
     399Die gibt es:
     400(SampledSound fromWaveFileNamed: 'daffyduck1.wav') play
     401
     402Interessante Klassen sind hier SoundSystem default (bzw BaseSoundSystem und die ganze Sound-Synthesis Kathegorie)
     403
     404
     405== Wie stellt man am Besten Text in Squeak dar? ==
     406
     407In Squeak gibt es auch für Text einen bestimmten Morph.
     408Den TextMorph. Der hat auch weitere Halos, die einem
     409erlauben mögliche Kombinationen aus Schriftarten und Schriftgrößen
     410zu betrachten..
     411
     412Ein Beispiel für sehr großen Text:
     413
     414TextMorph new
     415contents: (Text string: 'very important text' attribute: TextEmphasis italic);
     416beAllFont: (StrikeFont familyName: #BitstreamVeraSans pointSize: 120);
     417openInWorld.
     418
     419Anzumerken ist, dass der von Textmorphs enthaltene Text direkt auf diesem verändert werden kann.
     420Dabei 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 Methode). 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.
     421
     422
     423== Wie fügt man Strings zusammen? ==
     424
     425Das geht mit dem Komma-Operator.
     426Die Konkatenation von Tabs an Strings geht beispielsweise so:
     427
     428'abc' , String tab , 'abc'
     429
     430oder auch
     431
     432'abc' , Character tab , 'abc'
     433
     434da 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 #=).
     435
     436Bedenkt bitte, dass ihr bei sehr komplexen String Konkatenationen besser auf Streams zurückgreifen solltet:
     437
     438String streamContents: [:stream |
     439    stream
     440        nextPutAll: 'abc';
     441        tab;
     442        nextPutAll: 'abc'].
     443
     444
     445== Kann man aus dem Debugfenster den Callstack rauskopieren? ==
     446
     447Wenn der Debugger geöffnet ist, kann man z.B. im Menü (Rechtsklick o.ä. auf die Titelleiste)
     448"copy text" wählen. Dann ist der dargestellte Callstack in die Zwischenablage kopiert und kann gewohnt in allen Anwendungen eingefügt werden.
     449
     450
     451== Ist es nun guter Stil, wenn man in Squeak nach dem return einen Punkt macht
     452oder nicht? ==
     453
     454Im Allgemeinen ist es nur wichtig, dass ihr es konsequent überall gleich macht. Wir bevorzugen zwar die Variante ohne Punkt aber dies sollte auf eure Wahl keine Auswirkung haben.
     455
     456
     457== Wie kann man mit Seaside E-Mails versenden? ==
     458
     459Seaside sollte in eurer Installation Seaside-email mit installiert
     460haben.
     461
     462Damit könnt ihr eurer Applikation im Seaside-Config-Dialog eine
     463Konfiguration (WAEmailConfiguration) hinzufügen, wo ihr Server-parameter
     464einstellen könnt.
     465
     466Ab dann könnt ihr in euer Applikation Instanzen von WAEmailMessage
     467verwenden:
     468
     469| addr addr2 msg |
     470addr := WAEmailAddress
     471    address: 'peter.lustig@example.com'
     472    username: 'Peter Lustig'.
     473addr2 := WAEmailAddress
     474    address: 'biene.maja@example.com'
     475    username: 'Biene Maja'.
     476msg := WAEmailMessage
     477    from: addr
     478    to: addr2
     479    subject: 'Honey out'.
     480msg body: 'Hello Maja,
     481
     482
     483== Welche Streams verwendet ihr zum Dateien schreiben auf Gemstone? ==
     484
     485Dateibehandlung findet in Gemstone mit Hilfe der Klasse GsFile statt.
     486In GemStone gibt es immer die Unterscheidung, ob etwas auf dem Client
     487(also, GemTools oder seaside-gem) oder Server (also stone) passiert.
     488Darauf beziehen sich dann die entsprechenden *onClient* und *onServer*-
     489methoden auf Klassenseite von GsFile.
     490
     491
     492== Wie erreiche ich Nebenläufigkeit in Squeak? ==
     493
     494Die üblichen Mechanismen Semaphore und Mutex zur Synchronisation mehrerer Prozesse sind in Squeak als Klassen verfügbar.
     495
     496Übliches Vorgehen ist z.B.
     497
     498| semaphore |
     499semaphore := Semaphore new.
     500[ .... do some work ...
     501  semaphore signal ] fork.
     502semaphore wait.
     503
     504Für einfache Nebenläufigkeit ohne Synchronisation existiert BlockClosure>>fork.
     505
     506[50000 factorial] forkAt: ProcessScheduler userBackgroundPriority
     507
     508
     509== Welchen Umfang sollten die Projekte haben? ==
     510
     511Die Anforderungen, welche durch die Spiele umgesetzt werden sollen, reflektieren auch den Umfang des Projektes. Alle Projekte wurden so gewählt (oder von uns freigegeben), sodass sie einerseits mit 4 Studenten in der vorhandenen Zeit sehr gut realisierbar sind und andererseits auch ausreichend Raum lassen, um eine sehr gute Architektur zu entwickeln.
     512
     513Eine Zahl entsprechend der Menge an Quelltext lässt sich nur schwer bestimmen, da es von zu vielen Faktoren abhängt (Verwendung von Mustern, Kenntnis der Smalltalk Bibliothek, Benutzte Abstraktionen etc.). Falls es euch hilft: Wir hatten schon sehr gute Projekte, welche nur knapp 1.000 Zeilen geschrieben haben aber auch sehr gute mit mehr als 4.000 Zeilen. Versucht euch am Besten dazwischen einzupendeln und setzt euren Fokus lieber auf Qualität statt Quantität. Uns geht es in dieser Lehrveranstaltung vor allem darum, dass ihr lernt und versteht, was es heißt "schönen" Code zuschreiben.
     514
     515
     516== Wie kann ich das mouseDown-Event an den Owner weiterleiten? ==
     517
     518Falls der Owner alle Mouse-Down-Events seiner Kinder abfangen soll, ist #mouseDownPriority die bessere Lösung. Bei #rejectsEvent: müsste jeder mögliche Submorph-Typ modifiziert werden. Dies würde Code-Duplikation bedeuten.
     519
     520
     521== Wir haben mehrere Prozesse in unserem Spiel und beim Rendern treten Artefakte in den Morphs auf. Was passiert und wie können wir das lösen? ==
     522
     523Das könnte mit der Synchronisierung zu tun haben.
     524Wenn du Eigenschaften von Morphic-Objekten aus einem anderen Thread heraus veränderst, riskierst du, dass das Drawing der Objekte nur die Hälfte deiner Veränderungen mitbekommt (falls es zufällig "im selben Moment" ausgeführt wird). - Und das kann lustige Effekte haben.
     525Es gibt aber die Möglichkeit, diese Veränderungen synchron im UI-Prozess von Squeak auszuführen. Dafür fügt man eine "Deferred Message" zu einer Liste hinzu, die im UI-Thread dann später abgearbeitet wird und eure Veränderungen in einem Block kapselt.
     526Siehe dazu das folgende Beispiel.
     527
     528Einfacher ist es für euch aber eventuell, wenn ihr eure Game-Logic nicht mithilfe eines neuen Threads schedulen lasst, sondern z.B. das Stepping eines einzigen Morph-Objektes für eure Game-Loop verwendet (d.h. die step-Methode dieses Objekts führt den Rumpf eurer Schleife aus und ihr setzt die stepTime entsprechend).
     529
     530
     531== Ich habe eine nebenläufige Anwendung programmiert, bei der mir ein Prozess abhanden gekommen ist und der jetzt weiter im Hintergrund läuft. Wie kann ich diesen beenden? ==
     532
     533Du kannst im Process-Browser mit Rechtsklick->Explore auf den betreffenden Prozess den Object Explorer öffnen, und in diesem dann "self terminate." ausführen.
     534
    10535
    11536