Smalltalk Idiome

Previous Topic Next Topic
 
classic Classic list List threaded Threaded
15 messages Options
Reply | Threaded
Open this post in threaded view
|

Smalltalk Idiome

Enrico Schwass-2

Hallo Liste,

neben der neuen Rubrik Eulerprobleme habe ich eine weiteren Bereich ins
Leben gerufen. "Smalltalk-Idiome erklärt" Es geht also um Dinge, die man
in Smalltalk immer wieder und meistens auf die gleiche Art und Weise
erledigt.

Den "Terse guide to Squeak"

http://wiki.squeak.org/squeak/5699

würde ich übersetzen und auch da mit einordnen.

Wer also schöne Beispielidiome hat ... immer her damit :)

Enno
Reply | Threaded
Open this post in threaded view
|

Re: Smalltalk Idiome

R. Baumann
Die Idee finde ich sehr gut.
Gib doch bitte mal ein Musterbeispiel für ein solches Idiom an!

Gruß R. Baumann
Reply | Threaded
Open this post in threaded view
|

Re: Smalltalk Idiome

Enrico Schwass-2
"R. Baumann" <[hidden email]> writes:

Hallo Rüdeger,

> Die Idee finde ich sehr gut.
> Gib doch bitte mal ein Musterbeispiel für ein solches Idiom an!

Wie hole ich Daten aus einem File. Dazu steht schon was unter Idioms auf
der Homepage. Ein weiteres wäre: Wie kann der Benutzer Daten eingeben?

answer := FillInTheBlank request: 'Wie ist dein Name?'.

Enno

Reply | Threaded
Open this post in threaded view
|

Re: Smalltalk Idiome

Markus Schlager-2
Hallo Enno,

Ein Idiom, das ich gerne wüßte:

Wie bringe ich ein Bild, z.B. ein jpg, das ich auf das Etoys-Fenster
ziehe, per Smalltalk ins System, etwa als defaultForm eines ImageMorphes?
Ziel wäre, daß das Bild Bestandteil etwa meines Monticello-Paketes bzw.
des Smalltalk-Images wird, nicht des Datesystems.

Markus
Reply | Threaded
Open this post in threaded view
|

Re: Smalltalk Idiome

Enrico Schwass-2
Markus Schlager <[hidden email]> writes:

Hallo Markus,

ich weiss nicht, ob ich dich richtig verstanden habe. Aber ich kann mal
kurz zeigen, wie ich bei diesen Dingen vorgehe, wenn ich so etwas noch
nie gemacht habe.

Du hast den ImageMorph bereits angesprochen. Wenn ich nicht weiss,
welche Klasse ich benutzen kann rufe ich zuerst den Method finder auf.
Da suche ich dann nach Methoden, die picture: oder image: beinhalten.

Ich finde unter anderem ImageMorph image:

Das klingt vielversprechend. Dann sehe ich mir den Klassenkommentar an.
Dort gibt es zwei Codebeispiele.

ImageMorph new openInWorld; grabFromScreen

Das kopiert einen Bildausschnitt und zeigt ihn an.

(Form fromFileNamed: 'myGraphicsFileName') asMorph openInWorld

Das öffnet ein externes Bild.

Ich denke damit ist dir geholfen.

Enno

> Ein Idiom, das ich gerne wüßte:
>
> Wie bringe ich ein Bild, z.B. ein jpg, das ich auf das Etoys-Fenster
> ziehe, per Smalltalk ins System, etwa als defaultForm eines
> ImageMorphes? Ziel wäre, daß das Bild Bestandteil etwa meines
> Monticello-Paketes bzw. des Smalltalk-Images wird, nicht des
> Datesystems.
>
> Markus
Reply | Threaded
Open this post in threaded view
|

Re: Smalltalk Idiome

Bert Freudenberg
In reply to this post by Markus Schlager-2

On 14.11.2010, at 10:44, Markus Schlager wrote:

> Hallo Enno,
>
> Ein Idiom, das ich gerne wüßte:
>
> Wie bringe ich ein Bild, z.B. ein jpg, das ich auf das Etoys-Fenster ziehe, per Smalltalk ins System, etwa als defaultForm eines ImageMorphes? Ziel wäre, daß das Bild Bestandteil etwa meines Monticello-Paketes bzw. des Smalltalk-Images wird, nicht des Datesystems.
>
> Markus

