Pharo-dev
By thread
pharo-dev@lists.pharo.org
By month
Messages by month
- ----- 2026 -----
- July
- June
- May
- April
- March
- February
- January
- ----- 2025 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2024 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2023 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2022 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2021 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2020 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2019 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2018 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2017 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2016 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2015 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2014 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2013 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2012 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2011 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2010 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2009 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2008 -----
- December
- November
- October
- September
- August
- July
- June
- May
January 2012
- 118 participants
- 1442 messages
Re: [Pharo-project] Collection new
by Steve Wart
On Tue, Jan 31, 2012 at 3:40 PM, Eliot Miranda <eliot.miranda(a)gmail.com>wrote:
>
> On Mon, Jan 30, 2012 at 9:18 PM, S Krish <
> krishnamachari.sudhakar(a)gmail.com> wrote:
>
>> In general why is there not a catch all for Stack Overflow and infinite
>> loops.
>
>
> There is, low space (and user interrupt for flat infinite loops). But the
> low space interrupt machinery is easily broken. It is difficult to test,
> and an increasingly silly approach on modern machines with huge amounts of
> memory. We need to think again.
>
GemStone has a user variable for maximum stack depth (defaults to 10000 I
think). The exception it raises is not so much a clever solution to the
halting problem but it catches some human errors, which is nice.
Jan. 31, 2012
Re: [Pharo-project] Collection new
by Eliot Miranda
On Mon, Jan 30, 2012 at 9:18 PM, S Krish
<krishnamachari.sudhakar(a)gmail.com>wrote:
> In general why is there not a catch all for Stack Overflow and infinite
> loops.
There is, low space (and user interrupt for flat infinite loops). But the
low space interrupt machinery is easily broken. It is difficult to test,
and an increasingly silly approach on modern machines with huge amounts of
memory. We need to think again.
>
> Thats very annoying for newbie.. and infact gives a bad feel to using
> Pharo. The image they are working for say 3-4 hours and the crash just
> pushes them out of all the code they are working on with.. small as it
> maybe..
>
> Recover / and other options are fallbacks but invariably newbies have it
> messed up and are not very clear on how to recover either .. thats a job
> for the experienced user actually...
>
> This occurs so often from all of the polling code.. and if anyone
> unknowingly puts in a debug point in the methods that loop infinitely.. and
> so many of them lurk all around the image..
>
> Just stop the loop and throw up a debugger if say 100 calls have gone to
> very same method..? or detect a clear loopback to the same method..
>
> On Tue, Jan 31, 2012 at 12:01 AM, Andrew P. Black <black(a)cs.pdx.edu>wrote:
>
>> Teaching a class of novices, it's not surprising that someone tried
>> "Collection new". What was surprising is that this got the VM is a loop of
>> some kind, with emergency stack dumps and so on.
>>
>> Here is my reply:
>>
>>
>> > On 30 Jan 2012, at 01:18 , Xingzhi Harry Pan wrote:
>> >
>> >> ...it's pretty innocent:
>> >> Collection new
>> >
>> >
>> > OK. I looked at this. The problem comes when trying to print the
>> collection. Somehow the VM gets confused when trying to do do: ... I'm not
>> quite clear why.
>> >
>> > The quick fix is to change the Collection>>new method to
>> >
>> > self error: 'Collection is an abstract class, and cannot be
>> instantiated'
>> >
>> > However this will break Heap>>new: , which sends super new. It ought
>> to send self basicNew instead.
>> >
>> > These two changes seem to avoid the problem, but I'm waiting to see ...
>> >
>> > Andrew
>>
>> But I don't understand the root cause. Printing eventually sends do:,
>> which is self subclassResponsibility. Why don't we get a clean failure?
>>
>> Andrew
>>
>>
>>
>
--
best,
Eliot
Jan. 31, 2012
Re: [Pharo-project] Command Line Interface using FFI
by Eliot Miranda
On Tue, Jan 31, 2012 at 4:10 AM, Damien Pollet <damien.pollet(a)gmail.com>wrote:
> On 29 January 2012 21:11, Guillermo Polito <guillermopolito(a)gmail.com>
> wrote:
> > I've spent a few hours playing with Alien+FFI and I did want to have a
> > Command line interface to play and use as a quick browser.
>
> This is something I'd like to have as a part of Coral.
>
> What's your opinion on the FFI-libc approach compared to OSProcess? I
> was actually thinking of doing something like that using NativeBoost
> :)
>
There is a third option which just uses the stdio streams in
StandardFileStream. this has been working in the Cog VMs for some time now.
> > Gofer it
> > squeaksource: 'CLInterface';
> > package: 'ConfigurationOfCLInterface';
> > load.
> >
> > ConfigurationOfCLInterface load.
> >
> >
> > To play with it write a script, for example startCLI.st, with the
> following:
> >
> > CLInterface start
> >
> >
> >
> > And then, from the command line
> >
> > CogVM -vm-display-null <image> startCLI.st
> >
> >
> > What it does support?
> > - executes smalltalk expressions
> > - handles the errors and shows them into the stdout (so it does not
> explode
> > :P)
> > - stores variables as a workspace
> > Since I used standard C functions (fgets and printf only) this should
> work
> > on every platform from scratch (having a VM with FFI working, of
> course)...
> >
> > The problems I've ran so far:
> > - blocking FFI blocks the vm. I've not tried yet to use threads through
> FFI
> > (and I don't know if it works. Does it?). But It should be great to
> start
> > a headless seaside server with a command line :/.
> >
> > Ok, it's a very simple thing, but it allows to execute a expression from
> a
> > remote server via ssh without doing much :).
> >
> > Guille
>
>
>
> --
> Damien Pollet
> type less, do more [ | ] http://people.untyped.org/damien.pollet
>
>
--
best,
Eliot
Jan. 31, 2012
Re: [Pharo-project] Morpheas , bringing Morphic to Opengl (3d GUIs)
by Eliot Miranda
enough of the huge stack backtraces please...
On Tue, Jan 31, 2012 at 1:29 AM, dimitris chloupis <thekilon(a)yahoo.co.uk>wrote:
> I wanted to ask if NB and COG will support windows as well, I see no
> windows build.
>
> and here we go with first problem. I am in linux mint 12 32 bit with a
> graphic card NVIDIA GEFORCE 6200 .
>
> I got Cog VM with the Nativeboost plugin + Pharo 1.4 image + Nativeboost +
> NBOpenGL
>
> This is my workspace
>
> ----
> Gofer it
> squeaksource: 'NativeBoost';
> package: 'NativeBoost-Installer';
> load.
>
>
> NBInstaller install.
>
> Gofer it
> squeaksource: 'NBOpenGL';
> package: 'ConfigurationOfNBOpenGL';
> load.
>
> ConfigurationOfNBOpenGL project lastVersion load.
>
> test := (GLTTRenderingDemo new) openInWorld; yourself.
> ---
>
> the problem appears in the last line with an error "No suitable
> implementation found for initlising OpenGL context" . Should I assume it
> can find OpenGL libraries or is it a problem with the graphic card drivers.
> CC has been given me problem, but Blender works okish considering it
> completely reliant on OpenGL
>
> Here is all debug info
>
> ----
> 31 January 2012 11:27:51 am
>
> VM: unix - i686 - linux-gnu - NBCoInterpreter
> NativeBoost-CogPlugin-IgorStasenko.8 uuid:
> f47ef546-de3d-4415-850e-6437d67bfb5c Aug 9 2011,
> StackToRegisterMappingCogit VMMaker-oscog-IgorStasenko.108 uuid:
> 384f4108-f1f4-4954-8357-0b3005cb81e2 Aug 9 2011,
> https://git.gitorious.org/cogvm/blessed.git Commit:
> f6deabba4432fa22b767dc17718a0fb84c9f3e88 Date: Tue Aug 9 14:47:19 2011
> +0200 By: Igor Stasenko <siguctua(a)gmail.com>
> Image: Pharo1.4a [Latest update: #14284]
>
> NBGLContextDriver class(Object)>>error:
> Receiver: NBGLContextDriver
> Arguments and temporary variables:
> aString: 'No suitable implementation found for initializing OpenGL
> context for ...etc...
> Receiver's instance variables:
> superclass: Object
> methodDict: a
> MethodDictionary(#changeViewportSize:->(NBGLContextDriver>>#chang...etc...
> format: 132
> instanceVariables: #('gl')
> organization: ('viewport' changeViewportSize:)
> ('initialize-release' createCont...etc...
> subclasses: {NBMacGLContextDriver}
> name: #NBGLContextDriver
> classPool: nil
> sharedPools: an OrderedCollection(NBGLConstants)
> environment: a SystemDictionary(lots of globals)
> category: #'NBOpenGL-Display'
> traitComposition: {}
> localSelectors: nil
>
> [self error: 'No suitable implementation found for initializing OpenGL
> context for your platform'] in NBGLContextDriver class>>forCurrentPlatform
> Receiver: NBGLContextDriver
> Arguments and temporary variables:
>
> Receiver's instance variables:
> superclass: Object
> methodDict: a
> MethodDictionary(#changeViewportSize:->(NBGLContextDriver>>#chang...etc...
> format: 132
> instanceVariables: #('gl')
> organization: ('viewport' changeViewportSize:)
> ('initialize-release' createCont...etc...
> subclasses: {NBMacGLContextDriver}
> name: #NBGLContextDriver
> classPool: nil
> sharedPools: an OrderedCollection(NBGLConstants)
> environment: a SystemDictionary(lots of globals)
> category: #'NBOpenGL-Display'
> traitComposition: {}
> localSelectors: nil
>
> OrderedCollection(Collection)>>detect:ifNone:
> Receiver: an OrderedCollection(NBMacGLContextDriver)
> Arguments and temporary variables:
> aBlock: [:cls | cls supportsCurrentPlatform]
> exceptionBlock: [self error: 'No suitable implementation found for
> initializing...etc...
> Receiver's instance variables:
> array: {NBMacGLContextDriver}
> firstIndex: 1
> lastIndex: 1
>
> NBGLContextDriver class>>forCurrentPlatform
> Receiver: NBGLContextDriver
> Arguments and temporary variables:
> driver: nil
> Receiver's instance variables:
> superclass: Object
> methodDict: a
> MethodDictionary(#changeViewportSize:->(NBGLContextDriver>>#chang...etc...
> format: 132
> instanceVariables: #('gl')
> organization: ('viewport' changeViewportSize:)
> ('initialize-release' createCont...etc...
> subclasses: {NBMacGLContextDriver}
> name: #NBGLContextDriver
> classPool: nil
> sharedPools: an OrderedCollection(NBGLConstants)
> environment: a SystemDictionary(lots of globals)
> category: #'NBOpenGL-Display'
> traitComposition: {}
> localSelectors: nil
>
> NBGLContextDriver class>>createContext:
> Receiver: NBGLContextDriver
> Arguments and temporary variables:
> initialExtent: (50@40)
> Receiver's instance variables:
> superclass: Object
> methodDict: a
> MethodDictionary(#changeViewportSize:->(NBGLContextDriver>>#chang...etc...
> format: 132
> instanceVariables: #('gl')
> organization: ('viewport' changeViewportSize:)
> ('initialize-release' createCont...etc...
> subclasses: {NBMacGLContextDriver}
> name: #NBGLContextDriver
> classPool: nil
> sharedPools: an OrderedCollection(NBGLConstants)
> environment: a SystemDictionary(lots of globals)
> category: #'NBOpenGL-Display'
> traitComposition: {}
> localSelectors: nil
>
> NBGLDisplay class>>extent:
> Receiver: NBGLDisplay
> Arguments and temporary variables:
> anInitialExtent: (50@40)
> driver: nil
> extensions: nil
> disp: nil
> ext: (50@40)
> Receiver's instance variables:
> superclass: Object
> methodDict: a MethodDictionary(#canUseForm:->(NBGLDisplay>>#canUseForm:
> "a Comp...etc...
> format: 136
> instanceVariables: #('session' 'extent' 'driver')
> organization: ('reading pixels' canUseForm: updateForm:bounds:)
> ('viewport' cha...etc...
> subclasses: {NBMSAAOffscreenDisplay. NBOffscreenDisplay}
> name: #NBGLDisplay
> classPool: nil
> sharedPools: an OrderedCollection(NBGLConstants)
> environment: a SystemDictionary(lots of globals)
> category: #'NBOpenGL-Display'
> traitComposition: {}
> localSelectors: nil
>
> GLTTRenderingDemo(GLViewportMorph)>>initializeForNewSession
> Receiver: a GLTTRenderingDemo(979369984)
> Arguments and temporary variables:
>
> Receiver's instance variables:
> bounds: (0@0) corner: (50@40)
> owner: nil
> submorphs: #()
> fullBounds: (0@0) corner: (50@40)
> color: Color blue
> extension: a MorphExtension (987496448)
> session: nil
> form: nil
> useOwnForm: nil
> display: nil
> d: nil
> glyphCache: nil
> font: nil
> curveRenderer: nil
>
> GLTTRenderingDemo>>initializeForNewSession
> Receiver: a GLTTRenderingDemo(979369984)
> Arguments and temporary variables:
>
> Receiver's instance variables:
> bounds: (0@0) corner: (50@40)
> owner: nil
> submorphs: #()
> fullBounds: (0@0) corner: (50@40)
> color: Color blue
> extension: a MorphExtension (987496448)
> session: nil
> form: nil
> useOwnForm: nil
> display: nil
> d: nil
> glyphCache: nil
> font: nil
> curveRenderer: nil
>
> GLTTRenderingDemo(GLViewportMorph)>>initialize
> Receiver: a GLTTRenderingDemo(979369984)
> Arguments and temporary variables:
>
> Receiver's instance variables:
> bounds: (0@0) corner: (50@40)
> owner: nil
> submorphs: #()
> fullBounds: (0@0) corner: (50@40)
> color: Color blue
> extension: a MorphExtension (987496448)
> session: nil
> form: nil
> useOwnForm: nil
> display: nil
> d: nil
> glyphCache: nil
> font: nil
> curveRenderer: nil
>
> GLTTRenderingDemo>>initialize
> Receiver: a GLTTRenderingDemo(979369984)
> Arguments and temporary variables:
> fontPath: nil
> Receiver's instance variables:
> bounds: (0@0) corner: (50@40)
> owner: nil
> submorphs: #()
> fullBounds: (0@0) corner: (50@40)
> color: Color blue
> extension: a MorphExtension (987496448)
> session: nil
> form: nil
> useOwnForm: nil
> display: nil
> d: nil
> glyphCache: nil
> font: nil
> curveRenderer: nil
>
> GLTTRenderingDemo class(Behavior)>>new
> Receiver: GLTTRenderingDemo
> Arguments and temporary variables:
>
> Receiver's instance variables:
> superclass: GLViewportMorph
> methodDict: a
> MethodDictionary(#initialize->(GLTTRenderingDemo>>#initialize "a ...etc...
> format: 158
> instanceVariables: #('d' 'glyphCache' 'font' 'curveRenderer')
> organization: ('as yet unclassified' initialize initializeForNewSession
> openInW...etc...
> subclasses: nil
> name: #GLTTRenderingDemo
> classPool: nil
> sharedPools: nil
> environment: a SystemDictionary(lots of globals)
> category: #'NBOpenGL-Morphic-Demo'
> traitComposition: {}
> localSelectors: nil
>
> UndefinedObject>>DoIt
> Receiver: nil
> Arguments and temporary variables:
>
> Receiver's instance variables:
> nil
>
> Compiler>>evaluate:in:to:notifying:ifFail:logged:
> Receiver: a Compiler
> Arguments and temporary variables:
> textOrStream: a ReadWriteStream
> aContext: nil
> receiver: nil
> aRequestor: a TextMorphForEditView(50593792)
> failBlock: [self morph flash.
> ^ nil]
> logFlag: true
> methodNode: DoIt
> ^ test := GLTTRenderingDemo new openInWorld; yourself
> method: (UndefinedObject>>#DoIt "a CompiledMethod(970457088)")
> value: nil
> toLog: nil
> itsSelection: nil
> itsSelectionString: nil
> Receiver's instance variables:
> sourceStream: a ReadWriteStream
> requestor: a TextMorphForEditView(50593792)
> class: UndefinedObject
> category: nil
> context: nil
> parser: a Parser
>
> [rcvr class evaluatorClass new
> evaluate: self selectionForDoitAsStream
> in: ctxt
> to: rcvr
> notifying: self morph
> ifFail: [self morph flash.
> ^ nil]
> logged: true] in SmalltalkEditor>>evaluateSelectionAndDo:
> Receiver: a SmalltalkEditor
> Arguments and temporary variables:
> rcvr: nil
> ctxt: nil
> Receiver's instance variables:
> morph: a TextMorphForEditView(50593792)
> selectionShowing: true
> model: a Workspace
> editingState: a SmalltalkEditingState
>
> BlockClosure>>on:do:
> Receiver: [rcvr class evaluatorClass new
> evaluate: self selectionForDoitAsStream
> in: ctxt
> to: ...etc...
> Arguments and temporary variables:
> exception: OutOfScopeNotification
> handlerAction: [:ex | ex resume: true]
> handlerActive: true
> Receiver's instance variables:
> outerContext: SmalltalkEditor>>evaluateSelectionAndDo:
> startpc: 110
> numArgs: 0
>
> SmalltalkEditor>>evaluateSelectionAndDo:
> Receiver: a SmalltalkEditor
> Arguments and temporary variables:
> aBlock: [:result | result]
> result: nil
> rcvr: nil
> ctxt: nil
> Receiver's instance variables:
> morph: a TextMorphForEditView(50593792)
> selectionShowing: true
> model: a Workspace
> editingState: a SmalltalkEditingState
>
> SmalltalkEditor>>evaluateSelection
> Receiver: a SmalltalkEditor
> Arguments and temporary variables:
>
> Receiver's instance variables:
> morph: a TextMorphForEditView(50593792)
> selectionShowing: true
> model: a Workspace
> editingState: a SmalltalkEditingState
>
> [textMorph editor evaluateSelection] in PluggableTextMorph>>doIt
> Receiver: a PluggableTextMorph(268173312)
> Arguments and temporary variables:
>
> Receiver's instance variables:
> bounds: (509.0(a)25.0) corner: (951.0(a)388.0)
> owner: a SystemWindow(672137216)
> submorphs: an Array(a TransformMorph(428343296))
> fullBounds: (509@25) corner: (951@388)
> color: (Color r: 0.804 g: 0.864 b: 0.857)
> extension: a MorphExtension (45350912) [locked]
> borderWidth: 1
> borderColor: #inset
> model: a Workspace
> open: false
> accessor: nil
> scrollBar: a ScrollBar(274989056)
> scroller: a TransformMorph(428343296)
> retractableScrollBar: false
> scrollBarOnLeft: false
> getMenuSelector: #codePaneMenu:shifted:
> getMenuTitleSelector: nil
> hasFocus: false
> hScrollBar: a ScrollBar(668205056)
> textMorph: a TextMorphForEditView(50593792)
> getTextSelector: #contents
> setTextSelector: #acceptContents:
> getSelectionSelector: nil
> hasUnacceptedEdits: true
> askBeforeDiscardingEdits: true
> selectionInterval: (1 to: 333)
> hasEditingConflicts: false
> acceptAction: nil
> getColorSelector: nil
> unstyledAcceptText: nil
> styler: a SHTextStylerST80
> autoAccept: nil
> enabled: true
> getEnabledSelector: nil
> highlights: an OrderedCollection()
> acceptOnFocusChange: nil
> selectionColor: nil
> alwaysAccept: nil
> changedAction: nil
>
> [result := editBlock value] in PluggableTextMorph>>handleEdit:
> Receiver: a PluggableTextMorph(268173312)
> Arguments and temporary variables:
> editBlock: [textMorph editor evaluateSelection]
> result: #(nil)
> Receiver's instance variables:
> bounds: (509.0(a)25.0) corner: (951.0(a)388.0)
> owner: a SystemWindow(672137216)
> submorphs: an Array(a TransformMorph(428343296))
> fullBounds: (509@25) corner: (951@388)
> color: (Color r: 0.804 g: 0.864 b: 0.857)
> extension: a MorphExtension (45350912) [locked]
> borderWidth: 1
> borderColor: #inset
> model: a Workspace
> open: false
> accessor: nil
> scrollBar: a ScrollBar(274989056)
> scroller: a TransformMorph(428343296)
> retractableScrollBar: false
> scrollBarOnLeft: false
> getMenuSelector: #codePaneMenu:shifted:
> getMenuTitleSelector: nil
> hasFocus: false
> hScrollBar: a ScrollBar(668205056)
> textMorph: a TextMorphForEditView(50593792)
> getTextSelector: #contents
> setTextSelector: #acceptContents:
> getSelectionSelector: nil
> hasUnacceptedEdits: true
> askBeforeDiscardingEdits: true
> selectionInterval: (1 to: 333)
> hasEditingConflicts: false
> acceptAction: nil
> getColorSelector: nil
> unstyledAcceptText: nil
> styler: a SHTextStylerST80
> autoAccept: nil
> enabled: true
> getEnabledSelector: nil
> highlights: an OrderedCollection()
> acceptOnFocusChange: nil
> selectionColor: nil
> alwaysAccept: nil
> changedAction: nil
>
> TextMorphForEditView(TextMorph)>>handleEdit:
> Receiver: a TextMorphForEditView(50593792)
> Arguments and temporary variables:
> editBlock: [result := editBlock value]
> Receiver's instance variables:
> bounds: (0@0) corner: (434@274)
> owner: a TransformMorph(428343296)
> submorphs: #()
> fullBounds: (0@0) corner: (434@274)
> color: Color black
> extension: a MorphExtension (70778880) [other: (blinkStart -> 2690020)
> (myDepe...etc...
> borderWidth: 0
> borderColor: Color black
> textStyle: a TextStyle Bitmap DejaVu Sans 9
> text: a Text for 'Gofer it
> squeaksource: ''NativeBoost'';
> packa...etc...
> wrapFlag: true
> paragraph: a Paragraph
> editor: a SmalltalkEditor
> container: nil
> predecessor: nil
> successor: nil
> backgroundColor: nil
> margins: nil
> editView: a PluggableTextMorph(268173312)
> acceptOnCR: false
> autoAccept: false
> acceptOnFocusChange: false
> selectionColor: nil
>
> PluggableTextMorph>>handleEdit:
> Receiver: a PluggableTextMorph(268173312)
> Arguments and temporary variables:
> editBlock: [textMorph editor evaluateSelection]
> result: #(nil)
> Receiver's instance variables:
> bounds: (509.0(a)25.0) corner: (951.0(a)388.0)
> owner: a SystemWindow(672137216)
> submorphs: an Array(a TransformMorph(428343296))
> fullBounds: (509@25) corner: (951@388)
> color: (Color r: 0.804 g: 0.864 b: 0.857)
> extension: a MorphExtension (45350912) [locked]
> borderWidth: 1
> borderColor: #inset
> model: a Workspace
> open: false
> accessor: nil
> scrollBar: a ScrollBar(274989056)
> scroller: a TransformMorph(428343296)
> retractableScrollBar: false
> scrollBarOnLeft: false
> getMenuSelector: #codePaneMenu:shifted:
> getMenuTitleSelector: nil
> hasFocus: false
> hScrollBar: a ScrollBar(668205056)
> textMorph: a TextMorphForEditView(50593792)
> getTextSelector: #contents
> setTextSelector: #acceptContents:
> getSelectionSelector: nil
> hasUnacceptedEdits: true
> askBeforeDiscardingEdits: true
> selectionInterval: (1 to: 333)
> hasEditingConflicts: false
> acceptAction: nil
> getColorSelector: nil
> unstyledAcceptText: nil
> styler: a SHTextStylerST80
> autoAccept: nil
> enabled: true
> getEnabledSelector: nil
> highlights: an OrderedCollection()
> acceptOnFocusChange: nil
> selectionColor: nil
> alwaysAccept: nil
> changedAction: nil
>
> PluggableTextMorph>>doIt
> Receiver: a PluggableTextMorph(268173312)
> Arguments and temporary variables:
>
> Receiver's instance variables:
> bounds: (509.0(a)25.0) corner: (951.0(a)388.0)
> owner: a SystemWindow(672137216)
> submorphs: an Array(a TransformMorph(428343296))
> fullBounds: (509@25) corner: (951@388)
> color: (Color r: 0.804 g: 0.864 b: 0.857)
> extension: a MorphExtension (45350912) [locked]
> borderWidth: 1
> borderColor: #inset
> model: a Workspace
> open: false
> accessor: nil
> scrollBar: a ScrollBar(274989056)
> scroller: a TransformMorph(428343296)
> retractableScrollBar: false
> scrollBarOnLeft: false
> getMenuSelector: #codePaneMenu:shifted:
> getMenuTitleSelector: nil
> hasFocus: false
> hScrollBar: a ScrollBar(668205056)
> textMorph: a TextMorphForEditView(50593792)
> getTextSelector: #contents
> setTextSelector: #acceptContents:
> getSelectionSelector: nil
> hasUnacceptedEdits: true
> askBeforeDiscardingEdits: true
> selectionInterval: (1 to: 333)
> hasEditingConflicts: false
> acceptAction: nil
> getColorSelector: nil
> unstyledAcceptText: nil
> styler: a SHTextStylerST80
> autoAccept: nil
> enabled: true
> getEnabledSelector: nil
> highlights: an OrderedCollection()
> acceptOnFocusChange: nil
> selectionColor: nil
> alwaysAccept: nil
> changedAction: nil
>
> Workspace(StringHolder)>>perform:orSendTo:
> Receiver: a Workspace
> Arguments and temporary variables:
> selector: #doIt
> otherTarget: a PluggableTextMorph(268173312)
> Receiver's instance variables:
> dependents: a DependentsArray(a SystemWindow(672137216) a
> PluggableTextMorph(26...etc...
> contents: ''
> bindings: a Dictionary('test'->nil )
> acceptDroppedMorphs: false
> acceptAction: nil
> mustDeclareVariables: false
> fileName: nil
> lineEnding: #lf
> encoding: 'utf-8'
> stylingActive: true
>
> [| selArgCount |
> (selArgCount := selector numArgs) = 0
> ifTrue: [target perform: selector]
> ifFalse: [selArgCount = arguments size
> ifTrue: [target perform: selector withArguments: arguments]
> ifFalse: [target
> perform: selector
> withArguments: (arguments copyWith: evt)]].
> self changed] in ToggleMenuItemMorph(MenuItemMorph)>>invokeWithEvent:
> Receiver: a ToggleMenuItemMorph(287309824)'Do it (d)'
> Arguments and temporary variables:
> evt: [(560@321) mouseUp 828114 nil]
> selArgCount: 2
> Receiver's instance variables:
> bounds: (541.0(a)310.0) corner: (678.0(a)328.0)
> owner: a MenuMorph(954466304)
> submorphs: #()
> fullBounds: (541.0(a)310.0) corner: (678.0(a)328.0)
> color: Color black
> extension: a MorphExtension (289931264)
> font: a StrikeFont(Bitmap DejaVu Sans 9 14)
> emphasis: 0
> contents: 'Do it (d)'
> hasFocus: false
> isEnabled: true
> subMenu: nil
> isSelected: false
> target: a Workspace
> selector: #perform:orSendTo:
> arguments: an Array(#doIt a PluggableTextMorph(268173312))
> icon: Form(16x16x32)
> getStateSelector: nil
> enablementSelector: nil
> keyText: nil
>
> BlockClosure>>ensure:
> Receiver: [| selArgCount |
> (selArgCount := selector numArgs) = 0
> ifTrue: [target perform: selector...etc...
> Arguments and temporary variables:
> aBlock: [oldcursor show]
> complete: nil
> returnValue: nil
> Receiver's instance variables:
> outerContext: ToggleMenuItemMorph(MenuItemMorph)>>invokeWithEvent:
> startpc: 160
> numArgs: 0
>
> CursorWithMask(Cursor)>>showWhile:
> Receiver: ((CursorWithMask
> extent: (16@16)
> depth: 1
> fromArray: #(
> 2r0
> 2r100000000000000000000...etc...
> Arguments and temporary variables:
> aBlock: [| selArgCount |
> (selArgCount := selector numArgs) = 0
> ifTrue: [targe...etc...
> oldcursor: ((CursorWithMask
> extent: (16@16)
> depth: 1
> fromArray: #(
> 2r0
> 2...etc...
> Receiver's instance variables:
> bits: a Bitmap of length 16
> width: 16
> height: 16
> depth: 1
> offset: (-1@ -1)
> maskForm: Form(16x16x1)
>
> ToggleMenuItemMorph(MenuItemMorph)>>invokeWithEvent:
> Receiver: a ToggleMenuItemMorph(287309824)'Do it (d)'
> Arguments and temporary variables:
> evt: [(560@321) mouseUp 828114 nil]
> w: a PasteUpMorph(425197568) [world]
> Receiver's instance variables:
> bounds: (541.0(a)310.0) corner: (678.0(a)328.0)
> owner: a MenuMorph(954466304)
> submorphs: #()
> fullBounds: (541.0(a)310.0) corner: (678.0(a)328.0)
> color: Color black
> extension: a MorphExtension (289931264)
> font: a StrikeFont(Bitmap DejaVu Sans 9 14)
> emphasis: 0
> contents: 'Do it (d)'
> hasFocus: false
> isEnabled: true
> subMenu: nil
> isSelected: false
> target: a Workspace
> selector: #perform:orSendTo:
> arguments: an Array(#doIt a PluggableTextMorph(268173312))
> icon: Form(16x16x32)
> getStateSelector: nil
> enablementSelector: nil
> keyText: nil
>
> ToggleMenuItemMorph(MenuItemMorph)>>mouseUp:
> Receiver: a ToggleMenuItemMorph(287309824)'Do it (d)'
> Arguments and temporary variables:
> evt: [(560@321) mouseUp 828114 nil]
> Receiver's instance variables:
> bounds: (541.0(a)310.0) corner: (678.0(a)328.0)
> owner: a MenuMorph(954466304)
> submorphs: #()
> fullBounds: (541.0(a)310.0) corner: (678.0(a)328.0)
> color: Color black
> extension: a MorphExtension (289931264)
> font: a StrikeFont(Bitmap DejaVu Sans 9 14)
> emphasis: 0
> contents: 'Do it (d)'
> hasFocus: false
> isEnabled: true
> subMenu: nil
> isSelected: false
> target: a Workspace
> selector: #perform:orSendTo:
> arguments: an Array(#doIt a PluggableTextMorph(268173312))
> icon: Form(16x16x32)
> getStateSelector: nil
> enablementSelector: nil
> keyText: nil
>
> ToggleMenuItemMorph(MenuItemMorph)>>handleMouseUp:
> Receiver: a ToggleMenuItemMorph(287309824)'Do it (d)'
> Arguments and temporary variables:
> anEvent: [(560@321) mouseUp 828114 nil]
> Receiver's instance variables:
> bounds: (541.0(a)310.0) corner: (678.0(a)328.0)
> owner: a MenuMorph(954466304)
> submorphs: #()
> fullBounds: (541.0(a)310.0) corner: (678.0(a)328.0)
> color: Color black
> extension: a MorphExtension (289931264)
> font: a StrikeFont(Bitmap DejaVu Sans 9 14)
> emphasis: 0
> contents: 'Do it (d)'
> hasFocus: false
> isEnabled: true
> subMenu: nil
> isSelected: false
> target: a Workspace
> selector: #perform:orSendTo:
> arguments: an Array(#doIt a PluggableTextMorph(268173312))
> icon: Form(16x16x32)
> getStateSelector: nil
> enablementSelector: nil
> keyText: nil
>
> MouseButtonEvent>>sentTo:
> Receiver: [(560@321) mouseUp 828114 nil]
> Arguments and temporary variables:
> anObject: a ToggleMenuItemMorph(287309824)'Do it (d)'
> Receiver's instance variables:
> timeStamp: 828114
> source: a HandMorph(843055104)
> windowIndex: nil
> type: #mouseUp
> buttons: 0
> position: (560@321)
> handler: nil
> wasHandled: true
> whichButton: 4
>
> ToggleMenuItemMorph(Morph)>>handleEvent:
> Receiver: a ToggleMenuItemMorph(287309824)'Do it (d)'
> Arguments and temporary variables:
> anEvent: [(560@321) mouseUp 828114 nil]
> Receiver's instance variables:
> bounds: (541.0(a)310.0) corner: (678.0(a)328.0)
> owner: a MenuMorph(954466304)
> submorphs: #()
> fullBounds: (541.0(a)310.0) corner: (678.0(a)328.0)
> color: Color black
> extension: a MorphExtension (289931264)
> font: a StrikeFont(Bitmap DejaVu Sans 9 14)
> emphasis: 0
> contents: 'Do it (d)'
> hasFocus: false
> isEnabled: true
> subMenu: nil
> isSelected: false
> target: a Workspace
> selector: #perform:orSendTo:
> arguments: an Array(#doIt a PluggableTextMorph(268173312))
> icon: Form(16x16x32)
> getStateSelector: nil
> enablementSelector: nil
> keyText: nil
>
> MorphicEventDispatcher>>dispatchDefault:with:
> Receiver: a MorphicEventDispatcher
> Arguments and temporary variables:
> anEvent: [(560@321) mouseUp 828114 nil]
> aMorph: a ToggleMenuItemMorph(287309824)'Do it (d)'
> localEvt: nil
> index: 1
> child: nil
> morphs: #()
> inside: true
> Receiver's instance variables:
> lastType: #mouseUp
> lastDispatch: #dispatchDefault:with:
>
> MorphicEventDispatcher>>dispatchEvent:with:
> Receiver: a MorphicEventDispatcher
> Arguments and temporary variables:
> anEvent: [(560@321) mouseUp 828114 nil]
> aMorph: a ToggleMenuItemMorph(287309824)'Do it (d)'
> Receiver's instance variables:
> lastType: #mouseUp
> lastDispatch: #dispatchDefault:with:
>
> ToggleMenuItemMorph(Morph)>>processEvent:using:
> Receiver: a ToggleMenuItemMorph(287309824)'Do it (d)'
> Arguments and temporary variables:
> anEvent: [(560@321) mouseUp 828114 nil]
> defaultDispatcher: a MorphicEventDispatcher
> Receiver's instance variables:
> bounds: (541.0(a)310.0) corner: (678.0(a)328.0)
> owner: a MenuMorph(954466304)
> submorphs: #()
> fullBounds: (541.0(a)310.0) corner: (678.0(a)328.0)
> color: Color black
> extension: a MorphExtension (289931264)
> font: a StrikeFont(Bitmap DejaVu Sans 9 14)
> emphasis: 0
> contents: 'Do it (d)'
> hasFocus: false
> isEnabled: true
> subMenu: nil
> isSelected: false
> target: a Workspace
> selector: #perform:orSendTo:
> arguments: an Array(#doIt a PluggableTextMorph(268173312))
> icon: Form(16x16x32)
> getStateSelector: nil
> enablementSelector: nil
> keyText: nil
>
> MorphicEventDispatcher>>dispatchDefault:with:
> Receiver: a MorphicEventDispatcher
> Arguments and temporary variables:
> anEvent: [(560@321) mouseUp 828114 nil]
> aMorph: a MenuMorph(954466304)
> localEvt: [(560@321) mouseUp 828114 nil]
> index: 1
> child: a ToggleMenuItemMorph(287309824)'Do it (d)'
> morphs: an Array(a ToggleMenuItemMorph(287309824)'Do it (d)' a
> ToggleMenuItemMo...etc...
> inside: false
> Receiver's instance variables:
> lastType: #mouseUp
> lastDispatch: #dispatchDefault:with:
>
> MorphicEventDispatcher>>dispatchEvent:with:
> Receiver: a MorphicEventDispatcher
> Arguments and temporary variables:
> anEvent: [(560@321) mouseUp 828114 nil]
> aMorph: a MenuMorph(954466304)
> Receiver's instance variables:
> lastType: #mouseUp
> lastDispatch: #dispatchDefault:with:
>
> MenuMorph(Morph)>>processEvent:using:
> Receiver: a MenuMorph(954466304)
> Arguments and temporary variables:
> anEvent: [(560@321) mouseUp 828114 nil]
> defaultDispatcher: a MorphicEventDispatcher
> Receiver's instance variables:
> bounds: (537.0(a)306.0) corner: (682.0(a)644.0)
> owner: nil
> submorphs: an Array(a ToggleMenuItemMorph(287309824)'Do it (d)' a
> ToggleMenuIte...etc...
> fullBounds: (537.0(a)306.0) corner: (683.0(a)645.0)
> color: (Color r: 0.775 g: 0.775 b: 0.775)
> extension: a MorphExtension (958136320) [other: (basicColor -> Color
> lightGray...etc...
> borderWidth: 1
> borderColor: Color gray
> defaultTarget: a Workspace
> selectedItem: a ToggleMenuItemMorph(287309824)'Do it (d)'
> stayUp: false
> popUpOwner: nil
> activeSubMenu: nil
> activatorDockingBar: nil
> embeddable: nil
> menuItems: an OrderedCollection(a ToggleMenuItemMorph(287309824)'Do it
> (d)' a T...etc...
>
> MenuMorph(Morph)>>processEvent:
> Receiver: a MenuMorph(954466304)
> Arguments and temporary variables:
> anEvent: [(560@321) mouseUp 828114 nil]
> Receiver's instance variables:
> bounds: (537.0(a)306.0) corner: (682.0(a)644.0)
> owner: nil
> submorphs: an Array(a ToggleMenuItemMorph(287309824)'Do it (d)' a
> ToggleMenuIte...etc...
> fullBounds: (537.0(a)306.0) corner: (683.0(a)645.0)
> color: (Color r: 0.775 g: 0.775 b: 0.775)
> extension: a MorphExtension (958136320) [other: (basicColor -> Color
> lightGray...etc...
> borderWidth: 1
> borderColor: Color gray
> defaultTarget: a Workspace
> selectedItem: a ToggleMenuItemMorph(287309824)'Do it (d)'
> stayUp: false
> popUpOwner: nil
> activeSubMenu: nil
> activatorDockingBar: nil
> embeddable: nil
> menuItems: an OrderedCollection(a ToggleMenuItemMorph(287309824)'Do it
> (d)' a T...etc...
>
> MenuMorph>>handleFocusEvent:
> Receiver: a MenuMorph(954466304)
> Arguments and temporary variables:
> evt: [(560@321) mouseUp 828114 nil]
> Receiver's instance variables:
> bounds: (537.0(a)306.0) corner: (682.0(a)644.0)
> owner: nil
> submorphs: an Array(a ToggleMenuItemMorph(287309824)'Do it (d)' a
> ToggleMenuIte...etc...
> fullBounds: (537.0(a)306.0) corner: (683.0(a)645.0)
> color: (Color r: 0.775 g: 0.775 b: 0.775)
> extension: a MorphExtension (958136320) [other: (basicColor -> Color
> lightGray...etc...
> borderWidth: 1
> borderColor: Color gray
> defaultTarget: a Workspace
> selectedItem: a ToggleMenuItemMorph(287309824)'Do it (d)'
> stayUp: false
> popUpOwner: nil
> activeSubMenu: nil
> activatorDockingBar: nil
> embeddable: nil
> menuItems: an OrderedCollection(a ToggleMenuItemMorph(287309824)'Do it
> (d)' a T...etc...
>
>
> --- The full stack ---
> NBGLContextDriver class(Object)>>error:
> [self error: 'No suitable implementation found for initializing OpenGL
> context for your platform'] in NBGLContextDriver class>>forCurrentPlatform
> OrderedCollection(Collection)>>detect:ifNone:
> NBGLContextDriver class>>forCurrentPlatform
> NBGLContextDriver class>>createContext:
> NBGLDisplay class>>extent:
> GLTTRenderingDemo(GLViewportMorph)>>initializeForNewSession
> GLTTRenderingDemo>>initializeForNewSession
> GLTTRenderingDemo(GLViewportMorph)>>initialize
> GLTTRenderingDemo>>initialize
> GLTTRenderingDemo class(Behavior)>>new
> UndefinedObject>>DoIt
> Compiler>>evaluate:in:to:notifying:ifFail:logged:
> [rcvr class evaluatorClass new
> evaluate: self selectionForDoitAsStream
> in: ctxt
> to: rcvr
> notifying: self morph
> ifFail: [self morph flash.
> ^ nil]
> logged: true] in SmalltalkEditor>>evaluateSelectionAndDo:
> BlockClosure>>on:do:
> SmalltalkEditor>>evaluateSelectionAndDo:
> SmalltalkEditor>>evaluateSelection
> [textMorph editor evaluateSelection] in PluggableTextMorph>>doIt
> [result := editBlock value] in PluggableTextMorph>>handleEdit:
> TextMorphForEditView(TextMorph)>>handleEdit:
> PluggableTextMorph>>handleEdit:
> PluggableTextMorph>>doIt
> Workspace(StringHolder)>>perform:orSendTo:
> [| selArgCount |
> (selArgCount := selector numArgs) = 0
> ifTrue: [target perform: selector]
> ifFalse: [selArgCount = arguments size
> ifTrue: [target perform: selector withArguments: arguments]
> ifFalse: [target
> perform: selector
> withArguments: (arguments copyWith: evt)]].
> self changed] in ToggleMenuItemMorph(MenuItemMorph)>>invokeWithEvent:
> BlockClosure>>ensure:
> CursorWithMask(Cursor)>>showWhile:
> ToggleMenuItemMorph(MenuItemMorph)>>invokeWithEvent:
> ToggleMenuItemMorph(MenuItemMorph)>>mouseUp:
> ToggleMenuItemMorph(MenuItemMorph)>>handleMouseUp:
> MouseButtonEvent>>sentTo:
> ToggleMenuItemMorph(Morph)>>handleEvent:
> MorphicEventDispatcher>>dispatchDefault:with:
> MorphicEventDispatcher>>dispatchEvent:with:
> ToggleMenuItemMorph(Morph)>>processEvent:using:
> MorphicEventDispatcher>>dispatchDefault:with:
> MorphicEventDispatcher>>dispatchEvent:with:
> MenuMorph(Morph)>>processEvent:using:
> MenuMorph(Morph)>>processEvent:
> MenuMorph>>handleFocusEvent:
> - - - - - - - - - - - - - - -
> - - - - - - - - - - - - - - - - - -
> [ActiveHand := self.
> ActiveEvent := anEvent.
> result := focusHolder
> handleFocusEvent: (anEvent
> transformedBy: (focusHolder transformedFrom: self))] in
> HandMorph>>sendFocusEvent:to:clear:
> [aBlock value] in PasteUpMorph>>becomeActiveDuring:
> BlockClosure>>on:do:
> PasteUpMorph>>becomeActiveDuring:
> HandMorph>>sendFocusEvent:to:clear:
> HandMorph>>sendEvent:focus:clear:
> HandMorph>>sendMouseEvent:
> HandMorph>>handleEvent:
> HandMorph>>processEvents
> [:h |
> ActiveHand := h.
> h processEvents.
> ActiveHand := nil] in WorldState>>doOneCycleNowFor:
> Array(SequenceableCollection)>>do:
> WorldState>>handsDo:
> WorldState>>doOneCycleNowFor:
> WorldState>>doOneCycleFor:
> WorldState>>doOneSubCycleFor:
> PasteUpMorph>>doOneSubCycle
> MenuMorph>>invokeModalAt:in:allowKeyboard:
> MenuMorph>>invokeModal:
> MenuMorph>>invokeModal
> PluggableTextMorph>>yellowButtonActivity:
> TextMorphForEditView>>mouseDown:
> TextMorphForEditView(Morph)>>handleMouseDown:
> MouseButtonEvent>>sentTo:
> TextMorphForEditView(Morph)>>handleEvent:
> MorphicEventDispatcher>>dispatchMouseDown:with:
> MorphicEventDispatcher>>dispatchEvent:with:
> TextMorphForEditView(Morph)>>processEvent:using:
> MorphicEventDispatcher>>dispatchMouseDown:with:**
> MorphicEventDispatcher>>dispatchEvent:with:
> TransformMorph(Morph)>>processEvent:using:
> MorphicEventDispatcher>>dispatchMouseDown:with:
> MorphicEventDispatcher>>dispatchEvent:with:
> PluggableTextMorph(Morph)>>processEvent:using:
> MorphicEventDispatcher>>dispatchMouseDown:with:
> MorphicEventDispatcher>>dispatchEvent:with:
> SystemWindow(Morph)>>processEvent:using:
> MorphicEventDispatcher>>dispatchMouseDown:with:
> MorphicEventDispatcher>>dispatchEvent:with:
> PasteUpMorph(Morph)>>processEvent:using:
> PasteUpMorph>>processEvent:using:
> PasteUpMorph(Morph)>>processEvent:
> HandMorph>>sendEvent:focus:clear:
> HandMorph>>sendMouseEvent:
> HandMorph>>handleEvent:
> HandMorph>>processEvents
> [:h |
> ActiveHand := h.
> h processEvents.
> ActiveHand := nil] in WorldState>>doOneCycleNowFor:
> Array(SequenceableCollection)>>do:
> WorldState>>handsDo:
> WorldState>>doOneCycleNowFor:
> WorldState>>doOneCycleFor:
> PasteUpMorph>>doOneCycle
> [[World doOneCycle.
> Processor yield.
> false] whileFalse.
> nil] in MorphicUIManager>>spawnNewProcess
> [self value.
> Processor terminateActive] in BlockClosure>>newProcess
>
>
--
best,
Eliot
Jan. 31, 2012
Re: [Pharo-project] Cog+linux: external module not found
by Esteban Lorenzano
we are using it with success... installed this way:
Gofer it
squeaksource: 'MetacelloRepository';
package: 'ConfigurationOfFFI';
load.
(ConfigurationOfFFI project version: '1.5') load.
Gofer it
squeaksource: 'Alien';
package: 'Alien';
load.
not sure if you need the both, but having them is easier: you can subclass ExternalLibrary, etc.... and use FFI in the old way <apicall:>, and when you need a callback you use alien Callback.
(works on pharo 1.3 and 1.4)
best,
Esteban
El 31/01/2012, a las 7:53p.m., Eliot Miranda escribió:
>
>
> On Tue, Jan 31, 2012 at 12:03 PM, Schwab,Wilhelm K <bschwab(a)anest.ufl.edu> wrote:
> Eliot,
>
> Interesting news... On Linux? Is there a good place to hunt for examples?
>
> Yes, on all three platforms. Alien. See http://www.squeaksource.com/Alien/Alien-kb.15
>
>
> Bill
>
>
> ________________________________________
> From: pharo-project-bounces(a)lists.gforge.inria.fr [pharo-project-bounces(a)lists.gforge.inria.fr] on behalf of Eliot Miranda [eliot.miranda(a)gmail.com]
> Sent: Tuesday, January 31, 2012 2:41 PM
> To: Pharo-project(a)lists.gforge.inria.fr
> Subject: Re: [Pharo-project] Cog+linux: external module not found
>
> On Tue, Jan 31, 2012 at 12:36 AM, Schwab,Wilhelm K <bschwab(a)anest.ufl.edu<mailto:bschwab@anest.ufl.edu>> wrote:
> Göran,
>
> Thanks for what you do, and for noticing what I (at least try) to contribute. Some other "tangible" items in my queue *will* be worth the wait[*]. I sincerely hope you are correct about a misunderstanding being at the base of thread.
>
> Hopefully, we can all dust ourselves off [**] and make FFI robust everywhere.
>
> Best regards,
>
> Bill
>
> [*] I know I've said this for essentially Pharo's entire life cycle, but it's true... Callbacks, my kingdom for callbacks.
>
> Callbacks in Cog work. The threaded VM needs work, but synchronous callbacks from blocking FFI calls work now. You may have to integrate image-level code but the VM has support and it works.
>
>
> [**] Some US slang for Stef's benefit :)
>
>
> ________________________________________
> From: pharo-project-bounces(a)lists.gforge.inria.fr<mailto:pharo-project-bounces@lists.gforge.inria.fr> [pharo-project-bounces(a)lists.gforge.inria.fr<mailto:pharo-project-bounces@lists.gforge.inria.fr>] on behalf of Göran Krampe [goran(a)krampe.se<mailto:goran@krampe.se>]
> Sent: Tuesday, January 31, 2012 3:05 AM
> To: pharo-project(a)lists.gforge.inria.fr<mailto:pharo-project@lists.gforge.inria.fr>
> Subject: Re: [Pharo-project] Cog+linux: external module not found
>
> Hi guys!
>
> On 01/09/2012 09:36 PM, Sven Van Caekenberghe wrote:
> > On 09 Jan 2012, at 20:06, Schwab,Wilhelm K wrote:
> >> I think you have the situation very much in reverse. You are flying off the handle, not me.
> >>
> >> Cog deserves better than to ignore feedback from motivated users. Motivated users deserve better than to be insulted for their efforts to improve it.
> >
> > Pharo, Squeak, Cog, Seaside, and most other Smalltalk software on SqueakSource is open source, written almost exclusively by people in their free time. And although most of them will try to help the users of their software the best they can, they cannot and should not do just anything unless they want to. The relation between open source authors and their users should be mutually productive. Using software and giving feedback if one thing, but it is not enough. It can't be one way all the time.
> >
> > I might be wrong, but I fail to find
> >
> > - any issues you put in the issue tracker(s)
> > - any issues you solved
> > - any open source software you published on SqueakSource or anywhere else
> > - any blog post or web pages with documentation, tutorials, .. that you wrote
> >
> > I hope you get the point: there are many more ways to contribute than what you are doing now.
> >
> > Pharo and other projects need all the help they can get, give back to the community, we are all using software written by others in the same spirit, it is only fair to honor these contributions.
> >
> > My 2c,
>
> This thread is long dead but I just wanted to mention that Wilhelm
> Schwab is a long time Squeaker and has been active in the community long
> before Pharo was even born. ;)
>
> Now, it seems to me that the "heat" in this particular thread was based
> on a misunderstanding, I know Eliot and it didn't seem to me he was
> trying to insult.
>
> General observation: Try taking it easy on the "what the heck have you
> done for us?"-talk. I have made several such similar posts too over the
> years when I got frustrated, but it might backfire if you aren't
> shooting at the "right people". We take pride in being a friendly
> community (Smalltalk at large) and I presume Pharo does too :)
>
> regards, Göran
>
>
>
>
>
> --
> best,
> Eliot
>
>
>
>
>
> --
> best,
> Eliot
>
Jan. 31, 2012
Re: [Pharo-project] Cog+linux: external module not found
by Eliot Miranda
On Tue, Jan 31, 2012 at 12:03 PM, Schwab,Wilhelm K <bschwab(a)anest.ufl.edu>wrote:
> Eliot,
>
> Interesting news... On Linux? Is there a good place to hunt for examples?
>
Yes, on all three platforms. Alien. See
http://www.squeaksource.com/Alien/Alien-kb.15
>
> Bill
>
>
> ________________________________________
> From: pharo-project-bounces(a)lists.gforge.inria.fr [
> pharo-project-bounces(a)lists.gforge.inria.fr] on behalf of Eliot Miranda [
> eliot.miranda(a)gmail.com]
> Sent: Tuesday, January 31, 2012 2:41 PM
> To: Pharo-project(a)lists.gforge.inria.fr
> Subject: Re: [Pharo-project] Cog+linux: external module not found
>
> On Tue, Jan 31, 2012 at 12:36 AM, Schwab,Wilhelm K <bschwab(a)anest.ufl.edu
> <mailto:bschwab@anest.ufl.edu>> wrote:
> Göran,
>
> Thanks for what you do, and for noticing what I (at least try) to
> contribute. Some other "tangible" items in my queue *will* be worth the
> wait[*]. I sincerely hope you are correct about a misunderstanding being
> at the base of thread.
>
> Hopefully, we can all dust ourselves off [**] and make FFI robust
> everywhere.
>
> Best regards,
>
> Bill
>
> [*] I know I've said this for essentially Pharo's entire life cycle, but
> it's true... Callbacks, my kingdom for callbacks.
>
> Callbacks in Cog work. The threaded VM needs work, but synchronous
> callbacks from blocking FFI calls work now. You may have to integrate
> image-level code but the VM has support and it works.
>
>
> [**] Some US slang for Stef's benefit :)
>
>
> ________________________________________
> From: pharo-project-bounces(a)lists.gforge.inria.fr<mailto:
> pharo-project-bounces(a)lists.gforge.inria.fr> [
> pharo-project-bounces(a)lists.gforge.inria.fr<mailto:
> pharo-project-bounces(a)lists.gforge.inria.fr>] on behalf of Göran Krampe [
> goran(a)krampe.se<mailto:goran@krampe.se>]
> Sent: Tuesday, January 31, 2012 3:05 AM
> To: pharo-project(a)lists.gforge.inria.fr<mailto:
> pharo-project(a)lists.gforge.inria.fr>
> Subject: Re: [Pharo-project] Cog+linux: external module not found
>
> Hi guys!
>
> On 01/09/2012 09:36 PM, Sven Van Caekenberghe wrote:
> > On 09 Jan 2012, at 20:06, Schwab,Wilhelm K wrote:
> >> I think you have the situation very much in reverse. You are flying
> off the handle, not me.
> >>
> >> Cog deserves better than to ignore feedback from motivated users.
> Motivated users deserve better than to be insulted for their efforts to
> improve it.
> >
> > Pharo, Squeak, Cog, Seaside, and most other Smalltalk software on
> SqueakSource is open source, written almost exclusively by people in their
> free time. And although most of them will try to help the users of their
> software the best they can, they cannot and should not do just anything
> unless they want to. The relation between open source authors and their
> users should be mutually productive. Using software and giving feedback if
> one thing, but it is not enough. It can't be one way all the time.
> >
> > I might be wrong, but I fail to find
> >
> > - any issues you put in the issue tracker(s)
> > - any issues you solved
> > - any open source software you published on SqueakSource or anywhere else
> > - any blog post or web pages with documentation, tutorials, .. that you
> wrote
> >
> > I hope you get the point: there are many more ways to contribute than
> what you are doing now.
> >
> > Pharo and other projects need all the help they can get, give back to
> the community, we are all using software written by others in the same
> spirit, it is only fair to honor these contributions.
> >
> > My 2c,
>
> This thread is long dead but I just wanted to mention that Wilhelm
> Schwab is a long time Squeaker and has been active in the community long
> before Pharo was even born. ;)
>
> Now, it seems to me that the "heat" in this particular thread was based
> on a misunderstanding, I know Eliot and it didn't seem to me he was
> trying to insult.
>
> General observation: Try taking it easy on the "what the heck have you
> done for us?"-talk. I have made several such similar posts too over the
> years when I got frustrated, but it might backfire if you aren't
> shooting at the "right people". We take pride in being a friendly
> community (Smalltalk at large) and I presume Pharo does too :)
>
> regards, Göran
>
>
>
>
>
> --
> best,
> Eliot
>
>
>
--
best,
Eliot
Jan. 31, 2012
Re: [Pharo-project] CogVM driver vs executable
by Schwab,Wilhelm K
Eliot,
You are correct about the name mangling, but that's a second level. With all due respect, Cog starts the search in the wrong place. I hope we can sort it out.
If the rock and the hard place keep coming after us, maybe we need in in-image (where it can be readily seen and modified) registry of names. The current approach is not working (I know you've worked hard, but more is needed).
Sounds like I need to start reading vm-dev - will do.
Bill
________________________________
From: pharo-project-bounces(a)lists.gforge.inria.fr [pharo-project-bounces(a)lists.gforge.inria.fr] on behalf of Eliot Miranda [eliot.miranda(a)gmail.com]
Sent: Tuesday, January 31, 2012 3:06 PM
To: Pharo-project(a)lists.gforge.inria.fr
Cc: Squeak Virtual Machine Development Discussion
Subject: Re: [Pharo-project] CogVM driver vs executable
On Tue, Jan 31, 2012 at 7:34 AM, Schwab,Wilhelm K <bschwab(a)anest.ufl.edu<mailto:bschwab@anest.ufl.edu>> wrote:
Sig,
Short answer: I ****think***** the answer is to look for the #moduleName as-given. Screen against absolute paths if you want; Ubuntu won't care. Ubuntu demands that libraries be registered (using sudo+dlconfig) to create a map that anyone can then read, either implicitly by loading the library or explicitly using dlconfig. It's suble, clever, and correct.
Its not that easy. Finding the correct libc first requires that one know what the libc name *is*. linux has f***ed this up over the years, e.g. with "ld scripts" where /lib/libc.so.N was a piece of text one had to parse (!!), with hacking in the thread-local-storage version of pthreads via /lib/tls and /usr/lib/tls. And now Ubuntu has put another layer in the process with /etc/ld.config. The "linux" VM is supposed to run in all of these contexts. So how does the VM/image combination map the nick-names of modules such as the C library and the OpenGL library into names that the module loading machinery can use reliably?
P.S. This discussion belongs on vm-dev...
What I do NOT know how to do is enforce that policy in the vm. I am fairly confident that I can guide you or another vm jock to a correct solution.
Bill
________________________________________
From: pharo-project-bounces(a)lists.gforge.inria.fr<mailto:pharo-project-bounces@lists.gforge.inria.fr> [pharo-project-bounces(a)lists.gforge.inria.fr<mailto:pharo-project-bounces@lists.gforge.inria.fr>] on behalf of Igor Stasenko [siguctua(a)gmail.com<mailto:siguctua@gmail.com>]
Sent: Tuesday, January 31, 2012 10:27 AM
To: Pharo-project(a)lists.gforge.inria.fr<mailto:Pharo-project@lists.gforge.inria.fr>
Subject: Re: [Pharo-project] CogVM driver vs executable
On 31 January 2012 16:10, Sven Van Caekenberghe <sven(a)beta9.be<mailto:sven@beta9.be>> wrote:
> Thx for the reply, but as I said, I don't understand this library loading, or why it has to be so complicated.
>
me neither.. so i don't even care to read this topic carefully.
i can't understand why we need such complex library lookup logic in VM
,and other "driver" mechanisms.
i already proposed to move all this logic to image side, so at least
we could have a direct control of what happening,
as well as a good error handling in case of troubles.
while at VM, there should be a simplest possible thing to stay, a
function which takes a path to library
and reports a handle to it if it loaded it or error code, why it
cannot be loaded (file not found, lib file found but cannot be
initialized etc).
> I am all for putting the maximum possible amount of control in the image.
>
> In the mean time I saw that the driver is actually just a shell script ;-) (I knew that but I guess I forgot).
>
> My main question remains: why is this necessary since it works without the scipt just as well.
>
> Sven
>
> On 31 Jan 2012, at 11:00, Schwab,Wilhelm K wrote:
>
>> Sven,
>>
>> I'm not sure what to tell you. The "can't infer" message you are experiencing ***might*** be the one time the vm is actually telling what's wrong. If so, it's PROGRESS. Doesn't feel like that in your shoes, I know....
>>
>> The bane of my existence is a silent failure (I dread those two word in that sequence...) of the vm to look in the right place. What did Nick suggest to me? strace, I think (it's in the archives). You might run under it to see if you can gain some insight; the tool in question does not pt
>>
>> DON'T LET THIS HAPPEN TO YOU<g>: the tool in question[*] logs its output to sterr(?), not stdout as one might expect. If you try it, use the -o option (I think) to direct to a file, then cat and grep are your friends. I remember "streaming" this into the archives, but I can't see them to check the facts.
>>
>> I solved my problem by noting where the vm was actually looking and making sym links to trick it (should not have to...) into working (very good). Let's all send kind thoughts to Sig - maybe he'll pull the search policy into the image, where it belongs. We will still want vm level logging (syslog etc.) in case the image can't run.
>>
>> SECURITY: Ubuntu gets it right (took me a while to realize same) by "forcing" us to use dlconfig to map names to libraries. I don't really understand it all, but I might be able to fake some useful answers if that is confusing. You might need to use dlconfig to "fix" Ubuntu, and then links to fool the vm into looking where it should.
>>
>> HTH,
>>
>> Bill
>>
>>
>> [*] short term memory disorder<g>, which is precisely why we want informative errors reaching the Smalltalk code (and?)/OR(ideal) being logged (OutputDebugString or syslog) where one can readily find it. Errors rare enough that we get time to forget between them. Pharo needs to help us a bit more - afteall, it works for us, right?
>>
>>
>>
>>
>>
>>
>> ________________________________________
>> From: pharo-project-bounces(a)lists.gforge.inria.fr<mailto:pharo-project-bounces@lists.gforge.inria.fr> [pharo-project-bounces(a)lists.gforge.inria.fr<mailto:pharo-project-bounces@lists.gforge.inria.fr>] on behalf of Sven Van Caekenberghe [sven(a)beta9.be<mailto:sven@beta9.be>]
>> Sent: Tuesday, January 31, 2012 3:30 AM
>> To: Pharo-project(a)lists.gforge.inria.fr<mailto:Pharo-project@lists.gforge.inria.fr> Development
>> Subject: [Pharo-project] CogVM driver vs executable
>>
>> In response to my posting
>>
>> http://lists.gforge.inria.fr/pipermail/pharo-project/2012-January/058790.ht…
>>
>> I got feedback from people trying to use SSL with Eliot's CogVM
>>
>> http://www.mirandabanda.org/files/Cog/VM/VM.r2522/coglinux.tgz
>>
>> instead of the Pharo one that I normally use
>>
>> http://gforge.inria.fr/frs/download.php/29042/CogVM-Unix-13307.zip
>>
>> They reported that it did not work for them.
>>
>> So I tried this myself on my Ubuntu 11.10 (GNU/Linux 3.0.0-14-virtual i686) server and yes it fails with 'can't infer base LD_LIBRARY_PATH. Aborting.' which was discussed in this list before. I am not qualified to really understand those discussions.
>>
>> But when I used the executable 'inside' coglinux/lib/squeak/4.0-2522/squeak everything worked as expected.
>>
>> So the question is what does the driver (I don't know if that is the right word) coglinux/squeak or coglinux/bin/squeak do ?
>> Since the pharo variant seems to operate fine without it, do we need the driver ?
>>
>> Sven
>>
>
>
--
Best regards,
Igor Stasenko.
--
best,
Eliot
Jan. 31, 2012
[Pharo-project] a problem with a MorphTreeMorph with headers
by Esteban Lorenzano
Hi,
I have a problem for an application I have: I'm displaying a MorphTreeMorph who has a header and some columns, problem is when morph has a horizontal scrollbar and I need to go down, last element on list is covered by horizontal scroll bar and customer can't see his data.
I need to solve this, but I don't know how, any help will be really appreciated.
(the attached image shows my problem)
thanks,
Esteban
Jan. 31, 2012
Re: [Pharo-project] CogVM driver vs executable
by Eliot Miranda
On Tue, Jan 31, 2012 at 7:34 AM, Schwab,Wilhelm K <bschwab(a)anest.ufl.edu>wrote:
> Sig,
>
> Short answer: I ****think***** the answer is to look for the #moduleName
> as-given. Screen against absolute paths if you want; Ubuntu won't care.
> Ubuntu demands that libraries be registered (using sudo+dlconfig) to
> create a map that anyone can then read, either implicitly by loading the
> library or explicitly using dlconfig. It's suble, clever, and correct.
>
Its not that easy. Finding the correct libc first requires that one know
what the libc name *is*. linux has f***ed this up over the years, e.g.
with "ld scripts" where /lib/libc.so.N was a piece of text one had to parse
(!!), with hacking in the thread-local-storage version of pthreads via
/lib/tls and /usr/lib/tls. And now Ubuntu has put another layer in the
process with /etc/ld.config. The "linux" VM is supposed to run in all of
these contexts. So how does the VM/image combination map the nick-names of
modules such as the C library and the OpenGL library into names that the
module loading machinery can use reliably?
P.S. This discussion belongs on vm-dev...
> What I do NOT know how to do is enforce that policy in the vm. I am
> fairly confident that I can guide you or another vm jock to a correct
> solution.
>
> Bill
>
>
>
> ________________________________________
> From: pharo-project-bounces(a)lists.gforge.inria.fr [
> pharo-project-bounces(a)lists.gforge.inria.fr] on behalf of Igor Stasenko [
> siguctua(a)gmail.com]
> Sent: Tuesday, January 31, 2012 10:27 AM
> To: Pharo-project(a)lists.gforge.inria.fr
> Subject: Re: [Pharo-project] CogVM driver vs executable
>
> On 31 January 2012 16:10, Sven Van Caekenberghe <sven(a)beta9.be> wrote:
> > Thx for the reply, but as I said, I don't understand this library
> loading, or why it has to be so complicated.
> >
> me neither.. so i don't even care to read this topic carefully.
> i can't understand why we need such complex library lookup logic in VM
> ,and other "driver" mechanisms.
> i already proposed to move all this logic to image side, so at least
> we could have a direct control of what happening,
> as well as a good error handling in case of troubles.
> while at VM, there should be a simplest possible thing to stay, a
> function which takes a path to library
> and reports a handle to it if it loaded it or error code, why it
> cannot be loaded (file not found, lib file found but cannot be
> initialized etc).
>
> > I am all for putting the maximum possible amount of control in the image.
> >
> > In the mean time I saw that the driver is actually just a shell script
> ;-) (I knew that but I guess I forgot).
> >
> > My main question remains: why is this necessary since it works without
> the scipt just as well.
> >
> > Sven
> >
> > On 31 Jan 2012, at 11:00, Schwab,Wilhelm K wrote:
> >
> >> Sven,
> >>
> >> I'm not sure what to tell you. The "can't infer" message you are
> experiencing ***might*** be the one time the vm is actually telling what's
> wrong. If so, it's PROGRESS. Doesn't feel like that in your shoes, I
> know....
> >>
> >> The bane of my existence is a silent failure (I dread those two word in
> that sequence...) of the vm to look in the right place. What did Nick
> suggest to me? strace, I think (it's in the archives). You might run
> under it to see if you can gain some insight; the tool in question does not
> pt
> >>
> >> DON'T LET THIS HAPPEN TO YOU<g>: the tool in question[*] logs its
> output to sterr(?), not stdout as one might expect. If you try it, use the
> -o option (I think) to direct to a file, then cat and grep are your
> friends. I remember "streaming" this into the archives, but I can't see
> them to check the facts.
> >>
> >> I solved my problem by noting where the vm was actually looking and
> making sym links to trick it (should not have to...) into working (very
> good). Let's all send kind thoughts to Sig - maybe he'll pull the search
> policy into the image, where it belongs. We will still want vm level
> logging (syslog etc.) in case the image can't run.
> >>
> >> SECURITY: Ubuntu gets it right (took me a while to realize same) by
> "forcing" us to use dlconfig to map names to libraries. I don't really
> understand it all, but I might be able to fake some useful answers if that
> is confusing. You might need to use dlconfig to "fix" Ubuntu, and then
> links to fool the vm into looking where it should.
> >>
> >> HTH,
> >>
> >> Bill
> >>
> >>
> >> [*] short term memory disorder<g>, which is precisely why we want
> informative errors reaching the Smalltalk code (and?)/OR(ideal) being
> logged (OutputDebugString or syslog) where one can readily find it. Errors
> rare enough that we get time to forget between them. Pharo needs to help
> us a bit more - afteall, it works for us, right?
> >>
> >>
> >>
> >>
> >>
> >>
> >> ________________________________________
> >> From: pharo-project-bounces(a)lists.gforge.inria.fr [
> pharo-project-bounces(a)lists.gforge.inria.fr] on behalf of Sven Van
> Caekenberghe [sven(a)beta9.be]
> >> Sent: Tuesday, January 31, 2012 3:30 AM
> >> To: Pharo-project(a)lists.gforge.inria.fr Development
> >> Subject: [Pharo-project] CogVM driver vs executable
> >>
> >> In response to my posting
> >>
> >>
> http://lists.gforge.inria.fr/pipermail/pharo-project/2012-January/058790.ht…
> >>
> >> I got feedback from people trying to use SSL with Eliot's CogVM
> >>
> >> http://www.mirandabanda.org/files/Cog/VM/VM.r2522/coglinux.tgz
> >>
> >> instead of the Pharo one that I normally use
> >>
> >> http://gforge.inria.fr/frs/download.php/29042/CogVM-Unix-13307.zip
> >>
> >> They reported that it did not work for them.
> >>
> >> So I tried this myself on my Ubuntu 11.10 (GNU/Linux 3.0.0-14-virtual
> i686) server and yes it fails with 'can't infer base LD_LIBRARY_PATH.
> Aborting.' which was discussed in this list before. I am not qualified to
> really understand those discussions.
> >>
> >> But when I used the executable 'inside'
> coglinux/lib/squeak/4.0-2522/squeak everything worked as expected.
> >>
> >> So the question is what does the driver (I don't know if that is the
> right word) coglinux/squeak or coglinux/bin/squeak do ?
> >> Since the pharo variant seems to operate fine without it, do we need
> the driver ?
> >>
> >> Sven
> >>
> >
> >
>
>
>
> --
> Best regards,
> Igor Stasenko.
>
>
>
--
best,
Eliot
Jan. 31, 2012
Re: [Pharo-project] Cog+linux: external module not found
by Schwab,Wilhelm K
Eliot,
Interesting news... On Linux? Is there a good place to hunt for examples?
Bill
________________________________________
From: pharo-project-bounces(a)lists.gforge.inria.fr [pharo-project-bounces(a)lists.gforge.inria.fr] on behalf of Eliot Miranda [eliot.miranda(a)gmail.com]
Sent: Tuesday, January 31, 2012 2:41 PM
To: Pharo-project(a)lists.gforge.inria.fr
Subject: Re: [Pharo-project] Cog+linux: external module not found
On Tue, Jan 31, 2012 at 12:36 AM, Schwab,Wilhelm K <bschwab(a)anest.ufl.edu<mailto:bschwab@anest.ufl.edu>> wrote:
Göran,
Thanks for what you do, and for noticing what I (at least try) to contribute. Some other "tangible" items in my queue *will* be worth the wait[*]. I sincerely hope you are correct about a misunderstanding being at the base of thread.
Hopefully, we can all dust ourselves off [**] and make FFI robust everywhere.
Best regards,
Bill
[*] I know I've said this for essentially Pharo's entire life cycle, but it's true... Callbacks, my kingdom for callbacks.
Callbacks in Cog work. The threaded VM needs work, but synchronous callbacks from blocking FFI calls work now. You may have to integrate image-level code but the VM has support and it works.
[**] Some US slang for Stef's benefit :)
________________________________________
From: pharo-project-bounces(a)lists.gforge.inria.fr<mailto:pharo-project-bounces@lists.gforge.inria.fr> [pharo-project-bounces(a)lists.gforge.inria.fr<mailto:pharo-project-bounces@lists.gforge.inria.fr>] on behalf of Göran Krampe [goran(a)krampe.se<mailto:goran@krampe.se>]
Sent: Tuesday, January 31, 2012 3:05 AM
To: pharo-project(a)lists.gforge.inria.fr<mailto:pharo-project@lists.gforge.inria.fr>
Subject: Re: [Pharo-project] Cog+linux: external module not found
Hi guys!
On 01/09/2012 09:36 PM, Sven Van Caekenberghe wrote:
> On 09 Jan 2012, at 20:06, Schwab,Wilhelm K wrote:
>> I think you have the situation very much in reverse. You are flying off the handle, not me.
>>
>> Cog deserves better than to ignore feedback from motivated users. Motivated users deserve better than to be insulted for their efforts to improve it.
>
> Pharo, Squeak, Cog, Seaside, and most other Smalltalk software on SqueakSource is open source, written almost exclusively by people in their free time. And although most of them will try to help the users of their software the best they can, they cannot and should not do just anything unless they want to. The relation between open source authors and their users should be mutually productive. Using software and giving feedback if one thing, but it is not enough. It can't be one way all the time.
>
> I might be wrong, but I fail to find
>
> - any issues you put in the issue tracker(s)
> - any issues you solved
> - any open source software you published on SqueakSource or anywhere else
> - any blog post or web pages with documentation, tutorials, .. that you wrote
>
> I hope you get the point: there are many more ways to contribute than what you are doing now.
>
> Pharo and other projects need all the help they can get, give back to the community, we are all using software written by others in the same spirit, it is only fair to honor these contributions.
>
> My 2c,
This thread is long dead but I just wanted to mention that Wilhelm
Schwab is a long time Squeaker and has been active in the community long
before Pharo was even born. ;)
Now, it seems to me that the "heat" in this particular thread was based
on a misunderstanding, I know Eliot and it didn't seem to me he was
trying to insult.
General observation: Try taking it easy on the "what the heck have you
done for us?"-talk. I have made several such similar posts too over the
years when I got frustrated, but it might backfire if you aren't
shooting at the "right people". We take pride in being a friendly
community (Smalltalk at large) and I presume Pharo does too :)
regards, Göran
--
best,
Eliot
Jan. 31, 2012