Wenn es nicht das effizienteste sein muss, nimm #storeString. Das erzeugt Code für die meisten (relativ einfachen) Objekte.

- Bert -


Reply | Threaded
Open this post in threaded view
|

Re: Smalltalk Idiome

Michael Haupt-3
In reply to this post by Enrico Schwass-2
Hallo Enno,

2010/11/13 Enrico Schwass <[hidden email]>:
> Wer also schöne Beispielidiome hat ... immer her damit :)

die Sammlung von Klimas et al. gibt auch einiges her:
http://stephane.ducasse.free.fr/FreeBooks/WithStyle/SmalltalkWithStyle.pdf

Viele Grüße,

Michael
Reply | Threaded
Open this post in threaded view
|

Re: Smalltalk Idiome - Bilderimport

Markus Schlager-2
In reply to this post by Enrico Schwass-2
On Sun, 14 Nov 2010, Enrico Schwass wrote:

> (Form fromFileNamed: 'myGraphicsFileName') asMorph openInWorld
>
> Das öffnet ein externes Bild.

Danke Enno, aber genau das möchte ich vermeiden bzw. nur einmal tun
müssen. Dann möchte ich das Bild im Image bzw. zumindest im
Monticello-Paket haben.

Konkret zwei Fragen:

1. Wenn ich so etwas wie  "Form fromFileNamed: 'myGraphicsFileName'" im
Smalltalk-Code einer Klasse stehen habe und dann mein Werk mit Monticello
exportiere und später in ein anderes Image importiere, ist dann
die Datei myGraphicsFileName mit dabei und am Zielsystem an der richtigen
Stelle?

2. Was ich eigentlich will:

ImageMorph kennt eine Klassenvariable 'DefaultForm' (oder auch
'DefaultImage' bei AlphaImageMorph). Das einzige was ich
für diese aufbekomme, ist ein Inspektor. Bei pharo ist sie ein 1x1-Pixel,
bei Etoys ein Bild mit Kleinkinderhänden. Meine Schüler sollen Spiele oder
Animationen programmieren, bei denen beispielsweise irgendwelche Figuren
vorkommen sollen, die ein nettes Kostüm brauchen. Das ganze sollen sie
später mit Monticello bei mir abgeben können.

Meine Idee wäre nun, für solche Figuren Unterklassen von ImageMorph
abzuleiten und mit einer anderen DefaultForm auszustatten. Nun ist die
erste Frage die, wo/wie ich die DefaultForm überhaupt im Smalltalk-Image
finde und sie ggf. verändere. Die zweite Frage ist die, ob ein Verändern
überhaupt sinnvoll ist, nachdem sich DefaultForm doch nach recht globaler
Variable anhört.

Was ich haben möchte, wäre eben so etwas wie DefaultForm, letztlich also
wohl die Definition einer konkreten 'Form' (im Sinne der
Smalltalk-Klasse) meineDefaultForm, die ich benutzen kann, um damit
ImageMorph>>defaultImage
im Sinne von

MeinImageMorph>>defaultImage
     "Answer the default image for the receiver."

  ^ meineDefaultForm

überschreiben kann.

Mit Hilfe von Berts #storeString habe ich das jetzt geschafft:

(Form fromFileNamed: 'myGraphicsFileName') storeString

Drucken und in #defaultImage einfügen.


3. Doch noch eine Frage:

Wenn ich in pharo etwa ein jpg-Bild auf das pharo-Image ziehe, öffnet sich
ein Popup-Menü, das mir erlaubt, das Bild in einem Fenster zu öffnen, als
Hintergrund zu benutzen, oder eben 'read graphic into ImageImports'.

Was passiert da und wo/wie kann ich dann auf das Bild zugreifen?

Herumsuchen in Inspektoren brachte mich zu
Form(class)>>serviceImageImports bzw.

Form(class)>>importImage: fullName
     "Import the given image file and store the resulting Form in the default Imports.
     The image is named with the short filename up to the first period, possibly with
     additions from the directory path to make it unique."

     Imports default importImageFromFileNamed: fullName.


Wenn die Datei z.B. /Pfad/zu/meinBild.jpg war, kann ich die erzeugte Form
höchstwahrscheinlich als

Imports default imports at: 'meinBild'

ansprechen. Überlebt das z.B. einen Monticello-Export?

Markus
Reply | Threaded
Open this post in threaded view
|

Re: Smalltalk Idiome - Bilderimport

Bert Freudenberg
On 14.11.2010, at 20:39, Markus Schlager wrote:

> Überlebt das z.B. einen Monticello-Export?

Monticello speichert derzeit ausschließlich Quelltext.

- Bert -


Reply | Threaded
Open this post in threaded view
|

Re: Smalltalk Idiome - Bilderimport

Enrico Schwass-2
In reply to this post by Markus Schlager-2
Markus Schlager <[hidden email]> writes:

Hallo Markus,

> Danke Enno, aber genau das möchte ich vermeiden bzw. nur einmal tun
> müssen. Dann möchte ich das Bild im Image bzw. zumindest im
> Monticello-Paket haben.

Wenn du das Bild geladen hast und das Image abspeicherst, bleibt das
Bild ja erhalten. Der komplette Zustand des Images bleibt erhalten. Aber
es geht dir vielmehr um den Import/Export von Daten

> Konkret zwei Fragen:
> 1. Wenn ich so etwas wie  "Form fromFileNamed: 'myGraphicsFileName'"
> im Smalltalk-Code einer Klasse stehen habe und dann mein Werk mit
> Monticello exportiere und später in ein anderes Image importiere, ist
> dann die Datei myGraphicsFileName mit dabei und am Zielsystem an der
> richtigen Stelle?

Nein. Monticello ist hauptsächlich für Sourcecode gedacht.

Hier hat Bert das schon einmal ausgeführt

http://lists.squeakfoundation.org/pipermail/beginners/2010-April/007002.html

> 2. Was ich eigentlich will: ImageMorph kennt eine Klassenvariable
> 'DefaultForm' (oder auch DefaultImage' bei AlphaImageMorph). Das
> einzige was ich für diese aufbekomme, ist ein Inspektor. Bei pharo ist

ImageMorph class->initialize
        "ImageMorph initialize"

        | h p d |
        DefaultForm := (Form extent: 80@40 depth: 16).
        h := DefaultForm height // 2.
        0 to: h - 1 do: [:i |
                p := (i * 2)@i.
                d := i asFloat / h asFloat.
                DefaultForm fill:
                        (p corner: DefaultForm extent - p)
                        fillColor: (Color r: d g: 0.5 b: 1.0 - d)].

        self registerInFlapsRegistry.

Das wird irgendwo erstmalig aufgerufen. Sollte eigentlich nicht
automatisch passieren. Bert??


> sie ein 1x1-Pixel, bei Etoys ein Bild mit Kleinkinderhänden. Meine
> Schüler sollen Spiele oder Animationen programmieren, bei denen
> beispielsweise irgendwelche Figuren vorkommen sollen, die ein nettes
> Kostüm brauchen. Das ganze sollen sie später mit Monticello bei mir
> abgeben können.

Monticello ist dafür meines Wissens nicht geeignet. Man kann auch das
Ergebnis von storeString kopieren und in eine Methode zur
Initialisierung einfügen. Das wird aber recht schnell recht gross.

RectangleMorph new storeString

liefert

'(RectangleMorph basicNew instVarAt: 1 put: (0@0 corner: 50@40);
instVarAt: 2 put: nil; instVarAt: 3 put: #(); instVarAt: 4 put: nil;
instVarAt: 5 put: (Color r: 0.613 g: 0.903 b: 1.0); instVarAt: 6 put:
nil; instVarAt: 7 put: 2; instVarAt: 8 put: (Color r: 0.0 g: 0.0 b:
0.0); yourself)'

Das kann man noch in eine Methode schreiben, anderes dann eher nicht :)

> Meine Idee wäre nun, für solche Figuren Unterklassen von ImageMorph
> abzuleiten und mit einer anderen DefaultForm auszustatten. Nun ist die
> erste Frage die, wo/wie ich die DefaultForm überhaupt im
> Smalltalk-Image finde und sie ggf. verändere. Die zweite Frage ist
> die, ob ein Verändern überhaupt sinnvoll ist, nachdem sich DefaultForm
> doch nach recht globaler Variable anhört.

Warum können Sie nicht einfach ein jpg per eMail schicken?
Der Dateiname könnte ja auf die Verwendung hindeuten, was den Import
dann erleichtert. HemdVonName.jpg HoseVonName.jpg .. etc

> Was ich haben möchte, wäre eben so etwas wie DefaultForm, letztlich
> also wohl die Definition einer konkreten 'Form' (im Sinne der
> Smalltalk-Klasse) meineDefaultForm, die ich benutzen kann, um damit
> ImageMorph>>defaultImage im Sinne von
> MeinImageMorph>>defaultImage
>     "Answer the default image for the receiver."
> ^ meineDefaultForm
> überschreiben kann.
> Mit Hilfe von Berts #storeString habe ich das jetzt geschafft:
> (Form fromFileNamed: 'myGraphicsFileName') storeString
> Drucken und in #defaultImage einfügen.

Verdammt, zu spät gelesen. Da hätte ich mir ja die Erklärung oben sparen
können :)

> 3. Doch noch eine Frage:
> Wenn ich in pharo etwa ein jpg-Bild auf das pharo-Image ziehe, öffnet
> sich ein Popup-Menü, das mir erlaubt, das Bild in einem Fenster zu
> öffnen, als Hintergrund zu benutzen, oder eben 'read graphic into
> ImageImports'.
> Was passiert da und wo/wie kann ich dann auf das Bild zugreifen?

Bei Pharo muss ich passen. Vielleicht mal in HandMorph gucken. Oder
PasteUpMorph

Ich denke, Bert wird dir da ausführlicher antworten.

Enno

Reply | Threaded
Open this post in threaded view
|

Re: Smalltalk Idiome - Bilderimport

Bert Freudenberg
In reply to this post by Markus Schlager-2
On 14.11.2010, at 20:39, Markus Schlager wrote:

> Meine Schüler sollen Spiele oder Animationen programmieren, bei denen beispielsweise irgendwelche Figuren vorkommen sollen, die ein nettes Kostüm brauchen. Das ganze sollen sie später mit Monticello bei mir abgeben können.
>
> Meine Idee wäre nun, für solche Figuren Unterklassen von ImageMorph abzuleiten und mit einer anderen DefaultForm auszustatten.

Du brauchst keine Unterklassen. Und die DefaultForm ist genau das - das Bild, was genommen wird, wenn du kein anderes setzt. Also setze einfach das Bild, was du magst, nachdem du eine Instanz von ImageMorph erzeugt hast.

> Nun ist die erste Frage die, wo/wie ich die DefaultForm überhaupt im Smalltalk-Image finde und sie ggf. verändere.
> Die zweite Frage ist die, ob ein Verändern überhaupt sinnvoll ist, nachdem sich DefaultForm doch nach recht globaler Variable anhört.

Du willst die nicht verändern. Und gefunden hast du sie schon, im Browser.

> Was ich haben möchte, wäre eben so etwas wie DefaultForm.

Nein. Was du willst ist ein ImageMorph, der eine bestimmte Form anzeigt. Da du auf Monticello bestehst, mach einfach eine Ressourcen-Klasse, die alle Bilder, Töne, usw. hält. Am besten in einem Dictionary als Klassenvariable. So etwas gibt es zwar schon (z.B. als ScriptingSystem formDictionary) aber da du ja auch Pharo verwenden willst, ist nicht sicher, dass das nicht bald entfernt wird (falls es noch existiert). Ist auch "sauberer" das selbst zu machen, wenn auch mit mehr Arbeit verbunden.

- Bert -

Reply | Threaded
Open this post in threaded view
|

Re: Smalltalk Idiome

Enrico Schwass-2
In reply to this post by Michael Haupt-3
Michael Haupt <[hidden email]> writes:

Hallo Michael,

>> Wer also schöne Beispielidiome hat ... immer her damit :)
> die Sammlung von Klimas et al. gibt auch einiges her:
> http://stephane.ducasse.free.fr/FreeBooks/WithStyle/SmalltalkWithStyle.pdf

Stimmt. Das Buch hatte ich vor einiger Zeit auch gelesen, ich gucks nochmal
durch. Danke für den Hinweis

Enno
Reply | Threaded
Open this post in threaded view
|

Re: Smalltalk Idiome - Datenexport

Markus Schlager-2
In reply to this post by Bert Freudenberg
Hallo Bert und Enno,

Erst schon einmal vielen Dank für die ausführliche Hilfe!

On Mon, 15 Nov 2010, Bert Freudenberg wrote:

>> Meine Idee wäre nun, für solche Figuren Unterklassen von ImageMorph abzuleiten und mit einer anderen DefaultForm auszustatten.
>
> Du brauchst keine Unterklassen. Und die DefaultForm ist genau das - das
> Bild, was genommen wird, wenn du kein anderes setzt. Also setze einfach
> das Bild, was du magst, nachdem du eine Instanz von ImageMorph erzeugt
> hast.

Unterklassen brauche ich vielleicht aus anderen Gründen. Ich möchte den
Schülern das Leben nicht zu schwer machen und verzichte daher evtl. auf
eine saubere Trennung von View und Model.

>> Was ich haben möchte, wäre eben so etwas wie DefaultForm.
>
> Nein. Was du willst ist ein ImageMorph, der eine bestimmte Form anzeigt.

Genau.

> Da du auf Monticello bestehst,...

Falls das nicht sinnvoll ist, lasse ich mir gerne zu Alternativen raten.
Ich habe nur den Eindruck gewonnen, daß Monticello derzeit der übliche Weg
ist, Daten zu im-/exportieren. Das konkrete Szenario besteht darin, daß
die Schüler ihre Werke bei mir abgeben sollen, ich aber eigentlich nicht
von jedem um die 25MB image samt dessen sonstiger Werke haben möchte.
Unter Etoys lasse ich mir Projekte (.pr) abgeben, aus Smalltalk-Sicht
scheint das aber ja nicht ganz so gut zu sein - abgesehen davon geht das
in pharo gar nicht.

Markus
Reply | Threaded
Open this post in threaded view
|

Re: Smalltalk Idiome - Datenexport

Bert Freudenberg

On 15.11.2010, at 20:56, Markus Schlager wrote:

> Hallo Bert und Enno,
>
> Erst schon einmal vielen Dank für die ausführliche Hilfe!
>
> On Mon, 15 Nov 2010, Bert Freudenberg wrote:
>
>>> Meine Idee wäre nun, für solche Figuren Unterklassen von ImageMorph abzuleiten und mit einer anderen DefaultForm auszustatten.
>>
>> Du brauchst keine Unterklassen. Und die DefaultForm ist genau das - das Bild, was genommen wird, wenn du kein anderes setzt. Also setze einfach das Bild, was du magst, nachdem du eine Instanz von ImageMorph erzeugt hast.
>
> Unterklassen brauche ich vielleicht aus anderen Gründen. Ich möchte den Schülern das Leben nicht zu schwer machen und verzichte daher evtl. auf eine saubere Trennung von View und Model.

Aber eine Klasse pro angezeigtem Bild finde ich zu viel des Guten. Es gibt so schon viel zu viele Morphklassen ;)

>>> Was ich haben möchte, wäre eben so etwas wie DefaultForm.
>>
>> Nein. Was du willst ist ein ImageMorph, der eine bestimmte Form anzeigt.
>
> Genau.
>
>> Da du auf Monticello bestehst,...
>
> Falls das nicht sinnvoll ist, lasse ich mir gerne zu Alternativen raten. Ich habe nur den Eindruck gewonnen, daß Monticello derzeit der übliche Weg ist, Daten zu im-/exportieren.

Nicht für generelle Daten. Nur Code. Ein MCZ ist zwar auch nur eine Zip-Datei, aber bisher haben wir es vermieden, die für anderes als Code zu missbrauchen (obwohl es schon mal eine Erweiterung gab, die das implementierte).

> Das konkrete Szenario besteht darin, daß die Schüler ihre Werke bei mir abgeben sollen, ich aber eigentlich nicht von jedem um die 25MB image samt dessen sonstiger Werke haben möchte. Unter Etoys lasse ich mir Projekte (.pr) abgeben, aus Smalltalk-Sicht scheint das aber ja nicht ganz so gut zu sein - abgesehen davon geht das in pharo gar nicht.
>
> Markus

Naja, in einem "echten" Projekt hätte man einen schön versionierten Ressourcenordner mit der ganzen Artwork. Solange du erwähnst wie man das "wirklich" macht, kannst du aber aus pragmatischen Gründen durchaus Bilder in Methoden abgeben lassen :)

- Bert -

Reply | Threaded
Open this post in threaded view
|

Re: Smalltalk Idiome - Datenexport

Markus Schlager-2
Hallo Bert,

On Mon, 15 Nov 2010, Bert Freudenberg wrote:
>
> Aber eine Klasse pro angezeigtem Bild finde ich zu viel des Guten. Es gibt so schon viel zu viele Morphklassen ;)
>

Ich werde mir das zu Herzen nehmen. :) Vielleicht mache ich es ja doch
"richtig", erbe von Objekt und benutze ImageMorph. Mal sehen.

Danke jedenfalls

Markus