From commits at source.squeak.org Thu Oct 1 00:42:25 2020 From: commits at source.squeak.org (commits at source.squeak.org) Date: Thu, 1 Oct 2020 00:42:25 0000 Subject: [squeak-dev] The Inbox: Morphic-ct.1690.mcz Message-ID: A new version of Morphic was added to project The Inbox: http://source.squeak.org/inbox/Morphic-ct.1690.mcz ==================== Summary ==================== Name: Morphic-ct.1690 Author: ct Time: 1 October 2020, 2:42:17.443188 am UUID: 58a1128e-5547-4236-bc03-0c1f1366bb7b Ancestors: Morphic-eem.1686 Fixes display invalidation in PluggableListMorph when displayed during updating the list contents. To avoid recursive #getList sends, since Morphic-mt.1576, the list variable has been cleaned up before sending #getFullList/#getFilteredList. However, in some cases the list morph is redrawn while the #getList operation is being performed, for example if the model code shows a system progress bar (e.g. when loading/refreshing code in Monticello). In the past, this led to drawing artifacts during the list update. To avoid these artifacts, this version implements the list update as an atomic operation by storing the previous list contents in the variable previousStableList while recomputing the list. In addition, if #getList is curtailed, the previous list contents are restored (which is especially helpful during debugging). =============== Diff against Morphic-eem.1686 =============== Item was changed: ScrollPane subclass: #PluggableListMorph + instanceVariableNames: 'list fullList modelToView viewToModel getListSelector getListSizeSelector getListElementSelector getIndexSelector setIndexSelector keystrokeActionSelector autoDeselect lastKeystrokeTime lastKeystrokes lastClickTime doubleClickSelector handlesBasicKeys potentialDropRow hoverRow listMorph keystrokePreviewSelector priorSelection getIconSelector getHelpSelector previousStableList' - instanceVariableNames: 'list fullList modelToView viewToModel getListSelector getListSizeSelector getListElementSelector getIndexSelector setIndexSelector keystrokeActionSelector autoDeselect lastKeystrokeTime lastKeystrokes lastClickTime doubleClickSelector handlesBasicKeys potentialDropRow hoverRow listMorph keystrokePreviewSelector priorSelection getIconSelector getHelpSelector' classVariableNames: 'ClearFilterAutomatically ClearFilterDelay FilterableLists FlashOnErrors HighlightHoveredRow HighlightPreSelection MenuRequestUpdatesSelection' poolDictionaries: '' category: 'Morphic-Pluggable Widgets'! !PluggableListMorph commentStamp: 'mt 10/12/2019 11:04' prior: 0! I am a list widget that uses the change/update mechanism to display model data as a vertical arrangement of (maybe formatted) strings and icons in a scroll pane. When I am in keyboard focus, type in a letter (or several letters quickly) to go to the next item that begins with that letter. If you enabled the "filterable lists" preference, I will hide all items that do not match the filter. Special keys (arrow up/down, page up/down, home, end) are also supported.! Item was changed: ----- Method: PluggableListMorph>>getList (in category 'model access - cached') ----- getList + "Answer the (maybe filtered) list to be displayed. Cached result, see #updateList. If the list needs to be updated, do this atomically." + + list = #locked ifTrue: [ + "The list is already being updated at the moment but needs to be accessed again during the update. To avoid recursion, the update is implemented as an atomic operation. This can happen, for example, when the model fetches data that opens the system progress bar which then will redraw periodically." + ^ previousStableList ifNil: #()]. - "Answer the (maybe filtered) list to be displayed. Cached result, see #updateList." - ^ list ifNil: [ + list := #locked. - list := #(). "To make this call safe when re-entering it while fetching the list. This can happen, for example, when the model fetches data that opens the system progress bar which then will redraw periodically." list := self filterableList ifTrue: [self getFilteredList] ifFalse: [self getFullList]. self updateListMorph. list]! Item was changed: ----- Method: PluggableListMorph>>updateListFilter (in category 'updating') ----- updateListFilter | selection | selection := self selectionIndex = 0 "Avoid fetching #getList here." ifTrue: [nil] ifFalse: [self selection]. + previousStableList := list. + [list := nil. - list := nil. modelToView := Dictionary new. viewToModel := Dictionary new. + self getList] ensure: [ + list ifNil: [list := previousStableList]. + previousStableList := nil]. - self getList. "Try to restore the last selection." selection ifNotNil: [self selection: selection].! From Christoph.Thiede at student.hpi.uni-potsdam.de Thu Oct 1 00:43:21 2020 From: Christoph.Thiede at student.hpi.uni-potsdam.de (Thiede, Christoph) Date: Thu, 1 Oct 2020 00:43:21 +0000 Subject: [squeak-dev] The Inbox: Morphic-ct.1690.mcz In-Reply-To: References: Message-ID: <6f782f4088f5421c914bfb627334085d@student.hpi.uni-potsdam.de> This one! :-) [cid:866f05d5-bf15-4587-9240-d289a7373049] Best, Christoph ________________________________ Von: Squeak-dev im Auftrag von commits at source.squeak.org Gesendet: Donnerstag, 1. Oktober 2020 02:42:25 An: squeak-dev at lists.squeakfoundation.org Betreff: [squeak-dev] The Inbox: Morphic-ct.1690.mcz A new version of Morphic was added to project The Inbox: http://source.squeak.org/inbox/Morphic-ct.1690.mcz ==================== Summary ==================== Name: Morphic-ct.1690 Author: ct Time: 1 October 2020, 2:42:17.443188 am UUID: 58a1128e-5547-4236-bc03-0c1f1366bb7b Ancestors: Morphic-eem.1686 Fixes display invalidation in PluggableListMorph when displayed during updating the list contents. To avoid recursive #getList sends, since Morphic-mt.1576, the list variable has been cleaned up before sending #getFullList/#getFilteredList. However, in some cases the list morph is redrawn while the #getList operation is being performed, for example if the model code shows a system progress bar (e.g. when loading/refreshing code in Monticello). In the past, this led to drawing artifacts during the list update. To avoid these artifacts, this version implements the list update as an atomic operation by storing the previous list contents in the variable previousStableList while recomputing the list. In addition, if #getList is curtailed, the previous list contents are restored (which is especially helpful during debugging). =============== Diff against Morphic-eem.1686 =============== Item was changed: ScrollPane subclass: #PluggableListMorph + instanceVariableNames: 'list fullList modelToView viewToModel getListSelector getListSizeSelector getListElementSelector getIndexSelector setIndexSelector keystrokeActionSelector autoDeselect lastKeystrokeTime lastKeystrokes lastClickTime doubleClickSelector handlesBasicKeys potentialDropRow hoverRow listMorph keystrokePreviewSelector priorSelection getIconSelector getHelpSelector previousStableList' - instanceVariableNames: 'list fullList modelToView viewToModel getListSelector getListSizeSelector getListElementSelector getIndexSelector setIndexSelector keystrokeActionSelector autoDeselect lastKeystrokeTime lastKeystrokes lastClickTime doubleClickSelector handlesBasicKeys potentialDropRow hoverRow listMorph keystrokePreviewSelector priorSelection getIconSelector getHelpSelector' classVariableNames: 'ClearFilterAutomatically ClearFilterDelay FilterableLists FlashOnErrors HighlightHoveredRow HighlightPreSelection MenuRequestUpdatesSelection' poolDictionaries: '' category: 'Morphic-Pluggable Widgets'! !PluggableListMorph commentStamp: 'mt 10/12/2019 11:04' prior: 0! I am a list widget that uses the change/update mechanism to display model data as a vertical arrangement of (maybe formatted) strings and icons in a scroll pane. When I am in keyboard focus, type in a letter (or several letters quickly) to go to the next item that begins with that letter. If you enabled the "filterable lists" preference, I will hide all items that do not match the filter. Special keys (arrow up/down, page up/down, home, end) are also supported.! Item was changed: ----- Method: PluggableListMorph>>getList (in category 'model access - cached') ----- getList + "Answer the (maybe filtered) list to be displayed. Cached result, see #updateList. If the list needs to be updated, do this atomically." + + list = #locked ifTrue: [ + "The list is already being updated at the moment but needs to be accessed again during the update. To avoid recursion, the update is implemented as an atomic operation. This can happen, for example, when the model fetches data that opens the system progress bar which then will redraw periodically." + ^ previousStableList ifNil: #()]. - "Answer the (maybe filtered) list to be displayed. Cached result, see #updateList." - ^ list ifNil: [ + list := #locked. - list := #(). "To make this call safe when re-entering it while fetching the list. This can happen, for example, when the model fetches data that opens the system progress bar which then will redraw periodically." list := self filterableList ifTrue: [self getFilteredList] ifFalse: [self getFullList]. self updateListMorph. list]! Item was changed: ----- Method: PluggableListMorph>>updateListFilter (in category 'updating') ----- updateListFilter | selection | selection := self selectionIndex = 0 "Avoid fetching #getList here." ifTrue: [nil] ifFalse: [self selection]. + previousStableList := list. + [list := nil. - list := nil. modelToView := Dictionary new. viewToModel := Dictionary new. + self getList] ensure: [ + list ifNil: [list := previousStableList]. + previousStableList := nil]. - self getList. "Try to restore the last selection." selection ifNotNil: [self selection: selection].! -------------- next part -------------- An HTML attachment was scrubbed... URL: -------------- next part -------------- A non-text attachment was scrubbed... Name: pastedImage.png Type: image/png Size: 99411 bytes Desc: pastedImage.png URL: From commits at source.squeak.org Thu Oct 1 00:50:18 2020 From: commits at source.squeak.org (commits at source.squeak.org) Date: Thu, 1 Oct 2020 00:50:18 0000 Subject: [squeak-dev] The Inbox: Morphic-ct.1691.mcz Message-ID: Christoph Thiede uploaded a new version of Morphic to project The Inbox: http://source.squeak.org/inbox/Morphic-ct.1691.mcz ==================== Summary ==================== Name: Morphic-ct.1691 Author: ct Time: 1 October 2020, 2:50:08.612807 am UUID: f9f5e618-2e8a-3f4b-a1f8-1c9aca2b5f01 Ancestors: Morphic-eem.1686 Fixes alpha selection strip in HSVA color selector, which has always lived one click back in past. =============== Diff against Morphic-eem.1686 =============== Item was changed: ----- Method: HSVAColorSelectorMorph>>alphaSelected: (in category 'accessing') ----- alphaSelected: aFloat "The alpha has changed." + self aMorph value: aFloat. self triggerSelectedColor! From commits at source.squeak.org Thu Oct 1 01:27:28 2020 From: commits at source.squeak.org (commits at source.squeak.org) Date: Thu, 1 Oct 2020 01:27:28 0000 Subject: [squeak-dev] The Inbox: Morphic-ct.1692.mcz Message-ID: Christoph Thiede uploaded a new version of Morphic to project The Inbox: http://source.squeak.org/inbox/Morphic-ct.1692.mcz ==================== Summary ==================== Name: Morphic-ct.1692 Author: ct Time: 1 October 2020, 3:27:15.197807 am UUID: 80889aa8-2990-634d-b8f0-b73c6b7f3a02 Ancestors: Morphic-eem.1686 Second version of NewColorPickerMorph rework. Replaces Morphic-ct.1634 which can be moved to the treated inbox. Changelog: - Add pick button to NewColorPickerMorph that allows to pick a color from the Display. With this enhancement, NCPM is finally superior to the old ColorPickerMorph and could now replace the latter by the default preferences. - The color picker keeps live and non-modal; if the picking button is pressed, you can modally choose a color from anywhere on the screen. Press escape, yellow button, or click into the color picker morph to revert to cancel the color picking. - Make the color picker hi-dpi-sensitive. - Remove the pixel-costly 'Current selection:' label (it still survives in the balloon text of the color presenter). - Enable Shout styling in the color expression pane. Thanks for all your feedback on my first attempt! For the full discussion, see http://forum.world.st/The-Inbox-Morphic-ct-1634-mcz-td5112623.html. =============== Diff against Morphic-eem.1686 =============== Item was changed: Morph subclass: #NewColorPickerMorph + instanceVariableNames: 'target setColorSelector hsvaMorph colorPresenter isPicking' - instanceVariableNames: 'target setColorSelector hsvaMorph colorPresenter' classVariableNames: 'UseIt' poolDictionaries: '' category: 'Morphic-Widgets'! !NewColorPickerMorph commentStamp: 'cmm 12/3/2010 13:36' prior: 0! A NewColorPickerMorph is a new widget for choosing colors in Morphic. Instantiate a NewColorPickerMorph: (NewColorPickerMorph on: objectToHaveItsColorSet getColorSelector: itsColorGetterSymbol setColorSelector: itsColorSetterSymbol) openInWorld ! Item was added: + ----- Method: NewColorPickerMorph>>aboutToStyle:requestor: (in category 'styling') ----- + aboutToStyle: styler requestor: requestor + + ^ true! Item was changed: + ----- Method: NewColorPickerMorph>>closeButtonLabel (in category 'accessing - labels') ----- - ----- Method: NewColorPickerMorph>>closeButtonLabel (in category 'initialize-release') ----- closeButtonLabel ^ 'Close' translated! Item was added: + ----- Method: NewColorPickerMorph>>colorPresenterLabel (in category 'accessing - labels') ----- + colorPresenterLabel + + ^ 'Current selection' translated! Item was changed: ----- Method: NewColorPickerMorph>>initialize (in category 'initialize-release') ----- initialize + super initialize. + isPicking := false. + self initializeHsvaMorph.! - self initializeHsvaMorph! Item was added: + ----- Method: NewColorPickerMorph>>isPicking (in category 'accessing') ----- + isPicking + + ^ isPicking! Item was added: + ----- Method: NewColorPickerMorph>>isPicking: (in category 'picking') ----- + isPicking: aBoolean + + isPicking := aBoolean. + self changed: #isPicking. + aBoolean ifTrue: [self pickColor].! Item was changed: ----- Method: NewColorPickerMorph>>newBottomRow (in category 'initialize-release') ----- newBottomRow + ^ Morph new + color: Color transparent; + changeTableLayout; + listDirection: #leftToRight; + hResizing: #spaceFill; vResizing: #shrinkWrap; + height: Preferences standardButtonFont height * 1.5; + cellGap: 4; + addMorphBack: self newPickButton; + addMorphBack: self newColorPresenterMorph; + addMorphBack: self newCloseButton; + yourself! - color: Color transparent ; - changeTableLayout ; - listDirection: #leftToRight ; - hResizing: #spaceFill; vResizing: #shrinkWrap ; - height: 20 ; - cellGap: 4 ; - addMorph: (StringMorph contents: 'Current selection:' translated) ; - addMorphBack: self newColorPresenterMorph ; - addMorphBack: self newCloseButton! Item was changed: ----- Method: NewColorPickerMorph>>newCloseButton (in category 'initialize-release') ----- newCloseButton + ^ (PluggableButtonMorph on: self getState: nil action: #delete label: #closeButtonLabel) + vResizing: #spaceFill; + hResizing: #spaceFill; + yourself! - vResizing: #spaceFill ; - hResizing: #spaceFill; - yourself! Item was changed: ----- Method: NewColorPickerMorph>>newColorExpressionMorph (in category 'initialize-release') ----- newColorExpressionMorph + | inputField builder | builder := ToolBuilder default. + inputField := builder build: (builder pluggableInputFieldSpec new - inputField := (builder build: (builder pluggableInputFieldSpec new model: self; getText: #colorExpression; + setText: #colorExpression:). - setText: #colorExpression:)). inputField + hResizing: #spaceFill; + vResizing: #rigid; + height: Preferences standardButtonFont height * 1.5; + useDefaultStyler. + self changed: #colorExpression. "Necessary to trigger the styler" - hResizing: #spaceFill ; - vResizing: #rigid ; - height: (Preferences standardDefaultTextFont height * 3/2). ^ inputField! Item was changed: ----- Method: NewColorPickerMorph>>newColorPresenterMorph (in category 'initialize-release') ----- newColorPresenterMorph + ^ (ColorPresenterMorph on: hsvaMorph color: #selectedColor) + vResizing: #spaceFill; + hResizing: #spaceFill; + balloonText: self colorPresenterLabel; + yourself! - vResizing: #rigid ; height: 20 ; - hResizing: #spaceFill ; - yourself! Item was added: + ----- Method: NewColorPickerMorph>>newPickButton (in category 'initialize-release') ----- + newPickButton + + ^ (PluggableButtonMorph + on: self + getState: #isPicking + action: #togglePicking + label: #pickingButtonLabel) + vResizing: #spaceFill; + hResizing: #spaceFill; + yourself! Item was added: + ----- Method: NewColorPickerMorph>>pickColor (in category 'picking') ----- + pickColor + + | selectedColor | + [ + | previousColor | + previousColor := self selectedColor. + selectedColor := self pickColorFromDisplay. + selectedColor ifNil: [^ self selectedColor: previousColor]. + ] ensure: [ + self isPicking: false]. + self selectedColor: selectedColor.! Item was added: + ----- Method: NewColorPickerMorph>>pickColorFromDisplay (in category 'picking') ----- + pickColorFromDisplay + + Cursor target showWhile: [ + | previousColor | + previousColor := self selectedColor. + [Sensor anyButtonPressed] + whileTrue; + whileFalse: [ + | frontMorph | + Sensor peekKeyboard = Character escape ifTrue: [ + ^ nil]. + frontMorph := (self currentWorld morphsAt: Sensor cursorPoint) at: 1 ifAbsent: [nil]. + self selectedColor: ((frontMorph isNil or: [(frontMorph == self or: [frontMorph hasOwner: self]) not]) + ifTrue: [Display colorAt: Sensor cursorPoint] + ifFalse: [previousColor]). + self world runStepMethods; displayWorldSafely]]. + Sensor yellowButtonPressed + ifTrue: [^ nil]. + ^ self selectedColor! Item was added: + ----- Method: NewColorPickerMorph>>pickingButtonLabel (in category 'accessing - labels') ----- + pickingButtonLabel + + ^ 'Picking' translated! Item was changed: ----- Method: NewColorPickerMorph>>setup (in category 'initialize-release') ----- setup + self + color: Color white darker; + cornerStyle: #rounded; + changeTableLayout; + hResizing: #shrinkWrap; + vResizing: #shrinkWrap; + extent: (240 @ 240) * RealEstateAgent scaleFactor; + addMorphBack: hsvaMorph; + addMorphBack: self newColorExpressionMorph; + addMorphBack: self newBottomRow; + layoutInset: 4; + cellGap: 2. + + Preferences menuAppearance3d + ifTrue: [self addDropShadow].! - color: (Color white darker) ; - cornerStyle: #rounded ; - changeTableLayout ; - hResizing: #shrinkWrap ; - vResizing: #shrinkWrap ; - extent: 240 at 240 ; - addMorphBack: hsvaMorph ; - addMorphBack: self newColorExpressionMorph ; - addMorphBack: self newBottomRow ; - layoutInset: 4 ; - cellGap: 2. - - Preferences menuAppearance3d - ifTrue: [self addDropShadow]. - ! Item was changed: ----- Method: NewColorPickerMorph>>setupForProperties (in category 'initialize-release') ----- setupForProperties + self + color: Color white darker; + changeTableLayout; + hResizing: #shrinkWrap; + vResizing: #shrinkWrap; + extent: 240 at 240; + addMorphBack: hsvaMorph; + layoutInset: 4; + cellGap: 2.! - color: (Color white darker) ; - changeTableLayout ; - hResizing: #shrinkWrap ; - vResizing: #shrinkWrap ; - extent: 240 at 240 ; - addMorphBack: hsvaMorph ; - layoutInset: 4 ; - cellGap: 2.! Item was added: + ----- Method: NewColorPickerMorph>>togglePicking (in category 'picking') ----- + togglePicking + self isPicking: self isPicking not! From lecteur at zogotounga.net Thu Oct 1 08:51:17 2020 From: lecteur at zogotounga.net (=?UTF-8?Q?St=c3=a9phane_Rollandin?=) Date: Thu, 1 Oct 2020 10:51:17 +0200 Subject: [squeak-dev] The Inbox: Graphics-ct.441.mcz In-Reply-To: References: Message-ID: <1c939280-8685-4c3d-0f8a-f1c2287dc2fa@zogotounga.net> > Proposal: Isolate alpha channel when printing a named color. This allows it to reuse the color name even for translucent color. > > Example: > (Color red alpha: 0.4) printString > Output (new): > 'Color red alpha: 0.4' > Output (old): > '(TranslucentColor r: 1 g: 0.0 b: 0.0 alpha: 0.4)' +1 Stef From gettimothy at zoho.com Thu Oct 1 09:32:52 2020 From: gettimothy at zoho.com (gettimothy) Date: Thu, 01 Oct 2020 05:32:52 -0400 Subject: [squeak-dev] "Pretty Print" collections as abstract syntax trees using plain text output Message-ID: <174e381dcff.eeb497c783798.6677692293294794906@zoho.com> Hi folks. Has anybody coded a way , using plain text, to output a  https://en.wikipedia.org/wiki/Abstract_syntax_tree to a workspace? It would be a handy debug tool if so. thx -------------- next part -------------- An HTML attachment was scrubbed... URL: From marcel.taeumel at hpi.de Thu Oct 1 10:55:16 2020 From: marcel.taeumel at hpi.de (Marcel Taeumel) Date: Thu, 1 Oct 2020 12:55:16 +0200 Subject: [squeak-dev] The Inbox: Graphics-ct.441.mcz In-Reply-To: <1c939280-8685-4c3d-0f8a-f1c2287dc2fa@zogotounga.net> References: <1c939280-8685-4c3d-0f8a-f1c2287dc2fa@zogotounga.net> Message-ID: Nice. Given that #storeOn: is used, we should take care to always wrap the result in parentheses. -> '(Color red alpha: 0.4)' Best, Marcel Am 01.10.2020 10:51:29 schrieb Stéphane Rollandin : > Proposal: Isolate alpha channel when printing a named color. This allows it to reuse the color name even for translucent color. > > Example: > (Color red alpha: 0.4) printString > Output (new): > 'Color red alpha: 0.4' > Output (old): > '(TranslucentColor r: 1 g: 0.0 b: 0.0 alpha: 0.4)' +1 Stef -------------- next part -------------- An HTML attachment was scrubbed... URL: From Christoph.Thiede at student.hpi.uni-potsdam.de Thu Oct 1 11:56:46 2020 From: Christoph.Thiede at student.hpi.uni-potsdam.de (Thiede, Christoph) Date: Thu, 1 Oct 2020 11:56:46 +0000 Subject: [squeak-dev] The Trunk: Tools-mt.990.mcz In-Reply-To: References: Message-ID: <33cfc4d5734a4e60889777cffcee8713@student.hpi.uni-potsdam.de> Hi Marcel, just a basic question - why do we disable stepping in Debuggers? :-) Best, Christoph ________________________________ Von: Squeak-dev im Auftrag von commits at source.squeak.org Gesendet: Dienstag, 29. September 2020 10:20:36 An: squeak-dev at lists.squeakfoundation.org; packages at lists.squeakfoundation.org Betreff: [squeak-dev] The Trunk: Tools-mt.990.mcz Marcel Taeumel uploaded a new version of Tools to project The Trunk: http://source.squeak.org/trunk/Tools-mt.990.mcz ==================== Summary ==================== Name: Tools-mt.990 Author: mt Time: 29 September 2020, 10:20:33.276444 am UUID: e7da396b-a8ec-7a44-8f15-5ba7d0d30b37 Ancestors: Tools-mt.989 In debuggers, forward model-wake-up call to update inspectors. This fixes the bug where a 'nil' receiver had no fields in the receiver inspector. For example, try debug-it on any expression in the workspace to trigger that bug. Note that the underlying challenge is that the inspectors in debuggers are not stepping. Field updates are triggered manually via #updateInspectors. An inspector's initial object is 'nil'. So, "changing" that to 'nil' will not update the field list in inspectors bc. it is considered redundant and will be ignored there. While stepping is not required to produce the initial field list, the model-wake-up call will usually trigger that initial update in a stand-alone inspector. That's why I think that it is not necessary to change anything in the inspector code but only here in the debugger. =============== Diff against Tools-mt.989 =============== Item was added: + ----- Method: Debugger>>modelWakeUpIn: (in category 'user interface') ----- + modelWakeUpIn: aWindow + + super modelWakeUpIn: aWindow. + self updateInspectors.! -------------- next part -------------- An HTML attachment was scrubbed... URL: From marcel.taeumel at hpi.de Thu Oct 1 11:58:32 2020 From: marcel.taeumel at hpi.de (Marcel Taeumel) Date: Thu, 1 Oct 2020 13:58:32 +0200 Subject: [squeak-dev] The Trunk: Tools-mt.990.mcz In-Reply-To: <33cfc4d5734a4e60889777cffcee8713@student.hpi.uni-potsdam.de> References: <33cfc4d5734a4e60889777cffcee8713@student.hpi.uni-potsdam.de> Message-ID: Hi Christoph, it has "always" been that way.. I suppose that its (a) for performance reasonse and (b) you are "stopping time" when debugging anyway. :-) Best, Marcel Am 01.10.2020 13:56:55 schrieb Thiede, Christoph : Hi Marcel, just a basic question - why do we disable stepping in Debuggers? :-) Best, Christoph [http://www.hpi.de/] Von: Squeak-dev im Auftrag von commits at source.squeak.org Gesendet: Dienstag, 29. September 2020 10:20:36 An: squeak-dev at lists.squeakfoundation.org; packages at lists.squeakfoundation.org Betreff: [squeak-dev] The Trunk: Tools-mt.990.mcz   Marcel Taeumel uploaded a new version of Tools to project The Trunk: http://source.squeak.org/trunk/Tools-mt.990.mcz [http://source.squeak.org/trunk/Tools-mt.990.mcz] ==================== Summary ==================== Name: Tools-mt.990 Author: mt Time: 29 September 2020, 10:20:33.276444 am UUID: e7da396b-a8ec-7a44-8f15-5ba7d0d30b37 Ancestors: Tools-mt.989 In debuggers, forward model-wake-up call to update inspectors. This fixes the bug where a 'nil' receiver had no fields in the receiver inspector. For example, try debug-it on any expression in the workspace to trigger that bug. Note that the underlying challenge is that the inspectors in debuggers are not stepping. Field updates are triggered manually via #updateInspectors. An inspector's initial object is 'nil'. So, "changing" that to 'nil' will not update the field list in inspectors bc. it is considered redundant and will be ignored there. While stepping is not required to produce the initial field list, the model-wake-up call will usually trigger that initial update in a stand-alone inspector. That's why I think that it is not necessary to change anything in the inspector code but only here in the debugger. =============== Diff against Tools-mt.989 =============== Item was added: + ----- Method: Debugger>>modelWakeUpIn: (in category 'user interface') ----- + modelWakeUpIn: aWindow + +        super modelWakeUpIn: aWindow. +        self updateInspectors.! -------------- next part -------------- An HTML attachment was scrubbed... URL: From marcel.taeumel at hpi.de Thu Oct 1 12:04:06 2020 From: marcel.taeumel at hpi.de (Marcel Taeumel) Date: Thu, 1 Oct 2020 14:04:06 +0200 Subject: [squeak-dev] The Inbox: Tools-ct.991.mcz In-Reply-To: References: Message-ID: Hi Christoph, that's funny. You already did that with Tools-ct.957. :-) I will move both 956 and 957 to treated. Best, Marcel Am 30.09.2020 19:46:56 schrieb commits at source.squeak.org : Christoph Thiede uploaded a new version of Tools to project The Inbox: http://source.squeak.org/inbox/Tools-ct.991.mcz ==================== Summary ==================== Name: Tools-ct.991 Author: ct Time: 30 September 2020, 7:46:39.949807 pm UUID: 4d2f75ef-336d-cc4c-aa0d-dd4f7ff99fc7 Ancestors: Tools-mt.990 Fixes a bug in DebuggerMethodMap's rangeForPC lookup Steps to reproduce: c := Object newSubclass. c compile: 'foo: foo foo = #foo ifTrue: [^ true]. ^ (foo ifNil: [^ false]) = #bar'. c new foo: #bar. "Debug it. Step into #foo:, step over #=. Before this commit, the selection was '^ true'" The error was that #findNearbyBinaryIndex: uses to return the lower possible index if there is no exact match. For debugging, we cannot need this behavior, because we want to select the next operation to be executed. Furthermore, this commit refactors some duplication with DebuggerMethodMapForFullBlockCompiledMethod. Please review! Uploaded again due to totally broken ancestry. Replaces Tools-ct.956, which can be moved into the treated inbox. =============== Diff against Tools-mt.990 =============== Item was changed: ----- Method: DebuggerMethodMap>>rangeForPC:in:contextIsActiveContext: (in category 'source mapping') ----- rangeForPC: contextsConcretePC in: method contextIsActiveContext: contextIsActiveContext + "Answer the indices in the source code for the supplied pc. If the context is the active context (is at the hot end of the stack) then its pc is the current pc. But if the context isn't, because it is suspended sending a message, then its current pc is the previous pc." - "Answer the indices in the source code for the supplied pc. - If the context is the actve context (is at the hot end of the stack) - then its pc is the current pc. But if the context isn't, because it is - suspended sending a message, then its current pc is the previous pc." + | pc i end sortedMap | - | pc i end | pc := method abstractPCForConcretePC: (contextIsActiveContext + ifTrue: [contextsConcretePC] + ifFalse: [(method pcPreviousTo: contextsConcretePC) + ifNil: [contextsConcretePC]]). + (self abstractSourceMapForMethod: method) + at: pc + ifPresent: [:range | ^ range]. + sortedMap := self sortedSourceMapForMethod: method. + sortedMap ifEmpty: [^ 1 to: 0]. + i := sortedMap + findBinaryIndex: [:assoc | pc - assoc key] + ifNone: [:lower :upper | upper]. + i + i > sortedMap size ifTrue: [ + end := sortedMap inject: 0 into: [:prev :this | + prev max: this value last]. + ^ end + 1 to: end]. + ^ (sortedMap at: i) value! - ifTrue: [contextsConcretePC] - ifFalse: [(method pcPreviousTo: contextsConcretePC) - ifNotNil: [:prevpc| prevpc] - ifNil: [contextsConcretePC]]). - (self abstractSourceMap includesKey: pc) ifTrue: - [^self abstractSourceMap at: pc]. - sortedSourceMap ifNil: - [sortedSourceMap := self abstractSourceMap associations - replace: [ :each | each copy ]; - sort]. - sortedSourceMap isEmpty ifTrue: [^1 to: 0]. - i := sortedSourceMap findNearbyBinaryIndex: [:assoc| pc - assoc key]. - i - i > sortedSourceMap size ifTrue: - [end := sortedSourceMap inject: 0 into: - [:prev :this | prev max: this value last]. - ^end+1 to: end]. - ^(sortedSourceMap at: i) value - - "| method source scanner map | - method := DebuggerMethodMap compiledMethodAt: #rangeForPC:in:contextIsActiveContext:. - source := method getSourceFromFile asString. - scanner := InstructionStream on: method. - map := method debuggerMap. - Array streamContents: - [:ranges| - [scanner atEnd] whileFalse: - [| range | - range := map rangeForPC: scanner pc in: method contextIsActiveContext: true. - ((map abstractSourceMap includesKey: scanner abstractPC) - and: [range first ~= 0]) ifTrue: - [ranges nextPut: (source copyFrom: range first to: range last)]. - scanner interpretNextInstructionFor: InstructionClient new]]"! Item was added: + ----- Method: DebuggerMethodMap>>sortedSourceMap (in category 'private') ----- + sortedSourceMap + + ^ sortedSourceMap ifNil: [ + sortedSourceMap := self abstractSourceMap associations + replace: [:each | each copy]; + sort]! Item was added: + ----- Method: DebuggerMethodMap>>sortedSourceMapForMethod: (in category 'source mapping') ----- + sortedSourceMapForMethod: aCompiledMethod + + ^ self sortedSourceMap! Item was changed: ----- Method: DebuggerMethodMapForFullBlockCompiledMethods>>abstractSourceMap (in category 'source mapping') ----- abstractSourceMap + + ^ self shouldNotImplement! - self shouldNotImplement! Item was removed: - ----- Method: DebuggerMethodMapForFullBlockCompiledMethods>>rangeForPC:in:contextIsActiveContext: (in category 'source mapping') ----- - rangeForPC: contextsConcretePC in: method contextIsActiveContext: contextIsActiveContext - "Answer the indices in the source code for the supplied pc. - If the context is the actve context (is at the hot end of the stack) - then its pc is the current pc. But if the context isn't, because it is - suspended sending a message, then its current pc is the previous pc." - - | pc i end mapForMethod sortedMap | - pc := method abstractPCForConcretePC: (contextIsActiveContext - ifTrue: [contextsConcretePC] - ifFalse: [(method pcPreviousTo: contextsConcretePC) - ifNotNil: [:prevpc| prevpc] - ifNil: [contextsConcretePC]]). - ((mapForMethod := self abstractSourceMapForMethod: method) includesKey: pc) ifTrue: - [^mapForMethod at: pc]. - sortedSourceMap ifNil: - [sortedSourceMap := IdentityDictionary new]. - sortedMap := sortedSourceMap - at: method - ifAbsentPut: [mapForMethod associations - replace: [ :each | each copy ]; - sort]. - sortedMap isEmpty ifTrue: [^1 to: 0]. - i := sortedMap findNearbyBinaryIndex: [:assoc| pc - assoc key]. - i - i > sortedMap size ifTrue: - [end := sortedMap inject: 0 into: - [:prev :this | prev max: this value last]. - ^end+1 to: end]. - ^(sortedMap at: i) value - - "| method source scanner map | - method := DebuggerMethodMapForFullBlockCompiledMethods compiledMethodAt: #rangeForPC:in:contextIsActiveContext:. - source := method getSourceFromFile asString. - scanner := InstructionStream on: method. - map := method debuggerMap. - Array streamContents: - [:ranges| - [scanner atEnd] whileFalse: - [| range | - range := map rangeForPC: scanner pc in: method contextIsActiveContext: true. - ((map abstractSourceMap includesKey: scanner abstractPC) - and: [range first ~= 0]) ifTrue: - [ranges nextPut: (source copyFrom: range first to: range last)]. - scanner interpretNextInstructionFor: InstructionClient new]]"! Item was added: + ----- Method: DebuggerMethodMapForFullBlockCompiledMethods>>sortedSourceMap (in category 'source mapping') ----- + sortedSourceMap + + ^ self shouldNotImplement! Item was added: + ----- Method: DebuggerMethodMapForFullBlockCompiledMethods>>sortedSourceMapForMethod: (in category 'source mapping') ----- + sortedSourceMapForMethod: method + + sortedSourceMap ifNil: [ + sortedSourceMap := IdentityDictionary new]. + ^ sortedSourceMap + at: method + ifAbsentPut: [(self abstractSourceMapForMethod: method) associations + replace: [ :each | each copy ]; + sort]! -------------- next part -------------- An HTML attachment was scrubbed... URL: From Christoph.Thiede at student.hpi.uni-potsdam.de Thu Oct 1 12:07:57 2020 From: Christoph.Thiede at student.hpi.uni-potsdam.de (Thiede, Christoph) Date: Thu, 1 Oct 2020 12:07:57 +0000 Subject: [squeak-dev] The Inbox: Tools-ct.991.mcz In-Reply-To: References: , Message-ID: Hi Marcel, sorry. As already mentioned, it can be hard to keep an overview of currently 307 open inbox versions and their interdependencies ... 😫 Best, Christoph ________________________________ Von: Squeak-dev im Auftrag von Taeumel, Marcel Gesendet: Donnerstag, 1. Oktober 2020 14:04:06 An: squeak-dev Betreff: Re: [squeak-dev] The Inbox: Tools-ct.991.mcz Hi Christoph, that's funny. You already did that with Tools-ct.957. :-) I will move both 956 and 957 to treated. Best, Marcel Am 30.09.2020 19:46:56 schrieb commits at source.squeak.org : Christoph Thiede uploaded a new version of Tools to project The Inbox: http://source.squeak.org/inbox/Tools-ct.991.mcz ==================== Summary ==================== Name: Tools-ct.991 Author: ct Time: 30 September 2020, 7:46:39.949807 pm UUID: 4d2f75ef-336d-cc4c-aa0d-dd4f7ff99fc7 Ancestors: Tools-mt.990 Fixes a bug in DebuggerMethodMap's rangeForPC lookup Steps to reproduce: c := Object newSubclass. c compile: 'foo: foo foo = #foo ifTrue: [^ true]. ^ (foo ifNil: [^ false]) = #bar'. c new foo: #bar. "Debug it. Step into #foo:, step over #=. Before this commit, the selection was '^ true'" The error was that #findNearbyBinaryIndex: uses to return the lower possible index if there is no exact match. For debugging, we cannot need this behavior, because we want to select the next operation to be executed. Furthermore, this commit refactors some duplication with DebuggerMethodMapForFullBlockCompiledMethod. Please review! Uploaded again due to totally broken ancestry. Replaces Tools-ct.956, which can be moved into the treated inbox. =============== Diff against Tools-mt.990 =============== Item was changed: ----- Method: DebuggerMethodMap>>rangeForPC:in:contextIsActiveContext: (in category 'source mapping') ----- rangeForPC: contextsConcretePC in: method contextIsActiveContext: contextIsActiveContext + "Answer the indices in the source code for the supplied pc. If the context is the active context (is at the hot end of the stack) then its pc is the current pc. But if the context isn't, because it is suspended sending a message, then its current pc is the previous pc." - "Answer the indices in the source code for the supplied pc. - If the context is the actve context (is at the hot end of the stack) - then its pc is the current pc. But if the context isn't, because it is - suspended sending a message, then its current pc is the previous pc." + | pc i end sortedMap | - | pc i end | pc := method abstractPCForConcretePC: (contextIsActiveContext + ifTrue: [contextsConcretePC] + ifFalse: [(method pcPreviousTo: contextsConcretePC) + ifNil: [contextsConcretePC]]). + (self abstractSourceMapForMethod: method) + at: pc + ifPresent: [:range | ^ range]. + sortedMap := self sortedSourceMapForMethod: method. + sortedMap ifEmpty: [^ 1 to: 0]. + i := sortedMap + findBinaryIndex: [:assoc | pc - assoc key] + ifNone: [:lower :upper | upper]. + i < 1 ifTrue: [^ 1 to: 0]. + i > sortedMap size ifTrue: [ + end := sortedMap inject: 0 into: [:prev :this | + prev max: this value last]. + ^ end + 1 to: end]. + ^ (sortedMap at: i) value! - ifTrue: [contextsConcretePC] - ifFalse: [(method pcPreviousTo: contextsConcretePC) - ifNotNil: [:prevpc| prevpc] - ifNil: [contextsConcretePC]]). - (self abstractSourceMap includesKey: pc) ifTrue: - [^self abstractSourceMap at: pc]. - sortedSourceMap ifNil: - [sortedSourceMap := self abstractSourceMap associations - replace: [ :each | each copy ]; - sort]. - sortedSourceMap isEmpty ifTrue: [^1 to: 0]. - i := sortedSourceMap findNearbyBinaryIndex: [:assoc| pc - assoc key]. - i < 1 ifTrue: [^1 to: 0]. - i > sortedSourceMap size ifTrue: - [end := sortedSourceMap inject: 0 into: - [:prev :this | prev max: this value last]. - ^end+1 to: end]. - ^(sortedSourceMap at: i) value - - "| method source scanner map | - method := DebuggerMethodMap compiledMethodAt: #rangeForPC:in:contextIsActiveContext:. - source := method getSourceFromFile asString. - scanner := InstructionStream on: method. - map := method debuggerMap. - Array streamContents: - [:ranges| - [scanner atEnd] whileFalse: - [| range | - range := map rangeForPC: scanner pc in: method contextIsActiveContext: true. - ((map abstractSourceMap includesKey: scanner abstractPC) - and: [range first ~= 0]) ifTrue: - [ranges nextPut: (source copyFrom: range first to: range last)]. - scanner interpretNextInstructionFor: InstructionClient new]]"! Item was added: + ----- Method: DebuggerMethodMap>>sortedSourceMap (in category 'private') ----- + sortedSourceMap + + ^ sortedSourceMap ifNil: [ + sortedSourceMap := self abstractSourceMap associations + replace: [:each | each copy]; + sort]! Item was added: + ----- Method: DebuggerMethodMap>>sortedSourceMapForMethod: (in category 'source mapping') ----- + sortedSourceMapForMethod: aCompiledMethod + + ^ self sortedSourceMap! Item was changed: ----- Method: DebuggerMethodMapForFullBlockCompiledMethods>>abstractSourceMap (in category 'source mapping') ----- abstractSourceMap + + ^ self shouldNotImplement! - self shouldNotImplement! Item was removed: - ----- Method: DebuggerMethodMapForFullBlockCompiledMethods>>rangeForPC:in:contextIsActiveContext: (in category 'source mapping') ----- - rangeForPC: contextsConcretePC in: method contextIsActiveContext: contextIsActiveContext - "Answer the indices in the source code for the supplied pc. - If the context is the actve context (is at the hot end of the stack) - then its pc is the current pc. But if the context isn't, because it is - suspended sending a message, then its current pc is the previous pc." - - | pc i end mapForMethod sortedMap | - pc := method abstractPCForConcretePC: (contextIsActiveContext - ifTrue: [contextsConcretePC] - ifFalse: [(method pcPreviousTo: contextsConcretePC) - ifNotNil: [:prevpc| prevpc] - ifNil: [contextsConcretePC]]). - ((mapForMethod := self abstractSourceMapForMethod: method) includesKey: pc) ifTrue: - [^mapForMethod at: pc]. - sortedSourceMap ifNil: - [sortedSourceMap := IdentityDictionary new]. - sortedMap := sortedSourceMap - at: method - ifAbsentPut: [mapForMethod associations - replace: [ :each | each copy ]; - sort]. - sortedMap isEmpty ifTrue: [^1 to: 0]. - i := sortedMap findNearbyBinaryIndex: [:assoc| pc - assoc key]. - i < 1 ifTrue: [^1 to: 0]. - i > sortedMap size ifTrue: - [end := sortedMap inject: 0 into: - [:prev :this | prev max: this value last]. - ^end+1 to: end]. - ^(sortedMap at: i) value - - "| method source scanner map | - method := DebuggerMethodMapForFullBlockCompiledMethods compiledMethodAt: #rangeForPC:in:contextIsActiveContext:. - source := method getSourceFromFile asString. - scanner := InstructionStream on: method. - map := method debuggerMap. - Array streamContents: - [:ranges| - [scanner atEnd] whileFalse: - [| range | - range := map rangeForPC: scanner pc in: method contextIsActiveContext: true. - ((map abstractSourceMap includesKey: scanner abstractPC) - and: [range first ~= 0]) ifTrue: - [ranges nextPut: (source copyFrom: range first to: range last)]. - scanner interpretNextInstructionFor: InstructionClient new]]"! Item was added: + ----- Method: DebuggerMethodMapForFullBlockCompiledMethods>>sortedSourceMap (in category 'source mapping') ----- + sortedSourceMap + + ^ self shouldNotImplement! Item was added: + ----- Method: DebuggerMethodMapForFullBlockCompiledMethods>>sortedSourceMapForMethod: (in category 'source mapping') ----- + sortedSourceMapForMethod: method + + sortedSourceMap ifNil: [ + sortedSourceMap := IdentityDictionary new]. + ^ sortedSourceMap + at: method + ifAbsentPut: [(self abstractSourceMapForMethod: method) associations + replace: [ :each | each copy ]; + sort]! -------------- next part -------------- An HTML attachment was scrubbed... URL: From Christoph.Thiede at student.hpi.uni-potsdam.de Thu Oct 1 12:09:51 2020 From: Christoph.Thiede at student.hpi.uni-potsdam.de (Thiede, Christoph) Date: Thu, 1 Oct 2020 12:09:51 +0000 Subject: [squeak-dev] The Inbox: Graphics-ct.441.mcz In-Reply-To: References: <1c939280-8685-4c3d-0f8a-f1c2287dc2fa@zogotounga.net>, Message-ID: <891495ff79994782a743b4f01b49f4e8@student.hpi.uni-potsdam.de> Hm, isn't it enough to add the parentheses in the store string? (6 at 7) printString does not have parentheses either ... Best, Christoph ________________________________ Von: Squeak-dev im Auftrag von Taeumel, Marcel Gesendet: Donnerstag, 1. Oktober 2020 12:55:16 An: squeak-dev Betreff: Re: [squeak-dev] The Inbox: Graphics-ct.441.mcz Nice. Given that #storeOn: is used, we should take care to always wrap the result in parentheses. -> '(Color red alpha: 0.4)' Best, Marcel Am 01.10.2020 10:51:29 schrieb Stéphane Rollandin : > Proposal: Isolate alpha channel when printing a named color. This allows it to reuse the color name even for translucent color. > > Example: > (Color red alpha: 0.4) printString > Output (new): > 'Color red alpha: 0.4' > Output (old): > '(TranslucentColor r: 1 g: 0.0 b: 0.0 alpha: 0.4)' +1 Stef -------------- next part -------------- An HTML attachment was scrubbed... URL: From Christoph.Thiede at student.hpi.uni-potsdam.de Thu Oct 1 12:23:28 2020 From: Christoph.Thiede at student.hpi.uni-potsdam.de (Thiede, Christoph) Date: Thu, 1 Oct 2020 12:23:28 +0000 Subject: [squeak-dev] Overriding #= in Graphics and Sounds Message-ID: <1112186c150f40a0acae92e746abb6fa@student.hpi.uni-potsdam.de> Hi all, for a current project, I need to compare form or sound objects with each other, but I found out that they do not override #=, so for example, we get: (ColorForm extent: 1 @ 1) = (ColorForm extent: 1 @ 1) --> false Wasn't this implemented a) simply because it looked like YAGNI? b) for design reasons? For example, should (Form extent: 1 @ 1) be equal to (ColorForm extent: 1 @ 1) or not? c) for performance reasons? I don't know if there any guidelines for implement #= (except that you need to implement #hash as well), but is an equality comparison generally allowed to be an expensive operation if two objects are equal? If two large forms have a different resolution or a different bitmap hash, comparison will be fast, but if they are equal, we will need to compare every single bit. Would this be okay or a no-go? If implementing #= as proposed is not possible, how would you think about implementing it as a keyword message on Form, e.g. #sameAs:? The same questions apply to the AbstractSound hierarchy, too, where I'm not sure whether two sounds being played for different duration should equal or not. For a similar discussion, see also this thread: [squeak-dev] FormInspector, or also: Text>>#= and its consequences. Best, Christoph -------------- next part -------------- An HTML attachment was scrubbed... URL: From marcel.taeumel at hpi.de Thu Oct 1 12:35:16 2020 From: marcel.taeumel at hpi.de (Marcel Taeumel) Date: Thu, 1 Oct 2020 14:35:16 +0200 Subject: [squeak-dev] The Inbox: Tools-ct.991.mcz In-Reply-To: References: <,> Message-ID: Hi Christoph, I use a small Vivide script to keep track of your (and other) changes: Best, Marcel Am 01.10.2020 14:08:05 schrieb Thiede, Christoph : Hi Marcel, sorry. As already mentioned, it can be hard to keep an overview of currently 307 open inbox versions and their interdependencies ... 😫 Best, Christoph [http://www.hpi.de/] Von: Squeak-dev im Auftrag von Taeumel, Marcel Gesendet: Donnerstag, 1. Oktober 2020 14:04:06 An: squeak-dev Betreff: Re: [squeak-dev] The Inbox: Tools-ct.991.mcz   Hi Christoph, that's funny. You already did that with Tools-ct.957. :-) I will move both 956 and 957 to treated. Best, Marcel Am 30.09.2020 19:46:56 schrieb commits at source.squeak.org : Christoph Thiede uploaded a new version of Tools to project The Inbox: http://source.squeak.org/inbox/Tools-ct.991.mcz ==================== Summary ==================== Name: Tools-ct.991 Author: ct Time: 30 September 2020, 7:46:39.949807 pm UUID: 4d2f75ef-336d-cc4c-aa0d-dd4f7ff99fc7 Ancestors: Tools-mt.990 Fixes a bug in DebuggerMethodMap's rangeForPC lookup Steps to reproduce: c := Object newSubclass. c compile: 'foo: foo foo = #foo ifTrue: [^ true]. ^ (foo ifNil: [^ false]) = #bar'. c new foo: #bar. "Debug it. Step into #foo:, step over #=. Before this commit, the selection was '^ true'" The error was that #findNearbyBinaryIndex: uses to return the lower possible index if there is no exact match. For debugging, we cannot need this behavior, because we want to select the next operation to be executed. Furthermore, this commit refactors some duplication with DebuggerMethodMapForFullBlockCompiledMethod. Please review! Uploaded again due to totally broken ancestry. Replaces Tools-ct.956, which can be moved into the treated inbox. =============== Diff against Tools-mt.990 =============== Item was changed: ----- Method: DebuggerMethodMap>>rangeForPC:in:contextIsActiveContext: (in category 'source mapping') ----- rangeForPC: contextsConcretePC in: method contextIsActiveContext: contextIsActiveContext + "Answer the indices in the source code for the supplied pc. If the context is the active context (is at the hot end of the stack) then its pc is the current pc. But if the context isn't, because it is suspended sending a message, then its current pc is the previous pc." - "Answer the indices in the source code for the supplied pc. - If the context is the actve context (is at the hot end of the stack) - then its pc is the current pc. But if the context isn't, because it is - suspended sending a message, then its current pc is the previous pc." + | pc i end sortedMap | - | pc i end | pc := method abstractPCForConcretePC: (contextIsActiveContext + ifTrue: [contextsConcretePC] + ifFalse: [(method pcPreviousTo: contextsConcretePC) + ifNil: [contextsConcretePC]]). + (self abstractSourceMapForMethod: method) + at: pc + ifPresent: [:range | ^ range]. + sortedMap := self sortedSourceMapForMethod: method. + sortedMap ifEmpty: [^ 1 to: 0]. + i := sortedMap + findBinaryIndex: [:assoc | pc - assoc key] + ifNone: [:lower :upper | upper]. + i < 1 ifTrue: [^ 1 to: 0]. + i > sortedMap size ifTrue: [ + end := sortedMap inject: 0 into: [:prev :this | + prev max: this value last]. + ^ end + 1 to: end]. + ^ (sortedMap at: i) value! - ifTrue: [contextsConcretePC] - ifFalse: [(method pcPreviousTo: contextsConcretePC) - ifNotNil: [:prevpc| prevpc] - ifNil: [contextsConcretePC]]). - (self abstractSourceMap includesKey: pc) ifTrue: - [^self abstractSourceMap at: pc]. - sortedSourceMap ifNil: - [sortedSourceMap := self abstractSourceMap associations - replace: [ :each | each copy ]; - sort]. - sortedSourceMap isEmpty ifTrue: [^1 to: 0]. - i := sortedSourceMap findNearbyBinaryIndex: [:assoc| pc - assoc key]. - i < 1 ifTrue: [^1 to: 0]. - i > sortedSourceMap size ifTrue: - [end := sortedSourceMap inject: 0 into: - [:prev :this | prev max: this value last]. - ^end+1 to: end]. - ^(sortedSourceMap at: i) value - - "| method source scanner map | - method := DebuggerMethodMap compiledMethodAt: #rangeForPC:in:contextIsActiveContext:. - source := method getSourceFromFile asString. - scanner := InstructionStream on: method. - map := method debuggerMap. - Array streamContents: - [:ranges| - [scanner atEnd] whileFalse: - [| range | - range := map rangeForPC: scanner pc in: method contextIsActiveContext: true. - ((map abstractSourceMap includesKey: scanner abstractPC) - and: [range first ~= 0]) ifTrue: - [ranges nextPut: (source copyFrom: range first to: range last)]. - scanner interpretNextInstructionFor: InstructionClient new]]"! Item was added: + ----- Method: DebuggerMethodMap>>sortedSourceMap (in category 'private') ----- + sortedSourceMap + + ^ sortedSourceMap ifNil: [ + sortedSourceMap := self abstractSourceMap associations + replace: [:each | each copy]; + sort]! Item was added: + ----- Method: DebuggerMethodMap>>sortedSourceMapForMethod: (in category 'source mapping') ----- + sortedSourceMapForMethod: aCompiledMethod + + ^ self sortedSourceMap! Item was changed: ----- Method: DebuggerMethodMapForFullBlockCompiledMethods>>abstractSourceMap (in category 'source mapping') ----- abstractSourceMap + + ^ self shouldNotImplement! - self shouldNotImplement! Item was removed: - ----- Method: DebuggerMethodMapForFullBlockCompiledMethods>>rangeForPC:in:contextIsActiveContext: (in category 'source mapping') ----- - rangeForPC: contextsConcretePC in: method contextIsActiveContext: contextIsActiveContext - "Answer the indices in the source code for the supplied pc. - If the context is the actve context (is at the hot end of the stack) - then its pc is the current pc. But if the context isn't, because it is - suspended sending a message, then its current pc is the previous pc." - - | pc i end mapForMethod sortedMap | - pc := method abstractPCForConcretePC: (contextIsActiveContext - ifTrue: [contextsConcretePC] - ifFalse: [(method pcPreviousTo: contextsConcretePC) - ifNotNil: [:prevpc| prevpc] - ifNil: [contextsConcretePC]]). - ((mapForMethod := self abstractSourceMapForMethod: method) includesKey: pc) ifTrue: - [^mapForMethod at: pc]. - sortedSourceMap ifNil: - [sortedSourceMap := IdentityDictionary new]. - sortedMap := sortedSourceMap - at: method - ifAbsentPut: [mapForMethod associations - replace: [ :each | each copy ]; - sort]. - sortedMap isEmpty ifTrue: [^1 to: 0]. - i := sortedMap findNearbyBinaryIndex: [:assoc| pc - assoc key]. - i < 1 ifTrue: [^1 to: 0]. - i > sortedMap size ifTrue: - [end := sortedMap inject: 0 into: - [:prev :this | prev max: this value last]. - ^end+1 to: end]. - ^(sortedMap at: i) value - - "| method source scanner map | - method := DebuggerMethodMapForFullBlockCompiledMethods compiledMethodAt: #rangeForPC:in:contextIsActiveContext:. - source := method getSourceFromFile asString. - scanner := InstructionStream on: method. - map := method debuggerMap. - Array streamContents: - [:ranges| - [scanner atEnd] whileFalse: - [| range | - range := map rangeForPC: scanner pc in: method contextIsActiveContext: true. - ((map abstractSourceMap includesKey: scanner abstractPC) - and: [range first ~= 0]) ifTrue: - [ranges nextPut: (source copyFrom: range first to: range last)]. - scanner interpretNextInstructionFor: InstructionClient new]]"! Item was added: + ----- Method: DebuggerMethodMapForFullBlockCompiledMethods>>sortedSourceMap (in category 'source mapping') ----- + sortedSourceMap + + ^ self shouldNotImplement! Item was added: + ----- Method: DebuggerMethodMapForFullBlockCompiledMethods>>sortedSourceMapForMethod: (in category 'source mapping') ----- + sortedSourceMapForMethod: method + + sortedSourceMap ifNil: [ + sortedSourceMap := IdentityDictionary new]. + ^ sortedSourceMap + at: method + ifAbsentPut: [(self abstractSourceMapForMethod: method) associations + replace: [ :each | each copy ]; + sort]! -------------- next part -------------- An HTML attachment was scrubbed... URL: -------------- next part -------------- A non-text attachment was scrubbed... Name: image.png Type: image/png Size: 535245 bytes Desc: not available URL: From marcel.taeumel at hpi.de Thu Oct 1 12:43:38 2020 From: marcel.taeumel at hpi.de (Marcel Taeumel) Date: Thu, 1 Oct 2020 14:43:38 +0200 Subject: [squeak-dev] Overriding #= in Graphics and Sounds In-Reply-To: <1112186c150f40a0acae92e746abb6fa@student.hpi.uni-potsdam.de> References: <1112186c150f40a0acae92e746abb6fa@student.hpi.uni-potsdam.de> Message-ID: Hi Christoph. Hmmm... maybe it is not straightforward to implement? Especially whether #class (or #species) should match or not. Reminds me of SequenceableCollection >> #= and #hasEqualElements:. I keep on using #hasEqualElements: in tests because I don't care about Array-vs-OrderedCollection in several places. And Form has also a non-trivial hierarchy of variations: For example, would you ignore the #depth if it is black and white anyway? Or would you break uses of Dictionaries that are virtually IdentityDictionaries because of their current keys and the missing #=? It can be hard. Maybe it needs to be maintined afterwards. So, YAGNI? :-) Best, Marcel Am 01.10.2020 14:23:37 schrieb Thiede, Christoph : Hi all, for a current project, I need to compare form or sound objects with each other, but I found out that they do not override #=, so for example, we get: (ColorForm extent: 1 @ 1) = (ColorForm extent: 1 @ 1) --> false Wasn't this implemented a) simply because it looked like YAGNI? b) for design reasons? For example, should (Form extent: 1 @ 1) be equal to (ColorForm extent: 1 @ 1) or not? c) for performance reasons? I don't know if there any guidelines for implement #= (except that you need to implement #hash as well), but is an equality comparison generally allowed to be an expensive operation if two objects are equal? If two large forms have a different resolution or a different bitmap hash, comparison will be fast, but if they are equal, we will need to compare every single bit. Would this be okay or a no-go? If implementing #= as proposed is not possible, how would you think about implementing it as a keyword message on Form, e.g. #sameAs:? The same questions apply to the AbstractSound hierarchy, too, where I'm not sure whether two sounds being played for different duration should equal or not. For a similar discussion, see also this thread: [squeak-dev] FormInspector, or also: Text>>#= and its consequences [http://forum.world.st/FormInspector-or-also-Text-gt-gt-and-its-consequences-td5121599.html]. Best, Christoph -------------- next part -------------- An HTML attachment was scrubbed... URL: -------------- next part -------------- A non-text attachment was scrubbed... Name: image.png Type: image/png Size: 98235 bytes Desc: not available URL: -------------- next part -------------- A non-text attachment was scrubbed... Name: image.png Type: image/png Size: 81778 bytes Desc: not available URL: From eliot.miranda at gmail.com Thu Oct 1 12:44:52 2020 From: eliot.miranda at gmail.com (Eliot Miranda) Date: Thu, 1 Oct 2020 05:44:52 -0700 Subject: [squeak-dev] highdpi testing In-Reply-To: <8F19CF2D-979F-483F-927B-768430E0E1DB@gmx.de> References: <8F19CF2D-979F-483F-927B-768430E0E1DB@gmx.de> Message-ID: <5770E3E5-3007-4C98-BD0B-2C7AF24E0796@gmail.com> Hi Tobias, > On Sep 30, 2020, at 1:11 PM, Tobias Pape wrote: > >  >> On 30.09.2020, at 19:24, Thiede, Christoph wrote: >> >> On Windows, it appears to be a democratic thing - the majority of pixels wins in the question of DPI value. But I'm not absolutely sure about this and cannot test this right now. I don't believe it would be a good idea to override this behavior, even if we could ... > > Yes. > Although I made it modifyable on Unix, just out of tradition that unix leaks every screw… > > (https://github.com/OpenSmalltalk/opensmalltalk-vm/blob/krono/highdpi-v2/platforms/unix/vm-display-X11/sqUnixX11Scale.c#L182) > > So, anyone interested in me putting the VM stuff into the main branch? Yes. The only issue is backwards compatibility. If it isn’t backwards compatible it’s time to a) do a new release of the 5.x vm b) bump the version number of the highdpi vm to 6.x If it is backwards compatible then what are you waiting for? If you already did, and that’s why yesterday my Squeak desktop suddenly looked so crisp, then thank you sooo sooo much, if looks *fantastic*!! > -t > From commits at source.squeak.org Thu Oct 1 13:33:32 2020 From: commits at source.squeak.org (commits at source.squeak.org) Date: Thu, 1 Oct 2020 13:33:32 0000 Subject: [squeak-dev] The Trunk: WebClient-Core-mt.124.mcz Message-ID: Marcel Taeumel uploaded a new version of WebClient-Core to project The Trunk: http://source.squeak.org/trunk/WebClient-Core-mt.124.mcz ==================== Summary ==================== Name: WebClient-Core-mt.124 Author: mt Time: 1 October 2020, 3:33:31.12048 pm UUID: ded69be5-bdb0-ea47-9289-4c4d01285b08 Ancestors: WebClient-Core-ul.123 Merges WebClient-Core-monty.113 (-> treated), which fixes the missing #closeIfTransient for #getContentWithProgress:. However, do it differently than proposed, that is, use the template method that is re-used in subclasses. =============== Diff against WebClient-Core-ul.123 =============== Item was removed: - ----- Method: WebResponse>>content (in category 'accessing') ----- - content - "Reimplemented to close the socket if the request is transient" - - content ifNil:[ - content := self getContent. - self closeIfTransient. - ]. - ^content! Item was removed: - ----- Method: WebResponse>>getContent (in category 'private') ----- - getContent - " Any response to a HEAD request and any response with a 1xx - (Informational), 204 (No Content), or 304 (Not Modified) status - code is always terminated by the first empty line after the - header fields, regardless of the header fields present in the - message, and thus cannot contain a message body. - - https://tools.ietf.org/html/rfc7230#section-3.3.3 " - - (request method = 'HEAD' or: [(code between: 100 and: 199) or: [code = 204 or: [code = 304]]]) ifTrue:[^'']. - ^super getContent! Item was added: + ----- Method: WebResponse>>getContentWithProgress: (in category 'private') ----- + getContentWithProgress: progressBlockOrNil + "Any response to a HEAD request and any response with a 1xx (Informational), 204 (No Content), or 304 (Not Modified) status code is always terminated by the first empty line after the header fields, regardless of the header fields present in the message, and thus cannot contain a message body. See https://tools.ietf.org/html/rfc7230#section-3.3.3 " + + [ + (request method = 'HEAD' + or: [(code between: 100 and: 199) + or: [code = 204 + or: [code = 304]]]) ifTrue: [^ '']. + + ^ super getContentWithProgress: progressBlockOrNil + + ] ensure: [self closeIfTransient]! From commits at source.squeak.org Thu Oct 1 13:39:02 2020 From: commits at source.squeak.org (commits at source.squeak.org) Date: Thu, 1 Oct 2020 13:39:02 0000 Subject: [squeak-dev] The Inbox: WebClient-Core-mt.125.mcz Message-ID: A new version of WebClient-Core was added to project The Inbox: http://source.squeak.org/inbox/WebClient-Core-mt.125.mcz ==================== Summary ==================== Name: WebClient-Core-mt.125 Author: mt Time: 1 October 2020, 3:39:01.65348 pm UUID: 8a9c023e-5992-534e-ba7d-2a824197d979 Ancestors: WebClient-Core-mt.124 Re-commit proposal from WebClient-Core-monty.114 (-> treated) to use more recent codebase. Original commit message follows. (30 October 2017, 2:59 am) Added support for disabling the automatic character decoding of text responses by adding #getContentWithProgress:decodesText:, making #getContentWithProgress: delegate to it, adding #contentWithProgress:decodesText: as a caching front-end and then making #contentWithProgress: delegate to it and #content delegate to #contentWithProgress:. This is needed because some text formats allow encodings to be inferred from the document itself, like from a leading BOM or an XML-style 'encoding="..."?>' declaration, and to give an alternative for situations where the charset is incorrectly inferred and WebClient mangles the response. This is different from HTTP encoding (like with GZIP) which is part of HTTP and is meant to be applied before transit and removed after entirely transparant to the user and so does not permanently alter the original payload, unlike automatic decoding from UTF-8 or another character encoding. =============== Diff against WebClient-Core-mt.124 =============== Item was changed: ----- Method: WebMessage>>getContentWithProgress: (in category 'private') ----- getContentWithProgress: progressBlockOrNil - "Reads available content and returns it." + ^ self getContentWithProgress: progressBlockOrNil decodesText: true! - | length result | - length := self contentLength. - result := (stream isBinary ifTrue:[ ByteArray ] ifFalse: [ ByteString ]) - new: (length ifNil: [ 1000 ]) - streamContents: [ :outputStream | - self - streamFrom: stream - to: outputStream - size: length - progress: progressBlockOrNil ]. - self decoderForContentEncoding ifNotNil: [:decoder | - result := (decoder on: result) upToEnd]. - self textConverterForContentType ifNotNil: [:converter | - [result := result convertFromWithConverter: converter] - on: InvalidUTF8 "some servers lie" - do: [^ result]]. - ^ result - ! Item was added: + ----- Method: WebMessage>>getContentWithProgress:decodesText: (in category 'private') ----- + getContentWithProgress: progressBlockOrNil decodesText: aBoolean + "Reads available content and returns it, periodically evaluating progressBlockOrNil + with the total size and the total bytes read so far, optionally decoding text content + based on the Content-Type charset." + + | length result | + length := self contentLength. + result := (stream isBinary ifTrue:[ ByteArray ] ifFalse: [ ByteString ]) + new: (length ifNil: [ 1000 ]) + streamContents: [ :outputStream | + self + streamFrom: stream + to: outputStream + size: length + progress: progressBlockOrNil ]. + self decoderForContentEncoding ifNotNil: [:decoder | + result := (decoder on: result) upToEnd]. + aBoolean ifTrue: [ + self textConverterForContentType ifNotNil: [:converter | + [result := result convertFromWithConverter: converter] + on: InvalidUTF8 "some servers lie" + do: [^ result]]]. + ^ result! Item was removed: - ----- Method: WebResponse>>getContentWithProgress: (in category 'private') ----- - getContentWithProgress: progressBlockOrNil - "Any response to a HEAD request and any response with a 1xx (Informational), 204 (No Content), or 304 (Not Modified) status code is always terminated by the first empty line after the header fields, regardless of the header fields present in the message, and thus cannot contain a message body. See https://tools.ietf.org/html/rfc7230#section-3.3.3 " - - [ - (request method = 'HEAD' - or: [(code between: 100 and: 199) - or: [code = 204 - or: [code = 304]]]) ifTrue: [^ '']. - - ^ super getContentWithProgress: progressBlockOrNil - - ] ensure: [self closeIfTransient]! Item was added: + ----- Method: WebResponse>>getContentWithProgress:decodesText: (in category 'private') ----- + getContentWithProgress: progressBlockOrNil decodesText: aBoolean + "Any response to a HEAD request and any response with a 1xx (Informational), 204 (No Content), or 304 (Not Modified) status code is always terminated by the first empty line after the header fields, regardless of the header fields present in the message, and thus cannot contain a message body. See https://tools.ietf.org/html/rfc7230#section-3.3.3 " + + [ + (request method = 'HEAD' + or: [(code between: 100 and: 199) + or: [code = 204 + or: [code = 304]]]) ifTrue: [^ '']. + + ^ super getContentWithProgress: progressBlockOrNil decodesText: aBoolean + + ] ensure: [self closeIfTransient]! From commits at source.squeak.org Thu Oct 1 13:50:06 2020 From: commits at source.squeak.org (commits at source.squeak.org) Date: Thu, 1 Oct 2020 13:50:06 0000 Subject: [squeak-dev] The Trunk: WebClient-Core-mt.126.mcz Message-ID: Marcel Taeumel uploaded a new version of WebClient-Core to project The Trunk: http://source.squeak.org/trunk/WebClient-Core-mt.126.mcz ==================== Summary ==================== Name: WebClient-Core-mt.126 Author: mt Time: 1 October 2020, 3:50:05.23448 pm UUID: ac088027-30e2-9c4e-8f43-c1b651186f3d Ancestors: WebClient-Core-mt.124, WebClient-Core-ct.124 Merges WebClient-Core-ct.124 =============== Diff against WebClient-Core-mt.124 =============== Item was changed: ----- Method: WebUtils class>>encodeMultipartForm:boundary: (in category 'decoding') ----- encodeMultipartForm: fieldMap boundary: boundary "Encodes the fieldMap as multipart/form-data. The fieldMap may contain MIMEDocument instances to indicate the presence of a file to upload to the server. If the MIMEDocument is present, its content type and file name will be used for the upload. The fieldMap can be EITHER an array of associations OR a Dictionary of key value pairs (the former is useful for providing multiple fields and/or specifying the order of fields)." ^String streamContents:[:stream| (fieldMap as: Dictionary) keysAndValuesDo:[:fieldName :fieldValue | | fieldContent | "Write multipart boundary and common headers" stream nextPutAll: '--', boundary; crlf. stream nextPutAll: 'Content-Disposition: form-data; name="', fieldName, '"'. "Figure out if this is a file upload" (fieldValue isKindOf: MIMEDocument) ifTrue:[ + stream nextPutAll: '; filename="', fieldValue url pathForFile, '"'; crlf. - stream nextPutAll: ' filename="', fieldValue url pathForFile, '"'; crlf. stream nextPutAll: 'Content-Type: ', fieldValue contentType. fieldContent := (fieldValue content ifNil:[ (FileStream readOnlyFileNamed: fieldValue url pathForFile) contentsOfEntireFile. ]) asString. ] ifFalse: [fieldContent := fieldValue]. stream crlf; crlf. stream nextPutAll: fieldContent asString. stream crlf. ]. stream nextPutAll: '--', boundary, '--', String crlf. ]. ! From commits at source.squeak.org Thu Oct 1 13:50:32 2020 From: commits at source.squeak.org (commits at source.squeak.org) Date: Thu, 1 Oct 2020 13:50:32 0000 Subject: [squeak-dev] The Trunk: WebClient-Core-ct.124.mcz Message-ID: Marcel Taeumel uploaded a new version of WebClient-Core to project The Trunk: http://source.squeak.org/trunk/WebClient-Core-ct.124.mcz ==================== Summary ==================== Name: WebClient-Core-ct.124 Author: ct Time: 31 August 2020, 1:54:11.685896 am UUID: b0d7790c-c195-6e4d-ad0f-fce8cf8b3b00 Ancestors: WebClient-Core-ul.123 Fixes a syntax error in multipart/form-data encoding Phew! It costed me a few hours to track some higher-level application bug down to this low level code ... =============== Diff against WebClient-Core-ul.123 =============== Item was changed: ----- Method: WebUtils class>>encodeMultipartForm:boundary: (in category 'decoding') ----- encodeMultipartForm: fieldMap boundary: boundary "Encodes the fieldMap as multipart/form-data. The fieldMap may contain MIMEDocument instances to indicate the presence of a file to upload to the server. If the MIMEDocument is present, its content type and file name will be used for the upload. The fieldMap can be EITHER an array of associations OR a Dictionary of key value pairs (the former is useful for providing multiple fields and/or specifying the order of fields)." ^String streamContents:[:stream| (fieldMap as: Dictionary) keysAndValuesDo:[:fieldName :fieldValue | | fieldContent | "Write multipart boundary and common headers" stream nextPutAll: '--', boundary; crlf. stream nextPutAll: 'Content-Disposition: form-data; name="', fieldName, '"'. "Figure out if this is a file upload" (fieldValue isKindOf: MIMEDocument) ifTrue:[ + stream nextPutAll: '; filename="', fieldValue url pathForFile, '"'; crlf. - stream nextPutAll: ' filename="', fieldValue url pathForFile, '"'; crlf. stream nextPutAll: 'Content-Type: ', fieldValue contentType. fieldContent := (fieldValue content ifNil:[ (FileStream readOnlyFileNamed: fieldValue url pathForFile) contentsOfEntireFile. ]) asString. ] ifFalse: [fieldContent := fieldValue]. stream crlf; crlf. stream nextPutAll: fieldContent asString. stream crlf. ]. stream nextPutAll: '--', boundary, '--', String crlf. ]. ! From commits at source.squeak.org Thu Oct 1 13:53:02 2020 From: commits at source.squeak.org (commits at source.squeak.org) Date: Thu, 1 Oct 2020 13:53:02 0000 Subject: [squeak-dev] The Trunk: UpdateStream-ct.13.mcz Message-ID: Marcel Taeumel uploaded a new version of UpdateStream to project The Trunk: http://source.squeak.org/trunk/UpdateStream-ct.13.mcz ==================== Summary ==================== Name: UpdateStream-ct.13 Author: ct Time: 21 December 2019, 1:00:30.046795 pm UUID: 4f856f41-7ea6-c744-a765-4f5bdc635989 Ancestors: UpdateStream-mt.12 Fix a small bug when dropping a changeset without conflicts into the image, showing the "conflicts with updated methods" and then pressing "no" =============== Diff against UpdateStream-mt.12 =============== Item was changed: ----- Method: FilePackage class>>conflictsWithUpdatedMethods: (in category '*UpdateStream-instance creation') ----- conflictsWithUpdatedMethods: fullName | conflicts changeList | conflicts := (self fromFileNamed: fullName) conflictsWithUpdatedMethods. + (conflicts isNil or: [conflicts isEmpty]) ifTrue: [^ self]. - conflicts isEmpty ifTrue: [^ self]. changeList := ChangeList new. changeList changes: conflicts file: (FileDirectory default readOnlyFileNamed: fullName) close. ChangeList open: changeList name: 'Conflicts for ', (FileDirectory localNameFor: fullName) multiSelect: true.! Item was changed: ----- Method: FilePackage>>conflictsWithUpdatedMethods (in category '*UpdateStream-conflict checker') ----- conflictsWithUpdatedMethods "Check this package for conflicts with methods in the image which are in newer updates." | localFileName stream updateNumberString updateNumber imageUpdateNumber updateNumberChangeSet conflicts fileStream | + - localFileName := FileDirectory localNameFor: fullName. stream := ReadStream on: sourceSystem. stream upToAll: 'latest update: #'. updateNumberString := stream upTo: $]. stream close. fileStream := FileStream readOnlyFileNamed: fullName. (fileStream contentsOfEntireFile includes: Character linefeed) ifTrue: [self notify: 'The changeset file ', localFileName, ' contains linefeeds. Proceed if... you know that this is okay (e.g. the file contains raw binary data).']. fileStream close. + - updateNumberString isEmpty ifFalse: "remove prepended junk, if any" [updateNumberString := (updateNumberString findTokens: Character space) last]. updateNumberString asInteger ifNil: [(self confirm: 'Error: ', localFileName, ' has no valid Latest Update number in its header. Do you want to enter an update number for this file?') + ifFalse: [^ nil] - ifFalse: [^ self] ifTrue: [updateNumberString := UIManager default request: 'Please enter the estimated update number (e.g. 4332).']]. updateNumberString asInteger ifNil: [self inform: 'Conflict check cancelled.'. ^ self]. updateNumber := updateNumberString asInteger. + - imageUpdateNumber := SystemVersion current highestUpdate. updateNumber > imageUpdateNumber ifTrue: [(self confirm: 'Warning: The update number for this file (#', updateNumberString, ') is greater than the highest update number for this image (#', imageUpdateNumber asString, '). This probably means you need to update your image. Should we proceed anyway as if the file update number is #', imageUpdateNumber asString, '?') ifTrue: [updateNumber := imageUpdateNumber. updateNumberString := imageUpdateNumber asString] + ifFalse: [^ nil]]. + - ifFalse: [^ self]]. - updateNumberChangeSet := self findUpdateChangeSetMatching: updateNumber. + updateNumberChangeSet ifNil: [^ nil]. + - updateNumberChangeSet ifNil: [^ self]. - Smalltalk isMorphic ifTrue: [self currentWorld findATranscript: self currentEvent]. self class logCr; logCr; log: 'Checking ', localFileName, ' (#', updateNumberString, ') for method conflicts with changesets after ', updateNumberChangeSet name, ' ...'. + - conflicts := OrderedCollection new. self classes do: [:pseudoClass | (Array with: pseudoClass with: pseudoClass metaClass) do: [:classOrMeta | classOrMeta selectorsDo: [:selector | | conflict | conflict := self checkForMoreRecentUpdateThanChangeSet: updateNumberChangeSet pseudoClass: classOrMeta selector: selector. conflict ifNotNil: [conflicts add: conflict]. ]. ]. ]. self class logCr; log: conflicts size asString, (' conflict' asPluralBasedOn: conflicts), ' found.'; logCr. self class closeLog. ^ conflicts! From commits at source.squeak.org Thu Oct 1 13:55:09 2020 From: commits at source.squeak.org (commits at source.squeak.org) Date: Thu, 1 Oct 2020 13:55:09 0000 Subject: [squeak-dev] The Trunk: ToolBuilder-Morphic-TheresaHMartenK.261.mcz Message-ID: Marcel Taeumel uploaded a new version of ToolBuilder-Morphic to project The Trunk: http://source.squeak.org/trunk/ToolBuilder-Morphic-TheresaHMartenK.261.mcz ==================== Summary ==================== Name: ToolBuilder-Morphic-TheresaHMartenK.261 Author: TheresaHMartenK Time: 20 June 2020, 4:04:09.471561 pm UUID: ec0bd065-4cc8-7d48-b940-4bf5a0f4a7cf Ancestors: ToolBuilder-Morphic-mt.260 The current implementation searches for the supplied answer in the valueList and if found returns the value at the found index in the valueList which of course is the supplied answer. However from the behaviour that gets mimicked you would expect the implementation to look for the suppliedAnswer in the labelList - the same as you click on the label and not on its connected value. Additionally this produces less readable / understandable code compared to supplying the label, especially if the value happens to be a block. With the new implementation, the answer is searched in the labelList, and the returned value is the coresponding value from the valueList. =============== Diff against ToolBuilder-Morphic-mt.260 =============== Item was changed: ----- Method: MorphicUIManager>>chooseFrom:values:lines:title: (in category 'ui requests') ----- chooseFrom: labelList values: valueList lines: linesArray title: aString "Choose an item from the given list. Answer the selected item." | index | self askForProvidedAnswerTo: aString ifSupplied: [:answer | (answer = #cancel or: [answer isNil]) ifTrue: [^ nil]. + ^ valueList at: (labelList indexOf: answer) ifAbsent: [ - ^ valueList at: (valueList indexOf: answer) ifAbsent: [ answer isNumber ifTrue: [valueList at: answer ifAbsent: [nil]] ifFalse: [nil]]]. index := self chooseFrom: labelList lines: linesArray title: aString. ^ index = 0 ifTrue: [ nil ] ifFalse: [ valueList at: index ]! From commits at source.squeak.org Thu Oct 1 14:04:47 2020 From: commits at source.squeak.org (commits at source.squeak.org) Date: Thu, 1 Oct 2020 14:04:47 0000 Subject: [squeak-dev] The Trunk: ToolBuilder-Morphic-ct.264.mcz Message-ID: Marcel Taeumel uploaded a new version of ToolBuilder-Morphic to project The Trunk: http://source.squeak.org/trunk/ToolBuilder-Morphic-ct.264.mcz ==================== Summary ==================== Name: ToolBuilder-Morphic-ct.264 Author: ct Time: 17 September 2020, 2:17:24.709813 pm UUID: f0cb613b-9652-a146-9d77-016577d87700 Ancestors: ToolBuilder-Morphic-mt.263 Initially refresh window color when building a window. While this also happens later #openInWorld, the call is missing is something else is done with the window instead, e.g. #openInWindow or #imageForm. =============== Diff against ToolBuilder-Morphic-mt.263 =============== Item was changed: ----- Method: MorphicToolBuilder>>buildPluggableWindow: (in category 'widgets required') ----- buildPluggableWindow: aSpec | widget | aSpec layout == #proportional ifFalse:[ "This needs to be implemented - probably by adding a single pane and then the rest" ^self error: 'Not implemented'. ]. widget := (self windowClassFor: aSpec) new. self register: widget id: aSpec name. widget model: aSpec model. "Set child dependent layout properties." widget wantsPaneSplitters: (aSpec wantsResizeHandles ifNil: [true]). self setLayoutHintsFor: widget spec: aSpec. widget layoutInset: (aSpec padding ifNil: [ProportionalSplitterMorph gripThickness]). widget cellGap: (aSpec spacing ifNil: [ProportionalSplitterMorph gripThickness]). "Now create the children." panes := OrderedCollection new. aSpec children isSymbol ifTrue: [ widget getChildrenSelector: aSpec children. widget update: aSpec children] ifFalse: [ self buildAll: aSpec children in: widget]. widget setUpdatablePanesFrom: panes. aSpec label ifNotNil: [:label| label isSymbol ifTrue:[widget getLabelSelector: label] ifFalse:[widget setLabel: label]]. aSpec multiWindowStyle notNil ifTrue: [widget savedMultiWindowState: (SavedMultiWindowState on: aSpec model)]. widget closeWindowSelector: aSpec closeAction. self buildHelpFor: widget spec: aSpec. widget bounds: (RealEstateAgent initialFrameFor: widget initialExtent: (aSpec extent ifNil:[widget initialExtent]) world: self currentWorld). + widget refreshWindowColor. + ^ widget! From commits at source.squeak.org Thu Oct 1 14:06:26 2020 From: commits at source.squeak.org (commits at source.squeak.org) Date: Thu, 1 Oct 2020 14:06:26 0000 Subject: [squeak-dev] The Trunk: ToolBuilder-Morphic-mt.265.mcz Message-ID: Marcel Taeumel uploaded a new version of ToolBuilder-Morphic to project The Trunk: http://source.squeak.org/trunk/ToolBuilder-Morphic-mt.265.mcz ==================== Summary ==================== Name: ToolBuilder-Morphic-mt.265 Author: mt Time: 1 October 2020, 4:06:25.42648 pm UUID: 2653b027-7c1d-b046-8660-f06185132b51 Ancestors: ToolBuilder-Morphic-ct.264, ToolBuilder-Morphic-ct.252 Merges ToolBuilder-Morphic-ct.252 =============== Diff against ToolBuilder-Morphic-ct.264 =============== Item was added: + ----- Method: PluggableButtonMorphPlus>>browseImplementationOfActionSelector (in category 'debug menu') ----- + browseImplementationOfActionSelector + + action + ifNil: [super browseImplementationOfActionSelector] + ifNotNil: [action homeMethod browse].! Item was added: + ----- Method: PluggableButtonMorphPlus>>debugAction (in category 'debug menu') ----- + debugAction + + action ifNil: [^ super debugAction]. + (Process + forBlock: [self performAction] + runUntil: [:context | context closure = action]) + debugWithTitle: ('Debug button action "{1}" in model "{2}"' format: {self label. self target printString}).! From commits at source.squeak.org Thu Oct 1 14:06:42 2020 From: commits at source.squeak.org (commits at source.squeak.org) Date: Thu, 1 Oct 2020 14:06:42 0000 Subject: [squeak-dev] The Trunk: ToolBuilder-Morphic-ct.252.mcz Message-ID: Marcel Taeumel uploaded a new version of ToolBuilder-Morphic to project The Trunk: http://source.squeak.org/trunk/ToolBuilder-Morphic-ct.252.mcz ==================== Summary ==================== Name: ToolBuilder-Morphic-ct.252 Author: ct Time: 20 January 2020, 8:57:46.404972 pm UUID: 2b311bcc-31ca-dc4d-8ebf-7a1cad07624e Ancestors: ToolBuilder-Morphic-mt.251 Implement "browse/debug button action" properly on PluggabeButtonMorphPlus =============== Diff against ToolBuilder-Morphic-mt.251 =============== Item was added: + ----- Method: PluggableButtonMorphPlus>>browseImplementationOfActionSelector (in category 'debug menu') ----- + browseImplementationOfActionSelector + + action ifNotNil: [ + ^ action outerContext method browse]. + ^ super browseImplementationOfActionSelector! Item was added: + ----- Method: PluggableButtonMorphPlus>>debugAction (in category 'debug menu') ----- + debugAction + + action ifNil: [^ super debugAction]. + (Process + forBlock: [self performAction] + runUntil: [:context | context closure = action]) + debugWithTitle: ('Debug button action "{1}" in model "{2}"' format: {self label. self target printString}).! From commits at source.squeak.org Thu Oct 1 14:09:02 2020 From: commits at source.squeak.org (commits at source.squeak.org) Date: Thu, 1 Oct 2020 14:09:02 0000 Subject: [squeak-dev] The Trunk: ToolBuilder-MVC-TheresaHMartenK.60.mcz Message-ID: Marcel Taeumel uploaded a new version of ToolBuilder-MVC to project The Trunk: http://source.squeak.org/trunk/ToolBuilder-MVC-TheresaHMartenK.60.mcz ==================== Summary ==================== Name: ToolBuilder-MVC-TheresaHMartenK.60 Author: TheresaHMartenK Time: 20 June 2020, 4:32:44.419561 pm UUID: ce7849e7-d47c-434e-8bbd-f6ec2b896a4c Ancestors: ToolBuilder-MVC-mt.59 Same reason as: ToolBuilder-Morphic-TheresaHMartenK.261 Copy: The current implementation searches for the supplied answer in the valueList and if found returns the value at the found index in the valueList which of course is the supplied answer. However from the behaviour that gets mimicked you would expect the implementation to look for the suppliedAnswer in the labelList - the same as you click on the label and not on its connected value. Additionally this produces less readable / understandable code compared to supplying the label, especially if the value happens to be a block. With the new implementation, the answer is searched in the labelList, and the returned value is the coresponding value from the valueList. =============== Diff against ToolBuilder-MVC-mt.59 =============== Item was changed: ----- Method: MVCUIManager>>chooseFrom:values:lines:title: (in category 'ui requests') ----- chooseFrom: labelList values: valueList lines: linesArray title: aString "Choose an item from the given list. Answer the selected item." | menu | self askForProvidedAnswerTo: aString ifSupplied: [:answer | (answer = #cancel or: [answer isNil]) ifTrue: [^ nil]. + ^ valueList at: (labelList indexOf: answer) ifAbsent: [ - ^ valueList at: (valueList indexOf: answer) ifAbsent: [ answer isNumber ifTrue: [valueList at: answer ifAbsent: [nil]] ifFalse: [nil]]]. menu := SelectionMenu labels: labelList lines: linesArray selections: valueList. ^ aString ifEmpty: [menu startUp] ifNotEmpty: [menu startUpWithCaption: aString]! From commits at source.squeak.org Thu Oct 1 14:10:21 2020 From: commits at source.squeak.org (commits at source.squeak.org) Date: Thu, 1 Oct 2020 14:10:21 0000 Subject: [squeak-dev] The Trunk: ToolBuilder-MVC-ct.60.mcz Message-ID: Marcel Taeumel uploaded a new version of ToolBuilder-MVC to project The Trunk: http://source.squeak.org/trunk/ToolBuilder-MVC-ct.60.mcz ==================== Summary ==================== Name: ToolBuilder-MVC-ct.60 Author: ct Time: 27 June 2020, 10:37:01.784959 pm UUID: dd09ecec-d16e-854c-8564-d21576eb58fc Ancestors: ToolBuilder-MVC-mt.59 Don't fail in MVCToolBuilder when opening a menu The semantics of ToolBuilder >> #open: are to work regardless of the build state of the passed object (thus "anObject"). As a consequence, [MVCToolBuilder new open: (MVCToolBuilder new build: PluggableMenuSpec new)] should work, too. =============== Diff against ToolBuilder-MVC-mt.59 =============== Item was changed: ----- Method: MVCToolBuilder>>open: (in category 'opening') ----- open: anObject "Build and open the object. Answer the widget opened." | window | + window := (anObject isKindOf: View orOf: PopUpMenu) - window := (anObject isKindOf: View) ifTrue: [anObject] ifFalse: [self build: anObject]. (window isKindOf: PopUpMenu) ifTrue: [window invokeOn: nil]. (window isKindOf: View) ifTrue: [window controller open]. ^window! From Marcel.Taeumel at hpi.de Thu Oct 1 14:28:53 2020 From: Marcel.Taeumel at hpi.de (marcel.taeumel) Date: Thu, 1 Oct 2020 09:28:53 -0500 (CDT) Subject: [squeak-dev] The Inbox: ToolBuilder-Kernel-ct.135.mcz In-Reply-To: References: Message-ID: <1601562533232-0.post@n4.nabble.com> Hi Christoph. -1 because "false" is typically different than "cancellation" in the context where that UI request is posed. Imagine that a user says "No, do not overwrite but duplicate that item." but your logic could trigger something like "Close this dialog" just because the current UI manager omitted to implement that case. It would be more discoverable to raise that #subclassResponsibility exception. Best, Marcel commits-2 wrote > Christoph Thiede uploaded a new version of ToolBuilder-Kernel to project > The Inbox: > http://source.squeak.org/inbox/ToolBuilder-Kernel-ct.135.mcz > > ==================== Summary ==================== > > Name: ToolBuilder-Kernel-ct.135 > Author: ct > Time: 24 January 2020, 6:34:43.604574 pm > UUID: 3ec2613e-56d3-2d41-b5c3-799a66a986e9 > Ancestors: ToolBuilder-Kernel-mt.134 > > Provides fallback implementations for some UIManager messages > > =============== Diff against ToolBuilder-Kernel-mt.134 =============== > > Item was changed: > ----- Method: UIManager>>chooseFrom:values:lines:title: (in category 'ui > requests') ----- > chooseFrom: labelList values: valueList lines: linesArray title: aString > + "Choose an item from the given list. Answer the corresponding value." > + | result | > + result := self chooseFrom: labelList lines: linesArray title: aString. > + (result isNil or: [result isZero]) ifTrue: [^ nil]. > + ^ valueList at: result! > - "Choose an item from the given list. Answer the selected item." > - ^self subclassResponsibility! > > Item was changed: > ----- Method: UIManager>>confirm:orCancel: (in category 'ui requests') > ----- > confirm: aString orCancel: cancelBlock > + "Put up a yes/no/cancel menu with caption aString. Answer true if the > response is yes, false if no. If cancel is chosen, evaluate cancelBlock. > This is a modal question--the user must respond yes or no." > + ^ (self confirm: aString) > + ifFalse: [cancelBlock value]; > + yourself! > - "Put up a yes/no/cancel menu with caption aString. Answer true if > - the response is yes, false if no. If cancel is chosen, evaluate > - cancelBlock. This is a modal question--the user must respond yes or > no." > - ^self subclassResponsibility! > > Item was changed: > ----- Method: UIManager>>confirm:orCancel:title: (in category 'ui > requests') ----- > confirm: aString orCancel: cancelBlock title: titleString > + "Put up a yes/no/cancel menu with caption aString, and titleString to > label the dialog. Answer true if the response is yes, false if no. If > cancel is chosen, evaluate cancelBlock. This is a modal question--the user > must respond yes or no." > + ^ (self confirm: aString title: titleString) > + ifFalse: [cancelBlock value]; > + yourself! > - "Put up a yes/no/cancel menu with caption aString, and titleString to > label the dialog. > - Answer true if the response is yes, false if no. If cancel is chosen, > evaluate cancelBlock. > - This is a modal question--the user must respond yes or no." > - ^self subclassResponsibility! > > Item was changed: > ----- Method: UIManager>>request:initialAnswer:centerAt: (in category > 'ui requests - text') ----- > request: queryString initialAnswer: defaultAnswer centerAt: aPoint > + "Create an instance of me whose question is queryString with the given > initial answer. Invoke it centered at the given point, and answer the > string the user accepts. Answer the empty string if the user cancels." > - "Create an instance of me whose question is queryString with the given > - initial answer. Invoke it centered at the given point, and answer the > - string the user accepts. Answer the empty string if the user cancels." > > + ^ self request: queryString initialAnswer: defaultAnswer! > - ^self subclassResponsibility! -- Sent from: http://forum.world.st/Squeak-Dev-f45488.html From eliot.miranda at gmail.com Thu Oct 1 15:07:08 2020 From: eliot.miranda at gmail.com (Eliot Miranda) Date: Thu, 1 Oct 2020 08:07:08 -0700 Subject: [squeak-dev] "Pretty Print" collections as abstract syntax trees using plain text output In-Reply-To: <174e381dcff.eeb497c783798.6677692293294794906@zoho.com> References: <174e381dcff.eeb497c783798.6677692293294794906@zoho.com> Message-ID: Hi Tty, > On Oct 1, 2020, at 2:33 AM, gettimothy via Squeak-dev wrote: > >  > Hi folks. > > Has anybody coded a way , using plain text, to output a > > https://en.wikipedia.org/wiki/Abstract_syntax_tree > > to a workspace? > > It would be a handy debug tool if so. An infinitely better way would be to port the Rossal visualisation system. I’ve talked with Alexandre and he says Rossal is designed with portability in mind (it currently runs on Pharo and BisyalWorks and predates Pharo’s current imaging model). This would give you a graphical representation of the entire tree, with the ability to attach behaviour to elements of the representation. > thx -------------- next part -------------- An HTML attachment was scrubbed... URL: From builds at travis-ci.org Thu Oct 1 15:17:33 2020 From: builds at travis-ci.org (Travis CI) Date: Thu, 01 Oct 2020 15:17:33 +0000 Subject: [squeak-dev] [CRON] Errored: squeak-smalltalk/squeak-app#1845 (squeak-trunk - 25ebaf1) In-Reply-To: Message-ID: <5f75f30d7bf9f_13f95f2eb80e416873@travis-tasks-9bbfddd47-9zsbl.mail> Build Update for squeak-smalltalk/squeak-app ------------------------------------- Build: #1845 Status: Errored Duration: 18 mins and 1 sec Commit: 25ebaf1 (squeak-trunk) Author: Marcel Taeumel Message: Hi all! The project "squeak-app" is part of the continuous build infrastructure (short: CI) for Squeak's bundles, which you can download at https://files.squeak.org/, followed by the version tag you are looking for. All bundles are updated on a regular basis, which is daily for Trunk (i.e. the current alpha version) and monthly for release versions. Note that there won't be new bundles if Squeak's build number, which reflects in-image code updates, did not change between CI jobs. -- The Squeak Oversight Board [ci skip] View the changeset: https://github.com/squeak-smalltalk/squeak-app/compare/fb55517f583fe544f9225413a23fe82a680200c2...25ebaf18249322227da1f7c767384cb35082fab7 View the full build log and details: https://travis-ci.org/github/squeak-smalltalk/squeak-app/builds/731965759?utm_medium=notification&utm_source=email -- You can unsubscribe from build emails from the squeak-smalltalk/squeak-app repository going to https://travis-ci.org/account/preferences/unsubscribe?repository=8901856&utm_medium=notification&utm_source=email. Or unsubscribe from *all* email updating your settings at https://travis-ci.org/account/preferences/unsubscribe?utm_medium=notification&utm_source=email. Or configure specific recipients for build notifications in your .travis.yml file. See https://docs.travis-ci.com/user/notifications. -------------- next part -------------- An HTML attachment was scrubbed... URL: From eliot.miranda at gmail.com Thu Oct 1 17:44:46 2020 From: eliot.miranda at gmail.com (Eliot Miranda) Date: Thu, 1 Oct 2020 10:44:46 -0700 Subject: [squeak-dev] Ephemerons and Dictionaries Message-ID: Hi All, to be able to ease EphemeronDicitonary into the system easily I'd like to clean up adding associations to Dictionary. It seems to me there's a partial implementation of choosing an association class appropriate for a dictionary in the implementors of associationClass: Dictionary>>#associationClass, WeakKeyDictionary>>#associationClass, WeakValueDictionary>>#associationClass, (& in my image STON class>>#associationClass). This seems workable; an EphemeronDictionary would simply add associationClass ^ Ephemeron and we're done, except not quite... First, HashedCollection does not use associationClass, but it implements atNewIndex:put: and it strikes me that atNewIndex:put: for Dictionary really should check for the thing being added at least includingBehavior: self associationClass. So that means Dictionary should override atNewIndex:put:. But what should happen in atNewIndex:put: if the object being added isn't appropriate? Do we - raise an error? (that's my preference, but I've got limited use cases in my head) - replace the association with one of assocationClass? (seems dangerous to me but maybe someone needs this or the existing system does this anyway) - ignore it and hope the user knows what they're doing? _,,,^..^,,,_ best, Eliot -------------- next part -------------- An HTML attachment was scrubbed... URL: From Christoph.Thiede at student.hpi.uni-potsdam.de Thu Oct 1 17:51:09 2020 From: Christoph.Thiede at student.hpi.uni-potsdam.de (Thiede, Christoph) Date: Thu, 1 Oct 2020 17:51:09 +0000 Subject: [squeak-dev] Ephemerons and Dictionaries In-Reply-To: References: Message-ID: Hi Eliot, I'm not deep in this stuff, but I always try to keep maximum flexibility in terms of polymorphy when designing any interface in Squeak. Thus my naive choice would be option 3, ignore it and hope the user knows what they're doing. Using of #isKindOf: etc. often can lead to problems, for example, imagine an association being wrapped within a proxy or an ObjectTracer ... Just my 2 cents :) Best, Christoph ________________________________ Von: Squeak-dev im Auftrag von Eliot Miranda Gesendet: Donnerstag, 1. Oktober 2020 19:44:46 An: The general-purpose Squeak developers list Betreff: [squeak-dev] Ephemerons and Dictionaries Hi All, to be able to ease EphemeronDicitonary into the system easily I'd like to clean up adding associations to Dictionary. It seems to me there's a partial implementation of choosing an association class appropriate for a dictionary in the implementors of associationClass: Dictionary>>#associationClass, WeakKeyDictionary>>#associationClass, WeakValueDictionary>>#associationClass, (& in my image STON class>>#associationClass). This seems workable; an EphemeronDictionary would simply add associationClass ^ Ephemeron and we're done, except not quite... First, HashedCollection does not use associationClass, but it implements atNewIndex:put: and it strikes me that atNewIndex:put: for Dictionary really should check for the thing being added at least includingBehavior: self associationClass. So that means Dictionary should override atNewIndex:put:. But what should happen in atNewIndex:put: if the object being added isn't appropriate? Do we - raise an error? (that's my preference, but I've got limited use cases in my head) - replace the association with one of assocationClass? (seems dangerous to me but maybe someone needs this or the existing system does this anyway) - ignore it and hope the user knows what they're doing? _,,,^..^,,,_ best, Eliot -------------- next part -------------- An HTML attachment was scrubbed... URL: From eliot.miranda at gmail.com Thu Oct 1 17:57:27 2020 From: eliot.miranda at gmail.com (Eliot Miranda) Date: Thu, 1 Oct 2020 10:57:27 -0700 Subject: [squeak-dev] Ephemerons and Dictionaries In-Reply-To: References: Message-ID: Hi Christoph, On Thu, Oct 1, 2020 at 10:51 AM Thiede, Christoph < Christoph.Thiede at student.hpi.uni-potsdam.de> wrote: > Hi Eliot, > > I'm not deep in this stuff, but I always try to keep maximum flexibility > in terms of polymorphy when designing any interface in Squeak. Thus my > naive choice would be option 3, ignore it and hope the user knows what > they're doing. Using of #isKindOf: etc. often can lead to problems, for > example, imagine an association being wrapped within a proxy or an > ObjectTracer ... Just my 2 cents :) > Well, it's easy to put checking in for EphemeronDictionary, because there things really matter. (& thx for your real-time response ;-) ) In looking at the code it strikes me that arrayClass should also be implemented on the instance size to match associationClass. This affects only OrderedCollection new which sends arrayClass form the class side; all other sends are instance size. And that's easy to deal with: OrderedCollection class>>#new: anInteger ^ self basicNew setCollection: (self arrayType new: anInteger) => OrderedCollection class>>#new: anInteger | instance | ^(instance := self basicNew) setCollection: (instance arrayType new: anInteger) Any objections? > Best, > > Christoph > > ------------------------------ > *Von:* Squeak-dev im > Auftrag von Eliot Miranda > *Gesendet:* Donnerstag, 1. Oktober 2020 19:44:46 > *An:* The general-purpose Squeak developers list > *Betreff:* [squeak-dev] Ephemerons and Dictionaries > > Hi All, > > to be able to ease EphemeronDicitonary into the system easily I'd > like to clean up adding associations to Dictionary. It seems to me there's > a partial implementation of choosing an association class appropriate for a > dictionary in the implementors of > associationClass: Dictionary>>#associationClass, WeakKeyDictionary>>#associationClass, WeakValueDictionary>>#associationClass, > (& in my image STON class>>#associationClass). This seems workable; an > EphemeronDictionary would simply add associationClass ^ Ephemeron and > we're done, except not quite... > > First, HashedCollection does not use associationClass, but it implements > atNewIndex:put: and it strikes me that atNewIndex:put: for Dictionary > really should check for the thing being added at least includingBehavior: > self associationClass. So that means Dictionary should override > atNewIndex:put:. > > But what should happen in atNewIndex:put: if the object being added isn't > appropriate? Do we > - raise an error? (that's my preference, but I've got limited use cases in > my head) > - replace the association with one of assocationClass? (seems dangerous to > me but maybe someone needs this or the existing system does this anyway) > - ignore it and hope the user knows what they're doing? > > > > _,,,^..^,,,_ > best, Eliot > > -- _,,,^..^,,,_ best, Eliot -------------- next part -------------- An HTML attachment was scrubbed... URL: From gettimothy at zoho.com Thu Oct 1 18:10:35 2020 From: gettimothy at zoho.com (gettimothy) Date: Thu, 01 Oct 2020 14:10:35 -0400 Subject: [squeak-dev] "Pretty Print" collections as abstract syntax trees using plain text output In-Reply-To: References: <174e381dcff.eeb497c783798.6677692293294794906@zoho.com> Message-ID: <174e55bd5a7.c014fa865127.2243320247035478891@zoho.com> Hi Eliot ---- On Thu, 01 Oct 2020 11:07:08 -0400 Eliot Miranda wrote ---- Hi Tty, On Oct 1, 2020, at 2:33 AM, gettimothy via Squeak-dev wrote: Hi folks. Has anybody coded a way , using plain text, to output a  https://en.wikipedia.org/wiki/Abstract_syntax_tree to a workspace? It would be a handy debug tool if so. An infinitely better way would be to port the Rossal visualisation system.  I’ve talked with Alexandre and he says Rossal is designed with portability in mind (it currently runs on Pharo and BisyalWorks and predates Pharo’s current imaging model).  This would give you a graphical representation of the entire tree, with the ability to attach behaviour to elements of the representation. thx I would love too, Rossal is intriguing. IIRC , "Mr. Feenk" and the board had a thread recently about "what it would take to make Rossal work on  Squeak" and the discussion decided on waiting on everybody having a block of time to make that happen. Here is a cut-n-paste of that email, I saved it for future reference: Hi, Currently, at feenk we have feenkcom/opensmalltalk-vm: https://github.com/feenkcom/opensmalltalk-vm This is a small fork of the headless branch from pharo-project/opensmalltalk-vm that appeared out of practical necessities, but that we would like to avoid having. This post briefly describes the changes in the feenkcom/opensmalltalk-vm repo and the functionality those changes provide for Glamorous Toolkit. For Glamorous Toolkit we aimed for the following functionality:     • Open the GUI natively and have native display quality (GUI opened through FFI calls)     • Have a Glamorous Toolkit app for Mac OS that works as any other apps for Mac OS     • Create end-user applications that are fully customisable (executable name, menus, etc)     • Use Github actions for doing all compilations of external libraries and the vm instead of Travis CI.     • Have Iceberg running in native windows (which requires nested FFI callbacks) There has been work on these issues in both OpenSmalltalk/opensmalltalk-vm and pharo-project/opensmalltalk-vm but they were not entirely addressed. We needed to have something reliable a few months ago, and forking and doing some quick changes made that possible. Ideally we want to be able to run Glamorous Toolkit on both OpenSmalltalk/opensmalltalk-vm and pharo-project/opensmalltalk-vm. To have native GUIs we relied on Ronie Salgado’s work on the headless vm and started with pharo-project/opensmalltalk-vm - headless branch: https://github.com/pharo-project/opensmalltalk-vm/tree/headless That provided a solution for opening the GUI from the image through FFI calls. Currently we use Glutin (a library for OpenGL context creation, written in pure Rust) and this made it possible to run the entire Glamorous Toolkit inside a callback. On macOS when running an app, even a notarized one, the OS warns the user that the app is downloaded from the internet, and the user needs to confirm that they agree. Once the user agrees the app should automatically start. This is not currently possible with Pharo apps (for example PharoLaunched.app) and users have to again run the app manually after giving permission. Also Gatekeeper in macOS runs applications downloaded from zips in a randomized read-only DMG. We do not want this behaviour as users not copying Glamorous Toolkit to the Applications folder on macOS would then experience incorrect application behaviour. To create end-user applications we also need to fully customize the executable name (what the user sees in the Task Runner/Activity monitor), icons, native menus. Part of this work is already integrated in the pharo-project/opensmalltalk-vm - headless branch (Customizing the OS X icons, Brand the VM executable and package). Since last year Github offers Github Actions similar to Travis. We found it much easier to use than Travis for external libraries and the vm. Also we get to manage the code and the builds in the same place. This work is already integrated in the pharo-project/opensmalltalk-vm - headless branch (Build the VM under GitHub actions: https://github.com/pharo-project/opensmalltalk-vm/pull/56). The issues related to running Iceberg is a bit more technical. By moving to the headless vm we are running the entire image computation inside a callback from Glutin (https://github.com/rust-windowing/glutin/). When using Iceberg we get nested callbacks which we could not get to work using Alien. Instead we are using the ThreadedFFI Plugin and running all callback from Iceberg and Glutin using the Threaded FFI plugin (https://github.com/pharo-project/threadedFFI-Plugin). Currently we have a small fork of this plugin (feenkcom/threadedFFI-Plugin) and we also ship a custom plugin with the VM to fix a race condition due to having two copies of the callback stack (a pull request is here: https://github.com/pharo-project/threadedFFI-Plugin/pull/17). While not specific to our environment, openssl1.0 is no longer supported, and we are seeing users who are unable to run Pharo due to version conflicts, as reported in https://github.com/pharo-project/opensmalltalk-vm/issues/62. To sum up, a fork was the easiest way to get all this running. Now some changes are already in the pharo-project/opensmalltalk-vm - headless branch. What we are still missing are the changes that get the VM to work nicely with Mac OS and a bug fix in ThreadedFFI. We would also love it to have all these changes integrated in OpenSmalltalk/opensmalltalk-vm in the headless vm. This requires additional coordination as the required changes are somewhat deeper. Please let us know you would prefer to coordinate. Cheers, Tudor, on behalf of the feenk team -- feenk.com "The coherence of a trip is given by the clearness of the goal." If these things have already happened, I can push (most) other projects down the stack and take this up part-time.  Let me know. If not, I briefly looked into piping output to graphviz via OSProcess . Regardless, the tool would be invaluable in groking / debugging the PEG grammars. cheers, t -------------- next part -------------- An HTML attachment was scrubbed... URL: From eliot.miranda at gmail.com Thu Oct 1 18:24:24 2020 From: eliot.miranda at gmail.com (Eliot Miranda) Date: Thu, 1 Oct 2020 11:24:24 -0700 Subject: [squeak-dev] "Pretty Print" collections as abstract syntax trees using plain text output In-Reply-To: <174e55bd5a7.c014fa865127.2243320247035478891@zoho.com> References: <174e381dcff.eeb497c783798.6677692293294794906@zoho.com> <174e55bd5a7.c014fa865127.2243320247035478891@zoho.com> Message-ID: Hi t, On Thu, Oct 1, 2020 at 11:11 AM gettimothy wrote: > Hi Eliot > > > ---- On Thu, 01 Oct 2020 11:07:08 -0400 *Eliot Miranda > >* wrote ---- > > Hi Tty, > > On Oct 1, 2020, at 2:33 AM, gettimothy via Squeak-dev < > squeak-dev at lists.squeakfoundation.org> wrote: > >  > Hi folks. > > Has anybody coded a way , using plain text, to output a > > https://en.wikipedia.org/wiki/Abstract_syntax_tree > > to a workspace? > > It would be a handy debug tool if so. > > > An infinitely better way would be to port the Rossal visualisation > system. I’ve talked with Alexandre and he says Rossal is designed with > portability in mind (it currently runs on Pharo and BisyalWorks and > predates Pharo’s current imaging model). This would give you a graphical > representation of the entire tree, with the ability to attach behaviour to > elements of the representation. > > thx > > I would love too, Rossal is intriguing. > > IIRC , "Mr. Feenk" and the board had a thread recently about "what it > would take to make Rossal work on Squeak" and the discussion decided on > waiting on everybody having a block of time to make that happen. > I don't see any mention of Rossal in the below. What's the linkage between feek's use of either opensmalltalk-vm or Pharo's fork of it? > > Here is a cut-n-paste of that email, I saved it for future reference: > > Hi, > > Currently, at feenk we have feenkcom/opensmalltalk-vm: > https://github.com/feenkcom/opensmalltalk-vm > > This is a small fork of the headless branch from > pharo-project/opensmalltalk-vm that appeared out of practical necessities, > but that we would like to avoid having. This post briefly describes the > changes in the feenkcom/opensmalltalk-vm repo and the functionality those > changes provide for Glamorous Toolkit. > > For Glamorous Toolkit we aimed for the following functionality: > • Open the GUI natively and have native display quality (GUI opened > through FFI calls) > • Have a Glamorous Toolkit app for Mac OS that works as any other apps > for Mac OS > • Create end-user applications that are fully customisable (executable > name, menus, etc) > • Use Github actions for doing all compilations of external libraries > and the vm instead of Travis CI. > • Have Iceberg running in native windows (which requires nested FFI > callbacks) > > There has been work on these issues in both OpenSmalltalk/opensmalltalk-vm > and pharo-project/opensmalltalk-vm but they were not entirely addressed. We > needed to have something reliable a few months ago, and forking and doing > some quick changes made that possible. > > Ideally we want to be able to run Glamorous Toolkit on both > OpenSmalltalk/opensmalltalk-vm and pharo-project/opensmalltalk-vm. > > To have native GUIs we relied on Ronie Salgado’s work on the headless vm > and started with pharo-project/opensmalltalk-vm - headless branch: > https://github.com/pharo-project/opensmalltalk-vm/tree/headless > That provided a solution for opening the GUI from the image through FFI > calls. Currently we use Glutin (a library for OpenGL context creation, > written in pure Rust) and this made it possible to run the entire Glamorous > Toolkit inside a callback. > > On macOS when running an app, even a notarized one, the OS warns the user > that the app is downloaded from the internet, and the user needs to confirm > that they agree. Once the user agrees the app should automatically start. > This is not currently possible with Pharo apps (for example > PharoLaunched.app) and users have to again run the app manually after > giving permission. Also Gatekeeper in macOS runs applications downloaded > from zips in a randomized read-only DMG. We do not want this behaviour as > users not copying Glamorous Toolkit to the Applications folder on macOS > would then experience incorrect application behaviour. > > To create end-user applications we also need to fully customize the > executable name (what the user sees in the Task Runner/Activity monitor), > icons, native menus. Part of this work is already integrated in the > pharo-project/opensmalltalk-vm - headless branch (Customizing the OS X > icons, Brand the VM executable and package). > > Since last year Github offers Github Actions similar to Travis. We found > it much easier to use than Travis for external libraries and the vm. Also > we get to manage the code and the builds in the same place. This work is > already integrated in the pharo-project/opensmalltalk-vm - headless branch > (Build the VM under GitHub actions: > https://github.com/pharo-project/opensmalltalk-vm/pull/56). > > The issues related to running Iceberg is a bit more technical. By moving > to the headless vm we are running the entire image computation inside a > callback from Glutin (https://github.com/rust-windowing/glutin/). When > using Iceberg we get nested callbacks which we could not get to work using > Alien. Instead we are using the ThreadedFFI Plugin and running all callback > from Iceberg and Glutin using the Threaded FFI plugin ( > https://github.com/pharo-project/threadedFFI-Plugin). Currently we have a > small fork of this plugin (feenkcom/threadedFFI-Plugin) and we also ship a > custom plugin with the VM to fix a race condition due to having two copies > of the callback stack (a pull request is here: > https://github.com/pharo-project/threadedFFI-Plugin/pull/17). > > While not specific to our environment, openssl1.0 is no longer supported, > and we are seeing users who are unable to run Pharo due to version > conflicts, as reported in > https://github.com/pharo-project/opensmalltalk-vm/issues/62. > > > To sum up, a fork was the easiest way to get all this running. Now some > changes are already in the pharo-project/opensmalltalk-vm - headless > branch. What we are still missing are the changes that get the VM to work > nicely with Mac OS and a bug fix in ThreadedFFI. > > We would also love it to have all these changes integrated in > OpenSmalltalk/opensmalltalk-vm in the headless vm. This requires additional > coordination as the required changes are somewhat deeper. > > > Please let us know you would prefer to coordinate. > > > Cheers, > Tudor, on behalf of the feenk team > > -- > feenk.com > > "The coherence of a trip is given by the clearness of the goal." > > > If these things have already happened, I can push (most) other projects > down the stack and take this up part-time. Let me know. > Wow, that's quite an offer. I wish I could devote time to this, and probably won't be able to stay away once it starts, but for the moment I have other commitments precluding joining in this effort. > If not, I briefly looked into piping output to graphviz via OSProcess . > > Regardless, the tool would be invaluable in groking / debugging the PEG > grammars. > > > cheers, > > t > _,,,^..^,,,_ best, Eliot -------------- next part -------------- An HTML attachment was scrubbed... URL: From eliot.miranda at gmail.com Thu Oct 1 18:33:08 2020 From: eliot.miranda at gmail.com (Eliot Miranda) Date: Thu, 1 Oct 2020 11:33:08 -0700 Subject: [squeak-dev] Can we make computing the local variables in the debugger lazy? In-Reply-To: References: <9da5acf36e3b4c77bcf4af677adca40b@student.hpi.uni-potsdam.de> Message-ID: Hi Christoph, On Wed, Sep 30, 2020 at 2:27 AM Thiede, Christoph < Christoph.Thiede at student.hpi.uni-potsdam.de> wrote: > Hi Eliot, > > > > Can you point me to where in ContextInspector the emphasis for the temp > vars is chosen? > > > By convention, inspector fields are defined in the category "fields - > streaming". So you are probably searching for ContextInspector >> #streamTemporaryVariablesOn: > or ContextVariablesInspector >> #streamTemporaryVariablesOn:? > I found this code; I don't see any text emphasis going on. Where is the code that turns temp variables red when they're out of scope? Marcel? Looking forward to your optimization! :-) > > > Best, > > Christoph > > ------------------------------ > *Von:* Squeak-dev im > Auftrag von Eliot Miranda > *Gesendet:* Mittwoch, 30. September 2020 09:09:27 > *An:* The general-purpose Squeak developers list > *Betreff:* Re: [squeak-dev] Can we make computing the local variables in > the debugger lazy? > > Hi Marcel, > > On Tue, Sep 29, 2020 at 1:07 AM Marcel Taeumel > wrote: > >> Hi Eliot, hi all! >> >> I fixed the issue with Tools-mt.989. The logic was already there in >> #runUntil. >> > > Can you point me to where in ContextInspector the emphasis for the temp > vars is chosen? I want to modify ContextInspector to cache the temp names > for a given method because I believe this will speed up stepping a lot. > However I couldn't find where the emphasis is applied so I'm worried that > my cache may break something. If I can see where that is being done I have > a better chance at avoiding breaking things. > > >> Best, >> Marcel >> >> Am 19.09.2020 23:00:33 schrieb Levente Uzonyi : >> Hi Christoph, >> >> On Sat, 19 Sep 2020, Thiede, Christoph wrote: >> >> > >> > Hi Eliot, >> > >> > >> > very nice finding once again! I #timeProfile'd the menu button action >> and as I expected, the most expensive operation is the shout styling by the >> new inspectors, including the decompilation of every method: >> >> What was it exactly that you profiled? >> >> The screenshot shows that 76.9% was spent in >> #initializeVariablesFromContext, >> of which 52.5% of the time was spent in CompiledMethod(CompiledCode) >> >> #getSource. The rest of the tree is not visible, but these methods have >> nothing to do with parsing or styling, they initialize the parser and >> normally should take <1 ms. >> >> Also, why is the decompiler producing the source code? >> >> > >> > >> > [IMAGE] >> > >> > >> > First, when loading ShoutCore-ct.78 (Inbox), the speed doubles (but >> probably that's rather a problem with my sources file, see the thread about >> this commit). >> >> You may want to try compiling a VM where FilePlugin's CreateFile does not >> set the FILE_FLAG_SEQUENTIAL_SCAN flag, and see if it helps with file >> reading performance. >> >> >> Levente >> >> > >> > Second, we do not redraw the world while running to the selection, so >> we do not need to update the inspectors at all. I think we could split up >> #doStep into some #basicDoStep (which would perform the actual stepping >> logic) + >> > some #updateContextDuring: (which would update the stack list and the >> inspectors), then we would need to trigger the updates only once from >> #runToSelection:. >> > As an alternative, we could make this method a bit more complex but >> responsive by applying the same updating logic from #runUntil. >> > >> > What do you think? :-) >> > >> > Best, >> > Christoph >> > >> > >> _________________________________________________________________________________________________________________________________________________________________________________________________________________________________ >> >> > Von: Squeak-dev im Auftrag von Eliot Miranda >> > Gesendet: Samstag, 19. September 2020 20:17:12 >> > An: The general-purpose Squeak developers list; Taeumel, Marcel >> > Betreff: [squeak-dev] Can we make computing the local variables in the >> debugger lazy? >> > Hi Marcel, >> > >> > can we try and reduce the frequency at which we compute the >> variables in the context inspector in the debugger? It is a noticeable >> performance hit. I really like the user interface, but the performance hit >> is making >> > debugging difficult. >> > >> > As an example use this: >> > >> > | samples sineTable sound | >> > "1 second of A below middle C (220Hz). 16000 / 220 is 72.72 recurring" >> > sineTable := SoundPlayer sineTable: 73. >> > sineTable doWithIndex: "And let's not deafen anyone..." >> > [:sample :index| sineTable at: index put: sample // 4]. >> > samples := SoundBuffer new: 16000. >> > 1 to: samples size by: sineTable size do: >> > [:i| samples replaceFrom: i to: (i + sineTable size - 1 min: 16000) >> with: sineTable startingAt: 1]. >> > 1 to: 146 do: >> > [:i| >> > samples at: i put: ((samples at: i) * i / 146) asInteger. >> > samples at: 16001 - i put: ((samples at: 16001 - i) * i / 146) >> asInteger]. >> > sound := SampledSound >> > samples: samples >> > samplingRate: 16000. >> > sound := MixedSound new >> > add: sound pan: 0.25; >> > add: sound pan: 0.75; >> > yourself. >> > sound computeSamplesForSeconds: sound duration >> > >> > >> > Open a workspace in e.g. a 64-bit image prior to Tools-mt.965 (I used >> an image containing Tools-mt.942). Debug the above in the workspace. >> Position the cursor at "sound computeSamplesForSeconds: sound duration" and >> do "run >> > to here". It is essentially instantaneous. >> > >> > Now do the same in a contemporary trunk image. It takes almost 6 >> seconds. >> > >> > I used to be able to click step as fast as I could and the system would >> keep up with me. Now I find that if I click too fast I can accumulate >> excess clicks and when I stp clicking the system will continue stepping and >> go too >> > far. >> > >> > I don't want to lose the feedback the new variables list gives us. But >> I do find the performance hit tedious. I wonder could we cache the list >> and only update it >> > - when Morphic updates, and >> > - when the context changes? >> > >> > >> > _,,,^..^,,,_ >> > best, Eliot >> > >> > >> >> >> > > -- > _,,,^..^,,,_ > best, Eliot > > -- _,,,^..^,,,_ best, Eliot -------------- next part -------------- An HTML attachment was scrubbed... URL: From eliot.miranda at gmail.com Thu Oct 1 18:40:16 2020 From: eliot.miranda at gmail.com (Eliot Miranda) Date: Thu, 1 Oct 2020 11:40:16 -0700 Subject: [squeak-dev] Can Kernel-ct.1321 be merged into trunk now? (was: Why is ModificationForbidden not an Error?) In-Reply-To: <20200930195906.GA75715@shell.msen.com> References: <7cdc2ad647ff4d67bc0cc0aec6a184ea@student.hpi.uni-potsdam.de> <20200930172630.GA50082@shell.msen.com> <20200930195906.GA75715@shell.msen.com> Message-ID: On Wed, Sep 30, 2020 at 12:59 PM David T. Lewis wrote: > Changing the subject line to ask the question directly. > > Can Kernel-ct.1321 be merged into trunk now? > I have no objection. > > See below and prior discussions. > > Thanks, > Dave > > > On Wed, Sep 30, 2020 at 05:29:43PM +0000, Thiede, Christoph wrote: > > > I think there was an inbox submission a while back that could be > merged. > > > > > > Here it is: Kernel-ct.1321< > http://forum.world.st/The-Inbox-Kernel-ct-1321-mcz-td5114734.html> ???? > > > > > > Best, > > > > Christoph > > > > ________________________________ > > Von: Squeak-dev im > Auftrag von David T. Lewis > > Gesendet: Mittwoch, 30. September 2020 19:26:30 > > An: The general-purpose Squeak developers list > > Betreff: Re: [squeak-dev] Why is ModificationForbidden not an Error? > > > > I am not involved in this discussion, but if I understand the > conversation > > there is no longer any disagreement about what needs to be done, so we > > just need to make it happen in trunk. I think there was an inbox > submission > > a while back that could be merged. > > > > +1000 for bringing this issue to a resolution, and thanks Christoph for > > moving it forward. > > > > Dave > > > > On Wed, Sep 30, 2020 at 05:43:57AM -0700, Eliot Miranda wrote: > > > > > > > > > > On Sep 30, 2020, at 3:48 AM, Thiede, Christoph < > Christoph.Thiede at student.hpi.uni-potsdam.de> wrote: > > > > > > > > ??? > > > > Alright, anyone having any new opinion about this? Let's make a > decision! :-) > > > > > > > > > > > > > I don???t see how it can be other than an error. If one attempts to > modify a literal that is an error. If one attempts to modify a read-only > object then that is an error, unless some smart system is overloading > read-only-ness to implement a read barrier. > > > > > > > Best, > > > > > > > > Christoph > > > > > > > > Von: Chris Muller > > > > Gesendet: Donnerstag, 24. September 2020 21:33:27 > > > > An: The general-purpose Squeak developers list; Thiede, Christoph > > > > Betreff: Re: [squeak-dev] Why is ModificationForbidden not an Error? > > > > > > > > Hi Christoph, > > > > > > > > Magma does not depend on ModificationForbidden. My participation in > this discussion was merely for my own learning, to try to overcome my > skepticism about ModificationForbidden. Changing its superclass shouldn't > affect Magma at all. Whether Magma will be able to make use of it is still > up in the air. Please feel free to integrate what you and the other folks > interested in this decide is best. > > > > > > > > Thanks! > > > > Chris > > > > > > > >> On Thu, Sep 24, 2020 at 4:09 AM Christoph Thiede < > christoph.thiede at student.hpi.uni-potsdam.de> wrote: > > > >> Hi Chris, hi all, > > > >> > > > >> after months of stagnation, I'd like to bring up this open > discussion again. > > > >> IMO the current situation in the Trunk is still buggy and the last > thing we > > > >> want developers to have to care about. For example, I recently > crashed a > > > >> number of smalltalkCI builds again because some method raised a > > > >> ModificationForbidden, which the test runner, obviously, was not > prepared > > > >> for ... > > > > > > This makes no sense to me. Test runners collect tests that error just > as they collect tests that assert fail. Why would a ModificationForbidden > Another be considered an error? > > > > > > > > > > > > >> From what I can see, the only problem with my proposal that resists > still in > > > >> the inbox, Kernel-ct.1321, is related to Chris' Magma > implementation. I want > > > >> to respect this use case (and actually, learning a bit more about > Magma is > > > >> already on my long, long list of nice-to-do stuff), but I have to > agree with > > > >> other people saying that ModificationForbidden is a very low-level > error and > > > >> should not need any special treatment. For this reason, I also > think that > > > >> Marcel's changeset is a bit over-engineered for the Trunk, given the > > > >> particular fact that we do not have plans for any user of > ManagedObjects in > > > >> the Trunk. > > > >> > > > >> Chris, did anything happen on your end regarding the handling of > > > >> ModificationForbidden in Magma? Iirc you mentioned recently that > you have > > > >> reached some kind of feature completeness in your project. Can't we > just > > > >> merge Kernel-ct.1321 for now and resolve this discussion until some > new use > > > >> case arises? For Magma as an external project (still without being > familiar > > > >> at all with its design), I don't understand what would be wrong with > > > >> handling such exceptions using #on:do:, this would totally suffice > to > > > >> circumvent the #defaultAction implementation. If you do not have the > > > >> possibility to install an exception handler or a ToolSet, you could > still > > > >> place an extension override method in ModificationForbidden and > > > >> (conditionally) inject your custom handling logic there. > > > >> > > > >> What do you think? I would like to finally get ahead with this > issue! :-) > > > > > > I don???t want yo build something that is incompatible with gemstone. > Currently we don???t have their attention; Ogaro had thrrr attention. So > we have to do the work of ensuring that ModificationForbidden supports the > Gemstone use case; it???s a very very important one. on:do: is completely > inadequate for this. One needs a system wide exception handler where any > ModificationForbidden is routed through a manager that is able to identify > that the object in question is in fact being mapped to a database (or a > remote system, or a breakout ring system etc). But on:do: handlers are for > specific flows of control (currently within a single thread) and cannot > serve as system wide handlers. > > > > > > Here???s a simplified use case. The programmer wants to be able to > trace wherever in the system an object is modified. It may occur in > arbitrary processes, not just in the current flow of control. To do this > efficiently the programmer uses ModificationForbidden to catch a > modification, log it, make the object readable, effect the modification, > make the object read-only again and proceed. This *cannot* be done with an > on:do: handler. > > > > > > >> > > > >> Best, > > > >> Christoph > > > >> > > > >> > > > >> > > > >> -- > > > >> Sent from: http://forum.world.st/Squeak-Dev-f45488.html > > > >> > > > > > > > > > > > > > > > > > > > -- _,,,^..^,,,_ best, Eliot -------------- next part -------------- An HTML attachment was scrubbed... URL: From leves at caesar.elte.hu Thu Oct 1 18:41:08 2020 From: leves at caesar.elte.hu (Levente Uzonyi) Date: Thu, 1 Oct 2020 20:41:08 +0200 (CEST) Subject: [squeak-dev] Ephemerons and Dictionaries In-Reply-To: References: Message-ID: Hi Eliot, On Thu, 1 Oct 2020, Eliot Miranda wrote: > Hi All, > >     to be able to ease EphemeronDicitonary into the system easily I'd like to clean up adding associations to Dictionary.  It seems to me there's a partial implementation of choosing an association class appropriate for a > dictionary in the implementors of associationClass: Dictionary>>#associationClass, WeakKeyDictionary>>#associationClass, WeakValueDictionary>>#associationClass, (& in my image STON class>>#associationClass).  This seems > workable; an EphemeronDictionary would simply add associationClass ^ Ephemeron and we're done, except not quite... What's the definition of Ephemeron? > > First, HashedCollection does not use associationClass, but it implements atNewIndex:put: and it strikes me that atNewIndex:put: for Dictionary really should check for the thing being added at least includingBehavior: self HashedCollection does not use associationClass because HashedCollections in general (e.g. Sets) may store any object in their internal array not just Associations. Dictionary introduces #associationClass because it only stores associations (except for MethodDictionary of course). #atNewIndex:put: is a private method. Its senders must ensure that the arguments will not corrupt the receiver's internal state > associationClass.  So that means Dictionary should override atNewIndex:put:. Can you give a bit more information about how EphemeronDictionary should work? Levente > > But what should happen in atNewIndex:put: if the object being added isn't appropriate?  Do we > - raise an error? (that's my preference, but I've got limited use cases in my head) > - replace the association with one of assocationClass? (seems dangerous to me but maybe someone needs this or the existing system does this anyway) > - ignore it and hope the user knows what they're doing? > > > > _,,,^..^,,,_ > best, Eliot > > From gettimothy at zoho.com Thu Oct 1 18:47:07 2020 From: gettimothy at zoho.com (gettimothy) Date: Thu, 01 Oct 2020 14:47:07 -0400 Subject: [squeak-dev] "Pretty Print" collections as abstract syntax trees using plain text output In-Reply-To: References: <174e381dcff.eeb497c783798.6677692293294794906@zoho.com> <174e55bd5a7.c014fa865127.2243320247035478891@zoho.com> Message-ID: <174e57d48d9.baa6934d5684.7800204521222000565@zoho.com> Hi Eiliot, re:  I don't see any mention of Rossal in the below.  What's the linkage between feek's use of either opensmalltalk-vm or Pharo's fork of it? IIRC Glamorous Toolkit  and Rossal are related; perhaps I have conflated the two. at  https://feenk.com/gt/ you can see the tree graphs I have in mind. ---- On Thu, 01 Oct 2020 14:24:24 -0400 Eliot Miranda wrote ---- Hi t, On Thu, Oct 1, 2020 at 11:11 AM gettimothy wrote: Hi Eliot ---- On Thu, 01 Oct 2020 11:07:08 -0400 Eliot Miranda wrote ---- Hi Tty,I don't see any mention of Rossal in the below.  What's the linkage between feek's use of either opensmalltalk-vm or Pharo's fork of it? On Oct 1, 2020, at 2:33 AM, gettimothy via Squeak-dev wrote: Hi folks. Has anybody coded a way , using plain text, to output a  https://en.wikipedia.org/wiki/Abstract_syntax_tree to a workspace? It would be a handy debug tool if so. An infinitely better way would be to port the Rossal visualisation system.  I’ve talked with Alexandre and he says Rossal is designed with portability in mind (it currently runs on Pharo and BisyalWorks and predates Pharo’s current imaging model).  This would give you a graphical representation of the entire tree, with the ability to attach behaviour to elements of the representation. thx I would love too, Rossal is intriguing. IIRC , "Mr. Feenk" and the board had a thread recently about "what it would take to make Rossal work on  Squeak" and the discussion decided on waiting on everybody having a block of time to make that happen. I don't see any mention of Rossal in the below.  What's the linkage between feek's use of either opensmalltalk-vm or Pharo's fork of it? Here is a cut-n-paste of that email, I saved it for future reference: Hi, Currently, at feenk we have feenkcom/opensmalltalk-vm: https://github.com/feenkcom/opensmalltalk-vm This is a small fork of the headless branch from pharo-project/opensmalltalk-vm that appeared out of practical necessities, but that we would like to avoid having. This post briefly describes the changes in the feenkcom/opensmalltalk-vm repo and the functionality those changes provide for Glamorous Toolkit. For Glamorous Toolkit we aimed for the following functionality:     • Open the GUI natively and have native display quality (GUI opened through FFI calls)     • Have a Glamorous Toolkit app for Mac OS that works as any other apps for Mac OS     • Create end-user applications that are fully customisable (executable name, menus, etc)     • Use Github actions for doing all compilations of external libraries and the vm instead of Travis CI.     • Have Iceberg running in native windows (which requires nested FFI callbacks) There has been work on these issues in both OpenSmalltalk/opensmalltalk-vm and pharo-project/opensmalltalk-vm but they were not entirely addressed. We needed to have something reliable a few months ago, and forking and doing some quick changes made that possible. Ideally we want to be able to run Glamorous Toolkit on both OpenSmalltalk/opensmalltalk-vm and pharo-project/opensmalltalk-vm. To have native GUIs we relied on Ronie Salgado’s work on the headless vm and started with pharo-project/opensmalltalk-vm - headless branch: https://github.com/pharo-project/opensmalltalk-vm/tree/headless That provided a solution for opening the GUI from the image through FFI calls. Currently we use Glutin (a library for OpenGL context creation, written in pure Rust) and this made it possible to run the entire Glamorous Toolkit inside a callback. On macOS when running an app, even a notarized one, the OS warns the user that the app is downloaded from the internet, and the user needs to confirm that they agree. Once the user agrees the app should automatically start. This is not currently possible with Pharo apps (for example PharoLaunched.app) and users have to again run the app manually after giving permission. Also Gatekeeper in macOS runs applications downloaded from zips in a randomized read-only DMG. We do not want this behaviour as users not copying Glamorous Toolkit to the Applications folder on macOS would then experience incorrect application behaviour. To create end-user applications we also need to fully customize the executable name (what the user sees in the Task Runner/Activity monitor), icons, native menus. Part of this work is already integrated in the pharo-project/opensmalltalk-vm - headless branch (Customizing the OS X icons, Brand the VM executable and package). Since last year Github offers Github Actions similar to Travis. We found it much easier to use than Travis for external libraries and the vm. Also we get to manage the code and the builds in the same place. This work is already integrated in the pharo-project/opensmalltalk-vm - headless branch (Build the VM under GitHub actions: https://github.com/pharo-project/opensmalltalk-vm/pull/56). The issues related to running Iceberg is a bit more technical. By moving to the headless vm we are running the entire image computation inside a callback from Glutin (https://github.com/rust-windowing/glutin/). When using Iceberg we get nested callbacks which we could not get to work using Alien. Instead we are using the ThreadedFFI Plugin and running all callback from Iceberg and Glutin using the Threaded FFI plugin (https://github.com/pharo-project/threadedFFI-Plugin). Currently we have a small fork of this plugin (feenkcom/threadedFFI-Plugin) and we also ship a custom plugin with the VM to fix a race condition due to having two copies of the callback stack (a pull request is here: https://github.com/pharo-project/threadedFFI-Plugin/pull/17). While not specific to our environment, openssl1.0 is no longer supported, and we are seeing users who are unable to run Pharo due to version conflicts, as reported in https://github.com/pharo-project/opensmalltalk-vm/issues/62. To sum up, a fork was the easiest way to get all this running. Now some changes are already in the pharo-project/opensmalltalk-vm - headless branch. What we are still missing are the changes that get the VM to work nicely with Mac OS and a bug fix in ThreadedFFI. We would also love it to have all these changes integrated in OpenSmalltalk/opensmalltalk-vm in the headless vm. This requires additional coordination as the required changes are somewhat deeper. Please let us know you would prefer to coordinate. Cheers, Tudor, on behalf of the feenk team -- http://feenk.com "The coherence of a trip is given by the clearness of the goal." If these things have already happened, I can push (most) other projects down the stack and take this up part-time.  Let me know. Wow, that's quite an offer.  I wish I could devote time to this, and probably won't be able to stay away once it starts, but for the moment I have other commitments precluding joining in this effort.  If not, I briefly looked into piping output to graphviz via OSProcess . Regardless, the tool would be invaluable in groking / debugging the PEG grammars. cheers, t _,,,^..^,,,_ best, Eliot -------------- next part -------------- An HTML attachment was scrubbed... URL: From gettimothy at zoho.com Thu Oct 1 19:07:39 2020 From: gettimothy at zoho.com (gettimothy) Date: Thu, 01 Oct 2020 15:07:39 -0400 Subject: [squeak-dev] "Pretty Print" collections as abstract syntax trees using plain text output In-Reply-To: <206F1D13-8CFB-480E-9B30-360098CA18C3@me.com> References: <174e381dcff.eeb497c783798.6677692293294794906@zoho.com> <174e55bd5a7.c014fa865127.2243320247035478891@zoho.com> <206F1D13-8CFB-480E-9B30-360098CA18C3@me.com> Message-ID: <174e5901608.111ed99f05991.6344275301836851674@zoho.com> Hi It appears that I have Roassal and Glamorous Toolkit conflated. Roassal http://agilevisualization.com/ vs. Glamourous Toolkit https://feenk.com/gt/ They both make pretty graphs! heh..funny how the "todo stack" keeps growing. both are intriguing. ---- On Thu, 01 Oct 2020 14:36:02 -0400 Alexandre Bergel wrote ---- Hi! The email seems to discuss more about the VM extension. Roassal is a pure software solution.I would love to see Roassal running on Squeak and other Smalltalks. Cheers, Alexandre --  _,.;:~^~:;._,.;:~^~:;._,.;:~^~:;._,.;:~^~:;._,.;: Alexandre Bergel  http://www.bergel.eu ^~:;._,.;:~^~:;._,.;:~^~:;._,.;:~^~:;._,.;:~^~:;. On 01-10-2020, at 15:24, Eliot Miranda wrote: Hi t, On Thu, Oct 1, 2020 at 11:11 AM gettimothy wrote: Hi Eliot ---- On Thu, 01 Oct 2020 11:07:08 -0400 Eliot Miranda wrote ---- Hi Tty, On Oct 1, 2020, at 2:33 AM, gettimothy via Squeak-dev wrote: Hi folks. Has anybody coded a way , using plain text, to output a  https://en.wikipedia.org/wiki/Abstract_syntax_tree to a workspace? It would be a handy debug tool if so. An infinitely better way would be to port the Rossal visualisation system.  I’ve talked with Alexandre and he says Rossal is designed with portability in mind (it currently runs on Pharo and BisyalWorks and predates Pharo’s current imaging model).  This would give you a graphical representation of the entire tree, with the ability to attach behaviour to elements of the representation.http://agilevisualization.com/ thx I would love too, Rossal is intriguing. IIRC , "Mr. Feenk" and the board had a thread recently about "what it would take to make Rossal work on  Squeak" and the discussion decided on waiting on everybody having a block of time to make that happen. I don't see any mention of Rossal in the below.  What's the linkage between feek's use of either opensmalltalk-vm or Pharo's fork of it? Here is a cut-n-paste of that email, I saved it for future reference: Hi, Currently, at feenk we have feenkcom/opensmalltalk-vm: https://github.com/feenkcom/opensmalltalk-vm This is a small fork of the headless branch from pharo-project/opensmalltalk-vm that appeared out of practical necessities, but that we would like to avoid having. This post briefly describes the changes in the feenkcom/opensmalltalk-vm repo and the functionality those changes provide for Glamorous Toolkit. For Glamorous Toolkit we aimed for the following functionality:     • Open the GUI natively and have native display quality (GUI opened through FFI calls)     • Have a Glamorous Toolkit app for Mac OS that works as any other apps for Mac OS     • Create end-user applications that are fully customisable (executable name, menus, etc)     • Use Github actions for doing all compilations of external libraries and the vm instead of Travis CI.     • Have Iceberg running in native windows (which requires nested FFI callbacks) There has been work on these issues in both OpenSmalltalk/opensmalltalk-vm and pharo-project/opensmalltalk-vm but they were not entirely addressed. We needed to have something reliable a few months ago, and forking and doing some quick changes made that possible. Ideally we want to be able to run Glamorous Toolkit on both OpenSmalltalk/opensmalltalk-vm and pharo-project/opensmalltalk-vm. To have native GUIs we relied on Ronie Salgado’s work on the headless vm and started with pharo-project/opensmalltalk-vm - headless branch: https://github.com/pharo-project/opensmalltalk-vm/tree/headless That provided a solution for opening the GUI from the image through FFI calls. Currently we use Glutin (a library for OpenGL context creation, written in pure Rust) and this made it possible to run the entire Glamorous Toolkit inside a callback. On macOS when running an app, even a notarized one, the OS warns the user that the app is downloaded from the internet, and the user needs to confirm that they agree. Once the user agrees the app should automatically start. This is not currently possible with Pharo apps (for example PharoLaunched.app) and users have to again run the app manually after giving permission. Also Gatekeeper in macOS runs applications downloaded from zips in a randomized read-only DMG. We do not want this behaviour as users not copying Glamorous Toolkit to the Applications folder on macOS would then experience incorrect application behaviour. To create end-user applications we also need to fully customize the executable name (what the user sees in the Task Runner/Activity monitor), icons, native menus. Part of this work is already integrated in the pharo-project/opensmalltalk-vm - headless branch (Customizing the OS X icons, Brand the VM executable and package). Since last year Github offers Github Actions similar to Travis. We found it much easier to use than Travis for external libraries and the vm. Also we get to manage the code and the builds in the same place. This work is already integrated in the pharo-project/opensmalltalk-vm - headless branch (Build the VM under GitHub actions: https://github.com/pharo-project/opensmalltalk-vm/pull/56). The issues related to running Iceberg is a bit more technical. By moving to the headless vm we are running the entire image computation inside a callback from Glutin (https://github.com/rust-windowing/glutin/). When using Iceberg we get nested callbacks which we could not get to work using Alien. Instead we are using the ThreadedFFI Plugin and running all callback from Iceberg and Glutin using the Threaded FFI plugin (https://github.com/pharo-project/threadedFFI-Plugin). Currently we have a small fork of this plugin (feenkcom/threadedFFI-Plugin) and we also ship a custom plugin with the VM to fix a race condition due to having two copies of the callback stack (a pull request is here: https://github.com/pharo-project/threadedFFI-Plugin/pull/17). While not specific to our environment, openssl1.0 is no longer supported, and we are seeing users who are unable to run Pharo due to version conflicts, as reported in https://github.com/pharo-project/opensmalltalk-vm/issues/62. To sum up, a fork was the easiest way to get all this running. Now some changes are already in the pharo-project/opensmalltalk-vm - headless branch. What we are still missing are the changes that get the VM to work nicely with Mac OS and a bug fix in ThreadedFFI. We would also love it to have all these changes integrated in OpenSmalltalk/opensmalltalk-vm in the headless vm. This requires additional coordination as the required changes are somewhat deeper. Please let us know you would prefer to coordinate. Cheers, Tudor, on behalf of the feenk team -- http://feenk.com/ "The coherence of a trip is given by the clearness of the goal." If these things have already happened, I can push (most) other projects down the stack and take this up part-time.  Let me know. Wow, that's quite an offer.  I wish I could devote time to this, and probably won't be able to stay away once it starts, but for the moment I have other commitments precluding joining in this effort.  If not, I briefly looked into piping output to graphviz via OSProcess . Regardless, the tool would be invaluable in groking / debugging the PEG grammars. cheers, t _,,,^..^,,,_ best, Eliot -------------- next part -------------- An HTML attachment was scrubbed... URL: From Christoph.Thiede at student.hpi.uni-potsdam.de Thu Oct 1 19:13:27 2020 From: Christoph.Thiede at student.hpi.uni-potsdam.de (Thiede, Christoph) Date: Thu, 1 Oct 2020 19:13:27 +0000 Subject: [squeak-dev] How to find unclosed file handles in Squeak? Message-ID: <0e02c9399ba14d8cb789e9580eb62d39@student.hpi.uni-potsdam.de> Simple question, probably we already have a helper method for it, but I did not found any yet: Often, way too often, I encounter some old code (or some stupid code written by myself) that uses #readStream to read a file and forgets to close it again. Apart from the fact that #readStream is a quite dangerous selector, I wish I could find these unclosed file streams and close them manually without restarting my entire image. Is there any quick way to do this? "Smalltalk snapshot: false andQuit: false" does not seem to do the trick, and I would prefer a less brutal approach. Something like "Utilities exploreUnclosedFileStreams" would be perfect ... Best, Christoph -------------- next part -------------- An HTML attachment was scrubbed... URL: From eliot.miranda at gmail.com Thu Oct 1 19:17:37 2020 From: eliot.miranda at gmail.com (Eliot Miranda) Date: Thu, 1 Oct 2020 12:17:37 -0700 Subject: [squeak-dev] Ephemerons and Dictionaries In-Reply-To: References: Message-ID: On Thu, Oct 1, 2020 at 11:41 AM Levente Uzonyi wrote: > Hi Eliot, > > On Thu, 1 Oct 2020, Eliot Miranda wrote: > > > Hi All, > > > > to be able to ease EphemeronDicitonary into the system easily I'd > like to clean up adding associations to Dictionary. It seems to me there's > a partial implementation of choosing an association class appropriate for a > > dictionary in the implementors of > associationClass: Dictionary>>#associationClass, WeakKeyDictionary>>#associationClass, WeakValueDictionary>>#associationClass, > (& in my image STON class>>#associationClass). This seems > > workable; an EphemeronDictionary would simply add associationClass ^ > Ephemeron and we're done, except not quite... > > What's the definition of Ephemeron? > An Ephemeron is an association known to the garbage collection system., allowing it to function as a pre-mortem finalizer. A Ephemeron is intended for uses such as associating an object's dependents with an object without preventing garbage collection. Consider a traditional implementation of dependents in non-Model classes. There is a Dictionary in Object, DependentsFields. Objects wishing to have dependents are entered as keys in DependentsFields and the value is a sequence of their dependents. Since their dependents (if they are like views/morphs, etc in MVC) will refer directly to the key object (in their model inst var etc), there is no way to use weak collections in DependentsFields to allow the cycle of an object and its dependents to be collected. If DependentsFields uses a WeakArray to hold the associations from objects to their dependents then those associations, and the dependencies with it will simply be lost since the only reference to the associations is in DependentsFields. Ephemeron differs from a normal association in that it is known to the garbage collector and it is involved in tracing. First, note that an Ephemeron is a *strong* referrer. The objects it refers to cannot be garbage collected. It is not weak. But it is able to discover when it is the *only* reference to an object. To be accurate, an Ephemeron is notified by the collector when its key is only references from the transitive closure of references from ephemerons. i.e. when an ephemeron is notified we know that there are no reference paths to the ephemeron's key other than through ephemerons. Ephemerons are notified by the garage collector placing them in a queue and signalling a semaphore for each element in the queue. An image level process (the extended finalization process) extracts them from the queue and sends mourn to each ephemeron (since its key is effectively dead). What an Ephemeron does in response to the notification is programmable (one can add subclasses of Ephemeron). But the default behaviour is to send finalize to the key, and then to remove itself from the dictionary it is in, allowing it and the transitive closure of objects reachable form it, to be collected in a subsequent garbage collection. Implementation: both in scavenging, and in scan-mark, if an ephemeron is encountered its key is examined. If the key is reachable from the roots (has already been scavenged, or is already marked), then the ephemeron marked and treated as an ordinary object. If the key is not yet known to be reachable the ephemeron is held in an internal queue of maybe triggerable ephemerons, and its objects are not traced. At the end of the initial scavenge or scan-mark phase, this queue of triggerable ephemerons is examined. All ephemerons in the list whose key is reachable are traced, and removed from the list. This then leaves the list populated only with ephemerons whose keys are as yet untraced, and hence only referenced from the ephemerons in the triggerable ephemeron queue, which now becomes the triggered ephemeron queue. All these ephemerons are placed in the finalization queue for processing in the image above, and all objects reachable from the ephemerons are traced (scavenged, marked). This phase may encounter new triggerable ephemerons which will be added to the triggerable ephemeron queue (not likely in practice, but essential for sound semantics). So the triggering phase continues until the system nds at a fixed point with an empty triggerable ephemeron queue. Implications and advantages: Because ephemerons do not allow their object to be collected, they can be, and are, used to implement pre-mortem finalization. So e.g. a file can flush its buffers and then close its file descriptor before being collected (which may also imply that the system runs the garbage collector *before* snapshotting, not as part of the snapshot primitive). Ephemerons are conceptually more simple than WeakKeyDictionary et al, since they are about reference path, not merely the existence of strong references. The back reference from a dependent to an object renders a weak key dictionary useless in enabling an isolated cycle to be collected since the back reference is string, and keeps the reference from the weak key alive. History: Ephemerons are like guardians. They were invented by George Bosworth in the early '90's, to provide pre-mortem finalization and to solve the problem of DependentsFields retaining garbage. > > > > First, HashedCollection does not use associationClass, but it implements > atNewIndex:put: and it strikes me that atNewIndex:put: for Dictionary > really should check for the thing being added at least includingBehavior: > self > > HashedCollection does not use associationClass because HashedCollections > in general (e.g. Sets) may store any object in their internal array not > just Associations. > Dictionary introduces #associationClass because it only stores > associations (except for MethodDictionary of course). > > #atNewIndex:put: is a private method. Its senders must ensure that the > arguments will not corrupt the receiver's internal state > > > associationClass. So that means Dictionary should override > atNewIndex:put:. > > Can you give a bit more information about how EphemeronDictionary should > work? > If one wants an object to be sent finalize before it is collected one simply stores it in an EphemeronDictionary, which uses instances of Ephemeron as its associations. So e.g. StandardFileStream>>initialize ... self registerForFinalization. ... Object>>registerForFinalization FinalizationDictionary at: self put: nil. and DependentsFields becomes a variant that uses a subclass of Ephemeron that does not send finalize (or vice verce). Or we could keep it simple and use DependentsFields, have finalize sent to objects in DependentsFields when no longer reachable, but have a null finalize method in Object. Levente > > > > > But what should happen in atNewIndex:put: if the object being added > isn't appropriate? Do we > > - raise an error? (that's my preference, but I've got limited use cases > in my head) > > - replace the association with one of assocationClass? (seems dangerous > to me but maybe someone needs this or the existing system does this anyway) > > - ignore it and hope the user knows what they're doing? > _,,,^..^,,,_ best, Eliot -------------- next part -------------- An HTML attachment was scrubbed... URL: From karlramberg at gmail.com Thu Oct 1 19:38:52 2020 From: karlramberg at gmail.com (karl ramberg) Date: Thu, 1 Oct 2020 21:38:52 +0200 Subject: [squeak-dev] How to find unclosed file handles in Squeak? In-Reply-To: <0e02c9399ba14d8cb789e9580eb62d39@student.hpi.uni-potsdam.de> References: <0e02c9399ba14d8cb789e9580eb62d39@student.hpi.uni-potsdam.de> Message-ID: Stream allSubInstances ? Best, Karl On Thu, Oct 1, 2020 at 9:13 PM Thiede, Christoph < Christoph.Thiede at student.hpi.uni-potsdam.de> wrote: > Simple question, probably we already have a helper method for it, but I > did not found any yet: > > Often, way too often, I encounter some old code (or some stupid code > written by myself) that uses #readStream to read a file and forgets to > close it again. > > Apart from the fact that #readStream is a quite dangerous selector, I wish > I could find these unclosed file streams and close them manually without > restarting my entire image. > > Is there any quick way to do this? "Smalltalk snapshot: false andQuit: > false" does not seem to do the trick, and I would prefer a less brutal > approach. > > Something like "Utilities exploreUnclosedFileStreams" would be perfect ... > > > Best, > > Christoph > > -------------- next part -------------- An HTML attachment was scrubbed... URL: From leves at caesar.elte.hu Thu Oct 1 19:55:00 2020 From: leves at caesar.elte.hu (Levente Uzonyi) Date: Thu, 1 Oct 2020 21:55:00 +0200 (CEST) Subject: [squeak-dev] Ephemerons and Dictionaries In-Reply-To: References: Message-ID: Hi Eliot, On Thu, 1 Oct 2020, Eliot Miranda wrote: > > > On Thu, Oct 1, 2020 at 11:41 AM Levente Uzonyi wrote: > Hi Eliot, > > On Thu, 1 Oct 2020, Eliot Miranda wrote: > > > Hi All, > > > >     to be able to ease EphemeronDicitonary into the system easily I'd like to clean up adding associations to Dictionary.  It seems to me there's a partial implementation of choosing an association class > appropriate for a > > dictionary in the implementors of associationClass: Dictionary>>#associationClass, WeakKeyDictionary>>#associationClass, WeakValueDictionary>>#associationClass, (& in my image STON class>>#associationClass).  > This seems > > workable; an EphemeronDictionary would simply add associationClass ^ Ephemeron and we're done, except not quite... > > What's the definition of Ephemeron? > > > An Ephemeron is an association known to the garbage collection system., allowing it to function as a pre-mortem finalizer. > > A Ephemeron is intended for uses such as associating an object's dependents with an object without preventing garbage collection. > > Consider a traditional implementation of dependents in non-Model classes.  There is a Dictionary in Object, DependentsFields.  Objects wishing to have dependents are entered as keys in DependentsFields and the value is a > sequence of their dependents.  Since their dependents (if they are like views/morphs, etc in MVC) will refer directly to the key object (in their model inst var etc), there is no way to use weak collections in > DependentsFields to allow the cycle of an object and its dependents to be collected.  If DependentsFields uses a WeakArray to hold the associations from objects to their dependents then those associations, and the > dependencies with it will simply be lost since the only reference to the associations is in DependentsFields. > > Ephemeron differs from a normal association in that it is known to the garbage collector and it is involved in tracing.  First, note that an Ephemeron is a *strong* referrer.  The objects it refers to cannot be garbage > collected.  It is not weak.  But it is able to discover when it is the *only* reference to an object.  To be accurate, an Ephemeron is notified by the collector when its key is only references from the transitive closure of > references from ephemerons.  i.e. when an ephemeron is notified we know that there are no reference paths to the ephemeron's key other than through ephemerons. > > Ephemerons are notified by the garage collector placing them in a queue and signalling a semaphore for each element in the queue.  An image level process (the extended finalization process) extracts them from the queue and > sends mourn to each ephemeron (since its key is effectively dead).  What an Ephemeron does in response to the notification is programmable (one can add subclasses of Ephemeron).  But the default behaviour is to send finalize > to the key, and then to remove itself from the dictionary it is in, allowing it and the transitive closure of objects reachable form it, to be collected in a subsequent garbage collection. > > Implementation: both in scavenging, and in scan-mark, if an ephemeron is encountered its key is examined.  If the key is reachable from the roots (has already been scavenged, or is already marked), then the ephemeron marked > and treated as an ordinary object. If the key is not yet known to be reachable the ephemeron is held in an internal queue of maybe triggerable ephemerons, and its objects are not traced. > > At the end of the initial scavenge or scan-mark phase, this queue of triggerable ephemerons is examined.  All ephemerons in the list whose key is reachable are traced, and removed from the list.  This then leaves the list > populated only with ephemerons whose keys are as yet untraced, and hence only referenced from the ephemerons in the triggerable ephemeron queue, which now becomes the triggered ephemeron queue.  All these ephemerons are > placed in the finalization queue for processing in the image above, and all objects reachable from the ephemerons are traced (scavenged, marked).  This phase may encounter new triggerable ephemerons which will be added to the > triggerable ephemeron queue (not likely in practice, but essential for sound semantics).  So the triggering phase continues until the system nds at a fixed point with an empty triggerable ephemeron queue. > > Implications and advantages: > Because ephemerons do not allow their object to be collected, they can be, and are, used to implement pre-mortem finalization.  So e.g. a file can flush its buffers and then close its file descriptor before being collected > (which may also imply that the system runs the garbage collector *before* snapshotting, not as part of the snapshot primitive).  Ephemerons are conceptually more simple than WeakKeyDictionary et al, since they are about > reference path, not merely the existence of strong references.  The back reference from a dependent to an object renders a weak key dictionary useless in enabling an isolated cycle to be collected since the back reference is > string, and keeps the reference from the weak key alive. > > History: Ephemerons are like guardians.  They were invented by George Bosworth in the early '90's, to provide pre-mortem finalization and to solve the problem of DependentsFields retaining garbage. Sorry for not being clear. I was asking about the class definition to see what fields it would have. I presume the first line is something like: Object ephemeronSubclass: #Ephemeron ... > > > > > > First, HashedCollection does not use associationClass, but it implements atNewIndex:put: and it strikes me that atNewIndex:put: for Dictionary really should check for the thing being added at least > includingBehavior: self > > HashedCollection does not use associationClass because HashedCollections > in general (e.g. Sets) may store any object in their internal array not > just Associations. > Dictionary introduces #associationClass because it only stores > associations (except for MethodDictionary of course). > > #atNewIndex:put: is a private method. Its senders must ensure that the > arguments will not corrupt the receiver's internal state > > > associationClass.  So that means Dictionary should override atNewIndex:put:. > > Can you give a bit more information about how EphemeronDictionary should > work? > > > If one wants an object to be sent finalize before it is collected one simply stores it in an EphemeronDictionary, which uses instances of Ephemeron as its associations.  So e.g. > > StandardFileStream>>initialize >      ... >      self registerForFinalization. >      ... > > Object>>registerForFinalization >     FinalizationDictionary at: self put: nil. > > and DependentsFields becomes a variant that uses a subclass of Ephemeron that does not send finalize (or vice verce). > > Or we could keep it simple and use DependentsFields, have finalize sent to objects in DependentsFields when no longer reachable, but have a null finalize method in Object. Again, sorry for not being clear. I would like to know how the current implementation of #atNewIndex:put: could prevent EphemeronDictionary to work as intended. Does EphemeronDictionary do something special other dictionaries don't that is not compatible with how #atNewIndex:put: currently works? Levente > > Levente > > > > > But what should happen in atNewIndex:put: if the object being added isn't appropriate?  Do we > > - raise an error? (that's my preference, but I've got limited use cases in my head) > > - replace the association with one of assocationClass? (seems dangerous to me but maybe someone needs this or the existing system does this anyway) > > - ignore it and hope the user knows what they're doing? > > > _,,,^..^,,,_ > best, Eliot > > From leves at caesar.elte.hu Thu Oct 1 19:58:58 2020 From: leves at caesar.elte.hu (Levente Uzonyi) Date: Thu, 1 Oct 2020 21:58:58 +0200 (CEST) Subject: [squeak-dev] How to find unclosed file handles in Squeak? In-Reply-To: <0e02c9399ba14d8cb789e9580eb62d39@student.hpi.uni-potsdam.de> References: <0e02c9399ba14d8cb789e9580eb62d39@student.hpi.uni-potsdam.de> Message-ID: Hi Christoph, On Thu, 1 Oct 2020, Thiede, Christoph wrote: > > Simple question, probably we already have a helper method for it, but I did not found any yet: > > Often, way too often, I encounter some old code (or some stupid code written by myself) that uses #readStream to read a file and forgets to close it again. > > Apart from the fact that #readStream is a quite dangerous selector, I wish I could find these unclosed file streams and close them manually without restarting my entire image. > > Is there any quick way to do this? "Smalltalk snapshot: false andQuit: false" does not seem to do the trick, and I would prefer a less brutal approach. > > Something like "Utilities exploreUnclosedFileStreams" would be perfect ... Try this: StandardFileStream registry. Note that you can't just close all files there, but the files you are looking for are there. Levente > > > Best, > > Christoph > > > From Christoph.Thiede at student.hpi.uni-potsdam.de Thu Oct 1 20:31:15 2020 From: Christoph.Thiede at student.hpi.uni-potsdam.de (Thiede, Christoph) Date: Thu, 1 Oct 2020 20:31:15 +0000 Subject: [squeak-dev] How to find unclosed file handles in Squeak? In-Reply-To: References: <0e02c9399ba14d8cb789e9580eb62d39@student.hpi.uni-potsdam.de>, Message-ID: <5c87c52731714108b8733a3c8d31e1be@student.hpi.uni-potsdam.de> Hi Karl, Hi Levente, > Stream allSubInstances ? I tried this earlier today, but when I filtered the very long list for streams that are open and whose fullName is notNil, I did not find the relevant files. > Try this: StandardFileStream registry. Thank you, this looks promising! I will try it if I encounter a similar problem the next time. :-) Best, Christoph ________________________________ Von: Squeak-dev im Auftrag von Levente Uzonyi Gesendet: Donnerstag, 1. Oktober 2020 21:58:58 An: The general-purpose Squeak developers list Betreff: Re: [squeak-dev] How to find unclosed file handles in Squeak? Hi Christoph, On Thu, 1 Oct 2020, Thiede, Christoph wrote: > > Simple question, probably we already have a helper method for it, but I did not found any yet: > > Often, way too often, I encounter some old code (or some stupid code written by myself) that uses #readStream to read a file and forgets to close it again. > > Apart from the fact that #readStream is a quite dangerous selector, I wish I could find these unclosed file streams and close them manually without restarting my entire image. > > Is there any quick way to do this? "Smalltalk snapshot: false andQuit: false" does not seem to do the trick, and I would prefer a less brutal approach. > > Something like "Utilities exploreUnclosedFileStreams" would be perfect ... Try this: StandardFileStream registry. Note that you can't just close all files there, but the files you are looking for are there. Levente > > > Best, > > Christoph > > > -------------- next part -------------- An HTML attachment was scrubbed... URL: From Christoph.Thiede at student.hpi.uni-potsdam.de Thu Oct 1 20:34:01 2020 From: Christoph.Thiede at student.hpi.uni-potsdam.de (Thiede, Christoph) Date: Thu, 1 Oct 2020 20:34:01 +0000 Subject: [squeak-dev] The Inbox: Tools-ct.991.mcz In-Reply-To: References: <,> , Message-ID: <16d4a1ec252748c0ade891c2f73083a1@student.hpi.uni-potsdam.de> Hi Marcel, this is a very nice script and demonstrates the powerfulness of Vivide very well! Still, it does not show any links between multiple inbox/trunk versions, and they are still isolated from the discussion on the mailing list ... :-) Best, Christoph ________________________________ Von: Squeak-dev im Auftrag von Taeumel, Marcel Gesendet: Donnerstag, 1. Oktober 2020 14:35:16 An: squeak-dev Betreff: Re: [squeak-dev] The Inbox: Tools-ct.991.mcz Hi Christoph, I use a small Vivide script to keep track of your (and other) changes: [cid:18a7980d-e3d4-49ac-ac7b-e801ec695eb2] Best, Marcel Am 01.10.2020 14:08:05 schrieb Thiede, Christoph : Hi Marcel, sorry. As already mentioned, it can be hard to keep an overview of currently 307 open inbox versions and their interdependencies ... 😫 Best, Christoph ________________________________ Von: Squeak-dev im Auftrag von Taeumel, Marcel Gesendet: Donnerstag, 1. Oktober 2020 14:04:06 An: squeak-dev Betreff: Re: [squeak-dev] The Inbox: Tools-ct.991.mcz Hi Christoph, that's funny. You already did that with Tools-ct.957. :-) I will move both 956 and 957 to treated. Best, Marcel Am 30.09.2020 19:46:56 schrieb commits at source.squeak.org : Christoph Thiede uploaded a new version of Tools to project The Inbox: http://source.squeak.org/inbox/Tools-ct.991.mcz ==================== Summary ==================== Name: Tools-ct.991 Author: ct Time: 30 September 2020, 7:46:39.949807 pm UUID: 4d2f75ef-336d-cc4c-aa0d-dd4f7ff99fc7 Ancestors: Tools-mt.990 Fixes a bug in DebuggerMethodMap's rangeForPC lookup Steps to reproduce: c := Object newSubclass. c compile: 'foo: foo foo = #foo ifTrue: [^ true]. ^ (foo ifNil: [^ false]) = #bar'. c new foo: #bar. "Debug it. Step into #foo:, step over #=. Before this commit, the selection was '^ true'" The error was that #findNearbyBinaryIndex: uses to return the lower possible index if there is no exact match. For debugging, we cannot need this behavior, because we want to select the next operation to be executed. Furthermore, this commit refactors some duplication with DebuggerMethodMapForFullBlockCompiledMethod. Please review! Uploaded again due to totally broken ancestry. Replaces Tools-ct.956, which can be moved into the treated inbox. =============== Diff against Tools-mt.990 =============== Item was changed: ----- Method: DebuggerMethodMap>>rangeForPC:in:contextIsActiveContext: (in category 'source mapping') ----- rangeForPC: contextsConcretePC in: method contextIsActiveContext: contextIsActiveContext + "Answer the indices in the source code for the supplied pc. If the context is the active context (is at the hot end of the stack) then its pc is the current pc. But if the context isn't, because it is suspended sending a message, then its current pc is the previous pc." - "Answer the indices in the source code for the supplied pc. - If the context is the actve context (is at the hot end of the stack) - then its pc is the current pc. But if the context isn't, because it is - suspended sending a message, then its current pc is the previous pc." + | pc i end sortedMap | - | pc i end | pc := method abstractPCForConcretePC: (contextIsActiveContext + ifTrue: [contextsConcretePC] + ifFalse: [(method pcPreviousTo: contextsConcretePC) + ifNil: [contextsConcretePC]]). + (self abstractSourceMapForMethod: method) + at: pc + ifPresent: [:range | ^ range]. + sortedMap := self sortedSourceMapForMethod: method. + sortedMap ifEmpty: [^ 1 to: 0]. + i := sortedMap + findBinaryIndex: [:assoc | pc - assoc key] + ifNone: [:lower :upper | upper]. + i < 1 ifTrue: [^ 1 to: 0]. + i > sortedMap size ifTrue: [ + end := sortedMap inject: 0 into: [:prev :this | + prev max: this value last]. + ^ end + 1 to: end]. + ^ (sortedMap at: i) value! - ifTrue: [contextsConcretePC] - ifFalse: [(method pcPreviousTo: contextsConcretePC) - ifNotNil: [:prevpc| prevpc] - ifNil: [contextsConcretePC]]). - (self abstractSourceMap includesKey: pc) ifTrue: - [^self abstractSourceMap at: pc]. - sortedSourceMap ifNil: - [sortedSourceMap := self abstractSourceMap associations - replace: [ :each | each copy ]; - sort]. - sortedSourceMap isEmpty ifTrue: [^1 to: 0]. - i := sortedSourceMap findNearbyBinaryIndex: [:assoc| pc - assoc key]. - i < 1 ifTrue: [^1 to: 0]. - i > sortedSourceMap size ifTrue: - [end := sortedSourceMap inject: 0 into: - [:prev :this | prev max: this value last]. - ^end+1 to: end]. - ^(sortedSourceMap at: i) value - - "| method source scanner map | - method := DebuggerMethodMap compiledMethodAt: #rangeForPC:in:contextIsActiveContext:. - source := method getSourceFromFile asString. - scanner := InstructionStream on: method. - map := method debuggerMap. - Array streamContents: - [:ranges| - [scanner atEnd] whileFalse: - [| range | - range := map rangeForPC: scanner pc in: method contextIsActiveContext: true. - ((map abstractSourceMap includesKey: scanner abstractPC) - and: [range first ~= 0]) ifTrue: - [ranges nextPut: (source copyFrom: range first to: range last)]. - scanner interpretNextInstructionFor: InstructionClient new]]"! Item was added: + ----- Method: DebuggerMethodMap>>sortedSourceMap (in category 'private') ----- + sortedSourceMap + + ^ sortedSourceMap ifNil: [ + sortedSourceMap := self abstractSourceMap associations + replace: [:each | each copy]; + sort]! Item was added: + ----- Method: DebuggerMethodMap>>sortedSourceMapForMethod: (in category 'source mapping') ----- + sortedSourceMapForMethod: aCompiledMethod + + ^ self sortedSourceMap! Item was changed: ----- Method: DebuggerMethodMapForFullBlockCompiledMethods>>abstractSourceMap (in category 'source mapping') ----- abstractSourceMap + + ^ self shouldNotImplement! - self shouldNotImplement! Item was removed: - ----- Method: DebuggerMethodMapForFullBlockCompiledMethods>>rangeForPC:in:contextIsActiveContext: (in category 'source mapping') ----- - rangeForPC: contextsConcretePC in: method contextIsActiveContext: contextIsActiveContext - "Answer the indices in the source code for the supplied pc. - If the context is the actve context (is at the hot end of the stack) - then its pc is the current pc. But if the context isn't, because it is - suspended sending a message, then its current pc is the previous pc." - - | pc i end mapForMethod sortedMap | - pc := method abstractPCForConcretePC: (contextIsActiveContext - ifTrue: [contextsConcretePC] - ifFalse: [(method pcPreviousTo: contextsConcretePC) - ifNotNil: [:prevpc| prevpc] - ifNil: [contextsConcretePC]]). - ((mapForMethod := self abstractSourceMapForMethod: method) includesKey: pc) ifTrue: - [^mapForMethod at: pc]. - sortedSourceMap ifNil: - [sortedSourceMap := IdentityDictionary new]. - sortedMap := sortedSourceMap - at: method - ifAbsentPut: [mapForMethod associations - replace: [ :each | each copy ]; - sort]. - sortedMap isEmpty ifTrue: [^1 to: 0]. - i := sortedMap findNearbyBinaryIndex: [:assoc| pc - assoc key]. - i < 1 ifTrue: [^1 to: 0]. - i > sortedMap size ifTrue: - [end := sortedMap inject: 0 into: - [:prev :this | prev max: this value last]. - ^end+1 to: end]. - ^(sortedMap at: i) value - - "| method source scanner map | - method := DebuggerMethodMapForFullBlockCompiledMethods compiledMethodAt: #rangeForPC:in:contextIsActiveContext:. - source := method getSourceFromFile asString. - scanner := InstructionStream on: method. - map := method debuggerMap. - Array streamContents: - [:ranges| - [scanner atEnd] whileFalse: - [| range | - range := map rangeForPC: scanner pc in: method contextIsActiveContext: true. - ((map abstractSourceMap includesKey: scanner abstractPC) - and: [range first ~= 0]) ifTrue: - [ranges nextPut: (source copyFrom: range first to: range last)]. - scanner interpretNextInstructionFor: InstructionClient new]]"! Item was added: + ----- Method: DebuggerMethodMapForFullBlockCompiledMethods>>sortedSourceMap (in category 'source mapping') ----- + sortedSourceMap + + ^ self shouldNotImplement! Item was added: + ----- Method: DebuggerMethodMapForFullBlockCompiledMethods>>sortedSourceMapForMethod: (in category 'source mapping') ----- + sortedSourceMapForMethod: method + + sortedSourceMap ifNil: [ + sortedSourceMap := IdentityDictionary new]. + ^ sortedSourceMap + at: method + ifAbsentPut: [(self abstractSourceMapForMethod: method) associations + replace: [ :each | each copy ]; + sort]! -------------- next part -------------- An HTML attachment was scrubbed... URL: -------------- next part -------------- A non-text attachment was scrubbed... Name: image.png Type: image/png Size: 535245 bytes Desc: image.png URL: From Christoph.Thiede at student.hpi.uni-potsdam.de Thu Oct 1 20:41:16 2020 From: Christoph.Thiede at student.hpi.uni-potsdam.de (Thiede, Christoph) Date: Thu, 1 Oct 2020 20:41:16 +0000 Subject: [squeak-dev] Overriding #= in Graphics and Sounds In-Reply-To: References: <1112186c150f40a0acae92e746abb6fa@student.hpi.uni-potsdam.de>, Message-ID: <138288e315e742bc8e25e9e0578aeda5@student.hpi.uni-potsdam.de> Hi Marcel, I am sending pictures and sounds to a server that only accepts mutually different items. However, if multiple of these items are generated using the same code, e.g. Morph new imageForm, there is no chance to identify this duplicate at the moment. Thanks for the hints, this sounds indeed too complex for my use case. For now, I decided to simply catch and ignore the server errors about the duplicates. It's easier to ask for forgiveness than permission. :-) Best, Christoph ________________________________ Von: Squeak-dev im Auftrag von Taeumel, Marcel Gesendet: Donnerstag, 1. Oktober 2020 14:43:38 An: squeak-dev Betreff: Re: [squeak-dev] Overriding #= in Graphics and Sounds Hi Christoph. Hmmm... maybe it is not straightforward to implement? Especially whether #class (or #species) should match or not. Reminds me of SequenceableCollection >> #= and #hasEqualElements:. I keep on using #hasEqualElements: in tests because I don't care about Array-vs-OrderedCollection in several places. [cid:aa12d832-9f5e-4b25-ba80-37b31d0c2dba] And Form has also a non-trivial hierarchy of variations: [cid:3ca1fe29-c01e-4821-91ee-d30a841a9712] For example, would you ignore the #depth if it is black and white anyway? Or would you break uses of Dictionaries that are virtually IdentityDictionaries because of their current keys and the missing #=? It can be hard. Maybe it needs to be maintined afterwards. So, YAGNI? :-) Best, Marcel Am 01.10.2020 14:23:37 schrieb Thiede, Christoph : Hi all, for a current project, I need to compare form or sound objects with each other, but I found out that they do not override #=, so for example, we get: (ColorForm extent: 1 @ 1) = (ColorForm extent: 1 @ 1) --> false Wasn't this implemented a) simply because it looked like YAGNI? b) for design reasons? For example, should (Form extent: 1 @ 1) be equal to (ColorForm extent: 1 @ 1) or not? c) for performance reasons? I don't know if there any guidelines for implement #= (except that you need to implement #hash as well), but is an equality comparison generally allowed to be an expensive operation if two objects are equal? If two large forms have a different resolution or a different bitmap hash, comparison will be fast, but if they are equal, we will need to compare every single bit. Would this be okay or a no-go? If implementing #= as proposed is not possible, how would you think about implementing it as a keyword message on Form, e.g. #sameAs:? The same questions apply to the AbstractSound hierarchy, too, where I'm not sure whether two sounds being played for different duration should equal or not. For a similar discussion, see also this thread: [squeak-dev] FormInspector, or also: Text>>#= and its consequences. Best, Christoph -------------- next part -------------- An HTML attachment was scrubbed... URL: -------------- next part -------------- A non-text attachment was scrubbed... Name: image.png Type: image/png Size: 98235 bytes Desc: image.png URL: -------------- next part -------------- A non-text attachment was scrubbed... Name: image.png Type: image/png Size: 81778 bytes Desc: image.png URL: From Christoph.Thiede at student.hpi.uni-potsdam.de Thu Oct 1 20:47:36 2020 From: Christoph.Thiede at student.hpi.uni-potsdam.de (Thiede, Christoph) Date: Thu, 1 Oct 2020 20:47:36 +0000 Subject: [squeak-dev] The Trunk: ToolBuilder-Morphic-ct.252.mcz In-Reply-To: References: Message-ID: <68a21ecc6fe64c07b0a73db82f94252c@student.hpi.uni-potsdam.de> Hi Marcel, thank you for reviewing all this stuff! :-) Might this be a good point to push the discussion from http://forum.world.st/The-Inbox-System-ct-1149-mcz-td5114102.html again? It would allow us to rewrite the #debugAction implementation here as follows: debugAction action ifNil: [^ super debugAction]. [self performAction] debugFromContextThat: [context closure = action] title: ('Debug button action "{1}" in model "{2}"' format: {self label. self target printString}). Best, Christoph ________________________________ Von: Squeak-dev im Auftrag von commits at source.squeak.org Gesendet: Donnerstag, 1. Oktober 2020 16:06 Uhr An: squeak-dev at lists.squeakfoundation.org; packages at lists.squeakfoundation.org Betreff: [squeak-dev] The Trunk: ToolBuilder-Morphic-ct.252.mcz Marcel Taeumel uploaded a new version of ToolBuilder-Morphic to project The Trunk: http://source.squeak.org/trunk/ToolBuilder-Morphic-ct.252.mcz ==================== Summary ==================== Name: ToolBuilder-Morphic-ct.252 Author: ct Time: 20 January 2020, 8:57:46.404972 pm UUID: 2b311bcc-31ca-dc4d-8ebf-7a1cad07624e Ancestors: ToolBuilder-Morphic-mt.251 Implement "browse/debug button action" properly on PluggabeButtonMorphPlus =============== Diff against ToolBuilder-Morphic-mt.251 =============== Item was added: + ----- Method: PluggableButtonMorphPlus>>browseImplementationOfActionSelector (in category 'debug menu') ----- + browseImplementationOfActionSelector + + action ifNotNil: [ + ^ action outerContext method browse]. + ^ super browseImplementationOfActionSelector! Item was added: + ----- Method: PluggableButtonMorphPlus>>debugAction (in category 'debug menu') ----- + debugAction + + action ifNil: [^ super debugAction]. + (Process + forBlock: [self performAction] + runUntil: [:context | context closure = action]) + debugWithTitle: ('Debug button action "{1}" in model "{2}"' format: {self label. self target printString}).! -------------- next part -------------- An HTML attachment was scrubbed... URL: From Christoph.Thiede at student.hpi.uni-potsdam.de Thu Oct 1 20:57:50 2020 From: Christoph.Thiede at student.hpi.uni-potsdam.de (Thiede, Christoph) Date: Thu, 1 Oct 2020 20:57:50 +0000 Subject: [squeak-dev] The Inbox: ToolBuilder-Kernel-ct.135.mcz In-Reply-To: <1601562533232-0.post@n4.nabble.com> References: ,<1601562533232-0.post@n4.nabble.com> Message-ID: <4cae0495c96f4f92a92a6322ef7b1242@student.hpi.uni-potsdam.de> Hi Marcel! Fair point, I will revert that. Would you agree with the rest of the patch when I reupload it? This commit was a first step towards the implementation of a CommandLineUIManager as discussed here: http://forum.world.st/CommandLineUIManager-td5106538.html By the way, my image already contains an early prototype version of it. If there is anyone else interested in this extension, my questions from the post below are still up to date! :-) Best, Christoph ________________________________ Von: Squeak-dev im Auftrag von Taeumel, Marcel Gesendet: Donnerstag, 1. Oktober 2020 16:28:53 An: squeak-dev at lists.squeakfoundation.org Betreff: Re: [squeak-dev] The Inbox: ToolBuilder-Kernel-ct.135.mcz Hi Christoph. -1 because "false" is typically different than "cancellation" in the context where that UI request is posed. Imagine that a user says "No, do not overwrite but duplicate that item." but your logic could trigger something like "Close this dialog" just because the current UI manager omitted to implement that case. It would be more discoverable to raise that #subclassResponsibility exception. Best, Marcel commits-2 wrote > Christoph Thiede uploaded a new version of ToolBuilder-Kernel to project > The Inbox: > http://source.squeak.org/inbox/ToolBuilder-Kernel-ct.135.mcz > > ==================== Summary ==================== > > Name: ToolBuilder-Kernel-ct.135 > Author: ct > Time: 24 January 2020, 6:34:43.604574 pm > UUID: 3ec2613e-56d3-2d41-b5c3-799a66a986e9 > Ancestors: ToolBuilder-Kernel-mt.134 > > Provides fallback implementations for some UIManager messages > > =============== Diff against ToolBuilder-Kernel-mt.134 =============== > > Item was changed: > ----- Method: UIManager>>chooseFrom:values:lines:title: (in category 'ui > requests') ----- > chooseFrom: labelList values: valueList lines: linesArray title: aString > + "Choose an item from the given list. Answer the corresponding value." > + | result | > + result := self chooseFrom: labelList lines: linesArray title: aString. > + (result isNil or: [result isZero]) ifTrue: [^ nil]. > + ^ valueList at: result! > - "Choose an item from the given list. Answer the selected item." > - ^self subclassResponsibility! > > Item was changed: > ----- Method: UIManager>>confirm:orCancel: (in category 'ui requests') > ----- > confirm: aString orCancel: cancelBlock > + "Put up a yes/no/cancel menu with caption aString. Answer true if the > response is yes, false if no. If cancel is chosen, evaluate cancelBlock. > This is a modal question--the user must respond yes or no." > + ^ (self confirm: aString) > + ifFalse: [cancelBlock value]; > + yourself! > - "Put up a yes/no/cancel menu with caption aString. Answer true if > - the response is yes, false if no. If cancel is chosen, evaluate > - cancelBlock. This is a modal question--the user must respond yes or > no." > - ^self subclassResponsibility! > > Item was changed: > ----- Method: UIManager>>confirm:orCancel:title: (in category 'ui > requests') ----- > confirm: aString orCancel: cancelBlock title: titleString > + "Put up a yes/no/cancel menu with caption aString, and titleString to > label the dialog. Answer true if the response is yes, false if no. If > cancel is chosen, evaluate cancelBlock. This is a modal question--the user > must respond yes or no." > + ^ (self confirm: aString title: titleString) > + ifFalse: [cancelBlock value]; > + yourself! > - "Put up a yes/no/cancel menu with caption aString, and titleString to > label the dialog. > - Answer true if the response is yes, false if no. If cancel is chosen, > evaluate cancelBlock. > - This is a modal question--the user must respond yes or no." > - ^self subclassResponsibility! > > Item was changed: > ----- Method: UIManager>>request:initialAnswer:centerAt: (in category > 'ui requests - text') ----- > request: queryString initialAnswer: defaultAnswer centerAt: aPoint > + "Create an instance of me whose question is queryString with the given > initial answer. Invoke it centered at the given point, and answer the > string the user accepts. Answer the empty string if the user cancels." > - "Create an instance of me whose question is queryString with the given > - initial answer. Invoke it centered at the given point, and answer the > - string the user accepts. Answer the empty string if the user cancels." > > + ^ self request: queryString initialAnswer: defaultAnswer! > - ^self subclassResponsibility! -- Sent from: http://forum.world.st/Squeak-Dev-f45488.html -------------- next part -------------- An HTML attachment was scrubbed... URL: From forums.jakob at resfarm.de Thu Oct 1 20:57:59 2020 From: forums.jakob at resfarm.de (jakres-2) Date: Thu, 1 Oct 2020 15:57:59 -0500 (CDT) Subject: [squeak-dev] Development methodology (was: tedious programming-in-the-debugger error needs fixing) In-Reply-To: <1601475775699-0.post@n4.nabble.com> References: <1a26fe2675b14feaa16b483d54afa361@student.hpi.uni-potsdam.de> <1599137423163-0.post@n4.nabble.com> <23476c3e0a68492c8cc917c38ba2c9d4@student.hpi.uni-potsdam.de> <1601475775699-0.post@n4.nabble.com> Message-ID: <1601585879135-0.post@n4.nabble.com> Sounds like Christoph wants an issue tracker that is integrated with the version control system. GitHub just happens to be one of the platforms to offer this (next to Bitbucket, and Gitlab, and Jira, and what not). If I remember correctly, that is one of the reasons why Pharo has moved to Git and GitHub: because they did not want to reinvent/reimplement these tools. There already is https://github.com/squeak-smalltalk/ and the squeak-app repository over there (through Travis CI) is what sends us the smalltalkCI reports for Trunk. Maybe we could use another repository there as an issue tracker and subscribe issue/pull request comments to squeak-dev in the same manner as the CI. (I don't suppose that the Mantis is still frequently used or would send email to the list, correct?) Now since Squeak does not switch to Git (given the feelings of several prominent people here towards Git), what remains to be solved is the integration with the version control system. Maybe we have to build the proper Monticello frontend to Git repositories after all... despite enjoying the non-Monticello tools such as the Git Browser in and around HPI. I don't suppose anyone will be able to go the other way around and write, maintain, and operate the custom Monticello issue tracker platform in their free time. Kind regards, Jakob Christoph Thiede wrote > I will give a short case study and tell you how I think it probably could > be > performed more efficiently using the GitHub workflow: > > 1) I'm proposing a new extension to some Squeak component, let's say a > menu > for the HelpBrowser. To do this, I upload a new version to the inbox > (Package-ct.2 based on Package-xyz.1). > 2) Some kind person is giving me some feedback on the proposal so I am > reworking it. To share the new version with the community, I have two > options: A. Upload a new inbox version (Package-ct.3) that depends on > Package-ct.2 or B. upload a new inbox version that contains a copy of all > changes of Package-ct.2, too, that is based on Package-xyz.1 again, and > that > explains that Package-ct.2 can moved into the treated inbox now. Usually, > I > choose option B because it makes it easier to read the complete diff of my > proposal compared to the trunk (but let's see step 3 for this decision). > In > every case, I need to leave a note referring to Package-ct.2. > 3) Some kind person would like to clean up the inbox, including reviewing > and eventually merging of my proposal, but where should they find all > relevant information? Regarding to Package-ct.2, the Monticello Browser > does > not give you any hint that it is stale and should be moved into the > treated > inbox (provided that I chose option B in step 2) because you cannot see > the > discussion from the mailing list there. The mail-archive thread about > Package-ct.2, too, does not contain any reference to Package-ct.3 (unless > I'm sending another piece of noise manually). On the other hand, if I > chose > option 2.A, you cannot review Package-ct.3 standalone neither in the > Monticello Browser nor in the mailing thread. And things get more > complicated if just another review is left on the proposal before it can > be > merged ... > Of course, as I am not a merging person, I cannot tell whether step 3 > exactly describes your workflow as a merger, but I am facing very similar > issues when trying to get an overview of my own contribution. And also, we > had several small incidents in the past when something was merged that > actually should have been improved before (just for example, > Regex-Core-ct.56). > > So how could this look differently when applying the GitHub workflow? > 1) For the initial proposal, I'm opening a new Pull Request to merge > "helpbrowser-menu" into "trunk" with a single commit commit-a. > 2) To react on the kind person's feedback, I add another commit commit-b > to > this branch. GitHub, the GitBrowser, and every other git client will > automatically display the connection between both commits, and because > commit-a is no longer a head commit, it will not be considered as a > complete > feature by anybody any longer. > 3) Every subsequent feedback can be left directly to the Pull Request > thread > (which can be easily synchronized with the mailing list using a bot > similar > to the OpenSmalltalk-VM-Bot) and be resolved by just another commit to > this > branch. All version information is kept at one single place. > *) As a bonus, GitHub offers a bunch of useful features that make it > easier > to overview and organize all contributions. For example, we can > automatically run the CI for every Pull Request (which I'm sure would help > us to introduce a smaller number of bugs into the Trunk/master); issue/PR > references are automatically displayed on both ends of a link; people can > be > assigned to certain PRs; labels can be used to mark a PR as draft, fix, > enhancement, review, etc. and much more ... Also, there is already an > existing project to integrate GitHub conversations into Squeak, see > SqueakIssueIntegration. > *) Another plus could be organizing all packages in one repository to get > rid of changesets sent to the list which I find truly unhandy as they are > not really designed for versioning. -- Sent from: http://forum.world.st/Squeak-Dev-f45488.html From Christoph.Thiede at student.hpi.uni-potsdam.de Thu Oct 1 21:14:47 2020 From: Christoph.Thiede at student.hpi.uni-potsdam.de (Thiede, Christoph) Date: Thu, 1 Oct 2020 21:14:47 +0000 Subject: [squeak-dev] Can we make computing the local variables in the debugger lazy? In-Reply-To: References: <9da5acf36e3b4c77bcf4af677adca40b@student.hpi.uni-potsdam.de> , Message-ID: Hi Eliot, you can have an inspector field's title be styled by sending "shouldStyleName: true" to it. The styling itself, then, is performed by the Inspector in #fieldList (or just browse the senders of #shouldStyleName), where the styler is invoked. Before styling the field list, the styler is configured in #aboutToStyle:requestor:/#updateStyler:requestor: where self doItContext is passed to the styler. So tl;dr: Styling is always applied late (after the field list is constructed), you cannot break it by caching the temp names earlier. :-) Best, Christoph ________________________________ Von: Squeak-dev im Auftrag von Eliot Miranda Gesendet: Donnerstag, 1. Oktober 2020 20:33:08 An: The general-purpose Squeak developers list; Taeumel, Marcel Betreff: Re: [squeak-dev] Can we make computing the local variables in the debugger lazy? Hi Christoph, On Wed, Sep 30, 2020 at 2:27 AM Thiede, Christoph > wrote: Hi Eliot, > Can you point me to where in ContextInspector the emphasis for the temp vars is chosen? By convention, inspector fields are defined in the category "fields - streaming". So you are probably searching for ContextInspector >> #streamTemporaryVariablesOn: or ContextVariablesInspector >> #streamTemporaryVariablesOn:? I found this code; I don't see any text emphasis going on. Where is the code that turns temp variables red when they're out of scope? Marcel? Looking forward to your optimization! :-) Best, Christoph ________________________________ Von: Squeak-dev > im Auftrag von Eliot Miranda > Gesendet: Mittwoch, 30. September 2020 09:09:27 An: The general-purpose Squeak developers list Betreff: Re: [squeak-dev] Can we make computing the local variables in the debugger lazy? Hi Marcel, On Tue, Sep 29, 2020 at 1:07 AM Marcel Taeumel > wrote: Hi Eliot, hi all! I fixed the issue with Tools-mt.989. The logic was already there in #runUntil. Can you point me to where in ContextInspector the emphasis for the temp vars is chosen? I want to modify ContextInspector to cache the temp names for a given method because I believe this will speed up stepping a lot. However I couldn't find where the emphasis is applied so I'm worried that my cache may break something. If I can see where that is being done I have a better chance at avoiding breaking things. Best, Marcel Am 19.09.2020 23:00:33 schrieb Levente Uzonyi >: Hi Christoph, On Sat, 19 Sep 2020, Thiede, Christoph wrote: > > Hi Eliot, > > > very nice finding once again! I #timeProfile'd the menu button action and as I expected, the most expensive operation is the shout styling by the new inspectors, including the decompilation of every method: What was it exactly that you profiled? The screenshot shows that 76.9% was spent in #initializeVariablesFromContext, of which 52.5% of the time was spent in CompiledMethod(CompiledCode) >> #getSource. The rest of the tree is not visible, but these methods have nothing to do with parsing or styling, they initialize the parser and normally should take <1 ms. Also, why is the decompiler producing the source code? > > > [IMAGE] > > > First, when loading ShoutCore-ct.78 (Inbox), the speed doubles (but probably that's rather a problem with my sources file, see the thread about this commit). You may want to try compiling a VM where FilePlugin's CreateFile does not set the FILE_FLAG_SEQUENTIAL_SCAN flag, and see if it helps with file reading performance. Levente > > Second, we do not redraw the world while running to the selection, so we do not need to update the inspectors at all. I think we could split up #doStep into some #basicDoStep (which would perform the actual stepping logic) + > some #updateContextDuring: (which would update the stack list and the inspectors), then we would need to trigger the updates only once from #runToSelection:. > As an alternative, we could make this method a bit more complex but responsive by applying the same updating logic from #runUntil. > > What do you think? :-) > > Best, > Christoph > > _________________________________________________________________________________________________________________________________________________________________________________________________________________________________ > Von: Squeak-dev im Auftrag von Eliot Miranda > Gesendet: Samstag, 19. September 2020 20:17:12 > An: The general-purpose Squeak developers list; Taeumel, Marcel > Betreff: [squeak-dev] Can we make computing the local variables in the debugger lazy? > Hi Marcel, > > can we try and reduce the frequency at which we compute the variables in the context inspector in the debugger? It is a noticeable performance hit. I really like the user interface, but the performance hit is making > debugging difficult. > > As an example use this: > > | samples sineTable sound | > "1 second of A below middle C (220Hz). 16000 / 220 is 72.72 recurring" > sineTable := SoundPlayer sineTable: 73. > sineTable doWithIndex: "And let's not deafen anyone..." > [:sample :index| sineTable at: index put: sample // 4]. > samples := SoundBuffer new: 16000. > 1 to: samples size by: sineTable size do: > [:i| samples replaceFrom: i to: (i + sineTable size - 1 min: 16000) with: sineTable startingAt: 1]. > 1 to: 146 do: > [:i| > samples at: i put: ((samples at: i) * i / 146) asInteger. > samples at: 16001 - i put: ((samples at: 16001 - i) * i / 146) asInteger]. > sound := SampledSound > samples: samples > samplingRate: 16000. > sound := MixedSound new > add: sound pan: 0.25; > add: sound pan: 0.75; > yourself. > sound computeSamplesForSeconds: sound duration > > > Open a workspace in e.g. a 64-bit image prior to Tools-mt.965 (I used an image containing Tools-mt.942). Debug the above in the workspace. Position the cursor at "sound computeSamplesForSeconds: sound duration" and do "run > to here". It is essentially instantaneous. > > Now do the same in a contemporary trunk image. It takes almost 6 seconds. > > I used to be able to click step as fast as I could and the system would keep up with me. Now I find that if I click too fast I can accumulate excess clicks and when I stp clicking the system will continue stepping and go too > far. > > I don't want to lose the feedback the new variables list gives us. But I do find the performance hit tedious. I wonder could we cache the list and only update it > - when Morphic updates, and > - when the context changes? > > > _,,,^..^,,,_ > best, Eliot > > -- _,,,^..^,,,_ best, Eliot -- _,,,^..^,,,_ best, Eliot -------------- next part -------------- An HTML attachment was scrubbed... URL: From Christoph.Thiede at student.hpi.uni-potsdam.de Thu Oct 1 21:43:24 2020 From: Christoph.Thiede at student.hpi.uni-potsdam.de (Thiede, Christoph) Date: Thu, 1 Oct 2020 21:43:24 +0000 Subject: [squeak-dev] Development methodology (was: tedious programming-in-the-debugger error needs fixing) In-Reply-To: <1601585879135-0.post@n4.nabble.com> References: <1a26fe2675b14feaa16b483d54afa361@student.hpi.uni-potsdam.de> <1599137423163-0.post@n4.nabble.com> <23476c3e0a68492c8cc917c38ba2c9d4@student.hpi.uni-potsdam.de> <1601475775699-0.post@n4.nabble.com>,<1601585879135-0.post@n4.nabble.com> Message-ID: <90af770130c54603a4f15c90458c7692@student.hpi.uni-potsdam.de> > Sounds like Christoph wants an issue tracker that is integrated with the version control system. Exactly. You managed to summarize in one sentence which took me two screen pages. :-) > Now since Squeak does not switch to Git (given the feelings of several prominent people here towards Git), what remains to be solved is the integration with the version control system. I already have some early plans about this lying on my desk how such an integration system could look like. Schematically, we would need to observe the list of pull requests in the git repository and mirror every new commit as an inbox version to the inbox. The other way around, the Monticello list of inbox/trunk versions needs to be observed, and all new versions that were not already triggered by a PR need to be converted into a new git commit either on the main branch or on a PR branch. Conversation could be synchronized using the OpenSmalltalk-VM-Bot. Ideally, this approach could allow us to operate with the same version & issue model from two alternative views, Monticello+mailing list, and GitHub. However, that's only a thought experiment at this time, and everything further would probably be an implementation detail only. The actual question is how big is the actual demand for such a hybrid/two-way VCS for us a community (and not for me as a single Monticello-moaning person) and how many people actually would like to use the git interface. > I don't suppose anyone will be able to go the other way around and write, maintain, and operate the custom Monticello issue tracker platform in their free time. I don't think so, too. While I appreciate the idea of using true Smalltalk objects for every part of the Squeak project, including issues and versioning, it is simply not realistic for a community of our size to build a full-stack service from the scratch for these aspects, again, that can compete with big existing solutions such as GitHub & Co. Thus, my personal opinion would be to outsource it. Best, Christoph ________________________________ Von: Squeak-dev im Auftrag von jakres-2 Gesendet: Donnerstag, 1. Oktober 2020 22:57:59 An: squeak-dev at lists.squeakfoundation.org Betreff: Re: [squeak-dev] Development methodology (was: tedious programming-in-the-debugger error needs fixing) Sounds like Christoph wants an issue tracker that is integrated with the version control system. GitHub just happens to be one of the platforms to offer this (next to Bitbucket, and Gitlab, and Jira, and what not). If I remember correctly, that is one of the reasons why Pharo has moved to Git and GitHub: because they did not want to reinvent/reimplement these tools. There already is https://github.com/squeak-smalltalk/ and the squeak-app repository over there (through Travis CI) is what sends us the smalltalkCI reports for Trunk. Maybe we could use another repository there as an issue tracker and subscribe issue/pull request comments to squeak-dev in the same manner as the CI. (I don't suppose that the Mantis is still frequently used or would send email to the list, correct?) Now since Squeak does not switch to Git (given the feelings of several prominent people here towards Git), what remains to be solved is the integration with the version control system. Maybe we have to build the proper Monticello frontend to Git repositories after all... despite enjoying the non-Monticello tools such as the Git Browser in and around HPI. I don't suppose anyone will be able to go the other way around and write, maintain, and operate the custom Monticello issue tracker platform in their free time. Kind regards, Jakob Christoph Thiede wrote > I will give a short case study and tell you how I think it probably could > be > performed more efficiently using the GitHub workflow: > > 1) I'm proposing a new extension to some Squeak component, let's say a > menu > for the HelpBrowser. To do this, I upload a new version to the inbox > (Package-ct.2 based on Package-xyz.1). > 2) Some kind person is giving me some feedback on the proposal so I am > reworking it. To share the new version with the community, I have two > options: A. Upload a new inbox version (Package-ct.3) that depends on > Package-ct.2 or B. upload a new inbox version that contains a copy of all > changes of Package-ct.2, too, that is based on Package-xyz.1 again, and > that > explains that Package-ct.2 can moved into the treated inbox now. Usually, > I > choose option B because it makes it easier to read the complete diff of my > proposal compared to the trunk (but let's see step 3 for this decision). > In > every case, I need to leave a note referring to Package-ct.2. > 3) Some kind person would like to clean up the inbox, including reviewing > and eventually merging of my proposal, but where should they find all > relevant information? Regarding to Package-ct.2, the Monticello Browser > does > not give you any hint that it is stale and should be moved into the > treated > inbox (provided that I chose option B in step 2) because you cannot see > the > discussion from the mailing list there. The mail-archive thread about > Package-ct.2, too, does not contain any reference to Package-ct.3 (unless > I'm sending another piece of noise manually). On the other hand, if I > chose > option 2.A, you cannot review Package-ct.3 standalone neither in the > Monticello Browser nor in the mailing thread. And things get more > complicated if just another review is left on the proposal before it can > be > merged ... > Of course, as I am not a merging person, I cannot tell whether step 3 > exactly describes your workflow as a merger, but I am facing very similar > issues when trying to get an overview of my own contribution. And also, we > had several small incidents in the past when something was merged that > actually should have been improved before (just for example, > Regex-Core-ct.56). > > So how could this look differently when applying the GitHub workflow? > 1) For the initial proposal, I'm opening a new Pull Request to merge > "helpbrowser-menu" into "trunk" with a single commit commit-a. > 2) To react on the kind person's feedback, I add another commit commit-b > to > this branch. GitHub, the GitBrowser, and every other git client will > automatically display the connection between both commits, and because > commit-a is no longer a head commit, it will not be considered as a > complete > feature by anybody any longer. > 3) Every subsequent feedback can be left directly to the Pull Request > thread > (which can be easily synchronized with the mailing list using a bot > similar > to the OpenSmalltalk-VM-Bot) and be resolved by just another commit to > this > branch. All version information is kept at one single place. > *) As a bonus, GitHub offers a bunch of useful features that make it > easier > to overview and organize all contributions. For example, we can > automatically run the CI for every Pull Request (which I'm sure would help > us to introduce a smaller number of bugs into the Trunk/master); issue/PR > references are automatically displayed on both ends of a link; people can > be > assigned to certain PRs; labels can be used to mark a PR as draft, fix, > enhancement, review, etc. and much more ... Also, there is already an > existing project to integrate GitHub conversations into Squeak, see > SqueakIssueIntegration. > *) Another plus could be organizing all packages in one repository to get > rid of changesets sent to the list which I find truly unhandy as they are > not really designed for versioning. -- Sent from: http://forum.world.st/Squeak-Dev-f45488.html -------------- next part -------------- An HTML attachment was scrubbed... URL: From forums.jakob at resfarm.de Thu Oct 1 22:13:26 2020 From: forums.jakob at resfarm.de (Jakob Reschke) Date: Thu, 1 Oct 2020 17:13:26 -0500 (CDT) Subject: [squeak-dev] Development methodology (was: tedious programming-in-the-debugger error needs fixing) In-Reply-To: <1601475775699-0.post@n4.nabble.com> References: <1a26fe2675b14feaa16b483d54afa361@student.hpi.uni-potsdam.de> <1599137423163-0.post@n4.nabble.com> <23476c3e0a68492c8cc917c38ba2c9d4@student.hpi.uni-potsdam.de> <1601475775699-0.post@n4.nabble.com> Message-ID: <1601590406774-0.post@n4.nabble.com> Christoph Thiede wrote >> But, our community is small > > That's another good point, I'd love to see more contributions by more > people > on the Squeak project! But from my point of view, the mailing-list-based > workflow is simply a quite conservative approach that might keep many > potentially interested casual Squeakers away from participating in our > community. I think the following article provides a very good summary of > my > thought on this matter: "Relying on plain-text email is a 'barrier to > entry' > for kernel development, says Linux Foundation board member" > (https://www.theregister.com/2020/08/25/linux_kernel_email/). Marcel > argued > that the mailing list works as a filter for keeping unexperienced or > unqualified people away from our community, but I believe our community is > too small for throwing away all these possible contributions. Agreed. Elitism does not help at all. Ask Uncle Bob [1]. Also subscribing to a mailing list feels somehow different than signing up on Stack Overflow or GitHub. Some people don't like to get involved in a club just because they work with something and might want to fix a bug or make some contributions every now and then. (How nice of them!) Arguably a submission to the Inbox has hardly any barriers (no need to sign up anywhere), but to get the feedback, advertise your change, and communicate effectively you have to sign up. [1] https://youtu.be/YX3iRjKj7C0?t=2190 -- Sent from: http://forum.world.st/Squeak-Dev-f45488.html From tim at rowledge.org Thu Oct 1 22:19:16 2020 From: tim at rowledge.org (tim Rowledge) Date: Thu, 1 Oct 2020 15:19:16 -0700 Subject: [squeak-dev] Weird Pi Squeak slowdown alert Message-ID: This is weird, annoying and driving me nuts. I'm trying everything I can think of to work out what is happening but just in case anybody else here is using Squeak on a Pi4 ... Since January my Pi 4 has been returning 810 million bc/sc and 60 million-ish sends/sec for the tinyBenchmarks. Recently it has seemed to slow down oddly , back down to Pi 3+ values of 330/29-ish. I haven't found any rhyme or reason for it so far. I don't think it is simply some artefact messing the benchmark either; it definitely feels slower. A while back I noticed this, did some fiddling and set up FSTRIM on the SSD I use; that seemed to solve the problem at the time but clearly didn't really solve it. I've done the trivial - rebooting, different vintage of VM, different images, different screen resolution. I've done more involved - trying assorted FSTRIM stuff for the SSD, running from uSD card again, cooling harder. crossing my legs differently. Nothing seems to make sense. Is anybody else running a Pi 4 with plain old Raspberry Pi OS 32 bit and Squeak? tim -- tim Rowledge; tim at rowledge.org; http://www.rowledge.org/tim When all else fails, let a = 7. If that doesn't help, then read the manual. From forums.jakob at resfarm.de Thu Oct 1 22:22:33 2020 From: forums.jakob at resfarm.de (Jakob Reschke) Date: Fri, 2 Oct 2020 00:22:33 +0200 Subject: [squeak-dev] Development methodology (was: tedious programming-in-the-debugger error needs fixing) In-Reply-To: <90af770130c54603a4f15c90458c7692@student.hpi.uni-potsdam.de> References: <1a26fe2675b14feaa16b483d54afa361@student.hpi.uni-potsdam.de> <1599137423163-0.post@n4.nabble.com> <23476c3e0a68492c8cc917c38ba2c9d4@student.hpi.uni-potsdam.de> <1601475775699-0.post@n4.nabble.com> <1601585879135-0.post@n4.nabble.com> <90af770130c54603a4f15c90458c7692@student.hpi.uni-potsdam.de> Message-ID: Am Do., 1. Okt. 2020 um 23:43 Uhr schrieb Thiede, Christoph : > > > Sounds like Christoph wants an issue tracker that is integrated with the version control system. > > Exactly. You managed to summarize in one sentence which took me two screen pages. :-) > Usually it's me who writes the walls of text, but you're welcome. ;-) > > The actual question is how big is the actual demand for such a hybrid/two-way VCS for us a community (and not for me as a single Monticello-moaning person) and how many people actually would like to use the git interface. > Well I have lost track myself of how many of my Inbox submissions have actually been merged, or even been commented or not... even with a label for them in Gmail I find it just too cumbersome to follow up and run after all of those that get no attention (and compared to you I don't submit all that many). The Inbox submission email can be far away from the Trunk merge email of the same version, just to give one example of another first world problem. Also most inbox threads do not explicitly get "closed" and instead remain dangling around. From tim at rowledge.org Thu Oct 1 22:29:25 2020 From: tim at rowledge.org (tim Rowledge) Date: Thu, 1 Oct 2020 15:29:25 -0700 Subject: [squeak-dev] Development methodology (was: tedious programming-in-the-debugger error needs fixing) In-Reply-To: <1601590406774-0.post@n4.nabble.com> References: <1a26fe2675b14feaa16b483d54afa361@student.hpi.uni-potsdam.de> <1599137423163-0.post@n4.nabble.com> <23476c3e0a68492c8cc917c38ba2c9d4@student.hpi.uni-potsdam.de> <1601475775699-0.post@n4.nabble.com> <1601590406774-0.post@n4.nabble.com> Message-ID: <076817EE-1506-47F9-9AF4-3126C6D3BC76@rowledge.org> > On 2020-10-01, at 3:13 PM, Jakob Reschke wrote: > Also subscribing to > a mailing list feels somehow different than signing up on Stack Overflow or > GitHub. I think this must be something of a generational thing. Us Old Folk are, I suspect, much more likely to see it the other way round. A lot of us have lived on email for... well, about as long as humans have known about electricity. Signing up on a website, on the other hand, seems really annoying and intrusive to me. tim -- tim Rowledge; tim at rowledge.org; http://www.rowledge.org/tim Strange OpCodes: SEXI: Sign EXtend Integer From eliot.miranda at gmail.com Thu Oct 1 23:06:44 2020 From: eliot.miranda at gmail.com (Eliot Miranda) Date: Thu, 1 Oct 2020 16:06:44 -0700 Subject: [squeak-dev] Ephemerons and Dictionaries In-Reply-To: References: Message-ID: Hi Levente, On Thu, Oct 1, 2020 at 12:55 PM Levente Uzonyi wrote: > Hi Eliot, > > On Thu, 1 Oct 2020, Eliot Miranda wrote: > > > > > > > On Thu, Oct 1, 2020 at 11:41 AM Levente Uzonyi > wrote: > > Hi Eliot, > > > > On Thu, 1 Oct 2020, Eliot Miranda wrote: > > > > > Hi All, > > > > > > to be able to ease EphemeronDicitonary into the system > easily I'd like to clean up adding associations to Dictionary. It seems to > me there's a partial implementation of choosing an association class > > appropriate for a > > > dictionary in the implementors of > associationClass: Dictionary>>#associationClass, WeakKeyDictionary>>#associationClass, WeakValueDictionary>>#associationClass, > (& in my image STON class>>#associationClass). > > This seems > > > workable; an EphemeronDictionary would simply > add associationClass ^ Ephemeron and we're done, except not quite... > > > > What's the definition of Ephemeron? > Sorry for being dense. It needed a good class comment anyway, so the below was a reasonable draft. Association ephemeronSubclass: #Ephemeron instanceVariableNames: 'container' classVariableNames: '' poolDictionaries: '' category: 'System-Finalization' is my working definition. Subject to change, of course. It looks as if atNewIndex:put: will serve perfectly well. > > > > > > An Ephemeron is an association known to the garbage collection system., > allowing it to function as a pre-mortem finalizer. > > > > A Ephemeron is intended for uses such as associating an object's > dependents with an object without preventing garbage collection. > > > > Consider a traditional implementation of dependents in non-Model > classes. There is a Dictionary in Object, DependentsFields. Objects > wishing to have dependents are entered as keys in DependentsFields and the > value is a > > sequence of their dependents. Since their dependents (if they are like > views/morphs, etc in MVC) will refer directly to the key object (in their > model inst var etc), there is no way to use weak collections in > > DependentsFields to allow the cycle of an object and its dependents to > be collected. If DependentsFields uses a WeakArray to hold the > associations from objects to their dependents then those associations, and > the > > dependencies with it will simply be lost since the only reference to the > associations is in DependentsFields. > > > > Ephemeron differs from a normal association in that it is known to the > garbage collector and it is involved in tracing. First, note that an > Ephemeron is a *strong* referrer. The objects it refers to cannot be > garbage > > collected. It is not weak. But it is able to discover when it is the > *only* reference to an object. To be accurate, an Ephemeron is notified by > the collector when its key is only references from the transitive closure of > > references from ephemerons. i.e. when an ephemeron is notified we know > that there are no reference paths to the ephemeron's key other than through > ephemerons. > > > > Ephemerons are notified by the garage collector placing them in a queue > and signalling a semaphore for each element in the queue. An image level > process (the extended finalization process) extracts them from the queue and > > sends mourn to each ephemeron (since its key is effectively dead). What > an Ephemeron does in response to the notification is programmable (one can > add subclasses of Ephemeron). But the default behaviour is to send finalize > > to the key, and then to remove itself from the dictionary it is in, > allowing it and the transitive closure of objects reachable form it, to be > collected in a subsequent garbage collection. > > > > Implementation: both in scavenging, and in scan-mark, if an ephemeron is > encountered its key is examined. If the key is reachable from the roots > (has already been scavenged, or is already marked), then the ephemeron > marked > > and treated as an ordinary object. If the key is not yet known to be > reachable the ephemeron is held in an internal queue of maybe triggerable > ephemerons, and its objects are not traced. > > > > At the end of the initial scavenge or scan-mark phase, this queue of > triggerable ephemerons is examined. All ephemerons in the list whose key > is reachable are traced, and removed from the list. This then leaves the > list > > populated only with ephemerons whose keys are as yet untraced, and hence > only referenced from the ephemerons in the triggerable ephemeron queue, > which now becomes the triggered ephemeron queue. All these ephemerons are > > placed in the finalization queue for processing in the image above, and > all objects reachable from the ephemerons are traced (scavenged, marked). > This phase may encounter new triggerable ephemerons which will be added to > the > > triggerable ephemeron queue (not likely in practice, but essential for > sound semantics). So the triggering phase continues until the system nds > at a fixed point with an empty triggerable ephemeron queue. > > > > Implications and advantages: > > Because ephemerons do not allow their object to be collected, they can > be, and are, used to implement pre-mortem finalization. So e.g. a file can > flush its buffers and then close its file descriptor before being collected > > (which may also imply that the system runs the garbage collector > *before* snapshotting, not as part of the snapshot primitive). Ephemerons > are conceptually more simple than WeakKeyDictionary et al, since they are > about > > reference path, not merely the existence of strong references. The back > reference from a dependent to an object renders a weak key > dictionary useless in enabling an isolated cycle to be collected since the > back reference is > > string, and keeps the reference from the weak key alive. > > > > History: Ephemerons are like guardians. They were invented by George > Bosworth in the early '90's, to provide pre-mortem finalization and to > solve the problem of DependentsFields retaining garbage. > > Sorry for not being clear. I was asking about the class definition to see > what fields it would have. I presume the first line is something like: > > Object ephemeronSubclass: #Ephemeron > ... > > > > > > > > > > > First, HashedCollection does not use associationClass, but it > implements atNewIndex:put: and it strikes me that atNewIndex:put: for > Dictionary really should check for the thing being added at least > > includingBehavior: self > > > > HashedCollection does not use associationClass because > HashedCollections > > in general (e.g. Sets) may store any object in their internal > array not > > just Associations. > > Dictionary introduces #associationClass because it only stores > > associations (except for MethodDictionary of course). > > > > #atNewIndex:put: is a private method. Its senders must ensure that > the > > arguments will not corrupt the receiver's internal state > > > > > associationClass. So that means Dictionary should override > atNewIndex:put:. > > > > Can you give a bit more information about how EphemeronDictionary > should > > work? > > > > > > If one wants an object to be sent finalize before it is collected one > simply stores it in an EphemeronDictionary, which uses instances of > Ephemeron as its associations. So e.g. > > > > StandardFileStream>>initialize > > ... > > self registerForFinalization. > > ... > > > > Object>>registerForFinalization > > FinalizationDictionary at: self put: nil. > > > > and DependentsFields becomes a variant that uses a subclass of Ephemeron > that does not send finalize (or vice verce). > > > > Or we could keep it simple and use DependentsFields, have finalize sent > to objects in DependentsFields when no longer reachable, but have a null > finalize method in Object. > > Again, sorry for not being clear. I would like to know how the current > implementation of #atNewIndex:put: could prevent EphemeronDictionary to > work as intended. > Does EphemeronDictionary do something special other dictionaries don't > that is not compatible with how #atNewIndex:put: currently works? > > > Levente > > > > > Levente > > > > > > > > But what should happen in atNewIndex:put: if the object being > added isn't appropriate? Do we > > > - raise an error? (that's my preference, but I've got limited > use cases in my head) > > > - replace the association with one of assocationClass? (seems > dangerous to me but maybe someone needs this or the existing system does > this anyway) > > > - ignore it and hope the user knows what they're doing? > > > > > > _,,,^..^,,,_ > > best, Eliot > > > > > -- _,,,^..^,,,_ best, Eliot -------------- next part -------------- An HTML attachment was scrubbed... URL: From commits at source.squeak.org Thu Oct 1 23:19:56 2020 From: commits at source.squeak.org (commits at source.squeak.org) Date: Thu, 1 Oct 2020 23:19:56 0000 Subject: [squeak-dev] The Trunk: Collections-eem.913.mcz Message-ID: Eliot Miranda uploaded a new version of Collections to project The Trunk: http://source.squeak.org/trunk/Collections-eem.913.mcz ==================== Summary ==================== Name: Collections-eem.913 Author: eem Time: 1 October 2020, 4:19:52.930593 pm UUID: fb7fd4f9-a89f-4a71-8807-66b7d9861f06 Ancestors: Collections-eem.912 Move arrayType to the instance side where it matches associationClass, and where it is more convenient for everything except arguably OrderedCollection. Have OrderedCollection compensate very simply. =============== Diff against Collections-eem.912 =============== Item was removed: - ----- Method: FloatCollection class>>arrayType (in category 'private') ----- - arrayType - ^ Float32Array! Item was added: + ----- Method: FloatCollection>>arrayType (in category 'private') ----- + arrayType + ^ Float32Array! Item was removed: - ----- Method: HashedCollection class>>arrayType (in category 'private') ----- - arrayType - ^ Array! Item was added: + ----- Method: HashedCollection>>arrayType (in category 'private') ----- + arrayType + ^ Array! Item was changed: ----- Method: HashedCollection>>growTo: (in category 'private') ----- growTo: anInteger "Grow the elements array and reinsert the old elements" | oldElements | oldElements := array. + array := self arrayType new: anInteger. - array := self class arrayType new: anInteger. self noCheckNoGrowFillFrom: oldElements! Item was changed: ----- Method: HashedCollection>>initialize: (in category 'private') ----- initialize: n "Initialize array to an array size of n" + array := self arrayType new: n. - array := self class arrayType new: n. tally := 0! Item was removed: - ----- Method: NonPointersOrderedCollection class>>arrayType (in category 'private') ----- - arrayType - "This method must return a non-pointers array class." - - self subclassResponsibility! Item was added: + ----- Method: NonPointersOrderedCollection>>arrayType (in category 'private') ----- + arrayType + "This method must return a non-pointers array class." + + self subclassResponsibility! Item was removed: - ----- Method: OrderedCollection class>>arrayType (in category 'private') ----- - arrayType - ^ Array! Item was changed: ----- Method: OrderedCollection class>>new: (in category 'instance creation') ----- new: anInteger + | instance | + ^(instance := self basicNew) setCollection: (instance arrayType new: anInteger)! - ^ self basicNew setCollection: (self arrayType new: anInteger)! Item was changed: ----- Method: OrderedCollection class>>new:withAll: (in category 'instance creation') ----- new: anInteger withAll: anObject + | instance | + ^(instance := self basicNew) setContents: (instance arrayType new: anInteger withAll: anObject)! - ^ self basicNew setContents: (self arrayType new: anInteger withAll: anObject)! Item was added: + ----- Method: OrderedCollection>>arrayType (in category 'private') ----- + arrayType + ^ Array! Item was changed: ----- Method: OrderedCollection>>growAtFirst (in category 'private') ----- growAtFirst "Add new empty slots to the front of array, while keeping the empty slots at the end." | newArray newFirstIndex newLastIndex | + newArray := self arrayType new: (array size * 2 max: 1). - newArray := self class arrayType new: (array size * 2 max: 1). newFirstIndex := newArray size - array size + firstIndex. newLastIndex := newFirstIndex + lastIndex - firstIndex. newArray replaceFrom: newFirstIndex to: newLastIndex with: array startingAt: firstIndex. array := newArray. firstIndex := newFirstIndex. lastIndex := newLastIndex! Item was changed: ----- Method: OrderedCollection>>growAtLast (in category 'private') ----- growAtLast "Add new empty slots to the end of array, while keeping the empty slots at the front." | newArray | + newArray := self arrayType new: (array size * 2 max: 1). - newArray := self class arrayType new: (array size * 2 max: 1). newArray replaceFrom: firstIndex to: lastIndex with: array startingAt: firstIndex. array := newArray! Item was changed: ----- Method: OrderedCollection>>removeAll (in category 'removing') ----- removeAll "remove all the elements from this collection. Keep same amount of storage" + self setCollection: (self arrayType new: array size)! - self setCollection: (self class arrayType new: array size)! Item was changed: ----- Method: OrderedDictionary>>growTo: (in category 'private') ----- growTo: anInteger | oldOrder | super growTo: anInteger. oldOrder := order. "Grow only to 75%. See #atNewIndex:put: in HashedCollection." + order := self arrayType new: anInteger + 1 * 3 // 4. - order := self class arrayType new: anInteger + 1 * 3 // 4. order replaceFrom: 1 to: tally with: oldOrder startingAt: 1! Item was changed: ----- Method: OrderedDictionary>>initialize: (in category 'private') ----- initialize: n super initialize: n. + order := self arrayType new: n + 1 * 3 // 4! - order := self class arrayType new: n + 1 * 3 // 4! Item was changed: ----- Method: OrderedDictionary>>postCopyFrom:to: (in category 'copying') ----- postCopyFrom: startIndex to: endIndex "Adapted from SequenceableCollection and OrderedCollection." | oldOrder | oldOrder := order. + array := self arrayType - array := self class arrayType new: (self class goodPrimeAtLeast: endIndex - startIndex + 1 * 4 // 3). "fill 75% to 100%" + order := self arrayType - order := self class arrayType new: array size + 1 * 3 // 4. "remove 25%" startIndex to: endIndex do: [:index | | element | element := (oldOrder at: index) copy. order at: index - startIndex + 1 put: element. array at: (self scanFor: element key) put: element]. + tally := endIndex - startIndex + 1! - tally := endIndex - startIndex + 1.! Item was added: + ----- Method: ReadStream>>contentsFrom:to: (in category 'accessing') ----- + contentsFrom: startIndex to: stopIndex + "Answer with a copy of my collection from startIndex to stopIndex." + + ^collection copyFrom: (initialPositionOrNil ifNil: [1]) + startIndex - 1 to: ((initialPositionOrNil ifNil: [1]) + stopIndex - 1 min: readLimit)! Item was removed: - ----- Method: WeakIdentityDictionary class>>arrayType (in category 'private') ----- - arrayType - ^ WeakArray! Item was added: + ----- Method: WeakIdentityDictionary>>arrayType (in category 'private') ----- + arrayType + ^ WeakArray! Item was changed: ----- Method: WeakIdentityDictionary>>growTo: (in category 'private') ----- growTo: anInteger "Grow the elements array and reinsert the old elements" | oldElements | oldElements := array. + array := self arrayType new: anInteger withAll: vacuum. - array := self class arrayType new: anInteger withAll: vacuum. self noCheckNoGrowFillFrom: oldElements! Item was changed: ----- Method: WeakIdentityDictionary>>initialize: (in category 'private') ----- initialize: n vacuum := Object new. + array := self arrayType new: n withAll: vacuum. - array := self class arrayType new: n withAll: vacuum. tally := 0! Item was removed: - ----- Method: WeakOrderedCollection class>>arrayType (in category 'private') ----- - arrayType - ^ WeakArray! Item was added: + ----- Method: WeakOrderedCollection>>arrayType (in category 'private') ----- + arrayType + ^ WeakArray! Item was removed: - ----- Method: WeakSet class>>arrayType (in category 'private') ----- - arrayType - - ^WeakArray! Item was added: + ----- Method: WeakSet>>arrayType (in category 'private') ----- + arrayType + + ^WeakArray! Item was changed: ----- Method: WeakSet>>growTo: (in category 'private') ----- growTo: anInteger "Grow the elements array and reinsert the old elements" | oldElements | oldElements := array. + array := self arrayType new: anInteger withAll: flag. - array := self class arrayType new: anInteger withAll: flag. self noCheckNoGrowFillFrom: oldElements! From commits at source.squeak.org Thu Oct 1 23:23:09 2020 From: commits at source.squeak.org (commits at source.squeak.org) Date: Thu, 1 Oct 2020 23:23:09 0000 Subject: [squeak-dev] The Trunk: Kernel-eem.1342.mcz Message-ID: Eliot Miranda uploaded a new version of Kernel to project The Trunk: http://source.squeak.org/trunk/Kernel-eem.1342.mcz ==================== Summary ==================== Name: Kernel-eem.1342 Author: eem Time: 1 October 2020, 4:23:04.242629 pm UUID: 3f8b16e1-4140-4127-8885-b8b3f8644411 Ancestors: Kernel-eem.1341 Oops! Forgot to commit isLinkedNamedPrimitive used by soundPluginActive. Have Class>>binding use a ClassBinding for metaclass mclass associations too. =============== Diff against Kernel-eem.1341 =============== Item was changed: ----- Method: Class>>binding (in category 'compiling') ----- binding "Answer a binding for the receiver, sharing if possible" + (self environment bindingOf: name ifAbsent: nil) ifNotNil: + [:bindingOrNil| + bindingOrNil value == self ifTrue: + [^bindingOrNil]]. + ^ClassBinding key: nil value: self! - | binding | - binding := self environment associationAt: name ifAbsent: [nil -> self]. - ^binding value == self ifTrue:[binding] ifFalse:[nil -> self].! Item was changed: ----- Method: CompiledMethod>>isLinkedNamedPrimitive (in category 'testing') ----- isLinkedNamedPrimitive "Answer if the receiver invokes a named primitive, and the method is linked to an actual primitive. + For example if the method hasn't yet been used in the current session, it won't be linked" - For example if the method hasn;t yet been used in the current session, it won't be linked" ^self isNamedPrimitive and: [(self literalAt: 1) fourth ~= 0] "self systemNavigation browseAllSelect: [:m| m isLinkedNamedPrimitive]"! From Christoph.Thiede at student.hpi.uni-potsdam.de Thu Oct 1 23:23:19 2020 From: Christoph.Thiede at student.hpi.uni-potsdam.de (Thiede, Christoph) Date: Thu, 1 Oct 2020 23:23:19 +0000 Subject: [squeak-dev] Development methodology (was: tedious programming-in-the-debugger error needs fixing) In-Reply-To: <076817EE-1506-47F9-9AF4-3126C6D3BC76@rowledge.org> References: <1a26fe2675b14feaa16b483d54afa361@student.hpi.uni-potsdam.de> <1599137423163-0.post@n4.nabble.com> <23476c3e0a68492c8cc917c38ba2c9d4@student.hpi.uni-potsdam.de> <1601475775699-0.post@n4.nabble.com> <1601590406774-0.post@n4.nabble.com>, <076817EE-1506-47F9-9AF4-3126C6D3BC76@rowledge.org> Message-ID: > Agreed. Elitism does not help at all. Ask Uncle Bob [1]. Great talk, thanks a lot for sharing this! > Well I have lost track myself of how many of my Inbox submissions have actually been merged, or even been commented or not... even with a label for them in Gmail I find it just too cumbersome to follow up and run after all of those that get no attention (and compared to you I don't submit all that many). I have been trying a number of approaches, too, from todo lists over email folders to Trello boards, but it is simply too complex because it is a parallel data structure you have to maintain, and every interested person needs to maintain it themselves again ... This reminds me of the Primitive Obsession code smell: We all seem to think of the same model ("submission", "review", "fix", "close") but still use a forest of primitive artifacts (separate email posts/inbox versions) to represent them. Not exactly worthy of a project that is dedicated to the Golden rule of "Everything is an object" and a universal object graph, I believe ... :-) > The Inbox submission email can be far away from the Trunk merge email of the same version, just to give one example of another first world problem. That's a good observation. How expensive would it be to change SqueakSource so that Trunk merge emails are replied to their inbox ancestor email, if there is any? I tried to load SqueakSource into an image, but for now, I failed to resolve all the dependencies ... (This should probably go into another thread.) > I think this must be something of a generational thing. Us Old Folk are, I suspect, much more likely to see it the other way round. A lot of us have lived on email for... well, about as long as humans have known about electricity. Signing up on a website, on the other hand, seems really annoying and intrusive to me. Well I can tell that in my generation, mailing lists are definitively much more considered as obsolete and disliked. Everyone has a GitHub account (or if not yet, this costs you one minute for millions of projects) while for a mailing list, you have to fill in a subscription form for every new project ... IMO email has failed in so many points where alternatives provide better solutions. How many "> > > > original post > > > quoted by me > > quoted by you > don't eat my quote characters!1", unwanted line breaks after every third word or so, different confusing fonts and sizes, and much more have I been reading in this list! Platforms have the uniform Markdown standard to get rid of all this mess. Also, managing subscriptions for individual threads is so much easier on GitHub & Co. I think could carry on for a few more paragraphs, but that's probably not the point. :-) Best, Christoph ________________________________ Von: Squeak-dev im Auftrag von tim Rowledge Gesendet: Freitag, 2. Oktober 2020 00:29:25 An: The general-purpose Squeak developers list Betreff: Re: [squeak-dev] Development methodology (was: tedious programming-in-the-debugger error needs fixing) > On 2020-10-01, at 3:13 PM, Jakob Reschke wrote: > Also subscribing to > a mailing list feels somehow different than signing up on Stack Overflow or > GitHub. I think this must be something of a generational thing. Us Old Folk are, I suspect, much more likely to see it the other way round. A lot of us have lived on email for... well, about as long as humans have known about electricity. Signing up on a website, on the other hand, seems really annoying and intrusive to me. tim -- tim Rowledge; tim at rowledge.org; http://www.rowledge.org/tim Strange OpCodes: SEXI: Sign EXtend Integer -------------- next part -------------- An HTML attachment was scrubbed... URL: From robert.withers at pm.me Thu Oct 1 23:57:48 2020 From: robert.withers at pm.me (Robert Withers) Date: Thu, 01 Oct 2020 23:57:48 +0000 Subject: [squeak-dev] Curious history Message-ID: I am curious. Who was the original author of the VMMaker Tool? -- Kindly, rabbit . ..  ...   '...^,^ From tim at rowledge.org Fri Oct 2 00:35:41 2020 From: tim at rowledge.org (tim Rowledge) Date: Thu, 1 Oct 2020 17:35:41 -0700 Subject: [squeak-dev] Curious history In-Reply-To: References: Message-ID: <39CF58F8-AFA5-4BFD-9369-375613ADC72D@rowledge.org> > On 2020-10-01, at 4:57 PM, Robert Withers via Squeak-dev wrote: > > I am curious. Who was the original author of the VMMaker Tool? That would be me; back in exobox days. Written along with the original VMMaker and intended to be an example of clean, tidy, morphic usage. I've no idea if anyone ever uses it now, since running it via scripting has proven more valuable. tim -- tim Rowledge; tim at rowledge.org; http://www.rowledge.org/tim "Wibble" said Pooh the stress beginning to show. From robert.withers at pm.me Fri Oct 2 00:55:49 2020 From: robert.withers at pm.me (Robert Withers) Date: Fri, 02 Oct 2020 00:55:49 +0000 Subject: [squeak-dev] *****SPAM***** Curious history In-Reply-To: <39CF58F8-AFA5-4BFD-9369-375613ADC72D@rowledge.org> References: <39CF58F8-AFA5-4BFD-9369-375613ADC72D@rowledge.org> Message-ID: <10ab4386-3724-f33d-7f2c-214ab30da053@pm.me> The worst sort of person is one who takes the credit for the work of another. Wouldn't you agree? You may wish to hear John's judgement on the matter. He was right there when it was first built. If you are not humble you will be humiliated, and brought low. rww On 10/1/20 8:35 PM, tim Rowledge wrote: > > >> On 2020-10-01, at 4:57 PM, Robert Withers via Squeak-dev wrote: >> >> I am curious. Who was the original author of the VMMaker Tool? > That would be me; back in exobox days. Written along with the original VMMaker and intended to be an example of clean, tidy, morphic usage. I've no idea if anyone ever uses it now, since running it via scripting has proven more valuable. > > > tim > -- > tim Rowledge; tim at rowledge.org; http://www.rowledge.org/tim > "Wibble" said Pooh the stress beginning to show. > > > -- K, r From robert.withers at pm.me Fri Oct 2 01:04:58 2020 From: robert.withers at pm.me (Robert Withers) Date: Fri, 02 Oct 2020 01:04:58 +0000 Subject: [squeak-dev] *****SPAM***** Curious history In-Reply-To: <10ab4386-3724-f33d-7f2c-214ab30da053@pm.me> References: <39CF58F8-AFA5-4BFD-9369-375613ADC72D@rowledge.org> <10ab4386-3724-f33d-7f2c-214ab30da053@pm.me> Message-ID: <58414aa7-bf89-bcda-965f-b2d9d07331f5@pm.me> Perhaps a look at the method timestamps would prove illuminating. On 10/1/20 8:55 PM, Robert Withers wrote: > The worst sort of person is one who takes the credit for the work of > another. Wouldn't you agree? > > You may wish to hear John's judgement on the matter. He was right there > when it was first built. > > If you are not humble you will be humiliated, and brought low. > > rww > > On 10/1/20 8:35 PM, tim Rowledge wrote: >> >>> On 2020-10-01, at 4:57 PM, Robert Withers via Squeak-dev wrote: >>> >>> I am curious. Who was the original author of the VMMaker Tool? >> That would be me; back in exobox days. Written along with the original VMMaker and intended to be an example of clean, tidy, morphic usage. I've no idea if anyone ever uses it now, since running it via scripting has proven more valuable. >> >> >> tim >> -- >> tim Rowledge; tim at rowledge.org; http://www.rowledge.org/tim >> "Wibble" said Pooh the stress beginning to show. >> >> >> -- K, r From eliot.miranda at gmail.com Fri Oct 2 01:14:58 2020 From: eliot.miranda at gmail.com (Eliot Miranda) Date: Thu, 1 Oct 2020 18:14:58 -0700 Subject: [squeak-dev] Curious history In-Reply-To: <39CF58F8-AFA5-4BFD-9369-375613ADC72D@rowledge.org> References: <39CF58F8-AFA5-4BFD-9369-375613ADC72D@rowledge.org> Message-ID: Hi Tim, On Thu, Oct 1, 2020 at 5:35 PM tim Rowledge wrote: > > > > On 2020-10-01, at 4:57 PM, Robert Withers via Squeak-dev < > squeak-dev at lists.squeakfoundation.org> wrote: > > > > I am curious. Who was the original author of the VMMaker Tool? > > That would be me; back in exobox days. Written along with the original > VMMaker and intended to be an example of clean, tidy, morphic usage. I've > no idea if anyone ever uses it now, since running it via scripting has > proven more valuable. > Scripting usage is convenient for generating the whole caboodle, as they call it. But for one off plugin generation I still use it. It is most convenient for that. Thank you. > > > tim > -- > tim Rowledge; tim at rowledge.org; http://www.rowledge.org/tim > "Wibble" said Pooh the stress beginning to show. > > > > -- _,,,^..^,,,_ best, Eliot -------------- next part -------------- An HTML attachment was scrubbed... URL: From robert.withers at pm.me Fri Oct 2 01:34:20 2020 From: robert.withers at pm.me (Robert Withers) Date: Fri, 02 Oct 2020 01:34:20 +0000 Subject: [squeak-dev] Curious history In-Reply-To: References: <39CF58F8-AFA5-4BFD-9369-375613ADC72D@rowledge.org> Message-ID: On 10/1/20 9:14 PM, Eliot Miranda wrote: > Hi Tim, > > On Thu, Oct 1, 2020 at 5:35 PM tim Rowledge wrote: > >>> On 2020-10-01, at 4:57 PM, Robert Withers via Squeak-dev wrote: >>> >>> I am curious. Who was the original author of the VMMaker Tool? >> >> That would be me; back in exobox days. Written along with the original VMMaker and intended to be an example of clean, tidy, morphic usage. I've no idea if anyone ever uses it now, since running it via scripting has proven more valuable. > > Scripting usage is convenient for generating the whole caboodle, as they call it. But for one off plugin generation I still use it. It is most convenient for that. Most excellent. I am glad to hear it, Eliot. > Thank you. Um... rww 9/23/2001 14:17. >> tim >> -- >> tim Rowledge; tim at rowledge.org; http://www.rowledge.org/tim >> "Wibble" said Pooh the stress beginning to show. > > -- > > _,,,^..^,,,_ > best, Eliot -- K, r -------------- next part -------------- An HTML attachment was scrubbed... URL: From robert.withers at pm.me Fri Oct 2 01:37:43 2020 From: robert.withers at pm.me (Robert Withers) Date: Fri, 02 Oct 2020 01:37:43 +0000 Subject: [squeak-dev] Curious history In-Reply-To: References: <39CF58F8-AFA5-4BFD-9369-375613ADC72D@rowledge.org> Message-ID: <9265ae8f-cb8f-c30c-d2ed-3479195fc89c@pm.me> browseSelectedAvailablePlugin rww 9/25/2001 02:00 browseSelectedExternalPlugin rww 9/25/2001 02:00 browseSelectedInternalPlugin rww 9/25/2001 02:01 perform:orSendTo: rww 9/25/2001 01:02 saveConfig rww 9/23/2001 14:17 Just saying is all. Out with the Truth! rabbit . .. ... '...^,^ On 10/1/20 9:34 PM, Robert Withers wrote: > On 10/1/20 9:14 PM, Eliot Miranda wrote: > >> Hi Tim, >> >> On Thu, Oct 1, 2020 at 5:35 PM tim Rowledge wrote: >> >>>> On 2020-10-01, at 4:57 PM, Robert Withers via Squeak-dev wrote: >>>> >>>> I am curious. Who was the original author of the VMMaker Tool? >>> >>> That would be me; back in exobox days. Written along with the original VMMaker and intended to be an example of clean, tidy, morphic usage. I've no idea if anyone ever uses it now, since running it via scripting has proven more valuable. >> >> Scripting usage is convenient for generating the whole caboodle, as they call it. But for one off plugin generation I still use it. It is most convenient for that. > > Most excellent. I am glad to hear it, Eliot. > >> Thank you. > > Um... > > rww 9/23/2001 14:17. > >>> tim >>> -- >>> tim Rowledge; tim at rowledge.org; http://www.rowledge.org/tim >>> "Wibble" said Pooh the stress beginning to show. >> >> -- >> >> _,,,^..^,,,_ >> best, Eliot > > -- > K, r -- K, r -------------- next part -------------- An HTML attachment was scrubbed... URL: From commits at source.squeak.org Fri Oct 2 02:29:46 2020 From: commits at source.squeak.org (commits at source.squeak.org) Date: Fri, 2 Oct 2020 02:29:46 0000 Subject: [squeak-dev] The Trunk: Tools-eem.991.mcz Message-ID: Eliot Miranda uploaded a new version of Tools to project The Trunk: http://source.squeak.org/trunk/Tools-eem.991.mcz ==================== Summary ==================== Name: Tools-eem.991 Author: eem Time: 1 October 2020, 7:29:41.598058 pm UUID: 23455dc2-125f-4fab-8e33-75f63177cb63 Ancestors: Tools-mt.990 Simplify the horribly complex DebuggerMethodMap by removing DebuggerMethodMapForBlueBookMethods and moving opublic protocol up to DebuggerMethodMap from DebuggerMethodMapForClosureCompiledMethods =============== Diff against Tools-mt.990 =============== Item was changed: Object subclass: #DebuggerMethodMap instanceVariableNames: 'timestamp methodReference methodNode abstractSourceRanges sortedSourceMap' classVariableNames: 'AccessLock MapCache MapCacheEntries' poolDictionaries: '' category: 'Tools-Debugger'! + !DebuggerMethodMap commentStamp: 'eem 10/1/2020 19:08' prior: 0! + I am a place-holder for information needed by the Debugger to inspect method activations. I insulate the debugger from details of code generation such as exact bytecode offsets and temporary variable locations. I have two concrete subclasses, one for methods where block bytecodes are embedded in the home method and one for methods where blocks are separate objects (CompiledBlock). These classes deal with temporary variable access. My function is to abstract the source map away from actual bytecode pcs to abstract bytecode pcs. I used to have a subclass for "BlueBook" compiled methods, with non-closure blocks, but this was removed in October 2020 for simplicity's sake. - !DebuggerMethodMap commentStamp: '' prior: 0! - I am a place-holder for information needed by the Debugger to inspect method activations. I insulate the debugger from details of code generation such as exact bytecode offsets and temporary variable locations. I have two concreate subclasses, one for methods compiled using BlueBook blocks and one for methods compiled using Closures. These classes deal with temporary variable access. My function is to abstract the source map away from actual bytecode pcs to abstract bytecode pcs. To reduce compilation time I try and defer as much computation to access time as possible as instances of me will be created after each compilation. I maintain a WeakIdentityDictionary of method to DebuggerMethodMap to cache maps. I refer to my method through a WeakArray to keep the map cache functional. If the reference from a DebuggerMethodMap to its method were strong then the method would never be dropped from the cache because the reference from its map would keep it alive.! Item was changed: ----- Method: DebuggerMethodMap class>>forMethod:methodNode: (in category 'instance creation') ----- forMethod: aMethod "" methodNode: methodNode "" "Uncached instance creation method for private use or for tests. Please consider using forMethod: instead." + ^(aMethod encoderClass supportsFullBlocks + ifTrue: [DebuggerMethodMapForFullBlockCompiledMethods] + ifFalse: [DebuggerMethodMapForClosureCompiledMethods]) new - ^(aMethod isBlueBookCompiled - ifTrue: [DebuggerMethodMapForBlueBookMethods] - ifFalse: - [aMethod encoderClass supportsFullBlocks - ifTrue: [DebuggerMethodMapForFullBlockCompiledMethods] - ifFalse: [DebuggerMethodMapForClosureCompiledMethods]]) new forMethod: aMethod homeMethod methodNode: methodNode! Item was changed: + ----- Method: DebuggerMethodMap>>markRecentlyUsed (in category 'private') ----- - ----- Method: DebuggerMethodMap>>markRecentlyUsed (in category 'accessing') ----- markRecentlyUsed timestamp := Time totalSeconds! Item was changed: ----- Method: DebuggerMethodMap>>namedTempAt:in: (in category 'accessing') ----- namedTempAt: index in: aContext "Answer the value of the temp at index in aContext where index is relative to the array of temp names answered by tempNamesForContext:" + ^self + privateTempAt: index + in: aContext + startKeysToBlockExtents: aContext method startKeysToBlockExtents! - self subclassResponsibility! Item was changed: ----- Method: DebuggerMethodMap>>namedTempAt:put:in: (in category 'accessing') ----- namedTempAt: index put: aValue in: aContext "Assign the value of the temp at index in aContext where index is relative + to the array of temp names answered by tempNamesForContext:. + If the value is a copied value we also need to set it along the lexical chain." + ^self + privateTempAt: index + in: aContext + put: aValue + startKeysToBlockExtents: aContext method startKeysToBlockExtents! - to the array of temp names answered by tempNamesForContext:" - self subclassResponsibility! Item was changed: ----- Method: DebuggerMethodMap>>tempNamesForContext: (in category 'accessing') ----- tempNamesForContext: aContext "Answer an Array of all the temp names in scope in aContext starting with the home's first local (the first argument or first temporary if no arguments)." + ^(self + privateTempRefsForContext: aContext + startKeysToBlockExtents: aContext method startKeysToBlockExtents) collect: + [:pair| pair first]! - self subclassResponsibility! Item was added: + ----- Method: DebuggerMethodMap>>tempNamesForMethod: (in category 'accessing') ----- + tempNamesForMethod: aMethod + "Answer an Array of all the temp names in scope in aMethod starting with + the home's first local (the first argument or first temporary if no arguments)." + ^(self + privateTempRefsForMethod: aMethod + startKeysToBlockExtents: aMethod startKeysToBlockExtents) collect: + [:pair| pair first]! Item was changed: ----- Method: DebuggerMethodMap>>tempsAndValuesForContext: (in category 'accessing') ----- tempsAndValuesForContext: aContext + "Return a string of the temporary variables and their current values" - "Return a string of the temporary variabls and their current values" | aStream | aStream := WriteStream on: (String new: 100). (self tempNamesForContext: aContext) doWithIndex: [:title :index | aStream nextPutAll: title; nextPut: $:; space; tab. aContext print: (self namedTempAt: index in: aContext) on: aStream. aStream cr]. ^aStream contents! Item was changed: + ----- Method: DebuggerMethodMap>>timestamp (in category 'private') ----- - ----- Method: DebuggerMethodMap>>timestamp (in category 'accessing') ----- timestamp ^timestamp! Item was removed: - DebuggerMethodMap subclass: #DebuggerMethodMapForBlueBookMethods - instanceVariableNames: 'tempNames' - classVariableNames: '' - poolDictionaries: '' - category: 'Tools-Debugger'! - - !DebuggerMethodMapForBlueBookMethods commentStamp: 'eem 1/6/2018 16:57' prior: 0! - I am a place-holder for information needed by the Debugger to inspect method activations. See my superclass's comment. I map methods compiled using BlueBook blocks.! Item was removed: - ----- Method: DebuggerMethodMapForBlueBookMethods>>forMethod:methodNode: (in category 'initialize-release') ----- - forMethod: aMethod "" methodNode: aMethodNode "" - super forMethod: aMethod methodNode: aMethodNode. - tempNames := methodNode encoder tempNames! Item was removed: - ----- Method: DebuggerMethodMapForBlueBookMethods>>namedTempAt:in: (in category 'accessing') ----- - namedTempAt: index in: aContext - "Answer the value of the temp at index in aContext where index is relative - to the array of temp names answered by tempNamesForContext:" - ^aContext tempAt: index! Item was removed: - ----- Method: DebuggerMethodMapForBlueBookMethods>>namedTempAt:put:in: (in category 'accessing') ----- - namedTempAt: index put: aValue in: aContext - "Assign the value of the temp at index in aContext where index is relative - to the array of temp names answered by tempNamesForContext:" - ^aContext tempAt: index put: aValue! Item was removed: - ----- Method: DebuggerMethodMapForBlueBookMethods>>tempNamesForContext: (in category 'accessing') ----- - tempNamesForContext: aContext - "Answer an Array of all the temp names in scope in aContext starting with - the home's first local (the first argument or first temporary if no arguments)." - ^tempNames! Item was changed: DebuggerMethodMap subclass: #DebuggerMethodMapForClosureCompiledMethods instanceVariableNames: 'blockExtentsToTempRefs startpcsToTempRefs startKeysToTempRefs' classVariableNames: 'FirstTime' poolDictionaries: '' category: 'Tools-Debugger'! + !DebuggerMethodMapForClosureCompiledMethods commentStamp: 'eem 10/1/2020 19:19' prior: 0! + I am a place-holder for information needed by the Debugger to inspect method activations. See my superclass's comment. I map methods compiled using closures whose bytecodes are embedded within the home CompiledMethod, as is the case for the V3PlusClosures bytecode set. - !DebuggerMethodMapForClosureCompiledMethods commentStamp: 'eem 1/8/2018 12:42' prior: 0! - I am a place-holder for information needed by the Debugger to inspect method activations. See my superclass's comment. I map methods compiled using closures. Instance variables blockExtentsToTempsRefs Array of: (Array with: String with: (Integer | (Array with: Integer with: Integer)))> maps a block extent to an Array of temp references for that block/method. Each reference is a pair of temp name and index, where the index can itself be a pair for a remote temp. startKeysToTempRefs Array of: (Array with: String with: temp reference)> where temp reference ::= Integer | (Array with: Integer with: Integer) | (Array with: #outer with: temp reference)! Item was removed: - ----- Method: DebuggerMethodMapForClosureCompiledMethods>>namedTempAt:in: (in category 'accessing') ----- - namedTempAt: index in: aContext - "Answer the value of the temp at index in aContext where index is relative - to the array of temp names answered by tempNamesForContext:" - ^self - privateTempAt: index - in: aContext - startKeysToBlockExtents: aContext method startKeysToBlockExtents! Item was removed: - ----- Method: DebuggerMethodMapForClosureCompiledMethods>>namedTempAt:put:in: (in category 'accessing') ----- - namedTempAt: index put: aValue in: aContext - "Assign the value of the temp at index in aContext where index is relative - to the array of temp names answered by tempNamesForContext:. - If the value is a copied value we also need to set it along the lexical chain." - ^self - privateTempAt: index - in: aContext - put: aValue - startKeysToBlockExtents: aContext method startKeysToBlockExtents! Item was removed: - ----- Method: DebuggerMethodMapForClosureCompiledMethods>>tempNamesForContext: (in category 'accessing') ----- - tempNamesForContext: aContext - "Answer an Array of all the temp names in scope in aContext starting with - the home's first local (the first argument or first temporary if no arguments)." - ^(self - privateTempRefsForContext: aContext - startKeysToBlockExtents: aContext method startKeysToBlockExtents) collect: - [:pair| pair first]! Item was removed: - ----- Method: DebuggerMethodMapForClosureCompiledMethods>>tempNamesForMethod: (in category 'accessing') ----- - tempNamesForMethod: aMethod - "Answer an Array of all the temp names in scope in aMethod starting with - the home's first local (the first argument or first temporary if no arguments)." - ^(self - privateTempRefsForMethod: aMethod - startKeysToBlockExtents: aMethod startKeysToBlockExtents) collect: - [:pair| pair first]! Item was changed: DebuggerMethodMapForClosureCompiledMethods subclass: #DebuggerMethodMapForFullBlockCompiledMethods instanceVariableNames: 'sortedSourceMaps' classVariableNames: '' poolDictionaries: '' category: 'Tools-Debugger'! + !DebuggerMethodMapForFullBlockCompiledMethods commentStamp: 'eem 10/1/2020 19:20' prior: 0! + I am a place-holder for information needed by the Debugger to inspect method activations. See DebuggerMethodMap's comment. I map methods compiled using full block closures, where block methods are objects separate from the home mehtod, as is the case with the SistaV1 bytecode set. - !DebuggerMethodMapForFullBlockCompiledMethods commentStamp: 'eem 1/10/2018 16:28' prior: 0! - I am a place-holder for information needed by the Debugger to inspect method activations. See DebuggerMethodMap's comment. I map methods compiled using full block closures. Instance variables (inherited) abstractSourceRanges (Dictionary of: Integer-> Interval) startKeysToTempRefs Array of: (Array with: String with: temp reference)> where temp reference ::= Integer | (Array with: Integer with: Integer) | (Array with: #outer with: temp reference) (locally defined) sortedSourceMaps (Dictionary of: Integer-> Interval)! From robert.withers at pm.me Fri Oct 2 02:34:29 2020 From: robert.withers at pm.me (Robert Withers) Date: Fri, 02 Oct 2020 02:34:29 +0000 Subject: [squeak-dev] Curious history In-Reply-To: <10ab4386-3724-f33d-7f2c-214ab30da053@pm.me> References: <39CF58F8-AFA5-4BFD-9369-375613ADC72D@rowledge.org> <10ab4386-3724-f33d-7f2c-214ab30da053@pm.me> Message-ID: <190b8468-cfe2-fafc-4a72-de45f5927a8c@pm.me> I wrote to the #general Squeak Slack channel: > What a complete larcenous bastard. 20 years ago, this month, published it as his own work. And been against me ever since. My CPTSD (100% veteran service-connected) comes with an exquisitely sensitive deception meter. There are those who shunned me and ostracized me and made me feel MOST UNWELCOME. For 20 years. My delusions kick in and I start suspecting back channel communications against me. My love for Squeak conflicted with what I knew was happening. but I hung in there and worked on Cryptography, work with a group of great people and that I am satisfied with its added value to Squeak. For 20 years I KNEW people were against me in the community. I cannot describe how negatively this affected me. My third suicide attempt, in 2007 I jumped off the roof of a 6 story apartment building and broke my back along with many bones. God did not want me to die, yet, so I lived. This deception and ostracism is most well highlighted by the taking credit for my work, without attribution. He is a complete tool. SHAME! > > I do not know the degree to which he spoke against me. Iimagineit was ever since 2000. Delusions! What is real? I knew not. So much torment! AGONY! They do not welcome me! They are trying to chase me off! Good grief, Charlie Brown. > > Severely exacerbated my CPTSD! I kept trying to kill myself because of it! I thought I had done something egregiously wrong. Whatever it was it had to be my fault. I was not feeling the love, even from myself. > > :scream: > > :scream: > > In 2017, 900 units of insulin brought my blood glucose below 40. I almost succeeded that time. > > :scream: rww On 10/1/20 8:55 PM, Robert Withers wrote: > The worst sort of person is one who takes the credit for the work of > another. Wouldn't you agree? > > You may wish to hear John's judgement on the matter. He was right there > when it was first built. > > If you are not humble you will be humiliated, and brought low. > > rww > > On 10/1/20 8:35 PM, tim Rowledge wrote: > >>> On 2020-10-01, at 4:57 PM, Robert Withers via Squeak-dev >>> [](mailto:squeak-dev at lists.squeakfoundation.org) >>> wrote: >>> >>> I am curious. Who was the original author of the VMMaker Tool? >> >> That would be me; back in exobox days. Written along with the original VMMaker and intended to be an example of clean, tidy, morphic usage. I've no idea if anyone ever uses it now, since running it via scripting has proven more valuable. >> >> tim >> -- >> tim Rowledge; >> tim at rowledge.org >> ; >> http://www.rowledge.org/tim >> "Wibble" said Pooh the stress beginning to show. -- K, r -------------- next part -------------- An HTML attachment was scrubbed... URL: From robert.withers at pm.me Fri Oct 2 02:38:27 2020 From: robert.withers at pm.me (Robert Withers) Date: Fri, 02 Oct 2020 02:38:27 +0000 Subject: [squeak-dev] Curious history In-Reply-To: <190b8468-cfe2-fafc-4a72-de45f5927a8c@pm.me> References: <39CF58F8-AFA5-4BFD-9369-375613ADC72D@rowledge.org> <10ab4386-3724-f33d-7f2c-214ab30da053@pm.me> <190b8468-cfe2-fafc-4a72-de45f5927a8c@pm.me> Message-ID: <70921f42-0788-53b4-6c78-e0b76a651408@pm.me> :sob::sob::sob: On 10/1/20 10:34 PM, Robert Withers wrote: > I wrote to the #general Squeak Slack channel: > >> What a complete larcenous bastard. 20 years ago, this month, published it as his own work. And been against me ever since. My CPTSD (100% veteran service-connected) comes with an exquisitely sensitive deception meter. There are those who shunned me and ostracized me and made me feel MOST UNWELCOME. For 20 years. My delusions kick in and I start suspecting back channel communications against me. My love for Squeak conflicted with what I knew was happening. but I hung in there and worked on Cryptography, work with a group of great people and that I am satisfied with its added value to Squeak. For 20 years I KNEW people were against me in the community. I cannot describe how negatively this affected me. My third suicide attempt, in 2007 I jumped off the roof of a 6 story apartment building and broke my back along with many bones. God did not want me to die, yet, so I lived. This deception and ostracism is most well highlighted by the taking credit for my work, without attribution. He is a complete tool. SHAME! >> >> I do not know the degree to which he spoke against me. Iimagineit was ever since 2000. Delusions! What is real? I knew not. So much torment! AGONY! They do not welcome me! They are trying to chase me off! Good grief, Charlie Brown. >> >> Severely exacerbated my CPTSD! I kept trying to kill myself because of it! I thought I had done something egregiously wrong. Whatever it was it had to be my fault. I was not feeling the love, even from myself. >> >> :scream: >> >> :scream: >> >> In 2017, 900 units of insulin brought my blood glucose below 40. I almost succeeded that time. >> >> :scream: > > rww > > On 10/1/20 8:55 PM, Robert Withers wrote: > >> The worst sort of person is one who takes the credit for the work of >> another. Wouldn't you agree? >> >> You may wish to hear John's judgement on the matter. He was right there >> when it was first built. >> >> If you are not humble you will be humiliated, and brought low. >> >> rww >> >> On 10/1/20 8:35 PM, tim Rowledge wrote: >> >>>> On 2020-10-01, at 4:57 PM, Robert Withers via Squeak-dev >>>> [](mailto:squeak-dev at lists.squeakfoundation.org) >>>> wrote: >>>> >>>> I am curious. Who was the original author of the VMMaker Tool? >>> >>> That would be me; back in exobox days. Written along with the original VMMaker and intended to be an example of clean, tidy, morphic usage. I've no idea if anyone ever uses it now, since running it via scripting has proven more valuable. >>> >>> tim >>> -- >>> tim Rowledge; >>> tim at rowledge.org >>> ; >>> http://www.rowledge.org/tim >>> "Wibble" said Pooh the stress beginning to show. > > -- > K, r -- K, r -------------- next part -------------- An HTML attachment was scrubbed... URL: From robert.withers at pm.me Fri Oct 2 03:04:43 2020 From: robert.withers at pm.me (Robert Withers) Date: Fri, 02 Oct 2020 03:04:43 +0000 Subject: [squeak-dev] Curious history In-Reply-To: <70921f42-0788-53b4-6c78-e0b76a651408@pm.me> References: <39CF58F8-AFA5-4BFD-9369-375613ADC72D@rowledge.org> <10ab4386-3724-f33d-7f2c-214ab30da053@pm.me> <4RzffQkMYVDio5ypO3BdDDogbcHCBBrlCc1fxoT8GmqCUWhN0sU9yBdJfjTNNuM4-qL-oLkLcIB--mYjPkf0Lg==@protonmail.conversationid> <190b8468-cfe2-fafc-4a72-de45f5927a8c@pm.me> <70921f42-0788-53b4-6c78-e0b76a651408@pm.me> Message-ID: I am completely convinced that I was assassinated, with prejudice, in 2000. I worked at Exobox, with John as my fantastic, incredible mentor, the best, until November 2000 (I think) when Exobox went away. My fault with the failing networking code. :((( I did the entire, completely functional VMMakerTool September, into October of 2000. That means the timestamps were altered; somebody added a year. Hmmm. Ask the Hon. John Sarkela. John asked me to demonstrate the tool to tim. tim asked for my code. I was assassinated. On 10/1/20 10:38 PM, Robert Withers wrote: > :sob::sob::sob: > > On 10/1/20 10:34 PM, Robert Withers wrote: > >> I wrote to the #general Squeak Slack channel: >> >>> What a complete larcenous bastard. 20 years ago, this month, published it as his own work. And been against me ever since. My CPTSD (100% veteran service-connected) comes with an exquisitely sensitive deception meter. There are those who shunned me and ostracized me and made me feel MOST UNWELCOME. For 20 years. My delusions kick in and I start suspecting back channel communications against me. My love for Squeak conflicted with what I knew was happening. but I hung in there and worked on Cryptography, work with a group of great people and that I am satisfied with its added value to Squeak. For 20 years I KNEW people were against me in the community. I cannot describe how negatively this affected me. My third suicide attempt, in 2007 I jumped off the roof of a 6 story apartment building and broke my back along with many bones. God did not want me to die, yet, so I lived. This deception and ostracism is most well highlighted by the taking credit for my work, without attribution. He is a complete tool. SHAME! >>> >>> I do not know the degree to which he spoke against me. Iimagineit was ever since 2000. Delusions! What is real? I knew not. So much torment! AGONY! They do not welcome me! They are trying to chase me off! Good grief, Charlie Brown. >>> >>> Severely exacerbated my CPTSD! I kept trying to kill myself because of it! I thought I had done something egregiously wrong. Whatever it was it had to be my fault. I was not feeling the love, even from myself. >>> >>> :scream: >>> >>> :scream: >>> >>> In 2017, 900 units of insulin brought my blood glucose below 40. I almost succeeded that time. >>> >>> :scream: >> >> rww >> >> On 10/1/20 8:55 PM, Robert Withers wrote: >> >>> The worst sort of person is one who takes the credit for the work of >>> another. Wouldn't you agree? >>> >>> You may wish to hear John's judgement on the matter. He was right there >>> when it was first built. >>> >>> If you are not humble you will be humiliated, and brought low. >>> >>> rww >>> >>> On 10/1/20 8:35 PM, tim Rowledge wrote: >>> >>>>> On 2020-10-01, at 4:57 PM, Robert Withers via Squeak-dev >>>>> [](mailto:squeak-dev at lists.squeakfoundation.org) >>>>> wrote: >>>>> >>>>> I am curious. Who was the original author of the VMMaker Tool? >>>> >>>> That would be me; back in exobox days. Written along with the original VMMaker and intended to be an example of clean, tidy, morphic usage. I've no idea if anyone ever uses it now, since running it via scripting has proven more valuable. >>>> >>>> tim >>>> -- >>>> tim Rowledge; >>>> tim at rowledge.org >>>> ; >>>> http://www.rowledge.org/tim >>>> "Wibble" said Pooh the stress beginning to show. >> >> -- >> K, r > > -- > K, r -- K, r -------------- next part -------------- An HTML attachment was scrubbed... URL: From robert.withers at pm.me Fri Oct 2 03:28:36 2020 From: robert.withers at pm.me (Robert Withers) Date: Fri, 02 Oct 2020 03:28:36 +0000 Subject: [squeak-dev] Curious history In-Reply-To: References: <10ab4386-3724-f33d-7f2c-214ab30da053@pm.me> <4RzffQkMYVDio5ypO3BdDDogbcHCBBrlCc1fxoT8GmqCUWhN0sU9yBdJfjTNNuM4-qL-oLkLcIB--mYjPkf0Lg==@protonmail.conversationid> <190b8468-cfe2-fafc-4a72-de45f5927a8c@pm.me> <70921f42-0788-53b4-6c78-e0b76a651408@pm.me> Message-ID: Even unto this day. I am the only one to have ever gotten the *****SPAM***** from tim. He must really hate me right now. This does not affect me in any way, that's his problem. Burn. On 10/1/20 11:04 PM, Robert Withers wrote: > I am completely convinced that I was assassinated, with prejudice, in 2000. I worked at Exobox, with John as my fantastic, incredible mentor, the best, until November 2000 (I think) when Exobox went away. My fault with the failing networking code. :((( > > I did the entire, completely functional VMMakerTool September, into October of 2000. That means the timestamps were altered; somebody added a year. Hmmm. Ask the Hon. John Sarkela. John asked me to demonstrate the tool to tim. tim asked for my code. > > I was assassinated. > > On 10/1/20 10:38 PM, Robert Withers wrote: > >> :sob::sob::sob: >> >> On 10/1/20 10:34 PM, Robert Withers wrote: >> >>> I wrote to the #general Squeak Slack channel: >>> >>>> What a complete larcenous bastard. 20 years ago, this month, published it as his own work. And been against me ever since. My CPTSD (100% veteran service-connected) comes with an exquisitely sensitive deception meter. There are those who shunned me and ostracized me and made me feel MOST UNWELCOME. For 20 years. My delusions kick in and I start suspecting back channel communications against me. My love for Squeak conflicted with what I knew was happening. but I hung in there and worked on Cryptography, work with a group of great people and that I am satisfied with its added value to Squeak. For 20 years I KNEW people were against me in the community. I cannot describe how negatively this affected me. My third suicide attempt, in 2007 I jumped off the roof of a 6 story apartment building and broke my back along with many bones. God did not want me to die, yet, so I lived. This deception and ostracism is most well highlighted by the taking credit for my work, without attribution. He is a complete tool. SHAME! >>>> >>>> I do not know the degree to which he spoke against me. Iimagineit was ever since 2000. Delusions! What is real? I knew not. So much torment! AGONY! They do not welcome me! They are trying to chase me off! Good grief, Charlie Brown. >>>> >>>> Severely exacerbated my CPTSD! I kept trying to kill myself because of it! I thought I had done something egregiously wrong. Whatever it was it had to be my fault. I was not feeling the love, even from myself. >>>> >>>> :scream: >>>> >>>> :scream: >>>> >>>> In 2017, 900 units of insulin brought my blood glucose below 40. I almost succeeded that time. >>>> >>>> :scream: >>> >>> rww >>> >>> On 10/1/20 8:55 PM, Robert Withers wrote: >>> >>>> The worst sort of person is one who takes the credit for the work of >>>> another. Wouldn't you agree? >>>> >>>> You may wish to hear John's judgement on the matter. He was right there >>>> when it was first built. >>>> >>>> If you are not humble you will be humiliated, and brought low. >>>> >>>> rww >>>> >>>> On 10/1/20 8:35 PM, tim Rowledge wrote: >>>> >>>>>> On 2020-10-01, at 4:57 PM, Robert Withers via Squeak-dev >>>>>> [](mailto:squeak-dev at lists.squeakfoundation.org) >>>>>> wrote: >>>>>> >>>>>> I am curious. Who was the original author of the VMMaker Tool? >>>>> >>>>> That would be me; back in exobox days. Written along with the original VMMaker and intended to be an example of clean, tidy, morphic usage. I've no idea if anyone ever uses it now, since running it via scripting has proven more valuable. >>>>> >>>>> tim >>>>> -- >>>>> tim Rowledge; >>>>> tim at rowledge.org >>>>> ; >>>>> http://www.rowledge.org/tim >>>>> "Wibble" said Pooh the stress beginning to show. >>> >>> -- >>> K, r >> >> -- >> K, r > > -- > K, r -- K, r -------------- next part -------------- An HTML attachment was scrubbed... URL: From ron at usmedrec.com Fri Oct 2 03:36:07 2020 From: ron at usmedrec.com (Ron Teitelbaum) Date: Thu, 1 Oct 2020 23:36:07 -0400 Subject: [squeak-dev] Curious history In-Reply-To: <70921f42-0788-53b4-6c78-e0b76a651408@pm.me> References: <39CF58F8-AFA5-4BFD-9369-375613ADC72D@rowledge.org> <10ab4386-3724-f33d-7f2c-214ab30da053@pm.me> <190b8468-cfe2-fafc-4a72-de45f5927a8c@pm.me> <70921f42-0788-53b4-6c78-e0b76a651408@pm.me> Message-ID: Hi Rob, I'm so sorry you felt that way. I know you have had major issues, you have said the same yourself. I'm always happy to see you come back even after long absences. You are a brilliant coder and it has been my distinct pleasure to work with you on Cryptography! Thank you for all you have done and indeed you are responsible for adding significant value to Squeak and the community. We all work on code and it's easy to work your ass off on something to make it work and forget where it originated. We all contribute in large and small ways to everything. If you started VMMaker thank you! It is definitely something a lot of us use. I remember learning all about it a long long time ago before I realized that while I could understand it and I could use it, the people that work on the VM are a level higher than me. I just make apps! I remember getting in an argument with Andreas about adding methods to collection. "WE DON"T NEED more methods in Collection we need to remove most of them and make it easier!" I argued with him about the value over and over but he insisted that they just didn't add enough value. I could have been put off. I could have assumed that Andreas didn't like me but I would have been very wrong! I was really honored to get the chance to work with him and we became great friends. Of course I added my methods to the code we were working on together and was so thrilled when he used my methods for his own code. I don't know what happened with VMMaker but again thank you for your participation in it.. I wanted to take a minute to thank you for your work and to let you know it is my honor to work with you too! I hope that you can come to terms with your past and that you get the help you need for your CPTSD. Everything is possible, the past is gone, but the future is still yours to shape. I wish the past was set in stone but even that moves and slips. I was talking to my wife about a party we attended: "Remember in 2000 we were at the party and counted down the new year and someone hit the breaker and killed the lights! We were all talking about what would happen in the year 2000, would everything break!" Great story except that I hadn't met my wife yet! The past is only what we remember but the future is something we have control over. Peace, calm, happyness, they are all hard to come by but they are possible. I wish you success in finding what makes your future better. I'm sorry about the bad things that have happened to you in the past. As far as I'm concerned, you are welcomed here! All the best, Ron Teitelbaum On Thu, Oct 1, 2020 at 10:38 PM Robert Withers via Squeak-dev < squeak-dev at lists.squeakfoundation.org> wrote: > :sob::sob::sob: > On 10/1/20 10:34 PM, Robert Withers wrote: > > I wrote to the #general Squeak Slack channel: > > What a complete larcenous bastard. 20 years ago, this month, published it > as his own work. And been against me ever since. My CPTSD (100% veteran > service-connected) comes with an exquisitely sensitive deception meter. > There are those who shunned me and ostracized me and made me feel MOST > UNWELCOME. For 20 years. My delusions kick in and I start suspecting back > channel communications against me. My love for Squeak conflicted with what > I knew was happening. but I hung in there and worked on Cryptography, work > with a group of great people and that I am satisfied with its added value > to Squeak. For 20 years I KNEW people were against me in the community. I > cannot describe how negatively this affected me. My third suicide attempt, > in 2007 I jumped off the roof of a 6 story apartment building and broke my > back along with many bones. God did not want me to die, yet, so I lived. > This deception and ostracism is most well highlighted by the taking credit > for my work, without attribution. He is a complete tool. SHAME! > > I do not know the degree to which he spoke against me. I *imagine* it was > ever since 2000. Delusions! What is real? I knew not. So much torment! > AGONY! They do not welcome me! They are trying to chase me off! Good grief, > Charlie Brown. > > Severely exacerbated my CPTSD! I kept trying to kill myself because of it! > I thought I had done something egregiously wrong. Whatever it was it had to > be my fault. I was not feeling the love, even from myself. > > :scream: > > :scream: > > > In 2017, 900 units of insulin brought my blood glucose below 40. I almost > succeeded that time. > > :scream: > > rww > On 10/1/20 8:55 PM, Robert Withers wrote: > > The worst sort of person is one who takes the credit for the work of > another. Wouldn't you agree? > > You may wish to hear John's judgement on the matter. He was right there > when it was first built. > > If you are not humble you will be humiliated, and brought low. > > rww > > On 10/1/20 8:35 PM, tim Rowledge wrote: > > On 2020-10-01, at 4:57 PM, Robert Withers via Squeak-dev wrote: > > I am curious. Who was the original author of the VMMaker Tool? > > That would be me; back in exobox days. Written along with the original VMMaker and intended to be an example of clean, tidy, morphic usage. I've no idea if anyone ever uses it now, since running it via scripting has proven more valuable. > > > tim > -- > tim Rowledge; tim at rowledge.org; http://www.rowledge.org/tim > "Wibble" said Pooh the stress beginning to show. > > > > > -- > K, r > > -- > K, r > > -------------- next part -------------- An HTML attachment was scrubbed... URL: From robert.withers at pm.me Fri Oct 2 03:46:29 2020 From: robert.withers at pm.me (Robert Withers) Date: Fri, 02 Oct 2020 03:46:29 +0000 Subject: [squeak-dev] Curious history In-Reply-To: References: <39CF58F8-AFA5-4BFD-9369-375613ADC72D@rowledge.org> <10ab4386-3724-f33d-7f2c-214ab30da053@pm.me> <190b8468-cfe2-fafc-4a72-de45f5927a8c@pm.me> <70921f42-0788-53b4-6c78-e0b76a651408@pm.me> Message-ID: Hi Ron, Thank you so much for the kind words and the extension of your hand towards myself. In no fashion has it been all bad. I really need to tell you, right now, that I did not do any work on VMMaker. Was there extensions to same from the VMMakerTool? Perhaps, I do not recall. I only built the Tool, not the Maker. Good grief, I agree, that's a whole other level! I feel the same about the opportunities I had with you. I am still dorking with ASN1, currently broken, trying to add a "Class" Application Class tag. Missing an explicit context in on of the directions. Memory and Trauma are definitely linked. That's where the flashbacks come from. Do you recall my interviewing with Andreas? I did get that job, for whatever reason... I think I may be done. PromisesLocal is broken. ParrotTalk is broken. ASN1 is broken. SSL is broken. PromisesRemote is broken. Sigh. Fuck it. Someone else will have to pick it up. 20 years of work! I am hitting deep blue ocean, on my way to Morocco, by way of the Azores! With my shiny Zeus 3! Ciao, bella! On 10/1/20 11:36 PM, Ron Teitelbaum wrote: > Hi Rob, > > I'm so sorry you felt that way. I know you have had major issues, you have said the same yourself. I'm always happy to see you come back even after long absences. You are a brilliant coder and it has been my distinct pleasure to work with you on Cryptography! Thank you for all you have done and indeed you are responsible for adding significant value to Squeak and the community. > > We all work on code and it's easy to work your ass off on something to make it work and forget where it originated. We all contribute in large and small ways to everything. If you started VMMaker thank you! It is definitely something a lot of us use. I remember learning all about it a long long time ago before I realized that while I could understand it and I could use it, the people that work on the VM are a level higher than me. I just make apps! > > I remember getting in an argument with Andreas about adding methods to collection. "WE DON"T NEED more methods in Collection we need to remove most of them and make it easier!" I argued with him about the value over and over but he insisted that they just didn't add enough value. I could have been put off. I could have assumed that Andreas didn't like me but I would have been very wrong! I was really honored to get the chance to work with him and we became great friends. Of course I added my methods to the code we were working on together and was so thrilled when he used my methods for his own code. > > I don't know what happened with VMMaker but again thank you for your participation in it.. I wanted to take a minute to thank you for your work and to let you know it is my honor to work with you too! I hope that you can come to terms with your past and that you get the help you need for your CPTSD. > > Everything is possible, the past is gone, but the future is still yours to shape. I wish the past was set in stone but even that moves and slips. I was talking to my wife about a party we attended: "Remember in 2000 we were at the party and counted down the new year and someone hit the breaker and killed the lights! We were all talking about what would happen in the year 2000, would everything break!" Great story except that I hadn't met my wife yet! The past is only what we remember but the future is something we have control over. Peace, calm, happyness, they are all hard to come by but they are possible. I wish you success in finding what makes your future better. > > I'm sorry about the bad things that have happened to you in the past. As far as I'm concerned, you are welcomed here! > > All the best, > > Ron Teitelbaum > > On Thu, Oct 1, 2020 at 10:38 PM Robert Withers via Squeak-dev wrote: > >> :sob::sob::sob: >> >> On 10/1/20 10:34 PM, Robert Withers wrote: >> >>> I wrote to the #general Squeak Slack channel: >>> >>>> What a complete larcenous bastard. 20 years ago, this month, published it as his own work. And been against me ever since. My CPTSD (100% veteran service-connected) comes with an exquisitely sensitive deception meter. There are those who shunned me and ostracized me and made me feel MOST UNWELCOME. For 20 years. My delusions kick in and I start suspecting back channel communications against me. My love for Squeak conflicted with what I knew was happening. but I hung in there and worked on Cryptography, work with a group of great people and that I am satisfied with its added value to Squeak. For 20 years I KNEW people were against me in the community. I cannot describe how negatively this affected me. My third suicide attempt, in 2007 I jumped off the roof of a 6 story apartment building and broke my back along with many bones. God did not want me to die, yet, so I lived. This deception and ostracism is most well highlighted by the taking credit for my work, without attribution. He is a complete tool. SHAME! >>>> >>>> I do not know the degree to which he spoke against me. Iimagineit was ever since 2000. Delusions! What is real? I knew not. So much torment! AGONY! They do not welcome me! They are trying to chase me off! Good grief, Charlie Brown. >>>> >>>> Severely exacerbated my CPTSD! I kept trying to kill myself because of it! I thought I had done something egregiously wrong. Whatever it was it had to be my fault. I was not feeling the love, even from myself. >>>> >>>> :scream: >>>> >>>> :scream: >>>> >>>> In 2017, 900 units of insulin brought my blood glucose below 40. I almost succeeded that time. >>>> >>>> :scream: >>> >>> rww >>> >>> On 10/1/20 8:55 PM, Robert Withers wrote: >>> >>>> The worst sort of person is one who takes the credit for the work of >>>> another. Wouldn't you agree? >>>> >>>> You may wish to hear John's judgement on the matter. He was right there >>>> when it was first built. >>>> >>>> If you are not humble you will be humiliated, and brought low. >>>> >>>> rww >>>> >>>> On 10/1/20 8:35 PM, tim Rowledge wrote: >>>> >>>>>> On 2020-10-01, at 4:57 PM, Robert Withers via Squeak-dev >>>>>> [](mailto:squeak-dev at lists.squeakfoundation.org) >>>>>> wrote: >>>>>> >>>>>> I am curious. Who was the original author of the VMMaker Tool? >>>>> >>>>> That would be me; back in exobox days. Written along with the original VMMaker and intended to be an example of clean, tidy, morphic usage. I've no idea if anyone ever uses it now, since running it via scripting has proven more valuable. >>>>> >>>>> tim >>>>> -- >>>>> tim Rowledge; >>>>> tim at rowledge.org >>>>> ; >>>>> http://www.rowledge.org/tim >>>>> "Wibble" said Pooh the stress beginning to show. >>> >>> -- >>> K, r >> >> -- >> K, r -- K, r -------------- next part -------------- An HTML attachment was scrubbed... URL: -------------- next part -------------- A non-text attachment was scrubbed... Name: 7420963_20200328125416581_1_LARGE.jpg Type: image/jpeg Size: 47844 bytes Desc: not available URL: From robert.withers at pm.me Fri Oct 2 03:48:56 2020 From: robert.withers at pm.me (Robert Withers) Date: Fri, 02 Oct 2020 03:48:56 +0000 Subject: [squeak-dev] Curious history In-Reply-To: References: <10ab4386-3724-f33d-7f2c-214ab30da053@pm.me> <190b8468-cfe2-fafc-4a72-de45f5927a8c@pm.me> <70921f42-0788-53b4-6c78-e0b76a651408@pm.me> <4RzffQkMYVDio5ypO3BdDDogbcHCBBrlCc1fxoT8GmqCUWhN0sU9yBdJfjTNNuM4-qL-oLkLcIB--mYjPkf0Lg==@protonmail.conversationid> Message-ID: Do you recall my interviewing with Andreas? I did NOT NOT NOT NADA ZILCH NOTHING TO SEE HERE ZERO TIME FOR YOU get that job, for whatever reason... On 10/1/20 11:46 PM, Robert Withers wrote: > Hi Ron, > > Thank you so much for the kind words and the extension of your hand towards myself. In no fashion has it been all bad. I really need to tell you, right now, that I did not do any work on VMMaker. Was there extensions to same from the VMMakerTool? Perhaps, I do not recall. I only built the Tool, not the Maker. Good grief, I agree, that's a whole other level! > > I feel the same about the opportunities I had with you. I am still dorking with ASN1, currently broken, trying to add a "Class" Application Class tag. Missing an explicit context in on of the directions. Memory and Trauma are definitely linked. That's where the flashbacks come from. Do you recall my interviewing with Andreas? I did NOT NOT NOT NADA ZILCH NOTHING TO SEE HERE get that job, for whatever reason... > > I think I may be done. PromisesLocal is broken. ParrotTalk is broken. ASN1 is broken. SSL is broken. PromisesRemote is broken. Sigh. Fuck it. Someone else will have to pick it up. 20 years of work! I am hitting deep blue ocean, on my way to Morocco, by way of the Azores! With my shiny Zeus 3! Ciao, bella! > > On 10/1/20 11:36 PM, Ron Teitelbaum wrote: > >> Hi Rob, >> >> I'm so sorry you felt that way. I know you have had major issues, you have said the same yourself. I'm always happy to see you come back even after long absences. You are a brilliant coder and it has been my distinct pleasure to work with you on Cryptography! Thank you for all you have done and indeed you are responsible for adding significant value to Squeak and the community. >> >> We all work on code and it's easy to work your ass off on something to make it work and forget where it originated. We all contribute in large and small ways to everything. If you started VMMaker thank you! It is definitely something a lot of us use. I remember learning all about it a long long time ago before I realized that while I could understand it and I could use it, the people that work on the VM are a level higher than me. I just make apps! >> >> I remember getting in an argument with Andreas about adding methods to collection. "WE DON"T NEED more methods in Collection we need to remove most of them and make it easier!" I argued with him about the value over and over but he insisted that they just didn't add enough value. I could have been put off. I could have assumed that Andreas didn't like me but I would have been very wrong! I was really honored to get the chance to work with him and we became great friends. Of course I added my methods to the code we were working on together and was so thrilled when he used my methods for his own code. >> >> I don't know what happened with VMMaker but again thank you for your participation in it.. I wanted to take a minute to thank you for your work and to let you know it is my honor to work with you too! I hope that you can come to terms with your past and that you get the help you need for your CPTSD. >> >> Everything is possible, the past is gone, but the future is still yours to shape. I wish the past was set in stone but even that moves and slips. I was talking to my wife about a party we attended: "Remember in 2000 we were at the party and counted down the new year and someone hit the breaker and killed the lights! We were all talking about what would happen in the year 2000, would everything break!" Great story except that I hadn't met my wife yet! The past is only what we remember but the future is something we have control over. Peace, calm, happyness, they are all hard to come by but they are possible. I wish you success in finding what makes your future better. >> >> I'm sorry about the bad things that have happened to you in the past. As far as I'm concerned, you are welcomed here! >> >> All the best, >> >> Ron Teitelbaum >> >> On Thu, Oct 1, 2020 at 10:38 PM Robert Withers via Squeak-dev wrote: >> >>> :sob::sob::sob: >>> >>> On 10/1/20 10:34 PM, Robert Withers wrote: >>> >>>> I wrote to the #general Squeak Slack channel: >>>> >>>>> What a complete larcenous bastard. 20 years ago, this month, published it as his own work. And been against me ever since. My CPTSD (100% veteran service-connected) comes with an exquisitely sensitive deception meter. There are those who shunned me and ostracized me and made me feel MOST UNWELCOME. For 20 years. My delusions kick in and I start suspecting back channel communications against me. My love for Squeak conflicted with what I knew was happening. but I hung in there and worked on Cryptography, work with a group of great people and that I am satisfied with its added value to Squeak. For 20 years I KNEW people were against me in the community. I cannot describe how negatively this affected me. My third suicide attempt, in 2007 I jumped off the roof of a 6 story apartment building and broke my back along with many bones. God did not want me to die, yet, so I lived. This deception and ostracism is most well highlighted by the taking credit for my work, without attribution. He is a complete tool. SHAME! >>>>> >>>>> I do not know the degree to which he spoke against me. Iimagineit was ever since 2000. Delusions! What is real? I knew not. So much torment! AGONY! They do not welcome me! They are trying to chase me off! Good grief, Charlie Brown. >>>>> >>>>> Severely exacerbated my CPTSD! I kept trying to kill myself because of it! I thought I had done something egregiously wrong. Whatever it was it had to be my fault. I was not feeling the love, even from myself. >>>>> >>>>> :scream: >>>>> >>>>> :scream: >>>>> >>>>> In 2017, 900 units of insulin brought my blood glucose below 40. I almost succeeded that time. >>>>> >>>>> :scream: >>>> >>>> rww >>>> >>>> On 10/1/20 8:55 PM, Robert Withers wrote: >>>> >>>>> The worst sort of person is one who takes the credit for the work of >>>>> another. Wouldn't you agree? >>>>> >>>>> You may wish to hear John's judgement on the matter. He was right there >>>>> when it was first built. >>>>> >>>>> If you are not humble you will be humiliated, and brought low. >>>>> >>>>> rww >>>>> >>>>> On 10/1/20 8:35 PM, tim Rowledge wrote: >>>>> >>>>>>> On 2020-10-01, at 4:57 PM, Robert Withers via Squeak-dev >>>>>>> [](mailto:squeak-dev at lists.squeakfoundation.org) >>>>>>> wrote: >>>>>>> >>>>>>> I am curious. Who was the original author of the VMMaker Tool? >>>>>> >>>>>> That would be me; back in exobox days. Written along with the original VMMaker and intended to be an example of clean, tidy, morphic usage. I've no idea if anyone ever uses it now, since running it via scripting has proven more valuable. >>>>>> >>>>>> tim >>>>>> -- >>>>>> tim Rowledge; >>>>>> tim at rowledge.org >>>>>> ; >>>>>> http://www.rowledge.org/tim >>>>>> "Wibble" said Pooh the stress beginning to show. >>>> >>>> -- >>>> K, r >>> >>> -- >>> K, r > > -- > K, r -- K, r -------------- next part -------------- An HTML attachment was scrubbed... URL: -------------- next part -------------- A non-text attachment was scrubbed... Name: 7420963_20200328125416581_1_LARGE.jpg Type: image/jpeg Size: 47844 bytes Desc: not available URL: From eliot.miranda at gmail.com Fri Oct 2 04:20:28 2020 From: eliot.miranda at gmail.com (Eliot Miranda) Date: Thu, 1 Oct 2020 21:20:28 -0700 Subject: [squeak-dev] Curious history In-Reply-To: References: Message-ID: <427948D0-666A-4151-B57E-30F7399DD68B@gmail.com> > On Oct 1, 2020, at 8:36 PM, Ron Teitelbaum wrote: > >  > Hi Rob, > > I'm so sorry you felt that way. I know you have had major issues, you have said the same yourself. I'm always happy to see you come back even after long absences. You are a brilliant coder and it has been my distinct pleasure to work with you on Cryptography! Thank you for all you have done and indeed you are responsible for adding significant value to Squeak and the community. > > We all work on code and it's easy to work your ass off on something to make it work and forget where it originated. We all contribute in large and small ways to everything. If you started VMMaker thank you! It is definitely something a lot of us use. I remember learning all about it a long long time ago before I realized that while I could understand it and I could use it, the people that work on the VM are a level higher than me. I just make apps! > > I remember getting in an argument with Andreas about adding methods to collection. "WE DON"T NEED more methods in Collection we need to remove most of them and make it easier!" I argued with him about the value over and over but he insisted that they just didn't add enough value. I could have been put off. I could have assumed that Andreas didn't like me but I would have been very wrong! I was really honored to get the chance to work with him and we became great friends. Of course I added my methods to the code we were working on together and was so thrilled when he used my methods for his own code. > > I don't know what happened with VMMaker but again thank you for your participation in it.. I wanted to take a minute to thank you for your work and to let you know it is my honor to work with you too! I hope that you can come to terms with your past and that you get the help you need for your CPTSD. > > Everything is possible, the past is gone, but the future is still yours to shape. I wish the past was set in stone but even that moves and slips. I was talking to my wife about a party we attended: "Remember in 2000 we were at the party and counted down the new year and someone hit the breaker and killed the lights! We were all talking about what would happen in the year 2000, would everything break!" Great story except that I hadn't met my wife yet! The past is only what we remember but the future is something we have control over. Peace, calm, happyness, they are all hard to come by but they are possible. I wish you success in finding what makes your future better. > > I'm sorry about the bad things that have happened to you in the past. As far as I'm concerned, you are welcomed here! > > All the best, > > Ron Teitelbaum Beautifully said, Ron. And Rob, I hope you find peace with this. It’s difficult; I know. Hugs. > > > >> On Thu, Oct 1, 2020 at 10:38 PM Robert Withers via Squeak-dev wrote: >> :sob::sob::sob: >> >> On 10/1/20 10:34 PM, Robert Withers wrote: >>> I wrote to the #general Squeak Slack channel: >>> >>> What a complete larcenous bastard. 20 years ago, this month, published it as his own work. And been against me ever since. My CPTSD (100% veteran service-connected) comes with an exquisitely sensitive deception meter. There are those who shunned me and ostracized me and made me feel MOST UNWELCOME. For 20 years. My delusions kick in and I start suspecting back channel communications against me. My love for Squeak conflicted with what I knew was happening. but I hung in there and worked on Cryptography, work with a group of great people and that I am satisfied with its added value to Squeak. For 20 years I KNEW people were against me in the community. I cannot describe how negatively this affected me. My third suicide attempt, in 2007 I jumped off the roof of a 6 story apartment building and broke my back along with many bones. God did not want me to die, yet, so I lived. This deception and ostracism is most well highlighted by the taking credit for my work, without attribution. He is a complete tool. SHAME! >>> >>> I do not know the degree to which he spoke against me. I imagine it was ever since 2000. Delusions! What is real? I knew not. So much torment! AGONY! They do not welcome me! They are trying to chase me off! Good grief, Charlie Brown. >>> >>> Severely exacerbated my CPTSD! I kept trying to kill myself because of it! I thought I had done something egregiously wrong. Whatever it was it had to be my fault. I was not feeling the love, even from myself. >>> >>> :scream: >>> >>> :scream: >>> >>> >>> In 2017, 900 units of insulin brought my blood glucose below 40. I almost succeeded that time. >>> >>> :scream: >>> >>> rww >>> >>> On 10/1/20 8:55 PM, Robert Withers wrote: >>>> The worst sort of person is one who takes the credit for the work of >>>> another. Wouldn't you agree? >>>> >>>> You may wish to hear John's judgement on the matter. He was right there >>>> when it was first built. >>>> >>>> If you are not humble you will be humiliated, and brought low. >>>> >>>> rww >>>> >>>> On 10/1/20 8:35 PM, tim Rowledge wrote: >>>>>> On 2020-10-01, at 4:57 PM, Robert Withers via Squeak-dev wrote: >>>>>> >>>>>> I am curious. Who was the original author of the VMMaker Tool? >>>>> That would be me; back in exobox days. Written along with the original VMMaker and intended to be an example of clean, tidy, morphic usage. I've no idea if anyone ever uses it now, since running it via scripting has proven more valuable. >>>>> >>>>> >>>>> tim >>>>> -- >>>>> tim Rowledge; tim at rowledge.org; http://www.rowledge.org/tim >>>>> "Wibble" said Pooh the stress beginning to show. >>>>> >>>>> >>>>> >>> -- >>> K, r >> -- >> K, r >> > -------------- next part -------------- An HTML attachment was scrubbed... URL: From robert.withers at pm.me Fri Oct 2 04:21:15 2020 From: robert.withers at pm.me (Robert Withers) Date: Fri, 02 Oct 2020 04:21:15 +0000 Subject: [squeak-dev] Curious history In-Reply-To: References: <190b8468-cfe2-fafc-4a72-de45f5927a8c@pm.me> <70921f42-0788-53b4-6c78-e0b76a651408@pm.me> <4RzffQkMYVDio5ypO3BdDDogbcHCBBrlCc1fxoT8GmqCUWhN0sU9yBdJfjTNNuM4-qL-oLkLcIB--mYjPkf0Lg==@protonmail.conversationid> <877lUkLJfpLi1si68jBg1GdbHUPpNB5NhFo1QUUdR1B3G5XWCcIKgtbRJ9r-nBoAYlzIl-mApKW07rQFHukdoA==@protonmail.internalid> Message-ID: On 10/1/20 11:48 PM, Robert Withers wrote: > Do you recall my interviewing with Andreas? I did NOT NOT NOT NADA ZILCH NOTHING TO SEE HERE ZERO TIME FOR YOU get that job, for whatever reason... > > On 10/1/20 11:46 PM, Robert Withers wrote: > >> Hi Ron, >> >> Thank you so much for the kind words and the extension of your hand towards myself. In no fashion has it been all bad. I really need to tell you, right now, that I did not do any work on VMMaker. Was there extensions to same from the VMMakerTool? Perhaps, I do not recall. I only built the Tool, not the Maker. Good grief, I agree, that's a whole other level! >> >> I feel the same about the opportunities I had with you. I am still dorking with ASN1, currently broken, trying to add a "Class" Application Class tag. Missing an explicit context in on of the directions. Memory and Trauma are definitely linked. That's where the flashbacks come from. Do you recall my interviewing with Andreas? I did NOT NOT NOT NADA ZILCH NOTHING TO SEE HERE get that job, for whatever reason... >> >> I think I may be done. PromisesLocal is broken. ParrotTalk is broken. ASN1 is broken. SSL is broken. PromisesRemote is broken. Sigh. Fuck it. Someone else will have to pick it up. 20 years of work! I am hitting deep blue ocean, on my way to Morocco, by way of the Azores! With my shiny Zeus 3! Ciao, bella! I have been in Army/Germany, College, First Union/Charlotte, IBM/Puerto Rico, GRCI/JWARS, The FOURTH ESTATE!, Exobox, Quallaby/Lowell, WaMu/Seattle, FEMA/Reston, ARP&Associates/MILSATCOM, K12/Fired for weed, Dish Network/Denver, Homeless/Denver, Arrested/Jailed/Denver/Chapel Hill, Persecuted/All, A few 10s of Mental Facility Committals/Starts after 9/11 in Lowell, Squeaker/Since GRCI, Disability, Dreams coming true/A beautiful, capable sailboat. still looking for my life-long first mate. :( My faith and my hope/Infinity. :-D The Hellfire and its occupants, not my problem. I pay no attention. Burn. I "Will be in a life of bliss, In a Garden on high. The Fruits whereof"... --------------------------------------------------------------- Al Haqqah (69) >> [The Sure Reality! >> >> What is the Sure Reality? >> >> And what will make thee realise what the Sure Reality is? >> >> The Thamud and the 'Ad People (branded) as false the Stunning Calamity! >> >> But the Thamud,- they were destroyed by a terrible Storm of thunder and lightning! >> >> And the 'Ad, they were destroyed by a furious Wind, exceedingly violent; >> >> He made it rage against them seven nights and eight days in succession: so that thou couldst see the (whole) people lying prostrate in its (path), as they had been roots of hollow palm-trees tumbled down! >> >> Then seest thou any of them left surviving? >> >> And Pharaoh, and those before him, and the Cities Overthrown, committed habitual Sin. >> >> And disobeyed (each) the messenger of their Lord; so He punished them with an abundant Penalty. >> >> We, when the water (of Noah's Flood) overflowed beyond its limits, carried you (mankind), in the floating (Ark), >> >> That We might make it a Message unto you, and that ears (that should hear the tale and) retain its memory should bear its (lessons) in remembrance. >> >> Then, when one blast is sounded on the Trumpet, >> >> And the earth is moved, and its mountains, and they are crushed to powder at one stroke,- >> >> On that Day shall the (Great) Event come to pass. >> >> And the sky will be rent asunder, for it will that Day be flimsy, >> >> And the angels will be on its sides, and eight will, that Day, bear the Throne of thy Lord above them. >> >> That Day shall ye be brought to Judgment: not an act of yours that ye hide will be hidden. >> >> Then he that will be given his Record in his right hand will say: "Ah here! Read ye my Record! >> >> "I did really understand that my Account would (One Day) reach me!" >> >> And he will be in a life of Bliss, >> >> In a Garden on high, >> >> The Fruits whereof (will hang in bunches) low and near. >> >> "Eat ye and drink ye, with full satisfaction; because of the (good) that ye sent before you, in the days that are gone!" >> >> And he that will be given his Record in his left hand, will say: "Ah! Would that my Record had not been given to me! >> >> "And that I had never realised how my account (stood)! >> >> "Ah! Would that (Death) had made an end of me! >> >> "Of no profit to me has been my wealth! >> >> "My power has perished from me!"... >> >> (The stern command will say): "Seize ye him, and bind ye him, >> >> "And burn ye him in the Blazing Fire. >> >> "Further, make him march in a chain, whereof the length is seventy cubits! >> >> "This was he that would not believe in Allah Most High. >> >> "And would not encourage the feeding of the indigent! >> >> "So no friend hath he here this Day. >> >> "Nor hath he any food except the corruption from the washing of wounds, >> >> "Which none do eat but those in sin." >> >> So I do call to witness what ye see, >> >> And what ye see not, >> >> That this is verily the word of an honoured messenger; >> >> It is not the word of a poet: little it is ye believe! >> >> Nor is it the word of a soothsayer: little admonition it is ye receive. >> >> (This is) a Message sent down from the Lord of the Worlds. >> >> And if the messenger were to invent any sayings in Our name, >> >> We should certainly seize him by his right hand, >> >> And We should certainly then cut off the artery of his heart: >> >> Nor could any of you withhold him (from Our wrath). >> >> But verily this is a Message for the Allah-fearing. >> >> And We certainly know that there are amongst you those that reject (it). >> >> But truly (Revelation) is a cause of sorrow for the Unbelievers. >> >> But verily it is Truth of assured certainty. >> >> So glorify the name of thy Lord Most High. >> >> ] - Quran 69:1-52 --- Slosher Oriental, NC >> On 10/1/20 11:36 PM, Ron Teitelbaum wrote: >> >>> Hi Rob, >>> >>> I'm so sorry you felt that way. I know you have had major issues, you have said the same yourself. I'm always happy to see you come back even after long absences. You are a brilliant coder and it has been my distinct pleasure to work with you on Cryptography! Thank you for all you have done and indeed you are responsible for adding significant value to Squeak and the community. >>> >>> We all work on code and it's easy to work your ass off on something to make it work and forget where it originated. We all contribute in large and small ways to everything. If you started VMMaker thank you! It is definitely something a lot of us use. I remember learning all about it a long long time ago before I realized that while I could understand it and I could use it, the people that work on the VM are a level higher than me. I just make apps! >>> >>> I remember getting in an argument with Andreas about adding methods to collection. "WE DON"T NEED more methods in Collection we need to remove most of them and make it easier!" I argued with him about the value over and over but he insisted that they just didn't add enough value. I could have been put off. I could have assumed that Andreas didn't like me but I would have been very wrong! I was really honored to get the chance to work with him and we became great friends. Of course I added my methods to the code we were working on together and was so thrilled when he used my methods for his own code. >>> >>> I don't know what happened with VMMaker but again thank you for your participation in it.. I wanted to take a minute to thank you for your work and to let you know it is my honor to work with you too! I hope that you can come to terms with your past and that you get the help you need for your CPTSD. >>> >>> Everything is possible, the past is gone, but the future is still yours to shape. I wish the past was set in stone but even that moves and slips. I was talking to my wife about a party we attended: "Remember in 2000 we were at the party and counted down the new year and someone hit the breaker and killed the lights! We were all talking about what would happen in the year 2000, would everything break!" Great story except that I hadn't met my wife yet! The past is only what we remember but the future is something we have control over. Peace, calm, happyness, they are all hard to come by but they are possible. I wish you success in finding what makes your future better. >>> >>> I'm sorry about the bad things that have happened to you in the past. As far as I'm concerned, you are welcomed here! >>> >>> All the best, >>> >>> Ron Teitelbaum >>> >>> On Thu, Oct 1, 2020 at 10:38 PM Robert Withers via Squeak-dev wrote: >>> >>>> :sob::sob::sob: >>>> >>>> On 10/1/20 10:34 PM, Robert Withers wrote: >>>> >>>>> I wrote to the #general Squeak Slack channel: >>>>> >>>>>> What a complete larcenous bastard. 20 years ago, this month, published it as his own work. And been against me ever since. My CPTSD (100% veteran service-connected) comes with an exquisitely sensitive deception meter. There are those who shunned me and ostracized me and made me feel MOST UNWELCOME. For 20 years. My delusions kick in and I start suspecting back channel communications against me. My love for Squeak conflicted with what I knew was happening. but I hung in there and worked on Cryptography, work with a group of great people and that I am satisfied with its added value to Squeak. For 20 years I KNEW people were against me in the community. I cannot describe how negatively this affected me. My third suicide attempt, in 2007 I jumped off the roof of a 6 story apartment building and broke my back along with many bones. God did not want me to die, yet, so I lived. This deception and ostracism is most well highlighted by the taking credit for my work, without attribution. He is a complete tool. SHAME! >>>>>> >>>>>> I do not know the degree to which he spoke against me. Iimagineit was ever since 2000. Delusions! What is real? I knew not. So much torment! AGONY! They do not welcome me! They are trying to chase me off! Good grief, Charlie Brown. >>>>>> >>>>>> Severely exacerbated my CPTSD! I kept trying to kill myself because of it! I thought I had done something egregiously wrong. Whatever it was it had to be my fault. I was not feeling the love, even from myself. >>>>>> >>>>>> :scream: >>>>>> >>>>>> :scream: >>>>>> >>>>>> In 2017, 900 units of insulin brought my blood glucose below 40. I almost succeeded that time. >>>>>> >>>>>> :scream: >>>>> >>>>> rww >>>>> >>>>> On 10/1/20 8:55 PM, Robert Withers wrote: >>>>> >>>>>> The worst sort of person is one who takes the credit for the work of >>>>>> another. Wouldn't you agree? >>>>>> >>>>>> You may wish to hear John's judgement on the matter. He was right there >>>>>> when it was first built. >>>>>> >>>>>> If you are not humble you will be humiliated, and brought low. >>>>>> >>>>>> rww >>>>>> >>>>>> On 10/1/20 8:35 PM, tim Rowledge wrote: >>>>>> >>>>>>>> On 2020-10-01, at 4:57 PM, Robert Withers via Squeak-dev >>>>>>>> [](mailto:squeak-dev at lists.squeakfoundation.org) >>>>>>>> wrote: >>>>>>>> >>>>>>>> I am curious. Who was the original author of the VMMaker Tool? >>>>>>> >>>>>>> That would be me; back in exobox days. Written along with the original VMMaker and intended to be an example of clean, tidy, morphic usage. I've no idea if anyone ever uses it now, since running it via scripting has proven more valuable. >>>>>>> >>>>>>> tim >>>>>>> -- >>>>>>> tim Rowledge; >>>>>>> tim at rowledge.org >>>>>>> ; >>>>>>> http://www.rowledge.org/tim >>>>>>> "Wibble" said Pooh the stress beginning to show. >>>>> >>>>> -- >>>>> K, r >>>> >>>> -- >>>> K, r >> >> -- >> K, r > > -- > K, r -- K, r -------------- next part -------------- An HTML attachment was scrubbed... URL: -------------- next part -------------- A non-text attachment was scrubbed... Name: 7420963_20200328125416581_1_LARGE.jpg Type: image/jpeg Size: 47844 bytes Desc: not available URL: From robert.withers at pm.me Fri Oct 2 04:26:31 2020 From: robert.withers at pm.me (Robert Withers) Date: Fri, 02 Oct 2020 04:26:31 +0000 Subject: [squeak-dev] Curious history In-Reply-To: References: <190b8468-cfe2-fafc-4a72-de45f5927a8c@pm.me> <70921f42-0788-53b4-6c78-e0b76a651408@pm.me> <4RzffQkMYVDio5ypO3BdDDogbcHCBBrlCc1fxoT8GmqCUWhN0sU9yBdJfjTNNuM4-qL-oLkLcIB--mYjPkf0Lg==@protonmail.conversationid> <877lUkLJfpLi1si68jBg1GdbHUPpNB5NhFo1QUUdR1B3G5XWCcIKgtbRJ9r-nBoAYlzIl-mApKW07rQFHukdoA==@protonmail.internalid> Message-ID: <062913bf-6e9b-6a5b-e157-466f789fda2e@pm.me> *clears throat* Outta the Army I got a Bachelors of Science in Physics at Guilford College a wonderful place to be! We all have our pride! Hello Somebody! Is that an Amen? Praise Be to God! God is Good. Ask any of the homeless, when you get there, in sacrifice and submission. Is God Good? You may want to look for the biggest man in the room, on first arrival to a new circle, before you do anything else. He will tell you what to do. Heh. He may tell you to dance. Oops. On 10/2/20 12:21 AM, Robert Withers via Squeak-dev wrote: > On 10/1/20 11:48 PM, Robert Withers wrote: > >> Do you recall my interviewing with Andreas? I did NOT NOT NOT NADA ZILCH NOTHING TO SEE HERE ZERO TIME FOR YOU get that job, for whatever reason... >> >> On 10/1/20 11:46 PM, Robert Withers wrote: >> >>> Hi Ron, >>> >>> Thank you so much for the kind words and the extension of your hand towards myself. In no fashion has it been all bad. I really need to tell you, right now, that I did not do any work on VMMaker. Was there extensions to same from the VMMakerTool? Perhaps, I do not recall. I only built the Tool, not the Maker. Good grief, I agree, that's a whole other level! >>> >>> I feel the same about the opportunities I had with you. I am still dorking with ASN1, currently broken, trying to add a "Class" Application Class tag. Missing an explicit context in on of the directions. Memory and Trauma are definitely linked. That's where the flashbacks come from. Do you recall my interviewing with Andreas? I did NOT NOT NOT NADA ZILCH NOTHING TO SEE HERE get that job, for whatever reason... >>> >>> I think I may be done. PromisesLocal is broken. ParrotTalk is broken. ASN1 is broken. SSL is broken. PromisesRemote is broken. Sigh. Fuck it. Someone else will have to pick it up. 20 years of work! I am hitting deep blue ocean, on my way to Morocco, by way of the Azores! With my shiny Zeus 3! Ciao, bella! > > I have been in Army/Germany, College, First Union/Charlotte, IBM/Puerto Rico, GRCI/JWARS, The FOURTH ESTATE!, Exobox, Quallaby/Lowell, WaMu/Seattle, FEMA/Reston, ARP&Associates/MILSATCOM, K12/Fired for weed, Dish Network/Denver, Homeless/Denver, Arrested/Jailed/Denver/Chapel Hill, Persecuted/All, A few 10s of Mental Facility Committals/Starts after 9/11 in Lowell, Squeaker/Since GRCI, Disability, Dreams coming true/A beautiful, capable sailboat. still looking for my life-long first mate. :( My faith and my hope/Infinity. :-D > > The Hellfire and its occupants, not my problem. I pay no attention. Burn. > > I "Will be in a life of bliss, In a Garden on high. The Fruits whereof"... > > --------------------------------------------------------------- > > Al Haqqah (69) > >>> [The Sure Reality! >>> >>> What is the Sure Reality? >>> >>> And what will make thee realise what the Sure Reality is? >>> >>> The Thamud and the 'Ad People (branded) as false the Stunning Calamity! >>> >>> But the Thamud,- they were destroyed by a terrible Storm of thunder and lightning! >>> >>> And the 'Ad, they were destroyed by a furious Wind, exceedingly violent; >>> >>> He made it rage against them seven nights and eight days in succession: so that thou couldst see the (whole) people lying prostrate in its (path), as they had been roots of hollow palm-trees tumbled down! >>> >>> Then seest thou any of them left surviving? >>> >>> And Pharaoh, and those before him, and the Cities Overthrown, committed habitual Sin. >>> >>> And disobeyed (each) the messenger of their Lord; so He punished them with an abundant Penalty. >>> >>> We, when the water (of Noah's Flood) overflowed beyond its limits, carried you (mankind), in the floating (Ark), >>> >>> That We might make it a Message unto you, and that ears (that should hear the tale and) retain its memory should bear its (lessons) in remembrance. >>> >>> Then, when one blast is sounded on the Trumpet, >>> >>> And the earth is moved, and its mountains, and they are crushed to powder at one stroke,- >>> >>> On that Day shall the (Great) Event come to pass. >>> >>> And the sky will be rent asunder, for it will that Day be flimsy, >>> >>> And the angels will be on its sides, and eight will, that Day, bear the Throne of thy Lord above them. >>> >>> That Day shall ye be brought to Judgment: not an act of yours that ye hide will be hidden. >>> >>> Then he that will be given his Record in his right hand will say: "Ah here! Read ye my Record! >>> >>> "I did really understand that my Account would (One Day) reach me!" >>> >>> And he will be in a life of Bliss, >>> >>> In a Garden on high, >>> >>> The Fruits whereof (will hang in bunches) low and near. >>> >>> "Eat ye and drink ye, with full satisfaction; because of the (good) that ye sent before you, in the days that are gone!" >>> >>> And he that will be given his Record in his left hand, will say: "Ah! Would that my Record had not been given to me! >>> >>> "And that I had never realised how my account (stood)! >>> >>> "Ah! Would that (Death) had made an end of me! >>> >>> "Of no profit to me has been my wealth! >>> >>> "My power has perished from me!"... >>> >>> (The stern command will say): "Seize ye him, and bind ye him, >>> >>> "And burn ye him in the Blazing Fire. >>> >>> "Further, make him march in a chain, whereof the length is seventy cubits! >>> >>> "This was he that would not believe in Allah Most High. >>> >>> "And would not encourage the feeding of the indigent! >>> >>> "So no friend hath he here this Day. >>> >>> "Nor hath he any food except the corruption from the washing of wounds, >>> >>> "Which none do eat but those in sin." >>> >>> So I do call to witness what ye see, >>> >>> And what ye see not, >>> >>> That this is verily the word of an honoured messenger; >>> >>> It is not the word of a poet: little it is ye believe! >>> >>> Nor is it the word of a soothsayer: little admonition it is ye receive. >>> >>> (This is) a Message sent down from the Lord of the Worlds. >>> >>> And if the messenger were to invent any sayings in Our name, >>> >>> We should certainly seize him by his right hand, >>> >>> And We should certainly then cut off the artery of his heart: >>> >>> Nor could any of you withhold him (from Our wrath). >>> >>> But verily this is a Message for the Allah-fearing. >>> >>> And We certainly know that there are amongst you those that reject (it). >>> >>> But truly (Revelation) is a cause of sorrow for the Unbelievers. >>> >>> But verily it is Truth of assured certainty. >>> >>> So glorify the name of thy Lord Most High. >>> >>> ] - Quran 69:1-52 > > --- > > Slosher > Oriental, NC > >>> On 10/1/20 11:36 PM, Ron Teitelbaum wrote: >>> >>>> Hi Rob, >>>> >>>> I'm so sorry you felt that way. I know you have had major issues, you have said the same yourself. I'm always happy to see you come back even after long absences. You are a brilliant coder and it has been my distinct pleasure to work with you on Cryptography! Thank you for all you have done and indeed you are responsible for adding significant value to Squeak and the community. >>>> >>>> We all work on code and it's easy to work your ass off on something to make it work and forget where it originated. We all contribute in large and small ways to everything. If you started VMMaker thank you! It is definitely something a lot of us use. I remember learning all about it a long long time ago before I realized that while I could understand it and I could use it, the people that work on the VM are a level higher than me. I just make apps! >>>> >>>> I remember getting in an argument with Andreas about adding methods to collection. "WE DON"T NEED more methods in Collection we need to remove most of them and make it easier!" I argued with him about the value over and over but he insisted that they just didn't add enough value. I could have been put off. I could have assumed that Andreas didn't like me but I would have been very wrong! I was really honored to get the chance to work with him and we became great friends. Of course I added my methods to the code we were working on together and was so thrilled when he used my methods for his own code. >>>> >>>> I don't know what happened with VMMaker but again thank you for your participation in it.. I wanted to take a minute to thank you for your work and to let you know it is my honor to work with you too! I hope that you can come to terms with your past and that you get the help you need for your CPTSD. >>>> >>>> Everything is possible, the past is gone, but the future is still yours to shape. I wish the past was set in stone but even that moves and slips. I was talking to my wife about a party we attended: "Remember in 2000 we were at the party and counted down the new year and someone hit the breaker and killed the lights! We were all talking about what would happen in the year 2000, would everything break!" Great story except that I hadn't met my wife yet! The past is only what we remember but the future is something we have control over. Peace, calm, happyness, they are all hard to come by but they are possible. I wish you success in finding what makes your future better. >>>> >>>> I'm sorry about the bad things that have happened to you in the past. As far as I'm concerned, you are welcomed here! >>>> >>>> All the best, >>>> >>>> Ron Teitelbaum >>>> >>>> On Thu, Oct 1, 2020 at 10:38 PM Robert Withers via Squeak-dev wrote: >>>> >>>>> :sob::sob::sob: >>>>> >>>>> On 10/1/20 10:34 PM, Robert Withers wrote: >>>>> >>>>>> I wrote to the #general Squeak Slack channel: >>>>>> >>>>>>> What a complete larcenous bastard. 20 years ago, this month, published it as his own work. And been against me ever since. My CPTSD (100% veteran service-connected) comes with an exquisitely sensitive deception meter. There are those who shunned me and ostracized me and made me feel MOST UNWELCOME. For 20 years. My delusions kick in and I start suspecting back channel communications against me. My love for Squeak conflicted with what I knew was happening. but I hung in there and worked on Cryptography, work with a group of great people and that I am satisfied with its added value to Squeak. For 20 years I KNEW people were against me in the community. I cannot describe how negatively this affected me. My third suicide attempt, in 2007 I jumped off the roof of a 6 story apartment building and broke my back along with many bones. God did not want me to die, yet, so I lived. This deception and ostracism is most well highlighted by the taking credit for my work, without attribution. He is a complete tool. SHAME! >>>>>>> >>>>>>> I do not know the degree to which he spoke against me. Iimagineit was ever since 2000. Delusions! What is real? I knew not. So much torment! AGONY! They do not welcome me! They are trying to chase me off! Good grief, Charlie Brown. >>>>>>> >>>>>>> Severely exacerbated my CPTSD! I kept trying to kill myself because of it! I thought I had done something egregiously wrong. Whatever it was it had to be my fault. I was not feeling the love, even from myself. >>>>>>> >>>>>>> :scream: >>>>>>> >>>>>>> :scream: >>>>>>> >>>>>>> In 2017, 900 units of insulin brought my blood glucose below 40. I almost succeeded that time. >>>>>>> >>>>>>> :scream: >>>>>> >>>>>> rww >>>>>> >>>>>> On 10/1/20 8:55 PM, Robert Withers wrote: >>>>>> >>>>>>> The worst sort of person is one who takes the credit for the work of >>>>>>> another. Wouldn't you agree? >>>>>>> >>>>>>> You may wish to hear John's judgement on the matter. He was right there >>>>>>> when it was first built. >>>>>>> >>>>>>> If you are not humble you will be humiliated, and brought low. >>>>>>> >>>>>>> rww >>>>>>> >>>>>>> On 10/1/20 8:35 PM, tim Rowledge wrote: >>>>>>> >>>>>>>>> On 2020-10-01, at 4:57 PM, Robert Withers via Squeak-dev >>>>>>>>> [](mailto:squeak-dev at lists.squeakfoundation.org) >>>>>>>>> wrote: >>>>>>>>> >>>>>>>>> I am curious. Who was the original author of the VMMaker Tool? >>>>>>>> >>>>>>>> That would be me; back in exobox days. Written along with the original VMMaker and intended to be an example of clean, tidy, morphic usage. I've no idea if anyone ever uses it now, since running it via scripting has proven more valuable. >>>>>>>> >>>>>>>> tim >>>>>>>> -- >>>>>>>> tim Rowledge; >>>>>>>> tim at rowledge.org >>>>>>>> ; >>>>>>>> http://www.rowledge.org/tim >>>>>>>> "Wibble" said Pooh the stress beginning to show. >>>>>> >>>>>> -- >>>>>> K, r >>>>> >>>>> -- >>>>> K, r >>> >>> -- >>> K, r >> >> -- >> K, r > > -- > K, r -- K, r -------------- next part -------------- An HTML attachment was scrubbed... URL: -------------- next part -------------- A non-text attachment was scrubbed... Name: 7420963_20200328125416581_1_LARGE.jpg Type: image/jpeg Size: 47844 bytes Desc: not available URL: From robert.withers at pm.me Fri Oct 2 04:29:57 2020 From: robert.withers at pm.me (Robert Withers) Date: Fri, 02 Oct 2020 04:29:57 +0000 Subject: [squeak-dev] Curious history In-Reply-To: <062913bf-6e9b-6a5b-e157-466f789fda2e@pm.me> References: <4RzffQkMYVDio5ypO3BdDDogbcHCBBrlCc1fxoT8GmqCUWhN0sU9yBdJfjTNNuM4-qL-oLkLcIB--mYjPkf0Lg==@protonmail.conversationid> <877lUkLJfpLi1si68jBg1GdbHUPpNB5NhFo1QUUdR1B3G5XWCcIKgtbRJ9r-nBoAYlzIl-mApKW07rQFHukdoA==@protonmail.internalid> <062913bf-6e9b-6a5b-e157-466f789fda2e@pm.me> Message-ID: <9b26a5dd-0d74-5584-d8a1-162dd43a6bfc@pm.me> Here is the level 10 team I built. It is all about the test cases. 2 releases over 6 months; Zero bugs. https://blogs.wsj.com/cio/2014/05/06/dish-looks-to-open-source-software-after-database-failure/ On 10/2/20 12:26 AM, Robert Withers wrote: > *clears throat* > Outta the Army I got a Bachelors of Science in Physics at Guilford College a wonderful place to be! We all have our pride! Hello Somebody! Is that an Amen? Praise Be to God! God is Good. Ask any of the homeless, when you get there, in sacrifice and submission. Is God Good? You may want to look for the biggest man in the room, on first arrival to a new circle, before you do anything else. He will tell you what to do. Heh. He may tell you to dance. Oops. > > On 10/2/20 12:21 AM, Robert Withers via Squeak-dev wrote: > >> On 10/1/20 11:48 PM, Robert Withers wrote: >> >>> Do you recall my interviewing with Andreas? I did NOT NOT NOT NADA ZILCH NOTHING TO SEE HERE ZERO TIME FOR YOU get that job, for whatever reason... >>> >>> On 10/1/20 11:46 PM, Robert Withers wrote: >>> >>>> Hi Ron, >>>> >>>> Thank you so much for the kind words and the extension of your hand towards myself. In no fashion has it been all bad. I really need to tell you, right now, that I did not do any work on VMMaker. Was there extensions to same from the VMMakerTool? Perhaps, I do not recall. I only built the Tool, not the Maker. Good grief, I agree, that's a whole other level! >>>> >>>> I feel the same about the opportunities I had with you. I am still dorking with ASN1, currently broken, trying to add a "Class" Application Class tag. Missing an explicit context in on of the directions. Memory and Trauma are definitely linked. That's where the flashbacks come from. Do you recall my interviewing with Andreas? I did NOT NOT NOT NADA ZILCH NOTHING TO SEE HERE get that job, for whatever reason... >>>> >>>> I think I may be done. PromisesLocal is broken. ParrotTalk is broken. ASN1 is broken. SSL is broken. PromisesRemote is broken. Sigh. Fuck it. Someone else will have to pick it up. 20 years of work! I am hitting deep blue ocean, on my way to Morocco, by way of the Azores! With my shiny Zeus 3! Ciao, bella! >> >> I have been in Army/Germany, College, First Union/Charlotte, IBM/Puerto Rico, GRCI/JWARS, The FOURTH ESTATE!, Exobox, Quallaby/Lowell, WaMu/Seattle, FEMA/Reston, ARP&Associates/MILSATCOM, K12/Fired for weed, Dish Network/Denver, Homeless/Denver, Arrested/Jailed/Denver/Chapel Hill, Persecuted/All, A few 10s of Mental Facility Committals/Starts after 9/11 in Lowell, Squeaker/Since GRCI, Disability, Dreams coming true/A beautiful, capable sailboat. still looking for my life-long first mate. :( My faith and my hope/Infinity. :-D >> >> The Hellfire and its occupants, not my problem. I pay no attention. Burn. >> >> I "Will be in a life of bliss, In a Garden on high. The Fruits whereof"... >> >> --------------------------------------------------------------- >> >> Al Haqqah (69) >> >>>> [The Sure Reality! >>>> >>>> What is the Sure Reality? >>>> >>>> And what will make thee realise what the Sure Reality is? >>>> >>>> The Thamud and the 'Ad People (branded) as false the Stunning Calamity! >>>> >>>> But the Thamud,- they were destroyed by a terrible Storm of thunder and lightning! >>>> >>>> And the 'Ad, they were destroyed by a furious Wind, exceedingly violent; >>>> >>>> He made it rage against them seven nights and eight days in succession: so that thou couldst see the (whole) people lying prostrate in its (path), as they had been roots of hollow palm-trees tumbled down! >>>> >>>> Then seest thou any of them left surviving? >>>> >>>> And Pharaoh, and those before him, and the Cities Overthrown, committed habitual Sin. >>>> >>>> And disobeyed (each) the messenger of their Lord; so He punished them with an abundant Penalty. >>>> >>>> We, when the water (of Noah's Flood) overflowed beyond its limits, carried you (mankind), in the floating (Ark), >>>> >>>> That We might make it a Message unto you, and that ears (that should hear the tale and) retain its memory should bear its (lessons) in remembrance. >>>> >>>> Then, when one blast is sounded on the Trumpet, >>>> >>>> And the earth is moved, and its mountains, and they are crushed to powder at one stroke,- >>>> >>>> On that Day shall the (Great) Event come to pass. >>>> >>>> And the sky will be rent asunder, for it will that Day be flimsy, >>>> >>>> And the angels will be on its sides, and eight will, that Day, bear the Throne of thy Lord above them. >>>> >>>> That Day shall ye be brought to Judgment: not an act of yours that ye hide will be hidden. >>>> >>>> Then he that will be given his Record in his right hand will say: "Ah here! Read ye my Record! >>>> >>>> "I did really understand that my Account would (One Day) reach me!" >>>> >>>> And he will be in a life of Bliss, >>>> >>>> In a Garden on high, >>>> >>>> The Fruits whereof (will hang in bunches) low and near. >>>> >>>> "Eat ye and drink ye, with full satisfaction; because of the (good) that ye sent before you, in the days that are gone!" >>>> >>>> And he that will be given his Record in his left hand, will say: "Ah! Would that my Record had not been given to me! >>>> >>>> "And that I had never realised how my account (stood)! >>>> >>>> "Ah! Would that (Death) had made an end of me! >>>> >>>> "Of no profit to me has been my wealth! >>>> >>>> "My power has perished from me!"... >>>> >>>> (The stern command will say): "Seize ye him, and bind ye him, >>>> >>>> "And burn ye him in the Blazing Fire. >>>> >>>> "Further, make him march in a chain, whereof the length is seventy cubits! >>>> >>>> "This was he that would not believe in Allah Most High. >>>> >>>> "And would not encourage the feeding of the indigent! >>>> >>>> "So no friend hath he here this Day. >>>> >>>> "Nor hath he any food except the corruption from the washing of wounds, >>>> >>>> "Which none do eat but those in sin." >>>> >>>> So I do call to witness what ye see, >>>> >>>> And what ye see not, >>>> >>>> That this is verily the word of an honoured messenger; >>>> >>>> It is not the word of a poet: little it is ye believe! >>>> >>>> Nor is it the word of a soothsayer: little admonition it is ye receive. >>>> >>>> (This is) a Message sent down from the Lord of the Worlds. >>>> >>>> And if the messenger were to invent any sayings in Our name, >>>> >>>> We should certainly seize him by his right hand, >>>> >>>> And We should certainly then cut off the artery of his heart: >>>> >>>> Nor could any of you withhold him (from Our wrath). >>>> >>>> But verily this is a Message for the Allah-fearing. >>>> >>>> And We certainly know that there are amongst you those that reject (it). >>>> >>>> But truly (Revelation) is a cause of sorrow for the Unbelievers. >>>> >>>> But verily it is Truth of assured certainty. >>>> >>>> So glorify the name of thy Lord Most High. >>>> >>>> ] - Quran 69:1-52 >> >> --- >> >> Slosher >> Oriental, NC >> >>>> On 10/1/20 11:36 PM, Ron Teitelbaum wrote: >>>> >>>>> Hi Rob, >>>>> >>>>> I'm so sorry you felt that way. I know you have had major issues, you have said the same yourself. I'm always happy to see you come back even after long absences. You are a brilliant coder and it has been my distinct pleasure to work with you on Cryptography! Thank you for all you have done and indeed you are responsible for adding significant value to Squeak and the community. >>>>> >>>>> We all work on code and it's easy to work your ass off on something to make it work and forget where it originated. We all contribute in large and small ways to everything. If you started VMMaker thank you! It is definitely something a lot of us use. I remember learning all about it a long long time ago before I realized that while I could understand it and I could use it, the people that work on the VM are a level higher than me. I just make apps! >>>>> >>>>> I remember getting in an argument with Andreas about adding methods to collection. "WE DON"T NEED more methods in Collection we need to remove most of them and make it easier!" I argued with him about the value over and over but he insisted that they just didn't add enough value. I could have been put off. I could have assumed that Andreas didn't like me but I would have been very wrong! I was really honored to get the chance to work with him and we became great friends. Of course I added my methods to the code we were working on together and was so thrilled when he used my methods for his own code. >>>>> >>>>> I don't know what happened with VMMaker but again thank you for your participation in it.. I wanted to take a minute to thank you for your work and to let you know it is my honor to work with you too! I hope that you can come to terms with your past and that you get the help you need for your CPTSD. >>>>> >>>>> Everything is possible, the past is gone, but the future is still yours to shape. I wish the past was set in stone but even that moves and slips. I was talking to my wife about a party we attended: "Remember in 2000 we were at the party and counted down the new year and someone hit the breaker and killed the lights! We were all talking about what would happen in the year 2000, would everything break!" Great story except that I hadn't met my wife yet! The past is only what we remember but the future is something we have control over. Peace, calm, happyness, they are all hard to come by but they are possible. I wish you success in finding what makes your future better. >>>>> >>>>> I'm sorry about the bad things that have happened to you in the past. As far as I'm concerned, you are welcomed here! >>>>> >>>>> All the best, >>>>> >>>>> Ron Teitelbaum >>>>> >>>>> On Thu, Oct 1, 2020 at 10:38 PM Robert Withers via Squeak-dev wrote: >>>>> >>>>>> :sob::sob::sob: >>>>>> >>>>>> On 10/1/20 10:34 PM, Robert Withers wrote: >>>>>> >>>>>>> I wrote to the #general Squeak Slack channel: >>>>>>> >>>>>>>> What a complete larcenous bastard. 20 years ago, this month, published it as his own work. And been against me ever since. My CPTSD (100% veteran service-connected) comes with an exquisitely sensitive deception meter. There are those who shunned me and ostracized me and made me feel MOST UNWELCOME. For 20 years. My delusions kick in and I start suspecting back channel communications against me. My love for Squeak conflicted with what I knew was happening. but I hung in there and worked on Cryptography, work with a group of great people and that I am satisfied with its added value to Squeak. For 20 years I KNEW people were against me in the community. I cannot describe how negatively this affected me. My third suicide attempt, in 2007 I jumped off the roof of a 6 story apartment building and broke my back along with many bones. God did not want me to die, yet, so I lived. This deception and ostracism is most well highlighted by the taking credit for my work, without attribution. He is a complete tool. SHAME! >>>>>>>> >>>>>>>> I do not know the degree to which he spoke against me. Iimagineit was ever since 2000. Delusions! What is real? I knew not. So much torment! AGONY! They do not welcome me! They are trying to chase me off! Good grief, Charlie Brown. >>>>>>>> >>>>>>>> Severely exacerbated my CPTSD! I kept trying to kill myself because of it! I thought I had done something egregiously wrong. Whatever it was it had to be my fault. I was not feeling the love, even from myself. >>>>>>>> >>>>>>>> :scream: >>>>>>>> >>>>>>>> :scream: >>>>>>>> >>>>>>>> In 2017, 900 units of insulin brought my blood glucose below 40. I almost succeeded that time. >>>>>>>> >>>>>>>> :scream: >>>>>>> >>>>>>> rww >>>>>>> >>>>>>> On 10/1/20 8:55 PM, Robert Withers wrote: >>>>>>> >>>>>>>> The worst sort of person is one who takes the credit for the work of >>>>>>>> another. Wouldn't you agree? >>>>>>>> >>>>>>>> You may wish to hear John's judgement on the matter. He was right there >>>>>>>> when it was first built. >>>>>>>> >>>>>>>> If you are not humble you will be humiliated, and brought low. >>>>>>>> >>>>>>>> rww >>>>>>>> >>>>>>>> On 10/1/20 8:35 PM, tim Rowledge wrote: >>>>>>>> >>>>>>>>>> On 2020-10-01, at 4:57 PM, Robert Withers via Squeak-dev >>>>>>>>>> [](mailto:squeak-dev at lists.squeakfoundation.org) >>>>>>>>>> wrote: >>>>>>>>>> >>>>>>>>>> I am curious. Who was the original author of the VMMaker Tool? >>>>>>>>> >>>>>>>>> That would be me; back in exobox days. Written along with the original VMMaker and intended to be an example of clean, tidy, morphic usage. I've no idea if anyone ever uses it now, since running it via scripting has proven more valuable. >>>>>>>>> >>>>>>>>> tim >>>>>>>>> -- >>>>>>>>> tim Rowledge; >>>>>>>>> tim at rowledge.org >>>>>>>>> ; >>>>>>>>> http://www.rowledge.org/tim >>>>>>>>> "Wibble" said Pooh the stress beginning to show. >>>>>>> >>>>>>> -- >>>>>>> K, r >>>>>> >>>>>> -- >>>>>> K, r >>>> >>>> -- >>>> K, r >>> >>> -- >>> K, r >> >> -- >> K, r > > -- > K, r -- K, r -------------- next part -------------- An HTML attachment was scrubbed... URL: -------------- next part -------------- A non-text attachment was scrubbed... Name: 7420963_20200328125416581_1_LARGE.jpg Type: image/jpeg Size: 47844 bytes Desc: not available URL: From robert.withers at pm.me Fri Oct 2 04:45:08 2020 From: robert.withers at pm.me (Robert Withers) Date: Fri, 02 Oct 2020 04:45:08 +0000 Subject: [squeak-dev] Curious history In-Reply-To: <427948D0-666A-4151-B57E-30F7399DD68B@gmail.com> References: <427948D0-666A-4151-B57E-30F7399DD68B@gmail.com> Message-ID: <3f03663b-3fd0-8e97-ba24-7ca8f73d8e9c@pm.me> On 10/2/20 12:20 AM, Eliot Miranda wrote: >> On Oct 1, 2020, at 8:36 PM, Ron Teitelbaum [](mailto:Ron at usmedrec.com) wrote: > >>  >> Hi Rob, >> >> I'm so sorry you felt that way. I know you have had major issues, you have said the same yourself. I'm always happy to see you come back even after long absences. You are a brilliant coder and it has been my distinct pleasure to work with you on Cryptography! Thank you for all you have done and indeed you are responsible for adding significant value to Squeak and the community. >> >> We all work on code and it's easy to work your ass off on something to make it work and forget where it originated. We all contribute in large and small ways to everything. If you started VMMaker thank you! It is definitely something a lot of us use. I remember learning all about it a long long time ago before I realized that while I could understand it and I could use it, the people that work on the VM are a level higher than me. I just make apps! >> >> I remember getting in an argument with Andreas about adding methods to collection. "WE DON"T NEED more methods in Collection we need to remove most of them and make it easier!" I argued with him about the value over and over but he insisted that they just didn't add enough value. I could have been put off. I could have assumed that Andreas didn't like me but I would have been very wrong! I was really honored to get the chance to work with him and we became great friends. Of course I added my methods to the code we were working on together and was so thrilled when he used my methods for his own code. >> >> I don't know what happened with VMMaker but again thank you for your participation in it.. I wanted to take a minute to thank you for your work and to let you know it is my honor to work with you too! I hope that you can come to terms with your past and that you get the help you need for your CPTSD. >> >> Everything is possible, the past is gone, but the future is still yours to shape. I wish the past was set in stone but even that moves and slips. I was talking to my wife about a party we attended: "Remember in 2000 we were at the party and counted down the new year and someone hit the breaker and killed the lights! We were all talking about what would happen in the year 2000, would everything break!" Great story except that I hadn't met my wife yet! The past is only what we remember but the future is something we have control over. Peace, calm, happyness, they are all hard to come by but they are possible. I wish you success in finding what makes your future better. >> >> I'm sorry about the bad things that have happened to you in the past. As far as I'm concerned, you are welcomed here! >> >> All the best, >> >> Ron Teitelbaum > > Beautifully said, Ron. And Rob, I hope you find peace with this. It’s difficult; I know. Hugs. Thanks, Eliot! I had to rip my heart completely apart, laid bare. So the scabs would heal right. I kept picking and picking and picking. They itched like HELL! >> On Thu, Oct 1, 2020 at 10:38 PM Robert Withers via Squeak-dev wrote: >> >>> :sob::sob::sob: >>> >>> On 10/1/20 10:34 PM, Robert Withers wrote: >>> >>>> I wrote to the #general Squeak Slack channel: >>>> >>>>> What a complete larcenous bastard. 20 years ago, this month, published it as his own work. And been against me ever since. My CPTSD (100% veteran service-connected) comes with an exquisitely sensitive deception meter. There are those who shunned me and ostracized me and made me feel MOST UNWELCOME. For 20 years. My delusions kick in and I start suspecting back channel communications against me. My love for Squeak conflicted with what I knew was happening. but I hung in there and worked on Cryptography, work with a group of great people and that I am satisfied with its added value to Squeak. For 20 years I KNEW people were against me in the community. I cannot describe how negatively this affected me. My third suicide attempt, in 2007 I jumped off the roof of a 6 story apartment building and broke my back along with many bones. God did not want me to die, yet, so I lived. This deception and ostracism is most well highlighted by the taking credit for my work, without attribution. He is a complete tool. SHAME! >>>>> >>>>> I do not know the degree to which he spoke against me. Iimagineit was ever since 2000. Delusions! What is real? I knew not. So much torment! AGONY! They do not welcome me! They are trying to chase me off! Good grief, Charlie Brown. >>>>> >>>>> Severely exacerbated my CPTSD! I kept trying to kill myself because of it! I thought I had done something egregiously wrong. Whatever it was it had to be my fault. I was not feeling the love, even from myself. >>>>> >>>>> :scream: >>>>> >>>>> :scream: >>>>> >>>>> In 2017, 900 units of insulin brought my blood glucose below 40. I almost succeeded that time. >>>>> >>>>> :scream: >>>> >>>> rww >>>> >>>> On 10/1/20 8:55 PM, Robert Withers wrote: >>>> >>>>> The worst sort of person is one who takes the credit for the work of >>>>> another. Wouldn't you agree? >>>>> >>>>> You may wish to hear John's judgement on the matter. He was right there >>>>> when it was first built. >>>>> >>>>> If you are not humble you will be humiliated, and brought low. >>>>> >>>>> rww >>>>> >>>>> On 10/1/20 8:35 PM, tim Rowledge wrote: >>>>> >>>>>>> On 2020-10-01, at 4:57 PM, Robert Withers via Squeak-dev >>>>>>> [](mailto:squeak-dev at lists.squeakfoundation.org) >>>>>>> wrote: >>>>>>> >>>>>>> I am curious. Who was the original author of the VMMaker Tool? >>>>>> >>>>>> That would be me; back in exobox days. Written along with the original VMMaker and intended to be an example of clean, tidy, morphic usage. I've no idea if anyone ever uses it now, since running it via scripting has proven more valuable. >>>>>> >>>>>> tim >>>>>> -- >>>>>> tim Rowledge; >>>>>> tim at rowledge.org >>>>>> ; >>>>>> http://www.rowledge.org/tim >>>>>> "Wibble" said Pooh the stress beginning to show. >>>> >>>> -- >>>> K, r >>> >>> -- >>> K, r -- K, r -------------- next part -------------- An HTML attachment was scrubbed... URL: From robert.withers at pm.me Fri Oct 2 04:46:57 2020 From: robert.withers at pm.me (Robert Withers) Date: Fri, 02 Oct 2020 04:46:57 +0000 Subject: [squeak-dev] Curious history In-Reply-To: <3f03663b-3fd0-8e97-ba24-7ca8f73d8e9c@pm.me> References: <4RzffQkMYVDio5ypO3BdDDogbcHCBBrlCc1fxoT8GmqCUWhN0sU9yBdJfjTNNuM4-qL-oLkLcIB--mYjPkf0Lg==@protonmail.conversationid> <427948D0-666A-4151-B57E-30F7399DD68B@gmail.com> <3f03663b-3fd0-8e97-ba24-7ca8f73d8e9c@pm.me> Message-ID: <57955c22-a2bd-2414-3394-fb2a396d3b4e@pm.me> Note. The onset of itching is a sure indicator. On 10/2/20 12:44 AM, Robert Withers wrote: > On 10/2/20 12:20 AM, Eliot Miranda wrote: > >>> On Oct 1, 2020, at 8:36 PM, Ron Teitelbaum [](mailto:Ron at usmedrec.com) wrote: >> >>>  >>> Hi Rob, >>> >>> I'm so sorry you felt that way. I know you have had major issues, you have said the same yourself. I'm always happy to see you come back even after long absences. You are a brilliant coder and it has been my distinct pleasure to work with you on Cryptography! Thank you for all you have done and indeed you are responsible for adding significant value to Squeak and the community. >>> >>> We all work on code and it's easy to work your ass off on something to make it work and forget where it originated. We all contribute in large and small ways to everything. If you started VMMaker thank you! It is definitely something a lot of us use. I remember learning all about it a long long time ago before I realized that while I could understand it and I could use it, the people that work on the VM are a level higher than me. I just make apps! >>> >>> I remember getting in an argument with Andreas about adding methods to collection. "WE DON"T NEED more methods in Collection we need to remove most of them and make it easier!" I argued with him about the value over and over but he insisted that they just didn't add enough value. I could have been put off. I could have assumed that Andreas didn't like me but I would have been very wrong! I was really honored to get the chance to work with him and we became great friends. Of course I added my methods to the code we were working on together and was so thrilled when he used my methods for his own code. >>> >>> I don't know what happened with VMMaker but again thank you for your participation in it.. I wanted to take a minute to thank you for your work and to let you know it is my honor to work with you too! I hope that you can come to terms with your past and that you get the help you need for your CPTSD. >>> >>> Everything is possible, the past is gone, but the future is still yours to shape. I wish the past was set in stone but even that moves and slips. I was talking to my wife about a party we attended: "Remember in 2000 we were at the party and counted down the new year and someone hit the breaker and killed the lights! We were all talking about what would happen in the year 2000, would everything break!" Great story except that I hadn't met my wife yet! The past is only what we remember but the future is something we have control over. Peace, calm, happyness, they are all hard to come by but they are possible. I wish you success in finding what makes your future better. >>> >>> I'm sorry about the bad things that have happened to you in the past. As far as I'm concerned, you are welcomed here! >>> >>> All the best, >>> >>> Ron Teitelbaum >> >> Beautifully said, Ron. And Rob, I hope you find peace with this. It’s difficult; I know. Hugs. > > Thanks, Eliot! I had to rip my heart completely apart, laid bare. So the scabs would heal right. I kept picking and picking and picking. They itched like HELL! > >>> On Thu, Oct 1, 2020 at 10:38 PM Robert Withers via Squeak-dev wrote: >>> >>>> :sob::sob::sob: >>>> >>>> On 10/1/20 10:34 PM, Robert Withers wrote: >>>> >>>>> I wrote to the #general Squeak Slack channel: >>>>> >>>>>> What a complete larcenous bastard. 20 years ago, this month, published it as his own work. And been against me ever since. My CPTSD (100% veteran service-connected) comes with an exquisitely sensitive deception meter. There are those who shunned me and ostracized me and made me feel MOST UNWELCOME. For 20 years. My delusions kick in and I start suspecting back channel communications against me. My love for Squeak conflicted with what I knew was happening. but I hung in there and worked on Cryptography, work with a group of great people and that I am satisfied with its added value to Squeak. For 20 years I KNEW people were against me in the community. I cannot describe how negatively this affected me. My third suicide attempt, in 2007 I jumped off the roof of a 6 story apartment building and broke my back along with many bones. God did not want me to die, yet, so I lived. This deception and ostracism is most well highlighted by the taking credit for my work, without attribution. He is a complete tool. SHAME! >>>>>> >>>>>> I do not know the degree to which he spoke against me. Iimagineit was ever since 2000. Delusions! What is real? I knew not. So much torment! AGONY! They do not welcome me! They are trying to chase me off! Good grief, Charlie Brown. >>>>>> >>>>>> Severely exacerbated my CPTSD! I kept trying to kill myself because of it! I thought I had done something egregiously wrong. Whatever it was it had to be my fault. I was not feeling the love, even from myself. >>>>>> >>>>>> :scream: >>>>>> >>>>>> :scream: >>>>>> >>>>>> In 2017, 900 units of insulin brought my blood glucose below 40. I almost succeeded that time. >>>>>> >>>>>> :scream: >>>>> >>>>> rww >>>>> >>>>> On 10/1/20 8:55 PM, Robert Withers wrote: >>>>> >>>>>> The worst sort of person is one who takes the credit for the work of >>>>>> another. Wouldn't you agree? >>>>>> >>>>>> You may wish to hear John's judgement on the matter. He was right there >>>>>> when it was first built. >>>>>> >>>>>> If you are not humble you will be humiliated, and brought low. >>>>>> >>>>>> rww >>>>>> >>>>>> On 10/1/20 8:35 PM, tim Rowledge wrote: >>>>>> >>>>>>>> On 2020-10-01, at 4:57 PM, Robert Withers via Squeak-dev >>>>>>>> [](mailto:squeak-dev at lists.squeakfoundation.org) >>>>>>>> wrote: >>>>>>>> >>>>>>>> I am curious. Who was the original author of the VMMaker Tool? >>>>>>> >>>>>>> That would be me; back in exobox days. Written along with the original VMMaker and intended to be an example of clean, tidy, morphic usage. I've no idea if anyone ever uses it now, since running it via scripting has proven more valuable. >>>>>>> >>>>>>> tim >>>>>>> -- >>>>>>> tim Rowledge; >>>>>>> tim at rowledge.org >>>>>>> ; >>>>>>> http://www.rowledge.org/tim >>>>>>> "Wibble" said Pooh the stress beginning to show. >>>>> >>>>> -- >>>>> K, r >>>> >>>> -- >>>> K, r > > -- > K, r -- K, r -------------- next part -------------- An HTML attachment was scrubbed... URL: From robert.withers at pm.me Fri Oct 2 04:48:00 2020 From: robert.withers at pm.me (Robert Withers) Date: Fri, 02 Oct 2020 04:48:00 +0000 Subject: [squeak-dev] Curious history In-Reply-To: <57955c22-a2bd-2414-3394-fb2a396d3b4e@pm.me> References: <4RzffQkMYVDio5ypO3BdDDogbcHCBBrlCc1fxoT8GmqCUWhN0sU9yBdJfjTNNuM4-qL-oLkLcIB--mYjPkf0Lg==@protonmail.conversationid> <427948D0-666A-4151-B57E-30F7399DD68B@gmail.com> <3f03663b-3fd0-8e97-ba24-7ca8f73d8e9c@pm.me> <57955c22-a2bd-2414-3394-fb2a396d3b4e@pm.me> Message-ID: "The fear of the Lord is the beginning of knowledge: but fools despise wisdom and instruction." Proverbs 1:7 On 10/2/20 12:46 AM, Robert Withers wrote: > Note. The onset of itching is a sure indicator. > > On 10/2/20 12:44 AM, Robert Withers wrote: > >> On 10/2/20 12:20 AM, Eliot Miranda wrote: >> >>>> On Oct 1, 2020, at 8:36 PM, Ron Teitelbaum [](mailto:Ron at usmedrec.com) wrote: >>> >>>>  >>>> Hi Rob, >>>> >>>> I'm so sorry you felt that way. I know you have had major issues, you have said the same yourself. I'm always happy to see you come back even after long absences. You are a brilliant coder and it has been my distinct pleasure to work with you on Cryptography! Thank you for all you have done and indeed you are responsible for adding significant value to Squeak and the community. >>>> >>>> We all work on code and it's easy to work your ass off on something to make it work and forget where it originated. We all contribute in large and small ways to everything. If you started VMMaker thank you! It is definitely something a lot of us use. I remember learning all about it a long long time ago before I realized that while I could understand it and I could use it, the people that work on the VM are a level higher than me. I just make apps! >>>> >>>> I remember getting in an argument with Andreas about adding methods to collection. "WE DON"T NEED more methods in Collection we need to remove most of them and make it easier!" I argued with him about the value over and over but he insisted that they just didn't add enough value. I could have been put off. I could have assumed that Andreas didn't like me but I would have been very wrong! I was really honored to get the chance to work with him and we became great friends. Of course I added my methods to the code we were working on together and was so thrilled when he used my methods for his own code. >>>> >>>> I don't know what happened with VMMaker but again thank you for your participation in it.. I wanted to take a minute to thank you for your work and to let you know it is my honor to work with you too! I hope that you can come to terms with your past and that you get the help you need for your CPTSD. >>>> >>>> Everything is possible, the past is gone, but the future is still yours to shape. I wish the past was set in stone but even that moves and slips. I was talking to my wife about a party we attended: "Remember in 2000 we were at the party and counted down the new year and someone hit the breaker and killed the lights! We were all talking about what would happen in the year 2000, would everything break!" Great story except that I hadn't met my wife yet! The past is only what we remember but the future is something we have control over. Peace, calm, happyness, they are all hard to come by but they are possible. I wish you success in finding what makes your future better. >>>> >>>> I'm sorry about the bad things that have happened to you in the past. As far as I'm concerned, you are welcomed here! >>>> >>>> All the best, >>>> >>>> Ron Teitelbaum >>> >>> Beautifully said, Ron. And Rob, I hope you find peace with this. It’s difficult; I know. Hugs. >> >> Thanks, Eliot! I had to rip my heart completely apart, laid bare. So the scabs would heal right. I kept picking and picking and picking. They itched like HELL! >> >>>> On Thu, Oct 1, 2020 at 10:38 PM Robert Withers via Squeak-dev wrote: >>>> >>>>> :sob::sob::sob: >>>>> >>>>> On 10/1/20 10:34 PM, Robert Withers wrote: >>>>> >>>>>> I wrote to the #general Squeak Slack channel: >>>>>> >>>>>>> What a complete larcenous bastard. 20 years ago, this month, published it as his own work. And been against me ever since. My CPTSD (100% veteran service-connected) comes with an exquisitely sensitive deception meter. There are those who shunned me and ostracized me and made me feel MOST UNWELCOME. For 20 years. My delusions kick in and I start suspecting back channel communications against me. My love for Squeak conflicted with what I knew was happening. but I hung in there and worked on Cryptography, work with a group of great people and that I am satisfied with its added value to Squeak. For 20 years I KNEW people were against me in the community. I cannot describe how negatively this affected me. My third suicide attempt, in 2007 I jumped off the roof of a 6 story apartment building and broke my back along with many bones. God did not want me to die, yet, so I lived. This deception and ostracism is most well highlighted by the taking credit for my work, without attribution. He is a complete tool. SHAME! >>>>>>> >>>>>>> I do not know the degree to which he spoke against me. Iimagineit was ever since 2000. Delusions! What is real? I knew not. So much torment! AGONY! They do not welcome me! They are trying to chase me off! Good grief, Charlie Brown. >>>>>>> >>>>>>> Severely exacerbated my CPTSD! I kept trying to kill myself because of it! I thought I had done something egregiously wrong. Whatever it was it had to be my fault. I was not feeling the love, even from myself. >>>>>>> >>>>>>> :scream: >>>>>>> >>>>>>> :scream: >>>>>>> >>>>>>> In 2017, 900 units of insulin brought my blood glucose below 40. I almost succeeded that time. >>>>>>> >>>>>>> :scream: >>>>>> >>>>>> rww >>>>>> >>>>>> On 10/1/20 8:55 PM, Robert Withers wrote: >>>>>> >>>>>>> The worst sort of person is one who takes the credit for the work of >>>>>>> another. Wouldn't you agree? >>>>>>> >>>>>>> You may wish to hear John's judgement on the matter. He was right there >>>>>>> when it was first built. >>>>>>> >>>>>>> If you are not humble you will be humiliated, and brought low. >>>>>>> >>>>>>> rww >>>>>>> >>>>>>> On 10/1/20 8:35 PM, tim Rowledge wrote: >>>>>>> >>>>>>>>> On 2020-10-01, at 4:57 PM, Robert Withers via Squeak-dev >>>>>>>>> [](mailto:squeak-dev at lists.squeakfoundation.org) >>>>>>>>> wrote: >>>>>>>>> >>>>>>>>> I am curious. Who was the original author of the VMMaker Tool? >>>>>>>> >>>>>>>> That would be me; back in exobox days. Written along with the original VMMaker and intended to be an example of clean, tidy, morphic usage. I've no idea if anyone ever uses it now, since running it via scripting has proven more valuable. >>>>>>>> >>>>>>>> tim >>>>>>>> -- >>>>>>>> tim Rowledge; >>>>>>>> tim at rowledge.org >>>>>>>> ; >>>>>>>> http://www.rowledge.org/tim >>>>>>>> "Wibble" said Pooh the stress beginning to show. >>>>>> >>>>>> -- >>>>>> K, r >>>>> >>>>> -- >>>>> K, r >> >> -- >> K, r > > -- > K, r -- K, r -------------- next part -------------- An HTML attachment was scrubbed... URL: From robert.withers at pm.me Fri Oct 2 05:17:26 2020 From: robert.withers at pm.me (Robert Withers) Date: Fri, 02 Oct 2020 05:17:26 +0000 Subject: [squeak-dev] The Most High! In-Reply-To: References: <4RzffQkMYVDio5ypO3BdDDogbcHCBBrlCc1fxoT8GmqCUWhN0sU9yBdJfjTNNuM4-qL-oLkLcIB--mYjPkf0Lg==@protonmail.conversationid> <877lUkLJfpLi1si68jBg1GdbHUPpNB5NhFo1QUUdR1B3G5XWCcIKgtbRJ9r-nBoAYlzIl-mApKW07rQFHukdoA==@protonmail.internalid> Message-ID: <3f2c89ba-682c-5206-5127-9d2227aeff17@pm.me> The Most High! https://www.youtube.com/watch?v=3q8nGnls1Ow&feature=emb_logo On 10/2/20 12:21 AM, Robert Withers wrote: > On 10/1/20 11:48 PM, Robert Withers wrote: > >> Do you recall my interviewing with Andreas? I did NOT NOT NOT NADA ZILCH NOTHING TO SEE HERE ZERO TIME FOR YOU get that job, for whatever reason... >> >> On 10/1/20 11:46 PM, Robert Withers wrote: >> >>> Hi Ron, >>> >>> Thank you so much for the kind words and the extension of your hand towards myself. In no fashion has it been all bad. I really need to tell you, right now, that I did not do any work on VMMaker. Was there extensions to same from the VMMakerTool? Perhaps, I do not recall. I only built the Tool, not the Maker. Good grief, I agree, that's a whole other level! >>> >>> I feel the same about the opportunities I had with you. I am still dorking with ASN1, currently broken, trying to add a "Class" Application Class tag. Missing an explicit context in on of the directions. Memory and Trauma are definitely linked. That's where the flashbacks come from. Do you recall my interviewing with Andreas? I did NOT NOT NOT NADA ZILCH NOTHING TO SEE HERE get that job, for whatever reason... >>> >>> I think I may be done. PromisesLocal is broken. ParrotTalk is broken. ASN1 is broken. SSL is broken. PromisesRemote is broken. Sigh. Fuck it. Someone else will have to pick it up. 20 years of work! I am hitting deep blue ocean, on my way to Morocco, by way of the Azores! With my shiny Zeus 3! Ciao, bella! > > I have been in Army/Germany, College, First Union/Charlotte, IBM/Puerto Rico, GRCI/JWARS, The FOURTH ESTATE!, Exobox, Quallaby/Lowell, WaMu/Seattle, FEMA/Reston, ARP&Associates/MILSATCOM, K12/Fired for weed, Dish Network/Denver, Homeless/Denver, Arrested/Jailed/Denver/Chapel Hill, Persecuted/All, A few 10s of Mental Facility Committals/Starts after 9/11 in Lowell, Squeaker/Since GRCI, Disability, Dreams coming true/A beautiful, capable sailboat. still looking for my life-long first mate. :( My faith and my hope/Infinity. :-D > > The Hellfire and its occupants, not my problem. I pay no attention. Burn. > > I "Will be in a life of bliss, In a Garden on high. The Fruits whereof"... > > --------------------------------------------------------------- > > Al Haqqah (69) > >>> [The Sure Reality! >>> >>> What is the Sure Reality? >>> >>> And what will make thee realise what the Sure Reality is? >>> >>> The Thamud and the 'Ad People (branded) as false the Stunning Calamity! >>> >>> But the Thamud,- they were destroyed by a terrible Storm of thunder and lightning! >>> >>> And the 'Ad, they were destroyed by a furious Wind, exceedingly violent; >>> >>> He made it rage against them seven nights and eight days in succession: so that thou couldst see the (whole) people lying prostrate in its (path), as they had been roots of hollow palm-trees tumbled down! >>> >>> Then seest thou any of them left surviving? >>> >>> And Pharaoh, and those before him, and the Cities Overthrown, committed habitual Sin. >>> >>> And disobeyed (each) the messenger of their Lord; so He punished them with an abundant Penalty. >>> >>> We, when the water (of Noah's Flood) overflowed beyond its limits, carried you (mankind), in the floating (Ark), >>> >>> That We might make it a Message unto you, and that ears (that should hear the tale and) retain its memory should bear its (lessons) in remembrance. >>> >>> Then, when one blast is sounded on the Trumpet, >>> >>> And the earth is moved, and its mountains, and they are crushed to powder at one stroke,- >>> >>> On that Day shall the (Great) Event come to pass. >>> >>> And the sky will be rent asunder, for it will that Day be flimsy, >>> >>> And the angels will be on its sides, and eight will, that Day, bear the Throne of thy Lord above them. >>> >>> That Day shall ye be brought to Judgment: not an act of yours that ye hide will be hidden. >>> >>> Then he that will be given his Record in his right hand will say: "Ah here! Read ye my Record! >>> >>> "I did really understand that my Account would (One Day) reach me!" >>> >>> And he will be in a life of Bliss, >>> >>> In a Garden on high, >>> >>> The Fruits whereof (will hang in bunches) low and near. >>> >>> "Eat ye and drink ye, with full satisfaction; because of the (good) that ye sent before you, in the days that are gone!" >>> >>> And he that will be given his Record in his left hand, will say: "Ah! Would that my Record had not been given to me! >>> >>> "And that I had never realised how my account (stood)! >>> >>> "Ah! Would that (Death) had made an end of me! >>> >>> "Of no profit to me has been my wealth! >>> >>> "My power has perished from me!"... >>> >>> (The stern command will say): "Seize ye him, and bind ye him, >>> >>> "And burn ye him in the Blazing Fire. >>> >>> "Further, make him march in a chain, whereof the length is seventy cubits! >>> >>> "This was he that would not believe in Allah Most High. >>> >>> "And would not encourage the feeding of the indigent! >>> >>> "So no friend hath he here this Day. >>> >>> "Nor hath he any food except the corruption from the washing of wounds, >>> >>> "Which none do eat but those in sin." >>> >>> So I do call to witness what ye see, >>> >>> And what ye see not, >>> >>> That this is verily the word of an honoured messenger; >>> >>> It is not the word of a poet: little it is ye believe! >>> >>> Nor is it the word of a soothsayer: little admonition it is ye receive. >>> >>> (This is) a Message sent down from the Lord of the Worlds. >>> >>> And if the messenger were to invent any sayings in Our name, >>> >>> We should certainly seize him by his right hand, >>> >>> And We should certainly then cut off the artery of his heart: >>> >>> Nor could any of you withhold him (from Our wrath). >>> >>> But verily this is a Message for the Allah-fearing. >>> >>> And We certainly know that there are amongst you those that reject (it). >>> >>> But truly (Revelation) is a cause of sorrow for the Unbelievers. >>> >>> But verily it is Truth of assured certainty. >>> >>> So glorify the name of thy Lord Most High. >>> >>> ] - Quran 69:1-52 > > --- > > Slosher > Oriental, NC > >>> On 10/1/20 11:36 PM, Ron Teitelbaum wrote: >>> >>>> Hi Rob, >>>> >>>> I'm so sorry you felt that way. I know you have had major issues, you have said the same yourself. I'm always happy to see you come back even after long absences. You are a brilliant coder and it has been my distinct pleasure to work with you on Cryptography! Thank you for all you have done and indeed you are responsible for adding significant value to Squeak and the community. >>>> >>>> We all work on code and it's easy to work your ass off on something to make it work and forget where it originated. We all contribute in large and small ways to everything. If you started VMMaker thank you! It is definitely something a lot of us use. I remember learning all about it a long long time ago before I realized that while I could understand it and I could use it, the people that work on the VM are a level higher than me. I just make apps! >>>> >>>> I remember getting in an argument with Andreas about adding methods to collection. "WE DON"T NEED more methods in Collection we need to remove most of them and make it easier!" I argued with him about the value over and over but he insisted that they just didn't add enough value. I could have been put off. I could have assumed that Andreas didn't like me but I would have been very wrong! I was really honored to get the chance to work with him and we became great friends. Of course I added my methods to the code we were working on together and was so thrilled when he used my methods for his own code. >>>> >>>> I don't know what happened with VMMaker but again thank you for your participation in it.. I wanted to take a minute to thank you for your work and to let you know it is my honor to work with you too! I hope that you can come to terms with your past and that you get the help you need for your CPTSD. >>>> >>>> Everything is possible, the past is gone, but the future is still yours to shape. I wish the past was set in stone but even that moves and slips. I was talking to my wife about a party we attended: "Remember in 2000 we were at the party and counted down the new year and someone hit the breaker and killed the lights! We were all talking about what would happen in the year 2000, would everything break!" Great story except that I hadn't met my wife yet! The past is only what we remember but the future is something we have control over. Peace, calm, happyness, they are all hard to come by but they are possible. I wish you success in finding what makes your future better. >>>> >>>> I'm sorry about the bad things that have happened to you in the past. As far as I'm concerned, you are welcomed here! >>>> >>>> All the best, >>>> >>>> Ron Teitelbaum >>>> >>>> On Thu, Oct 1, 2020 at 10:38 PM Robert Withers via Squeak-dev wrote: >>>> >>>>> :sob::sob::sob: >>>>> >>>>> On 10/1/20 10:34 PM, Robert Withers wrote: >>>>> >>>>>> I wrote to the #general Squeak Slack channel: >>>>>> >>>>>>> What a complete larcenous bastard. 20 years ago, this month, published it as his own work. And been against me ever since. My CPTSD (100% veteran service-connected) comes with an exquisitely sensitive deception meter. There are those who shunned me and ostracized me and made me feel MOST UNWELCOME. For 20 years. My delusions kick in and I start suspecting back channel communications against me. My love for Squeak conflicted with what I knew was happening. but I hung in there and worked on Cryptography, work with a group of great people and that I am satisfied with its added value to Squeak. For 20 years I KNEW people were against me in the community. I cannot describe how negatively this affected me. My third suicide attempt, in 2007 I jumped off the roof of a 6 story apartment building and broke my back along with many bones. God did not want me to die, yet, so I lived. This deception and ostracism is most well highlighted by the taking credit for my work, without attribution. He is a complete tool. SHAME! >>>>>>> >>>>>>> I do not know the degree to which he spoke against me. Iimagineit was ever since 2000. Delusions! What is real? I knew not. So much torment! AGONY! They do not welcome me! They are trying to chase me off! Good grief, Charlie Brown. >>>>>>> >>>>>>> Severely exacerbated my CPTSD! I kept trying to kill myself because of it! I thought I had done something egregiously wrong. Whatever it was it had to be my fault. I was not feeling the love, even from myself. >>>>>>> >>>>>>> :scream: >>>>>>> >>>>>>> :scream: >>>>>>> >>>>>>> In 2017, 900 units of insulin brought my blood glucose below 40. I almost succeeded that time. >>>>>>> >>>>>>> :scream: >>>>>> >>>>>> rww >>>>>> >>>>>> On 10/1/20 8:55 PM, Robert Withers wrote: >>>>>> >>>>>>> The worst sort of person is one who takes the credit for the work of >>>>>>> another. Wouldn't you agree? >>>>>>> >>>>>>> You may wish to hear John's judgement on the matter. He was right there >>>>>>> when it was first built. >>>>>>> >>>>>>> If you are not humble you will be humiliated, and brought low. >>>>>>> >>>>>>> rww >>>>>>> >>>>>>> On 10/1/20 8:35 PM, tim Rowledge wrote: >>>>>>> >>>>>>>>> On 2020-10-01, at 4:57 PM, Robert Withers via Squeak-dev >>>>>>>>> [](mailto:squeak-dev at lists.squeakfoundation.org) >>>>>>>>> wrote: >>>>>>>>> >>>>>>>>> I am curious. Who was the original author of the VMMaker Tool? >>>>>>>> >>>>>>>> That would be me; back in exobox days. Written along with the original VMMaker and intended to be an example of clean, tidy, morphic usage. I've no idea if anyone ever uses it now, since running it via scripting has proven more valuable. >>>>>>>> >>>>>>>> tim >>>>>>>> -- >>>>>>>> tim Rowledge; >>>>>>>> tim at rowledge.org >>>>>>>> ; >>>>>>>> http://www.rowledge.org/tim >>>>>>>> "Wibble" said Pooh the stress beginning to show. >>>>>> >>>>>> -- >>>>>> K, r >>>>> >>>>> -- >>>>> K, r >>> >>> -- >>> K, r >> >> -- >> K, r > > -- > K, r -- K, r -------------- next part -------------- An HTML attachment was scrubbed... URL: -------------- next part -------------- A non-text attachment was scrubbed... Name: 7420963_20200328125416581_1_LARGE.jpg Type: image/jpeg Size: 47844 bytes Desc: not available URL: From robert.withers at pm.me Fri Oct 2 05:22:08 2020 From: robert.withers at pm.me (Robert Withers) Date: Fri, 02 Oct 2020 05:22:08 +0000 Subject: [squeak-dev] The Most High! In-Reply-To: <3f2c89ba-682c-5206-5127-9d2227aeff17@pm.me> References: <877lUkLJfpLi1si68jBg1GdbHUPpNB5NhFo1QUUdR1B3G5XWCcIKgtbRJ9r-nBoAYlzIl-mApKW07rQFHukdoA==@protonmail.internalid> <3f2c89ba-682c-5206-5127-9d2227aeff17@pm.me> Message-ID: <48a19bdb-30c7-1cae-8ab4-e2cbf5a31f96@pm.me> Er: I celebrate with music! https://www.youtube.com/watch?v=3q8nGnls1Ow&feature=youtu.be&t=214 On 10/2/20 1:17 AM, Robert Withers wrote: > The Most High! > > https://www.youtube.com/watch?v=3q8nGnls1Ow&feature=emb_logo > > On 10/2/20 12:21 AM, Robert Withers wrote: > >> On 10/1/20 11:48 PM, Robert Withers wrote: >> >>> Do you recall my interviewing with Andreas? I did NOT NOT NOT NADA ZILCH NOTHING TO SEE HERE ZERO TIME FOR YOU get that job, for whatever reason... >>> >>> On 10/1/20 11:46 PM, Robert Withers wrote: >>> >>>> Hi Ron, >>>> >>>> Thank you so much for the kind words and the extension of your hand towards myself. In no fashion has it been all bad. I really need to tell you, right now, that I did not do any work on VMMaker. Was there extensions to same from the VMMakerTool? Perhaps, I do not recall. I only built the Tool, not the Maker. Good grief, I agree, that's a whole other level! >>>> >>>> I feel the same about the opportunities I had with you. I am still dorking with ASN1, currently broken, trying to add a "Class" Application Class tag. Missing an explicit context in on of the directions. Memory and Trauma are definitely linked. That's where the flashbacks come from. Do you recall my interviewing with Andreas? I did NOT NOT NOT NADA ZILCH NOTHING TO SEE HERE get that job, for whatever reason... >>>> >>>> I think I may be done. PromisesLocal is broken. ParrotTalk is broken. ASN1 is broken. SSL is broken. PromisesRemote is broken. Sigh. Fuck it. Someone else will have to pick it up. 20 years of work! I am hitting deep blue ocean, on my way to Morocco, by way of the Azores! With my shiny Zeus 3! Ciao, bella! >> >> I have been in Army/Germany, College, First Union/Charlotte, IBM/Puerto Rico, GRCI/JWARS, The FOURTH ESTATE!, Exobox, Quallaby/Lowell, WaMu/Seattle, FEMA/Reston, ARP&Associates/MILSATCOM, K12/Fired for weed, Dish Network/Denver, Homeless/Denver, Arrested/Jailed/Denver/Chapel Hill, Persecuted/All, A few 10s of Mental Facility Committals/Starts after 9/11 in Lowell, Squeaker/Since GRCI, Disability, Dreams coming true/A beautiful, capable sailboat. still looking for my life-long first mate. :( My faith and my hope/Infinity. :-D >> >> The Hellfire and its occupants, not my problem. I pay no attention. Burn. >> >> I "Will be in a life of bliss, In a Garden on high. The Fruits whereof"... >> >> --------------------------------------------------------------- >> >> Al Haqqah (69) >> >>>> [The Sure Reality! >>>> >>>> What is the Sure Reality? >>>> >>>> And what will make thee realise what the Sure Reality is? >>>> >>>> The Thamud and the 'Ad People (branded) as false the Stunning Calamity! >>>> >>>> But the Thamud,- they were destroyed by a terrible Storm of thunder and lightning! >>>> >>>> And the 'Ad, they were destroyed by a furious Wind, exceedingly violent; >>>> >>>> He made it rage against them seven nights and eight days in succession: so that thou couldst see the (whole) people lying prostrate in its (path), as they had been roots of hollow palm-trees tumbled down! >>>> >>>> Then seest thou any of them left surviving? >>>> >>>> And Pharaoh, and those before him, and the Cities Overthrown, committed habitual Sin. >>>> >>>> And disobeyed (each) the messenger of their Lord; so He punished them with an abundant Penalty. >>>> >>>> We, when the water (of Noah's Flood) overflowed beyond its limits, carried you (mankind), in the floating (Ark), >>>> >>>> That We might make it a Message unto you, and that ears (that should hear the tale and) retain its memory should bear its (lessons) in remembrance. >>>> >>>> Then, when one blast is sounded on the Trumpet, >>>> >>>> And the earth is moved, and its mountains, and they are crushed to powder at one stroke,- >>>> >>>> On that Day shall the (Great) Event come to pass. >>>> >>>> And the sky will be rent asunder, for it will that Day be flimsy, >>>> >>>> And the angels will be on its sides, and eight will, that Day, bear the Throne of thy Lord above them. >>>> >>>> That Day shall ye be brought to Judgment: not an act of yours that ye hide will be hidden. >>>> >>>> Then he that will be given his Record in his right hand will say: "Ah here! Read ye my Record! >>>> >>>> "I did really understand that my Account would (One Day) reach me!" >>>> >>>> And he will be in a life of Bliss, >>>> >>>> In a Garden on high, >>>> >>>> The Fruits whereof (will hang in bunches) low and near. >>>> >>>> "Eat ye and drink ye, with full satisfaction; because of the (good) that ye sent before you, in the days that are gone!" >>>> >>>> And he that will be given his Record in his left hand, will say: "Ah! Would that my Record had not been given to me! >>>> >>>> "And that I had never realised how my account (stood)! >>>> >>>> "Ah! Would that (Death) had made an end of me! >>>> >>>> "Of no profit to me has been my wealth! >>>> >>>> "My power has perished from me!"... >>>> >>>> (The stern command will say): "Seize ye him, and bind ye him, >>>> >>>> "And burn ye him in the Blazing Fire. >>>> >>>> "Further, make him march in a chain, whereof the length is seventy cubits! >>>> >>>> "This was he that would not believe in Allah Most High. >>>> >>>> "And would not encourage the feeding of the indigent! >>>> >>>> "So no friend hath he here this Day. >>>> >>>> "Nor hath he any food except the corruption from the washing of wounds, >>>> >>>> "Which none do eat but those in sin." >>>> >>>> So I do call to witness what ye see, >>>> >>>> And what ye see not, >>>> >>>> That this is verily the word of an honoured messenger; >>>> >>>> It is not the word of a poet: little it is ye believe! >>>> >>>> Nor is it the word of a soothsayer: little admonition it is ye receive. >>>> >>>> (This is) a Message sent down from the Lord of the Worlds. >>>> >>>> And if the messenger were to invent any sayings in Our name, >>>> >>>> We should certainly seize him by his right hand, >>>> >>>> And We should certainly then cut off the artery of his heart: >>>> >>>> Nor could any of you withhold him (from Our wrath). >>>> >>>> But verily this is a Message for the Allah-fearing. >>>> >>>> And We certainly know that there are amongst you those that reject (it). >>>> >>>> But truly (Revelation) is a cause of sorrow for the Unbelievers. >>>> >>>> But verily it is Truth of assured certainty. >>>> >>>> So glorify the name of thy Lord Most High. >>>> >>>> ] - Quran 69:1-52 >> >> --- >> >> Slosher >> Oriental, NC >> >>>> On 10/1/20 11:36 PM, Ron Teitelbaum wrote: >>>> >>>>> Hi Rob, >>>>> >>>>> I'm so sorry you felt that way. I know you have had major issues, you have said the same yourself. I'm always happy to see you come back even after long absences. You are a brilliant coder and it has been my distinct pleasure to work with you on Cryptography! Thank you for all you have done and indeed you are responsible for adding significant value to Squeak and the community. >>>>> >>>>> We all work on code and it's easy to work your ass off on something to make it work and forget where it originated. We all contribute in large and small ways to everything. If you started VMMaker thank you! It is definitely something a lot of us use. I remember learning all about it a long long time ago before I realized that while I could understand it and I could use it, the people that work on the VM are a level higher than me. I just make apps! >>>>> >>>>> I remember getting in an argument with Andreas about adding methods to collection. "WE DON"T NEED more methods in Collection we need to remove most of them and make it easier!" I argued with him about the value over and over but he insisted that they just didn't add enough value. I could have been put off. I could have assumed that Andreas didn't like me but I would have been very wrong! I was really honored to get the chance to work with him and we became great friends. Of course I added my methods to the code we were working on together and was so thrilled when he used my methods for his own code. >>>>> >>>>> I don't know what happened with VMMaker but again thank you for your participation in it.. I wanted to take a minute to thank you for your work and to let you know it is my honor to work with you too! I hope that you can come to terms with your past and that you get the help you need for your CPTSD. >>>>> >>>>> Everything is possible, the past is gone, but the future is still yours to shape. I wish the past was set in stone but even that moves and slips. I was talking to my wife about a party we attended: "Remember in 2000 we were at the party and counted down the new year and someone hit the breaker and killed the lights! We were all talking about what would happen in the year 2000, would everything break!" Great story except that I hadn't met my wife yet! The past is only what we remember but the future is something we have control over. Peace, calm, happyness, they are all hard to come by but they are possible. I wish you success in finding what makes your future better. >>>>> >>>>> I'm sorry about the bad things that have happened to you in the past. As far as I'm concerned, you are welcomed here! >>>>> >>>>> All the best, >>>>> >>>>> Ron Teitelbaum >>>>> >>>>> On Thu, Oct 1, 2020 at 10:38 PM Robert Withers via Squeak-dev wrote: >>>>> >>>>>> :sob::sob::sob: >>>>>> >>>>>> On 10/1/20 10:34 PM, Robert Withers wrote: >>>>>> >>>>>>> I wrote to the #general Squeak Slack channel: >>>>>>> >>>>>>>> What a complete larcenous bastard. 20 years ago, this month, published it as his own work. And been against me ever since. My CPTSD (100% veteran service-connected) comes with an exquisitely sensitive deception meter. There are those who shunned me and ostracized me and made me feel MOST UNWELCOME. For 20 years. My delusions kick in and I start suspecting back channel communications against me. My love for Squeak conflicted with what I knew was happening. but I hung in there and worked on Cryptography, work with a group of great people and that I am satisfied with its added value to Squeak. For 20 years I KNEW people were against me in the community. I cannot describe how negatively this affected me. My third suicide attempt, in 2007 I jumped off the roof of a 6 story apartment building and broke my back along with many bones. God did not want me to die, yet, so I lived. This deception and ostracism is most well highlighted by the taking credit for my work, without attribution. He is a complete tool. SHAME! >>>>>>>> >>>>>>>> I do not know the degree to which he spoke against me. Iimagineit was ever since 2000. Delusions! What is real? I knew not. So much torment! AGONY! They do not welcome me! They are trying to chase me off! Good grief, Charlie Brown. >>>>>>>> >>>>>>>> Severely exacerbated my CPTSD! I kept trying to kill myself because of it! I thought I had done something egregiously wrong. Whatever it was it had to be my fault. I was not feeling the love, even from myself. >>>>>>>> >>>>>>>> :scream: >>>>>>>> >>>>>>>> :scream: >>>>>>>> >>>>>>>> In 2017, 900 units of insulin brought my blood glucose below 40. I almost succeeded that time. >>>>>>>> >>>>>>>> :scream: >>>>>>> >>>>>>> rww >>>>>>> >>>>>>> On 10/1/20 8:55 PM, Robert Withers wrote: >>>>>>> >>>>>>>> The worst sort of person is one who takes the credit for the work of >>>>>>>> another. Wouldn't you agree? >>>>>>>> >>>>>>>> You may wish to hear John's judgement on the matter. He was right there >>>>>>>> when it was first built. >>>>>>>> >>>>>>>> If you are not humble you will be humiliated, and brought low. >>>>>>>> >>>>>>>> rww >>>>>>>> >>>>>>>> On 10/1/20 8:35 PM, tim Rowledge wrote: >>>>>>>> >>>>>>>>>> On 2020-10-01, at 4:57 PM, Robert Withers via Squeak-dev >>>>>>>>>> [](mailto:squeak-dev at lists.squeakfoundation.org) >>>>>>>>>> wrote: >>>>>>>>>> >>>>>>>>>> I am curious. Who was the original author of the VMMaker Tool? >>>>>>>>> >>>>>>>>> That would be me; back in exobox days. Written along with the original VMMaker and intended to be an example of clean, tidy, morphic usage. I've no idea if anyone ever uses it now, since running it via scripting has proven more valuable. >>>>>>>>> >>>>>>>>> tim >>>>>>>>> -- >>>>>>>>> tim Rowledge; >>>>>>>>> tim at rowledge.org >>>>>>>>> ; >>>>>>>>> http://www.rowledge.org/tim >>>>>>>>> "Wibble" said Pooh the stress beginning to show. >>>>>>> >>>>>>> -- >>>>>>> K, r >>>>>> >>>>>> -- >>>>>> K, r >>>> >>>> -- >>>> K, r >>> >>> -- >>> K, r >> >> -- >> K, r > > -- > K, r -- K, r -------------- next part -------------- An HTML attachment was scrubbed... URL: -------------- next part -------------- A non-text attachment was scrubbed... Name: 7420963_20200328125416581_1_LARGE.jpg Type: image/jpeg Size: 47844 bytes Desc: not available URL: From robert.withers at pm.me Fri Oct 2 05:50:10 2020 From: robert.withers at pm.me (Robert Withers) Date: Fri, 02 Oct 2020 05:50:10 +0000 Subject: [squeak-dev] Curious history In-Reply-To: References: <4RzffQkMYVDio5ypO3BdDDogbcHCBBrlCc1fxoT8GmqCUWhN0sU9yBdJfjTNNuM4-qL-oLkLcIB--mYjPkf0Lg==@protonmail.conversationid> <877lUkLJfpLi1si68jBg1GdbHUPpNB5NhFo1QUUdR1B3G5XWCcIKgtbRJ9r-nBoAYlzIl-mApKW07rQFHukdoA==@protonmail.internalid> Message-ID: "And would not encourage the feeding of the indigent!" On 10/2/20 12:21 AM, Robert Withers wrote: > The Hellfire and its occupants, not my problem. I pay no attention. Burn. > > I "Will be in a life of bliss, In a Garden on high. The Fruits whereof"... > > --------------------------------------------------------------- > > Al Haqqah (69) > >>> [The Sure Reality! >>> >>> What is the Sure Reality? >>> >>> And what will make thee realise what the Sure Reality is? >>> >>> The Thamud and the 'Ad People (branded) as false the Stunning Calamity! >>> >>> But the Thamud,- they were destroyed by a terrible Storm of thunder and lightning! >>> >>> And the 'Ad, they were destroyed by a furious Wind, exceedingly violent; >>> >>> He made it rage against them seven nights and eight days in succession: so that thou couldst see the (whole) people lying prostrate in its (path), as they had been roots of hollow palm-trees tumbled down! >>> >>> Then seest thou any of them left surviving? >>> >>> And Pharaoh, and those before him, and the Cities Overthrown, committed habitual Sin. >>> >>> And disobeyed (each) the messenger of their Lord; so He punished them with an abundant Penalty. >>> >>> We, when the water (of Noah's Flood) overflowed beyond its limits, carried you (mankind), in the floating (Ark), >>> >>> That We might make it a Message unto you, and that ears (that should hear the tale and) retain its memory should bear its (lessons) in remembrance. >>> >>> Then, when one blast is sounded on the Trumpet, >>> >>> And the earth is moved, and its mountains, and they are crushed to powder at one stroke,- >>> >>> On that Day shall the (Great) Event come to pass. >>> >>> And the sky will be rent asunder, for it will that Day be flimsy, >>> >>> And the angels will be on its sides, and eight will, that Day, bear the Throne of thy Lord above them. >>> >>> That Day shall ye be brought to Judgment: not an act of yours that ye hide will be hidden. >>> >>> Then he that will be given his Record in his right hand will say: "Ah here! Read ye my Record! >>> >>> "I did really understand that my Account would (One Day) reach me!" >>> >>> And he will be in a life of Bliss, >>> >>> In a Garden on high, >>> >>> The Fruits whereof (will hang in bunches) low and near. >>> >>> "Eat ye and drink ye, with full satisfaction; because of the (good) that ye sent before you, in the days that are gone!" >>> >>> And he that will be given his Record in his left hand, will say: "Ah! Would that my Record had not been given to me! >>> >>> "And that I had never realised how my account (stood)! >>> >>> "Ah! Would that (Death) had made an end of me! >>> >>> "Of no profit to me has been my wealth! >>> >>> "My power has perished from me!"... >>> >>> (The stern command will say): "Seize ye him, and bind ye him, >>> >>> "And burn ye him in the Blazing Fire. >>> >>> "Further, make him march in a chain, whereof the length is seventy cubits! >>> >>> "This was he that would not believe in Allah Most High. >>> >>> "And would not encourage the feeding of the indigent! >>> >>> "So no friend hath he here this Day. >>> >>> "Nor hath he any food except the corruption from the washing of wounds, >>> >>> "Which none do eat but those in sin." >>> >>> So I do call to witness what ye see, >>> >>> And what ye see not, >>> >>> That this is verily the word of an honoured messenger; >>> >>> It is not the word of a poet: little it is ye believe! >>> >>> Nor is it the word of a soothsayer: little admonition it is ye receive. >>> >>> (This is) a Message sent down from the Lord of the Worlds. >>> >>> And if the messenger were to invent any sayings in Our name, >>> >>> We should certainly seize him by his right hand, >>> >>> And We should certainly then cut off the artery of his heart: >>> >>> Nor could any of you withhold him (from Our wrath). >>> >>> But verily this is a Message for the Allah-fearing. >>> >>> And We certainly know that there are amongst you those that reject (it). >>> >>> But truly (Revelation) is a cause of sorrow for the Unbelievers. >>> >>> But verily it is Truth of assured certainty. >>> >>> So glorify the name of thy Lord Most High. >>> >>> ] - Quran 69:1-52 > > --- > > Slosher > Oriental, NC > >>> On 10/1/20 11:36 PM, Ron Teitelbaum wrote: >>> >>>> Hi Rob, >>>> >>>> I'm so sorry you felt that way. I know you have had major issues, you have said the same yourself. I'm always happy to see you come back even after long absences. You are a brilliant coder and it has been my distinct pleasure to work with you on Cryptography! Thank you for all you have done and indeed you are responsible for adding significant value to Squeak and the community. >>>> >>>> We all work on code and it's easy to work your ass off on something to make it work and forget where it originated. We all contribute in large and small ways to everything. If you started VMMaker thank you! It is definitely something a lot of us use. I remember learning all about it a long long time ago before I realized that while I could understand it and I could use it, the people that work on the VM are a level higher than me. I just make apps! >>>> >>>> I remember getting in an argument with Andreas about adding methods to collection. "WE DON"T NEED more methods in Collection we need to remove most of them and make it easier!" I argued with him about the value over and over but he insisted that they just didn't add enough value. I could have been put off. I could have assumed that Andreas didn't like me but I would have been very wrong! I was really honored to get the chance to work with him and we became great friends. Of course I added my methods to the code we were working on together and was so thrilled when he used my methods for his own code. >>>> >>>> I don't know what happened with VMMaker but again thank you for your participation in it.. I wanted to take a minute to thank you for your work and to let you know it is my honor to work with you too! I hope that you can come to terms with your past and that you get the help you need for your CPTSD. >>>> >>>> Everything is possible, the past is gone, but the future is still yours to shape. I wish the past was set in stone but even that moves and slips. I was talking to my wife about a party we attended: "Remember in 2000 we were at the party and counted down the new year and someone hit the breaker and killed the lights! We were all talking about what would happen in the year 2000, would everything break!" Great story except that I hadn't met my wife yet! The past is only what we remember but the future is something we have control over. Peace, calm, happyness, they are all hard to come by but they are possible. I wish you success in finding what makes your future better. >>>> >>>> I'm sorry about the bad things that have happened to you in the past. As far as I'm concerned, you are welcomed here! >>>> >>>> All the best, >>>> >>>> Ron Teitelbaum >>>> >>>> On Thu, Oct 1, 2020 at 10:38 PM Robert Withers via Squeak-dev wrote: >>>> >>>>> :sob::sob::sob: >>>>> >>>>> On 10/1/20 10:34 PM, Robert Withers wrote: >>>>> >>>>>> I wrote to the #general Squeak Slack channel: >>>>>> >>>>>>> What a complete larcenous bastard. 20 years ago, this month, published it as his own work. And been against me ever since. My CPTSD (100% veteran service-connected) comes with an exquisitely sensitive deception meter. There are those who shunned me and ostracized me and made me feel MOST UNWELCOME. For 20 years. My delusions kick in and I start suspecting back channel communications against me. My love for Squeak conflicted with what I knew was happening. but I hung in there and worked on Cryptography, work with a group of great people and that I am satisfied with its added value to Squeak. For 20 years I KNEW people were against me in the community. I cannot describe how negatively this affected me. My third suicide attempt, in 2007 I jumped off the roof of a 6 story apartment building and broke my back along with many bones. God did not want me to die, yet, so I lived. This deception and ostracism is most well highlighted by the taking credit for my work, without attribution. He is a complete tool. SHAME! >>>>>>> >>>>>>> I do not know the degree to which he spoke against me. Iimagineit was ever since 2000. Delusions! What is real? I knew not. So much torment! AGONY! They do not welcome me! They are trying to chase me off! Good grief, Charlie Brown. >>>>>>> >>>>>>> Severely exacerbated my CPTSD! I kept trying to kill myself because of it! I thought I had done something egregiously wrong. Whatever it was it had to be my fault. I was not feeling the love, even from myself. >>>>>>> >>>>>>> :scream: >>>>>>> >>>>>>> :scream: >>>>>>> >>>>>>> In 2017, 900 units of insulin brought my blood glucose below 40. I almost succeeded that time. >>>>>>> >>>>>>> :scream: >>>>>> >>>>>> rww >>>>>> >>>>>> On 10/1/20 8:55 PM, Robert Withers wrote: >>>>>> >>>>>>> The worst sort of person is one who takes the credit for the work of >>>>>>> another. Wouldn't you agree? >>>>>>> >>>>>>> You may wish to hear John's judgement on the matter. He was right there >>>>>>> when it was first built. >>>>>>> >>>>>>> If you are not humble you will be humiliated, and brought low. >>>>>>> >>>>>>> rww >>>>>>> >>>>>>> On 10/1/20 8:35 PM, tim Rowledge wrote: >>>>>>> >>>>>>>>> On 2020-10-01, at 4:57 PM, Robert Withers via Squeak-dev >>>>>>>>> [](mailto:squeak-dev at lists.squeakfoundation.org) >>>>>>>>> wrote: >>>>>>>>> >>>>>>>>> I am curious. Who was the original author of the VMMaker Tool? >>>>>>>> >>>>>>>> That would be me; back in exobox days. Written along with the original VMMaker and intended to be an example of clean, tidy, morphic usage. I've no idea if anyone ever uses it now, since running it via scripting has proven more valuable. >>>>>>>> >>>>>>>> tim >>>>>>>> -- >>>>>>>> tim Rowledge; >>>>>>>> tim at rowledge.org >>>>>>>> ; >>>>>>>> http://www.rowledge.org/tim >>>>>>>> "Wibble" said Pooh the stress beginning to show. >>>>>> >>>>>> -- >>>>>> K, r >>>>> >>>>> -- >>>>> K, r >>> >>> -- >>> K, r >> >> -- >> K, r > > -- > K, r -- K, r -------------- next part -------------- An HTML attachment was scrubbed... URL: -------------- next part -------------- A non-text attachment was scrubbed... Name: 7420963_20200328125416581_1_LARGE.jpg Type: image/jpeg Size: 47844 bytes Desc: not available URL: From ron at usmedrec.com Fri Oct 2 06:16:24 2020 From: ron at usmedrec.com (Ron Teitelbaum) Date: Fri, 2 Oct 2020 02:16:24 -0400 Subject: [squeak-dev] Curious history In-Reply-To: References: <4RzffQkMYVDio5ypO3BdDDogbcHCBBrlCc1fxoT8GmqCUWhN0sU9yBdJfjTNNuM4-qL-oLkLcIB--mYjPkf0Lg==@protonmail.conversationid> <877lUkLJfpLi1si68jBg1GdbHUPpNB5NhFo1QUUdR1B3G5XWCcIKgtbRJ9r-nBoAYlzIl-mApKW07rQFHukdoA==@protonmail.internalid> Message-ID: Rob, You have been in this place before. Is there someone you can talk to for help? Do you have a connection to someone that is working with you on your issues? Would you consider calling them now? I've seen you here before. I've seen you doing much better. You should be good to yourself and get help now to move into calmer water and get on a more even keel. A better future includes protecting yourself, being nice to yourself, and making sure you get help when you need it. Don't wait until later. I really recommend you do it now. Ron On Fri, Oct 2, 2020 at 1:50 AM Robert Withers wrote: > "And would not encourage the feeding of the indigent!" > On 10/2/20 12:21 AM, Robert Withers wrote: > > The Hellfire and its occupants, not my problem. I pay no attention. Burn. > > I "Will be in a life of bliss, In a Garden on high. The Fruits whereof"... > ------------------------------ > Al Haqqah (69) > > [The Sure Reality! What is the Sure Reality? And what will make thee > realise what the Sure Reality is? The Thamud and the 'Ad People (branded) > as false the Stunning Calamity! But the Thamud,- they were destroyed by a > terrible Storm of thunder and lightning! And the 'Ad, they were destroyed > by a furious Wind, exceedingly violent; He made it rage against them > seven nights and eight days in succession: so that thou couldst see the > (whole) people lying prostrate in its (path), as they had been roots of > hollow palm-trees tumbled down! Then seest thou any of them left > surviving? And Pharaoh, and those before him, and the Cities Overthrown, > committed habitual Sin. And disobeyed (each) the messenger of their Lord; > so He punished them with an abundant Penalty. We, when the water (of > Noah's Flood) overflowed beyond its limits, carried you (mankind), in the > floating (Ark), That We might make it a Message unto you, and that ears > (that should hear the tale and) retain its memory should bear its (lessons) > in remembrance. Then, when one blast is sounded on the Trumpet, And the > earth is moved, and its mountains, and they are crushed to powder at one > stroke,- On that Day shall the (Great) Event come to pass. And the sky > will be rent asunder, for it will that Day be flimsy, And the angels will > be on its sides, and eight will, that Day, bear the Throne of thy Lord > above them. That Day shall ye be brought to Judgment: not an act of yours > that ye hide will be hidden. Then he that will be given his Record in his > right hand will say: "Ah here! Read ye my Record! "I did really > understand that my Account would (One Day) reach me!" And he will be in a > life of Bliss, > In a Garden on high, > The Fruits whereof (will hang in bunches) low and near. > "Eat ye and drink ye, with full satisfaction; because of the (good) that > ye sent before you, in the days that are gone!" And he that will be given > his Record in his left hand, will say: "Ah! Would that my Record had not > been given to me! "And that I had never realised how my account (stood)! "Ah! > Would that (Death) had made an end of me! "Of no profit to me has been my > wealth! "My power has perished from me!"... (The stern command will say): > "Seize ye him, and bind ye him, "And burn ye him in the Blazing Fire. "Further, > make him march in a chain, whereof the length is seventy cubits! "This > was he that would not believe in Allah Most High. "And would not > encourage the feeding of the indigent! "So no friend hath he here this > Day. "Nor hath he any food except the corruption from the washing of > wounds, "Which none do eat but those in sin." So I do call to witness > what ye see, And what ye see not, That this is verily the word of an > honoured messenger; It is not the word of a poet: little it is ye believe! Nor > is it the word of a soothsayer: little admonition it is ye receive. (This > is) a Message sent down from the Lord of the Worlds. And if the messenger > were to invent any sayings in Our name, We should certainly seize him by > his right hand, And We should certainly then cut off the artery of his > heart: Nor could any of you withhold him (from Our wrath). But verily > this is a Message for the Allah-fearing. And We certainly know that there > are amongst you those that reject (it). But truly (Revelation) is a cause > of sorrow for the Unbelievers. But verily it is Truth of assured > certainty. So glorify the name of thy Lord Most High. ] - Quran 69:1-52 > > --- > > Slosher > Oriental, NC > > > On 10/1/20 11:36 PM, Ron Teitelbaum wrote: > > Hi Rob, > > I'm so sorry you felt that way. I know you have had major issues, you > have said the same yourself. I'm always happy to see you come back even > after long absences. You are a brilliant coder and it has been my distinct > pleasure to work with you on Cryptography! Thank you for all you have done > and indeed you are responsible for adding significant value to Squeak and > the community. > > We all work on code and it's easy to work your ass off on something to > make it work and forget where it originated. We all contribute in large > and small ways to everything. If you started VMMaker thank you! It is > definitely something a lot of us use. I remember learning all about it a > long long time ago before I realized that while I could understand it and I > could use it, the people that work on the VM are a level higher than me. I > just make apps! > > I remember getting in an argument with Andreas about adding methods to > collection. "WE DON"T NEED more methods in Collection we need to remove > most of them and make it easier!" I argued with him about the value over > and over but he insisted that they just didn't add enough value. I could > have been put off. I could have assumed that Andreas didn't like me but I > would have been very wrong! I was really honored to get the chance to work > with him and we became great friends. Of course I added my methods to the > code we were working on together and was so thrilled when he used my > methods for his own code. > > I don't know what happened with VMMaker but again thank you for > your participation in it.. I wanted to take a minute to thank you for your > work and to let you know it is my honor to work with you too! I hope that > you can come to terms with your past and that you get the help you need for > your CPTSD. > > Everything is possible, the past is gone, but the future is still yours to > shape. I wish the past was set in stone but even that moves and slips. I > was talking to my wife about a party we attended: "Remember in 2000 we were > at the party and counted down the new year and someone hit the breaker and > killed the lights! We were all talking about what would happen in the year > 2000, would everything break!" Great story except that I hadn't met my > wife yet! The past is only what we remember but the future is something we > have control over. Peace, calm, happyness, they are all hard to come by > but they are possible. I wish you success in finding what makes your > future better. > > I'm sorry about the bad things that have happened to you in the past. As > far as I'm concerned, you are welcomed here! > > All the best, > > Ron Teitelbaum > > > > On Thu, Oct 1, 2020 at 10:38 PM Robert Withers via Squeak-dev < > squeak-dev at lists.squeakfoundation.org> wrote: > >> :sob::sob::sob: >> On 10/1/20 10:34 PM, Robert Withers wrote: >> >> I wrote to the #general Squeak Slack channel: >> >> What a complete larcenous bastard. 20 years ago, this month, published it >> as his own work. And been against me ever since. My CPTSD (100% veteran >> service-connected) comes with an exquisitely sensitive deception meter. >> There are those who shunned me and ostracized me and made me feel MOST >> UNWELCOME. For 20 years. My delusions kick in and I start suspecting back >> channel communications against me. My love for Squeak conflicted with what >> I knew was happening. but I hung in there and worked on Cryptography, work >> with a group of great people and that I am satisfied with its added value >> to Squeak. For 20 years I KNEW people were against me in the community. I >> cannot describe how negatively this affected me. My third suicide attempt, >> in 2007 I jumped off the roof of a 6 story apartment building and broke my >> back along with many bones. God did not want me to die, yet, so I lived. >> This deception and ostracism is most well highlighted by the taking credit >> for my work, without attribution. He is a complete tool. SHAME! >> >> I do not know the degree to which he spoke against me. I *imagine* it >> was ever since 2000. Delusions! What is real? I knew not. So much torment! >> AGONY! They do not welcome me! They are trying to chase me off! Good grief, >> Charlie Brown. >> >> Severely exacerbated my CPTSD! I kept trying to kill myself because of >> it! I thought I had done something egregiously wrong. Whatever it was it >> had to be my fault. I was not feeling the love, even from myself. >> >> :scream: >> >> :scream: >> >> >> In 2017, 900 units of insulin brought my blood glucose below 40. I almost >> succeeded that time. >> >> :scream: >> >> rww >> On 10/1/20 8:55 PM, Robert Withers wrote: >> >> The worst sort of person is one who takes the credit for the work of >> another. Wouldn't you agree? >> >> You may wish to hear John's judgement on the matter. He was right there >> when it was first built. >> >> If you are not humble you will be humiliated, and brought low. >> >> rww >> >> On 10/1/20 8:35 PM, tim Rowledge wrote: >> >> On 2020-10-01, at 4:57 PM, Robert Withers via Squeak-dev wrote: >> >> I am curious. Who was the original author of the VMMaker Tool? >> >> That would be me; back in exobox days. Written along with the original VMMaker and intended to be an example of clean, tidy, morphic usage. I've no idea if anyone ever uses it now, since running it via scripting has proven more valuable. >> >> >> tim >> -- >> tim Rowledge; tim at rowledge.org; http://www.rowledge.org/tim >> "Wibble" said Pooh the stress beginning to show. >> >> >> >> >> -- >> K, r >> >> -- >> K, r >> >> -- > K, r > > -- > K, r > > -- > K, r > > -- > K, r > -------------- next part -------------- An HTML attachment was scrubbed... URL: -------------- next part -------------- A non-text attachment was scrubbed... Name: 7420963_20200328125416581_1_LARGE.jpg Type: image/jpeg Size: 47844 bytes Desc: not available URL: From robert.withers at pm.me Fri Oct 2 06:22:08 2020 From: robert.withers at pm.me (Robert Withers) Date: Fri, 02 Oct 2020 06:22:08 +0000 Subject: [squeak-dev] Curious history In-Reply-To: References: <877lUkLJfpLi1si68jBg1GdbHUPpNB5NhFo1QUUdR1B3G5XWCcIKgtbRJ9r-nBoAYlzIl-mApKW07rQFHukdoA==@protonmail.internalid> Message-ID: <53e5af96-c60c-4361-e3df-0539863bee2e@pm.me> Thank you for reaching out in this manner on these issues. Though be ye not concerned for my health, Ron, I am in a good place. The sobbing really helps a LOT! And I was brought to that tonight after screaming! And discussing a couple of my many suicide attempts. And realizing the effect my not finding a home with Squeak had affected me over 20 years. It hurts! I sob. All is well; God is Good. The Truth heals. All praise to the Most High! Kindly, Rob On 10/2/20 2:16 AM, Ron Teitelbaum wrote: > Rob, > > You have been in this place before. Is there someone you can talk to for help? Do you have a connection to someone that is working with you on your issues? Would you consider calling them now? > > I've seen you here before. I've seen you doing much better. You should be good to yourself and get help now to move into calmer water and get on a more even keel. A better future includes protecting yourself, being nice to yourself, and making sure you get help when you need it. > > Don't wait until later. I really recommend you do it now. > > Ron > > On Fri, Oct 2, 2020 at 1:50 AM Robert Withers wrote: > >> "And would not encourage the feeding of the indigent!" >> >> On 10/2/20 12:21 AM, Robert Withers wrote: >> >>> The Hellfire and its occupants, not my problem. I pay no attention. Burn. >>> >>> I "Will be in a life of bliss, In a Garden on high. The Fruits whereof"... >>> >>> --------------------------------------------------------------- >>> >>> Al Haqqah (69) >>> >>>>> [The Sure Reality! >>>>> >>>>> What is the Sure Reality? >>>>> >>>>> And what will make thee realise what the Sure Reality is? >>>>> >>>>> The Thamud and the 'Ad People (branded) as false the Stunning Calamity! >>>>> >>>>> But the Thamud,- they were destroyed by a terrible Storm of thunder and lightning! >>>>> >>>>> And the 'Ad, they were destroyed by a furious Wind, exceedingly violent; >>>>> >>>>> He made it rage against them seven nights and eight days in succession: so that thou couldst see the (whole) people lying prostrate in its (path), as they had been roots of hollow palm-trees tumbled down! >>>>> >>>>> Then seest thou any of them left surviving? >>>>> >>>>> And Pharaoh, and those before him, and the Cities Overthrown, committed habitual Sin. >>>>> >>>>> And disobeyed (each) the messenger of their Lord; so He punished them with an abundant Penalty. >>>>> >>>>> We, when the water (of Noah's Flood) overflowed beyond its limits, carried you (mankind), in the floating (Ark), >>>>> >>>>> That We might make it a Message unto you, and that ears (that should hear the tale and) retain its memory should bear its (lessons) in remembrance. >>>>> >>>>> Then, when one blast is sounded on the Trumpet, >>>>> >>>>> And the earth is moved, and its mountains, and they are crushed to powder at one stroke,- >>>>> >>>>> On that Day shall the (Great) Event come to pass. >>>>> >>>>> And the sky will be rent asunder, for it will that Day be flimsy, >>>>> >>>>> And the angels will be on its sides, and eight will, that Day, bear the Throne of thy Lord above them. >>>>> >>>>> That Day shall ye be brought to Judgment: not an act of yours that ye hide will be hidden. >>>>> >>>>> Then he that will be given his Record in his right hand will say: "Ah here! Read ye my Record! >>>>> >>>>> "I did really understand that my Account would (One Day) reach me!" >>>>> >>>>> And he will be in a life of Bliss, >>>>> >>>>> In a Garden on high, >>>>> >>>>> The Fruits whereof (will hang in bunches) low and near. >>>>> >>>>> "Eat ye and drink ye, with full satisfaction; because of the (good) that ye sent before you, in the days that are gone!" >>>>> >>>>> And he that will be given his Record in his left hand, will say: "Ah! Would that my Record had not been given to me! >>>>> >>>>> "And that I had never realised how my account (stood)! >>>>> >>>>> "Ah! Would that (Death) had made an end of me! >>>>> >>>>> "Of no profit to me has been my wealth! >>>>> >>>>> "My power has perished from me!"... >>>>> >>>>> (The stern command will say): "Seize ye him, and bind ye him, >>>>> >>>>> "And burn ye him in the Blazing Fire. >>>>> >>>>> "Further, make him march in a chain, whereof the length is seventy cubits! >>>>> >>>>> "This was he that would not believe in Allah Most High. >>>>> >>>>> "And would not encourage the feeding of the indigent! >>>>> >>>>> "So no friend hath he here this Day. >>>>> >>>>> "Nor hath he any food except the corruption from the washing of wounds, >>>>> >>>>> "Which none do eat but those in sin." >>>>> >>>>> So I do call to witness what ye see, >>>>> >>>>> And what ye see not, >>>>> >>>>> That this is verily the word of an honoured messenger; >>>>> >>>>> It is not the word of a poet: little it is ye believe! >>>>> >>>>> Nor is it the word of a soothsayer: little admonition it is ye receive. >>>>> >>>>> (This is) a Message sent down from the Lord of the Worlds. >>>>> >>>>> And if the messenger were to invent any sayings in Our name, >>>>> >>>>> We should certainly seize him by his right hand, >>>>> >>>>> And We should certainly then cut off the artery of his heart: >>>>> >>>>> Nor could any of you withhold him (from Our wrath). >>>>> >>>>> But verily this is a Message for the Allah-fearing. >>>>> >>>>> And We certainly know that there are amongst you those that reject (it). >>>>> >>>>> But truly (Revelation) is a cause of sorrow for the Unbelievers. >>>>> >>>>> But verily it is Truth of assured certainty. >>>>> >>>>> So glorify the name of thy Lord Most High. >>>>> >>>>> ] - Quran 69:1-52 >>> >>> --- >>> >>> Slosher >>> Oriental, NC >>> >>>>> On 10/1/20 11:36 PM, Ron Teitelbaum wrote: >>>>> >>>>>> Hi Rob, >>>>>> >>>>>> I'm so sorry you felt that way. I know you have had major issues, you have said the same yourself. I'm always happy to see you come back even after long absences. You are a brilliant coder and it has been my distinct pleasure to work with you on Cryptography! Thank you for all you have done and indeed you are responsible for adding significant value to Squeak and the community. >>>>>> >>>>>> We all work on code and it's easy to work your ass off on something to make it work and forget where it originated. We all contribute in large and small ways to everything. If you started VMMaker thank you! It is definitely something a lot of us use. I remember learning all about it a long long time ago before I realized that while I could understand it and I could use it, the people that work on the VM are a level higher than me. I just make apps! >>>>>> >>>>>> I remember getting in an argument with Andreas about adding methods to collection. "WE DON"T NEED more methods in Collection we need to remove most of them and make it easier!" I argued with him about the value over and over but he insisted that they just didn't add enough value. I could have been put off. I could have assumed that Andreas didn't like me but I would have been very wrong! I was really honored to get the chance to work with him and we became great friends. Of course I added my methods to the code we were working on together and was so thrilled when he used my methods for his own code. >>>>>> >>>>>> I don't know what happened with VMMaker but again thank you for your participation in it.. I wanted to take a minute to thank you for your work and to let you know it is my honor to work with you too! I hope that you can come to terms with your past and that you get the help you need for your CPTSD. >>>>>> >>>>>> Everything is possible, the past is gone, but the future is still yours to shape. I wish the past was set in stone but even that moves and slips. I was talking to my wife about a party we attended: "Remember in 2000 we were at the party and counted down the new year and someone hit the breaker and killed the lights! We were all talking about what would happen in the year 2000, would everything break!" Great story except that I hadn't met my wife yet! The past is only what we remember but the future is something we have control over. Peace, calm, happyness, they are all hard to come by but they are possible. I wish you success in finding what makes your future better. >>>>>> >>>>>> I'm sorry about the bad things that have happened to you in the past. As far as I'm concerned, you are welcomed here! >>>>>> >>>>>> All the best, >>>>>> >>>>>> Ron Teitelbaum >>>>>> >>>>>> On Thu, Oct 1, 2020 at 10:38 PM Robert Withers via Squeak-dev wrote: >>>>>> >>>>>>> :sob::sob::sob: >>>>>>> >>>>>>> On 10/1/20 10:34 PM, Robert Withers wrote: >>>>>>> >>>>>>>> I wrote to the #general Squeak Slack channel: >>>>>>>> >>>>>>>>> What a complete larcenous bastard. 20 years ago, this month, published it as his own work. And been against me ever since. My CPTSD (100% veteran service-connected) comes with an exquisitely sensitive deception meter. There are those who shunned me and ostracized me and made me feel MOST UNWELCOME. For 20 years. My delusions kick in and I start suspecting back channel communications against me. My love for Squeak conflicted with what I knew was happening. but I hung in there and worked on Cryptography, work with a group of great people and that I am satisfied with its added value to Squeak. For 20 years I KNEW people were against me in the community. I cannot describe how negatively this affected me. My third suicide attempt, in 2007 I jumped off the roof of a 6 story apartment building and broke my back along with many bones. God did not want me to die, yet, so I lived. This deception and ostracism is most well highlighted by the taking credit for my work, without attribution. He is a complete tool. SHAME! >>>>>>>>> >>>>>>>>> I do not know the degree to which he spoke against me. Iimagineit was ever since 2000. Delusions! What is real? I knew not. So much torment! AGONY! They do not welcome me! They are trying to chase me off! Good grief, Charlie Brown. >>>>>>>>> >>>>>>>>> Severely exacerbated my CPTSD! I kept trying to kill myself because of it! I thought I had done something egregiously wrong. Whatever it was it had to be my fault. I was not feeling the love, even from myself. >>>>>>>>> >>>>>>>>> :scream: >>>>>>>>> >>>>>>>>> :scream: >>>>>>>>> >>>>>>>>> In 2017, 900 units of insulin brought my blood glucose below 40. I almost succeeded that time. >>>>>>>>> >>>>>>>>> :scream: >>>>>>>> >>>>>>>> rww >>>>>>>> >>>>>>>> On 10/1/20 8:55 PM, Robert Withers wrote: >>>>>>>> >>>>>>>>> The worst sort of person is one who takes the credit for the work of >>>>>>>>> another. Wouldn't you agree? >>>>>>>>> >>>>>>>>> You may wish to hear John's judgement on the matter. He was right there >>>>>>>>> when it was first built. >>>>>>>>> >>>>>>>>> If you are not humble you will be humiliated, and brought low. >>>>>>>>> >>>>>>>>> rww >>>>>>>>> >>>>>>>>> On 10/1/20 8:35 PM, tim Rowledge wrote: >>>>>>>>> >>>>>>>>>>> On 2020-10-01, at 4:57 PM, Robert Withers via Squeak-dev >>>>>>>>>>> [](mailto:squeak-dev at lists.squeakfoundation.org) >>>>>>>>>>> wrote: >>>>>>>>>>> >>>>>>>>>>> I am curious. Who was the original author of the VMMaker Tool? >>>>>>>>>> >>>>>>>>>> That would be me; back in exobox days. Written along with the original VMMaker and intended to be an example of clean, tidy, morphic usage. I've no idea if anyone ever uses it now, since running it via scripting has proven more valuable. >>>>>>>>>> >>>>>>>>>> tim >>>>>>>>>> -- >>>>>>>>>> tim Rowledge; >>>>>>>>>> tim at rowledge.org >>>>>>>>>> ; >>>>>>>>>> http://www.rowledge.org/tim >>>>>>>>>> "Wibble" said Pooh the stress beginning to show. >>>>>>>> >>>>>>>> -- >>>>>>>> K, r >>>>>>> >>>>>>> -- >>>>>>> K, r >>>>> >>>>> -- >>>>> K, r >>>> >>>> -- >>>> K, r >>> >>> -- >>> K, r >> >> -- >> K, r -- K, r -------------- next part -------------- An HTML attachment was scrubbed... URL: -------------- next part -------------- A non-text attachment was scrubbed... Name: 7420963_20200328125416581_1_LARGE.jpg Type: image/jpeg Size: 47844 bytes Desc: not available URL: From robert.withers at pm.me Fri Oct 2 06:26:48 2020 From: robert.withers at pm.me (Robert Withers) Date: Fri, 02 Oct 2020 06:26:48 +0000 Subject: [squeak-dev] Curious history In-Reply-To: <53e5af96-c60c-4361-e3df-0539863bee2e@pm.me> References: <877lUkLJfpLi1si68jBg1GdbHUPpNB5NhFo1QUUdR1B3G5XWCcIKgtbRJ9r-nBoAYlzIl-mApKW07rQFHukdoA==@protonmail.internalid> <53e5af96-c60c-4361-e3df-0539863bee2e@pm.me> Message-ID: <68481afd-2d10-e85b-29be-f2ac9546388e@pm.me> For I will restore health unto thee, and I will heal thee of thy wounds, saith the Lord; because they called thee an Outcast, saying, This is Zion, whom no man seeketh after. Jeremiah 30:17 On 10/2/20 2:22 AM, Robert Withers via Squeak-dev wrote: > Thank you for reaching out in this manner on these issues. Though be ye not concerned for my health, Ron, I am in a good place. The sobbing really helps a LOT! And I was brought to that tonight after screaming! And discussing a couple of my many suicide attempts. And realizing the effect my not finding a home with Squeak had affected me over 20 years. It hurts! I sob. All is well; God is Good. The Truth heals. All praise to the Most High! > > Kindly, > Rob > > On 10/2/20 2:16 AM, Ron Teitelbaum wrote: > >> Rob, >> >> You have been in this place before. Is there someone you can talk to for help? Do you have a connection to someone that is working with you on your issues? Would you consider calling them now? >> >> I've seen you here before. I've seen you doing much better. You should be good to yourself and get help now to move into calmer water and get on a more even keel. A better future includes protecting yourself, being nice to yourself, and making sure you get help when you need it. >> >> Don't wait until later. I really recommend you do it now. >> >> Ron >> >> On Fri, Oct 2, 2020 at 1:50 AM Robert Withers wrote: >> >>> "And would not encourage the feeding of the indigent!" >>> >>> On 10/2/20 12:21 AM, Robert Withers wrote: >>> >>>> The Hellfire and its occupants, not my problem. I pay no attention. Burn. >>>> >>>> I "Will be in a life of bliss, In a Garden on high. The Fruits whereof"... >>>> >>>> --------------------------------------------------------------- >>>> >>>> Al Haqqah (69) >>>> >>>>>> [The Sure Reality! >>>>>> >>>>>> What is the Sure Reality? >>>>>> >>>>>> And what will make thee realise what the Sure Reality is? >>>>>> >>>>>> The Thamud and the 'Ad People (branded) as false the Stunning Calamity! >>>>>> >>>>>> But the Thamud,- they were destroyed by a terrible Storm of thunder and lightning! >>>>>> >>>>>> And the 'Ad, they were destroyed by a furious Wind, exceedingly violent; >>>>>> >>>>>> He made it rage against them seven nights and eight days in succession: so that thou couldst see the (whole) people lying prostrate in its (path), as they had been roots of hollow palm-trees tumbled down! >>>>>> >>>>>> Then seest thou any of them left surviving? >>>>>> >>>>>> And Pharaoh, and those before him, and the Cities Overthrown, committed habitual Sin. >>>>>> >>>>>> And disobeyed (each) the messenger of their Lord; so He punished them with an abundant Penalty. >>>>>> >>>>>> We, when the water (of Noah's Flood) overflowed beyond its limits, carried you (mankind), in the floating (Ark), >>>>>> >>>>>> That We might make it a Message unto you, and that ears (that should hear the tale and) retain its memory should bear its (lessons) in remembrance. >>>>>> >>>>>> Then, when one blast is sounded on the Trumpet, >>>>>> >>>>>> And the earth is moved, and its mountains, and they are crushed to powder at one stroke,- >>>>>> >>>>>> On that Day shall the (Great) Event come to pass. >>>>>> >>>>>> And the sky will be rent asunder, for it will that Day be flimsy, >>>>>> >>>>>> And the angels will be on its sides, and eight will, that Day, bear the Throne of thy Lord above them. >>>>>> >>>>>> That Day shall ye be brought to Judgment: not an act of yours that ye hide will be hidden. >>>>>> >>>>>> Then he that will be given his Record in his right hand will say: "Ah here! Read ye my Record! >>>>>> >>>>>> "I did really understand that my Account would (One Day) reach me!" >>>>>> >>>>>> And he will be in a life of Bliss, >>>>>> >>>>>> In a Garden on high, >>>>>> >>>>>> The Fruits whereof (will hang in bunches) low and near. >>>>>> >>>>>> "Eat ye and drink ye, with full satisfaction; because of the (good) that ye sent before you, in the days that are gone!" >>>>>> >>>>>> And he that will be given his Record in his left hand, will say: "Ah! Would that my Record had not been given to me! >>>>>> >>>>>> "And that I had never realised how my account (stood)! >>>>>> >>>>>> "Ah! Would that (Death) had made an end of me! >>>>>> >>>>>> "Of no profit to me has been my wealth! >>>>>> >>>>>> "My power has perished from me!"... >>>>>> >>>>>> (The stern command will say): "Seize ye him, and bind ye him, >>>>>> >>>>>> "And burn ye him in the Blazing Fire. >>>>>> >>>>>> "Further, make him march in a chain, whereof the length is seventy cubits! >>>>>> >>>>>> "This was he that would not believe in Allah Most High. >>>>>> >>>>>> "And would not encourage the feeding of the indigent! >>>>>> >>>>>> "So no friend hath he here this Day. >>>>>> >>>>>> "Nor hath he any food except the corruption from the washing of wounds, >>>>>> >>>>>> "Which none do eat but those in sin." >>>>>> >>>>>> So I do call to witness what ye see, >>>>>> >>>>>> And what ye see not, >>>>>> >>>>>> That this is verily the word of an honoured messenger; >>>>>> >>>>>> It is not the word of a poet: little it is ye believe! >>>>>> >>>>>> Nor is it the word of a soothsayer: little admonition it is ye receive. >>>>>> >>>>>> (This is) a Message sent down from the Lord of the Worlds. >>>>>> >>>>>> And if the messenger were to invent any sayings in Our name, >>>>>> >>>>>> We should certainly seize him by his right hand, >>>>>> >>>>>> And We should certainly then cut off the artery of his heart: >>>>>> >>>>>> Nor could any of you withhold him (from Our wrath). >>>>>> >>>>>> But verily this is a Message for the Allah-fearing. >>>>>> >>>>>> And We certainly know that there are amongst you those that reject (it). >>>>>> >>>>>> But truly (Revelation) is a cause of sorrow for the Unbelievers. >>>>>> >>>>>> But verily it is Truth of assured certainty. >>>>>> >>>>>> So glorify the name of thy Lord Most High. >>>>>> >>>>>> ] - Quran 69:1-52 >>>> >>>> --- >>>> >>>> Slosher >>>> Oriental, NC >>>> >>>>>> On 10/1/20 11:36 PM, Ron Teitelbaum wrote: >>>>>> >>>>>>> Hi Rob, >>>>>>> >>>>>>> I'm so sorry you felt that way. I know you have had major issues, you have said the same yourself. I'm always happy to see you come back even after long absences. You are a brilliant coder and it has been my distinct pleasure to work with you on Cryptography! Thank you for all you have done and indeed you are responsible for adding significant value to Squeak and the community. >>>>>>> >>>>>>> We all work on code and it's easy to work your ass off on something to make it work and forget where it originated. We all contribute in large and small ways to everything. If you started VMMaker thank you! It is definitely something a lot of us use. I remember learning all about it a long long time ago before I realized that while I could understand it and I could use it, the people that work on the VM are a level higher than me. I just make apps! >>>>>>> >>>>>>> I remember getting in an argument with Andreas about adding methods to collection. "WE DON"T NEED more methods in Collection we need to remove most of them and make it easier!" I argued with him about the value over and over but he insisted that they just didn't add enough value. I could have been put off. I could have assumed that Andreas didn't like me but I would have been very wrong! I was really honored to get the chance to work with him and we became great friends. Of course I added my methods to the code we were working on together and was so thrilled when he used my methods for his own code. >>>>>>> >>>>>>> I don't know what happened with VMMaker but again thank you for your participation in it.. I wanted to take a minute to thank you for your work and to let you know it is my honor to work with you too! I hope that you can come to terms with your past and that you get the help you need for your CPTSD. >>>>>>> >>>>>>> Everything is possible, the past is gone, but the future is still yours to shape. I wish the past was set in stone but even that moves and slips. I was talking to my wife about a party we attended: "Remember in 2000 we were at the party and counted down the new year and someone hit the breaker and killed the lights! We were all talking about what would happen in the year 2000, would everything break!" Great story except that I hadn't met my wife yet! The past is only what we remember but the future is something we have control over. Peace, calm, happyness, they are all hard to come by but they are possible. I wish you success in finding what makes your future better. >>>>>>> >>>>>>> I'm sorry about the bad things that have happened to you in the past. As far as I'm concerned, you are welcomed here! >>>>>>> >>>>>>> All the best, >>>>>>> >>>>>>> Ron Teitelbaum >>>>>>> >>>>>>> On Thu, Oct 1, 2020 at 10:38 PM Robert Withers via Squeak-dev wrote: >>>>>>> >>>>>>>> :sob::sob::sob: >>>>>>>> >>>>>>>> On 10/1/20 10:34 PM, Robert Withers wrote: >>>>>>>> >>>>>>>>> I wrote to the #general Squeak Slack channel: >>>>>>>>> >>>>>>>>>> What a complete larcenous bastard. 20 years ago, this month, published it as his own work. And been against me ever since. My CPTSD (100% veteran service-connected) comes with an exquisitely sensitive deception meter. There are those who shunned me and ostracized me and made me feel MOST UNWELCOME. For 20 years. My delusions kick in and I start suspecting back channel communications against me. My love for Squeak conflicted with what I knew was happening. but I hung in there and worked on Cryptography, work with a group of great people and that I am satisfied with its added value to Squeak. For 20 years I KNEW people were against me in the community. I cannot describe how negatively this affected me. My third suicide attempt, in 2007 I jumped off the roof of a 6 story apartment building and broke my back along with many bones. God did not want me to die, yet, so I lived. This deception and ostracism is most well highlighted by the taking credit for my work, without attribution. He is a complete tool. SHAME! >>>>>>>>>> >>>>>>>>>> I do not know the degree to which he spoke against me. Iimagineit was ever since 2000. Delusions! What is real? I knew not. So much torment! AGONY! They do not welcome me! They are trying to chase me off! Good grief, Charlie Brown. >>>>>>>>>> >>>>>>>>>> Severely exacerbated my CPTSD! I kept trying to kill myself because of it! I thought I had done something egregiously wrong. Whatever it was it had to be my fault. I was not feeling the love, even from myself. >>>>>>>>>> >>>>>>>>>> :scream: >>>>>>>>>> >>>>>>>>>> :scream: >>>>>>>>>> >>>>>>>>>> In 2017, 900 units of insulin brought my blood glucose below 40. I almost succeeded that time. >>>>>>>>>> >>>>>>>>>> :scream: >>>>>>>>> >>>>>>>>> rww >>>>>>>>> >>>>>>>>> On 10/1/20 8:55 PM, Robert Withers wrote: >>>>>>>>> >>>>>>>>>> The worst sort of person is one who takes the credit for the work of >>>>>>>>>> another. Wouldn't you agree? >>>>>>>>>> >>>>>>>>>> You may wish to hear John's judgement on the matter. He was right there >>>>>>>>>> when it was first built. >>>>>>>>>> >>>>>>>>>> If you are not humble you will be humiliated, and brought low. >>>>>>>>>> >>>>>>>>>> rww >>>>>>>>>> >>>>>>>>>> On 10/1/20 8:35 PM, tim Rowledge wrote: >>>>>>>>>> >>>>>>>>>>>> On 2020-10-01, at 4:57 PM, Robert Withers via Squeak-dev >>>>>>>>>>>> [](mailto:squeak-dev at lists.squeakfoundation.org) >>>>>>>>>>>> wrote: >>>>>>>>>>>> >>>>>>>>>>>> I am curious. Who was the original author of the VMMaker Tool? >>>>>>>>>>> >>>>>>>>>>> That would be me; back in exobox days. Written along with the original VMMaker and intended to be an example of clean, tidy, morphic usage. I've no idea if anyone ever uses it now, since running it via scripting has proven more valuable. >>>>>>>>>>> >>>>>>>>>>> tim >>>>>>>>>>> -- >>>>>>>>>>> tim Rowledge; >>>>>>>>>>> tim at rowledge.org >>>>>>>>>>> ; >>>>>>>>>>> http://www.rowledge.org/tim >>>>>>>>>>> "Wibble" said Pooh the stress beginning to show. >>>>>>>>> >>>>>>>>> -- >>>>>>>>> K, r >>>>>>>> >>>>>>>> -- >>>>>>>> K, r >>>>>> >>>>>> -- >>>>>> K, r >>>>> >>>>> -- >>>>> K, r >>>> >>>> -- >>>> K, r >>> >>> -- >>> K, r > > -- > K, r -- K, r -------------- next part -------------- An HTML attachment was scrubbed... URL: -------------- next part -------------- A non-text attachment was scrubbed... Name: 7420963_20200328125416581_1_LARGE.jpg Type: image/jpeg Size: 47844 bytes Desc: not available URL: From marcel.taeumel at hpi.de Fri Oct 2 06:32:26 2020 From: marcel.taeumel at hpi.de (Marcel Taeumel) Date: Fri, 2 Oct 2020 08:32:26 +0200 Subject: [squeak-dev] The Trunk: ToolBuilder-Morphic-ct.252.mcz In-Reply-To: <68a21ecc6fe64c07b0a73db82f94252c@student.hpi.uni-potsdam.de> References: <68a21ecc6fe64c07b0a73db82f94252c@student.hpi.uni-potsdam.de> Message-ID: Hi Chirstoph, not sure I like the wording #debugFromContextThat:title:. On the plus side, we can remove the explicit reference to #Process. Maybe consider what is already in the system: Morph >> #firstOwnerSuchThat: Object >> #hasLiteralSuchThat: ChangeList >> #selectSuchThat: Maybe #debugContextSuchThat:(withTitle:)? Best, Marcel Am 01.10.2020 22:47:49 schrieb Thiede, Christoph : Hi Marcel, thank you for reviewing all this stuff! :-) Might this be a good point to push the discussion from http://forum.world.st/The-Inbox-System-ct-1149-mcz-td5114102.html [http://forum.world.st/The-Inbox-System-ct-1149-mcz-td5114102.html] again? It would allow us to rewrite the #debugAction implementation here as follows: debugAction        action ifNil: [^ super debugAction].        [self performAction]               debugFromContextThat: [context closure = action]               title: ('Debug button action "{1}" in model "{2}"' format: {self label. self target printString}). Best, Christoph [http://www.hpi.de/] Von: Squeak-dev im Auftrag von commits at source.squeak.org Gesendet: Donnerstag, 1. Oktober 2020 16:06 Uhr An: squeak-dev at lists.squeakfoundation.org; packages at lists.squeakfoundation.org Betreff: [squeak-dev] The Trunk: ToolBuilder-Morphic-ct.252.mcz   Marcel Taeumel uploaded a new version of ToolBuilder-Morphic to project The Trunk: http://source.squeak.org/trunk/ToolBuilder-Morphic-ct.252.mcz [http://source.squeak.org/trunk/ToolBuilder-Morphic-ct.252.mcz] ==================== Summary ==================== Name: ToolBuilder-Morphic-ct.252 Author: ct Time: 20 January 2020, 8:57:46.404972 pm UUID: 2b311bcc-31ca-dc4d-8ebf-7a1cad07624e Ancestors: ToolBuilder-Morphic-mt.251 Implement "browse/debug button action" properly on PluggabeButtonMorphPlus =============== Diff against ToolBuilder-Morphic-mt.251 =============== Item was added: + ----- Method: PluggableButtonMorphPlus>>browseImplementationOfActionSelector (in category 'debug menu') ----- + browseImplementationOfActionSelector + +        action ifNotNil: [ +                ^ action outerContext method browse]. +        ^ super browseImplementationOfActionSelector! Item was added: + ----- Method: PluggableButtonMorphPlus>>debugAction (in category 'debug menu') ----- + debugAction + +        action ifNil: [^ super debugAction]. +        (Process +                forBlock: [self performAction] +                runUntil: [:context | context closure = action]) +                        debugWithTitle: ('Debug button action "{1}" in model "{2}"' format: {self label. self target printString}).! -------------- next part -------------- An HTML attachment was scrubbed... URL: From marcel.taeumel at hpi.de Fri Oct 2 06:37:37 2020 From: marcel.taeumel at hpi.de (Marcel Taeumel) Date: Fri, 2 Oct 2020 08:37:37 +0200 Subject: [squeak-dev] The Inbox: Tools-ct.991.mcz In-Reply-To: <16d4a1ec252748c0ade891c2f73083a1@student.hpi.uni-potsdam.de> References: <,> <,> <16d4a1ec252748c0ade891c2f73083a1@student.hpi.uni-potsdam.de> Message-ID: Hi Christoph, > .. and they are still isolated from the discussion on the mailing list ... :-) That may be right. Still, the biggest effort lies in the code review itself. It's really easy to look up such a discussion if needed. Sure, you need to re-type that version number into the search function on forum.world.st ... still ... not that hard. ;-) You might think that an inbox commit is often not merged because of an open question on the list. Well, I think that's rarely the case. It's typically just time and people. ;-) No need to throw in even more tools into the ring. Best, Marcel Am 01.10.2020 22:34:21 schrieb Thiede, Christoph : Hi Marcel, this is a very nice script and demonstrates the powerfulness of Vivide very well! Still, it does not show any links between multiple inbox/trunk versions, and they are still isolated from the discussion on the mailing list ... :-) Best, Christoph [http://www.hpi.de/] Von: Squeak-dev im Auftrag von Taeumel, Marcel Gesendet: Donnerstag, 1. Oktober 2020 14:35:16 An: squeak-dev Betreff: Re: [squeak-dev] The Inbox: Tools-ct.991.mcz   Hi Christoph, I use a small Vivide script to keep track of your (and other) changes: Best, Marcel Am 01.10.2020 14:08:05 schrieb Thiede, Christoph : Hi Marcel, sorry. As already mentioned, it can be hard to keep an overview of currently 307 open inbox versions and their interdependencies ... 😫 Best, Christoph [http://www.hpi.de/] Von: Squeak-dev im Auftrag von Taeumel, Marcel Gesendet: Donnerstag, 1. Oktober 2020 14:04:06 An: squeak-dev Betreff: Re: [squeak-dev] The Inbox: Tools-ct.991.mcz   Hi Christoph, that's funny. You already did that with Tools-ct.957. :-) I will move both 956 and 957 to treated. Best, Marcel Am 30.09.2020 19:46:56 schrieb commits at source.squeak.org : Christoph Thiede uploaded a new version of Tools to project The Inbox: http://source.squeak.org/inbox/Tools-ct.991.mcz ==================== Summary ==================== Name: Tools-ct.991 Author: ct Time: 30 September 2020, 7:46:39.949807 pm UUID: 4d2f75ef-336d-cc4c-aa0d-dd4f7ff99fc7 Ancestors: Tools-mt.990 Fixes a bug in DebuggerMethodMap's rangeForPC lookup Steps to reproduce: c := Object newSubclass. c compile: 'foo: foo foo = #foo ifTrue: [^ true]. ^ (foo ifNil: [^ false]) = #bar'. c new foo: #bar. "Debug it. Step into #foo:, step over #=. Before this commit, the selection was '^ true'" The error was that #findNearbyBinaryIndex: uses to return the lower possible index if there is no exact match. For debugging, we cannot need this behavior, because we want to select the next operation to be executed. Furthermore, this commit refactors some duplication with DebuggerMethodMapForFullBlockCompiledMethod. Please review! Uploaded again due to totally broken ancestry. Replaces Tools-ct.956, which can be moved into the treated inbox. =============== Diff against Tools-mt.990 =============== Item was changed: ----- Method: DebuggerMethodMap>>rangeForPC:in:contextIsActiveContext: (in category 'source mapping') ----- rangeForPC: contextsConcretePC in: method contextIsActiveContext: contextIsActiveContext + "Answer the indices in the source code for the supplied pc. If the context is the active context (is at the hot end of the stack) then its pc is the current pc. But if the context isn't, because it is suspended sending a message, then its current pc is the previous pc." - "Answer the indices in the source code for the supplied pc. - If the context is the actve context (is at the hot end of the stack) - then its pc is the current pc. But if the context isn't, because it is - suspended sending a message, then its current pc is the previous pc." + | pc i end sortedMap | - | pc i end | pc := method abstractPCForConcretePC: (contextIsActiveContext + ifTrue: [contextsConcretePC] + ifFalse: [(method pcPreviousTo: contextsConcretePC) + ifNil: [contextsConcretePC]]). + (self abstractSourceMapForMethod: method) + at: pc + ifPresent: [:range | ^ range]. + sortedMap := self sortedSourceMapForMethod: method. + sortedMap ifEmpty: [^ 1 to: 0]. + i := sortedMap + findBinaryIndex: [:assoc | pc - assoc key] + ifNone: [:lower :upper | upper]. + i < 1 ifTrue: [^ 1 to: 0]. + i > sortedMap size ifTrue: [ + end := sortedMap inject: 0 into: [:prev :this | + prev max: this value last]. + ^ end + 1 to: end]. + ^ (sortedMap at: i) value! - ifTrue: [contextsConcretePC] - ifFalse: [(method pcPreviousTo: contextsConcretePC) - ifNotNil: [:prevpc| prevpc] - ifNil: [contextsConcretePC]]). - (self abstractSourceMap includesKey: pc) ifTrue: - [^self abstractSourceMap at: pc]. - sortedSourceMap ifNil: - [sortedSourceMap := self abstractSourceMap associations - replace: [ :each | each copy ]; - sort]. - sortedSourceMap isEmpty ifTrue: [^1 to: 0]. - i := sortedSourceMap findNearbyBinaryIndex: [:assoc| pc - assoc key]. - i < 1 ifTrue: [^1 to: 0]. - i > sortedSourceMap size ifTrue: - [end := sortedSourceMap inject: 0 into: - [:prev :this | prev max: this value last]. - ^end+1 to: end]. - ^(sortedSourceMap at: i) value - - "| method source scanner map | - method := DebuggerMethodMap compiledMethodAt: #rangeForPC:in:contextIsActiveContext:. - source := method getSourceFromFile asString. - scanner := InstructionStream on: method. - map := method debuggerMap. - Array streamContents: - [:ranges| - [scanner atEnd] whileFalse: - [| range | - range := map rangeForPC: scanner pc in: method contextIsActiveContext: true. - ((map abstractSourceMap includesKey: scanner abstractPC) - and: [range first ~= 0]) ifTrue: - [ranges nextPut: (source copyFrom: range first to: range last)]. - scanner interpretNextInstructionFor: InstructionClient new]]"! Item was added: + ----- Method: DebuggerMethodMap>>sortedSourceMap (in category 'private') ----- + sortedSourceMap + + ^ sortedSourceMap ifNil: [ + sortedSourceMap := self abstractSourceMap associations + replace: [:each | each copy]; + sort]! Item was added: + ----- Method: DebuggerMethodMap>>sortedSourceMapForMethod: (in category 'source mapping') ----- + sortedSourceMapForMethod: aCompiledMethod + + ^ self sortedSourceMap! Item was changed: ----- Method: DebuggerMethodMapForFullBlockCompiledMethods>>abstractSourceMap (in category 'source mapping') ----- abstractSourceMap + + ^ self shouldNotImplement! - self shouldNotImplement! Item was removed: - ----- Method: DebuggerMethodMapForFullBlockCompiledMethods>>rangeForPC:in:contextIsActiveContext: (in category 'source mapping') ----- - rangeForPC: contextsConcretePC in: method contextIsActiveContext: contextIsActiveContext - "Answer the indices in the source code for the supplied pc. - If the context is the actve context (is at the hot end of the stack) - then its pc is the current pc. But if the context isn't, because it is - suspended sending a message, then its current pc is the previous pc." - - | pc i end mapForMethod sortedMap | - pc := method abstractPCForConcretePC: (contextIsActiveContext - ifTrue: [contextsConcretePC] - ifFalse: [(method pcPreviousTo: contextsConcretePC) - ifNotNil: [:prevpc| prevpc] - ifNil: [contextsConcretePC]]). - ((mapForMethod := self abstractSourceMapForMethod: method) includesKey: pc) ifTrue: - [^mapForMethod at: pc]. - sortedSourceMap ifNil: - [sortedSourceMap := IdentityDictionary new]. - sortedMap := sortedSourceMap - at: method - ifAbsentPut: [mapForMethod associations - replace: [ :each | each copy ]; - sort]. - sortedMap isEmpty ifTrue: [^1 to: 0]. - i := sortedMap findNearbyBinaryIndex: [:assoc| pc - assoc key]. - i < 1 ifTrue: [^1 to: 0]. - i > sortedMap size ifTrue: - [end := sortedMap inject: 0 into: - [:prev :this | prev max: this value last]. - ^end+1 to: end]. - ^(sortedMap at: i) value - - "| method source scanner map | - method := DebuggerMethodMapForFullBlockCompiledMethods compiledMethodAt: #rangeForPC:in:contextIsActiveContext:. - source := method getSourceFromFile asString. - scanner := InstructionStream on: method. - map := method debuggerMap. - Array streamContents: - [:ranges| - [scanner atEnd] whileFalse: - [| range | - range := map rangeForPC: scanner pc in: method contextIsActiveContext: true. - ((map abstractSourceMap includesKey: scanner abstractPC) - and: [range first ~= 0]) ifTrue: - [ranges nextPut: (source copyFrom: range first to: range last)]. - scanner interpretNextInstructionFor: InstructionClient new]]"! Item was added: + ----- Method: DebuggerMethodMapForFullBlockCompiledMethods>>sortedSourceMap (in category 'source mapping') ----- + sortedSourceMap + + ^ self shouldNotImplement! Item was added: + ----- Method: DebuggerMethodMapForFullBlockCompiledMethods>>sortedSourceMapForMethod: (in category 'source mapping') ----- + sortedSourceMapForMethod: method + + sortedSourceMap ifNil: [ + sortedSourceMap := IdentityDictionary new]. + ^ sortedSourceMap + at: method + ifAbsentPut: [(self abstractSourceMapForMethod: method) associations + replace: [ :each | each copy ]; + sort]! -------------- next part -------------- An HTML attachment was scrubbed... URL: -------------- next part -------------- A non-text attachment was scrubbed... Name: image.png Type: image/png Size: 535245 bytes Desc: not available URL: From robert.withers at pm.me Fri Oct 2 06:39:18 2020 From: robert.withers at pm.me (Robert Withers) Date: Fri, 02 Oct 2020 06:39:18 +0000 Subject: [squeak-dev] Curious history In-Reply-To: <68481afd-2d10-e85b-29be-f2ac9546388e@pm.me> References: <4RzffQkMYVDio5ypO3BdDDogbcHCBBrlCc1fxoT8GmqCUWhN0sU9yBdJfjTNNuM4-qL-oLkLcIB--mYjPkf0Lg==@protonmail.conversationid> <53e5af96-c60c-4361-e3df-0539863bee2e@pm.me> <68481afd-2d10-e85b-29be-f2ac9546388e@pm.me> Message-ID: <440a94ec-9f74-4390-e952-98719584e0d8@pm.me> Play a bit of these spicy beats! The music helps me to express what is on the inside. https://youtu.be/3q8nGnls1Ow?t=2711 On 10/2/20 2:26 AM, Robert Withers wrote: > For I will restore health unto thee, and I will heal thee of thy wounds, saith the Lord; because they called thee an Outcast, saying, This is Zion, whom no man seeketh after. > > Jeremiah 30:17 > > On 10/2/20 2:22 AM, Robert Withers via Squeak-dev wrote: > >> Thank you for reaching out in this manner on these issues. Though be ye not concerned for my health, Ron, I am in a good place. The sobbing really helps a LOT! And I was brought to that tonight after screaming! And discussing a couple of my many suicide attempts. And realizing the effect my not finding a home with Squeak had affected me over 20 years. It hurts! I sob. All is well; God is Good. The Truth heals. All praise to the Most High! >> >> Kindly, >> Rob >> >> On 10/2/20 2:16 AM, Ron Teitelbaum wrote: >> >>> Rob, >>> >>> You have been in this place before. Is there someone you can talk to for help? Do you have a connection to someone that is working with you on your issues? Would you consider calling them now? >>> >>> I've seen you here before. I've seen you doing much better. You should be good to yourself and get help now to move into calmer water and get on a more even keel. A better future includes protecting yourself, being nice to yourself, and making sure you get help when you need it. >>> >>> Don't wait until later. I really recommend you do it now. >>> >>> Ron >>> >>> On Fri, Oct 2, 2020 at 1:50 AM Robert Withers wrote: >>> >>>> "And would not encourage the feeding of the indigent!" >>>> >>>> On 10/2/20 12:21 AM, Robert Withers wrote: >>>> >>>>> The Hellfire and its occupants, not my problem. I pay no attention. Burn. >>>>> >>>>> I "Will be in a life of bliss, In a Garden on high. The Fruits whereof"... >>>>> >>>>> --------------------------------------------------------------- >>>>> >>>>> Al Haqqah (69) >>>>> >>>>>>> [The Sure Reality! >>>>>>> >>>>>>> What is the Sure Reality? >>>>>>> >>>>>>> And what will make thee realise what the Sure Reality is? >>>>>>> >>>>>>> The Thamud and the 'Ad People (branded) as false the Stunning Calamity! >>>>>>> >>>>>>> But the Thamud,- they were destroyed by a terrible Storm of thunder and lightning! >>>>>>> >>>>>>> And the 'Ad, they were destroyed by a furious Wind, exceedingly violent; >>>>>>> >>>>>>> He made it rage against them seven nights and eight days in succession: so that thou couldst see the (whole) people lying prostrate in its (path), as they had been roots of hollow palm-trees tumbled down! >>>>>>> >>>>>>> Then seest thou any of them left surviving? >>>>>>> >>>>>>> And Pharaoh, and those before him, and the Cities Overthrown, committed habitual Sin. >>>>>>> >>>>>>> And disobeyed (each) the messenger of their Lord; so He punished them with an abundant Penalty. >>>>>>> >>>>>>> We, when the water (of Noah's Flood) overflowed beyond its limits, carried you (mankind), in the floating (Ark), >>>>>>> >>>>>>> That We might make it a Message unto you, and that ears (that should hear the tale and) retain its memory should bear its (lessons) in remembrance. >>>>>>> >>>>>>> Then, when one blast is sounded on the Trumpet, >>>>>>> >>>>>>> And the earth is moved, and its mountains, and they are crushed to powder at one stroke,- >>>>>>> >>>>>>> On that Day shall the (Great) Event come to pass. >>>>>>> >>>>>>> And the sky will be rent asunder, for it will that Day be flimsy, >>>>>>> >>>>>>> And the angels will be on its sides, and eight will, that Day, bear the Throne of thy Lord above them. >>>>>>> >>>>>>> That Day shall ye be brought to Judgment: not an act of yours that ye hide will be hidden. >>>>>>> >>>>>>> Then he that will be given his Record in his right hand will say: "Ah here! Read ye my Record! >>>>>>> >>>>>>> "I did really understand that my Account would (One Day) reach me!" >>>>>>> >>>>>>> And he will be in a life of Bliss, >>>>>>> >>>>>>> In a Garden on high, >>>>>>> >>>>>>> The Fruits whereof (will hang in bunches) low and near. >>>>>>> >>>>>>> "Eat ye and drink ye, with full satisfaction; because of the (good) that ye sent before you, in the days that are gone!" >>>>>>> >>>>>>> And he that will be given his Record in his left hand, will say: "Ah! Would that my Record had not been given to me! >>>>>>> >>>>>>> "And that I had never realised how my account (stood)! >>>>>>> >>>>>>> "Ah! Would that (Death) had made an end of me! >>>>>>> >>>>>>> "Of no profit to me has been my wealth! >>>>>>> >>>>>>> "My power has perished from me!"... >>>>>>> >>>>>>> (The stern command will say): "Seize ye him, and bind ye him, >>>>>>> >>>>>>> "And burn ye him in the Blazing Fire. >>>>>>> >>>>>>> "Further, make him march in a chain, whereof the length is seventy cubits! >>>>>>> >>>>>>> "This was he that would not believe in Allah Most High. >>>>>>> >>>>>>> "And would not encourage the feeding of the indigent! >>>>>>> >>>>>>> "So no friend hath he here this Day. >>>>>>> >>>>>>> "Nor hath he any food except the corruption from the washing of wounds, >>>>>>> >>>>>>> "Which none do eat but those in sin." >>>>>>> >>>>>>> So I do call to witness what ye see, >>>>>>> >>>>>>> And what ye see not, >>>>>>> >>>>>>> That this is verily the word of an honoured messenger; >>>>>>> >>>>>>> It is not the word of a poet: little it is ye believe! >>>>>>> >>>>>>> Nor is it the word of a soothsayer: little admonition it is ye receive. >>>>>>> >>>>>>> (This is) a Message sent down from the Lord of the Worlds. >>>>>>> >>>>>>> And if the messenger were to invent any sayings in Our name, >>>>>>> >>>>>>> We should certainly seize him by his right hand, >>>>>>> >>>>>>> And We should certainly then cut off the artery of his heart: >>>>>>> >>>>>>> Nor could any of you withhold him (from Our wrath). >>>>>>> >>>>>>> But verily this is a Message for the Allah-fearing. >>>>>>> >>>>>>> And We certainly know that there are amongst you those that reject (it). >>>>>>> >>>>>>> But truly (Revelation) is a cause of sorrow for the Unbelievers. >>>>>>> >>>>>>> But verily it is Truth of assured certainty. >>>>>>> >>>>>>> So glorify the name of thy Lord Most High. >>>>>>> >>>>>>> ] - Quran 69:1-52 >>>>> >>>>> --- >>>>> >>>>> Slosher >>>>> Oriental, NC >>>>> >>>>>>> On 10/1/20 11:36 PM, Ron Teitelbaum wrote: >>>>>>> >>>>>>>> Hi Rob, >>>>>>>> >>>>>>>> I'm so sorry you felt that way. I know you have had major issues, you have said the same yourself. I'm always happy to see you come back even after long absences. You are a brilliant coder and it has been my distinct pleasure to work with you on Cryptography! Thank you for all you have done and indeed you are responsible for adding significant value to Squeak and the community. >>>>>>>> >>>>>>>> We all work on code and it's easy to work your ass off on something to make it work and forget where it originated. We all contribute in large and small ways to everything. If you started VMMaker thank you! It is definitely something a lot of us use. I remember learning all about it a long long time ago before I realized that while I could understand it and I could use it, the people that work on the VM are a level higher than me. I just make apps! >>>>>>>> >>>>>>>> I remember getting in an argument with Andreas about adding methods to collection. "WE DON"T NEED more methods in Collection we need to remove most of them and make it easier!" I argued with him about the value over and over but he insisted that they just didn't add enough value. I could have been put off. I could have assumed that Andreas didn't like me but I would have been very wrong! I was really honored to get the chance to work with him and we became great friends. Of course I added my methods to the code we were working on together and was so thrilled when he used my methods for his own code. >>>>>>>> >>>>>>>> I don't know what happened with VMMaker but again thank you for your participation in it.. I wanted to take a minute to thank you for your work and to let you know it is my honor to work with you too! I hope that you can come to terms with your past and that you get the help you need for your CPTSD. >>>>>>>> >>>>>>>> Everything is possible, the past is gone, but the future is still yours to shape. I wish the past was set in stone but even that moves and slips. I was talking to my wife about a party we attended: "Remember in 2000 we were at the party and counted down the new year and someone hit the breaker and killed the lights! We were all talking about what would happen in the year 2000, would everything break!" Great story except that I hadn't met my wife yet! The past is only what we remember but the future is something we have control over. Peace, calm, happyness, they are all hard to come by but they are possible. I wish you success in finding what makes your future better. >>>>>>>> >>>>>>>> I'm sorry about the bad things that have happened to you in the past. As far as I'm concerned, you are welcomed here! >>>>>>>> >>>>>>>> All the best, >>>>>>>> >>>>>>>> Ron Teitelbaum >>>>>>>> >>>>>>>> On Thu, Oct 1, 2020 at 10:38 PM Robert Withers via Squeak-dev wrote: >>>>>>>> >>>>>>>>> :sob::sob::sob: >>>>>>>>> >>>>>>>>> On 10/1/20 10:34 PM, Robert Withers wrote: >>>>>>>>> >>>>>>>>>> I wrote to the #general Squeak Slack channel: >>>>>>>>>> >>>>>>>>>>> What a complete larcenous bastard. 20 years ago, this month, published it as his own work. And been against me ever since. My CPTSD (100% veteran service-connected) comes with an exquisitely sensitive deception meter. There are those who shunned me and ostracized me and made me feel MOST UNWELCOME. For 20 years. My delusions kick in and I start suspecting back channel communications against me. My love for Squeak conflicted with what I knew was happening. but I hung in there and worked on Cryptography, work with a group of great people and that I am satisfied with its added value to Squeak. For 20 years I KNEW people were against me in the community. I cannot describe how negatively this affected me. My third suicide attempt, in 2007 I jumped off the roof of a 6 story apartment building and broke my back along with many bones. God did not want me to die, yet, so I lived. This deception and ostracism is most well highlighted by the taking credit for my work, without attribution. He is a complete tool. SHAME! >>>>>>>>>>> >>>>>>>>>>> I do not know the degree to which he spoke against me. Iimagineit was ever since 2000. Delusions! What is real? I knew not. So much torment! AGONY! They do not welcome me! They are trying to chase me off! Good grief, Charlie Brown. >>>>>>>>>>> >>>>>>>>>>> Severely exacerbated my CPTSD! I kept trying to kill myself because of it! I thought I had done something egregiously wrong. Whatever it was it had to be my fault. I was not feeling the love, even from myself. >>>>>>>>>>> >>>>>>>>>>> :scream: >>>>>>>>>>> >>>>>>>>>>> :scream: >>>>>>>>>>> >>>>>>>>>>> In 2017, 900 units of insulin brought my blood glucose below 40. I almost succeeded that time. >>>>>>>>>>> >>>>>>>>>>> :scream: >>>>>>>>>> >>>>>>>>>> rww >>>>>>>>>> >>>>>>>>>> On 10/1/20 8:55 PM, Robert Withers wrote: >>>>>>>>>> >>>>>>>>>>> The worst sort of person is one who takes the credit for the work of >>>>>>>>>>> another. Wouldn't you agree? >>>>>>>>>>> >>>>>>>>>>> You may wish to hear John's judgement on the matter. He was right there >>>>>>>>>>> when it was first built. >>>>>>>>>>> >>>>>>>>>>> If you are not humble you will be humiliated, and brought low. >>>>>>>>>>> >>>>>>>>>>> rww >>>>>>>>>>> >>>>>>>>>>> On 10/1/20 8:35 PM, tim Rowledge wrote: >>>>>>>>>>> >>>>>>>>>>>>> On 2020-10-01, at 4:57 PM, Robert Withers via Squeak-dev >>>>>>>>>>>>> [](mailto:squeak-dev at lists.squeakfoundation.org) >>>>>>>>>>>>> wrote: >>>>>>>>>>>>> >>>>>>>>>>>>> I am curious. Who was the original author of the VMMaker Tool? >>>>>>>>>>>> >>>>>>>>>>>> That would be me; back in exobox days. Written along with the original VMMaker and intended to be an example of clean, tidy, morphic usage. I've no idea if anyone ever uses it now, since running it via scripting has proven more valuable. >>>>>>>>>>>> >>>>>>>>>>>> tim >>>>>>>>>>>> -- >>>>>>>>>>>> tim Rowledge; >>>>>>>>>>>> tim at rowledge.org >>>>>>>>>>>> ; >>>>>>>>>>>> http://www.rowledge.org/tim >>>>>>>>>>>> "Wibble" said Pooh the stress beginning to show. >>>>>>>>>> >>>>>>>>>> -- >>>>>>>>>> K, r >>>>>>>>> >>>>>>>>> -- >>>>>>>>> K, r >>>>>>> >>>>>>> -- >>>>>>> K, r >>>>>> >>>>>> -- >>>>>> K, r >>>>> >>>>> -- >>>>> K, r >>>> >>>> -- >>>> K, r >> >> -- >> K, r > > -- > K, r -- K, r -------------- next part -------------- An HTML attachment was scrubbed... URL: -------------- next part -------------- A non-text attachment was scrubbed... Name: 7420963_20200328125416581_1_LARGE.jpg Type: image/jpeg Size: 47844 bytes Desc: not available URL: From robert.withers at pm.me Fri Oct 2 06:50:34 2020 From: robert.withers at pm.me (Robert Withers) Date: Fri, 02 Oct 2020 06:50:34 +0000 Subject: [squeak-dev] Curious history In-Reply-To: <440a94ec-9f74-4390-e952-98719584e0d8@pm.me> References: <4RzffQkMYVDio5ypO3BdDDogbcHCBBrlCc1fxoT8GmqCUWhN0sU9yBdJfjTNNuM4-qL-oLkLcIB--mYjPkf0Lg==@protonmail.conversationid> <53e5af96-c60c-4361-e3df-0539863bee2e@pm.me> <-uzl7ag_j_CRb0Dx-6VVjqrL4-a3CnYqRa5dEC6qPxjnGUdCMWM0Yc05veexN9Kt00ltx34oiQtC80FTDh-HUQ==@protonmail.internalid> <68481afd-2d10-e85b-29be-f2ac9546388e@pm.me> <440a94ec-9f74-4390-e952-98719584e0d8@pm.me> Message-ID: https://soundcloud.com/robert_withers/rasta https://soundcloud.com/robert_withers/mando On 10/2/20 2:39 AM, Robert Withers wrote: > Play a bit of these spicy beats! The music helps me to express what is on the inside. > > https://youtu.be/3q8nGnls1Ow?t=2711 > > On 10/2/20 2:26 AM, Robert Withers wrote: > >> For I will restore health unto thee, and I will heal thee of thy wounds, saith the Lord; because they called thee an Outcast, saying, This is Zion, whom no man seeketh after. >> >> Jeremiah 30:17 >> >> On 10/2/20 2:22 AM, Robert Withers via Squeak-dev wrote: >> >>> Thank you for reaching out in this manner on these issues. Though be ye not concerned for my health, Ron, I am in a good place. The sobbing really helps a LOT! And I was brought to that tonight after screaming! And discussing a couple of my many suicide attempts. And realizing the effect my not finding a home with Squeak had affected me over 20 years. It hurts! I sob. All is well; God is Good. The Truth heals. All praise to the Most High! >>> >>> Kindly, >>> Rob >>> >>> On 10/2/20 2:16 AM, Ron Teitelbaum wrote: >>> >>>> Rob, >>>> >>>> You have been in this place before. Is there someone you can talk to for help? Do you have a connection to someone that is working with you on your issues? Would you consider calling them now? >>>> >>>> I've seen you here before. I've seen you doing much better. You should be good to yourself and get help now to move into calmer water and get on a more even keel. A better future includes protecting yourself, being nice to yourself, and making sure you get help when you need it. >>>> >>>> Don't wait until later. I really recommend you do it now. >>>> >>>> Ron >>>> >>>> On Fri, Oct 2, 2020 at 1:50 AM Robert Withers wrote: >>>> >>>>> "And would not encourage the feeding of the indigent!" >>>>> >>>>> On 10/2/20 12:21 AM, Robert Withers wrote: >>>>> >>>>>> The Hellfire and its occupants, not my problem. I pay no attention. Burn. >>>>>> >>>>>> I "Will be in a life of bliss, In a Garden on high. The Fruits whereof"... >>>>>> >>>>>> --------------------------------------------------------------- >>>>>> >>>>>> Al Haqqah (69) >>>>>> >>>>>>>> [The Sure Reality! >>>>>>>> >>>>>>>> What is the Sure Reality? >>>>>>>> >>>>>>>> And what will make thee realise what the Sure Reality is? >>>>>>>> >>>>>>>> The Thamud and the 'Ad People (branded) as false the Stunning Calamity! >>>>>>>> >>>>>>>> But the Thamud,- they were destroyed by a terrible Storm of thunder and lightning! >>>>>>>> >>>>>>>> And the 'Ad, they were destroyed by a furious Wind, exceedingly violent; >>>>>>>> >>>>>>>> He made it rage against them seven nights and eight days in succession: so that thou couldst see the (whole) people lying prostrate in its (path), as they had been roots of hollow palm-trees tumbled down! >>>>>>>> >>>>>>>> Then seest thou any of them left surviving? >>>>>>>> >>>>>>>> And Pharaoh, and those before him, and the Cities Overthrown, committed habitual Sin. >>>>>>>> >>>>>>>> And disobeyed (each) the messenger of their Lord; so He punished them with an abundant Penalty. >>>>>>>> >>>>>>>> We, when the water (of Noah's Flood) overflowed beyond its limits, carried you (mankind), in the floating (Ark), >>>>>>>> >>>>>>>> That We might make it a Message unto you, and that ears (that should hear the tale and) retain its memory should bear its (lessons) in remembrance. >>>>>>>> >>>>>>>> Then, when one blast is sounded on the Trumpet, >>>>>>>> >>>>>>>> And the earth is moved, and its mountains, and they are crushed to powder at one stroke,- >>>>>>>> >>>>>>>> On that Day shall the (Great) Event come to pass. >>>>>>>> >>>>>>>> And the sky will be rent asunder, for it will that Day be flimsy, >>>>>>>> >>>>>>>> And the angels will be on its sides, and eight will, that Day, bear the Throne of thy Lord above them. >>>>>>>> >>>>>>>> That Day shall ye be brought to Judgment: not an act of yours that ye hide will be hidden. >>>>>>>> >>>>>>>> Then he that will be given his Record in his right hand will say: "Ah here! Read ye my Record! >>>>>>>> >>>>>>>> "I did really understand that my Account would (One Day) reach me!" >>>>>>>> >>>>>>>> And he will be in a life of Bliss, >>>>>>>> >>>>>>>> In a Garden on high, >>>>>>>> >>>>>>>> The Fruits whereof (will hang in bunches) low and near. >>>>>>>> >>>>>>>> "Eat ye and drink ye, with full satisfaction; because of the (good) that ye sent before you, in the days that are gone!" >>>>>>>> >>>>>>>> And he that will be given his Record in his left hand, will say: "Ah! Would that my Record had not been given to me! >>>>>>>> >>>>>>>> "And that I had never realised how my account (stood)! >>>>>>>> >>>>>>>> "Ah! Would that (Death) had made an end of me! >>>>>>>> >>>>>>>> "Of no profit to me has been my wealth! >>>>>>>> >>>>>>>> "My power has perished from me!"... >>>>>>>> >>>>>>>> (The stern command will say): "Seize ye him, and bind ye him, >>>>>>>> >>>>>>>> "And burn ye him in the Blazing Fire. >>>>>>>> >>>>>>>> "Further, make him march in a chain, whereof the length is seventy cubits! >>>>>>>> >>>>>>>> "This was he that would not believe in Allah Most High. >>>>>>>> >>>>>>>> "And would not encourage the feeding of the indigent! >>>>>>>> >>>>>>>> "So no friend hath he here this Day. >>>>>>>> >>>>>>>> "Nor hath he any food except the corruption from the washing of wounds, >>>>>>>> >>>>>>>> "Which none do eat but those in sin." >>>>>>>> >>>>>>>> So I do call to witness what ye see, >>>>>>>> >>>>>>>> And what ye see not, >>>>>>>> >>>>>>>> That this is verily the word of an honoured messenger; >>>>>>>> >>>>>>>> It is not the word of a poet: little it is ye believe! >>>>>>>> >>>>>>>> Nor is it the word of a soothsayer: little admonition it is ye receive. >>>>>>>> >>>>>>>> (This is) a Message sent down from the Lord of the Worlds. >>>>>>>> >>>>>>>> And if the messenger were to invent any sayings in Our name, >>>>>>>> >>>>>>>> We should certainly seize him by his right hand, >>>>>>>> >>>>>>>> And We should certainly then cut off the artery of his heart: >>>>>>>> >>>>>>>> Nor could any of you withhold him (from Our wrath). >>>>>>>> >>>>>>>> But verily this is a Message for the Allah-fearing. >>>>>>>> >>>>>>>> And We certainly know that there are amongst you those that reject (it). >>>>>>>> >>>>>>>> But truly (Revelation) is a cause of sorrow for the Unbelievers. >>>>>>>> >>>>>>>> But verily it is Truth of assured certainty. >>>>>>>> >>>>>>>> So glorify the name of thy Lord Most High. >>>>>>>> >>>>>>>> ] - Quran 69:1-52 >>>>>> >>>>>> --- >>>>>> >>>>>> Slosher >>>>>> Oriental, NC >>>>>> >>>>>>>> On 10/1/20 11:36 PM, Ron Teitelbaum wrote: >>>>>>>> >>>>>>>>> Hi Rob, >>>>>>>>> >>>>>>>>> I'm so sorry you felt that way. I know you have had major issues, you have said the same yourself. I'm always happy to see you come back even after long absences. You are a brilliant coder and it has been my distinct pleasure to work with you on Cryptography! Thank you for all you have done and indeed you are responsible for adding significant value to Squeak and the community. >>>>>>>>> >>>>>>>>> We all work on code and it's easy to work your ass off on something to make it work and forget where it originated. We all contribute in large and small ways to everything. If you started VMMaker thank you! It is definitely something a lot of us use. I remember learning all about it a long long time ago before I realized that while I could understand it and I could use it, the people that work on the VM are a level higher than me. I just make apps! >>>>>>>>> >>>>>>>>> I remember getting in an argument with Andreas about adding methods to collection. "WE DON"T NEED more methods in Collection we need to remove most of them and make it easier!" I argued with him about the value over and over but he insisted that they just didn't add enough value. I could have been put off. I could have assumed that Andreas didn't like me but I would have been very wrong! I was really honored to get the chance to work with him and we became great friends. Of course I added my methods to the code we were working on together and was so thrilled when he used my methods for his own code. >>>>>>>>> >>>>>>>>> I don't know what happened with VMMaker but again thank you for your participation in it.. I wanted to take a minute to thank you for your work and to let you know it is my honor to work with you too! I hope that you can come to terms with your past and that you get the help you need for your CPTSD. >>>>>>>>> >>>>>>>>> Everything is possible, the past is gone, but the future is still yours to shape. I wish the past was set in stone but even that moves and slips. I was talking to my wife about a party we attended: "Remember in 2000 we were at the party and counted down the new year and someone hit the breaker and killed the lights! We were all talking about what would happen in the year 2000, would everything break!" Great story except that I hadn't met my wife yet! The past is only what we remember but the future is something we have control over. Peace, calm, happyness, they are all hard to come by but they are possible. I wish you success in finding what makes your future better. >>>>>>>>> >>>>>>>>> I'm sorry about the bad things that have happened to you in the past. As far as I'm concerned, you are welcomed here! >>>>>>>>> >>>>>>>>> All the best, >>>>>>>>> >>>>>>>>> Ron Teitelbaum >>>>>>>>> >>>>>>>>> On Thu, Oct 1, 2020 at 10:38 PM Robert Withers via Squeak-dev wrote: >>>>>>>>> >>>>>>>>>> :sob::sob::sob: >>>>>>>>>> >>>>>>>>>> On 10/1/20 10:34 PM, Robert Withers wrote: >>>>>>>>>> >>>>>>>>>>> I wrote to the #general Squeak Slack channel: >>>>>>>>>>> >>>>>>>>>>>> What a complete larcenous bastard. 20 years ago, this month, published it as his own work. And been against me ever since. My CPTSD (100% veteran service-connected) comes with an exquisitely sensitive deception meter. There are those who shunned me and ostracized me and made me feel MOST UNWELCOME. For 20 years. My delusions kick in and I start suspecting back channel communications against me. My love for Squeak conflicted with what I knew was happening. but I hung in there and worked on Cryptography, work with a group of great people and that I am satisfied with its added value to Squeak. For 20 years I KNEW people were against me in the community. I cannot describe how negatively this affected me. My third suicide attempt, in 2007 I jumped off the roof of a 6 story apartment building and broke my back along with many bones. God did not want me to die, yet, so I lived. This deception and ostracism is most well highlighted by the taking credit for my work, without attribution. He is a complete tool. SHAME! >>>>>>>>>>>> >>>>>>>>>>>> I do not know the degree to which he spoke against me. Iimagineit was ever since 2000. Delusions! What is real? I knew not. So much torment! AGONY! They do not welcome me! They are trying to chase me off! Good grief, Charlie Brown. >>>>>>>>>>>> >>>>>>>>>>>> Severely exacerbated my CPTSD! I kept trying to kill myself because of it! I thought I had done something egregiously wrong. Whatever it was it had to be my fault. I was not feeling the love, even from myself. >>>>>>>>>>>> >>>>>>>>>>>> :scream: >>>>>>>>>>>> >>>>>>>>>>>> :scream: >>>>>>>>>>>> >>>>>>>>>>>> In 2017, 900 units of insulin brought my blood glucose below 40. I almost succeeded that time. >>>>>>>>>>>> >>>>>>>>>>>> :scream: >>>>>>>>>>> >>>>>>>>>>> rww >>>>>>>>>>> >>>>>>>>>>> On 10/1/20 8:55 PM, Robert Withers wrote: >>>>>>>>>>> >>>>>>>>>>>> The worst sort of person is one who takes the credit for the work of >>>>>>>>>>>> another. Wouldn't you agree? >>>>>>>>>>>> >>>>>>>>>>>> You may wish to hear John's judgement on the matter. He was right there >>>>>>>>>>>> when it was first built. >>>>>>>>>>>> >>>>>>>>>>>> If you are not humble you will be humiliated, and brought low. >>>>>>>>>>>> >>>>>>>>>>>> rww >>>>>>>>>>>> >>>>>>>>>>>> On 10/1/20 8:35 PM, tim Rowledge wrote: >>>>>>>>>>>> >>>>>>>>>>>>>> On 2020-10-01, at 4:57 PM, Robert Withers via Squeak-dev >>>>>>>>>>>>>> [](mailto:squeak-dev at lists.squeakfoundation.org) >>>>>>>>>>>>>> wrote: >>>>>>>>>>>>>> >>>>>>>>>>>>>> I am curious. Who was the original author of the VMMaker Tool? >>>>>>>>>>>>> >>>>>>>>>>>>> That would be me; back in exobox days. Written along with the original VMMaker and intended to be an example of clean, tidy, morphic usage. I've no idea if anyone ever uses it now, since running it via scripting has proven more valuable. >>>>>>>>>>>>> >>>>>>>>>>>>> tim >>>>>>>>>>>>> -- >>>>>>>>>>>>> tim Rowledge; >>>>>>>>>>>>> tim at rowledge.org >>>>>>>>>>>>> ; >>>>>>>>>>>>> http://www.rowledge.org/tim >>>>>>>>>>>>> "Wibble" said Pooh the stress beginning to show. >>>>>>>>>>> >>>>>>>>>>> -- >>>>>>>>>>> K, r >>>>>>>>>> >>>>>>>>>> -- >>>>>>>>>> K, r >>>>>>>> >>>>>>>> -- >>>>>>>> K, r >>>>>>> >>>>>>> -- >>>>>>> K, r >>>>>> >>>>>> -- >>>>>> K, r >>>>> >>>>> -- >>>>> K, r >>> >>> -- >>> K, r >> >> -- >> K, r > > -- > K, r -- K, r -------------- next part -------------- An HTML attachment was scrubbed... URL: -------------- next part -------------- A non-text attachment was scrubbed... Name: 7420963_20200328125416581_1_LARGE.jpg Type: image/jpeg Size: 47844 bytes Desc: not available URL: From robert.withers at pm.me Fri Oct 2 07:03:26 2020 From: robert.withers at pm.me (Robert Withers) Date: Fri, 02 Oct 2020 07:03:26 +0000 Subject: [squeak-dev] Curious history In-Reply-To: References: <4RzffQkMYVDio5ypO3BdDDogbcHCBBrlCc1fxoT8GmqCUWhN0sU9yBdJfjTNNuM4-qL-oLkLcIB--mYjPkf0Lg==@protonmail.conversationid> <53e5af96-c60c-4361-e3df-0539863bee2e@pm.me> <-uzl7ag_j_CRb0Dx-6VVjqrL4-a3CnYqRa5dEC6qPxjnGUdCMWM0Yc05veexN9Kt00ltx34oiQtC80FTDh-HUQ==@protonmail.internalid> <68481afd-2d10-e85b-29be-f2ac9546388e@pm.me> <440a94ec-9f74-4390-e952-98719584e0d8@pm.me> Message-ID: Gotta meditate to this entire run! It's deep. https://soundcloud.com/yusuke-mizushima/acid-jazz-mix-jazzual-suspects On 10/2/20 2:50 AM, Robert Withers via Squeak-dev wrote: > https://soundcloud.com/robert_withers/rasta > > https://soundcloud.com/robert_withers/mando > > On 10/2/20 2:39 AM, Robert Withers wrote: > >> Play a bit of these spicy beats! The music helps me to express what is on the inside. >> >> https://youtu.be/3q8nGnls1Ow?t=2711 >> >> On 10/2/20 2:26 AM, Robert Withers wrote: >> >>> For I will restore health unto thee, and I will heal thee of thy wounds, saith the Lord; because they called thee an Outcast, saying, This is Zion, whom no man seeketh after. >>> >>> Jeremiah 30:17 >>> >>> On 10/2/20 2:22 AM, Robert Withers via Squeak-dev wrote: >>> >>>> Thank you for reaching out in this manner on these issues. Though be ye not concerned for my health, Ron, I am in a good place. The sobbing really helps a LOT! And I was brought to that tonight after screaming! And discussing a couple of my many suicide attempts. And realizing the effect my not finding a home with Squeak had affected me over 20 years. It hurts! I sob. All is well; God is Good. The Truth heals. All praise to the Most High! >>>> >>>> Kindly, >>>> Rob >>>> >>>> On 10/2/20 2:16 AM, Ron Teitelbaum wrote: >>>> >>>>> Rob, >>>>> >>>>> You have been in this place before. Is there someone you can talk to for help? Do you have a connection to someone that is working with you on your issues? Would you consider calling them now? >>>>> >>>>> I've seen you here before. I've seen you doing much better. You should be good to yourself and get help now to move into calmer water and get on a more even keel. A better future includes protecting yourself, being nice to yourself, and making sure you get help when you need it. >>>>> >>>>> Don't wait until later. I really recommend you do it now. >>>>> >>>>> Ron >>>>> >>>>> On Fri, Oct 2, 2020 at 1:50 AM Robert Withers wrote: >>>>> >>>>>> "And would not encourage the feeding of the indigent!" >>>>>> >>>>>> On 10/2/20 12:21 AM, Robert Withers wrote: >>>>>> >>>>>>> The Hellfire and its occupants, not my problem. I pay no attention. Burn. >>>>>>> >>>>>>> I "Will be in a life of bliss, In a Garden on high. The Fruits whereof"... >>>>>>> >>>>>>> --------------------------------------------------------------- >>>>>>> >>>>>>> Al Haqqah (69) >>>>>>> >>>>>>>>> [The Sure Reality! >>>>>>>>> >>>>>>>>> What is the Sure Reality? >>>>>>>>> >>>>>>>>> And what will make thee realise what the Sure Reality is? >>>>>>>>> >>>>>>>>> The Thamud and the 'Ad People (branded) as false the Stunning Calamity! >>>>>>>>> >>>>>>>>> But the Thamud,- they were destroyed by a terrible Storm of thunder and lightning! >>>>>>>>> >>>>>>>>> And the 'Ad, they were destroyed by a furious Wind, exceedingly violent; >>>>>>>>> >>>>>>>>> He made it rage against them seven nights and eight days in succession: so that thou couldst see the (whole) people lying prostrate in its (path), as they had been roots of hollow palm-trees tumbled down! >>>>>>>>> >>>>>>>>> Then seest thou any of them left surviving? >>>>>>>>> >>>>>>>>> And Pharaoh, and those before him, and the Cities Overthrown, committed habitual Sin. >>>>>>>>> >>>>>>>>> And disobeyed (each) the messenger of their Lord; so He punished them with an abundant Penalty. >>>>>>>>> >>>>>>>>> We, when the water (of Noah's Flood) overflowed beyond its limits, carried you (mankind), in the floating (Ark), >>>>>>>>> >>>>>>>>> That We might make it a Message unto you, and that ears (that should hear the tale and) retain its memory should bear its (lessons) in remembrance. >>>>>>>>> >>>>>>>>> Then, when one blast is sounded on the Trumpet, >>>>>>>>> >>>>>>>>> And the earth is moved, and its mountains, and they are crushed to powder at one stroke,- >>>>>>>>> >>>>>>>>> On that Day shall the (Great) Event come to pass. >>>>>>>>> >>>>>>>>> And the sky will be rent asunder, for it will that Day be flimsy, >>>>>>>>> >>>>>>>>> And the angels will be on its sides, and eight will, that Day, bear the Throne of thy Lord above them. >>>>>>>>> >>>>>>>>> That Day shall ye be brought to Judgment: not an act of yours that ye hide will be hidden. >>>>>>>>> >>>>>>>>> Then he that will be given his Record in his right hand will say: "Ah here! Read ye my Record! >>>>>>>>> >>>>>>>>> "I did really understand that my Account would (One Day) reach me!" >>>>>>>>> >>>>>>>>> And he will be in a life of Bliss, >>>>>>>>> >>>>>>>>> In a Garden on high, >>>>>>>>> >>>>>>>>> The Fruits whereof (will hang in bunches) low and near. >>>>>>>>> >>>>>>>>> "Eat ye and drink ye, with full satisfaction; because of the (good) that ye sent before you, in the days that are gone!" >>>>>>>>> >>>>>>>>> And he that will be given his Record in his left hand, will say: "Ah! Would that my Record had not been given to me! >>>>>>>>> >>>>>>>>> "And that I had never realised how my account (stood)! >>>>>>>>> >>>>>>>>> "Ah! Would that (Death) had made an end of me! >>>>>>>>> >>>>>>>>> "Of no profit to me has been my wealth! >>>>>>>>> >>>>>>>>> "My power has perished from me!"... >>>>>>>>> >>>>>>>>> (The stern command will say): "Seize ye him, and bind ye him, >>>>>>>>> >>>>>>>>> "And burn ye him in the Blazing Fire. >>>>>>>>> >>>>>>>>> "Further, make him march in a chain, whereof the length is seventy cubits! >>>>>>>>> >>>>>>>>> "This was he that would not believe in Allah Most High. >>>>>>>>> >>>>>>>>> "And would not encourage the feeding of the indigent! >>>>>>>>> >>>>>>>>> "So no friend hath he here this Day. >>>>>>>>> >>>>>>>>> "Nor hath he any food except the corruption from the washing of wounds, >>>>>>>>> >>>>>>>>> "Which none do eat but those in sin." >>>>>>>>> >>>>>>>>> So I do call to witness what ye see, >>>>>>>>> >>>>>>>>> And what ye see not, >>>>>>>>> >>>>>>>>> That this is verily the word of an honoured messenger; >>>>>>>>> >>>>>>>>> It is not the word of a poet: little it is ye believe! >>>>>>>>> >>>>>>>>> Nor is it the word of a soothsayer: little admonition it is ye receive. >>>>>>>>> >>>>>>>>> (This is) a Message sent down from the Lord of the Worlds. >>>>>>>>> >>>>>>>>> And if the messenger were to invent any sayings in Our name, >>>>>>>>> >>>>>>>>> We should certainly seize him by his right hand, >>>>>>>>> >>>>>>>>> And We should certainly then cut off the artery of his heart: >>>>>>>>> >>>>>>>>> Nor could any of you withhold him (from Our wrath). >>>>>>>>> >>>>>>>>> But verily this is a Message for the Allah-fearing. >>>>>>>>> >>>>>>>>> And We certainly know that there are amongst you those that reject (it). >>>>>>>>> >>>>>>>>> But truly (Revelation) is a cause of sorrow for the Unbelievers. >>>>>>>>> >>>>>>>>> But verily it is Truth of assured certainty. >>>>>>>>> >>>>>>>>> So glorify the name of thy Lord Most High. >>>>>>>>> >>>>>>>>> ] - Quran 69:1-52 >>>>>>> >>>>>>> --- >>>>>>> >>>>>>> Slosher >>>>>>> Oriental, NC >>>>>>> >>>>>>>>> On 10/1/20 11:36 PM, Ron Teitelbaum wrote: >>>>>>>>> >>>>>>>>>> Hi Rob, >>>>>>>>>> >>>>>>>>>> I'm so sorry you felt that way. I know you have had major issues, you have said the same yourself. I'm always happy to see you come back even after long absences. You are a brilliant coder and it has been my distinct pleasure to work with you on Cryptography! Thank you for all you have done and indeed you are responsible for adding significant value to Squeak and the community. >>>>>>>>>> >>>>>>>>>> We all work on code and it's easy to work your ass off on something to make it work and forget where it originated. We all contribute in large and small ways to everything. If you started VMMaker thank you! It is definitely something a lot of us use. I remember learning all about it a long long time ago before I realized that while I could understand it and I could use it, the people that work on the VM are a level higher than me. I just make apps! >>>>>>>>>> >>>>>>>>>> I remember getting in an argument with Andreas about adding methods to collection. "WE DON"T NEED more methods in Collection we need to remove most of them and make it easier!" I argued with him about the value over and over but he insisted that they just didn't add enough value. I could have been put off. I could have assumed that Andreas didn't like me but I would have been very wrong! I was really honored to get the chance to work with him and we became great friends. Of course I added my methods to the code we were working on together and was so thrilled when he used my methods for his own code. >>>>>>>>>> >>>>>>>>>> I don't know what happened with VMMaker but again thank you for your participation in it.. I wanted to take a minute to thank you for your work and to let you know it is my honor to work with you too! I hope that you can come to terms with your past and that you get the help you need for your CPTSD. >>>>>>>>>> >>>>>>>>>> Everything is possible, the past is gone, but the future is still yours to shape. I wish the past was set in stone but even that moves and slips. I was talking to my wife about a party we attended: "Remember in 2000 we were at the party and counted down the new year and someone hit the breaker and killed the lights! We were all talking about what would happen in the year 2000, would everything break!" Great story except that I hadn't met my wife yet! The past is only what we remember but the future is something we have control over. Peace, calm, happyness, they are all hard to come by but they are possible. I wish you success in finding what makes your future better. >>>>>>>>>> >>>>>>>>>> I'm sorry about the bad things that have happened to you in the past. As far as I'm concerned, you are welcomed here! >>>>>>>>>> >>>>>>>>>> All the best, >>>>>>>>>> >>>>>>>>>> Ron Teitelbaum >>>>>>>>>> >>>>>>>>>> On Thu, Oct 1, 2020 at 10:38 PM Robert Withers via Squeak-dev wrote: >>>>>>>>>> >>>>>>>>>>> :sob::sob::sob: >>>>>>>>>>> >>>>>>>>>>> On 10/1/20 10:34 PM, Robert Withers wrote: >>>>>>>>>>> >>>>>>>>>>>> I wrote to the #general Squeak Slack channel: >>>>>>>>>>>> >>>>>>>>>>>>> What a complete larcenous bastard. 20 years ago, this month, published it as his own work. And been against me ever since. My CPTSD (100% veteran service-connected) comes with an exquisitely sensitive deception meter. There are those who shunned me and ostracized me and made me feel MOST UNWELCOME. For 20 years. My delusions kick in and I start suspecting back channel communications against me. My love for Squeak conflicted with what I knew was happening. but I hung in there and worked on Cryptography, work with a group of great people and that I am satisfied with its added value to Squeak. For 20 years I KNEW people were against me in the community. I cannot describe how negatively this affected me. My third suicide attempt, in 2007 I jumped off the roof of a 6 story apartment building and broke my back along with many bones. God did not want me to die, yet, so I lived. This deception and ostracism is most well highlighted by the taking credit for my work, without attribution. He is a complete tool. SHAME! >>>>>>>>>>>>> >>>>>>>>>>>>> I do not know the degree to which he spoke against me. Iimagineit was ever since 2000. Delusions! What is real? I knew not. So much torment! AGONY! They do not welcome me! They are trying to chase me off! Good grief, Charlie Brown. >>>>>>>>>>>>> >>>>>>>>>>>>> Severely exacerbated my CPTSD! I kept trying to kill myself because of it! I thought I had done something egregiously wrong. Whatever it was it had to be my fault. I was not feeling the love, even from myself. >>>>>>>>>>>>> >>>>>>>>>>>>> :scream: >>>>>>>>>>>>> >>>>>>>>>>>>> :scream: >>>>>>>>>>>>> >>>>>>>>>>>>> In 2017, 900 units of insulin brought my blood glucose below 40. I almost succeeded that time. >>>>>>>>>>>>> >>>>>>>>>>>>> :scream: >>>>>>>>>>>> >>>>>>>>>>>> rww >>>>>>>>>>>> >>>>>>>>>>>> On 10/1/20 8:55 PM, Robert Withers wrote: >>>>>>>>>>>> >>>>>>>>>>>>> The worst sort of person is one who takes the credit for the work of >>>>>>>>>>>>> another. Wouldn't you agree? >>>>>>>>>>>>> >>>>>>>>>>>>> You may wish to hear John's judgement on the matter. He was right there >>>>>>>>>>>>> when it was first built. >>>>>>>>>>>>> >>>>>>>>>>>>> If you are not humble you will be humiliated, and brought low. >>>>>>>>>>>>> >>>>>>>>>>>>> rww >>>>>>>>>>>>> >>>>>>>>>>>>> On 10/1/20 8:35 PM, tim Rowledge wrote: >>>>>>>>>>>>> >>>>>>>>>>>>>>> On 2020-10-01, at 4:57 PM, Robert Withers via Squeak-dev >>>>>>>>>>>>>>> [](mailto:squeak-dev at lists.squeakfoundation.org) >>>>>>>>>>>>>>> wrote: >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> I am curious. Who was the original author of the VMMaker Tool? >>>>>>>>>>>>>> >>>>>>>>>>>>>> That would be me; back in exobox days. Written along with the original VMMaker and intended to be an example of clean, tidy, morphic usage. I've no idea if anyone ever uses it now, since running it via scripting has proven more valuable. >>>>>>>>>>>>>> >>>>>>>>>>>>>> tim >>>>>>>>>>>>>> -- >>>>>>>>>>>>>> tim Rowledge; >>>>>>>>>>>>>> tim at rowledge.org >>>>>>>>>>>>>> ; >>>>>>>>>>>>>> http://www.rowledge.org/tim >>>>>>>>>>>>>> "Wibble" said Pooh the stress beginning to show. >>>>>>>>>>>> >>>>>>>>>>>> -- >>>>>>>>>>>> K, r >>>>>>>>>>> >>>>>>>>>>> -- >>>>>>>>>>> K, r >>>>>>>>> >>>>>>>>> -- >>>>>>>>> K, r >>>>>>>> >>>>>>>> -- >>>>>>>> K, r >>>>>>> >>>>>>> -- >>>>>>> K, r >>>>>> >>>>>> -- >>>>>> K, r >>>> >>>> -- >>>> K, r >>> >>> -- >>> K, r >> >> -- >> K, r > > -- > K, r -- K, r -------------- next part -------------- An HTML attachment was scrubbed... URL: -------------- next part -------------- A non-text attachment was scrubbed... Name: 7420963_20200328125416581_1_LARGE.jpg Type: image/jpeg Size: 47844 bytes Desc: not available URL: From robert.withers at pm.me Fri Oct 2 07:07:13 2020 From: robert.withers at pm.me (Robert Withers) Date: Fri, 02 Oct 2020 07:07:13 +0000 Subject: [squeak-dev] Curious history In-Reply-To: References: <4RzffQkMYVDio5ypO3BdDDogbcHCBBrlCc1fxoT8GmqCUWhN0sU9yBdJfjTNNuM4-qL-oLkLcIB--mYjPkf0Lg==@protonmail.conversationid> <53e5af96-c60c-4361-e3df-0539863bee2e@pm.me> <-uzl7ag_j_CRb0Dx-6VVjqrL4-a3CnYqRa5dEC6qPxjnGUdCMWM0Yc05veexN9Kt00ltx34oiQtC80FTDh-HUQ==@protonmail.internalid> <68481afd-2d10-e85b-29be-f2ac9546388e@pm.me> <440a94ec-9f74-4390-e952-98719584e0d8@pm.me> Message-ID: I haven't heard from sparky, recently. Has anyone? On 10/2/20 3:03 AM, Robert Withers wrote: > Gotta meditate to this entire run! It's deep. > > https://soundcloud.com/yusuke-mizushima/acid-jazz-mix-jazzual-suspects > > On 10/2/20 2:50 AM, Robert Withers via Squeak-dev wrote: > >> https://soundcloud.com/robert_withers/rasta >> >> https://soundcloud.com/robert_withers/mando >> >> On 10/2/20 2:39 AM, Robert Withers wrote: >> >>> Play a bit of these spicy beats! The music helps me to express what is on the inside. >>> >>> https://youtu.be/3q8nGnls1Ow?t=2711 >>> >>> On 10/2/20 2:26 AM, Robert Withers wrote: >>> >>>> For I will restore health unto thee, and I will heal thee of thy wounds, saith the Lord; because they called thee an Outcast, saying, This is Zion, whom no man seeketh after. >>>> >>>> Jeremiah 30:17 >>>> >>>> On 10/2/20 2:22 AM, Robert Withers via Squeak-dev wrote: >>>> >>>>> Thank you for reaching out in this manner on these issues. Though be ye not concerned for my health, Ron, I am in a good place. The sobbing really helps a LOT! And I was brought to that tonight after screaming! And discussing a couple of my many suicide attempts. And realizing the effect my not finding a home with Squeak had affected me over 20 years. It hurts! I sob. All is well; God is Good. The Truth heals. All praise to the Most High! >>>>> >>>>> Kindly, >>>>> Rob >>>>> >>>>> On 10/2/20 2:16 AM, Ron Teitelbaum wrote: >>>>> >>>>>> Rob, >>>>>> >>>>>> You have been in this place before. Is there someone you can talk to for help? Do you have a connection to someone that is working with you on your issues? Would you consider calling them now? >>>>>> >>>>>> I've seen you here before. I've seen you doing much better. You should be good to yourself and get help now to move into calmer water and get on a more even keel. A better future includes protecting yourself, being nice to yourself, and making sure you get help when you need it. >>>>>> >>>>>> Don't wait until later. I really recommend you do it now. >>>>>> >>>>>> Ron >>>>>> >>>>>> On Fri, Oct 2, 2020 at 1:50 AM Robert Withers wrote: >>>>>> >>>>>>> "And would not encourage the feeding of the indigent!" >>>>>>> >>>>>>> On 10/2/20 12:21 AM, Robert Withers wrote: >>>>>>> >>>>>>>> The Hellfire and its occupants, not my problem. I pay no attention. Burn. >>>>>>>> >>>>>>>> I "Will be in a life of bliss, In a Garden on high. The Fruits whereof"... >>>>>>>> >>>>>>>> --------------------------------------------------------------- >>>>>>>> >>>>>>>> Al Haqqah (69) >>>>>>>> >>>>>>>>>> [The Sure Reality! >>>>>>>>>> >>>>>>>>>> What is the Sure Reality? >>>>>>>>>> >>>>>>>>>> And what will make thee realise what the Sure Reality is? >>>>>>>>>> >>>>>>>>>> The Thamud and the 'Ad People (branded) as false the Stunning Calamity! >>>>>>>>>> >>>>>>>>>> But the Thamud,- they were destroyed by a terrible Storm of thunder and lightning! >>>>>>>>>> >>>>>>>>>> And the 'Ad, they were destroyed by a furious Wind, exceedingly violent; >>>>>>>>>> >>>>>>>>>> He made it rage against them seven nights and eight days in succession: so that thou couldst see the (whole) people lying prostrate in its (path), as they had been roots of hollow palm-trees tumbled down! >>>>>>>>>> >>>>>>>>>> Then seest thou any of them left surviving? >>>>>>>>>> >>>>>>>>>> And Pharaoh, and those before him, and the Cities Overthrown, committed habitual Sin. >>>>>>>>>> >>>>>>>>>> And disobeyed (each) the messenger of their Lord; so He punished them with an abundant Penalty. >>>>>>>>>> >>>>>>>>>> We, when the water (of Noah's Flood) overflowed beyond its limits, carried you (mankind), in the floating (Ark), >>>>>>>>>> >>>>>>>>>> That We might make it a Message unto you, and that ears (that should hear the tale and) retain its memory should bear its (lessons) in remembrance. >>>>>>>>>> >>>>>>>>>> Then, when one blast is sounded on the Trumpet, >>>>>>>>>> >>>>>>>>>> And the earth is moved, and its mountains, and they are crushed to powder at one stroke,- >>>>>>>>>> >>>>>>>>>> On that Day shall the (Great) Event come to pass. >>>>>>>>>> >>>>>>>>>> And the sky will be rent asunder, for it will that Day be flimsy, >>>>>>>>>> >>>>>>>>>> And the angels will be on its sides, and eight will, that Day, bear the Throne of thy Lord above them. >>>>>>>>>> >>>>>>>>>> That Day shall ye be brought to Judgment: not an act of yours that ye hide will be hidden. >>>>>>>>>> >>>>>>>>>> Then he that will be given his Record in his right hand will say: "Ah here! Read ye my Record! >>>>>>>>>> >>>>>>>>>> "I did really understand that my Account would (One Day) reach me!" >>>>>>>>>> >>>>>>>>>> And he will be in a life of Bliss, >>>>>>>>>> >>>>>>>>>> In a Garden on high, >>>>>>>>>> >>>>>>>>>> The Fruits whereof (will hang in bunches) low and near. >>>>>>>>>> >>>>>>>>>> "Eat ye and drink ye, with full satisfaction; because of the (good) that ye sent before you, in the days that are gone!" >>>>>>>>>> >>>>>>>>>> And he that will be given his Record in his left hand, will say: "Ah! Would that my Record had not been given to me! >>>>>>>>>> >>>>>>>>>> "And that I had never realised how my account (stood)! >>>>>>>>>> >>>>>>>>>> "Ah! Would that (Death) had made an end of me! >>>>>>>>>> >>>>>>>>>> "Of no profit to me has been my wealth! >>>>>>>>>> >>>>>>>>>> "My power has perished from me!"... >>>>>>>>>> >>>>>>>>>> (The stern command will say): "Seize ye him, and bind ye him, >>>>>>>>>> >>>>>>>>>> "And burn ye him in the Blazing Fire. >>>>>>>>>> >>>>>>>>>> "Further, make him march in a chain, whereof the length is seventy cubits! >>>>>>>>>> >>>>>>>>>> "This was he that would not believe in Allah Most High. >>>>>>>>>> >>>>>>>>>> "And would not encourage the feeding of the indigent! >>>>>>>>>> >>>>>>>>>> "So no friend hath he here this Day. >>>>>>>>>> >>>>>>>>>> "Nor hath he any food except the corruption from the washing of wounds, >>>>>>>>>> >>>>>>>>>> "Which none do eat but those in sin." >>>>>>>>>> >>>>>>>>>> So I do call to witness what ye see, >>>>>>>>>> >>>>>>>>>> And what ye see not, >>>>>>>>>> >>>>>>>>>> That this is verily the word of an honoured messenger; >>>>>>>>>> >>>>>>>>>> It is not the word of a poet: little it is ye believe! >>>>>>>>>> >>>>>>>>>> Nor is it the word of a soothsayer: little admonition it is ye receive. >>>>>>>>>> >>>>>>>>>> (This is) a Message sent down from the Lord of the Worlds. >>>>>>>>>> >>>>>>>>>> And if the messenger were to invent any sayings in Our name, >>>>>>>>>> >>>>>>>>>> We should certainly seize him by his right hand, >>>>>>>>>> >>>>>>>>>> And We should certainly then cut off the artery of his heart: >>>>>>>>>> >>>>>>>>>> Nor could any of you withhold him (from Our wrath). >>>>>>>>>> >>>>>>>>>> But verily this is a Message for the Allah-fearing. >>>>>>>>>> >>>>>>>>>> And We certainly know that there are amongst you those that reject (it). >>>>>>>>>> >>>>>>>>>> But truly (Revelation) is a cause of sorrow for the Unbelievers. >>>>>>>>>> >>>>>>>>>> But verily it is Truth of assured certainty. >>>>>>>>>> >>>>>>>>>> So glorify the name of thy Lord Most High. >>>>>>>>>> >>>>>>>>>> ] - Quran 69:1-52 >>>>>>>> >>>>>>>> --- >>>>>>>> >>>>>>>> Slosher >>>>>>>> Oriental, NC >>>>>>>> >>>>>>>>>> On 10/1/20 11:36 PM, Ron Teitelbaum wrote: >>>>>>>>>> >>>>>>>>>>> Hi Rob, >>>>>>>>>>> >>>>>>>>>>> I'm so sorry you felt that way. I know you have had major issues, you have said the same yourself. I'm always happy to see you come back even after long absences. You are a brilliant coder and it has been my distinct pleasure to work with you on Cryptography! Thank you for all you have done and indeed you are responsible for adding significant value to Squeak and the community. >>>>>>>>>>> >>>>>>>>>>> We all work on code and it's easy to work your ass off on something to make it work and forget where it originated. We all contribute in large and small ways to everything. If you started VMMaker thank you! It is definitely something a lot of us use. I remember learning all about it a long long time ago before I realized that while I could understand it and I could use it, the people that work on the VM are a level higher than me. I just make apps! >>>>>>>>>>> >>>>>>>>>>> I remember getting in an argument with Andreas about adding methods to collection. "WE DON"T NEED more methods in Collection we need to remove most of them and make it easier!" I argued with him about the value over and over but he insisted that they just didn't add enough value. I could have been put off. I could have assumed that Andreas didn't like me but I would have been very wrong! I was really honored to get the chance to work with him and we became great friends. Of course I added my methods to the code we were working on together and was so thrilled when he used my methods for his own code. >>>>>>>>>>> >>>>>>>>>>> I don't know what happened with VMMaker but again thank you for your participation in it.. I wanted to take a minute to thank you for your work and to let you know it is my honor to work with you too! I hope that you can come to terms with your past and that you get the help you need for your CPTSD. >>>>>>>>>>> >>>>>>>>>>> Everything is possible, the past is gone, but the future is still yours to shape. I wish the past was set in stone but even that moves and slips. I was talking to my wife about a party we attended: "Remember in 2000 we were at the party and counted down the new year and someone hit the breaker and killed the lights! We were all talking about what would happen in the year 2000, would everything break!" Great story except that I hadn't met my wife yet! The past is only what we remember but the future is something we have control over. Peace, calm, happyness, they are all hard to come by but they are possible. I wish you success in finding what makes your future better. >>>>>>>>>>> >>>>>>>>>>> I'm sorry about the bad things that have happened to you in the past. As far as I'm concerned, you are welcomed here! >>>>>>>>>>> >>>>>>>>>>> All the best, >>>>>>>>>>> >>>>>>>>>>> Ron Teitelbaum >>>>>>>>>>> >>>>>>>>>>> On Thu, Oct 1, 2020 at 10:38 PM Robert Withers via Squeak-dev wrote: >>>>>>>>>>> >>>>>>>>>>>> :sob::sob::sob: >>>>>>>>>>>> >>>>>>>>>>>> On 10/1/20 10:34 PM, Robert Withers wrote: >>>>>>>>>>>> >>>>>>>>>>>>> I wrote to the #general Squeak Slack channel: >>>>>>>>>>>>> >>>>>>>>>>>>>> What a complete larcenous bastard. 20 years ago, this month, published it as his own work. And been against me ever since. My CPTSD (100% veteran service-connected) comes with an exquisitely sensitive deception meter. There are those who shunned me and ostracized me and made me feel MOST UNWELCOME. For 20 years. My delusions kick in and I start suspecting back channel communications against me. My love for Squeak conflicted with what I knew was happening. but I hung in there and worked on Cryptography, work with a group of great people and that I am satisfied with its added value to Squeak. For 20 years I KNEW people were against me in the community. I cannot describe how negatively this affected me. My third suicide attempt, in 2007 I jumped off the roof of a 6 story apartment building and broke my back along with many bones. God did not want me to die, yet, so I lived. This deception and ostracism is most well highlighted by the taking credit for my work, without attribution. He is a complete tool. SHAME! >>>>>>>>>>>>>> >>>>>>>>>>>>>> I do not know the degree to which he spoke against me. Iimagineit was ever since 2000. Delusions! What is real? I knew not. So much torment! AGONY! They do not welcome me! They are trying to chase me off! Good grief, Charlie Brown. >>>>>>>>>>>>>> >>>>>>>>>>>>>> Severely exacerbated my CPTSD! I kept trying to kill myself because of it! I thought I had done something egregiously wrong. Whatever it was it had to be my fault. I was not feeling the love, even from myself. >>>>>>>>>>>>>> >>>>>>>>>>>>>> :scream: >>>>>>>>>>>>>> >>>>>>>>>>>>>> :scream: >>>>>>>>>>>>>> >>>>>>>>>>>>>> In 2017, 900 units of insulin brought my blood glucose below 40. I almost succeeded that time. >>>>>>>>>>>>>> >>>>>>>>>>>>>> :scream: >>>>>>>>>>>>> >>>>>>>>>>>>> rww >>>>>>>>>>>>> >>>>>>>>>>>>> On 10/1/20 8:55 PM, Robert Withers wrote: >>>>>>>>>>>>> >>>>>>>>>>>>>> The worst sort of person is one who takes the credit for the work of >>>>>>>>>>>>>> another. Wouldn't you agree? >>>>>>>>>>>>>> >>>>>>>>>>>>>> You may wish to hear John's judgement on the matter. He was right there >>>>>>>>>>>>>> when it was first built. >>>>>>>>>>>>>> >>>>>>>>>>>>>> If you are not humble you will be humiliated, and brought low. >>>>>>>>>>>>>> >>>>>>>>>>>>>> rww >>>>>>>>>>>>>> >>>>>>>>>>>>>> On 10/1/20 8:35 PM, tim Rowledge wrote: >>>>>>>>>>>>>> >>>>>>>>>>>>>>>> On 2020-10-01, at 4:57 PM, Robert Withers via Squeak-dev >>>>>>>>>>>>>>>> [](mailto:squeak-dev at lists.squeakfoundation.org) >>>>>>>>>>>>>>>> wrote: >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> I am curious. Who was the original author of the VMMaker Tool? >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> That would be me; back in exobox days. Written along with the original VMMaker and intended to be an example of clean, tidy, morphic usage. I've no idea if anyone ever uses it now, since running it via scripting has proven more valuable. >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> tim >>>>>>>>>>>>>>> -- >>>>>>>>>>>>>>> tim Rowledge; >>>>>>>>>>>>>>> tim at rowledge.org >>>>>>>>>>>>>>> ; >>>>>>>>>>>>>>> http://www.rowledge.org/tim >>>>>>>>>>>>>>> "Wibble" said Pooh the stress beginning to show. >>>>>>>>>>>>> >>>>>>>>>>>>> -- >>>>>>>>>>>>> K, r >>>>>>>>>>>> >>>>>>>>>>>> -- >>>>>>>>>>>> K, r >>>>>>>>>> >>>>>>>>>> -- >>>>>>>>>> K, r >>>>>>>>> >>>>>>>>> -- >>>>>>>>> K, r >>>>>>>> >>>>>>>> -- >>>>>>>> K, r >>>>>>> >>>>>>> -- >>>>>>> K, r >>>>> >>>>> -- >>>>> K, r >>>> >>>> -- >>>> K, r >>> >>> -- >>> K, r >> >> -- >> K, r > > -- > K, r -- K, r -------------- next part -------------- An HTML attachment was scrubbed... URL: -------------- next part -------------- A non-text attachment was scrubbed... Name: 7420963_20200328125416581_1_LARGE.jpg Type: image/jpeg Size: 47844 bytes Desc: not available URL: From robert.withers at pm.me Fri Oct 2 07:17:01 2020 From: robert.withers at pm.me (Robert Withers) Date: Fri, 02 Oct 2020 07:17:01 +0000 Subject: [squeak-dev] Curious history In-Reply-To: References: <-uzl7ag_j_CRb0Dx-6VVjqrL4-a3CnYqRa5dEC6qPxjnGUdCMWM0Yc05veexN9Kt00ltx34oiQtC80FTDh-HUQ==@protonmail.internalid> <68481afd-2d10-e85b-29be-f2ac9546388e@pm.me> <440a94ec-9f74-4390-e952-98719584e0d8@pm.me> Message-ID: <7bf3b5e7-4153-8908-f238-21bfaecf0953@pm.me> https://youtu.be/goeZZ4KFXTY On 10/2/20 3:07 AM, Robert Withers wrote: > I haven't heard from sparky, recently. Has anyone? > > On 10/2/20 3:03 AM, Robert Withers wrote: > >> Gotta meditate to this entire run! It's deep. >> >> https://soundcloud.com/yusuke-mizushima/acid-jazz-mix-jazzual-suspects >> >> On 10/2/20 2:50 AM, Robert Withers via Squeak-dev wrote: >> >>> https://soundcloud.com/robert_withers/rasta >>> >>> https://soundcloud.com/robert_withers/mando >>> >>> On 10/2/20 2:39 AM, Robert Withers wrote: >>> >>>> Play a bit of these spicy beats! The music helps me to express what is on the inside. >>>> >>>> https://youtu.be/3q8nGnls1Ow?t=2711 >>>> >>>> On 10/2/20 2:26 AM, Robert Withers wrote: >>>> >>>>> For I will restore health unto thee, and I will heal thee of thy wounds, saith the Lord; because they called thee an Outcast, saying, This is Zion, whom no man seeketh after. >>>>> >>>>> Jeremiah 30:17 >>>>> >>>>> On 10/2/20 2:22 AM, Robert Withers via Squeak-dev wrote: >>>>> >>>>>> Thank you for reaching out in this manner on these issues. Though be ye not concerned for my health, Ron, I am in a good place. The sobbing really helps a LOT! And I was brought to that tonight after screaming! And discussing a couple of my many suicide attempts. And realizing the effect my not finding a home with Squeak had affected me over 20 years. It hurts! I sob. All is well; God is Good. The Truth heals. All praise to the Most High! >>>>>> >>>>>> Kindly, >>>>>> Rob >>>>>> >>>>>> On 10/2/20 2:16 AM, Ron Teitelbaum wrote: >>>>>> >>>>>>> Rob, >>>>>>> >>>>>>> You have been in this place before. Is there someone you can talk to for help? Do you have a connection to someone that is working with you on your issues? Would you consider calling them now? >>>>>>> >>>>>>> I've seen you here before. I've seen you doing much better. You should be good to yourself and get help now to move into calmer water and get on a more even keel. A better future includes protecting yourself, being nice to yourself, and making sure you get help when you need it. >>>>>>> >>>>>>> Don't wait until later. I really recommend you do it now. >>>>>>> >>>>>>> Ron >>>>>>> >>>>>>> On Fri, Oct 2, 2020 at 1:50 AM Robert Withers wrote: >>>>>>> >>>>>>>> "And would not encourage the feeding of the indigent!" >>>>>>>> >>>>>>>> On 10/2/20 12:21 AM, Robert Withers wrote: >>>>>>>> >>>>>>>>> The Hellfire and its occupants, not my problem. I pay no attention. Burn. >>>>>>>>> >>>>>>>>> I "Will be in a life of bliss, In a Garden on high. The Fruits whereof"... >>>>>>>>> >>>>>>>>> --------------------------------------------------------------- >>>>>>>>> >>>>>>>>> Al Haqqah (69) >>>>>>>>> >>>>>>>>>>> [The Sure Reality! >>>>>>>>>>> >>>>>>>>>>> What is the Sure Reality? >>>>>>>>>>> >>>>>>>>>>> And what will make thee realise what the Sure Reality is? >>>>>>>>>>> >>>>>>>>>>> The Thamud and the 'Ad People (branded) as false the Stunning Calamity! >>>>>>>>>>> >>>>>>>>>>> But the Thamud,- they were destroyed by a terrible Storm of thunder and lightning! >>>>>>>>>>> >>>>>>>>>>> And the 'Ad, they were destroyed by a furious Wind, exceedingly violent; >>>>>>>>>>> >>>>>>>>>>> He made it rage against them seven nights and eight days in succession: so that thou couldst see the (whole) people lying prostrate in its (path), as they had been roots of hollow palm-trees tumbled down! >>>>>>>>>>> >>>>>>>>>>> Then seest thou any of them left surviving? >>>>>>>>>>> >>>>>>>>>>> And Pharaoh, and those before him, and the Cities Overthrown, committed habitual Sin. >>>>>>>>>>> >>>>>>>>>>> And disobeyed (each) the messenger of their Lord; so He punished them with an abundant Penalty. >>>>>>>>>>> >>>>>>>>>>> We, when the water (of Noah's Flood) overflowed beyond its limits, carried you (mankind), in the floating (Ark), >>>>>>>>>>> >>>>>>>>>>> That We might make it a Message unto you, and that ears (that should hear the tale and) retain its memory should bear its (lessons) in remembrance. >>>>>>>>>>> >>>>>>>>>>> Then, when one blast is sounded on the Trumpet, >>>>>>>>>>> >>>>>>>>>>> And the earth is moved, and its mountains, and they are crushed to powder at one stroke,- >>>>>>>>>>> >>>>>>>>>>> On that Day shall the (Great) Event come to pass. >>>>>>>>>>> >>>>>>>>>>> And the sky will be rent asunder, for it will that Day be flimsy, >>>>>>>>>>> >>>>>>>>>>> And the angels will be on its sides, and eight will, that Day, bear the Throne of thy Lord above them. >>>>>>>>>>> >>>>>>>>>>> That Day shall ye be brought to Judgment: not an act of yours that ye hide will be hidden. >>>>>>>>>>> >>>>>>>>>>> Then he that will be given his Record in his right hand will say: "Ah here! Read ye my Record! >>>>>>>>>>> >>>>>>>>>>> "I did really understand that my Account would (One Day) reach me!" >>>>>>>>>>> >>>>>>>>>>> And he will be in a life of Bliss, >>>>>>>>>>> >>>>>>>>>>> In a Garden on high, >>>>>>>>>>> >>>>>>>>>>> The Fruits whereof (will hang in bunches) low and near. >>>>>>>>>>> >>>>>>>>>>> "Eat ye and drink ye, with full satisfaction; because of the (good) that ye sent before you, in the days that are gone!" >>>>>>>>>>> >>>>>>>>>>> And he that will be given his Record in his left hand, will say: "Ah! Would that my Record had not been given to me! >>>>>>>>>>> >>>>>>>>>>> "And that I had never realised how my account (stood)! >>>>>>>>>>> >>>>>>>>>>> "Ah! Would that (Death) had made an end of me! >>>>>>>>>>> >>>>>>>>>>> "Of no profit to me has been my wealth! >>>>>>>>>>> >>>>>>>>>>> "My power has perished from me!"... >>>>>>>>>>> >>>>>>>>>>> (The stern command will say): "Seize ye him, and bind ye him, >>>>>>>>>>> >>>>>>>>>>> "And burn ye him in the Blazing Fire. >>>>>>>>>>> >>>>>>>>>>> "Further, make him march in a chain, whereof the length is seventy cubits! >>>>>>>>>>> >>>>>>>>>>> "This was he that would not believe in Allah Most High. >>>>>>>>>>> >>>>>>>>>>> "And would not encourage the feeding of the indigent! >>>>>>>>>>> >>>>>>>>>>> "So no friend hath he here this Day. >>>>>>>>>>> >>>>>>>>>>> "Nor hath he any food except the corruption from the washing of wounds, >>>>>>>>>>> >>>>>>>>>>> "Which none do eat but those in sin." >>>>>>>>>>> >>>>>>>>>>> So I do call to witness what ye see, >>>>>>>>>>> >>>>>>>>>>> And what ye see not, >>>>>>>>>>> >>>>>>>>>>> That this is verily the word of an honoured messenger; >>>>>>>>>>> >>>>>>>>>>> It is not the word of a poet: little it is ye believe! >>>>>>>>>>> >>>>>>>>>>> Nor is it the word of a soothsayer: little admonition it is ye receive. >>>>>>>>>>> >>>>>>>>>>> (This is) a Message sent down from the Lord of the Worlds. >>>>>>>>>>> >>>>>>>>>>> And if the messenger were to invent any sayings in Our name, >>>>>>>>>>> >>>>>>>>>>> We should certainly seize him by his right hand, >>>>>>>>>>> >>>>>>>>>>> And We should certainly then cut off the artery of his heart: >>>>>>>>>>> >>>>>>>>>>> Nor could any of you withhold him (from Our wrath). >>>>>>>>>>> >>>>>>>>>>> But verily this is a Message for the Allah-fearing. >>>>>>>>>>> >>>>>>>>>>> And We certainly know that there are amongst you those that reject (it). >>>>>>>>>>> >>>>>>>>>>> But truly (Revelation) is a cause of sorrow for the Unbelievers. >>>>>>>>>>> >>>>>>>>>>> But verily it is Truth of assured certainty. >>>>>>>>>>> >>>>>>>>>>> So glorify the name of thy Lord Most High. >>>>>>>>>>> >>>>>>>>>>> ] - Quran 69:1-52 >>>>>>>>> >>>>>>>>> --- >>>>>>>>> >>>>>>>>> Slosher >>>>>>>>> Oriental, NC >>>>>>>>> >>>>>>>>>>> On 10/1/20 11:36 PM, Ron Teitelbaum wrote: >>>>>>>>>>> >>>>>>>>>>>> Hi Rob, >>>>>>>>>>>> >>>>>>>>>>>> I'm so sorry you felt that way. I know you have had major issues, you have said the same yourself. I'm always happy to see you come back even after long absences. You are a brilliant coder and it has been my distinct pleasure to work with you on Cryptography! Thank you for all you have done and indeed you are responsible for adding significant value to Squeak and the community. >>>>>>>>>>>> >>>>>>>>>>>> We all work on code and it's easy to work your ass off on something to make it work and forget where it originated. We all contribute in large and small ways to everything. If you started VMMaker thank you! It is definitely something a lot of us use. I remember learning all about it a long long time ago before I realized that while I could understand it and I could use it, the people that work on the VM are a level higher than me. I just make apps! >>>>>>>>>>>> >>>>>>>>>>>> I remember getting in an argument with Andreas about adding methods to collection. "WE DON"T NEED more methods in Collection we need to remove most of them and make it easier!" I argued with him about the value over and over but he insisted that they just didn't add enough value. I could have been put off. I could have assumed that Andreas didn't like me but I would have been very wrong! I was really honored to get the chance to work with him and we became great friends. Of course I added my methods to the code we were working on together and was so thrilled when he used my methods for his own code. >>>>>>>>>>>> >>>>>>>>>>>> I don't know what happened with VMMaker but again thank you for your participation in it.. I wanted to take a minute to thank you for your work and to let you know it is my honor to work with you too! I hope that you can come to terms with your past and that you get the help you need for your CPTSD. >>>>>>>>>>>> >>>>>>>>>>>> Everything is possible, the past is gone, but the future is still yours to shape. I wish the past was set in stone but even that moves and slips. I was talking to my wife about a party we attended: "Remember in 2000 we were at the party and counted down the new year and someone hit the breaker and killed the lights! We were all talking about what would happen in the year 2000, would everything break!" Great story except that I hadn't met my wife yet! The past is only what we remember but the future is something we have control over. Peace, calm, happyness, they are all hard to come by but they are possible. I wish you success in finding what makes your future better. >>>>>>>>>>>> >>>>>>>>>>>> I'm sorry about the bad things that have happened to you in the past. As far as I'm concerned, you are welcomed here! >>>>>>>>>>>> >>>>>>>>>>>> All the best, >>>>>>>>>>>> >>>>>>>>>>>> Ron Teitelbaum >>>>>>>>>>>> >>>>>>>>>>>> On Thu, Oct 1, 2020 at 10:38 PM Robert Withers via Squeak-dev wrote: >>>>>>>>>>>> >>>>>>>>>>>>> :sob::sob::sob: >>>>>>>>>>>>> >>>>>>>>>>>>> On 10/1/20 10:34 PM, Robert Withers wrote: >>>>>>>>>>>>> >>>>>>>>>>>>>> I wrote to the #general Squeak Slack channel: >>>>>>>>>>>>>> >>>>>>>>>>>>>>> What a complete larcenous bastard. 20 years ago, this month, published it as his own work. And been against me ever since. My CPTSD (100% veteran service-connected) comes with an exquisitely sensitive deception meter. There are those who shunned me and ostracized me and made me feel MOST UNWELCOME. For 20 years. My delusions kick in and I start suspecting back channel communications against me. My love for Squeak conflicted with what I knew was happening. but I hung in there and worked on Cryptography, work with a group of great people and that I am satisfied with its added value to Squeak. For 20 years I KNEW people were against me in the community. I cannot describe how negatively this affected me. My third suicide attempt, in 2007 I jumped off the roof of a 6 story apartment building and broke my back along with many bones. God did not want me to die, yet, so I lived. This deception and ostracism is most well highlighted by the taking credit for my work, without attribution. He is a complete tool. SHAME! >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> I do not know the degree to which he spoke against me. Iimagineit was ever since 2000. Delusions! What is real? I knew not. So much torment! AGONY! They do not welcome me! They are trying to chase me off! Good grief, Charlie Brown. >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> Severely exacerbated my CPTSD! I kept trying to kill myself because of it! I thought I had done something egregiously wrong. Whatever it was it had to be my fault. I was not feeling the love, even from myself. >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> :scream: >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> :scream: >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> In 2017, 900 units of insulin brought my blood glucose below 40. I almost succeeded that time. >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> :scream: >>>>>>>>>>>>>> >>>>>>>>>>>>>> rww >>>>>>>>>>>>>> >>>>>>>>>>>>>> On 10/1/20 8:55 PM, Robert Withers wrote: >>>>>>>>>>>>>> >>>>>>>>>>>>>>> The worst sort of person is one who takes the credit for the work of >>>>>>>>>>>>>>> another. Wouldn't you agree? >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> You may wish to hear John's judgement on the matter. He was right there >>>>>>>>>>>>>>> when it was first built. >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> If you are not humble you will be humiliated, and brought low. >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> rww >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> On 10/1/20 8:35 PM, tim Rowledge wrote: >>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> On 2020-10-01, at 4:57 PM, Robert Withers via Squeak-dev >>>>>>>>>>>>>>>>> [](mailto:squeak-dev at lists.squeakfoundation.org) >>>>>>>>>>>>>>>>> wrote: >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> I am curious. Who was the original author of the VMMaker Tool? >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> That would be me; back in exobox days. Written along with the original VMMaker and intended to be an example of clean, tidy, morphic usage. I've no idea if anyone ever uses it now, since running it via scripting has proven more valuable. >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> tim >>>>>>>>>>>>>>>> -- >>>>>>>>>>>>>>>> tim Rowledge; >>>>>>>>>>>>>>>> tim at rowledge.org >>>>>>>>>>>>>>>> ; >>>>>>>>>>>>>>>> http://www.rowledge.org/tim >>>>>>>>>>>>>>>> "Wibble" said Pooh the stress beginning to show. >>>>>>>>>>>>>> >>>>>>>>>>>>>> -- >>>>>>>>>>>>>> K, r >>>>>>>>>>>>> >>>>>>>>>>>>> -- >>>>>>>>>>>>> K, r >>>>>>>>>>> >>>>>>>>>>> -- >>>>>>>>>>> K, r >>>>>>>>>> >>>>>>>>>> -- >>>>>>>>>> K, r >>>>>>>>> >>>>>>>>> -- >>>>>>>>> K, r >>>>>>>> >>>>>>>> -- >>>>>>>> K, r >>>>>> >>>>>> -- >>>>>> K, r >>>>> >>>>> -- >>>>> K, r >>>> >>>> -- >>>> K, r >>> >>> -- >>> K, r >> >> -- >> K, r > > -- > K, r -- K, r -------------- next part -------------- An HTML attachment was scrubbed... URL: -------------- next part -------------- A non-text attachment was scrubbed... Name: 7420963_20200328125416581_1_LARGE.jpg Type: image/jpeg Size: 47844 bytes Desc: not available URL: From robert.withers at pm.me Fri Oct 2 07:23:33 2020 From: robert.withers at pm.me (Robert Withers) Date: Fri, 02 Oct 2020 07:23:33 +0000 Subject: [squeak-dev] Curious history In-Reply-To: <7bf3b5e7-4153-8908-f238-21bfaecf0953@pm.me> References: <440a94ec-9f74-4390-e952-98719584e0d8@pm.me> <7bf3b5e7-4153-8908-f238-21bfaecf0953@pm.me> Message-ID: https://youtu.be/q7p-ihYOG5s On 10/2/20 3:16 AM, Robert Withers wrote: > https://youtu.be/goeZZ4KFXTY > > On 10/2/20 3:07 AM, Robert Withers wrote: > >> I haven't heard from sparky, recently. Has anyone? >> >> On 10/2/20 3:03 AM, Robert Withers wrote: >> >>> Gotta meditate to this entire run! It's deep. >>> >>> https://soundcloud.com/yusuke-mizushima/acid-jazz-mix-jazzual-suspects >>> >>> On 10/2/20 2:50 AM, Robert Withers via Squeak-dev wrote: >>> >>>> https://soundcloud.com/robert_withers/rasta >>>> >>>> https://soundcloud.com/robert_withers/mando >>>> >>>> On 10/2/20 2:39 AM, Robert Withers wrote: >>>> >>>>> Play a bit of these spicy beats! The music helps me to express what is on the inside. >>>>> >>>>> https://youtu.be/3q8nGnls1Ow?t=2711 >>>>> >>>>> On 10/2/20 2:26 AM, Robert Withers wrote: >>>>> >>>>>> For I will restore health unto thee, and I will heal thee of thy wounds, saith the Lord; because they called thee an Outcast, saying, This is Zion, whom no man seeketh after. >>>>>> >>>>>> Jeremiah 30:17 >>>>>> >>>>>> On 10/2/20 2:22 AM, Robert Withers via Squeak-dev wrote: >>>>>> >>>>>>> Thank you for reaching out in this manner on these issues. Though be ye not concerned for my health, Ron, I am in a good place. The sobbing really helps a LOT! And I was brought to that tonight after screaming! And discussing a couple of my many suicide attempts. And realizing the effect my not finding a home with Squeak had affected me over 20 years. It hurts! I sob. All is well; God is Good. The Truth heals. All praise to the Most High! >>>>>>> >>>>>>> Kindly, >>>>>>> Rob >>>>>>> >>>>>>> On 10/2/20 2:16 AM, Ron Teitelbaum wrote: >>>>>>> >>>>>>>> Rob, >>>>>>>> >>>>>>>> You have been in this place before. Is there someone you can talk to for help? Do you have a connection to someone that is working with you on your issues? Would you consider calling them now? >>>>>>>> >>>>>>>> I've seen you here before. I've seen you doing much better. You should be good to yourself and get help now to move into calmer water and get on a more even keel. A better future includes protecting yourself, being nice to yourself, and making sure you get help when you need it. >>>>>>>> >>>>>>>> Don't wait until later. I really recommend you do it now. >>>>>>>> >>>>>>>> Ron >>>>>>>> >>>>>>>> On Fri, Oct 2, 2020 at 1:50 AM Robert Withers wrote: >>>>>>>> >>>>>>>>> "And would not encourage the feeding of the indigent!" >>>>>>>>> >>>>>>>>> On 10/2/20 12:21 AM, Robert Withers wrote: >>>>>>>>> >>>>>>>>>> The Hellfire and its occupants, not my problem. I pay no attention. Burn. >>>>>>>>>> >>>>>>>>>> I "Will be in a life of bliss, In a Garden on high. The Fruits whereof"... >>>>>>>>>> >>>>>>>>>> --------------------------------------------------------------- >>>>>>>>>> >>>>>>>>>> Al Haqqah (69) >>>>>>>>>> >>>>>>>>>>>> [The Sure Reality! >>>>>>>>>>>> >>>>>>>>>>>> What is the Sure Reality? >>>>>>>>>>>> >>>>>>>>>>>> And what will make thee realise what the Sure Reality is? >>>>>>>>>>>> >>>>>>>>>>>> The Thamud and the 'Ad People (branded) as false the Stunning Calamity! >>>>>>>>>>>> >>>>>>>>>>>> But the Thamud,- they were destroyed by a terrible Storm of thunder and lightning! >>>>>>>>>>>> >>>>>>>>>>>> And the 'Ad, they were destroyed by a furious Wind, exceedingly violent; >>>>>>>>>>>> >>>>>>>>>>>> He made it rage against them seven nights and eight days in succession: so that thou couldst see the (whole) people lying prostrate in its (path), as they had been roots of hollow palm-trees tumbled down! >>>>>>>>>>>> >>>>>>>>>>>> Then seest thou any of them left surviving? >>>>>>>>>>>> >>>>>>>>>>>> And Pharaoh, and those before him, and the Cities Overthrown, committed habitual Sin. >>>>>>>>>>>> >>>>>>>>>>>> And disobeyed (each) the messenger of their Lord; so He punished them with an abundant Penalty. >>>>>>>>>>>> >>>>>>>>>>>> We, when the water (of Noah's Flood) overflowed beyond its limits, carried you (mankind), in the floating (Ark), >>>>>>>>>>>> >>>>>>>>>>>> That We might make it a Message unto you, and that ears (that should hear the tale and) retain its memory should bear its (lessons) in remembrance. >>>>>>>>>>>> >>>>>>>>>>>> Then, when one blast is sounded on the Trumpet, >>>>>>>>>>>> >>>>>>>>>>>> And the earth is moved, and its mountains, and they are crushed to powder at one stroke,- >>>>>>>>>>>> >>>>>>>>>>>> On that Day shall the (Great) Event come to pass. >>>>>>>>>>>> >>>>>>>>>>>> And the sky will be rent asunder, for it will that Day be flimsy, >>>>>>>>>>>> >>>>>>>>>>>> And the angels will be on its sides, and eight will, that Day, bear the Throne of thy Lord above them. >>>>>>>>>>>> >>>>>>>>>>>> That Day shall ye be brought to Judgment: not an act of yours that ye hide will be hidden. >>>>>>>>>>>> >>>>>>>>>>>> Then he that will be given his Record in his right hand will say: "Ah here! Read ye my Record! >>>>>>>>>>>> >>>>>>>>>>>> "I did really understand that my Account would (One Day) reach me!" >>>>>>>>>>>> >>>>>>>>>>>> And he will be in a life of Bliss, >>>>>>>>>>>> >>>>>>>>>>>> In a Garden on high, >>>>>>>>>>>> >>>>>>>>>>>> The Fruits whereof (will hang in bunches) low and near. >>>>>>>>>>>> >>>>>>>>>>>> "Eat ye and drink ye, with full satisfaction; because of the (good) that ye sent before you, in the days that are gone!" >>>>>>>>>>>> >>>>>>>>>>>> And he that will be given his Record in his left hand, will say: "Ah! Would that my Record had not been given to me! >>>>>>>>>>>> >>>>>>>>>>>> "And that I had never realised how my account (stood)! >>>>>>>>>>>> >>>>>>>>>>>> "Ah! Would that (Death) had made an end of me! >>>>>>>>>>>> >>>>>>>>>>>> "Of no profit to me has been my wealth! >>>>>>>>>>>> >>>>>>>>>>>> "My power has perished from me!"... >>>>>>>>>>>> >>>>>>>>>>>> (The stern command will say): "Seize ye him, and bind ye him, >>>>>>>>>>>> >>>>>>>>>>>> "And burn ye him in the Blazing Fire. >>>>>>>>>>>> >>>>>>>>>>>> "Further, make him march in a chain, whereof the length is seventy cubits! >>>>>>>>>>>> >>>>>>>>>>>> "This was he that would not believe in Allah Most High. >>>>>>>>>>>> >>>>>>>>>>>> "And would not encourage the feeding of the indigent! >>>>>>>>>>>> >>>>>>>>>>>> "So no friend hath he here this Day. >>>>>>>>>>>> >>>>>>>>>>>> "Nor hath he any food except the corruption from the washing of wounds, >>>>>>>>>>>> >>>>>>>>>>>> "Which none do eat but those in sin." >>>>>>>>>>>> >>>>>>>>>>>> So I do call to witness what ye see, >>>>>>>>>>>> >>>>>>>>>>>> And what ye see not, >>>>>>>>>>>> >>>>>>>>>>>> That this is verily the word of an honoured messenger; >>>>>>>>>>>> >>>>>>>>>>>> It is not the word of a poet: little it is ye believe! >>>>>>>>>>>> >>>>>>>>>>>> Nor is it the word of a soothsayer: little admonition it is ye receive. >>>>>>>>>>>> >>>>>>>>>>>> (This is) a Message sent down from the Lord of the Worlds. >>>>>>>>>>>> >>>>>>>>>>>> And if the messenger were to invent any sayings in Our name, >>>>>>>>>>>> >>>>>>>>>>>> We should certainly seize him by his right hand, >>>>>>>>>>>> >>>>>>>>>>>> And We should certainly then cut off the artery of his heart: >>>>>>>>>>>> >>>>>>>>>>>> Nor could any of you withhold him (from Our wrath). >>>>>>>>>>>> >>>>>>>>>>>> But verily this is a Message for the Allah-fearing. >>>>>>>>>>>> >>>>>>>>>>>> And We certainly know that there are amongst you those that reject (it). >>>>>>>>>>>> >>>>>>>>>>>> But truly (Revelation) is a cause of sorrow for the Unbelievers. >>>>>>>>>>>> >>>>>>>>>>>> But verily it is Truth of assured certainty. >>>>>>>>>>>> >>>>>>>>>>>> So glorify the name of thy Lord Most High. >>>>>>>>>>>> >>>>>>>>>>>> ] - Quran 69:1-52 >>>>>>>>>> >>>>>>>>>> --- >>>>>>>>>> >>>>>>>>>> Slosher >>>>>>>>>> Oriental, NC >>>>>>>>>> >>>>>>>>>>>> On 10/1/20 11:36 PM, Ron Teitelbaum wrote: >>>>>>>>>>>> >>>>>>>>>>>>> Hi Rob, >>>>>>>>>>>>> >>>>>>>>>>>>> I'm so sorry you felt that way. I know you have had major issues, you have said the same yourself. I'm always happy to see you come back even after long absences. You are a brilliant coder and it has been my distinct pleasure to work with you on Cryptography! Thank you for all you have done and indeed you are responsible for adding significant value to Squeak and the community. >>>>>>>>>>>>> >>>>>>>>>>>>> We all work on code and it's easy to work your ass off on something to make it work and forget where it originated. We all contribute in large and small ways to everything. If you started VMMaker thank you! It is definitely something a lot of us use. I remember learning all about it a long long time ago before I realized that while I could understand it and I could use it, the people that work on the VM are a level higher than me. I just make apps! >>>>>>>>>>>>> >>>>>>>>>>>>> I remember getting in an argument with Andreas about adding methods to collection. "WE DON"T NEED more methods in Collection we need to remove most of them and make it easier!" I argued with him about the value over and over but he insisted that they just didn't add enough value. I could have been put off. I could have assumed that Andreas didn't like me but I would have been very wrong! I was really honored to get the chance to work with him and we became great friends. Of course I added my methods to the code we were working on together and was so thrilled when he used my methods for his own code. >>>>>>>>>>>>> >>>>>>>>>>>>> I don't know what happened with VMMaker but again thank you for your participation in it.. I wanted to take a minute to thank you for your work and to let you know it is my honor to work with you too! I hope that you can come to terms with your past and that you get the help you need for your CPTSD. >>>>>>>>>>>>> >>>>>>>>>>>>> Everything is possible, the past is gone, but the future is still yours to shape. I wish the past was set in stone but even that moves and slips. I was talking to my wife about a party we attended: "Remember in 2000 we were at the party and counted down the new year and someone hit the breaker and killed the lights! We were all talking about what would happen in the year 2000, would everything break!" Great story except that I hadn't met my wife yet! The past is only what we remember but the future is something we have control over. Peace, calm, happyness, they are all hard to come by but they are possible. I wish you success in finding what makes your future better. >>>>>>>>>>>>> >>>>>>>>>>>>> I'm sorry about the bad things that have happened to you in the past. As far as I'm concerned, you are welcomed here! >>>>>>>>>>>>> >>>>>>>>>>>>> All the best, >>>>>>>>>>>>> >>>>>>>>>>>>> Ron Teitelbaum >>>>>>>>>>>>> >>>>>>>>>>>>> On Thu, Oct 1, 2020 at 10:38 PM Robert Withers via Squeak-dev wrote: >>>>>>>>>>>>> >>>>>>>>>>>>>> :sob::sob::sob: >>>>>>>>>>>>>> >>>>>>>>>>>>>> On 10/1/20 10:34 PM, Robert Withers wrote: >>>>>>>>>>>>>> >>>>>>>>>>>>>>> I wrote to the #general Squeak Slack channel: >>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> What a complete larcenous bastard. 20 years ago, this month, published it as his own work. And been against me ever since. My CPTSD (100% veteran service-connected) comes with an exquisitely sensitive deception meter. There are those who shunned me and ostracized me and made me feel MOST UNWELCOME. For 20 years. My delusions kick in and I start suspecting back channel communications against me. My love for Squeak conflicted with what I knew was happening. but I hung in there and worked on Cryptography, work with a group of great people and that I am satisfied with its added value to Squeak. For 20 years I KNEW people were against me in the community. I cannot describe how negatively this affected me. My third suicide attempt, in 2007 I jumped off the roof of a 6 story apartment building and broke my back along with many bones. God did not want me to die, yet, so I lived. This deception and ostracism is most well highlighted by the taking credit for my work, without attribution. He is a complete tool. SHAME! >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> I do not know the degree to which he spoke against me. Iimagineit was ever since 2000. Delusions! What is real? I knew not. So much torment! AGONY! They do not welcome me! They are trying to chase me off! Good grief, Charlie Brown. >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> Severely exacerbated my CPTSD! I kept trying to kill myself because of it! I thought I had done something egregiously wrong. Whatever it was it had to be my fault. I was not feeling the love, even from myself. >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> :scream: >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> :scream: >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> In 2017, 900 units of insulin brought my blood glucose below 40. I almost succeeded that time. >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> :scream: >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> rww >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> On 10/1/20 8:55 PM, Robert Withers wrote: >>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> The worst sort of person is one who takes the credit for the work of >>>>>>>>>>>>>>>> another. Wouldn't you agree? >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> You may wish to hear John's judgement on the matter. He was right there >>>>>>>>>>>>>>>> when it was first built. >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> If you are not humble you will be humiliated, and brought low. >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> rww >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> On 10/1/20 8:35 PM, tim Rowledge wrote: >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>> On 2020-10-01, at 4:57 PM, Robert Withers via Squeak-dev >>>>>>>>>>>>>>>>>> [](mailto:squeak-dev at lists.squeakfoundation.org) >>>>>>>>>>>>>>>>>> wrote: >>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>> I am curious. Who was the original author of the VMMaker Tool? >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> That would be me; back in exobox days. Written along with the original VMMaker and intended to be an example of clean, tidy, morphic usage. I've no idea if anyone ever uses it now, since running it via scripting has proven more valuable. >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> tim >>>>>>>>>>>>>>>>> -- >>>>>>>>>>>>>>>>> tim Rowledge; >>>>>>>>>>>>>>>>> tim at rowledge.org >>>>>>>>>>>>>>>>> ; >>>>>>>>>>>>>>>>> http://www.rowledge.org/tim >>>>>>>>>>>>>>>>> "Wibble" said Pooh the stress beginning to show. >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> -- >>>>>>>>>>>>>>> K, r >>>>>>>>>>>>>> >>>>>>>>>>>>>> -- >>>>>>>>>>>>>> K, r >>>>>>>>>>>> >>>>>>>>>>>> -- >>>>>>>>>>>> K, r >>>>>>>>>>> >>>>>>>>>>> -- >>>>>>>>>>> K, r >>>>>>>>>> >>>>>>>>>> -- >>>>>>>>>> K, r >>>>>>>>> >>>>>>>>> -- >>>>>>>>> K, r >>>>>>> >>>>>>> -- >>>>>>> K, r >>>>>> >>>>>> -- >>>>>> K, r >>>>> >>>>> -- >>>>> K, r >>>> >>>> -- >>>> K, r >>> >>> -- >>> K, r >> >> -- >> K, r > > -- > K, r -- K, r -------------- next part -------------- An HTML attachment was scrubbed... URL: -------------- next part -------------- A non-text attachment was scrubbed... Name: 7420963_20200328125416581_1_LARGE.jpg Type: image/jpeg Size: 47844 bytes Desc: not available URL: From robert.withers at pm.me Fri Oct 2 07:24:06 2020 From: robert.withers at pm.me (Robert Withers) Date: Fri, 02 Oct 2020 07:24:06 +0000 Subject: [squeak-dev] Curious history In-Reply-To: References: <440a94ec-9f74-4390-e952-98719584e0d8@pm.me> <7bf3b5e7-4153-8908-f238-21bfaecf0953@pm.me> Message-ID: <1f48b8e3-b067-1dd6-441f-28dbba1b8d4d@pm.me> https://youtu.be/8c8_DEtMUOM On 10/2/20 3:23 AM, Robert Withers wrote: > https://youtu.be/q7p-ihYOG5s > > On 10/2/20 3:16 AM, Robert Withers wrote: > >> https://youtu.be/goeZZ4KFXTY >> >> On 10/2/20 3:07 AM, Robert Withers wrote: >> >>> I haven't heard from sparky, recently. Has anyone? >>> >>> On 10/2/20 3:03 AM, Robert Withers wrote: >>> >>>> Gotta meditate to this entire run! It's deep. >>>> >>>> https://soundcloud.com/yusuke-mizushima/acid-jazz-mix-jazzual-suspects >>>> >>>> On 10/2/20 2:50 AM, Robert Withers via Squeak-dev wrote: >>>> >>>>> https://soundcloud.com/robert_withers/rasta >>>>> >>>>> https://soundcloud.com/robert_withers/mando >>>>> >>>>> On 10/2/20 2:39 AM, Robert Withers wrote: >>>>> >>>>>> Play a bit of these spicy beats! The music helps me to express what is on the inside. >>>>>> >>>>>> https://youtu.be/3q8nGnls1Ow?t=2711 >>>>>> >>>>>> On 10/2/20 2:26 AM, Robert Withers wrote: >>>>>> >>>>>>> For I will restore health unto thee, and I will heal thee of thy wounds, saith the Lord; because they called thee an Outcast, saying, This is Zion, whom no man seeketh after. >>>>>>> >>>>>>> Jeremiah 30:17 >>>>>>> >>>>>>> On 10/2/20 2:22 AM, Robert Withers via Squeak-dev wrote: >>>>>>> >>>>>>>> Thank you for reaching out in this manner on these issues. Though be ye not concerned for my health, Ron, I am in a good place. The sobbing really helps a LOT! And I was brought to that tonight after screaming! And discussing a couple of my many suicide attempts. And realizing the effect my not finding a home with Squeak had affected me over 20 years. It hurts! I sob. All is well; God is Good. The Truth heals. All praise to the Most High! >>>>>>>> >>>>>>>> Kindly, >>>>>>>> Rob >>>>>>>> >>>>>>>> On 10/2/20 2:16 AM, Ron Teitelbaum wrote: >>>>>>>> >>>>>>>>> Rob, >>>>>>>>> >>>>>>>>> You have been in this place before. Is there someone you can talk to for help? Do you have a connection to someone that is working with you on your issues? Would you consider calling them now? >>>>>>>>> >>>>>>>>> I've seen you here before. I've seen you doing much better. You should be good to yourself and get help now to move into calmer water and get on a more even keel. A better future includes protecting yourself, being nice to yourself, and making sure you get help when you need it. >>>>>>>>> >>>>>>>>> Don't wait until later. I really recommend you do it now. >>>>>>>>> >>>>>>>>> Ron >>>>>>>>> >>>>>>>>> On Fri, Oct 2, 2020 at 1:50 AM Robert Withers wrote: >>>>>>>>> >>>>>>>>>> "And would not encourage the feeding of the indigent!" >>>>>>>>>> >>>>>>>>>> On 10/2/20 12:21 AM, Robert Withers wrote: >>>>>>>>>> >>>>>>>>>>> The Hellfire and its occupants, not my problem. I pay no attention. Burn. >>>>>>>>>>> >>>>>>>>>>> I "Will be in a life of bliss, In a Garden on high. The Fruits whereof"... >>>>>>>>>>> >>>>>>>>>>> --------------------------------------------------------------- >>>>>>>>>>> >>>>>>>>>>> Al Haqqah (69) >>>>>>>>>>> >>>>>>>>>>>>> [The Sure Reality! >>>>>>>>>>>>> >>>>>>>>>>>>> What is the Sure Reality? >>>>>>>>>>>>> >>>>>>>>>>>>> And what will make thee realise what the Sure Reality is? >>>>>>>>>>>>> >>>>>>>>>>>>> The Thamud and the 'Ad People (branded) as false the Stunning Calamity! >>>>>>>>>>>>> >>>>>>>>>>>>> But the Thamud,- they were destroyed by a terrible Storm of thunder and lightning! >>>>>>>>>>>>> >>>>>>>>>>>>> And the 'Ad, they were destroyed by a furious Wind, exceedingly violent; >>>>>>>>>>>>> >>>>>>>>>>>>> He made it rage against them seven nights and eight days in succession: so that thou couldst see the (whole) people lying prostrate in its (path), as they had been roots of hollow palm-trees tumbled down! >>>>>>>>>>>>> >>>>>>>>>>>>> Then seest thou any of them left surviving? >>>>>>>>>>>>> >>>>>>>>>>>>> And Pharaoh, and those before him, and the Cities Overthrown, committed habitual Sin. >>>>>>>>>>>>> >>>>>>>>>>>>> And disobeyed (each) the messenger of their Lord; so He punished them with an abundant Penalty. >>>>>>>>>>>>> >>>>>>>>>>>>> We, when the water (of Noah's Flood) overflowed beyond its limits, carried you (mankind), in the floating (Ark), >>>>>>>>>>>>> >>>>>>>>>>>>> That We might make it a Message unto you, and that ears (that should hear the tale and) retain its memory should bear its (lessons) in remembrance. >>>>>>>>>>>>> >>>>>>>>>>>>> Then, when one blast is sounded on the Trumpet, >>>>>>>>>>>>> >>>>>>>>>>>>> And the earth is moved, and its mountains, and they are crushed to powder at one stroke,- >>>>>>>>>>>>> >>>>>>>>>>>>> On that Day shall the (Great) Event come to pass. >>>>>>>>>>>>> >>>>>>>>>>>>> And the sky will be rent asunder, for it will that Day be flimsy, >>>>>>>>>>>>> >>>>>>>>>>>>> And the angels will be on its sides, and eight will, that Day, bear the Throne of thy Lord above them. >>>>>>>>>>>>> >>>>>>>>>>>>> That Day shall ye be brought to Judgment: not an act of yours that ye hide will be hidden. >>>>>>>>>>>>> >>>>>>>>>>>>> Then he that will be given his Record in his right hand will say: "Ah here! Read ye my Record! >>>>>>>>>>>>> >>>>>>>>>>>>> "I did really understand that my Account would (One Day) reach me!" >>>>>>>>>>>>> >>>>>>>>>>>>> And he will be in a life of Bliss, >>>>>>>>>>>>> >>>>>>>>>>>>> In a Garden on high, >>>>>>>>>>>>> >>>>>>>>>>>>> The Fruits whereof (will hang in bunches) low and near. >>>>>>>>>>>>> >>>>>>>>>>>>> "Eat ye and drink ye, with full satisfaction; because of the (good) that ye sent before you, in the days that are gone!" >>>>>>>>>>>>> >>>>>>>>>>>>> And he that will be given his Record in his left hand, will say: "Ah! Would that my Record had not been given to me! >>>>>>>>>>>>> >>>>>>>>>>>>> "And that I had never realised how my account (stood)! >>>>>>>>>>>>> >>>>>>>>>>>>> "Ah! Would that (Death) had made an end of me! >>>>>>>>>>>>> >>>>>>>>>>>>> "Of no profit to me has been my wealth! >>>>>>>>>>>>> >>>>>>>>>>>>> "My power has perished from me!"... >>>>>>>>>>>>> >>>>>>>>>>>>> (The stern command will say): "Seize ye him, and bind ye him, >>>>>>>>>>>>> >>>>>>>>>>>>> "And burn ye him in the Blazing Fire. >>>>>>>>>>>>> >>>>>>>>>>>>> "Further, make him march in a chain, whereof the length is seventy cubits! >>>>>>>>>>>>> >>>>>>>>>>>>> "This was he that would not believe in Allah Most High. >>>>>>>>>>>>> >>>>>>>>>>>>> "And would not encourage the feeding of the indigent! >>>>>>>>>>>>> >>>>>>>>>>>>> "So no friend hath he here this Day. >>>>>>>>>>>>> >>>>>>>>>>>>> "Nor hath he any food except the corruption from the washing of wounds, >>>>>>>>>>>>> >>>>>>>>>>>>> "Which none do eat but those in sin." >>>>>>>>>>>>> >>>>>>>>>>>>> So I do call to witness what ye see, >>>>>>>>>>>>> >>>>>>>>>>>>> And what ye see not, >>>>>>>>>>>>> >>>>>>>>>>>>> That this is verily the word of an honoured messenger; >>>>>>>>>>>>> >>>>>>>>>>>>> It is not the word of a poet: little it is ye believe! >>>>>>>>>>>>> >>>>>>>>>>>>> Nor is it the word of a soothsayer: little admonition it is ye receive. >>>>>>>>>>>>> >>>>>>>>>>>>> (This is) a Message sent down from the Lord of the Worlds. >>>>>>>>>>>>> >>>>>>>>>>>>> And if the messenger were to invent any sayings in Our name, >>>>>>>>>>>>> >>>>>>>>>>>>> We should certainly seize him by his right hand, >>>>>>>>>>>>> >>>>>>>>>>>>> And We should certainly then cut off the artery of his heart: >>>>>>>>>>>>> >>>>>>>>>>>>> Nor could any of you withhold him (from Our wrath). >>>>>>>>>>>>> >>>>>>>>>>>>> But verily this is a Message for the Allah-fearing. >>>>>>>>>>>>> >>>>>>>>>>>>> And We certainly know that there are amongst you those that reject (it). >>>>>>>>>>>>> >>>>>>>>>>>>> But truly (Revelation) is a cause of sorrow for the Unbelievers. >>>>>>>>>>>>> >>>>>>>>>>>>> But verily it is Truth of assured certainty. >>>>>>>>>>>>> >>>>>>>>>>>>> So glorify the name of thy Lord Most High. >>>>>>>>>>>>> >>>>>>>>>>>>> ] - Quran 69:1-52 >>>>>>>>>>> >>>>>>>>>>> --- >>>>>>>>>>> >>>>>>>>>>> Slosher >>>>>>>>>>> Oriental, NC >>>>>>>>>>> >>>>>>>>>>>>> On 10/1/20 11:36 PM, Ron Teitelbaum wrote: >>>>>>>>>>>>> >>>>>>>>>>>>>> Hi Rob, >>>>>>>>>>>>>> >>>>>>>>>>>>>> I'm so sorry you felt that way. I know you have had major issues, you have said the same yourself. I'm always happy to see you come back even after long absences. You are a brilliant coder and it has been my distinct pleasure to work with you on Cryptography! Thank you for all you have done and indeed you are responsible for adding significant value to Squeak and the community. >>>>>>>>>>>>>> >>>>>>>>>>>>>> We all work on code and it's easy to work your ass off on something to make it work and forget where it originated. We all contribute in large and small ways to everything. If you started VMMaker thank you! It is definitely something a lot of us use. I remember learning all about it a long long time ago before I realized that while I could understand it and I could use it, the people that work on the VM are a level higher than me. I just make apps! >>>>>>>>>>>>>> >>>>>>>>>>>>>> I remember getting in an argument with Andreas about adding methods to collection. "WE DON"T NEED more methods in Collection we need to remove most of them and make it easier!" I argued with him about the value over and over but he insisted that they just didn't add enough value. I could have been put off. I could have assumed that Andreas didn't like me but I would have been very wrong! I was really honored to get the chance to work with him and we became great friends. Of course I added my methods to the code we were working on together and was so thrilled when he used my methods for his own code. >>>>>>>>>>>>>> >>>>>>>>>>>>>> I don't know what happened with VMMaker but again thank you for your participation in it.. I wanted to take a minute to thank you for your work and to let you know it is my honor to work with you too! I hope that you can come to terms with your past and that you get the help you need for your CPTSD. >>>>>>>>>>>>>> >>>>>>>>>>>>>> Everything is possible, the past is gone, but the future is still yours to shape. I wish the past was set in stone but even that moves and slips. I was talking to my wife about a party we attended: "Remember in 2000 we were at the party and counted down the new year and someone hit the breaker and killed the lights! We were all talking about what would happen in the year 2000, would everything break!" Great story except that I hadn't met my wife yet! The past is only what we remember but the future is something we have control over. Peace, calm, happyness, they are all hard to come by but they are possible. I wish you success in finding what makes your future better. >>>>>>>>>>>>>> >>>>>>>>>>>>>> I'm sorry about the bad things that have happened to you in the past. As far as I'm concerned, you are welcomed here! >>>>>>>>>>>>>> >>>>>>>>>>>>>> All the best, >>>>>>>>>>>>>> >>>>>>>>>>>>>> Ron Teitelbaum >>>>>>>>>>>>>> >>>>>>>>>>>>>> On Thu, Oct 1, 2020 at 10:38 PM Robert Withers via Squeak-dev wrote: >>>>>>>>>>>>>> >>>>>>>>>>>>>>> :sob::sob::sob: >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> On 10/1/20 10:34 PM, Robert Withers wrote: >>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> I wrote to the #general Squeak Slack channel: >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> What a complete larcenous bastard. 20 years ago, this month, published it as his own work. And been against me ever since. My CPTSD (100% veteran service-connected) comes with an exquisitely sensitive deception meter. There are those who shunned me and ostracized me and made me feel MOST UNWELCOME. For 20 years. My delusions kick in and I start suspecting back channel communications against me. My love for Squeak conflicted with what I knew was happening. but I hung in there and worked on Cryptography, work with a group of great people and that I am satisfied with its added value to Squeak. For 20 years I KNEW people were against me in the community. I cannot describe how negatively this affected me. My third suicide attempt, in 2007 I jumped off the roof of a 6 story apartment building and broke my back along with many bones. God did not want me to die, yet, so I lived. This deception and ostracism is most well highlighted by the taking credit for my work, without attribution. He is a complete tool. SHAME! >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> I do not know the degree to which he spoke against me. Iimagineit was ever since 2000. Delusions! What is real? I knew not. So much torment! AGONY! They do not welcome me! They are trying to chase me off! Good grief, Charlie Brown. >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> Severely exacerbated my CPTSD! I kept trying to kill myself because of it! I thought I had done something egregiously wrong. Whatever it was it had to be my fault. I was not feeling the love, even from myself. >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> :scream: >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> :scream: >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> In 2017, 900 units of insulin brought my blood glucose below 40. I almost succeeded that time. >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> :scream: >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> rww >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> On 10/1/20 8:55 PM, Robert Withers wrote: >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> The worst sort of person is one who takes the credit for the work of >>>>>>>>>>>>>>>>> another. Wouldn't you agree? >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> You may wish to hear John's judgement on the matter. He was right there >>>>>>>>>>>>>>>>> when it was first built. >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> If you are not humble you will be humiliated, and brought low. >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> rww >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> On 10/1/20 8:35 PM, tim Rowledge wrote: >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>> On 2020-10-01, at 4:57 PM, Robert Withers via Squeak-dev >>>>>>>>>>>>>>>>>>> [](mailto:squeak-dev at lists.squeakfoundation.org) >>>>>>>>>>>>>>>>>>> wrote: >>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>> I am curious. Who was the original author of the VMMaker Tool? >>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>> That would be me; back in exobox days. Written along with the original VMMaker and intended to be an example of clean, tidy, morphic usage. I've no idea if anyone ever uses it now, since running it via scripting has proven more valuable. >>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>> tim >>>>>>>>>>>>>>>>>> -- >>>>>>>>>>>>>>>>>> tim Rowledge; >>>>>>>>>>>>>>>>>> tim at rowledge.org >>>>>>>>>>>>>>>>>> ; >>>>>>>>>>>>>>>>>> http://www.rowledge.org/tim >>>>>>>>>>>>>>>>>> "Wibble" said Pooh the stress beginning to show. >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> -- >>>>>>>>>>>>>>>> K, r >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> -- >>>>>>>>>>>>>>> K, r >>>>>>>>>>>>> >>>>>>>>>>>>> -- >>>>>>>>>>>>> K, r >>>>>>>>>>>> >>>>>>>>>>>> -- >>>>>>>>>>>> K, r >>>>>>>>>>> >>>>>>>>>>> -- >>>>>>>>>>> K, r >>>>>>>>>> >>>>>>>>>> -- >>>>>>>>>> K, r >>>>>>>> >>>>>>>> -- >>>>>>>> K, r >>>>>>> >>>>>>> -- >>>>>>> K, r >>>>>> >>>>>> -- >>>>>> K, r >>>>> >>>>> -- >>>>> K, r >>>> >>>> -- >>>> K, r >>> >>> -- >>> K, r >> >> -- >> K, r > > -- > K, r -- K, r -------------- next part -------------- An HTML attachment was scrubbed... URL: -------------- next part -------------- A non-text attachment was scrubbed... Name: 7420963_20200328125416581_1_LARGE.jpg Type: image/jpeg Size: 47844 bytes Desc: not available URL: From robert.withers at pm.me Fri Oct 2 07:24:23 2020 From: robert.withers at pm.me (Robert Withers) Date: Fri, 02 Oct 2020 07:24:23 +0000 Subject: [squeak-dev] Curious history In-Reply-To: <1f48b8e3-b067-1dd6-441f-28dbba1b8d4d@pm.me> References: <7bf3b5e7-4153-8908-f238-21bfaecf0953@pm.me> <1f48b8e3-b067-1dd6-441f-28dbba1b8d4d@pm.me> Message-ID: <5c83a8bd-c9c4-4aa0-d96b-4f17d9b07714@pm.me> https://youtu.be/a-mAK3uB2_0 On 10/2/20 3:24 AM, Robert Withers wrote: > https://youtu.be/8c8_DEtMUOM > > On 10/2/20 3:23 AM, Robert Withers wrote: > >> https://youtu.be/q7p-ihYOG5s >> >> On 10/2/20 3:16 AM, Robert Withers wrote: >> >>> https://youtu.be/goeZZ4KFXTY >>> >>> On 10/2/20 3:07 AM, Robert Withers wrote: >>> >>>> I haven't heard from sparky, recently. Has anyone? >>>> >>>> On 10/2/20 3:03 AM, Robert Withers wrote: >>>> >>>>> Gotta meditate to this entire run! It's deep. >>>>> >>>>> https://soundcloud.com/yusuke-mizushima/acid-jazz-mix-jazzual-suspects >>>>> >>>>> On 10/2/20 2:50 AM, Robert Withers via Squeak-dev wrote: >>>>> >>>>>> https://soundcloud.com/robert_withers/rasta >>>>>> >>>>>> https://soundcloud.com/robert_withers/mando >>>>>> >>>>>> On 10/2/20 2:39 AM, Robert Withers wrote: >>>>>> >>>>>>> Play a bit of these spicy beats! The music helps me to express what is on the inside. >>>>>>> >>>>>>> https://youtu.be/3q8nGnls1Ow?t=2711 >>>>>>> >>>>>>> On 10/2/20 2:26 AM, Robert Withers wrote: >>>>>>> >>>>>>>> For I will restore health unto thee, and I will heal thee of thy wounds, saith the Lord; because they called thee an Outcast, saying, This is Zion, whom no man seeketh after. >>>>>>>> >>>>>>>> Jeremiah 30:17 >>>>>>>> >>>>>>>> On 10/2/20 2:22 AM, Robert Withers via Squeak-dev wrote: >>>>>>>> >>>>>>>>> Thank you for reaching out in this manner on these issues. Though be ye not concerned for my health, Ron, I am in a good place. The sobbing really helps a LOT! And I was brought to that tonight after screaming! And discussing a couple of my many suicide attempts. And realizing the effect my not finding a home with Squeak had affected me over 20 years. It hurts! I sob. All is well; God is Good. The Truth heals. All praise to the Most High! >>>>>>>>> >>>>>>>>> Kindly, >>>>>>>>> Rob >>>>>>>>> >>>>>>>>> On 10/2/20 2:16 AM, Ron Teitelbaum wrote: >>>>>>>>> >>>>>>>>>> Rob, >>>>>>>>>> >>>>>>>>>> You have been in this place before. Is there someone you can talk to for help? Do you have a connection to someone that is working with you on your issues? Would you consider calling them now? >>>>>>>>>> >>>>>>>>>> I've seen you here before. I've seen you doing much better. You should be good to yourself and get help now to move into calmer water and get on a more even keel. A better future includes protecting yourself, being nice to yourself, and making sure you get help when you need it. >>>>>>>>>> >>>>>>>>>> Don't wait until later. I really recommend you do it now. >>>>>>>>>> >>>>>>>>>> Ron >>>>>>>>>> >>>>>>>>>> On Fri, Oct 2, 2020 at 1:50 AM Robert Withers wrote: >>>>>>>>>> >>>>>>>>>>> "And would not encourage the feeding of the indigent!" >>>>>>>>>>> >>>>>>>>>>> On 10/2/20 12:21 AM, Robert Withers wrote: >>>>>>>>>>> >>>>>>>>>>>> The Hellfire and its occupants, not my problem. I pay no attention. Burn. >>>>>>>>>>>> >>>>>>>>>>>> I "Will be in a life of bliss, In a Garden on high. The Fruits whereof"... >>>>>>>>>>>> >>>>>>>>>>>> --------------------------------------------------------------- >>>>>>>>>>>> >>>>>>>>>>>> Al Haqqah (69) >>>>>>>>>>>> >>>>>>>>>>>>>> [The Sure Reality! >>>>>>>>>>>>>> >>>>>>>>>>>>>> What is the Sure Reality? >>>>>>>>>>>>>> >>>>>>>>>>>>>> And what will make thee realise what the Sure Reality is? >>>>>>>>>>>>>> >>>>>>>>>>>>>> The Thamud and the 'Ad People (branded) as false the Stunning Calamity! >>>>>>>>>>>>>> >>>>>>>>>>>>>> But the Thamud,- they were destroyed by a terrible Storm of thunder and lightning! >>>>>>>>>>>>>> >>>>>>>>>>>>>> And the 'Ad, they were destroyed by a furious Wind, exceedingly violent; >>>>>>>>>>>>>> >>>>>>>>>>>>>> He made it rage against them seven nights and eight days in succession: so that thou couldst see the (whole) people lying prostrate in its (path), as they had been roots of hollow palm-trees tumbled down! >>>>>>>>>>>>>> >>>>>>>>>>>>>> Then seest thou any of them left surviving? >>>>>>>>>>>>>> >>>>>>>>>>>>>> And Pharaoh, and those before him, and the Cities Overthrown, committed habitual Sin. >>>>>>>>>>>>>> >>>>>>>>>>>>>> And disobeyed (each) the messenger of their Lord; so He punished them with an abundant Penalty. >>>>>>>>>>>>>> >>>>>>>>>>>>>> We, when the water (of Noah's Flood) overflowed beyond its limits, carried you (mankind), in the floating (Ark), >>>>>>>>>>>>>> >>>>>>>>>>>>>> That We might make it a Message unto you, and that ears (that should hear the tale and) retain its memory should bear its (lessons) in remembrance. >>>>>>>>>>>>>> >>>>>>>>>>>>>> Then, when one blast is sounded on the Trumpet, >>>>>>>>>>>>>> >>>>>>>>>>>>>> And the earth is moved, and its mountains, and they are crushed to powder at one stroke,- >>>>>>>>>>>>>> >>>>>>>>>>>>>> On that Day shall the (Great) Event come to pass. >>>>>>>>>>>>>> >>>>>>>>>>>>>> And the sky will be rent asunder, for it will that Day be flimsy, >>>>>>>>>>>>>> >>>>>>>>>>>>>> And the angels will be on its sides, and eight will, that Day, bear the Throne of thy Lord above them. >>>>>>>>>>>>>> >>>>>>>>>>>>>> That Day shall ye be brought to Judgment: not an act of yours that ye hide will be hidden. >>>>>>>>>>>>>> >>>>>>>>>>>>>> Then he that will be given his Record in his right hand will say: "Ah here! Read ye my Record! >>>>>>>>>>>>>> >>>>>>>>>>>>>> "I did really understand that my Account would (One Day) reach me!" >>>>>>>>>>>>>> >>>>>>>>>>>>>> And he will be in a life of Bliss, >>>>>>>>>>>>>> >>>>>>>>>>>>>> In a Garden on high, >>>>>>>>>>>>>> >>>>>>>>>>>>>> The Fruits whereof (will hang in bunches) low and near. >>>>>>>>>>>>>> >>>>>>>>>>>>>> "Eat ye and drink ye, with full satisfaction; because of the (good) that ye sent before you, in the days that are gone!" >>>>>>>>>>>>>> >>>>>>>>>>>>>> And he that will be given his Record in his left hand, will say: "Ah! Would that my Record had not been given to me! >>>>>>>>>>>>>> >>>>>>>>>>>>>> "And that I had never realised how my account (stood)! >>>>>>>>>>>>>> >>>>>>>>>>>>>> "Ah! Would that (Death) had made an end of me! >>>>>>>>>>>>>> >>>>>>>>>>>>>> "Of no profit to me has been my wealth! >>>>>>>>>>>>>> >>>>>>>>>>>>>> "My power has perished from me!"... >>>>>>>>>>>>>> >>>>>>>>>>>>>> (The stern command will say): "Seize ye him, and bind ye him, >>>>>>>>>>>>>> >>>>>>>>>>>>>> "And burn ye him in the Blazing Fire. >>>>>>>>>>>>>> >>>>>>>>>>>>>> "Further, make him march in a chain, whereof the length is seventy cubits! >>>>>>>>>>>>>> >>>>>>>>>>>>>> "This was he that would not believe in Allah Most High. >>>>>>>>>>>>>> >>>>>>>>>>>>>> "And would not encourage the feeding of the indigent! >>>>>>>>>>>>>> >>>>>>>>>>>>>> "So no friend hath he here this Day. >>>>>>>>>>>>>> >>>>>>>>>>>>>> "Nor hath he any food except the corruption from the washing of wounds, >>>>>>>>>>>>>> >>>>>>>>>>>>>> "Which none do eat but those in sin." >>>>>>>>>>>>>> >>>>>>>>>>>>>> So I do call to witness what ye see, >>>>>>>>>>>>>> >>>>>>>>>>>>>> And what ye see not, >>>>>>>>>>>>>> >>>>>>>>>>>>>> That this is verily the word of an honoured messenger; >>>>>>>>>>>>>> >>>>>>>>>>>>>> It is not the word of a poet: little it is ye believe! >>>>>>>>>>>>>> >>>>>>>>>>>>>> Nor is it the word of a soothsayer: little admonition it is ye receive. >>>>>>>>>>>>>> >>>>>>>>>>>>>> (This is) a Message sent down from the Lord of the Worlds. >>>>>>>>>>>>>> >>>>>>>>>>>>>> And if the messenger were to invent any sayings in Our name, >>>>>>>>>>>>>> >>>>>>>>>>>>>> We should certainly seize him by his right hand, >>>>>>>>>>>>>> >>>>>>>>>>>>>> And We should certainly then cut off the artery of his heart: >>>>>>>>>>>>>> >>>>>>>>>>>>>> Nor could any of you withhold him (from Our wrath). >>>>>>>>>>>>>> >>>>>>>>>>>>>> But verily this is a Message for the Allah-fearing. >>>>>>>>>>>>>> >>>>>>>>>>>>>> And We certainly know that there are amongst you those that reject (it). >>>>>>>>>>>>>> >>>>>>>>>>>>>> But truly (Revelation) is a cause of sorrow for the Unbelievers. >>>>>>>>>>>>>> >>>>>>>>>>>>>> But verily it is Truth of assured certainty. >>>>>>>>>>>>>> >>>>>>>>>>>>>> So glorify the name of thy Lord Most High. >>>>>>>>>>>>>> >>>>>>>>>>>>>> ] - Quran 69:1-52 >>>>>>>>>>>> >>>>>>>>>>>> --- >>>>>>>>>>>> >>>>>>>>>>>> Slosher >>>>>>>>>>>> Oriental, NC >>>>>>>>>>>> >>>>>>>>>>>>>> On 10/1/20 11:36 PM, Ron Teitelbaum wrote: >>>>>>>>>>>>>> >>>>>>>>>>>>>>> Hi Rob, >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> I'm so sorry you felt that way. I know you have had major issues, you have said the same yourself. I'm always happy to see you come back even after long absences. You are a brilliant coder and it has been my distinct pleasure to work with you on Cryptography! Thank you for all you have done and indeed you are responsible for adding significant value to Squeak and the community. >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> We all work on code and it's easy to work your ass off on something to make it work and forget where it originated. We all contribute in large and small ways to everything. If you started VMMaker thank you! It is definitely something a lot of us use. I remember learning all about it a long long time ago before I realized that while I could understand it and I could use it, the people that work on the VM are a level higher than me. I just make apps! >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> I remember getting in an argument with Andreas about adding methods to collection. "WE DON"T NEED more methods in Collection we need to remove most of them and make it easier!" I argued with him about the value over and over but he insisted that they just didn't add enough value. I could have been put off. I could have assumed that Andreas didn't like me but I would have been very wrong! I was really honored to get the chance to work with him and we became great friends. Of course I added my methods to the code we were working on together and was so thrilled when he used my methods for his own code. >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> I don't know what happened with VMMaker but again thank you for your participation in it.. I wanted to take a minute to thank you for your work and to let you know it is my honor to work with you too! I hope that you can come to terms with your past and that you get the help you need for your CPTSD. >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> Everything is possible, the past is gone, but the future is still yours to shape. I wish the past was set in stone but even that moves and slips. I was talking to my wife about a party we attended: "Remember in 2000 we were at the party and counted down the new year and someone hit the breaker and killed the lights! We were all talking about what would happen in the year 2000, would everything break!" Great story except that I hadn't met my wife yet! The past is only what we remember but the future is something we have control over. Peace, calm, happyness, they are all hard to come by but they are possible. I wish you success in finding what makes your future better. >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> I'm sorry about the bad things that have happened to you in the past. As far as I'm concerned, you are welcomed here! >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> All the best, >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> Ron Teitelbaum >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> On Thu, Oct 1, 2020 at 10:38 PM Robert Withers via Squeak-dev wrote: >>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> :sob::sob::sob: >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> On 10/1/20 10:34 PM, Robert Withers wrote: >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> I wrote to the #general Squeak Slack channel: >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>> What a complete larcenous bastard. 20 years ago, this month, published it as his own work. And been against me ever since. My CPTSD (100% veteran service-connected) comes with an exquisitely sensitive deception meter. There are those who shunned me and ostracized me and made me feel MOST UNWELCOME. For 20 years. My delusions kick in and I start suspecting back channel communications against me. My love for Squeak conflicted with what I knew was happening. but I hung in there and worked on Cryptography, work with a group of great people and that I am satisfied with its added value to Squeak. For 20 years I KNEW people were against me in the community. I cannot describe how negatively this affected me. My third suicide attempt, in 2007 I jumped off the roof of a 6 story apartment building and broke my back along with many bones. God did not want me to die, yet, so I lived. This deception and ostracism is most well highlighted by the taking credit for my work, without attribution. He is a complete tool. SHAME! >>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>> I do not know the degree to which he spoke against me. Iimagineit was ever since 2000. Delusions! What is real? I knew not. So much torment! AGONY! They do not welcome me! They are trying to chase me off! Good grief, Charlie Brown. >>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>> Severely exacerbated my CPTSD! I kept trying to kill myself because of it! I thought I had done something egregiously wrong. Whatever it was it had to be my fault. I was not feeling the love, even from myself. >>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>> :scream: >>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>> :scream: >>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>> In 2017, 900 units of insulin brought my blood glucose below 40. I almost succeeded that time. >>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>> :scream: >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> rww >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> On 10/1/20 8:55 PM, Robert Withers wrote: >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>> The worst sort of person is one who takes the credit for the work of >>>>>>>>>>>>>>>>>> another. Wouldn't you agree? >>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>> You may wish to hear John's judgement on the matter. He was right there >>>>>>>>>>>>>>>>>> when it was first built. >>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>> If you are not humble you will be humiliated, and brought low. >>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>> rww >>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>> On 10/1/20 8:35 PM, tim Rowledge wrote: >>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>> On 2020-10-01, at 4:57 PM, Robert Withers via Squeak-dev >>>>>>>>>>>>>>>>>>>> [](mailto:squeak-dev at lists.squeakfoundation.org) >>>>>>>>>>>>>>>>>>>> wrote: >>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>> I am curious. Who was the original author of the VMMaker Tool? >>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>> That would be me; back in exobox days. Written along with the original VMMaker and intended to be an example of clean, tidy, morphic usage. I've no idea if anyone ever uses it now, since running it via scripting has proven more valuable. >>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>> tim >>>>>>>>>>>>>>>>>>> -- >>>>>>>>>>>>>>>>>>> tim Rowledge; >>>>>>>>>>>>>>>>>>> tim at rowledge.org >>>>>>>>>>>>>>>>>>> ; >>>>>>>>>>>>>>>>>>> http://www.rowledge.org/tim >>>>>>>>>>>>>>>>>>> "Wibble" said Pooh the stress beginning to show. >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> -- >>>>>>>>>>>>>>>>> K, r >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> -- >>>>>>>>>>>>>>>> K, r >>>>>>>>>>>>>> >>>>>>>>>>>>>> -- >>>>>>>>>>>>>> K, r >>>>>>>>>>>>> >>>>>>>>>>>>> -- >>>>>>>>>>>>> K, r >>>>>>>>>>>> >>>>>>>>>>>> -- >>>>>>>>>>>> K, r >>>>>>>>>>> >>>>>>>>>>> -- >>>>>>>>>>> K, r >>>>>>>>> >>>>>>>>> -- >>>>>>>>> K, r >>>>>>>> >>>>>>>> -- >>>>>>>> K, r >>>>>>> >>>>>>> -- >>>>>>> K, r >>>>>> >>>>>> -- >>>>>> K, r >>>>> >>>>> -- >>>>> K, r >>>> >>>> -- >>>> K, r >>> >>> -- >>> K, r >> >> -- >> K, r > > -- > K, r -- K, r -------------- next part -------------- An HTML attachment was scrubbed... URL: -------------- next part -------------- A non-text attachment was scrubbed... Name: 7420963_20200328125416581_1_LARGE.jpg Type: image/jpeg Size: 47844 bytes Desc: not available URL: From robert.withers at pm.me Fri Oct 2 07:24:43 2020 From: robert.withers at pm.me (Robert Withers) Date: Fri, 02 Oct 2020 07:24:43 +0000 Subject: [squeak-dev] Curious history In-Reply-To: <5c83a8bd-c9c4-4aa0-d96b-4f17d9b07714@pm.me> References: <7bf3b5e7-4153-8908-f238-21bfaecf0953@pm.me> <1f48b8e3-b067-1dd6-441f-28dbba1b8d4d@pm.me> <5c83a8bd-c9c4-4aa0-d96b-4f17d9b07714@pm.me> Message-ID: https://youtu.be/3GLf-VT4wbY On 10/2/20 3:24 AM, Robert Withers wrote: > https://youtu.be/a-mAK3uB2_0 > > On 10/2/20 3:24 AM, Robert Withers wrote: > >> https://youtu.be/8c8_DEtMUOM >> >> On 10/2/20 3:23 AM, Robert Withers wrote: >> >>> https://youtu.be/q7p-ihYOG5s >>> >>> On 10/2/20 3:16 AM, Robert Withers wrote: >>> >>>> https://youtu.be/goeZZ4KFXTY >>>> >>>> On 10/2/20 3:07 AM, Robert Withers wrote: >>>> >>>>> I haven't heard from sparky, recently. Has anyone? >>>>> >>>>> On 10/2/20 3:03 AM, Robert Withers wrote: >>>>> >>>>>> Gotta meditate to this entire run! It's deep. >>>>>> >>>>>> https://soundcloud.com/yusuke-mizushima/acid-jazz-mix-jazzual-suspects >>>>>> >>>>>> On 10/2/20 2:50 AM, Robert Withers via Squeak-dev wrote: >>>>>> >>>>>>> https://soundcloud.com/robert_withers/rasta >>>>>>> >>>>>>> https://soundcloud.com/robert_withers/mando >>>>>>> >>>>>>> On 10/2/20 2:39 AM, Robert Withers wrote: >>>>>>> >>>>>>>> Play a bit of these spicy beats! The music helps me to express what is on the inside. >>>>>>>> >>>>>>>> https://youtu.be/3q8nGnls1Ow?t=2711 >>>>>>>> >>>>>>>> On 10/2/20 2:26 AM, Robert Withers wrote: >>>>>>>> >>>>>>>>> For I will restore health unto thee, and I will heal thee of thy wounds, saith the Lord; because they called thee an Outcast, saying, This is Zion, whom no man seeketh after. >>>>>>>>> >>>>>>>>> Jeremiah 30:17 >>>>>>>>> >>>>>>>>> On 10/2/20 2:22 AM, Robert Withers via Squeak-dev wrote: >>>>>>>>> >>>>>>>>>> Thank you for reaching out in this manner on these issues. Though be ye not concerned for my health, Ron, I am in a good place. The sobbing really helps a LOT! And I was brought to that tonight after screaming! And discussing a couple of my many suicide attempts. And realizing the effect my not finding a home with Squeak had affected me over 20 years. It hurts! I sob. All is well; God is Good. The Truth heals. All praise to the Most High! >>>>>>>>>> >>>>>>>>>> Kindly, >>>>>>>>>> Rob >>>>>>>>>> >>>>>>>>>> On 10/2/20 2:16 AM, Ron Teitelbaum wrote: >>>>>>>>>> >>>>>>>>>>> Rob, >>>>>>>>>>> >>>>>>>>>>> You have been in this place before. Is there someone you can talk to for help? Do you have a connection to someone that is working with you on your issues? Would you consider calling them now? >>>>>>>>>>> >>>>>>>>>>> I've seen you here before. I've seen you doing much better. You should be good to yourself and get help now to move into calmer water and get on a more even keel. A better future includes protecting yourself, being nice to yourself, and making sure you get help when you need it. >>>>>>>>>>> >>>>>>>>>>> Don't wait until later. I really recommend you do it now. >>>>>>>>>>> >>>>>>>>>>> Ron >>>>>>>>>>> >>>>>>>>>>> On Fri, Oct 2, 2020 at 1:50 AM Robert Withers wrote: >>>>>>>>>>> >>>>>>>>>>>> "And would not encourage the feeding of the indigent!" >>>>>>>>>>>> >>>>>>>>>>>> On 10/2/20 12:21 AM, Robert Withers wrote: >>>>>>>>>>>> >>>>>>>>>>>>> The Hellfire and its occupants, not my problem. I pay no attention. Burn. >>>>>>>>>>>>> >>>>>>>>>>>>> I "Will be in a life of bliss, In a Garden on high. The Fruits whereof"... >>>>>>>>>>>>> >>>>>>>>>>>>> --------------------------------------------------------------- >>>>>>>>>>>>> >>>>>>>>>>>>> Al Haqqah (69) >>>>>>>>>>>>> >>>>>>>>>>>>>>> [The Sure Reality! >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> What is the Sure Reality? >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> And what will make thee realise what the Sure Reality is? >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> The Thamud and the 'Ad People (branded) as false the Stunning Calamity! >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> But the Thamud,- they were destroyed by a terrible Storm of thunder and lightning! >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> And the 'Ad, they were destroyed by a furious Wind, exceedingly violent; >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> He made it rage against them seven nights and eight days in succession: so that thou couldst see the (whole) people lying prostrate in its (path), as they had been roots of hollow palm-trees tumbled down! >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> Then seest thou any of them left surviving? >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> And Pharaoh, and those before him, and the Cities Overthrown, committed habitual Sin. >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> And disobeyed (each) the messenger of their Lord; so He punished them with an abundant Penalty. >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> We, when the water (of Noah's Flood) overflowed beyond its limits, carried you (mankind), in the floating (Ark), >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> That We might make it a Message unto you, and that ears (that should hear the tale and) retain its memory should bear its (lessons) in remembrance. >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> Then, when one blast is sounded on the Trumpet, >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> And the earth is moved, and its mountains, and they are crushed to powder at one stroke,- >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> On that Day shall the (Great) Event come to pass. >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> And the sky will be rent asunder, for it will that Day be flimsy, >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> And the angels will be on its sides, and eight will, that Day, bear the Throne of thy Lord above them. >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> That Day shall ye be brought to Judgment: not an act of yours that ye hide will be hidden. >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> Then he that will be given his Record in his right hand will say: "Ah here! Read ye my Record! >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> "I did really understand that my Account would (One Day) reach me!" >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> And he will be in a life of Bliss, >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> In a Garden on high, >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> The Fruits whereof (will hang in bunches) low and near. >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> "Eat ye and drink ye, with full satisfaction; because of the (good) that ye sent before you, in the days that are gone!" >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> And he that will be given his Record in his left hand, will say: "Ah! Would that my Record had not been given to me! >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> "And that I had never realised how my account (stood)! >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> "Ah! Would that (Death) had made an end of me! >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> "Of no profit to me has been my wealth! >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> "My power has perished from me!"... >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> (The stern command will say): "Seize ye him, and bind ye him, >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> "And burn ye him in the Blazing Fire. >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> "Further, make him march in a chain, whereof the length is seventy cubits! >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> "This was he that would not believe in Allah Most High. >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> "And would not encourage the feeding of the indigent! >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> "So no friend hath he here this Day. >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> "Nor hath he any food except the corruption from the washing of wounds, >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> "Which none do eat but those in sin." >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> So I do call to witness what ye see, >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> And what ye see not, >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> That this is verily the word of an honoured messenger; >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> It is not the word of a poet: little it is ye believe! >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> Nor is it the word of a soothsayer: little admonition it is ye receive. >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> (This is) a Message sent down from the Lord of the Worlds. >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> And if the messenger were to invent any sayings in Our name, >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> We should certainly seize him by his right hand, >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> And We should certainly then cut off the artery of his heart: >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> Nor could any of you withhold him (from Our wrath). >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> But verily this is a Message for the Allah-fearing. >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> And We certainly know that there are amongst you those that reject (it). >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> But truly (Revelation) is a cause of sorrow for the Unbelievers. >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> But verily it is Truth of assured certainty. >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> So glorify the name of thy Lord Most High. >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> ] - Quran 69:1-52 >>>>>>>>>>>>> >>>>>>>>>>>>> --- >>>>>>>>>>>>> >>>>>>>>>>>>> Slosher >>>>>>>>>>>>> Oriental, NC >>>>>>>>>>>>> >>>>>>>>>>>>>>> On 10/1/20 11:36 PM, Ron Teitelbaum wrote: >>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> Hi Rob, >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> I'm so sorry you felt that way. I know you have had major issues, you have said the same yourself. I'm always happy to see you come back even after long absences. You are a brilliant coder and it has been my distinct pleasure to work with you on Cryptography! Thank you for all you have done and indeed you are responsible for adding significant value to Squeak and the community. >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> We all work on code and it's easy to work your ass off on something to make it work and forget where it originated. We all contribute in large and small ways to everything. If you started VMMaker thank you! It is definitely something a lot of us use. I remember learning all about it a long long time ago before I realized that while I could understand it and I could use it, the people that work on the VM are a level higher than me. I just make apps! >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> I remember getting in an argument with Andreas about adding methods to collection. "WE DON"T NEED more methods in Collection we need to remove most of them and make it easier!" I argued with him about the value over and over but he insisted that they just didn't add enough value. I could have been put off. I could have assumed that Andreas didn't like me but I would have been very wrong! I was really honored to get the chance to work with him and we became great friends. Of course I added my methods to the code we were working on together and was so thrilled when he used my methods for his own code. >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> I don't know what happened with VMMaker but again thank you for your participation in it.. I wanted to take a minute to thank you for your work and to let you know it is my honor to work with you too! I hope that you can come to terms with your past and that you get the help you need for your CPTSD. >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> Everything is possible, the past is gone, but the future is still yours to shape. I wish the past was set in stone but even that moves and slips. I was talking to my wife about a party we attended: "Remember in 2000 we were at the party and counted down the new year and someone hit the breaker and killed the lights! We were all talking about what would happen in the year 2000, would everything break!" Great story except that I hadn't met my wife yet! The past is only what we remember but the future is something we have control over. Peace, calm, happyness, they are all hard to come by but they are possible. I wish you success in finding what makes your future better. >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> I'm sorry about the bad things that have happened to you in the past. As far as I'm concerned, you are welcomed here! >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> All the best, >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> Ron Teitelbaum >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> On Thu, Oct 1, 2020 at 10:38 PM Robert Withers via Squeak-dev wrote: >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> :sob::sob::sob: >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> On 10/1/20 10:34 PM, Robert Withers wrote: >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>> I wrote to the #general Squeak Slack channel: >>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>> What a complete larcenous bastard. 20 years ago, this month, published it as his own work. And been against me ever since. My CPTSD (100% veteran service-connected) comes with an exquisitely sensitive deception meter. There are those who shunned me and ostracized me and made me feel MOST UNWELCOME. For 20 years. My delusions kick in and I start suspecting back channel communications against me. My love for Squeak conflicted with what I knew was happening. but I hung in there and worked on Cryptography, work with a group of great people and that I am satisfied with its added value to Squeak. For 20 years I KNEW people were against me in the community. I cannot describe how negatively this affected me. My third suicide attempt, in 2007 I jumped off the roof of a 6 story apartment building and broke my back along with many bones. God did not want me to die, yet, so I lived. This deception and ostracism is most well highlighted by the taking credit for my work, without attribution. He is a complete tool. SHAME! >>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>> I do not know the degree to which he spoke against me. Iimagineit was ever since 2000. Delusions! What is real? I knew not. So much torment! AGONY! They do not welcome me! They are trying to chase me off! Good grief, Charlie Brown. >>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>> Severely exacerbated my CPTSD! I kept trying to kill myself because of it! I thought I had done something egregiously wrong. Whatever it was it had to be my fault. I was not feeling the love, even from myself. >>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>> :scream: >>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>> :scream: >>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>> In 2017, 900 units of insulin brought my blood glucose below 40. I almost succeeded that time. >>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>> :scream: >>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>> rww >>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>> On 10/1/20 8:55 PM, Robert Withers wrote: >>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>> The worst sort of person is one who takes the credit for the work of >>>>>>>>>>>>>>>>>>> another. Wouldn't you agree? >>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>> You may wish to hear John's judgement on the matter. He was right there >>>>>>>>>>>>>>>>>>> when it was first built. >>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>> If you are not humble you will be humiliated, and brought low. >>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>> rww >>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>> On 10/1/20 8:35 PM, tim Rowledge wrote: >>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>> On 2020-10-01, at 4:57 PM, Robert Withers via Squeak-dev >>>>>>>>>>>>>>>>>>>>> [](mailto:squeak-dev at lists.squeakfoundation.org) >>>>>>>>>>>>>>>>>>>>> wrote: >>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>> I am curious. Who was the original author of the VMMaker Tool? >>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>> That would be me; back in exobox days. Written along with the original VMMaker and intended to be an example of clean, tidy, morphic usage. I've no idea if anyone ever uses it now, since running it via scripting has proven more valuable. >>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>> tim >>>>>>>>>>>>>>>>>>>> -- >>>>>>>>>>>>>>>>>>>> tim Rowledge; >>>>>>>>>>>>>>>>>>>> tim at rowledge.org >>>>>>>>>>>>>>>>>>>> ; >>>>>>>>>>>>>>>>>>>> http://www.rowledge.org/tim >>>>>>>>>>>>>>>>>>>> "Wibble" said Pooh the stress beginning to show. >>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>> -- >>>>>>>>>>>>>>>>>> K, r >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> -- >>>>>>>>>>>>>>>>> K, r >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> -- >>>>>>>>>>>>>>> K, r >>>>>>>>>>>>>> >>>>>>>>>>>>>> -- >>>>>>>>>>>>>> K, r >>>>>>>>>>>>> >>>>>>>>>>>>> -- >>>>>>>>>>>>> K, r >>>>>>>>>>>> >>>>>>>>>>>> -- >>>>>>>>>>>> K, r >>>>>>>>>> >>>>>>>>>> -- >>>>>>>>>> K, r >>>>>>>>> >>>>>>>>> -- >>>>>>>>> K, r >>>>>>>> >>>>>>>> -- >>>>>>>> K, r >>>>>>> >>>>>>> -- >>>>>>> K, r >>>>>> >>>>>> -- >>>>>> K, r >>>>> >>>>> -- >>>>> K, r >>>> >>>> -- >>>> K, r >>> >>> -- >>> K, r >> >> -- >> K, r > > -- > K, r -- K, r -------------- next part -------------- An HTML attachment was scrubbed... URL: -------------- next part -------------- A non-text attachment was scrubbed... Name: 7420963_20200328125416581_1_LARGE.jpg Type: image/jpeg Size: 47844 bytes Desc: not available URL: From robert.withers at pm.me Fri Oct 2 07:33:57 2020 From: robert.withers at pm.me (Robert Withers) Date: Fri, 02 Oct 2020 07:33:57 +0000 Subject: [squeak-dev] Curious history In-Reply-To: References: <7bf3b5e7-4153-8908-f238-21bfaecf0953@pm.me> <1f48b8e3-b067-1dd6-441f-28dbba1b8d4d@pm.me> <4RzffQkMYVDio5ypO3BdDDogbcHCBBrlCc1fxoT8GmqCUWhN0sU9yBdJfjTNNuM4-qL-oLkLcIB--mYjPkf0Lg==@protonmail.conversationid> <5c83a8bd-c9c4-4aa0-d96b-4f17d9b07714@pm.me> Message-ID: <1b3eb992-5b8a-2eef-6cb7-4ad7dc7b2363@pm.me> Alright, goddammit! Here is some more Truth, if you believe in my message. If you can handle it, it's Big. PROOF OF THE TRUTH OF THE PROPHESIES OF THE BIBLE! Hang on... On 10/2/20 3:24 AM, Robert Withers wrote: > https://youtu.be/3GLf-VT4wbY > > On 10/2/20 3:24 AM, Robert Withers wrote: > >> https://youtu.be/a-mAK3uB2_0 >> >> On 10/2/20 3:24 AM, Robert Withers wrote: >> >>> https://youtu.be/8c8_DEtMUOM >>> >>> On 10/2/20 3:23 AM, Robert Withers wrote: >>> >>>> https://youtu.be/q7p-ihYOG5s >>>> >>>> On 10/2/20 3:16 AM, Robert Withers wrote: >>>> >>>>> https://youtu.be/goeZZ4KFXTY >>>>> >>>>> On 10/2/20 3:07 AM, Robert Withers wrote: >>>>> >>>>>> I haven't heard from sparky, recently. Has anyone? >>>>>> >>>>>> On 10/2/20 3:03 AM, Robert Withers wrote: >>>>>> >>>>>>> Gotta meditate to this entire run! It's deep. >>>>>>> >>>>>>> https://soundcloud.com/yusuke-mizushima/acid-jazz-mix-jazzual-suspects >>>>>>> >>>>>>> On 10/2/20 2:50 AM, Robert Withers via Squeak-dev wrote: >>>>>>> >>>>>>>> https://soundcloud.com/robert_withers/rasta >>>>>>>> >>>>>>>> https://soundcloud.com/robert_withers/mando >>>>>>>> >>>>>>>> On 10/2/20 2:39 AM, Robert Withers wrote: >>>>>>>> >>>>>>>>> Play a bit of these spicy beats! The music helps me to express what is on the inside. >>>>>>>>> >>>>>>>>> https://youtu.be/3q8nGnls1Ow?t=2711 >>>>>>>>> >>>>>>>>> On 10/2/20 2:26 AM, Robert Withers wrote: >>>>>>>>> >>>>>>>>>> For I will restore health unto thee, and I will heal thee of thy wounds, saith the Lord; because they called thee an Outcast, saying, This is Zion, whom no man seeketh after. >>>>>>>>>> >>>>>>>>>> Jeremiah 30:17 >>>>>>>>>> >>>>>>>>>> On 10/2/20 2:22 AM, Robert Withers via Squeak-dev wrote: >>>>>>>>>> >>>>>>>>>>> Thank you for reaching out in this manner on these issues. Though be ye not concerned for my health, Ron, I am in a good place. The sobbing really helps a LOT! And I was brought to that tonight after screaming! And discussing a couple of my many suicide attempts. And realizing the effect my not finding a home with Squeak had affected me over 20 years. It hurts! I sob. All is well; God is Good. The Truth heals. All praise to the Most High! >>>>>>>>>>> >>>>>>>>>>> Kindly, >>>>>>>>>>> Rob >>>>>>>>>>> >>>>>>>>>>> On 10/2/20 2:16 AM, Ron Teitelbaum wrote: >>>>>>>>>>> >>>>>>>>>>>> Rob, >>>>>>>>>>>> >>>>>>>>>>>> You have been in this place before. Is there someone you can talk to for help? Do you have a connection to someone that is working with you on your issues? Would you consider calling them now? >>>>>>>>>>>> >>>>>>>>>>>> I've seen you here before. I've seen you doing much better. You should be good to yourself and get help now to move into calmer water and get on a more even keel. A better future includes protecting yourself, being nice to yourself, and making sure you get help when you need it. >>>>>>>>>>>> >>>>>>>>>>>> Don't wait until later. I really recommend you do it now. >>>>>>>>>>>> >>>>>>>>>>>> Ron >>>>>>>>>>>> >>>>>>>>>>>> On Fri, Oct 2, 2020 at 1:50 AM Robert Withers wrote: >>>>>>>>>>>> >>>>>>>>>>>>> "And would not encourage the feeding of the indigent!" >>>>>>>>>>>>> >>>>>>>>>>>>> On 10/2/20 12:21 AM, Robert Withers wrote: >>>>>>>>>>>>> >>>>>>>>>>>>>> The Hellfire and its occupants, not my problem. I pay no attention. Burn. >>>>>>>>>>>>>> >>>>>>>>>>>>>> I "Will be in a life of bliss, In a Garden on high. The Fruits whereof"... >>>>>>>>>>>>>> >>>>>>>>>>>>>> --------------------------------------------------------------- >>>>>>>>>>>>>> >>>>>>>>>>>>>> Al Haqqah (69) >>>>>>>>>>>>>> >>>>>>>>>>>>>>>> [The Sure Reality! >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> What is the Sure Reality? >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> And what will make thee realise what the Sure Reality is? >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> The Thamud and the 'Ad People (branded) as false the Stunning Calamity! >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> But the Thamud,- they were destroyed by a terrible Storm of thunder and lightning! >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> And the 'Ad, they were destroyed by a furious Wind, exceedingly violent; >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> He made it rage against them seven nights and eight days in succession: so that thou couldst see the (whole) people lying prostrate in its (path), as they had been roots of hollow palm-trees tumbled down! >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> Then seest thou any of them left surviving? >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> And Pharaoh, and those before him, and the Cities Overthrown, committed habitual Sin. >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> And disobeyed (each) the messenger of their Lord; so He punished them with an abundant Penalty. >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> We, when the water (of Noah's Flood) overflowed beyond its limits, carried you (mankind), in the floating (Ark), >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> That We might make it a Message unto you, and that ears (that should hear the tale and) retain its memory should bear its (lessons) in remembrance. >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> Then, when one blast is sounded on the Trumpet, >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> And the earth is moved, and its mountains, and they are crushed to powder at one stroke,- >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> On that Day shall the (Great) Event come to pass. >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> And the sky will be rent asunder, for it will that Day be flimsy, >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> And the angels will be on its sides, and eight will, that Day, bear the Throne of thy Lord above them. >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> That Day shall ye be brought to Judgment: not an act of yours that ye hide will be hidden. >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> Then he that will be given his Record in his right hand will say: "Ah here! Read ye my Record! >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> "I did really understand that my Account would (One Day) reach me!" >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> And he will be in a life of Bliss, >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> In a Garden on high, >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> The Fruits whereof (will hang in bunches) low and near. >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> "Eat ye and drink ye, with full satisfaction; because of the (good) that ye sent before you, in the days that are gone!" >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> And he that will be given his Record in his left hand, will say: "Ah! Would that my Record had not been given to me! >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> "And that I had never realised how my account (stood)! >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> "Ah! Would that (Death) had made an end of me! >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> "Of no profit to me has been my wealth! >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> "My power has perished from me!"... >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> (The stern command will say): "Seize ye him, and bind ye him, >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> "And burn ye him in the Blazing Fire. >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> "Further, make him march in a chain, whereof the length is seventy cubits! >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> "This was he that would not believe in Allah Most High. >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> "And would not encourage the feeding of the indigent! >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> "So no friend hath he here this Day. >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> "Nor hath he any food except the corruption from the washing of wounds, >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> "Which none do eat but those in sin." >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> So I do call to witness what ye see, >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> And what ye see not, >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> That this is verily the word of an honoured messenger; >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> It is not the word of a poet: little it is ye believe! >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> Nor is it the word of a soothsayer: little admonition it is ye receive. >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> (This is) a Message sent down from the Lord of the Worlds. >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> And if the messenger were to invent any sayings in Our name, >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> We should certainly seize him by his right hand, >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> And We should certainly then cut off the artery of his heart: >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> Nor could any of you withhold him (from Our wrath). >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> But verily this is a Message for the Allah-fearing. >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> And We certainly know that there are amongst you those that reject (it). >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> But truly (Revelation) is a cause of sorrow for the Unbelievers. >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> But verily it is Truth of assured certainty. >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> So glorify the name of thy Lord Most High. >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> ] - Quran 69:1-52 >>>>>>>>>>>>>> >>>>>>>>>>>>>> --- >>>>>>>>>>>>>> >>>>>>>>>>>>>> Slosher >>>>>>>>>>>>>> Oriental, NC >>>>>>>>>>>>>> >>>>>>>>>>>>>>>> On 10/1/20 11:36 PM, Ron Teitelbaum wrote: >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> Hi Rob, >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> I'm so sorry you felt that way. I know you have had major issues, you have said the same yourself. I'm always happy to see you come back even after long absences. You are a brilliant coder and it has been my distinct pleasure to work with you on Cryptography! Thank you for all you have done and indeed you are responsible for adding significant value to Squeak and the community. >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> We all work on code and it's easy to work your ass off on something to make it work and forget where it originated. We all contribute in large and small ways to everything. If you started VMMaker thank you! It is definitely something a lot of us use. I remember learning all about it a long long time ago before I realized that while I could understand it and I could use it, the people that work on the VM are a level higher than me. I just make apps! >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> I remember getting in an argument with Andreas about adding methods to collection. "WE DON"T NEED more methods in Collection we need to remove most of them and make it easier!" I argued with him about the value over and over but he insisted that they just didn't add enough value. I could have been put off. I could have assumed that Andreas didn't like me but I would have been very wrong! I was really honored to get the chance to work with him and we became great friends. Of course I added my methods to the code we were working on together and was so thrilled when he used my methods for his own code. >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> I don't know what happened with VMMaker but again thank you for your participation in it.. I wanted to take a minute to thank you for your work and to let you know it is my honor to work with you too! I hope that you can come to terms with your past and that you get the help you need for your CPTSD. >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> Everything is possible, the past is gone, but the future is still yours to shape. I wish the past was set in stone but even that moves and slips. I was talking to my wife about a party we attended: "Remember in 2000 we were at the party and counted down the new year and someone hit the breaker and killed the lights! We were all talking about what would happen in the year 2000, would everything break!" Great story except that I hadn't met my wife yet! The past is only what we remember but the future is something we have control over. Peace, calm, happyness, they are all hard to come by but they are possible. I wish you success in finding what makes your future better. >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> I'm sorry about the bad things that have happened to you in the past. As far as I'm concerned, you are welcomed here! >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> All the best, >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> Ron Teitelbaum >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> On Thu, Oct 1, 2020 at 10:38 PM Robert Withers via Squeak-dev wrote: >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>> :sob::sob::sob: >>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>> On 10/1/20 10:34 PM, Robert Withers wrote: >>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>> I wrote to the #general Squeak Slack channel: >>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>> What a complete larcenous bastard. 20 years ago, this month, published it as his own work. And been against me ever since. My CPTSD (100% veteran service-connected) comes with an exquisitely sensitive deception meter. There are those who shunned me and ostracized me and made me feel MOST UNWELCOME. For 20 years. My delusions kick in and I start suspecting back channel communications against me. My love for Squeak conflicted with what I knew was happening. but I hung in there and worked on Cryptography, work with a group of great people and that I am satisfied with its added value to Squeak. For 20 years I KNEW people were against me in the community. I cannot describe how negatively this affected me. My third suicide attempt, in 2007 I jumped off the roof of a 6 story apartment building and broke my back along with many bones. God did not want me to die, yet, so I lived. This deception and ostracism is most well highlighted by the taking credit for my work, without attribution. He is a complete tool. SHAME! >>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>> I do not know the degree to which he spoke against me. Iimagineit was ever since 2000. Delusions! What is real? I knew not. So much torment! AGONY! They do not welcome me! They are trying to chase me off! Good grief, Charlie Brown. >>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>> Severely exacerbated my CPTSD! I kept trying to kill myself because of it! I thought I had done something egregiously wrong. Whatever it was it had to be my fault. I was not feeling the love, even from myself. >>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>> :scream: >>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>> :scream: >>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>> In 2017, 900 units of insulin brought my blood glucose below 40. I almost succeeded that time. >>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>> :scream: >>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>> rww >>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>> On 10/1/20 8:55 PM, Robert Withers wrote: >>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>> The worst sort of person is one who takes the credit for the work of >>>>>>>>>>>>>>>>>>>> another. Wouldn't you agree? >>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>> You may wish to hear John's judgement on the matter. He was right there >>>>>>>>>>>>>>>>>>>> when it was first built. >>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>> If you are not humble you will be humiliated, and brought low. >>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>> rww >>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>> On 10/1/20 8:35 PM, tim Rowledge wrote: >>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>> On 2020-10-01, at 4:57 PM, Robert Withers via Squeak-dev >>>>>>>>>>>>>>>>>>>>>> [](mailto:squeak-dev at lists.squeakfoundation.org) >>>>>>>>>>>>>>>>>>>>>> wrote: >>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>> I am curious. Who was the original author of the VMMaker Tool? >>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>> That would be me; back in exobox days. Written along with the original VMMaker and intended to be an example of clean, tidy, morphic usage. I've no idea if anyone ever uses it now, since running it via scripting has proven more valuable. >>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>> tim >>>>>>>>>>>>>>>>>>>>> -- >>>>>>>>>>>>>>>>>>>>> tim Rowledge; >>>>>>>>>>>>>>>>>>>>> tim at rowledge.org >>>>>>>>>>>>>>>>>>>>> ; >>>>>>>>>>>>>>>>>>>>> http://www.rowledge.org/tim >>>>>>>>>>>>>>>>>>>>> "Wibble" said Pooh the stress beginning to show. >>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>> -- >>>>>>>>>>>>>>>>>>> K, r >>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>> -- >>>>>>>>>>>>>>>>>> K, r >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> -- >>>>>>>>>>>>>>>> K, r >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> -- >>>>>>>>>>>>>>> K, r >>>>>>>>>>>>>> >>>>>>>>>>>>>> -- >>>>>>>>>>>>>> K, r >>>>>>>>>>>>> >>>>>>>>>>>>> -- >>>>>>>>>>>>> K, r >>>>>>>>>>> >>>>>>>>>>> -- >>>>>>>>>>> K, r >>>>>>>>>> >>>>>>>>>> -- >>>>>>>>>> K, r >>>>>>>>> >>>>>>>>> -- >>>>>>>>> K, r >>>>>>>> >>>>>>>> -- >>>>>>>> K, r >>>>>>> >>>>>>> -- >>>>>>> K, r >>>>>> >>>>>> -- >>>>>> K, r >>>>> >>>>> -- >>>>> K, r >>>> >>>> -- >>>> K, r >>> >>> -- >>> K, r >> >> -- >> K, r > > -- > K, r -- K, r -------------- next part -------------- An HTML attachment was scrubbed... URL: -------------- next part -------------- A non-text attachment was scrubbed... Name: 7420963_20200328125416581_1_LARGE.jpg Type: image/jpeg Size: 47844 bytes Desc: not available URL: -------------- next part -------------- A non-text attachment was scrubbed... Name: desolate.jpg Type: image/jpeg Size: 44831 bytes Desc: not available URL: From robert.withers at pm.me Fri Oct 2 07:48:08 2020 From: robert.withers at pm.me (Robert Withers) Date: Fri, 02 Oct 2020 07:48:08 +0000 Subject: [squeak-dev] Curious history In-Reply-To: <1b3eb992-5b8a-2eef-6cb7-4ad7dc7b2363@pm.me> References: <1f48b8e3-b067-1dd6-441f-28dbba1b8d4d@pm.me> <4RzffQkMYVDio5ypO3BdDDogbcHCBBrlCc1fxoT8GmqCUWhN0sU9yBdJfjTNNuM4-qL-oLkLcIB--mYjPkf0Lg==@protonmail.conversationid> <5c83a8bd-c9c4-4aa0-d96b-4f17d9b07714@pm.me> <_eZff4s5CuTU0qlHPChlxRQahQy0KVIpt4Edmw5l9dIM7rvuY4UTY5uArNxy4XfOWQU5ZzRcYXkA0yHEc0Gwbg==@protonmail.internalid> <1b3eb992-5b8a-2eef-6cb7-4ad7dc7b2363@pm.me> Message-ID: <34ec6aa7-ceed-4d38-ac77-760f58df592a@pm.me> https://youtu.be/wqVsfGQ_1SU On 10/2/20 3:33 AM, Robert Withers wrote: > Alright, goddammit! Here is some more Truth, if you believe in my message. If you can handle it, it's Big. > > PROOF OF THE TRUTH OF THE PROPHESIES OF THE BIBLE! > > Hang on... > > On 10/2/20 3:24 AM, Robert Withers wrote: > >> https://youtu.be/3GLf-VT4wbY >> >> On 10/2/20 3:24 AM, Robert Withers wrote: >> >>> https://youtu.be/a-mAK3uB2_0 >>> >>> On 10/2/20 3:24 AM, Robert Withers wrote: >>> >>>> https://youtu.be/8c8_DEtMUOM >>>> >>>> On 10/2/20 3:23 AM, Robert Withers wrote: >>>> >>>>> https://youtu.be/q7p-ihYOG5s >>>>> >>>>> On 10/2/20 3:16 AM, Robert Withers wrote: >>>>> >>>>>> https://youtu.be/goeZZ4KFXTY >>>>>> >>>>>> On 10/2/20 3:07 AM, Robert Withers wrote: >>>>>> >>>>>>> I haven't heard from sparky, recently. Has anyone? >>>>>>> >>>>>>> On 10/2/20 3:03 AM, Robert Withers wrote: >>>>>>> >>>>>>>> Gotta meditate to this entire run! It's deep. >>>>>>>> >>>>>>>> https://soundcloud.com/yusuke-mizushima/acid-jazz-mix-jazzual-suspects >>>>>>>> >>>>>>>> On 10/2/20 2:50 AM, Robert Withers via Squeak-dev wrote: >>>>>>>> >>>>>>>>> https://soundcloud.com/robert_withers/rasta >>>>>>>>> >>>>>>>>> https://soundcloud.com/robert_withers/mando >>>>>>>>> >>>>>>>>> On 10/2/20 2:39 AM, Robert Withers wrote: >>>>>>>>> >>>>>>>>>> Play a bit of these spicy beats! The music helps me to express what is on the inside. >>>>>>>>>> >>>>>>>>>> https://youtu.be/3q8nGnls1Ow?t=2711 >>>>>>>>>> >>>>>>>>>> On 10/2/20 2:26 AM, Robert Withers wrote: >>>>>>>>>> >>>>>>>>>>> For I will restore health unto thee, and I will heal thee of thy wounds, saith the Lord; because they called thee an Outcast, saying, This is Zion, whom no man seeketh after. >>>>>>>>>>> >>>>>>>>>>> Jeremiah 30:17 >>>>>>>>>>> >>>>>>>>>>> On 10/2/20 2:22 AM, Robert Withers via Squeak-dev wrote: >>>>>>>>>>> >>>>>>>>>>>> Thank you for reaching out in this manner on these issues. Though be ye not concerned for my health, Ron, I am in a good place. The sobbing really helps a LOT! And I was brought to that tonight after screaming! And discussing a couple of my many suicide attempts. And realizing the effect my not finding a home with Squeak had affected me over 20 years. It hurts! I sob. All is well; God is Good. The Truth heals. All praise to the Most High! >>>>>>>>>>>> >>>>>>>>>>>> Kindly, >>>>>>>>>>>> Rob >>>>>>>>>>>> >>>>>>>>>>>> On 10/2/20 2:16 AM, Ron Teitelbaum wrote: >>>>>>>>>>>> >>>>>>>>>>>>> Rob, >>>>>>>>>>>>> >>>>>>>>>>>>> You have been in this place before. Is there someone you can talk to for help? Do you have a connection to someone that is working with you on your issues? Would you consider calling them now? >>>>>>>>>>>>> >>>>>>>>>>>>> I've seen you here before. I've seen you doing much better. You should be good to yourself and get help now to move into calmer water and get on a more even keel. A better future includes protecting yourself, being nice to yourself, and making sure you get help when you need it. >>>>>>>>>>>>> >>>>>>>>>>>>> Don't wait until later. I really recommend you do it now. >>>>>>>>>>>>> >>>>>>>>>>>>> Ron >>>>>>>>>>>>> >>>>>>>>>>>>> On Fri, Oct 2, 2020 at 1:50 AM Robert Withers wrote: >>>>>>>>>>>>> >>>>>>>>>>>>>> "And would not encourage the feeding of the indigent!" >>>>>>>>>>>>>> >>>>>>>>>>>>>> On 10/2/20 12:21 AM, Robert Withers wrote: >>>>>>>>>>>>>> >>>>>>>>>>>>>>> The Hellfire and its occupants, not my problem. I pay no attention. Burn. >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> I "Will be in a life of bliss, In a Garden on high. The Fruits whereof"... >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> --------------------------------------------------------------- >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> Al Haqqah (69) >>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> [The Sure Reality! >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> What is the Sure Reality? >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> And what will make thee realise what the Sure Reality is? >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> The Thamud and the 'Ad People (branded) as false the Stunning Calamity! >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> But the Thamud,- they were destroyed by a terrible Storm of thunder and lightning! >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> And the 'Ad, they were destroyed by a furious Wind, exceedingly violent; >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> He made it rage against them seven nights and eight days in succession: so that thou couldst see the (whole) people lying prostrate in its (path), as they had been roots of hollow palm-trees tumbled down! >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> Then seest thou any of them left surviving? >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> And Pharaoh, and those before him, and the Cities Overthrown, committed habitual Sin. >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> And disobeyed (each) the messenger of their Lord; so He punished them with an abundant Penalty. >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> We, when the water (of Noah's Flood) overflowed beyond its limits, carried you (mankind), in the floating (Ark), >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> That We might make it a Message unto you, and that ears (that should hear the tale and) retain its memory should bear its (lessons) in remembrance. >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> Then, when one blast is sounded on the Trumpet, >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> And the earth is moved, and its mountains, and they are crushed to powder at one stroke,- >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> On that Day shall the (Great) Event come to pass. >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> And the sky will be rent asunder, for it will that Day be flimsy, >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> And the angels will be on its sides, and eight will, that Day, bear the Throne of thy Lord above them. >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> That Day shall ye be brought to Judgment: not an act of yours that ye hide will be hidden. >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> Then he that will be given his Record in his right hand will say: "Ah here! Read ye my Record! >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> "I did really understand that my Account would (One Day) reach me!" >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> And he will be in a life of Bliss, >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> In a Garden on high, >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> The Fruits whereof (will hang in bunches) low and near. >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> "Eat ye and drink ye, with full satisfaction; because of the (good) that ye sent before you, in the days that are gone!" >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> And he that will be given his Record in his left hand, will say: "Ah! Would that my Record had not been given to me! >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> "And that I had never realised how my account (stood)! >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> "Ah! Would that (Death) had made an end of me! >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> "Of no profit to me has been my wealth! >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> "My power has perished from me!"... >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> (The stern command will say): "Seize ye him, and bind ye him, >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> "And burn ye him in the Blazing Fire. >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> "Further, make him march in a chain, whereof the length is seventy cubits! >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> "This was he that would not believe in Allah Most High. >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> "And would not encourage the feeding of the indigent! >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> "So no friend hath he here this Day. >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> "Nor hath he any food except the corruption from the washing of wounds, >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> "Which none do eat but those in sin." >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> So I do call to witness what ye see, >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> And what ye see not, >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> That this is verily the word of an honoured messenger; >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> It is not the word of a poet: little it is ye believe! >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> Nor is it the word of a soothsayer: little admonition it is ye receive. >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> (This is) a Message sent down from the Lord of the Worlds. >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> And if the messenger were to invent any sayings in Our name, >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> We should certainly seize him by his right hand, >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> And We should certainly then cut off the artery of his heart: >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> Nor could any of you withhold him (from Our wrath). >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> But verily this is a Message for the Allah-fearing. >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> And We certainly know that there are amongst you those that reject (it). >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> But truly (Revelation) is a cause of sorrow for the Unbelievers. >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> But verily it is Truth of assured certainty. >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> So glorify the name of thy Lord Most High. >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> ] - Quran 69:1-52 >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> --- >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> Slosher >>>>>>>>>>>>>>> Oriental, NC >>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> On 10/1/20 11:36 PM, Ron Teitelbaum wrote: >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>> Hi Rob, >>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>> I'm so sorry you felt that way. I know you have had major issues, you have said the same yourself. I'm always happy to see you come back even after long absences. You are a brilliant coder and it has been my distinct pleasure to work with you on Cryptography! Thank you for all you have done and indeed you are responsible for adding significant value to Squeak and the community. >>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>> We all work on code and it's easy to work your ass off on something to make it work and forget where it originated. We all contribute in large and small ways to everything. If you started VMMaker thank you! It is definitely something a lot of us use. I remember learning all about it a long long time ago before I realized that while I could understand it and I could use it, the people that work on the VM are a level higher than me. I just make apps! >>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>> I remember getting in an argument with Andreas about adding methods to collection. "WE DON"T NEED more methods in Collection we need to remove most of them and make it easier!" I argued with him about the value over and over but he insisted that they just didn't add enough value. I could have been put off. I could have assumed that Andreas didn't like me but I would have been very wrong! I was really honored to get the chance to work with him and we became great friends. Of course I added my methods to the code we were working on together and was so thrilled when he used my methods for his own code. >>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>> I don't know what happened with VMMaker but again thank you for your participation in it.. I wanted to take a minute to thank you for your work and to let you know it is my honor to work with you too! I hope that you can come to terms with your past and that you get the help you need for your CPTSD. >>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>> Everything is possible, the past is gone, but the future is still yours to shape. I wish the past was set in stone but even that moves and slips. I was talking to my wife about a party we attended: "Remember in 2000 we were at the party and counted down the new year and someone hit the breaker and killed the lights! We were all talking about what would happen in the year 2000, would everything break!" Great story except that I hadn't met my wife yet! The past is only what we remember but the future is something we have control over. Peace, calm, happyness, they are all hard to come by but they are possible. I wish you success in finding what makes your future better. >>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>> I'm sorry about the bad things that have happened to you in the past. As far as I'm concerned, you are welcomed here! >>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>> All the best, >>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>> Ron Teitelbaum >>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>> On Thu, Oct 1, 2020 at 10:38 PM Robert Withers via Squeak-dev wrote: >>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>> :sob::sob::sob: >>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>> On 10/1/20 10:34 PM, Robert Withers wrote: >>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>> I wrote to the #general Squeak Slack channel: >>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>> What a complete larcenous bastard. 20 years ago, this month, published it as his own work. And been against me ever since. My CPTSD (100% veteran service-connected) comes with an exquisitely sensitive deception meter. There are those who shunned me and ostracized me and made me feel MOST UNWELCOME. For 20 years. My delusions kick in and I start suspecting back channel communications against me. My love for Squeak conflicted with what I knew was happening. but I hung in there and worked on Cryptography, work with a group of great people and that I am satisfied with its added value to Squeak. For 20 years I KNEW people were against me in the community. I cannot describe how negatively this affected me. My third suicide attempt, in 2007 I jumped off the roof of a 6 story apartment building and broke my back along with many bones. God did not want me to die, yet, so I lived. This deception and ostracism is most well highlighted by the taking credit for my work, without attribution. He is a complete tool. SHAME! >>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>> I do not know the degree to which he spoke against me. Iimagineit was ever since 2000. Delusions! What is real? I knew not. So much torment! AGONY! They do not welcome me! They are trying to chase me off! Good grief, Charlie Brown. >>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>> Severely exacerbated my CPTSD! I kept trying to kill myself because of it! I thought I had done something egregiously wrong. Whatever it was it had to be my fault. I was not feeling the love, even from myself. >>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>> :scream: >>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>> :scream: >>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>> In 2017, 900 units of insulin brought my blood glucose below 40. I almost succeeded that time. >>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>> :scream: >>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>> rww >>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>> On 10/1/20 8:55 PM, Robert Withers wrote: >>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>> The worst sort of person is one who takes the credit for the work of >>>>>>>>>>>>>>>>>>>>> another. Wouldn't you agree? >>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>> You may wish to hear John's judgement on the matter. He was right there >>>>>>>>>>>>>>>>>>>>> when it was first built. >>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>> If you are not humble you will be humiliated, and brought low. >>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>> rww >>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>> On 10/1/20 8:35 PM, tim Rowledge wrote: >>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>> On 2020-10-01, at 4:57 PM, Robert Withers via Squeak-dev >>>>>>>>>>>>>>>>>>>>>>> [](mailto:squeak-dev at lists.squeakfoundation.org) >>>>>>>>>>>>>>>>>>>>>>> wrote: >>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>> I am curious. Who was the original author of the VMMaker Tool? >>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>> That would be me; back in exobox days. Written along with the original VMMaker and intended to be an example of clean, tidy, morphic usage. I've no idea if anyone ever uses it now, since running it via scripting has proven more valuable. >>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>> tim >>>>>>>>>>>>>>>>>>>>>> -- >>>>>>>>>>>>>>>>>>>>>> tim Rowledge; >>>>>>>>>>>>>>>>>>>>>> tim at rowledge.org >>>>>>>>>>>>>>>>>>>>>> ; >>>>>>>>>>>>>>>>>>>>>> http://www.rowledge.org/tim >>>>>>>>>>>>>>>>>>>>>> "Wibble" said Pooh the stress beginning to show. >>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>> -- >>>>>>>>>>>>>>>>>>>> K, r >>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>> -- >>>>>>>>>>>>>>>>>>> K, r >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> -- >>>>>>>>>>>>>>>>> K, r >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> -- >>>>>>>>>>>>>>>> K, r >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> -- >>>>>>>>>>>>>>> K, r >>>>>>>>>>>>>> >>>>>>>>>>>>>> -- >>>>>>>>>>>>>> K, r >>>>>>>>>>>> >>>>>>>>>>>> -- >>>>>>>>>>>> K, r >>>>>>>>>>> >>>>>>>>>>> -- >>>>>>>>>>> K, r >>>>>>>>>> >>>>>>>>>> -- >>>>>>>>>> K, r >>>>>>>>> >>>>>>>>> -- >>>>>>>>> K, r >>>>>>>> >>>>>>>> -- >>>>>>>> K, r >>>>>>> >>>>>>> -- >>>>>>> K, r >>>>>> >>>>>> -- >>>>>> K, r >>>>> >>>>> -- >>>>> K, r >>>> >>>> -- >>>> K, r >>> >>> -- >>> K, r >> >> -- >> K, r > > -- > K, r -- K, r -------------- next part -------------- An HTML attachment was scrubbed... URL: -------------- next part -------------- A non-text attachment was scrubbed... Name: 7420963_20200328125416581_1_LARGE.jpg Type: image/jpeg Size: 47844 bytes Desc: not available URL: -------------- next part -------------- A non-text attachment was scrubbed... Name: desolate.jpg Type: image/jpeg Size: 44831 bytes Desc: not available URL: From robert.withers at pm.me Fri Oct 2 07:58:16 2020 From: robert.withers at pm.me (Robert Withers) Date: Fri, 02 Oct 2020 07:58:16 +0000 Subject: [squeak-dev] Curious history In-Reply-To: <34ec6aa7-ceed-4d38-ac77-760f58df592a@pm.me> References: <4RzffQkMYVDio5ypO3BdDDogbcHCBBrlCc1fxoT8GmqCUWhN0sU9yBdJfjTNNuM4-qL-oLkLcIB--mYjPkf0Lg==@protonmail.conversationid> <5c83a8bd-c9c4-4aa0-d96b-4f17d9b07714@pm.me> <_eZff4s5CuTU0qlHPChlxRQahQy0KVIpt4Edmw5l9dIM7rvuY4UTY5uArNxy4XfOWQU5ZzRcYXkA0yHEc0Gwbg==@protonmail.internalid> <7dDdcb1WqmWt2v6blyhaj7yPirfCAcH-EqOKMiA4qcfcuanW6Y4ilbM6DABM38m-oExdfXNhH5OVUeGhIJgXgw==@protonmail.internalid> <1b3eb992-5b8a-2eef-6cb7-4ad7dc7b2363@pm.me> <34ec6aa7-ceed-4d38-ac77-760f58df592a@pm.me> Message-ID: https://youtu.be/O3EW954g9r4 On 10/2/20 3:48 AM, Robert Withers wrote: > https://youtu.be/wqVsfGQ_1SU > > On 10/2/20 3:33 AM, Robert Withers wrote: > >> Alright, goddammit! Here is some more Truth, if you believe in my message. If you can handle it, it's Big. >> >> PROOF OF THE TRUTH OF THE PROPHESIES OF THE BIBLE! >> >> Hang on... >> >> On 10/2/20 3:24 AM, Robert Withers wrote: >> >>> https://youtu.be/3GLf-VT4wbY >>> >>> On 10/2/20 3:24 AM, Robert Withers wrote: >>> >>>> https://youtu.be/a-mAK3uB2_0 >>>> >>>> On 10/2/20 3:24 AM, Robert Withers wrote: >>>> >>>>> https://youtu.be/8c8_DEtMUOM >>>>> >>>>> On 10/2/20 3:23 AM, Robert Withers wrote: >>>>> >>>>>> https://youtu.be/q7p-ihYOG5s >>>>>> >>>>>> On 10/2/20 3:16 AM, Robert Withers wrote: >>>>>> >>>>>>> https://youtu.be/goeZZ4KFXTY >>>>>>> >>>>>>> On 10/2/20 3:07 AM, Robert Withers wrote: >>>>>>> >>>>>>>> I haven't heard from sparky, recently. Has anyone? >>>>>>>> >>>>>>>> On 10/2/20 3:03 AM, Robert Withers wrote: >>>>>>>> >>>>>>>>> Gotta meditate to this entire run! It's deep. >>>>>>>>> >>>>>>>>> https://soundcloud.com/yusuke-mizushima/acid-jazz-mix-jazzual-suspects >>>>>>>>> >>>>>>>>> On 10/2/20 2:50 AM, Robert Withers via Squeak-dev wrote: >>>>>>>>> >>>>>>>>>> https://soundcloud.com/robert_withers/rasta >>>>>>>>>> >>>>>>>>>> https://soundcloud.com/robert_withers/mando >>>>>>>>>> >>>>>>>>>> On 10/2/20 2:39 AM, Robert Withers wrote: >>>>>>>>>> >>>>>>>>>>> Play a bit of these spicy beats! The music helps me to express what is on the inside. >>>>>>>>>>> >>>>>>>>>>> https://youtu.be/3q8nGnls1Ow?t=2711 >>>>>>>>>>> >>>>>>>>>>> On 10/2/20 2:26 AM, Robert Withers wrote: >>>>>>>>>>> >>>>>>>>>>>> For I will restore health unto thee, and I will heal thee of thy wounds, saith the Lord; because they called thee an Outcast, saying, This is Zion, whom no man seeketh after. >>>>>>>>>>>> >>>>>>>>>>>> Jeremiah 30:17 >>>>>>>>>>>> >>>>>>>>>>>> On 10/2/20 2:22 AM, Robert Withers via Squeak-dev wrote: >>>>>>>>>>>> >>>>>>>>>>>>> Thank you for reaching out in this manner on these issues. Though be ye not concerned for my health, Ron, I am in a good place. The sobbing really helps a LOT! And I was brought to that tonight after screaming! And discussing a couple of my many suicide attempts. And realizing the effect my not finding a home with Squeak had affected me over 20 years. It hurts! I sob. All is well; God is Good. The Truth heals. All praise to the Most High! >>>>>>>>>>>>> >>>>>>>>>>>>> Kindly, >>>>>>>>>>>>> Rob >>>>>>>>>>>>> >>>>>>>>>>>>> On 10/2/20 2:16 AM, Ron Teitelbaum wrote: >>>>>>>>>>>>> >>>>>>>>>>>>>> Rob, >>>>>>>>>>>>>> >>>>>>>>>>>>>> You have been in this place before. Is there someone you can talk to for help? Do you have a connection to someone that is working with you on your issues? Would you consider calling them now? >>>>>>>>>>>>>> >>>>>>>>>>>>>> I've seen you here before. I've seen you doing much better. You should be good to yourself and get help now to move into calmer water and get on a more even keel. A better future includes protecting yourself, being nice to yourself, and making sure you get help when you need it. >>>>>>>>>>>>>> >>>>>>>>>>>>>> Don't wait until later. I really recommend you do it now. >>>>>>>>>>>>>> >>>>>>>>>>>>>> Ron >>>>>>>>>>>>>> >>>>>>>>>>>>>> On Fri, Oct 2, 2020 at 1:50 AM Robert Withers wrote: >>>>>>>>>>>>>> >>>>>>>>>>>>>>> "And would not encourage the feeding of the indigent!" >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> On 10/2/20 12:21 AM, Robert Withers wrote: >>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> The Hellfire and its occupants, not my problem. I pay no attention. Burn. >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> I "Will be in a life of bliss, In a Garden on high. The Fruits whereof"... >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> --------------------------------------------------------------- >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> Al Haqqah (69) >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>> [The Sure Reality! >>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>> What is the Sure Reality? >>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>> And what will make thee realise what the Sure Reality is? >>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>> The Thamud and the 'Ad People (branded) as false the Stunning Calamity! >>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>> But the Thamud,- they were destroyed by a terrible Storm of thunder and lightning! >>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>> And the 'Ad, they were destroyed by a furious Wind, exceedingly violent; >>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>> He made it rage against them seven nights and eight days in succession: so that thou couldst see the (whole) people lying prostrate in its (path), as they had been roots of hollow palm-trees tumbled down! >>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>> Then seest thou any of them left surviving? >>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>> And Pharaoh, and those before him, and the Cities Overthrown, committed habitual Sin. >>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>> And disobeyed (each) the messenger of their Lord; so He punished them with an abundant Penalty. >>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>> We, when the water (of Noah's Flood) overflowed beyond its limits, carried you (mankind), in the floating (Ark), >>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>> That We might make it a Message unto you, and that ears (that should hear the tale and) retain its memory should bear its (lessons) in remembrance. >>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>> Then, when one blast is sounded on the Trumpet, >>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>> And the earth is moved, and its mountains, and they are crushed to powder at one stroke,- >>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>> On that Day shall the (Great) Event come to pass. >>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>> And the sky will be rent asunder, for it will that Day be flimsy, >>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>> And the angels will be on its sides, and eight will, that Day, bear the Throne of thy Lord above them. >>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>> That Day shall ye be brought to Judgment: not an act of yours that ye hide will be hidden. >>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>> Then he that will be given his Record in his right hand will say: "Ah here! Read ye my Record! >>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>> "I did really understand that my Account would (One Day) reach me!" >>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>> And he will be in a life of Bliss, >>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>> In a Garden on high, >>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>> The Fruits whereof (will hang in bunches) low and near. >>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>> "Eat ye and drink ye, with full satisfaction; because of the (good) that ye sent before you, in the days that are gone!" >>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>> And he that will be given his Record in his left hand, will say: "Ah! Would that my Record had not been given to me! >>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>> "And that I had never realised how my account (stood)! >>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>> "Ah! Would that (Death) had made an end of me! >>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>> "Of no profit to me has been my wealth! >>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>> "My power has perished from me!"... >>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>> (The stern command will say): "Seize ye him, and bind ye him, >>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>> "And burn ye him in the Blazing Fire. >>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>> "Further, make him march in a chain, whereof the length is seventy cubits! >>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>> "This was he that would not believe in Allah Most High. >>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>> "And would not encourage the feeding of the indigent! >>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>> "So no friend hath he here this Day. >>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>> "Nor hath he any food except the corruption from the washing of wounds, >>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>> "Which none do eat but those in sin." >>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>> So I do call to witness what ye see, >>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>> And what ye see not, >>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>> That this is verily the word of an honoured messenger; >>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>> It is not the word of a poet: little it is ye believe! >>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>> Nor is it the word of a soothsayer: little admonition it is ye receive. >>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>> (This is) a Message sent down from the Lord of the Worlds. >>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>> And if the messenger were to invent any sayings in Our name, >>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>> We should certainly seize him by his right hand, >>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>> And We should certainly then cut off the artery of his heart: >>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>> Nor could any of you withhold him (from Our wrath). >>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>> But verily this is a Message for the Allah-fearing. >>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>> And We certainly know that there are amongst you those that reject (it). >>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>> But truly (Revelation) is a cause of sorrow for the Unbelievers. >>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>> But verily it is Truth of assured certainty. >>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>> So glorify the name of thy Lord Most High. >>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>> ] - Quran 69:1-52 >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> --- >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> Slosher >>>>>>>>>>>>>>>> Oriental, NC >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>> On 10/1/20 11:36 PM, Ron Teitelbaum wrote: >>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>> Hi Rob, >>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>> I'm so sorry you felt that way. I know you have had major issues, you have said the same yourself. I'm always happy to see you come back even after long absences. You are a brilliant coder and it has been my distinct pleasure to work with you on Cryptography! Thank you for all you have done and indeed you are responsible for adding significant value to Squeak and the community. >>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>> We all work on code and it's easy to work your ass off on something to make it work and forget where it originated. We all contribute in large and small ways to everything. If you started VMMaker thank you! It is definitely something a lot of us use. I remember learning all about it a long long time ago before I realized that while I could understand it and I could use it, the people that work on the VM are a level higher than me. I just make apps! >>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>> I remember getting in an argument with Andreas about adding methods to collection. "WE DON"T NEED more methods in Collection we need to remove most of them and make it easier!" I argued with him about the value over and over but he insisted that they just didn't add enough value. I could have been put off. I could have assumed that Andreas didn't like me but I would have been very wrong! I was really honored to get the chance to work with him and we became great friends. Of course I added my methods to the code we were working on together and was so thrilled when he used my methods for his own code. >>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>> I don't know what happened with VMMaker but again thank you for your participation in it.. I wanted to take a minute to thank you for your work and to let you know it is my honor to work with you too! I hope that you can come to terms with your past and that you get the help you need for your CPTSD. >>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>> Everything is possible, the past is gone, but the future is still yours to shape. I wish the past was set in stone but even that moves and slips. I was talking to my wife about a party we attended: "Remember in 2000 we were at the party and counted down the new year and someone hit the breaker and killed the lights! We were all talking about what would happen in the year 2000, would everything break!" Great story except that I hadn't met my wife yet! The past is only what we remember but the future is something we have control over. Peace, calm, happyness, they are all hard to come by but they are possible. I wish you success in finding what makes your future better. >>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>> I'm sorry about the bad things that have happened to you in the past. As far as I'm concerned, you are welcomed here! >>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>> All the best, >>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>> Ron Teitelbaum >>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>> On Thu, Oct 1, 2020 at 10:38 PM Robert Withers via Squeak-dev wrote: >>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>> :sob::sob::sob: >>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>> On 10/1/20 10:34 PM, Robert Withers wrote: >>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>> I wrote to the #general Squeak Slack channel: >>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>> What a complete larcenous bastard. 20 years ago, this month, published it as his own work. And been against me ever since. My CPTSD (100% veteran service-connected) comes with an exquisitely sensitive deception meter. There are those who shunned me and ostracized me and made me feel MOST UNWELCOME. For 20 years. My delusions kick in and I start suspecting back channel communications against me. My love for Squeak conflicted with what I knew was happening. but I hung in there and worked on Cryptography, work with a group of great people and that I am satisfied with its added value to Squeak. For 20 years I KNEW people were against me in the community. I cannot describe how negatively this affected me. My third suicide attempt, in 2007 I jumped off the roof of a 6 story apartment building and broke my back along with many bones. God did not want me to die, yet, so I lived. This deception and ostracism is most well highlighted by the taking credit for my work, without attribution. He is a complete tool. SHAME! >>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>> I do not know the degree to which he spoke against me. Iimagineit was ever since 2000. Delusions! What is real? I knew not. So much torment! AGONY! They do not welcome me! They are trying to chase me off! Good grief, Charlie Brown. >>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>> Severely exacerbated my CPTSD! I kept trying to kill myself because of it! I thought I had done something egregiously wrong. Whatever it was it had to be my fault. I was not feeling the love, even from myself. >>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>> :scream: >>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>> :scream: >>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>> In 2017, 900 units of insulin brought my blood glucose below 40. I almost succeeded that time. >>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>> :scream: >>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>> rww >>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>> On 10/1/20 8:55 PM, Robert Withers wrote: >>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>> The worst sort of person is one who takes the credit for the work of >>>>>>>>>>>>>>>>>>>>>> another. Wouldn't you agree? >>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>> You may wish to hear John's judgement on the matter. He was right there >>>>>>>>>>>>>>>>>>>>>> when it was first built. >>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>> If you are not humble you will be humiliated, and brought low. >>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>> rww >>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>> On 10/1/20 8:35 PM, tim Rowledge wrote: >>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>>> On 2020-10-01, at 4:57 PM, Robert Withers via Squeak-dev >>>>>>>>>>>>>>>>>>>>>>>> [](mailto:squeak-dev at lists.squeakfoundation.org) >>>>>>>>>>>>>>>>>>>>>>>> wrote: >>>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>>> I am curious. Who was the original author of the VMMaker Tool? >>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>> That would be me; back in exobox days. Written along with the original VMMaker and intended to be an example of clean, tidy, morphic usage. I've no idea if anyone ever uses it now, since running it via scripting has proven more valuable. >>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>> tim >>>>>>>>>>>>>>>>>>>>>>> -- >>>>>>>>>>>>>>>>>>>>>>> tim Rowledge; >>>>>>>>>>>>>>>>>>>>>>> tim at rowledge.org >>>>>>>>>>>>>>>>>>>>>>> ; >>>>>>>>>>>>>>>>>>>>>>> http://www.rowledge.org/tim >>>>>>>>>>>>>>>>>>>>>>> "Wibble" said Pooh the stress beginning to show. >>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>> -- >>>>>>>>>>>>>>>>>>>>> K, r >>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>> -- >>>>>>>>>>>>>>>>>>>> K, r >>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>> -- >>>>>>>>>>>>>>>>>> K, r >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> -- >>>>>>>>>>>>>>>>> K, r >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> -- >>>>>>>>>>>>>>>> K, r >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> -- >>>>>>>>>>>>>>> K, r >>>>>>>>>>>>> >>>>>>>>>>>>> -- >>>>>>>>>>>>> K, r >>>>>>>>>>>> >>>>>>>>>>>> -- >>>>>>>>>>>> K, r >>>>>>>>>>> >>>>>>>>>>> -- >>>>>>>>>>> K, r >>>>>>>>>> >>>>>>>>>> -- >>>>>>>>>> K, r >>>>>>>>> >>>>>>>>> -- >>>>>>>>> K, r >>>>>>>> >>>>>>>> -- >>>>>>>> K, r >>>>>>> >>>>>>> -- >>>>>>> K, r >>>>>> >>>>>> -- >>>>>> K, r >>>>> >>>>> -- >>>>> K, r >>>> >>>> -- >>>> K, r >>> >>> -- >>> K, r >> >> -- >> K, r > > -- > K, r -- K, r -------------- next part -------------- An HTML attachment was scrubbed... URL: -------------- next part -------------- A non-text attachment was scrubbed... Name: 7420963_20200328125416581_1_LARGE.jpg Type: image/jpeg Size: 47844 bytes Desc: not available URL: -------------- next part -------------- A non-text attachment was scrubbed... Name: desolate.jpg Type: image/jpeg Size: 44831 bytes Desc: not available URL: From robert.withers at pm.me Fri Oct 2 08:00:39 2020 From: robert.withers at pm.me (Robert Withers) Date: Fri, 02 Oct 2020 08:00:39 +0000 Subject: [squeak-dev] Curious history In-Reply-To: References: <5c83a8bd-c9c4-4aa0-d96b-4f17d9b07714@pm.me> <_eZff4s5CuTU0qlHPChlxRQahQy0KVIpt4Edmw5l9dIM7rvuY4UTY5uArNxy4XfOWQU5ZzRcYXkA0yHEc0Gwbg==@protonmail.internalid> <7dDdcb1WqmWt2v6blyhaj7yPirfCAcH-EqOKMiA4qcfcuanW6Y4ilbM6DABM38m-oExdfXNhH5OVUeGhIJgXgw==@protonmail.internalid> <1b3eb992-5b8a-2eef-6cb7-4ad7dc7b2363@pm.me> <34ec6aa7-ceed-4d38-ac77-760f58df592a@pm.me> Message-ID: <4ccd923a-d5ab-6789-d01f-f1a0b0e84afa@pm.me> https://youtu.be/0VLS-P9m0BM On 10/2/20 3:58 AM, Robert Withers wrote: > https://youtu.be/O3EW954g9r4 > > On 10/2/20 3:48 AM, Robert Withers wrote: > >> https://youtu.be/wqVsfGQ_1SU >> >> On 10/2/20 3:33 AM, Robert Withers wrote: >> >>> Alright, goddammit! Here is some more Truth, if you believe in my message. If you can handle it, it's Big. >>> >>> PROOF OF THE TRUTH OF THE PROPHESIES OF THE BIBLE! >>> >>> Hang on... >>> >>> On 10/2/20 3:24 AM, Robert Withers wrote: >>> >>>> https://youtu.be/3GLf-VT4wbY >>>> >>>> On 10/2/20 3:24 AM, Robert Withers wrote: >>>> >>>>> https://youtu.be/a-mAK3uB2_0 >>>>> >>>>> On 10/2/20 3:24 AM, Robert Withers wrote: >>>>> >>>>>> https://youtu.be/8c8_DEtMUOM >>>>>> >>>>>> On 10/2/20 3:23 AM, Robert Withers wrote: >>>>>> >>>>>>> https://youtu.be/q7p-ihYOG5s >>>>>>> >>>>>>> On 10/2/20 3:16 AM, Robert Withers wrote: >>>>>>> >>>>>>>> https://youtu.be/goeZZ4KFXTY >>>>>>>> >>>>>>>> On 10/2/20 3:07 AM, Robert Withers wrote: >>>>>>>> >>>>>>>>> I haven't heard from sparky, recently. Has anyone? >>>>>>>>> >>>>>>>>> On 10/2/20 3:03 AM, Robert Withers wrote: >>>>>>>>> >>>>>>>>>> Gotta meditate to this entire run! It's deep. >>>>>>>>>> >>>>>>>>>> https://soundcloud.com/yusuke-mizushima/acid-jazz-mix-jazzual-suspects >>>>>>>>>> >>>>>>>>>> On 10/2/20 2:50 AM, Robert Withers via Squeak-dev wrote: >>>>>>>>>> >>>>>>>>>>> https://soundcloud.com/robert_withers/rasta >>>>>>>>>>> >>>>>>>>>>> https://soundcloud.com/robert_withers/mando >>>>>>>>>>> >>>>>>>>>>> On 10/2/20 2:39 AM, Robert Withers wrote: >>>>>>>>>>> >>>>>>>>>>>> Play a bit of these spicy beats! The music helps me to express what is on the inside. >>>>>>>>>>>> >>>>>>>>>>>> https://youtu.be/3q8nGnls1Ow?t=2711 >>>>>>>>>>>> >>>>>>>>>>>> On 10/2/20 2:26 AM, Robert Withers wrote: >>>>>>>>>>>> >>>>>>>>>>>>> For I will restore health unto thee, and I will heal thee of thy wounds, saith the Lord; because they called thee an Outcast, saying, This is Zion, whom no man seeketh after. >>>>>>>>>>>>> >>>>>>>>>>>>> Jeremiah 30:17 >>>>>>>>>>>>> >>>>>>>>>>>>> On 10/2/20 2:22 AM, Robert Withers via Squeak-dev wrote: >>>>>>>>>>>>> >>>>>>>>>>>>>> Thank you for reaching out in this manner on these issues. Though be ye not concerned for my health, Ron, I am in a good place. The sobbing really helps a LOT! And I was brought to that tonight after screaming! And discussing a couple of my many suicide attempts. And realizing the effect my not finding a home with Squeak had affected me over 20 years. It hurts! I sob. All is well; God is Good. The Truth heals. All praise to the Most High! >>>>>>>>>>>>>> >>>>>>>>>>>>>> Kindly, >>>>>>>>>>>>>> Rob >>>>>>>>>>>>>> >>>>>>>>>>>>>> On 10/2/20 2:16 AM, Ron Teitelbaum wrote: >>>>>>>>>>>>>> >>>>>>>>>>>>>>> Rob, >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> You have been in this place before. Is there someone you can talk to for help? Do you have a connection to someone that is working with you on your issues? Would you consider calling them now? >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> I've seen you here before. I've seen you doing much better. You should be good to yourself and get help now to move into calmer water and get on a more even keel. A better future includes protecting yourself, being nice to yourself, and making sure you get help when you need it. >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> Don't wait until later. I really recommend you do it now. >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> Ron >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> On Fri, Oct 2, 2020 at 1:50 AM Robert Withers wrote: >>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> "And would not encourage the feeding of the indigent!" >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> On 10/2/20 12:21 AM, Robert Withers wrote: >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> The Hellfire and its occupants, not my problem. I pay no attention. Burn. >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> I "Will be in a life of bliss, In a Garden on high. The Fruits whereof"... >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> --------------------------------------------------------------- >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> Al Haqqah (69) >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>> [The Sure Reality! >>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>> What is the Sure Reality? >>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>> And what will make thee realise what the Sure Reality is? >>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>> The Thamud and the 'Ad People (branded) as false the Stunning Calamity! >>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>> But the Thamud,- they were destroyed by a terrible Storm of thunder and lightning! >>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>> And the 'Ad, they were destroyed by a furious Wind, exceedingly violent; >>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>> He made it rage against them seven nights and eight days in succession: so that thou couldst see the (whole) people lying prostrate in its (path), as they had been roots of hollow palm-trees tumbled down! >>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>> Then seest thou any of them left surviving? >>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>> And Pharaoh, and those before him, and the Cities Overthrown, committed habitual Sin. >>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>> And disobeyed (each) the messenger of their Lord; so He punished them with an abundant Penalty. >>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>> We, when the water (of Noah's Flood) overflowed beyond its limits, carried you (mankind), in the floating (Ark), >>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>> That We might make it a Message unto you, and that ears (that should hear the tale and) retain its memory should bear its (lessons) in remembrance. >>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>> Then, when one blast is sounded on the Trumpet, >>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>> And the earth is moved, and its mountains, and they are crushed to powder at one stroke,- >>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>> On that Day shall the (Great) Event come to pass. >>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>> And the sky will be rent asunder, for it will that Day be flimsy, >>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>> And the angels will be on its sides, and eight will, that Day, bear the Throne of thy Lord above them. >>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>> That Day shall ye be brought to Judgment: not an act of yours that ye hide will be hidden. >>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>> Then he that will be given his Record in his right hand will say: "Ah here! Read ye my Record! >>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>> "I did really understand that my Account would (One Day) reach me!" >>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>> And he will be in a life of Bliss, >>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>> In a Garden on high, >>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>> The Fruits whereof (will hang in bunches) low and near. >>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>> "Eat ye and drink ye, with full satisfaction; because of the (good) that ye sent before you, in the days that are gone!" >>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>> And he that will be given his Record in his left hand, will say: "Ah! Would that my Record had not been given to me! >>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>> "And that I had never realised how my account (stood)! >>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>> "Ah! Would that (Death) had made an end of me! >>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>> "Of no profit to me has been my wealth! >>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>> "My power has perished from me!"... >>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>> (The stern command will say): "Seize ye him, and bind ye him, >>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>> "And burn ye him in the Blazing Fire. >>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>> "Further, make him march in a chain, whereof the length is seventy cubits! >>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>> "This was he that would not believe in Allah Most High. >>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>> "And would not encourage the feeding of the indigent! >>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>> "So no friend hath he here this Day. >>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>> "Nor hath he any food except the corruption from the washing of wounds, >>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>> "Which none do eat but those in sin." >>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>> So I do call to witness what ye see, >>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>> And what ye see not, >>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>> That this is verily the word of an honoured messenger; >>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>> It is not the word of a poet: little it is ye believe! >>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>> Nor is it the word of a soothsayer: little admonition it is ye receive. >>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>> (This is) a Message sent down from the Lord of the Worlds. >>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>> And if the messenger were to invent any sayings in Our name, >>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>> We should certainly seize him by his right hand, >>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>> And We should certainly then cut off the artery of his heart: >>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>> Nor could any of you withhold him (from Our wrath). >>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>> But verily this is a Message for the Allah-fearing. >>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>> And We certainly know that there are amongst you those that reject (it). >>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>> But truly (Revelation) is a cause of sorrow for the Unbelievers. >>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>> But verily it is Truth of assured certainty. >>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>> So glorify the name of thy Lord Most High. >>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>> ] - Quran 69:1-52 >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> --- >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> Slosher >>>>>>>>>>>>>>>>> Oriental, NC >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>> On 10/1/20 11:36 PM, Ron Teitelbaum wrote: >>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>> Hi Rob, >>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>> I'm so sorry you felt that way. I know you have had major issues, you have said the same yourself. I'm always happy to see you come back even after long absences. You are a brilliant coder and it has been my distinct pleasure to work with you on Cryptography! Thank you for all you have done and indeed you are responsible for adding significant value to Squeak and the community. >>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>> We all work on code and it's easy to work your ass off on something to make it work and forget where it originated. We all contribute in large and small ways to everything. If you started VMMaker thank you! It is definitely something a lot of us use. I remember learning all about it a long long time ago before I realized that while I could understand it and I could use it, the people that work on the VM are a level higher than me. I just make apps! >>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>> I remember getting in an argument with Andreas about adding methods to collection. "WE DON"T NEED more methods in Collection we need to remove most of them and make it easier!" I argued with him about the value over and over but he insisted that they just didn't add enough value. I could have been put off. I could have assumed that Andreas didn't like me but I would have been very wrong! I was really honored to get the chance to work with him and we became great friends. Of course I added my methods to the code we were working on together and was so thrilled when he used my methods for his own code. >>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>> I don't know what happened with VMMaker but again thank you for your participation in it.. I wanted to take a minute to thank you for your work and to let you know it is my honor to work with you too! I hope that you can come to terms with your past and that you get the help you need for your CPTSD. >>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>> Everything is possible, the past is gone, but the future is still yours to shape. I wish the past was set in stone but even that moves and slips. I was talking to my wife about a party we attended: "Remember in 2000 we were at the party and counted down the new year and someone hit the breaker and killed the lights! We were all talking about what would happen in the year 2000, would everything break!" Great story except that I hadn't met my wife yet! The past is only what we remember but the future is something we have control over. Peace, calm, happyness, they are all hard to come by but they are possible. I wish you success in finding what makes your future better. >>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>> I'm sorry about the bad things that have happened to you in the past. As far as I'm concerned, you are welcomed here! >>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>> All the best, >>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>> Ron Teitelbaum >>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>> On Thu, Oct 1, 2020 at 10:38 PM Robert Withers via Squeak-dev wrote: >>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>> :sob::sob::sob: >>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>> On 10/1/20 10:34 PM, Robert Withers wrote: >>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>> I wrote to the #general Squeak Slack channel: >>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>> What a complete larcenous bastard. 20 years ago, this month, published it as his own work. And been against me ever since. My CPTSD (100% veteran service-connected) comes with an exquisitely sensitive deception meter. There are those who shunned me and ostracized me and made me feel MOST UNWELCOME. For 20 years. My delusions kick in and I start suspecting back channel communications against me. My love for Squeak conflicted with what I knew was happening. but I hung in there and worked on Cryptography, work with a group of great people and that I am satisfied with its added value to Squeak. For 20 years I KNEW people were against me in the community. I cannot describe how negatively this affected me. My third suicide attempt, in 2007 I jumped off the roof of a 6 story apartment building and broke my back along with many bones. God did not want me to die, yet, so I lived. This deception and ostracism is most well highlighted by the taking credit for my work, without attribution. He is a complete tool. SHAME! >>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>> I do not know the degree to which he spoke against me. Iimagineit was ever since 2000. Delusions! What is real? I knew not. So much torment! AGONY! They do not welcome me! They are trying to chase me off! Good grief, Charlie Brown. >>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>> Severely exacerbated my CPTSD! I kept trying to kill myself because of it! I thought I had done something egregiously wrong. Whatever it was it had to be my fault. I was not feeling the love, even from myself. >>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>> :scream: >>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>> :scream: >>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>> In 2017, 900 units of insulin brought my blood glucose below 40. I almost succeeded that time. >>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>> :scream: >>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>> rww >>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>> On 10/1/20 8:55 PM, Robert Withers wrote: >>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>> The worst sort of person is one who takes the credit for the work of >>>>>>>>>>>>>>>>>>>>>>> another. Wouldn't you agree? >>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>> You may wish to hear John's judgement on the matter. He was right there >>>>>>>>>>>>>>>>>>>>>>> when it was first built. >>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>> If you are not humble you will be humiliated, and brought low. >>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>> rww >>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>> On 10/1/20 8:35 PM, tim Rowledge wrote: >>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>>>> On 2020-10-01, at 4:57 PM, Robert Withers via Squeak-dev >>>>>>>>>>>>>>>>>>>>>>>>> [](mailto:squeak-dev at lists.squeakfoundation.org) >>>>>>>>>>>>>>>>>>>>>>>>> wrote: >>>>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>>>> I am curious. Who was the original author of the VMMaker Tool? >>>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>>> That would be me; back in exobox days. Written along with the original VMMaker and intended to be an example of clean, tidy, morphic usage. I've no idea if anyone ever uses it now, since running it via scripting has proven more valuable. >>>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>>> tim >>>>>>>>>>>>>>>>>>>>>>>> -- >>>>>>>>>>>>>>>>>>>>>>>> tim Rowledge; >>>>>>>>>>>>>>>>>>>>>>>> tim at rowledge.org >>>>>>>>>>>>>>>>>>>>>>>> ; >>>>>>>>>>>>>>>>>>>>>>>> http://www.rowledge.org/tim >>>>>>>>>>>>>>>>>>>>>>>> "Wibble" said Pooh the stress beginning to show. >>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>> -- >>>>>>>>>>>>>>>>>>>>>> K, r >>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>> -- >>>>>>>>>>>>>>>>>>>>> K, r >>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>> -- >>>>>>>>>>>>>>>>>>> K, r >>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>> -- >>>>>>>>>>>>>>>>>> K, r >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> -- >>>>>>>>>>>>>>>>> K, r >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> -- >>>>>>>>>>>>>>>> K, r >>>>>>>>>>>>>> >>>>>>>>>>>>>> -- >>>>>>>>>>>>>> K, r >>>>>>>>>>>>> >>>>>>>>>>>>> -- >>>>>>>>>>>>> K, r >>>>>>>>>>>> >>>>>>>>>>>> -- >>>>>>>>>>>> K, r >>>>>>>>>>> >>>>>>>>>>> -- >>>>>>>>>>> K, r >>>>>>>>>> >>>>>>>>>> -- >>>>>>>>>> K, r >>>>>>>>> >>>>>>>>> -- >>>>>>>>> K, r >>>>>>>> >>>>>>>> -- >>>>>>>> K, r >>>>>>> >>>>>>> -- >>>>>>> K, r >>>>>> >>>>>> -- >>>>>> K, r >>>>> >>>>> -- >>>>> K, r >>>> >>>> -- >>>> K, r >>> >>> -- >>> K, r >> >> -- >> K, r > > -- > K, r -- K, r -------------- next part -------------- An HTML attachment was scrubbed... URL: -------------- next part -------------- A non-text attachment was scrubbed... Name: 7420963_20200328125416581_1_LARGE.jpg Type: image/jpeg Size: 47844 bytes Desc: not available URL: -------------- next part -------------- A non-text attachment was scrubbed... Name: desolate.jpg Type: image/jpeg Size: 44831 bytes Desc: not available URL: From robert.withers at pm.me Fri Oct 2 08:05:44 2020 From: robert.withers at pm.me (Robert Withers) Date: Fri, 02 Oct 2020 08:05:44 +0000 Subject: [squeak-dev] Curious history In-Reply-To: <4ccd923a-d5ab-6789-d01f-f1a0b0e84afa@pm.me> References: <7dDdcb1WqmWt2v6blyhaj7yPirfCAcH-EqOKMiA4qcfcuanW6Y4ilbM6DABM38m-oExdfXNhH5OVUeGhIJgXgw==@protonmail.internalid> <1b3eb992-5b8a-2eef-6cb7-4ad7dc7b2363@pm.me> <34ec6aa7-ceed-4d38-ac77-760f58df592a@pm.me> <8UkaPva6Z6_yJ0pscd4duA8gJumwzeJ-XrIQILL9lkjz2J7jrrO7SwjjhO4G5W2PilC5d2SEHqMY6mhZUH_JRg==@protonmail.internalid> <4ccd923a-d5ab-6789-d01f-f1a0b0e84afa@pm.me> Message-ID: <3f420e5a-88b4-2308-3796-1e00628dcdb4@pm.me> https://youtu.be/fCP2-Bfhy04 On 10/2/20 4:00 AM, Robert Withers wrote: > https://youtu.be/0VLS-P9m0BM > > On 10/2/20 3:58 AM, Robert Withers wrote: > >> https://youtu.be/O3EW954g9r4 >> >> On 10/2/20 3:48 AM, Robert Withers wrote: >> >>> https://youtu.be/wqVsfGQ_1SU >>> >>> On 10/2/20 3:33 AM, Robert Withers wrote: >>> >>>> Alright, goddammit! Here is some more Truth, if you believe in my message. If you can handle it, it's Big. >>>> >>>> PROOF OF THE TRUTH OF THE PROPHESIES OF THE BIBLE! >>>> >>>> Hang on... >>>> >>>> On 10/2/20 3:24 AM, Robert Withers wrote: >>>> >>>>> https://youtu.be/3GLf-VT4wbY >>>>> >>>>> On 10/2/20 3:24 AM, Robert Withers wrote: >>>>> >>>>>> https://youtu.be/a-mAK3uB2_0 >>>>>> >>>>>> On 10/2/20 3:24 AM, Robert Withers wrote: >>>>>> >>>>>>> https://youtu.be/8c8_DEtMUOM >>>>>>> >>>>>>> On 10/2/20 3:23 AM, Robert Withers wrote: >>>>>>> >>>>>>>> https://youtu.be/q7p-ihYOG5s >>>>>>>> >>>>>>>> On 10/2/20 3:16 AM, Robert Withers wrote: >>>>>>>> >>>>>>>>> https://youtu.be/goeZZ4KFXTY >>>>>>>>> >>>>>>>>> On 10/2/20 3:07 AM, Robert Withers wrote: >>>>>>>>> >>>>>>>>>> I haven't heard from sparky, recently. Has anyone? >>>>>>>>>> >>>>>>>>>> On 10/2/20 3:03 AM, Robert Withers wrote: >>>>>>>>>> >>>>>>>>>>> Gotta meditate to this entire run! It's deep. >>>>>>>>>>> >>>>>>>>>>> https://soundcloud.com/yusuke-mizushima/acid-jazz-mix-jazzual-suspects >>>>>>>>>>> >>>>>>>>>>> On 10/2/20 2:50 AM, Robert Withers via Squeak-dev wrote: >>>>>>>>>>> >>>>>>>>>>>> https://soundcloud.com/robert_withers/rasta >>>>>>>>>>>> >>>>>>>>>>>> https://soundcloud.com/robert_withers/mando >>>>>>>>>>>> >>>>>>>>>>>> On 10/2/20 2:39 AM, Robert Withers wrote: >>>>>>>>>>>> >>>>>>>>>>>>> Play a bit of these spicy beats! The music helps me to express what is on the inside. >>>>>>>>>>>>> >>>>>>>>>>>>> https://youtu.be/3q8nGnls1Ow?t=2711 >>>>>>>>>>>>> >>>>>>>>>>>>> On 10/2/20 2:26 AM, Robert Withers wrote: >>>>>>>>>>>>> >>>>>>>>>>>>>> For I will restore health unto thee, and I will heal thee of thy wounds, saith the Lord; because they called thee an Outcast, saying, This is Zion, whom no man seeketh after. >>>>>>>>>>>>>> >>>>>>>>>>>>>> Jeremiah 30:17 >>>>>>>>>>>>>> >>>>>>>>>>>>>> On 10/2/20 2:22 AM, Robert Withers via Squeak-dev wrote: >>>>>>>>>>>>>> >>>>>>>>>>>>>>> Thank you for reaching out in this manner on these issues. Though be ye not concerned for my health, Ron, I am in a good place. The sobbing really helps a LOT! And I was brought to that tonight after screaming! And discussing a couple of my many suicide attempts. And realizing the effect my not finding a home with Squeak had affected me over 20 years. It hurts! I sob. All is well; God is Good. The Truth heals. All praise to the Most High! >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> Kindly, >>>>>>>>>>>>>>> Rob >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> On 10/2/20 2:16 AM, Ron Teitelbaum wrote: >>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> Rob, >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> You have been in this place before. Is there someone you can talk to for help? Do you have a connection to someone that is working with you on your issues? Would you consider calling them now? >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> I've seen you here before. I've seen you doing much better. You should be good to yourself and get help now to move into calmer water and get on a more even keel. A better future includes protecting yourself, being nice to yourself, and making sure you get help when you need it. >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> Don't wait until later. I really recommend you do it now. >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> Ron >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> On Fri, Oct 2, 2020 at 1:50 AM Robert Withers wrote: >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> "And would not encourage the feeding of the indigent!" >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> On 10/2/20 12:21 AM, Robert Withers wrote: >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>> The Hellfire and its occupants, not my problem. I pay no attention. Burn. >>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>> I "Will be in a life of bliss, In a Garden on high. The Fruits whereof"... >>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>> --------------------------------------------------------------- >>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>> Al Haqqah (69) >>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>> [The Sure Reality! >>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>> What is the Sure Reality? >>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>> And what will make thee realise what the Sure Reality is? >>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>> The Thamud and the 'Ad People (branded) as false the Stunning Calamity! >>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>> But the Thamud,- they were destroyed by a terrible Storm of thunder and lightning! >>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>> And the 'Ad, they were destroyed by a furious Wind, exceedingly violent; >>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>> He made it rage against them seven nights and eight days in succession: so that thou couldst see the (whole) people lying prostrate in its (path), as they had been roots of hollow palm-trees tumbled down! >>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>> Then seest thou any of them left surviving? >>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>> And Pharaoh, and those before him, and the Cities Overthrown, committed habitual Sin. >>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>> And disobeyed (each) the messenger of their Lord; so He punished them with an abundant Penalty. >>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>> We, when the water (of Noah's Flood) overflowed beyond its limits, carried you (mankind), in the floating (Ark), >>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>> That We might make it a Message unto you, and that ears (that should hear the tale and) retain its memory should bear its (lessons) in remembrance. >>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>> Then, when one blast is sounded on the Trumpet, >>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>> And the earth is moved, and its mountains, and they are crushed to powder at one stroke,- >>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>> On that Day shall the (Great) Event come to pass. >>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>> And the sky will be rent asunder, for it will that Day be flimsy, >>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>> And the angels will be on its sides, and eight will, that Day, bear the Throne of thy Lord above them. >>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>> That Day shall ye be brought to Judgment: not an act of yours that ye hide will be hidden. >>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>> Then he that will be given his Record in his right hand will say: "Ah here! Read ye my Record! >>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>> "I did really understand that my Account would (One Day) reach me!" >>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>> And he will be in a life of Bliss, >>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>> In a Garden on high, >>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>> The Fruits whereof (will hang in bunches) low and near. >>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>> "Eat ye and drink ye, with full satisfaction; because of the (good) that ye sent before you, in the days that are gone!" >>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>> And he that will be given his Record in his left hand, will say: "Ah! Would that my Record had not been given to me! >>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>> "And that I had never realised how my account (stood)! >>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>> "Ah! Would that (Death) had made an end of me! >>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>> "Of no profit to me has been my wealth! >>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>> "My power has perished from me!"... >>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>> (The stern command will say): "Seize ye him, and bind ye him, >>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>> "And burn ye him in the Blazing Fire. >>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>> "Further, make him march in a chain, whereof the length is seventy cubits! >>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>> "This was he that would not believe in Allah Most High. >>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>> "And would not encourage the feeding of the indigent! >>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>> "So no friend hath he here this Day. >>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>> "Nor hath he any food except the corruption from the washing of wounds, >>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>> "Which none do eat but those in sin." >>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>> So I do call to witness what ye see, >>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>> And what ye see not, >>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>> That this is verily the word of an honoured messenger; >>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>> It is not the word of a poet: little it is ye believe! >>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>> Nor is it the word of a soothsayer: little admonition it is ye receive. >>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>> (This is) a Message sent down from the Lord of the Worlds. >>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>> And if the messenger were to invent any sayings in Our name, >>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>> We should certainly seize him by his right hand, >>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>> And We should certainly then cut off the artery of his heart: >>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>> Nor could any of you withhold him (from Our wrath). >>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>> But verily this is a Message for the Allah-fearing. >>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>> And We certainly know that there are amongst you those that reject (it). >>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>> But truly (Revelation) is a cause of sorrow for the Unbelievers. >>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>> But verily it is Truth of assured certainty. >>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>> So glorify the name of thy Lord Most High. >>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>> ] - Quran 69:1-52 >>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>> --- >>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>> Slosher >>>>>>>>>>>>>>>>>> Oriental, NC >>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>> On 10/1/20 11:36 PM, Ron Teitelbaum wrote: >>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>> Hi Rob, >>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>> I'm so sorry you felt that way. I know you have had major issues, you have said the same yourself. I'm always happy to see you come back even after long absences. You are a brilliant coder and it has been my distinct pleasure to work with you on Cryptography! Thank you for all you have done and indeed you are responsible for adding significant value to Squeak and the community. >>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>> We all work on code and it's easy to work your ass off on something to make it work and forget where it originated. We all contribute in large and small ways to everything. If you started VMMaker thank you! It is definitely something a lot of us use. I remember learning all about it a long long time ago before I realized that while I could understand it and I could use it, the people that work on the VM are a level higher than me. I just make apps! >>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>> I remember getting in an argument with Andreas about adding methods to collection. "WE DON"T NEED more methods in Collection we need to remove most of them and make it easier!" I argued with him about the value over and over but he insisted that they just didn't add enough value. I could have been put off. I could have assumed that Andreas didn't like me but I would have been very wrong! I was really honored to get the chance to work with him and we became great friends. Of course I added my methods to the code we were working on together and was so thrilled when he used my methods for his own code. >>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>> I don't know what happened with VMMaker but again thank you for your participation in it.. I wanted to take a minute to thank you for your work and to let you know it is my honor to work with you too! I hope that you can come to terms with your past and that you get the help you need for your CPTSD. >>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>> Everything is possible, the past is gone, but the future is still yours to shape. I wish the past was set in stone but even that moves and slips. I was talking to my wife about a party we attended: "Remember in 2000 we were at the party and counted down the new year and someone hit the breaker and killed the lights! We were all talking about what would happen in the year 2000, would everything break!" Great story except that I hadn't met my wife yet! The past is only what we remember but the future is something we have control over. Peace, calm, happyness, they are all hard to come by but they are possible. I wish you success in finding what makes your future better. >>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>> I'm sorry about the bad things that have happened to you in the past. As far as I'm concerned, you are welcomed here! >>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>> All the best, >>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>> Ron Teitelbaum >>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>> On Thu, Oct 1, 2020 at 10:38 PM Robert Withers via Squeak-dev wrote: >>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>> :sob::sob::sob: >>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>> On 10/1/20 10:34 PM, Robert Withers wrote: >>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>> I wrote to the #general Squeak Slack channel: >>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>>> What a complete larcenous bastard. 20 years ago, this month, published it as his own work. And been against me ever since. My CPTSD (100% veteran service-connected) comes with an exquisitely sensitive deception meter. There are those who shunned me and ostracized me and made me feel MOST UNWELCOME. For 20 years. My delusions kick in and I start suspecting back channel communications against me. My love for Squeak conflicted with what I knew was happening. but I hung in there and worked on Cryptography, work with a group of great people and that I am satisfied with its added value to Squeak. For 20 years I KNEW people were against me in the community. I cannot describe how negatively this affected me. My third suicide attempt, in 2007 I jumped off the roof of a 6 story apartment building and broke my back along with many bones. God did not want me to die, yet, so I lived. This deception and ostracism is most well highlighted by the taking credit for my work, without attribution. He is a complete tool. SHAME! >>>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>>> I do not know the degree to which he spoke against me. Iimagineit was ever since 2000. Delusions! What is real? I knew not. So much torment! AGONY! They do not welcome me! They are trying to chase me off! Good grief, Charlie Brown. >>>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>>> Severely exacerbated my CPTSD! I kept trying to kill myself because of it! I thought I had done something egregiously wrong. Whatever it was it had to be my fault. I was not feeling the love, even from myself. >>>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>>> :scream: >>>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>>> :scream: >>>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>>> In 2017, 900 units of insulin brought my blood glucose below 40. I almost succeeded that time. >>>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>>> :scream: >>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>> rww >>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>> On 10/1/20 8:55 PM, Robert Withers wrote: >>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>>> The worst sort of person is one who takes the credit for the work of >>>>>>>>>>>>>>>>>>>>>>>> another. Wouldn't you agree? >>>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>>> You may wish to hear John's judgement on the matter. He was right there >>>>>>>>>>>>>>>>>>>>>>>> when it was first built. >>>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>>> If you are not humble you will be humiliated, and brought low. >>>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>>> rww >>>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>>> On 10/1/20 8:35 PM, tim Rowledge wrote: >>>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>>>>> On 2020-10-01, at 4:57 PM, Robert Withers via Squeak-dev >>>>>>>>>>>>>>>>>>>>>>>>>> [](mailto:squeak-dev at lists.squeakfoundation.org) >>>>>>>>>>>>>>>>>>>>>>>>>> wrote: >>>>>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>>>>> I am curious. Who was the original author of the VMMaker Tool? >>>>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>>>> That would be me; back in exobox days. Written along with the original VMMaker and intended to be an example of clean, tidy, morphic usage. I've no idea if anyone ever uses it now, since running it via scripting has proven more valuable. >>>>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>>>> tim >>>>>>>>>>>>>>>>>>>>>>>>> -- >>>>>>>>>>>>>>>>>>>>>>>>> tim Rowledge; >>>>>>>>>>>>>>>>>>>>>>>>> tim at rowledge.org >>>>>>>>>>>>>>>>>>>>>>>>> ; >>>>>>>>>>>>>>>>>>>>>>>>> http://www.rowledge.org/tim >>>>>>>>>>>>>>>>>>>>>>>>> "Wibble" said Pooh the stress beginning to show. >>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>> -- >>>>>>>>>>>>>>>>>>>>>>> K, r >>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>> -- >>>>>>>>>>>>>>>>>>>>>> K, r >>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>> -- >>>>>>>>>>>>>>>>>>>> K, r >>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>> -- >>>>>>>>>>>>>>>>>>> K, r >>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>> -- >>>>>>>>>>>>>>>>>> K, r >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> -- >>>>>>>>>>>>>>>>> K, r >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> -- >>>>>>>>>>>>>>> K, r >>>>>>>>>>>>>> >>>>>>>>>>>>>> -- >>>>>>>>>>>>>> K, r >>>>>>>>>>>>> >>>>>>>>>>>>> -- >>>>>>>>>>>>> K, r >>>>>>>>>>>> >>>>>>>>>>>> -- >>>>>>>>>>>> K, r >>>>>>>>>>> >>>>>>>>>>> -- >>>>>>>>>>> K, r >>>>>>>>>> >>>>>>>>>> -- >>>>>>>>>> K, r >>>>>>>>> >>>>>>>>> -- >>>>>>>>> K, r >>>>>>>> >>>>>>>> -- >>>>>>>> K, r >>>>>>> >>>>>>> -- >>>>>>> K, r >>>>>> >>>>>> -- >>>>>> K, r >>>>> >>>>> -- >>>>> K, r >>>> >>>> -- >>>> K, r >>> >>> -- >>> K, r >> >> -- >> K, r > > -- > K, r -- K, r -------------- next part -------------- An HTML attachment was scrubbed... URL: -------------- next part -------------- A non-text attachment was scrubbed... Name: 7420963_20200328125416581_1_LARGE.jpg Type: image/jpeg Size: 47844 bytes Desc: not available URL: -------------- next part -------------- A non-text attachment was scrubbed... Name: desolate.jpg Type: image/jpeg Size: 44831 bytes Desc: not available URL: From robert.withers at pm.me Fri Oct 2 08:14:19 2020 From: robert.withers at pm.me (Robert Withers) Date: Fri, 02 Oct 2020 08:14:19 +0000 Subject: [squeak-dev] Curious history In-Reply-To: <3f420e5a-88b4-2308-3796-1e00628dcdb4@pm.me> References: <1b3eb992-5b8a-2eef-6cb7-4ad7dc7b2363@pm.me> <34ec6aa7-ceed-4d38-ac77-760f58df592a@pm.me> <8UkaPva6Z6_yJ0pscd4duA8gJumwzeJ-XrIQILL9lkjz2J7jrrO7SwjjhO4G5W2PilC5d2SEHqMY6mhZUH_JRg==@protonmail.internalid> <4ccd923a-d5ab-6789-d01f-f1a0b0e84afa@pm.me> <3f420e5a-88b4-2308-3796-1e00628dcdb4@pm.me> Message-ID: https://youtu.be/fCP2-Bfhy04 On 10/2/20 4:05 AM, Robert Withers wrote: > https://youtu.be/fCP2-Bfhy04 > > On 10/2/20 4:00 AM, Robert Withers wrote: > >> https://youtu.be/0VLS-P9m0BM >> >> On 10/2/20 3:58 AM, Robert Withers wrote: >> >>> https://youtu.be/O3EW954g9r4 >>> >>> On 10/2/20 3:48 AM, Robert Withers wrote: >>> >>>> https://youtu.be/wqVsfGQ_1SU >>>> >>>> On 10/2/20 3:33 AM, Robert Withers wrote: >>>> >>>>> Alright, goddammit! Here is some more Truth, if you believe in my message. If you can handle it, it's Big. >>>>> >>>>> PROOF OF THE TRUTH OF THE PROPHESIES OF THE BIBLE! >>>>> >>>>> Hang on... >>>>> >>>>> On 10/2/20 3:24 AM, Robert Withers wrote: >>>>> >>>>>> https://youtu.be/3GLf-VT4wbY >>>>>> >>>>>> On 10/2/20 3:24 AM, Robert Withers wrote: >>>>>> >>>>>>> https://youtu.be/a-mAK3uB2_0 >>>>>>> >>>>>>> On 10/2/20 3:24 AM, Robert Withers wrote: >>>>>>> >>>>>>>> https://youtu.be/8c8_DEtMUOM >>>>>>>> >>>>>>>> On 10/2/20 3:23 AM, Robert Withers wrote: >>>>>>>> >>>>>>>>> https://youtu.be/q7p-ihYOG5s >>>>>>>>> >>>>>>>>> On 10/2/20 3:16 AM, Robert Withers wrote: >>>>>>>>> >>>>>>>>>> https://youtu.be/goeZZ4KFXTY >>>>>>>>>> >>>>>>>>>> On 10/2/20 3:07 AM, Robert Withers wrote: >>>>>>>>>> >>>>>>>>>>> I haven't heard from sparky, recently. Has anyone? >>>>>>>>>>> >>>>>>>>>>> On 10/2/20 3:03 AM, Robert Withers wrote: >>>>>>>>>>> >>>>>>>>>>>> Gotta meditate to this entire run! It's deep. >>>>>>>>>>>> >>>>>>>>>>>> https://soundcloud.com/yusuke-mizushima/acid-jazz-mix-jazzual-suspects >>>>>>>>>>>> >>>>>>>>>>>> On 10/2/20 2:50 AM, Robert Withers via Squeak-dev wrote: >>>>>>>>>>>> >>>>>>>>>>>>> https://soundcloud.com/robert_withers/rasta >>>>>>>>>>>>> >>>>>>>>>>>>> https://soundcloud.com/robert_withers/mando >>>>>>>>>>>>> >>>>>>>>>>>>> On 10/2/20 2:39 AM, Robert Withers wrote: >>>>>>>>>>>>> >>>>>>>>>>>>>> Play a bit of these spicy beats! The music helps me to express what is on the inside. >>>>>>>>>>>>>> >>>>>>>>>>>>>> https://youtu.be/3q8nGnls1Ow?t=2711 >>>>>>>>>>>>>> >>>>>>>>>>>>>> On 10/2/20 2:26 AM, Robert Withers wrote: >>>>>>>>>>>>>> >>>>>>>>>>>>>>> For I will restore health unto thee, and I will heal thee of thy wounds, saith the Lord; because they called thee an Outcast, saying, This is Zion, whom no man seeketh after. >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> Jeremiah 30:17 >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> On 10/2/20 2:22 AM, Robert Withers via Squeak-dev wrote: >>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> Thank you for reaching out in this manner on these issues. Though be ye not concerned for my health, Ron, I am in a good place. The sobbing really helps a LOT! And I was brought to that tonight after screaming! And discussing a couple of my many suicide attempts. And realizing the effect my not finding a home with Squeak had affected me over 20 years. It hurts! I sob. All is well; God is Good. The Truth heals. All praise to the Most High! >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> Kindly, >>>>>>>>>>>>>>>> Rob >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> On 10/2/20 2:16 AM, Ron Teitelbaum wrote: >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> Rob, >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> You have been in this place before. Is there someone you can talk to for help? Do you have a connection to someone that is working with you on your issues? Would you consider calling them now? >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> I've seen you here before. I've seen you doing much better. You should be good to yourself and get help now to move into calmer water and get on a more even keel. A better future includes protecting yourself, being nice to yourself, and making sure you get help when you need it. >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> Don't wait until later. I really recommend you do it now. >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> Ron >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> On Fri, Oct 2, 2020 at 1:50 AM Robert Withers wrote: >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>> "And would not encourage the feeding of the indigent!" >>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>> On 10/2/20 12:21 AM, Robert Withers wrote: >>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>> The Hellfire and its occupants, not my problem. I pay no attention. Burn. >>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>> I "Will be in a life of bliss, In a Garden on high. The Fruits whereof"... >>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>> --------------------------------------------------------------- >>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>> Al Haqqah (69) >>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>> [The Sure Reality! >>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>> What is the Sure Reality? >>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>> And what will make thee realise what the Sure Reality is? >>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>> The Thamud and the 'Ad People (branded) as false the Stunning Calamity! >>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>> But the Thamud,- they were destroyed by a terrible Storm of thunder and lightning! >>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>> And the 'Ad, they were destroyed by a furious Wind, exceedingly violent; >>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>> He made it rage against them seven nights and eight days in succession: so that thou couldst see the (whole) people lying prostrate in its (path), as they had been roots of hollow palm-trees tumbled down! >>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>> Then seest thou any of them left surviving? >>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>> And Pharaoh, and those before him, and the Cities Overthrown, committed habitual Sin. >>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>> And disobeyed (each) the messenger of their Lord; so He punished them with an abundant Penalty. >>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>> We, when the water (of Noah's Flood) overflowed beyond its limits, carried you (mankind), in the floating (Ark), >>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>> That We might make it a Message unto you, and that ears (that should hear the tale and) retain its memory should bear its (lessons) in remembrance. >>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>> Then, when one blast is sounded on the Trumpet, >>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>> And the earth is moved, and its mountains, and they are crushed to powder at one stroke,- >>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>> On that Day shall the (Great) Event come to pass. >>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>> And the sky will be rent asunder, for it will that Day be flimsy, >>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>> And the angels will be on its sides, and eight will, that Day, bear the Throne of thy Lord above them. >>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>> That Day shall ye be brought to Judgment: not an act of yours that ye hide will be hidden. >>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>> Then he that will be given his Record in his right hand will say: "Ah here! Read ye my Record! >>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>> "I did really understand that my Account would (One Day) reach me!" >>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>> And he will be in a life of Bliss, >>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>> In a Garden on high, >>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>> The Fruits whereof (will hang in bunches) low and near. >>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>> "Eat ye and drink ye, with full satisfaction; because of the (good) that ye sent before you, in the days that are gone!" >>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>> And he that will be given his Record in his left hand, will say: "Ah! Would that my Record had not been given to me! >>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>> "And that I had never realised how my account (stood)! >>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>> "Ah! Would that (Death) had made an end of me! >>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>> "Of no profit to me has been my wealth! >>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>> "My power has perished from me!"... >>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>> (The stern command will say): "Seize ye him, and bind ye him, >>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>> "And burn ye him in the Blazing Fire. >>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>> "Further, make him march in a chain, whereof the length is seventy cubits! >>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>> "This was he that would not believe in Allah Most High. >>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>> "And would not encourage the feeding of the indigent! >>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>> "So no friend hath he here this Day. >>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>> "Nor hath he any food except the corruption from the washing of wounds, >>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>> "Which none do eat but those in sin." >>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>> So I do call to witness what ye see, >>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>> And what ye see not, >>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>> That this is verily the word of an honoured messenger; >>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>> It is not the word of a poet: little it is ye believe! >>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>> Nor is it the word of a soothsayer: little admonition it is ye receive. >>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>> (This is) a Message sent down from the Lord of the Worlds. >>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>> And if the messenger were to invent any sayings in Our name, >>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>> We should certainly seize him by his right hand, >>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>> And We should certainly then cut off the artery of his heart: >>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>> Nor could any of you withhold him (from Our wrath). >>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>> But verily this is a Message for the Allah-fearing. >>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>> And We certainly know that there are amongst you those that reject (it). >>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>> But truly (Revelation) is a cause of sorrow for the Unbelievers. >>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>> But verily it is Truth of assured certainty. >>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>> So glorify the name of thy Lord Most High. >>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>> ] - Quran 69:1-52 >>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>> --- >>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>> Slosher >>>>>>>>>>>>>>>>>>> Oriental, NC >>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>> On 10/1/20 11:36 PM, Ron Teitelbaum wrote: >>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>> Hi Rob, >>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>> I'm so sorry you felt that way. I know you have had major issues, you have said the same yourself. I'm always happy to see you come back even after long absences. You are a brilliant coder and it has been my distinct pleasure to work with you on Cryptography! Thank you for all you have done and indeed you are responsible for adding significant value to Squeak and the community. >>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>> We all work on code and it's easy to work your ass off on something to make it work and forget where it originated. We all contribute in large and small ways to everything. If you started VMMaker thank you! It is definitely something a lot of us use. I remember learning all about it a long long time ago before I realized that while I could understand it and I could use it, the people that work on the VM are a level higher than me. I just make apps! >>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>> I remember getting in an argument with Andreas about adding methods to collection. "WE DON"T NEED more methods in Collection we need to remove most of them and make it easier!" I argued with him about the value over and over but he insisted that they just didn't add enough value. I could have been put off. I could have assumed that Andreas didn't like me but I would have been very wrong! I was really honored to get the chance to work with him and we became great friends. Of course I added my methods to the code we were working on together and was so thrilled when he used my methods for his own code. >>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>> I don't know what happened with VMMaker but again thank you for your participation in it.. I wanted to take a minute to thank you for your work and to let you know it is my honor to work with you too! I hope that you can come to terms with your past and that you get the help you need for your CPTSD. >>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>> Everything is possible, the past is gone, but the future is still yours to shape. I wish the past was set in stone but even that moves and slips. I was talking to my wife about a party we attended: "Remember in 2000 we were at the party and counted down the new year and someone hit the breaker and killed the lights! We were all talking about what would happen in the year 2000, would everything break!" Great story except that I hadn't met my wife yet! The past is only what we remember but the future is something we have control over. Peace, calm, happyness, they are all hard to come by but they are possible. I wish you success in finding what makes your future better. >>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>> I'm sorry about the bad things that have happened to you in the past. As far as I'm concerned, you are welcomed here! >>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>> All the best, >>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>> Ron Teitelbaum >>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>> On Thu, Oct 1, 2020 at 10:38 PM Robert Withers via Squeak-dev wrote: >>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>> :sob::sob::sob: >>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>> On 10/1/20 10:34 PM, Robert Withers wrote: >>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>>> I wrote to the #general Squeak Slack channel: >>>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>>>> What a complete larcenous bastard. 20 years ago, this month, published it as his own work. And been against me ever since. My CPTSD (100% veteran service-connected) comes with an exquisitely sensitive deception meter. There are those who shunned me and ostracized me and made me feel MOST UNWELCOME. For 20 years. My delusions kick in and I start suspecting back channel communications against me. My love for Squeak conflicted with what I knew was happening. but I hung in there and worked on Cryptography, work with a group of great people and that I am satisfied with its added value to Squeak. For 20 years I KNEW people were against me in the community. I cannot describe how negatively this affected me. My third suicide attempt, in 2007 I jumped off the roof of a 6 story apartment building and broke my back along with many bones. God did not want me to die, yet, so I lived. This deception and ostracism is most well highlighted by the taking credit for my work, without attribution. He is a complete tool. SHAME! >>>>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>>>> I do not know the degree to which he spoke against me. Iimagineit was ever since 2000. Delusions! What is real? I knew not. So much torment! AGONY! They do not welcome me! They are trying to chase me off! Good grief, Charlie Brown. >>>>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>>>> Severely exacerbated my CPTSD! I kept trying to kill myself because of it! I thought I had done something egregiously wrong. Whatever it was it had to be my fault. I was not feeling the love, even from myself. >>>>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>>>> :scream: >>>>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>>>> :scream: >>>>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>>>> In 2017, 900 units of insulin brought my blood glucose below 40. I almost succeeded that time. >>>>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>>>> :scream: >>>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>>> rww >>>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>>> On 10/1/20 8:55 PM, Robert Withers wrote: >>>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>>>> The worst sort of person is one who takes the credit for the work of >>>>>>>>>>>>>>>>>>>>>>>>> another. Wouldn't you agree? >>>>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>>>> You may wish to hear John's judgement on the matter. He was right there >>>>>>>>>>>>>>>>>>>>>>>>> when it was first built. >>>>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>>>> If you are not humble you will be humiliated, and brought low. >>>>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>>>> rww >>>>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>>>> On 10/1/20 8:35 PM, tim Rowledge wrote: >>>>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>>>>>> On 2020-10-01, at 4:57 PM, Robert Withers via Squeak-dev >>>>>>>>>>>>>>>>>>>>>>>>>>> [](mailto:squeak-dev at lists.squeakfoundation.org) >>>>>>>>>>>>>>>>>>>>>>>>>>> wrote: >>>>>>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>>>>>> I am curious. Who was the original author of the VMMaker Tool? >>>>>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>>>>> That would be me; back in exobox days. Written along with the original VMMaker and intended to be an example of clean, tidy, morphic usage. I've no idea if anyone ever uses it now, since running it via scripting has proven more valuable. >>>>>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>>>>> tim >>>>>>>>>>>>>>>>>>>>>>>>>> -- >>>>>>>>>>>>>>>>>>>>>>>>>> tim Rowledge; >>>>>>>>>>>>>>>>>>>>>>>>>> tim at rowledge.org >>>>>>>>>>>>>>>>>>>>>>>>>> ; >>>>>>>>>>>>>>>>>>>>>>>>>> http://www.rowledge.org/tim >>>>>>>>>>>>>>>>>>>>>>>>>> "Wibble" said Pooh the stress beginning to show. >>>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>>> -- >>>>>>>>>>>>>>>>>>>>>>>> K, r >>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>> -- >>>>>>>>>>>>>>>>>>>>>>> K, r >>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>> -- >>>>>>>>>>>>>>>>>>>>> K, r >>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>> -- >>>>>>>>>>>>>>>>>>>> K, r >>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>> -- >>>>>>>>>>>>>>>>>>> K, r >>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>> -- >>>>>>>>>>>>>>>>>> K, r >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> -- >>>>>>>>>>>>>>>> K, r >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> -- >>>>>>>>>>>>>>> K, r >>>>>>>>>>>>>> >>>>>>>>>>>>>> -- >>>>>>>>>>>>>> K, r >>>>>>>>>>>>> >>>>>>>>>>>>> -- >>>>>>>>>>>>> K, r >>>>>>>>>>>> >>>>>>>>>>>> -- >>>>>>>>>>>> K, r >>>>>>>>>>> >>>>>>>>>>> -- >>>>>>>>>>> K, r >>>>>>>>>> >>>>>>>>>> -- >>>>>>>>>> K, r >>>>>>>>> >>>>>>>>> -- >>>>>>>>> K, r >>>>>>>> >>>>>>>> -- >>>>>>>> K, r >>>>>>> >>>>>>> -- >>>>>>> K, r >>>>>> >>>>>> -- >>>>>> K, r >>>>> >>>>> -- >>>>> K, r >>>> >>>> -- >>>> K, r >>> >>> -- >>> K, r >> >> -- >> K, r > > -- > K, r -- K, r -------------- next part -------------- An HTML attachment was scrubbed... URL: -------------- next part -------------- A non-text attachment was scrubbed... Name: 7420963_20200328125416581_1_LARGE.jpg Type: image/jpeg Size: 47844 bytes Desc: not available URL: -------------- next part -------------- A non-text attachment was scrubbed... Name: desolate.jpg Type: image/jpeg Size: 44831 bytes Desc: not available URL: From robert.withers at pm.me Fri Oct 2 08:19:19 2020 From: robert.withers at pm.me (Robert Withers) Date: Fri, 02 Oct 2020 08:19:19 +0000 Subject: [squeak-dev] Curious history In-Reply-To: References: <8UkaPva6Z6_yJ0pscd4duA8gJumwzeJ-XrIQILL9lkjz2J7jrrO7SwjjhO4G5W2PilC5d2SEHqMY6mhZUH_JRg==@protonmail.internalid> <4ccd923a-d5ab-6789-d01f-f1a0b0e84afa@pm.me> <4RzffQkMYVDio5ypO3BdDDogbcHCBBrlCc1fxoT8GmqCUWhN0sU9yBdJfjTNNuM4-qL-oLkLcIB--mYjPkf0Lg==@protonmail.conversationid> <3f420e5a-88b4-2308-3796-1e00628dcdb4@pm.me> Message-ID: https://youtu.be/HglA72ogPCE On 10/2/20 4:14 AM, Robert Withers wrote: > https://youtu.be/fCP2-Bfhy04 > > On 10/2/20 4:05 AM, Robert Withers wrote: > >> https://youtu.be/fCP2-Bfhy04 >> >> On 10/2/20 4:00 AM, Robert Withers wrote: >> >>> https://youtu.be/0VLS-P9m0BM >>> >>> On 10/2/20 3:58 AM, Robert Withers wrote: >>> >>>> https://youtu.be/O3EW954g9r4 >>>> >>>> On 10/2/20 3:48 AM, Robert Withers wrote: >>>> >>>>> https://youtu.be/wqVsfGQ_1SU >>>>> >>>>> On 10/2/20 3:33 AM, Robert Withers wrote: >>>>> >>>>>> Alright, goddammit! Here is some more Truth, if you believe in my message. If you can handle it, it's Big. >>>>>> >>>>>> PROOF OF THE TRUTH OF THE PROPHESIES OF THE BIBLE! >>>>>> >>>>>> Hang on... >>>>>> >>>>>> On 10/2/20 3:24 AM, Robert Withers wrote: >>>>>> >>>>>>> https://youtu.be/3GLf-VT4wbY >>>>>>> >>>>>>> On 10/2/20 3:24 AM, Robert Withers wrote: >>>>>>> >>>>>>>> https://youtu.be/a-mAK3uB2_0 >>>>>>>> >>>>>>>> On 10/2/20 3:24 AM, Robert Withers wrote: >>>>>>>> >>>>>>>>> https://youtu.be/8c8_DEtMUOM >>>>>>>>> >>>>>>>>> On 10/2/20 3:23 AM, Robert Withers wrote: >>>>>>>>> >>>>>>>>>> https://youtu.be/q7p-ihYOG5s >>>>>>>>>> >>>>>>>>>> On 10/2/20 3:16 AM, Robert Withers wrote: >>>>>>>>>> >>>>>>>>>>> https://youtu.be/goeZZ4KFXTY >>>>>>>>>>> >>>>>>>>>>> On 10/2/20 3:07 AM, Robert Withers wrote: >>>>>>>>>>> >>>>>>>>>>>> I haven't heard from sparky, recently. Has anyone? >>>>>>>>>>>> >>>>>>>>>>>> On 10/2/20 3:03 AM, Robert Withers wrote: >>>>>>>>>>>> >>>>>>>>>>>>> Gotta meditate to this entire run! It's deep. >>>>>>>>>>>>> >>>>>>>>>>>>> https://soundcloud.com/yusuke-mizushima/acid-jazz-mix-jazzual-suspects >>>>>>>>>>>>> >>>>>>>>>>>>> On 10/2/20 2:50 AM, Robert Withers via Squeak-dev wrote: >>>>>>>>>>>>> >>>>>>>>>>>>>> https://soundcloud.com/robert_withers/rasta >>>>>>>>>>>>>> >>>>>>>>>>>>>> https://soundcloud.com/robert_withers/mando >>>>>>>>>>>>>> >>>>>>>>>>>>>> On 10/2/20 2:39 AM, Robert Withers wrote: >>>>>>>>>>>>>> >>>>>>>>>>>>>>> Play a bit of these spicy beats! The music helps me to express what is on the inside. >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> https://youtu.be/3q8nGnls1Ow?t=2711 >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> On 10/2/20 2:26 AM, Robert Withers wrote: >>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> For I will restore health unto thee, and I will heal thee of thy wounds, saith the Lord; because they called thee an Outcast, saying, This is Zion, whom no man seeketh after. >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> Jeremiah 30:17 >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> On 10/2/20 2:22 AM, Robert Withers via Squeak-dev wrote: >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> Thank you for reaching out in this manner on these issues. Though be ye not concerned for my health, Ron, I am in a good place. The sobbing really helps a LOT! And I was brought to that tonight after screaming! And discussing a couple of my many suicide attempts. And realizing the effect my not finding a home with Squeak had affected me over 20 years. It hurts! I sob. All is well; God is Good. The Truth heals. All praise to the Most High! >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> Kindly, >>>>>>>>>>>>>>>>> Rob >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> On 10/2/20 2:16 AM, Ron Teitelbaum wrote: >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>> Rob, >>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>> You have been in this place before. Is there someone you can talk to for help? Do you have a connection to someone that is working with you on your issues? Would you consider calling them now? >>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>> I've seen you here before. I've seen you doing much better. You should be good to yourself and get help now to move into calmer water and get on a more even keel. A better future includes protecting yourself, being nice to yourself, and making sure you get help when you need it. >>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>> Don't wait until later. I really recommend you do it now. >>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>> Ron >>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>> On Fri, Oct 2, 2020 at 1:50 AM Robert Withers wrote: >>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>> "And would not encourage the feeding of the indigent!" >>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>> On 10/2/20 12:21 AM, Robert Withers wrote: >>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>> The Hellfire and its occupants, not my problem. I pay no attention. Burn. >>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>> I "Will be in a life of bliss, In a Garden on high. The Fruits whereof"... >>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>> --------------------------------------------------------------- >>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>> Al Haqqah (69) >>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>> [The Sure Reality! >>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>> What is the Sure Reality? >>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>> And what will make thee realise what the Sure Reality is? >>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>> The Thamud and the 'Ad People (branded) as false the Stunning Calamity! >>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>> But the Thamud,- they were destroyed by a terrible Storm of thunder and lightning! >>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>> And the 'Ad, they were destroyed by a furious Wind, exceedingly violent; >>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>> He made it rage against them seven nights and eight days in succession: so that thou couldst see the (whole) people lying prostrate in its (path), as they had been roots of hollow palm-trees tumbled down! >>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>> Then seest thou any of them left surviving? >>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>> And Pharaoh, and those before him, and the Cities Overthrown, committed habitual Sin. >>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>> And disobeyed (each) the messenger of their Lord; so He punished them with an abundant Penalty. >>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>> We, when the water (of Noah's Flood) overflowed beyond its limits, carried you (mankind), in the floating (Ark), >>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>> That We might make it a Message unto you, and that ears (that should hear the tale and) retain its memory should bear its (lessons) in remembrance. >>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>> Then, when one blast is sounded on the Trumpet, >>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>> And the earth is moved, and its mountains, and they are crushed to powder at one stroke,- >>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>> On that Day shall the (Great) Event come to pass. >>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>> And the sky will be rent asunder, for it will that Day be flimsy, >>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>> And the angels will be on its sides, and eight will, that Day, bear the Throne of thy Lord above them. >>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>> That Day shall ye be brought to Judgment: not an act of yours that ye hide will be hidden. >>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>> Then he that will be given his Record in his right hand will say: "Ah here! Read ye my Record! >>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>> "I did really understand that my Account would (One Day) reach me!" >>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>> And he will be in a life of Bliss, >>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>> In a Garden on high, >>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>> The Fruits whereof (will hang in bunches) low and near. >>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>> "Eat ye and drink ye, with full satisfaction; because of the (good) that ye sent before you, in the days that are gone!" >>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>> And he that will be given his Record in his left hand, will say: "Ah! Would that my Record had not been given to me! >>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>> "And that I had never realised how my account (stood)! >>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>> "Ah! Would that (Death) had made an end of me! >>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>> "Of no profit to me has been my wealth! >>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>> "My power has perished from me!"... >>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>> (The stern command will say): "Seize ye him, and bind ye him, >>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>> "And burn ye him in the Blazing Fire. >>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>> "Further, make him march in a chain, whereof the length is seventy cubits! >>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>> "This was he that would not believe in Allah Most High. >>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>> "And would not encourage the feeding of the indigent! >>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>> "So no friend hath he here this Day. >>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>> "Nor hath he any food except the corruption from the washing of wounds, >>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>> "Which none do eat but those in sin." >>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>> So I do call to witness what ye see, >>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>> And what ye see not, >>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>> That this is verily the word of an honoured messenger; >>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>> It is not the word of a poet: little it is ye believe! >>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>> Nor is it the word of a soothsayer: little admonition it is ye receive. >>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>> (This is) a Message sent down from the Lord of the Worlds. >>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>> And if the messenger were to invent any sayings in Our name, >>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>> We should certainly seize him by his right hand, >>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>> And We should certainly then cut off the artery of his heart: >>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>> Nor could any of you withhold him (from Our wrath). >>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>> But verily this is a Message for the Allah-fearing. >>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>> And We certainly know that there are amongst you those that reject (it). >>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>> But truly (Revelation) is a cause of sorrow for the Unbelievers. >>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>> But verily it is Truth of assured certainty. >>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>> So glorify the name of thy Lord Most High. >>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>> ] - Quran 69:1-52 >>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>> --- >>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>> Slosher >>>>>>>>>>>>>>>>>>>> Oriental, NC >>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>> On 10/1/20 11:36 PM, Ron Teitelbaum wrote: >>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>> Hi Rob, >>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>> I'm so sorry you felt that way. I know you have had major issues, you have said the same yourself. I'm always happy to see you come back even after long absences. You are a brilliant coder and it has been my distinct pleasure to work with you on Cryptography! Thank you for all you have done and indeed you are responsible for adding significant value to Squeak and the community. >>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>> We all work on code and it's easy to work your ass off on something to make it work and forget where it originated. We all contribute in large and small ways to everything. If you started VMMaker thank you! It is definitely something a lot of us use. I remember learning all about it a long long time ago before I realized that while I could understand it and I could use it, the people that work on the VM are a level higher than me. I just make apps! >>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>> I remember getting in an argument with Andreas about adding methods to collection. "WE DON"T NEED more methods in Collection we need to remove most of them and make it easier!" I argued with him about the value over and over but he insisted that they just didn't add enough value. I could have been put off. I could have assumed that Andreas didn't like me but I would have been very wrong! I was really honored to get the chance to work with him and we became great friends. Of course I added my methods to the code we were working on together and was so thrilled when he used my methods for his own code. >>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>> I don't know what happened with VMMaker but again thank you for your participation in it.. I wanted to take a minute to thank you for your work and to let you know it is my honor to work with you too! I hope that you can come to terms with your past and that you get the help you need for your CPTSD. >>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>> Everything is possible, the past is gone, but the future is still yours to shape. I wish the past was set in stone but even that moves and slips. I was talking to my wife about a party we attended: "Remember in 2000 we were at the party and counted down the new year and someone hit the breaker and killed the lights! We were all talking about what would happen in the year 2000, would everything break!" Great story except that I hadn't met my wife yet! The past is only what we remember but the future is something we have control over. Peace, calm, happyness, they are all hard to come by but they are possible. I wish you success in finding what makes your future better. >>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>> I'm sorry about the bad things that have happened to you in the past. As far as I'm concerned, you are welcomed here! >>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>> All the best, >>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>> Ron Teitelbaum >>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>> On Thu, Oct 1, 2020 at 10:38 PM Robert Withers via Squeak-dev wrote: >>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>>> :sob::sob::sob: >>>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>>> On 10/1/20 10:34 PM, Robert Withers wrote: >>>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>>>> I wrote to the #general Squeak Slack channel: >>>>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>>>>> What a complete larcenous bastard. 20 years ago, this month, published it as his own work. And been against me ever since. My CPTSD (100% veteran service-connected) comes with an exquisitely sensitive deception meter. There are those who shunned me and ostracized me and made me feel MOST UNWELCOME. For 20 years. My delusions kick in and I start suspecting back channel communications against me. My love for Squeak conflicted with what I knew was happening. but I hung in there and worked on Cryptography, work with a group of great people and that I am satisfied with its added value to Squeak. For 20 years I KNEW people were against me in the community. I cannot describe how negatively this affected me. My third suicide attempt, in 2007 I jumped off the roof of a 6 story apartment building and broke my back along with many bones. God did not want me to die, yet, so I lived. This deception and ostracism is most well highlighted by the taking credit for my work, without attribution. He is a complete tool. SHAME! >>>>>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>>>>> I do not know the degree to which he spoke against me. Iimagineit was ever since 2000. Delusions! What is real? I knew not. So much torment! AGONY! They do not welcome me! They are trying to chase me off! Good grief, Charlie Brown. >>>>>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>>>>> Severely exacerbated my CPTSD! I kept trying to kill myself because of it! I thought I had done something egregiously wrong. Whatever it was it had to be my fault. I was not feeling the love, even from myself. >>>>>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>>>>> :scream: >>>>>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>>>>> :scream: >>>>>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>>>>> In 2017, 900 units of insulin brought my blood glucose below 40. I almost succeeded that time. >>>>>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>>>>> :scream: >>>>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>>>> rww >>>>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>>>> On 10/1/20 8:55 PM, Robert Withers wrote: >>>>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>>>>> The worst sort of person is one who takes the credit for the work of >>>>>>>>>>>>>>>>>>>>>>>>>> another. Wouldn't you agree? >>>>>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>>>>> You may wish to hear John's judgement on the matter. He was right there >>>>>>>>>>>>>>>>>>>>>>>>>> when it was first built. >>>>>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>>>>> If you are not humble you will be humiliated, and brought low. >>>>>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>>>>> rww >>>>>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>>>>> On 10/1/20 8:35 PM, tim Rowledge wrote: >>>>>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>>>>>>> On 2020-10-01, at 4:57 PM, Robert Withers via Squeak-dev >>>>>>>>>>>>>>>>>>>>>>>>>>>> [](mailto:squeak-dev at lists.squeakfoundation.org) >>>>>>>>>>>>>>>>>>>>>>>>>>>> wrote: >>>>>>>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>>>>>>> I am curious. Who was the original author of the VMMaker Tool? >>>>>>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>>>>>> That would be me; back in exobox days. Written along with the original VMMaker and intended to be an example of clean, tidy, morphic usage. I've no idea if anyone ever uses it now, since running it via scripting has proven more valuable. >>>>>>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>>>>>> tim >>>>>>>>>>>>>>>>>>>>>>>>>>> -- >>>>>>>>>>>>>>>>>>>>>>>>>>> tim Rowledge; >>>>>>>>>>>>>>>>>>>>>>>>>>> tim at rowledge.org >>>>>>>>>>>>>>>>>>>>>>>>>>> ; >>>>>>>>>>>>>>>>>>>>>>>>>>> http://www.rowledge.org/tim >>>>>>>>>>>>>>>>>>>>>>>>>>> "Wibble" said Pooh the stress beginning to show. >>>>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>>>> -- >>>>>>>>>>>>>>>>>>>>>>>>> K, r >>>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>>> -- >>>>>>>>>>>>>>>>>>>>>>>> K, r >>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>> -- >>>>>>>>>>>>>>>>>>>>>> K, r >>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>> -- >>>>>>>>>>>>>>>>>>>>> K, r >>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>> -- >>>>>>>>>>>>>>>>>>>> K, r >>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>> -- >>>>>>>>>>>>>>>>>>> K, r >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> -- >>>>>>>>>>>>>>>>> K, r >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> -- >>>>>>>>>>>>>>>> K, r >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> -- >>>>>>>>>>>>>>> K, r >>>>>>>>>>>>>> >>>>>>>>>>>>>> -- >>>>>>>>>>>>>> K, r >>>>>>>>>>>>> >>>>>>>>>>>>> -- >>>>>>>>>>>>> K, r >>>>>>>>>>>> >>>>>>>>>>>> -- >>>>>>>>>>>> K, r >>>>>>>>>>> >>>>>>>>>>> -- >>>>>>>>>>> K, r >>>>>>>>>> >>>>>>>>>> -- >>>>>>>>>> K, r >>>>>>>>> >>>>>>>>> -- >>>>>>>>> K, r >>>>>>>> >>>>>>>> -- >>>>>>>> K, r >>>>>>> >>>>>>> -- >>>>>>> K, r >>>>>> >>>>>> -- >>>>>> K, r >>>>> >>>>> -- >>>>> K, r >>>> >>>> -- >>>> K, r >>> >>> -- >>> K, r >> >> -- >> K, r > > -- > K, r -- K, r -------------- next part -------------- An HTML attachment was scrubbed... URL: -------------- next part -------------- A non-text attachment was scrubbed... Name: 7420963_20200328125416581_1_LARGE.jpg Type: image/jpeg Size: 47844 bytes Desc: not available URL: -------------- next part -------------- A non-text attachment was scrubbed... Name: desolate.jpg Type: image/jpeg Size: 44831 bytes Desc: not available URL: From robert.withers at pm.me Fri Oct 2 08:22:08 2020 From: robert.withers at pm.me (Robert Withers) Date: Fri, 02 Oct 2020 08:22:08 +0000 Subject: [squeak-dev] Curious history In-Reply-To: References: <4ccd923a-d5ab-6789-d01f-f1a0b0e84afa@pm.me> <4RzffQkMYVDio5ypO3BdDDogbcHCBBrlCc1fxoT8GmqCUWhN0sU9yBdJfjTNNuM4-qL-oLkLcIB--mYjPkf0Lg==@protonmail.conversationid> <3f420e5a-88b4-2308-3796-1e00628dcdb4@pm.me> Message-ID: <6e7b87b8-c266-42b0-f592-90db6271ae70@pm.me> Time for a little bit of heaven, blowing horns! https://youtu.be/fWzuBSiMkqg On 10/2/20 4:19 AM, Robert Withers wrote: > https://youtu.be/HglA72ogPCE > > On 10/2/20 4:14 AM, Robert Withers wrote: > >> https://youtu.be/fCP2-Bfhy04 >> >> On 10/2/20 4:05 AM, Robert Withers wrote: >> >>> https://youtu.be/fCP2-Bfhy04 >>> >>> On 10/2/20 4:00 AM, Robert Withers wrote: >>> >>>> https://youtu.be/0VLS-P9m0BM >>>> >>>> On 10/2/20 3:58 AM, Robert Withers wrote: >>>> >>>>> https://youtu.be/O3EW954g9r4 >>>>> >>>>> On 10/2/20 3:48 AM, Robert Withers wrote: >>>>> >>>>>> https://youtu.be/wqVsfGQ_1SU >>>>>> >>>>>> On 10/2/20 3:33 AM, Robert Withers wrote: >>>>>> >>>>>>> Alright, goddammit! Here is some more Truth, if you believe in my message. If you can handle it, it's Big. >>>>>>> >>>>>>> PROOF OF THE TRUTH OF THE PROPHESIES OF THE BIBLE! >>>>>>> >>>>>>> Hang on... >>>>>>> >>>>>>> On 10/2/20 3:24 AM, Robert Withers wrote: >>>>>>> >>>>>>>> https://youtu.be/3GLf-VT4wbY >>>>>>>> >>>>>>>> On 10/2/20 3:24 AM, Robert Withers wrote: >>>>>>>> >>>>>>>>> https://youtu.be/a-mAK3uB2_0 >>>>>>>>> >>>>>>>>> On 10/2/20 3:24 AM, Robert Withers wrote: >>>>>>>>> >>>>>>>>>> https://youtu.be/8c8_DEtMUOM >>>>>>>>>> >>>>>>>>>> On 10/2/20 3:23 AM, Robert Withers wrote: >>>>>>>>>> >>>>>>>>>>> https://youtu.be/q7p-ihYOG5s >>>>>>>>>>> >>>>>>>>>>> On 10/2/20 3:16 AM, Robert Withers wrote: >>>>>>>>>>> >>>>>>>>>>>> https://youtu.be/goeZZ4KFXTY >>>>>>>>>>>> >>>>>>>>>>>> On 10/2/20 3:07 AM, Robert Withers wrote: >>>>>>>>>>>> >>>>>>>>>>>>> I haven't heard from sparky, recently. Has anyone? >>>>>>>>>>>>> >>>>>>>>>>>>> On 10/2/20 3:03 AM, Robert Withers wrote: >>>>>>>>>>>>> >>>>>>>>>>>>>> Gotta meditate to this entire run! It's deep. >>>>>>>>>>>>>> >>>>>>>>>>>>>> https://soundcloud.com/yusuke-mizushima/acid-jazz-mix-jazzual-suspects >>>>>>>>>>>>>> >>>>>>>>>>>>>> On 10/2/20 2:50 AM, Robert Withers via Squeak-dev wrote: >>>>>>>>>>>>>> >>>>>>>>>>>>>>> https://soundcloud.com/robert_withers/rasta >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> https://soundcloud.com/robert_withers/mando >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> On 10/2/20 2:39 AM, Robert Withers wrote: >>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> Play a bit of these spicy beats! The music helps me to express what is on the inside. >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> https://youtu.be/3q8nGnls1Ow?t=2711 >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> On 10/2/20 2:26 AM, Robert Withers wrote: >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> For I will restore health unto thee, and I will heal thee of thy wounds, saith the Lord; because they called thee an Outcast, saying, This is Zion, whom no man seeketh after. >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> Jeremiah 30:17 >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> On 10/2/20 2:22 AM, Robert Withers via Squeak-dev wrote: >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>> Thank you for reaching out in this manner on these issues. Though be ye not concerned for my health, Ron, I am in a good place. The sobbing really helps a LOT! And I was brought to that tonight after screaming! And discussing a couple of my many suicide attempts. And realizing the effect my not finding a home with Squeak had affected me over 20 years. It hurts! I sob. All is well; God is Good. The Truth heals. All praise to the Most High! >>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>> Kindly, >>>>>>>>>>>>>>>>>> Rob >>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>> On 10/2/20 2:16 AM, Ron Teitelbaum wrote: >>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>> Rob, >>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>> You have been in this place before. Is there someone you can talk to for help? Do you have a connection to someone that is working with you on your issues? Would you consider calling them now? >>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>> I've seen you here before. I've seen you doing much better. You should be good to yourself and get help now to move into calmer water and get on a more even keel. A better future includes protecting yourself, being nice to yourself, and making sure you get help when you need it. >>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>> Don't wait until later. I really recommend you do it now. >>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>> Ron >>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>> On Fri, Oct 2, 2020 at 1:50 AM Robert Withers wrote: >>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>> "And would not encourage the feeding of the indigent!" >>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>> On 10/2/20 12:21 AM, Robert Withers wrote: >>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>> The Hellfire and its occupants, not my problem. I pay no attention. Burn. >>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>> I "Will be in a life of bliss, In a Garden on high. The Fruits whereof"... >>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>> --------------------------------------------------------------- >>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>> Al Haqqah (69) >>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>> [The Sure Reality! >>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>> What is the Sure Reality? >>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>> And what will make thee realise what the Sure Reality is? >>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>> The Thamud and the 'Ad People (branded) as false the Stunning Calamity! >>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>> But the Thamud,- they were destroyed by a terrible Storm of thunder and lightning! >>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>> And the 'Ad, they were destroyed by a furious Wind, exceedingly violent; >>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>> He made it rage against them seven nights and eight days in succession: so that thou couldst see the (whole) people lying prostrate in its (path), as they had been roots of hollow palm-trees tumbled down! >>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>> Then seest thou any of them left surviving? >>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>> And Pharaoh, and those before him, and the Cities Overthrown, committed habitual Sin. >>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>> And disobeyed (each) the messenger of their Lord; so He punished them with an abundant Penalty. >>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>> We, when the water (of Noah's Flood) overflowed beyond its limits, carried you (mankind), in the floating (Ark), >>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>> That We might make it a Message unto you, and that ears (that should hear the tale and) retain its memory should bear its (lessons) in remembrance. >>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>> Then, when one blast is sounded on the Trumpet, >>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>> And the earth is moved, and its mountains, and they are crushed to powder at one stroke,- >>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>> On that Day shall the (Great) Event come to pass. >>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>> And the sky will be rent asunder, for it will that Day be flimsy, >>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>> And the angels will be on its sides, and eight will, that Day, bear the Throne of thy Lord above them. >>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>> That Day shall ye be brought to Judgment: not an act of yours that ye hide will be hidden. >>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>> Then he that will be given his Record in his right hand will say: "Ah here! Read ye my Record! >>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>> "I did really understand that my Account would (One Day) reach me!" >>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>> And he will be in a life of Bliss, >>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>> In a Garden on high, >>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>> The Fruits whereof (will hang in bunches) low and near. >>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>> "Eat ye and drink ye, with full satisfaction; because of the (good) that ye sent before you, in the days that are gone!" >>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>> And he that will be given his Record in his left hand, will say: "Ah! Would that my Record had not been given to me! >>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>> "And that I had never realised how my account (stood)! >>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>> "Ah! Would that (Death) had made an end of me! >>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>> "Of no profit to me has been my wealth! >>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>> "My power has perished from me!"... >>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>> (The stern command will say): "Seize ye him, and bind ye him, >>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>> "And burn ye him in the Blazing Fire. >>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>> "Further, make him march in a chain, whereof the length is seventy cubits! >>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>> "This was he that would not believe in Allah Most High. >>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>> "And would not encourage the feeding of the indigent! >>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>> "So no friend hath he here this Day. >>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>> "Nor hath he any food except the corruption from the washing of wounds, >>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>> "Which none do eat but those in sin." >>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>> So I do call to witness what ye see, >>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>> And what ye see not, >>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>> That this is verily the word of an honoured messenger; >>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>> It is not the word of a poet: little it is ye believe! >>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>> Nor is it the word of a soothsayer: little admonition it is ye receive. >>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>> (This is) a Message sent down from the Lord of the Worlds. >>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>> And if the messenger were to invent any sayings in Our name, >>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>> We should certainly seize him by his right hand, >>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>> And We should certainly then cut off the artery of his heart: >>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>> Nor could any of you withhold him (from Our wrath). >>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>> But verily this is a Message for the Allah-fearing. >>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>> And We certainly know that there are amongst you those that reject (it). >>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>> But truly (Revelation) is a cause of sorrow for the Unbelievers. >>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>> But verily it is Truth of assured certainty. >>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>> So glorify the name of thy Lord Most High. >>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>> ] - Quran 69:1-52 >>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>> --- >>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>> Slosher >>>>>>>>>>>>>>>>>>>>> Oriental, NC >>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>> On 10/1/20 11:36 PM, Ron Teitelbaum wrote: >>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>>> Hi Rob, >>>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>>> I'm so sorry you felt that way. I know you have had major issues, you have said the same yourself. I'm always happy to see you come back even after long absences. You are a brilliant coder and it has been my distinct pleasure to work with you on Cryptography! Thank you for all you have done and indeed you are responsible for adding significant value to Squeak and the community. >>>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>>> We all work on code and it's easy to work your ass off on something to make it work and forget where it originated. We all contribute in large and small ways to everything. If you started VMMaker thank you! It is definitely something a lot of us use. I remember learning all about it a long long time ago before I realized that while I could understand it and I could use it, the people that work on the VM are a level higher than me. I just make apps! >>>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>>> I remember getting in an argument with Andreas about adding methods to collection. "WE DON"T NEED more methods in Collection we need to remove most of them and make it easier!" I argued with him about the value over and over but he insisted that they just didn't add enough value. I could have been put off. I could have assumed that Andreas didn't like me but I would have been very wrong! I was really honored to get the chance to work with him and we became great friends. Of course I added my methods to the code we were working on together and was so thrilled when he used my methods for his own code. >>>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>>> I don't know what happened with VMMaker but again thank you for your participation in it.. I wanted to take a minute to thank you for your work and to let you know it is my honor to work with you too! I hope that you can come to terms with your past and that you get the help you need for your CPTSD. >>>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>>> Everything is possible, the past is gone, but the future is still yours to shape. I wish the past was set in stone but even that moves and slips. I was talking to my wife about a party we attended: "Remember in 2000 we were at the party and counted down the new year and someone hit the breaker and killed the lights! We were all talking about what would happen in the year 2000, would everything break!" Great story except that I hadn't met my wife yet! The past is only what we remember but the future is something we have control over. Peace, calm, happyness, they are all hard to come by but they are possible. I wish you success in finding what makes your future better. >>>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>>> I'm sorry about the bad things that have happened to you in the past. As far as I'm concerned, you are welcomed here! >>>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>>> All the best, >>>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>>> Ron Teitelbaum >>>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>>> On Thu, Oct 1, 2020 at 10:38 PM Robert Withers via Squeak-dev wrote: >>>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>>>> :sob::sob::sob: >>>>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>>>> On 10/1/20 10:34 PM, Robert Withers wrote: >>>>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>>>>> I wrote to the #general Squeak Slack channel: >>>>>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>>>>>> What a complete larcenous bastard. 20 years ago, this month, published it as his own work. And been against me ever since. My CPTSD (100% veteran service-connected) comes with an exquisitely sensitive deception meter. There are those who shunned me and ostracized me and made me feel MOST UNWELCOME. For 20 years. My delusions kick in and I start suspecting back channel communications against me. My love for Squeak conflicted with what I knew was happening. but I hung in there and worked on Cryptography, work with a group of great people and that I am satisfied with its added value to Squeak. For 20 years I KNEW people were against me in the community. I cannot describe how negatively this affected me. My third suicide attempt, in 2007 I jumped off the roof of a 6 story apartment building and broke my back along with many bones. God did not want me to die, yet, so I lived. This deception and ostracism is most well highlighted by the taking credit for my work, without attribution. He is a complete tool. SHAME! >>>>>>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>>>>>> I do not know the degree to which he spoke against me. Iimagineit was ever since 2000. Delusions! What is real? I knew not. So much torment! AGONY! They do not welcome me! They are trying to chase me off! Good grief, Charlie Brown. >>>>>>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>>>>>> Severely exacerbated my CPTSD! I kept trying to kill myself because of it! I thought I had done something egregiously wrong. Whatever it was it had to be my fault. I was not feeling the love, even from myself. >>>>>>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>>>>>> :scream: >>>>>>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>>>>>> :scream: >>>>>>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>>>>>> In 2017, 900 units of insulin brought my blood glucose below 40. I almost succeeded that time. >>>>>>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>>>>>> :scream: >>>>>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>>>>> rww >>>>>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>>>>> On 10/1/20 8:55 PM, Robert Withers wrote: >>>>>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>>>>>> The worst sort of person is one who takes the credit for the work of >>>>>>>>>>>>>>>>>>>>>>>>>>> another. Wouldn't you agree? >>>>>>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>>>>>> You may wish to hear John's judgement on the matter. He was right there >>>>>>>>>>>>>>>>>>>>>>>>>>> when it was first built. >>>>>>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>>>>>> If you are not humble you will be humiliated, and brought low. >>>>>>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>>>>>> rww >>>>>>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>>>>>> On 10/1/20 8:35 PM, tim Rowledge wrote: >>>>>>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>>>>>>>> On 2020-10-01, at 4:57 PM, Robert Withers via Squeak-dev >>>>>>>>>>>>>>>>>>>>>>>>>>>>> [](mailto:squeak-dev at lists.squeakfoundation.org) >>>>>>>>>>>>>>>>>>>>>>>>>>>>> wrote: >>>>>>>>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>>>>>>>> I am curious. Who was the original author of the VMMaker Tool? >>>>>>>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>>>>>>> That would be me; back in exobox days. Written along with the original VMMaker and intended to be an example of clean, tidy, morphic usage. I've no idea if anyone ever uses it now, since running it via scripting has proven more valuable. >>>>>>>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>>>>>>> tim >>>>>>>>>>>>>>>>>>>>>>>>>>>> -- >>>>>>>>>>>>>>>>>>>>>>>>>>>> tim Rowledge; >>>>>>>>>>>>>>>>>>>>>>>>>>>> tim at rowledge.org >>>>>>>>>>>>>>>>>>>>>>>>>>>> ; >>>>>>>>>>>>>>>>>>>>>>>>>>>> http://www.rowledge.org/tim >>>>>>>>>>>>>>>>>>>>>>>>>>>> "Wibble" said Pooh the stress beginning to show. >>>>>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>>>>> -- >>>>>>>>>>>>>>>>>>>>>>>>>> K, r >>>>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>>>> -- >>>>>>>>>>>>>>>>>>>>>>>>> K, r >>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>> -- >>>>>>>>>>>>>>>>>>>>>>> K, r >>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>> -- >>>>>>>>>>>>>>>>>>>>>> K, r >>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>> -- >>>>>>>>>>>>>>>>>>>>> K, r >>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>> -- >>>>>>>>>>>>>>>>>>>> K, r >>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>> -- >>>>>>>>>>>>>>>>>> K, r >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> -- >>>>>>>>>>>>>>>>> K, r >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> -- >>>>>>>>>>>>>>>> K, r >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> -- >>>>>>>>>>>>>>> K, r >>>>>>>>>>>>>> >>>>>>>>>>>>>> -- >>>>>>>>>>>>>> K, r >>>>>>>>>>>>> >>>>>>>>>>>>> -- >>>>>>>>>>>>> K, r >>>>>>>>>>>> >>>>>>>>>>>> -- >>>>>>>>>>>> K, r >>>>>>>>>>> >>>>>>>>>>> -- >>>>>>>>>>> K, r >>>>>>>>>> >>>>>>>>>> -- >>>>>>>>>> K, r >>>>>>>>> >>>>>>>>> -- >>>>>>>>> K, r >>>>>>>> >>>>>>>> -- >>>>>>>> K, r >>>>>>> >>>>>>> -- >>>>>>> K, r >>>>>> >>>>>> -- >>>>>> K, r >>>>> >>>>> -- >>>>> K, r >>>> >>>> -- >>>> K, r >>> >>> -- >>> K, r >> >> -- >> K, r > > -- > K, r -- K, r -------------- next part -------------- An HTML attachment was scrubbed... URL: -------------- next part -------------- A non-text attachment was scrubbed... Name: 7420963_20200328125416581_1_LARGE.jpg Type: image/jpeg Size: 47844 bytes Desc: not available URL: -------------- next part -------------- A non-text attachment was scrubbed... Name: desolate.jpg Type: image/jpeg Size: 44831 bytes Desc: not available URL: From robert.withers at pm.me Fri Oct 2 08:30:37 2020 From: robert.withers at pm.me (Robert Withers) Date: Fri, 02 Oct 2020 08:30:37 +0000 Subject: [squeak-dev] Curious history In-Reply-To: <6e7b87b8-c266-42b0-f592-90db6271ae70@pm.me> References: <4RzffQkMYVDio5ypO3BdDDogbcHCBBrlCc1fxoT8GmqCUWhN0sU9yBdJfjTNNuM4-qL-oLkLcIB--mYjPkf0Lg==@protonmail.conversationid> <3f420e5a-88b4-2308-3796-1e00628dcdb4@pm.me> <6e7b87b8-c266-42b0-f592-90db6271ae70@pm.me> Message-ID: <02859f9d-3041-0eff-e4b2-92d5dc7c8760@pm.me> And more heavenly horns! WOOT! I bought a sailboat! Crew always welcome, hit me up. Da Truth: https://youtu.be/uuDX4muBneU Duh. On 10/2/20 4:22 AM, Robert Withers wrote: > Time for a little bit of heaven, blowing horns! > > https://youtu.be/fWzuBSiMkqg > > On 10/2/20 4:19 AM, Robert Withers wrote: > >> https://youtu.be/HglA72ogPCE >> >> On 10/2/20 4:14 AM, Robert Withers wrote: >> >>> https://youtu.be/fCP2-Bfhy04 >>> >>> On 10/2/20 4:05 AM, Robert Withers wrote: >>> >>>> https://youtu.be/fCP2-Bfhy04 >>>> >>>> On 10/2/20 4:00 AM, Robert Withers wrote: >>>> >>>>> https://youtu.be/0VLS-P9m0BM >>>>> >>>>> On 10/2/20 3:58 AM, Robert Withers wrote: >>>>> >>>>>> https://youtu.be/O3EW954g9r4 >>>>>> >>>>>> On 10/2/20 3:48 AM, Robert Withers wrote: >>>>>> >>>>>>> https://youtu.be/wqVsfGQ_1SU >>>>>>> >>>>>>> On 10/2/20 3:33 AM, Robert Withers wrote: >>>>>>> >>>>>>>> Alright, goddammit! Here is some more Truth, if you believe in my message. If you can handle it, it's Big. >>>>>>>> >>>>>>>> PROOF OF THE TRUTH OF THE PROPHESIES OF THE BIBLE! >>>>>>>> >>>>>>>> Hang on... >>>>>>>> >>>>>>>> On 10/2/20 3:24 AM, Robert Withers wrote: >>>>>>>> >>>>>>>>> https://youtu.be/3GLf-VT4wbY >>>>>>>>> >>>>>>>>> On 10/2/20 3:24 AM, Robert Withers wrote: >>>>>>>>> >>>>>>>>>> https://youtu.be/a-mAK3uB2_0 >>>>>>>>>> >>>>>>>>>> On 10/2/20 3:24 AM, Robert Withers wrote: >>>>>>>>>> >>>>>>>>>>> https://youtu.be/8c8_DEtMUOM >>>>>>>>>>> >>>>>>>>>>> On 10/2/20 3:23 AM, Robert Withers wrote: >>>>>>>>>>> >>>>>>>>>>>> https://youtu.be/q7p-ihYOG5s >>>>>>>>>>>> >>>>>>>>>>>> On 10/2/20 3:16 AM, Robert Withers wrote: >>>>>>>>>>>> >>>>>>>>>>>>> https://youtu.be/goeZZ4KFXTY >>>>>>>>>>>>> >>>>>>>>>>>>> On 10/2/20 3:07 AM, Robert Withers wrote: >>>>>>>>>>>>> >>>>>>>>>>>>>> I haven't heard from sparky, recently. Has anyone? >>>>>>>>>>>>>> >>>>>>>>>>>>>> On 10/2/20 3:03 AM, Robert Withers wrote: >>>>>>>>>>>>>> >>>>>>>>>>>>>>> Gotta meditate to this entire run! It's deep. >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> https://soundcloud.com/yusuke-mizushima/acid-jazz-mix-jazzual-suspects >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> On 10/2/20 2:50 AM, Robert Withers via Squeak-dev wrote: >>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> https://soundcloud.com/robert_withers/rasta >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> https://soundcloud.com/robert_withers/mando >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> On 10/2/20 2:39 AM, Robert Withers wrote: >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> Play a bit of these spicy beats! The music helps me to express what is on the inside. >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> https://youtu.be/3q8nGnls1Ow?t=2711 >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> On 10/2/20 2:26 AM, Robert Withers wrote: >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>> For I will restore health unto thee, and I will heal thee of thy wounds, saith the Lord; because they called thee an Outcast, saying, This is Zion, whom no man seeketh after. >>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>> Jeremiah 30:17 >>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>> On 10/2/20 2:22 AM, Robert Withers via Squeak-dev wrote: >>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>> Thank you for reaching out in this manner on these issues. Though be ye not concerned for my health, Ron, I am in a good place. The sobbing really helps a LOT! And I was brought to that tonight after screaming! And discussing a couple of my many suicide attempts. And realizing the effect my not finding a home with Squeak had affected me over 20 years. It hurts! I sob. All is well; God is Good. The Truth heals. All praise to the Most High! >>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>> Kindly, >>>>>>>>>>>>>>>>>>> Rob >>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>> On 10/2/20 2:16 AM, Ron Teitelbaum wrote: >>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>> Rob, >>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>> You have been in this place before. Is there someone you can talk to for help? Do you have a connection to someone that is working with you on your issues? Would you consider calling them now? >>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>> I've seen you here before. I've seen you doing much better. You should be good to yourself and get help now to move into calmer water and get on a more even keel. A better future includes protecting yourself, being nice to yourself, and making sure you get help when you need it. >>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>> Don't wait until later. I really recommend you do it now. >>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>> Ron >>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>> On Fri, Oct 2, 2020 at 1:50 AM Robert Withers wrote: >>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>> "And would not encourage the feeding of the indigent!" >>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>> On 10/2/20 12:21 AM, Robert Withers wrote: >>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>> The Hellfire and its occupants, not my problem. I pay no attention. Burn. >>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>> I "Will be in a life of bliss, In a Garden on high. The Fruits whereof"... >>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>> --------------------------------------------------------------- >>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>> Al Haqqah (69) >>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>>> [The Sure Reality! >>>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>>> What is the Sure Reality? >>>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>>> And what will make thee realise what the Sure Reality is? >>>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>>> The Thamud and the 'Ad People (branded) as false the Stunning Calamity! >>>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>>> But the Thamud,- they were destroyed by a terrible Storm of thunder and lightning! >>>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>>> And the 'Ad, they were destroyed by a furious Wind, exceedingly violent; >>>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>>> He made it rage against them seven nights and eight days in succession: so that thou couldst see the (whole) people lying prostrate in its (path), as they had been roots of hollow palm-trees tumbled down! >>>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>>> Then seest thou any of them left surviving? >>>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>>> And Pharaoh, and those before him, and the Cities Overthrown, committed habitual Sin. >>>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>>> And disobeyed (each) the messenger of their Lord; so He punished them with an abundant Penalty. >>>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>>> We, when the water (of Noah's Flood) overflowed beyond its limits, carried you (mankind), in the floating (Ark), >>>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>>> That We might make it a Message unto you, and that ears (that should hear the tale and) retain its memory should bear its (lessons) in remembrance. >>>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>>> Then, when one blast is sounded on the Trumpet, >>>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>>> And the earth is moved, and its mountains, and they are crushed to powder at one stroke,- >>>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>>> On that Day shall the (Great) Event come to pass. >>>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>>> And the sky will be rent asunder, for it will that Day be flimsy, >>>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>>> And the angels will be on its sides, and eight will, that Day, bear the Throne of thy Lord above them. >>>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>>> That Day shall ye be brought to Judgment: not an act of yours that ye hide will be hidden. >>>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>>> Then he that will be given his Record in his right hand will say: "Ah here! Read ye my Record! >>>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>>> "I did really understand that my Account would (One Day) reach me!" >>>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>>> And he will be in a life of Bliss, >>>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>>> In a Garden on high, >>>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>>> The Fruits whereof (will hang in bunches) low and near. >>>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>>> "Eat ye and drink ye, with full satisfaction; because of the (good) that ye sent before you, in the days that are gone!" >>>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>>> And he that will be given his Record in his left hand, will say: "Ah! Would that my Record had not been given to me! >>>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>>> "And that I had never realised how my account (stood)! >>>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>>> "Ah! Would that (Death) had made an end of me! >>>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>>> "Of no profit to me has been my wealth! >>>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>>> "My power has perished from me!"... >>>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>>> (The stern command will say): "Seize ye him, and bind ye him, >>>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>>> "And burn ye him in the Blazing Fire. >>>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>>> "Further, make him march in a chain, whereof the length is seventy cubits! >>>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>>> "This was he that would not believe in Allah Most High. >>>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>>> "And would not encourage the feeding of the indigent! >>>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>>> "So no friend hath he here this Day. >>>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>>> "Nor hath he any food except the corruption from the washing of wounds, >>>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>>> "Which none do eat but those in sin." >>>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>>> So I do call to witness what ye see, >>>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>>> And what ye see not, >>>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>>> That this is verily the word of an honoured messenger; >>>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>>> It is not the word of a poet: little it is ye believe! >>>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>>> Nor is it the word of a soothsayer: little admonition it is ye receive. >>>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>>> (This is) a Message sent down from the Lord of the Worlds. >>>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>>> And if the messenger were to invent any sayings in Our name, >>>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>>> We should certainly seize him by his right hand, >>>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>>> And We should certainly then cut off the artery of his heart: >>>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>>> Nor could any of you withhold him (from Our wrath). >>>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>>> But verily this is a Message for the Allah-fearing. >>>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>>> And We certainly know that there are amongst you those that reject (it). >>>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>>> But truly (Revelation) is a cause of sorrow for the Unbelievers. >>>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>>> But verily it is Truth of assured certainty. >>>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>>> So glorify the name of thy Lord Most High. >>>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>>> ] - Quran 69:1-52 >>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>> --- >>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>> Slosher >>>>>>>>>>>>>>>>>>>>>> Oriental, NC >>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>>> On 10/1/20 11:36 PM, Ron Teitelbaum wrote: >>>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>>>> Hi Rob, >>>>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>>>> I'm so sorry you felt that way. I know you have had major issues, you have said the same yourself. I'm always happy to see you come back even after long absences. You are a brilliant coder and it has been my distinct pleasure to work with you on Cryptography! Thank you for all you have done and indeed you are responsible for adding significant value to Squeak and the community. >>>>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>>>> We all work on code and it's easy to work your ass off on something to make it work and forget where it originated. We all contribute in large and small ways to everything. If you started VMMaker thank you! It is definitely something a lot of us use. I remember learning all about it a long long time ago before I realized that while I could understand it and I could use it, the people that work on the VM are a level higher than me. I just make apps! >>>>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>>>> I remember getting in an argument with Andreas about adding methods to collection. "WE DON"T NEED more methods in Collection we need to remove most of them and make it easier!" I argued with him about the value over and over but he insisted that they just didn't add enough value. I could have been put off. I could have assumed that Andreas didn't like me but I would have been very wrong! I was really honored to get the chance to work with him and we became great friends. Of course I added my methods to the code we were working on together and was so thrilled when he used my methods for his own code. >>>>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>>>> I don't know what happened with VMMaker but again thank you for your participation in it.. I wanted to take a minute to thank you for your work and to let you know it is my honor to work with you too! I hope that you can come to terms with your past and that you get the help you need for your CPTSD. >>>>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>>>> Everything is possible, the past is gone, but the future is still yours to shape. I wish the past was set in stone but even that moves and slips. I was talking to my wife about a party we attended: "Remember in 2000 we were at the party and counted down the new year and someone hit the breaker and killed the lights! We were all talking about what would happen in the year 2000, would everything break!" Great story except that I hadn't met my wife yet! The past is only what we remember but the future is something we have control over. Peace, calm, happyness, they are all hard to come by but they are possible. I wish you success in finding what makes your future better. >>>>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>>>> I'm sorry about the bad things that have happened to you in the past. As far as I'm concerned, you are welcomed here! >>>>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>>>> All the best, >>>>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>>>> Ron Teitelbaum >>>>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>>>> On Thu, Oct 1, 2020 at 10:38 PM Robert Withers via Squeak-dev wrote: >>>>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>>>>> :sob::sob::sob: >>>>>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>>>>> On 10/1/20 10:34 PM, Robert Withers wrote: >>>>>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>>>>>> I wrote to the #general Squeak Slack channel: >>>>>>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>>>>>>> What a complete larcenous bastard. 20 years ago, this month, published it as his own work. And been against me ever since. My CPTSD (100% veteran service-connected) comes with an exquisitely sensitive deception meter. There are those who shunned me and ostracized me and made me feel MOST UNWELCOME. For 20 years. My delusions kick in and I start suspecting back channel communications against me. My love for Squeak conflicted with what I knew was happening. but I hung in there and worked on Cryptography, work with a group of great people and that I am satisfied with its added value to Squeak. For 20 years I KNEW people were against me in the community. I cannot describe how negatively this affected me. My third suicide attempt, in 2007 I jumped off the roof of a 6 story apartment building and broke my back along with many bones. God did not want me to die, yet, so I lived. This deception and ostracism is most well highlighted by the taking credit for my work, without attribution. He is a complete tool. SHAME! >>>>>>>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>>>>>>> I do not know the degree to which he spoke against me. Iimagineit was ever since 2000. Delusions! What is real? I knew not. So much torment! AGONY! They do not welcome me! They are trying to chase me off! Good grief, Charlie Brown. >>>>>>>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>>>>>>> Severely exacerbated my CPTSD! I kept trying to kill myself because of it! I thought I had done something egregiously wrong. Whatever it was it had to be my fault. I was not feeling the love, even from myself. >>>>>>>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>>>>>>> :scream: >>>>>>>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>>>>>>> :scream: >>>>>>>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>>>>>>> In 2017, 900 units of insulin brought my blood glucose below 40. I almost succeeded that time. >>>>>>>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>>>>>>> :scream: >>>>>>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>>>>>> rww >>>>>>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>>>>>> On 10/1/20 8:55 PM, Robert Withers wrote: >>>>>>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>>>>>>> The worst sort of person is one who takes the credit for the work of >>>>>>>>>>>>>>>>>>>>>>>>>>>> another. Wouldn't you agree? >>>>>>>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>>>>>>> You may wish to hear John's judgement on the matter. He was right there >>>>>>>>>>>>>>>>>>>>>>>>>>>> when it was first built. >>>>>>>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>>>>>>> If you are not humble you will be humiliated, and brought low. >>>>>>>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>>>>>>> rww >>>>>>>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>>>>>>> On 10/1/20 8:35 PM, tim Rowledge wrote: >>>>>>>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>>>>>>>>> On 2020-10-01, at 4:57 PM, Robert Withers via Squeak-dev >>>>>>>>>>>>>>>>>>>>>>>>>>>>>> [](mailto:squeak-dev at lists.squeakfoundation.org) >>>>>>>>>>>>>>>>>>>>>>>>>>>>>> wrote: >>>>>>>>>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>>>>>>>>> I am curious. Who was the original author of the VMMaker Tool? >>>>>>>>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>>>>>>>> That would be me; back in exobox days. Written along with the original VMMaker and intended to be an example of clean, tidy, morphic usage. I've no idea if anyone ever uses it now, since running it via scripting has proven more valuable. >>>>>>>>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>>>>>>>> tim >>>>>>>>>>>>>>>>>>>>>>>>>>>>> -- >>>>>>>>>>>>>>>>>>>>>>>>>>>>> tim Rowledge; >>>>>>>>>>>>>>>>>>>>>>>>>>>>> tim at rowledge.org >>>>>>>>>>>>>>>>>>>>>>>>>>>>> ; >>>>>>>>>>>>>>>>>>>>>>>>>>>>> http://www.rowledge.org/tim >>>>>>>>>>>>>>>>>>>>>>>>>>>>> "Wibble" said Pooh the stress beginning to show. >>>>>>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>>>>>> -- >>>>>>>>>>>>>>>>>>>>>>>>>>> K, r >>>>>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>>>>> -- >>>>>>>>>>>>>>>>>>>>>>>>>> K, r >>>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>>> -- >>>>>>>>>>>>>>>>>>>>>>>> K, r >>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>> -- >>>>>>>>>>>>>>>>>>>>>>> K, r >>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>> -- >>>>>>>>>>>>>>>>>>>>>> K, r >>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>> -- >>>>>>>>>>>>>>>>>>>>> K, r >>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>> -- >>>>>>>>>>>>>>>>>>> K, r >>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>> -- >>>>>>>>>>>>>>>>>> K, r >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> -- >>>>>>>>>>>>>>>>> K, r >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> -- >>>>>>>>>>>>>>>> K, r >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> -- >>>>>>>>>>>>>>> K, r >>>>>>>>>>>>>> >>>>>>>>>>>>>> -- >>>>>>>>>>>>>> K, r >>>>>>>>>>>>> >>>>>>>>>>>>> -- >>>>>>>>>>>>> K, r >>>>>>>>>>>> >>>>>>>>>>>> -- >>>>>>>>>>>> K, r >>>>>>>>>>> >>>>>>>>>>> -- >>>>>>>>>>> K, r >>>>>>>>>> >>>>>>>>>> -- >>>>>>>>>> K, r >>>>>>>>> >>>>>>>>> -- >>>>>>>>> K, r >>>>>>>> >>>>>>>> -- >>>>>>>> K, r >>>>>>> >>>>>>> -- >>>>>>> K, r >>>>>> >>>>>> -- >>>>>> K, r >>>>> >>>>> -- >>>>> K, r >>>> >>>> -- >>>> K, r >>> >>> -- >>> K, r >> >> -- >> K, r > > -- > K, r -- K, r -------------- next part -------------- An HTML attachment was scrubbed... URL: -------------- next part -------------- A non-text attachment was scrubbed... Name: 7420963_20200328125416581_1_LARGE.jpg Type: image/jpeg Size: 47844 bytes Desc: not available URL: -------------- next part -------------- A non-text attachment was scrubbed... Name: desolate.jpg Type: image/jpeg Size: 44831 bytes Desc: not available URL: -------------- next part -------------- A non-text attachment was scrubbed... Name: 666.jpg Type: image/jpeg Size: 27219 bytes Desc: not available URL: -------------- next part -------------- A non-text attachment was scrubbed... Name: 7420963_20200328125426143_1_LARGE.jpg Type: image/jpeg Size: 19954 bytes Desc: not available URL: From robert.withers at pm.me Fri Oct 2 08:59:56 2020 From: robert.withers at pm.me (Robert Withers) Date: Fri, 02 Oct 2020 08:59:56 +0000 Subject: [squeak-dev] Curious history In-Reply-To: <02859f9d-3041-0eff-e4b2-92d5dc7c8760@pm.me> References: <3f420e5a-88b4-2308-3796-1e00628dcdb4@pm.me> <6e7b87b8-c266-42b0-f592-90db6271ae70@pm.me> <02859f9d-3041-0eff-e4b2-92d5dc7c8760@pm.me> Message-ID: <53280f41-b727-a6b9-22aa-289bd26f16e0@pm.me> Raja Yoga: https://soundcloud.com/robert_withers/rajayoga-preface On 10/2/20 4:30 AM, Robert Withers wrote: > And more heavenly horns! WOOT! I bought a sailboat! Crew always welcome, hit me up. > > Da Truth: https://youtu.be/uuDX4muBneU > > Duh. > > On 10/2/20 4:22 AM, Robert Withers wrote: > >> Time for a little bit of heaven, blowing horns! >> >> https://youtu.be/fWzuBSiMkqg >> >> On 10/2/20 4:19 AM, Robert Withers wrote: >> >>> https://youtu.be/HglA72ogPCE >>> >>> On 10/2/20 4:14 AM, Robert Withers wrote: >>> >>>> https://youtu.be/fCP2-Bfhy04 >>>> >>>> On 10/2/20 4:05 AM, Robert Withers wrote: >>>> >>>>> https://youtu.be/fCP2-Bfhy04 >>>>> >>>>> On 10/2/20 4:00 AM, Robert Withers wrote: >>>>> >>>>>> https://youtu.be/0VLS-P9m0BM >>>>>> >>>>>> On 10/2/20 3:58 AM, Robert Withers wrote: >>>>>> >>>>>>> https://youtu.be/O3EW954g9r4 >>>>>>> >>>>>>> On 10/2/20 3:48 AM, Robert Withers wrote: >>>>>>> >>>>>>>> https://youtu.be/wqVsfGQ_1SU >>>>>>>> >>>>>>>> On 10/2/20 3:33 AM, Robert Withers wrote: >>>>>>>> >>>>>>>>> Alright, goddammit! Here is some more Truth, if you believe in my message. If you can handle it, it's Big. >>>>>>>>> >>>>>>>>> PROOF OF THE TRUTH OF THE PROPHESIES OF THE BIBLE! >>>>>>>>> >>>>>>>>> Hang on... >>>>>>>>> >>>>>>>>> On 10/2/20 3:24 AM, Robert Withers wrote: >>>>>>>>> >>>>>>>>>> https://youtu.be/3GLf-VT4wbY >>>>>>>>>> >>>>>>>>>> On 10/2/20 3:24 AM, Robert Withers wrote: >>>>>>>>>> >>>>>>>>>>> https://youtu.be/a-mAK3uB2_0 >>>>>>>>>>> >>>>>>>>>>> On 10/2/20 3:24 AM, Robert Withers wrote: >>>>>>>>>>> >>>>>>>>>>>> https://youtu.be/8c8_DEtMUOM >>>>>>>>>>>> >>>>>>>>>>>> On 10/2/20 3:23 AM, Robert Withers wrote: >>>>>>>>>>>> >>>>>>>>>>>>> https://youtu.be/q7p-ihYOG5s >>>>>>>>>>>>> >>>>>>>>>>>>> On 10/2/20 3:16 AM, Robert Withers wrote: >>>>>>>>>>>>> >>>>>>>>>>>>>> https://youtu.be/goeZZ4KFXTY >>>>>>>>>>>>>> >>>>>>>>>>>>>> On 10/2/20 3:07 AM, Robert Withers wrote: >>>>>>>>>>>>>> >>>>>>>>>>>>>>> I haven't heard from sparky, recently. Has anyone? >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> On 10/2/20 3:03 AM, Robert Withers wrote: >>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> Gotta meditate to this entire run! It's deep. >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> https://soundcloud.com/yusuke-mizushima/acid-jazz-mix-jazzual-suspects >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> On 10/2/20 2:50 AM, Robert Withers via Squeak-dev wrote: >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> https://soundcloud.com/robert_withers/rasta >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> https://soundcloud.com/robert_withers/mando >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> On 10/2/20 2:39 AM, Robert Withers wrote: >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>> Play a bit of these spicy beats! The music helps me to express what is on the inside. >>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>> https://youtu.be/3q8nGnls1Ow?t=2711 >>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>> On 10/2/20 2:26 AM, Robert Withers wrote: >>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>> For I will restore health unto thee, and I will heal thee of thy wounds, saith the Lord; because they called thee an Outcast, saying, This is Zion, whom no man seeketh after. >>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>> Jeremiah 30:17 >>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>> On 10/2/20 2:22 AM, Robert Withers via Squeak-dev wrote: >>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>> Thank you for reaching out in this manner on these issues. Though be ye not concerned for my health, Ron, I am in a good place. The sobbing really helps a LOT! And I was brought to that tonight after screaming! And discussing a couple of my many suicide attempts. And realizing the effect my not finding a home with Squeak had affected me over 20 years. It hurts! I sob. All is well; God is Good. The Truth heals. All praise to the Most High! >>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>> Kindly, >>>>>>>>>>>>>>>>>>>> Rob >>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>> On 10/2/20 2:16 AM, Ron Teitelbaum wrote: >>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>> Rob, >>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>> You have been in this place before. Is there someone you can talk to for help? Do you have a connection to someone that is working with you on your issues? Would you consider calling them now? >>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>> I've seen you here before. I've seen you doing much better. You should be good to yourself and get help now to move into calmer water and get on a more even keel. A better future includes protecting yourself, being nice to yourself, and making sure you get help when you need it. >>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>> Don't wait until later. I really recommend you do it now. >>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>> Ron >>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>> On Fri, Oct 2, 2020 at 1:50 AM Robert Withers wrote: >>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>> "And would not encourage the feeding of the indigent!" >>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>> On 10/2/20 12:21 AM, Robert Withers wrote: >>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>> The Hellfire and its occupants, not my problem. I pay no attention. Burn. >>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>> I "Will be in a life of bliss, In a Garden on high. The Fruits whereof"... >>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>> --------------------------------------------------------------- >>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>> Al Haqqah (69) >>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>>>> [The Sure Reality! >>>>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>>>> What is the Sure Reality? >>>>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>>>> And what will make thee realise what the Sure Reality is? >>>>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>>>> The Thamud and the 'Ad People (branded) as false the Stunning Calamity! >>>>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>>>> But the Thamud,- they were destroyed by a terrible Storm of thunder and lightning! >>>>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>>>> And the 'Ad, they were destroyed by a furious Wind, exceedingly violent; >>>>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>>>> He made it rage against them seven nights and eight days in succession: so that thou couldst see the (whole) people lying prostrate in its (path), as they had been roots of hollow palm-trees tumbled down! >>>>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>>>> Then seest thou any of them left surviving? >>>>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>>>> And Pharaoh, and those before him, and the Cities Overthrown, committed habitual Sin. >>>>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>>>> And disobeyed (each) the messenger of their Lord; so He punished them with an abundant Penalty. >>>>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>>>> We, when the water (of Noah's Flood) overflowed beyond its limits, carried you (mankind), in the floating (Ark), >>>>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>>>> That We might make it a Message unto you, and that ears (that should hear the tale and) retain its memory should bear its (lessons) in remembrance. >>>>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>>>> Then, when one blast is sounded on the Trumpet, >>>>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>>>> And the earth is moved, and its mountains, and they are crushed to powder at one stroke,- >>>>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>>>> On that Day shall the (Great) Event come to pass. >>>>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>>>> And the sky will be rent asunder, for it will that Day be flimsy, >>>>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>>>> And the angels will be on its sides, and eight will, that Day, bear the Throne of thy Lord above them. >>>>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>>>> That Day shall ye be brought to Judgment: not an act of yours that ye hide will be hidden. >>>>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>>>> Then he that will be given his Record in his right hand will say: "Ah here! Read ye my Record! >>>>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>>>> "I did really understand that my Account would (One Day) reach me!" >>>>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>>>> And he will be in a life of Bliss, >>>>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>>>> In a Garden on high, >>>>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>>>> The Fruits whereof (will hang in bunches) low and near. >>>>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>>>> "Eat ye and drink ye, with full satisfaction; because of the (good) that ye sent before you, in the days that are gone!" >>>>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>>>> And he that will be given his Record in his left hand, will say: "Ah! Would that my Record had not been given to me! >>>>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>>>> "And that I had never realised how my account (stood)! >>>>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>>>> "Ah! Would that (Death) had made an end of me! >>>>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>>>> "Of no profit to me has been my wealth! >>>>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>>>> "My power has perished from me!"... >>>>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>>>> (The stern command will say): "Seize ye him, and bind ye him, >>>>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>>>> "And burn ye him in the Blazing Fire. >>>>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>>>> "Further, make him march in a chain, whereof the length is seventy cubits! >>>>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>>>> "This was he that would not believe in Allah Most High. >>>>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>>>> "And would not encourage the feeding of the indigent! >>>>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>>>> "So no friend hath he here this Day. >>>>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>>>> "Nor hath he any food except the corruption from the washing of wounds, >>>>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>>>> "Which none do eat but those in sin." >>>>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>>>> So I do call to witness what ye see, >>>>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>>>> And what ye see not, >>>>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>>>> That this is verily the word of an honoured messenger; >>>>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>>>> It is not the word of a poet: little it is ye believe! >>>>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>>>> Nor is it the word of a soothsayer: little admonition it is ye receive. >>>>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>>>> (This is) a Message sent down from the Lord of the Worlds. >>>>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>>>> And if the messenger were to invent any sayings in Our name, >>>>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>>>> We should certainly seize him by his right hand, >>>>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>>>> And We should certainly then cut off the artery of his heart: >>>>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>>>> Nor could any of you withhold him (from Our wrath). >>>>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>>>> But verily this is a Message for the Allah-fearing. >>>>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>>>> And We certainly know that there are amongst you those that reject (it). >>>>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>>>> But truly (Revelation) is a cause of sorrow for the Unbelievers. >>>>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>>>> But verily it is Truth of assured certainty. >>>>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>>>> So glorify the name of thy Lord Most High. >>>>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>>>> ] - Quran 69:1-52 >>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>> --- >>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>> Slosher >>>>>>>>>>>>>>>>>>>>>>> Oriental, NC >>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>>>> On 10/1/20 11:36 PM, Ron Teitelbaum wrote: >>>>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>>>>> Hi Rob, >>>>>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>>>>> I'm so sorry you felt that way. I know you have had major issues, you have said the same yourself. I'm always happy to see you come back even after long absences. You are a brilliant coder and it has been my distinct pleasure to work with you on Cryptography! Thank you for all you have done and indeed you are responsible for adding significant value to Squeak and the community. >>>>>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>>>>> We all work on code and it's easy to work your ass off on something to make it work and forget where it originated. We all contribute in large and small ways to everything. If you started VMMaker thank you! It is definitely something a lot of us use. I remember learning all about it a long long time ago before I realized that while I could understand it and I could use it, the people that work on the VM are a level higher than me. I just make apps! >>>>>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>>>>> I remember getting in an argument with Andreas about adding methods to collection. "WE DON"T NEED more methods in Collection we need to remove most of them and make it easier!" I argued with him about the value over and over but he insisted that they just didn't add enough value. I could have been put off. I could have assumed that Andreas didn't like me but I would have been very wrong! I was really honored to get the chance to work with him and we became great friends. Of course I added my methods to the code we were working on together and was so thrilled when he used my methods for his own code. >>>>>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>>>>> I don't know what happened with VMMaker but again thank you for your participation in it.. I wanted to take a minute to thank you for your work and to let you know it is my honor to work with you too! I hope that you can come to terms with your past and that you get the help you need for your CPTSD. >>>>>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>>>>> Everything is possible, the past is gone, but the future is still yours to shape. I wish the past was set in stone but even that moves and slips. I was talking to my wife about a party we attended: "Remember in 2000 we were at the party and counted down the new year and someone hit the breaker and killed the lights! We were all talking about what would happen in the year 2000, would everything break!" Great story except that I hadn't met my wife yet! The past is only what we remember but the future is something we have control over. Peace, calm, happyness, they are all hard to come by but they are possible. I wish you success in finding what makes your future better. >>>>>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>>>>> I'm sorry about the bad things that have happened to you in the past. As far as I'm concerned, you are welcomed here! >>>>>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>>>>> All the best, >>>>>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>>>>> Ron Teitelbaum >>>>>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>>>>> On Thu, Oct 1, 2020 at 10:38 PM Robert Withers via Squeak-dev wrote: >>>>>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>>>>>> :sob::sob::sob: >>>>>>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>>>>>> On 10/1/20 10:34 PM, Robert Withers wrote: >>>>>>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>>>>>>> I wrote to the #general Squeak Slack channel: >>>>>>>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>>>>>>>> What a complete larcenous bastard. 20 years ago, this month, published it as his own work. And been against me ever since. My CPTSD (100% veteran service-connected) comes with an exquisitely sensitive deception meter. There are those who shunned me and ostracized me and made me feel MOST UNWELCOME. For 20 years. My delusions kick in and I start suspecting back channel communications against me. My love for Squeak conflicted with what I knew was happening. but I hung in there and worked on Cryptography, work with a group of great people and that I am satisfied with its added value to Squeak. For 20 years I KNEW people were against me in the community. I cannot describe how negatively this affected me. My third suicide attempt, in 2007 I jumped off the roof of a 6 story apartment building and broke my back along with many bones. God did not want me to die, yet, so I lived. This deception and ostracism is most well highlighted by the taking credit for my work, without attribution. He is a complete tool. SHAME! >>>>>>>>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>>>>>>>> I do not know the degree to which he spoke against me. Iimagineit was ever since 2000. Delusions! What is real? I knew not. So much torment! AGONY! They do not welcome me! They are trying to chase me off! Good grief, Charlie Brown. >>>>>>>>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>>>>>>>> Severely exacerbated my CPTSD! I kept trying to kill myself because of it! I thought I had done something egregiously wrong. Whatever it was it had to be my fault. I was not feeling the love, even from myself. >>>>>>>>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>>>>>>>> :scream: >>>>>>>>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>>>>>>>> :scream: >>>>>>>>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>>>>>>>> In 2017, 900 units of insulin brought my blood glucose below 40. I almost succeeded that time. >>>>>>>>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>>>>>>>> :scream: >>>>>>>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>>>>>>> rww >>>>>>>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>>>>>>> On 10/1/20 8:55 PM, Robert Withers wrote: >>>>>>>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>>>>>>>> The worst sort of person is one who takes the credit for the work of >>>>>>>>>>>>>>>>>>>>>>>>>>>>> another. Wouldn't you agree? >>>>>>>>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>>>>>>>> You may wish to hear John's judgement on the matter. He was right there >>>>>>>>>>>>>>>>>>>>>>>>>>>>> when it was first built. >>>>>>>>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>>>>>>>> If you are not humble you will be humiliated, and brought low. >>>>>>>>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>>>>>>>> rww >>>>>>>>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>>>>>>>> On 10/1/20 8:35 PM, tim Rowledge wrote: >>>>>>>>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> On 2020-10-01, at 4:57 PM, Robert Withers via Squeak-dev >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> [](mailto:squeak-dev at lists.squeakfoundation.org) >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> wrote: >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> I am curious. Who was the original author of the VMMaker Tool? >>>>>>>>>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>>>>>>>>> That would be me; back in exobox days. Written along with the original VMMaker and intended to be an example of clean, tidy, morphic usage. I've no idea if anyone ever uses it now, since running it via scripting has proven more valuable. >>>>>>>>>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>>>>>>>>> tim >>>>>>>>>>>>>>>>>>>>>>>>>>>>>> -- >>>>>>>>>>>>>>>>>>>>>>>>>>>>>> tim Rowledge; >>>>>>>>>>>>>>>>>>>>>>>>>>>>>> tim at rowledge.org >>>>>>>>>>>>>>>>>>>>>>>>>>>>>> ; >>>>>>>>>>>>>>>>>>>>>>>>>>>>>> http://www.rowledge.org/tim >>>>>>>>>>>>>>>>>>>>>>>>>>>>>> "Wibble" said Pooh the stress beginning to show. >>>>>>>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>>>>>>> -- >>>>>>>>>>>>>>>>>>>>>>>>>>>> K, r >>>>>>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>>>>>> -- >>>>>>>>>>>>>>>>>>>>>>>>>>> K, r >>>>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>>>> -- >>>>>>>>>>>>>>>>>>>>>>>>> K, r >>>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>>> -- >>>>>>>>>>>>>>>>>>>>>>>> K, r >>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>> -- >>>>>>>>>>>>>>>>>>>>>>> K, r >>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>> -- >>>>>>>>>>>>>>>>>>>>>> K, r >>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>> -- >>>>>>>>>>>>>>>>>>>> K, r >>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>> -- >>>>>>>>>>>>>>>>>>> K, r >>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>> -- >>>>>>>>>>>>>>>>>> K, r >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> -- >>>>>>>>>>>>>>>>> K, r >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> -- >>>>>>>>>>>>>>>> K, r >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> -- >>>>>>>>>>>>>>> K, r >>>>>>>>>>>>>> >>>>>>>>>>>>>> -- >>>>>>>>>>>>>> K, r >>>>>>>>>>>>> >>>>>>>>>>>>> -- >>>>>>>>>>>>> K, r >>>>>>>>>>>> >>>>>>>>>>>> -- >>>>>>>>>>>> K, r >>>>>>>>>>> >>>>>>>>>>> -- >>>>>>>>>>> K, r >>>>>>>>>> >>>>>>>>>> -- >>>>>>>>>> K, r >>>>>>>>> >>>>>>>>> -- >>>>>>>>> K, r >>>>>>>> >>>>>>>> -- >>>>>>>> K, r >>>>>>> >>>>>>> -- >>>>>>> K, r >>>>>> >>>>>> -- >>>>>> K, r >>>>> >>>>> -- >>>>> K, r >>>> >>>> -- >>>> K, r >>> >>> -- >>> K, r >> >> -- >> K, r > > -- > K, r -- K, r -------------- next part -------------- An HTML attachment was scrubbed... URL: -------------- next part -------------- A non-text attachment was scrubbed... Name: 7420963_20200328125416581_1_LARGE.jpg Type: image/jpeg Size: 47844 bytes Desc: not available URL: -------------- next part -------------- A non-text attachment was scrubbed... Name: desolate.jpg Type: image/jpeg Size: 44831 bytes Desc: not available URL: -------------- next part -------------- A non-text attachment was scrubbed... Name: 666.jpg Type: image/jpeg Size: 27219 bytes Desc: not available URL: -------------- next part -------------- A non-text attachment was scrubbed... Name: 7420963_20200328125426143_1_LARGE.jpg Type: image/jpeg Size: 19954 bytes Desc: not available URL: From robert.withers at pm.me Fri Oct 2 11:29:04 2020 From: robert.withers at pm.me (Robert Withers) Date: Fri, 02 Oct 2020 11:29:04 +0000 Subject: [squeak-dev] Curious history In-Reply-To: References: <190b8468-cfe2-fafc-4a72-de45f5927a8c@pm.me> <70921f42-0788-53b4-6c78-e0b76a651408@pm.me> <4RzffQkMYVDio5ypO3BdDDogbcHCBBrlCc1fxoT8GmqCUWhN0sU9yBdJfjTNNuM4-qL-oLkLcIB--mYjPkf0Lg==@protonmail.conversationid> <877lUkLJfpLi1si68jBg1GdbHUPpNB5NhFo1QUUdR1B3G5XWCcIKgtbRJ9r-nBoAYlzIl-mApKW07rQFHukdoA==@protonmail.internalid> Message-ID: <573bf724-841a-198f-a881-d21aa6f1933d@pm.me> Ron, So you remember? I was seemly in a state of some shock, my responses were not robust, as they would be. I interviewed in a wooden manner. I was on guard and not at all relaxed. My eyes may have been glassy, though not from any drug. I was easily startled. All of my behavior mentioned above is due to what is known in my circles as amygdala hijacking. That super sensitive deception meter, I mentioned before? It was pegging the needle. I WAS UNDER PROXIMATE THREAT! ALARM! ALARM! ALARM! Where is the threat? I do not know! Hindsight is crystal. I have enjoyed having worked with you and on this beautiful environment we all hold dear. I wish y'all to be best blessed, be happy & healthy. Oh yes! Here is what's up with the coronavirus pandemic! K, r On 10/1/20 11:48 PM, Robert Withers wrote: > Do you recall my interviewing with Andreas? I did NOT NOT NOT NADA ZILCH NOTHING TO SEE HERE ZERO TIME FOR YOU get that job, for whatever reason... > > On 10/1/20 11:46 PM, Robert Withers wrote: > >> Hi Ron, >> >> Thank you so much for the kind words and the extension of your hand towards myself. In no fashion has it been all bad. I really need to tell you, right now, that I did not do any work on VMMaker. Was there extensions to same from the VMMakerTool? Perhaps, I do not recall. I only built the Tool, not the Maker. Good grief, I agree, that's a whole other level! >> >> I feel the same about the opportunities I had with you. I am still dorking with ASN1, currently broken, trying to add a "Class" Application Class tag. Missing an explicit context in on of the directions. Memory and Trauma are definitely linked. That's where the flashbacks come from. Do you recall my interviewing with Andreas? I did NOT NOT NOT NADA ZILCH NOTHING TO SEE HERE get that job, for whatever reason... >> >> I think I may be done. PromisesLocal is broken. ParrotTalk is broken. ASN1 is broken. SSL is broken. PromisesRemote is broken. Sigh. Fuck it. Someone else will have to pick it up. 20 years of work! I am hitting deep blue ocean, on my way to Morocco, by way of the Azores! With my shiny Zeus 3! Ciao, bella! >> >> On 10/1/20 11:36 PM, Ron Teitelbaum wrote: >> >>> Hi Rob, >>> >>> I'm so sorry you felt that way. I know you have had major issues, you have said the same yourself. I'm always happy to see you come back even after long absences. You are a brilliant coder and it has been my distinct pleasure to work with you on Cryptography! Thank you for all you have done and indeed you are responsible for adding significant value to Squeak and the community. >>> >>> We all work on code and it's easy to work your ass off on something to make it work and forget where it originated. We all contribute in large and small ways to everything. If you started VMMaker thank you! It is definitely something a lot of us use. I remember learning all about it a long long time ago before I realized that while I could understand it and I could use it, the people that work on the VM are a level higher than me. I just make apps! >>> >>> I remember getting in an argument with Andreas about adding methods to collection. "WE DON"T NEED more methods in Collection we need to remove most of them and make it easier!" I argued with him about the value over and over but he insisted that they just didn't add enough value. I could have been put off. I could have assumed that Andreas didn't like me but I would have been very wrong! I was really honored to get the chance to work with him and we became great friends. Of course I added my methods to the code we were working on together and was so thrilled when he used my methods for his own code. >>> >>> I don't know what happened with VMMaker but again thank you for your participation in it.. I wanted to take a minute to thank you for your work and to let you know it is my honor to work with you too! I hope that you can come to terms with your past and that you get the help you need for your CPTSD. >>> >>> Everything is possible, the past is gone, but the future is still yours to shape. I wish the past was set in stone but even that moves and slips. I was talking to my wife about a party we attended: "Remember in 2000 we were at the party and counted down the new year and someone hit the breaker and killed the lights! We were all talking about what would happen in the year 2000, would everything break!" Great story except that I hadn't met my wife yet! The past is only what we remember but the future is something we have control over. Peace, calm, happyness, they are all hard to come by but they are possible. I wish you success in finding what makes your future better. >>> >>> I'm sorry about the bad things that have happened to you in the past. As far as I'm concerned, you are welcomed here! >>> >>> All the best, >>> >>> Ron Teitelbaum >>> >>> On Thu, Oct 1, 2020 at 10:38 PM Robert Withers via Squeak-dev wrote: >>> >>>> :sob::sob::sob: >>>> >>>> On 10/1/20 10:34 PM, Robert Withers wrote: >>>> >>>>> I wrote to the #general Squeak Slack channel: >>>>> >>>>>> What a complete larcenous bastard. 20 years ago, this month, published it as his own work. And been against me ever since. My CPTSD (100% veteran service-connected) comes with an exquisitely sensitive deception meter. There are those who shunned me and ostracized me and made me feel MOST UNWELCOME. For 20 years. My delusions kick in and I start suspecting back channel communications against me. My love for Squeak conflicted with what I knew was happening. but I hung in there and worked on Cryptography, work with a group of great people and that I am satisfied with its added value to Squeak. For 20 years I KNEW people were against me in the community. I cannot describe how negatively this affected me. My third suicide attempt, in 2007 I jumped off the roof of a 6 story apartment building and broke my back along with many bones. God did not want me to die, yet, so I lived. This deception and ostracism is most well highlighted by the taking credit for my work, without attribution. He is a complete tool. SHAME! >>>>>> >>>>>> I do not know the degree to which he spoke against me. Iimagineit was ever since 2000. Delusions! What is real? I knew not. So much torment! AGONY! They do not welcome me! They are trying to chase me off! Good grief, Charlie Brown. >>>>>> >>>>>> Severely exacerbated my CPTSD! I kept trying to kill myself because of it! I thought I had done something egregiously wrong. Whatever it was it had to be my fault. I was not feeling the love, even from myself. >>>>>> >>>>>> :scream: >>>>>> >>>>>> :scream: >>>>>> >>>>>> In 2017, 900 units of insulin brought my blood glucose below 40. I almost succeeded that time. >>>>>> >>>>>> :scream: >>>>> >>>>> rww >>>>> >>>>> On 10/1/20 8:55 PM, Robert Withers wrote: >>>>> >>>>>> The worst sort of person is one who takes the credit for the work of >>>>>> another. Wouldn't you agree? >>>>>> >>>>>> You may wish to hear John's judgement on the matter. He was right there >>>>>> when it was first built. >>>>>> >>>>>> If you are not humble you will be humiliated, and brought low. >>>>>> >>>>>> rww >>>>>> >>>>>> On 10/1/20 8:35 PM, tim Rowledge wrote: >>>>>> >>>>>>>> On 2020-10-01, at 4:57 PM, Robert Withers via Squeak-dev >>>>>>>> [](mailto:squeak-dev at lists.squeakfoundation.org) >>>>>>>> wrote: >>>>>>>> >>>>>>>> I am curious. Who was the original author of the VMMaker Tool? >>>>>>> >>>>>>> That would be me; back in exobox days. Written along with the original VMMaker and intended to be an example of clean, tidy, morphic usage. I've no idea if anyone ever uses it now, since running it via scripting has proven more valuable. >>>>>>> >>>>>>> tim >>>>>>> -- >>>>>>> tim Rowledge; >>>>>>> tim at rowledge.org >>>>>>> ; >>>>>>> http://www.rowledge.org/tim >>>>>>> "Wibble" said Pooh the stress beginning to show. >>>>> >>>>> -- >>>>> K, r >>>> >>>> -- >>>> K, r >> >> -- >> K, r > > -- > K, r -- K, r -------------- next part -------------- An HTML attachment was scrubbed... URL: -------------- next part -------------- A non-text attachment was scrubbed... Name: 7420963_20200328125416581_1_LARGE.jpg Type: image/jpeg Size: 47844 bytes Desc: not available URL: -------------- next part -------------- A non-text attachment was scrubbed... Name: thumb_bad-news-from-the-bible-judgement-thus-will-i-make-11594097.png Type: image/png Size: 20894 bytes Desc: not available URL: From eliot.miranda at gmail.com Fri Oct 2 13:53:03 2020 From: eliot.miranda at gmail.com (Eliot Miranda) Date: Fri, 2 Oct 2020 06:53:03 -0700 Subject: [squeak-dev] The Inbox: Tools-ct.991.mcz In-Reply-To: References: Message-ID: > On Oct 1, 2020, at 11:37 PM, Marcel Taeumel wrote: > >  > Hi Christoph, > > > .. and they are still isolated from the discussion on the mailing list ... :-) > > That may be right. Still, the biggest effort lies in the code review itself. It's really easy to look up such a discussion if needed. Sure, you need to re-type that version number into the search function on forum.world.st ... still ... not that hard. ;-) > > You might think that an inbox commit is often not merged because of an open question on the list. Well, I think that's rarely the case. It's typically just time and people. ;-) No need to throw in even more tools into the ring. +1. And we’re having wide ranging discussions on a number of topics here on the list right now. No one is vying for our attention. No specific workflow or intent constrains the discussion. We’re free to fork threads to discuss tangents. And we have an archive to ease searching and provide a record. I agree that the bug tracking part of GitHub is compelling and we could use it more. But there is a real danger in embracing GitHub fully, as shown by Pharo. But I don’t want to spend breath on that right now. I will say that the VisualWorks team had a great experience designing its own excellent Action Request System. When I arrived in ‘95 there was a mature system implemented over email that had states (open, in progress, rejected, reviewed, on deck, etc). The key point was that the system had been designed to support the VW team at ParcPlace and was key in achieving high quality. IIRC, two engineers, Kish Khemani and Bob Westergaard both had fun and drastically improved the system by giving it a web interface and calling it MARS, for Minimal Action Request System, implemented using the Visual Wave web tools that allowed presenting VW interfaces through the web (an early Seaside). This was a joy to use, and for a few months it evolved rapidly and then settled down into a solid tool that we knew we could tweak with very little effort. When we were bought by Cincom we had to use some commercial piece of utter crap, that was miserable. Now I’m not suggesting we can afford to implement our own. But I know from experience that you should never allow the tail to wag the dog. That if you adopt someone else’s tool and it is not best in class, not tailorable with reasonable effort, you will suffer badly. And the closer a tool is to the core of what you do the worse those effects will be. Kish, Bob, I wonder what it would take to do a Seaside AR system ;-) > > Best, > Marcel >> Am 01.10.2020 22:34:21 schrieb Thiede, Christoph : >> >> Hi Marcel, >> >> >> >> this is a very nice script and demonstrates the powerfulness of Vivide very well! Still, it does not show any links between multiple inbox/trunk versions, and they are still isolated from the discussion on the mailing list ... :-) >> >> >> >> Best, >> >> Christoph >> >> Von: Squeak-dev im Auftrag von Taeumel, Marcel >> Gesendet: Donnerstag, 1. Oktober 2020 14:35:16 >> An: squeak-dev >> Betreff: Re: [squeak-dev] The Inbox: Tools-ct.991.mcz >> >> Hi Christoph, >> >> I use a small Vivide script to keep track of your (and other) changes: >> >> >> >> >> Best, >> Marcel >>> Am 01.10.2020 14:08:05 schrieb Thiede, Christoph : >>> >>> Hi Marcel, >>> >>> >>> >>> sorry. As already mentioned, it can be hard to keep an overview of currently 307 open inbox versions and their interdependencies ... 😫 >>> >>> >>> >>> Best, >>> >>> Christoph >>> >>> Von: Squeak-dev im Auftrag von Taeumel, Marcel >>> Gesendet: Donnerstag, 1. Oktober 2020 14:04:06 >>> An: squeak-dev >>> Betreff: Re: [squeak-dev] The Inbox: Tools-ct.991.mcz >>> >>> Hi Christoph, >>> >>> that's funny. You already did that with Tools-ct.957. :-) I will move both 956 and 957 to treated. >>> >>> Best, >>> Marcel >>>> Am 30.09.2020 19:46:56 schrieb commits at source.squeak.org : >>>> >>>> Christoph Thiede uploaded a new version of Tools to project The Inbox: >>>> http://source.squeak.org/inbox/Tools-ct.991.mcz >>>> >>>> ==================== Summary ==================== >>>> >>>> Name: Tools-ct.991 >>>> Author: ct >>>> Time: 30 September 2020, 7:46:39.949807 pm >>>> UUID: 4d2f75ef-336d-cc4c-aa0d-dd4f7ff99fc7 >>>> Ancestors: Tools-mt.990 >>>> >>>> Fixes a bug in DebuggerMethodMap's rangeForPC lookup >>>> >>>> Steps to reproduce: >>>> >>>> c := Object newSubclass. >>>> c compile: 'foo: foo >>>> foo = #foo ifTrue: [^ true]. >>>> ^ (foo ifNil: [^ false]) = #bar'. >>>> c new foo: #bar. >>>> "Debug it. Step into #foo:, step over #=. >>>> Before this commit, the selection was '^ true'" >>>> >>>> The error was that #findNearbyBinaryIndex: uses to return the lower possible index if there is no exact match. For debugging, we cannot need this behavior, because we want to select the next operation to be executed. >>>> >>>> Furthermore, this commit refactors some duplication with DebuggerMethodMapForFullBlockCompiledMethod. Please review! >>>> >>>> Uploaded again due to totally broken ancestry. Replaces Tools-ct.956, which can be moved into the treated inbox. >>>> >>>> =============== Diff against Tools-mt.990 =============== >>>> >>>> Item was changed: >>>> ----- Method: DebuggerMethodMap>>rangeForPC:in:contextIsActiveContext: (in category 'source mapping') ----- >>>> rangeForPC: contextsConcretePC in: method contextIsActiveContext: contextIsActiveContext >>>> + "Answer the indices in the source code for the supplied pc. If the context is the active context (is at the hot end of the stack) then its pc is the current pc. But if the context isn't, because it is suspended sending a message, then its current pc is the previous pc." >>>> - "Answer the indices in the source code for the supplied pc. >>>> - If the context is the actve context (is at the hot end of the stack) >>>> - then its pc is the current pc. But if the context isn't, because it is >>>> - suspended sending a message, then its current pc is the previous pc." >>>> >>>> + | pc i end sortedMap | >>>> - | pc i end | >>>> pc := method abstractPCForConcretePC: (contextIsActiveContext >>>> + ifTrue: [contextsConcretePC] >>>> + ifFalse: [(method pcPreviousTo: contextsConcretePC) >>>> + ifNil: [contextsConcretePC]]). >>>> + (self abstractSourceMapForMethod: method) >>>> + at: pc >>>> + ifPresent: [:range | ^ range]. >>>> + sortedMap := self sortedSourceMapForMethod: method. >>>> + sortedMap ifEmpty: [^ 1 to: 0]. >>>> + i := sortedMap >>>> + findBinaryIndex: [:assoc | pc - assoc key] >>>> + ifNone: [:lower :upper | upper]. >>>> + i < 1 ifTrue: [^ 1 to: 0]. >>>> + i > sortedMap size ifTrue: [ >>>> + end := sortedMap inject: 0 into: [:prev :this | >>>> + prev max: this value last]. >>>> + ^ end + 1 to: end]. >>>> + ^ (sortedMap at: i) value! >>>> - ifTrue: [contextsConcretePC] >>>> - ifFalse: [(method pcPreviousTo: contextsConcretePC) >>>> - ifNotNil: [:prevpc| prevpc] >>>> - ifNil: [contextsConcretePC]]). >>>> - (self abstractSourceMap includesKey: pc) ifTrue: >>>> - [^self abstractSourceMap at: pc]. >>>> - sortedSourceMap ifNil: >>>> - [sortedSourceMap := self abstractSourceMap associations >>>> - replace: [ :each | each copy ]; >>>> - sort]. >>>> - sortedSourceMap isEmpty ifTrue: [^1 to: 0]. >>>> - i := sortedSourceMap findNearbyBinaryIndex: [:assoc| pc - assoc key]. >>>> - i < 1 ifTrue: [^1 to: 0]. >>>> - i > sortedSourceMap size ifTrue: >>>> - [end := sortedSourceMap inject: 0 into: >>>> - [:prev :this | prev max: this value last]. >>>> - ^end+1 to: end]. >>>> - ^(sortedSourceMap at: i) value >>>> - >>>> - "| method source scanner map | >>>> - method := DebuggerMethodMap compiledMethodAt: #rangeForPC:in:contextIsActiveContext:. >>>> - source := method getSourceFromFile asString. >>>> - scanner := InstructionStream on: method. >>>> - map := method debuggerMap. >>>> - Array streamContents: >>>> - [:ranges| >>>> - [scanner atEnd] whileFalse: >>>> - [| range | >>>> - range := map rangeForPC: scanner pc in: method contextIsActiveContext: true. >>>> - ((map abstractSourceMap includesKey: scanner abstractPC) >>>> - and: [range first ~= 0]) ifTrue: >>>> - [ranges nextPut: (source copyFrom: range first to: range last)]. >>>> - scanner interpretNextInstructionFor: InstructionClient new]]"! >>>> >>>> Item was added: >>>> + ----- Method: DebuggerMethodMap>>sortedSourceMap (in category 'private') ----- >>>> + sortedSourceMap >>>> + >>>> + ^ sortedSourceMap ifNil: [ >>>> + sortedSourceMap := self abstractSourceMap associations >>>> + replace: [:each | each copy]; >>>> + sort]! >>>> >>>> Item was added: >>>> + ----- Method: DebuggerMethodMap>>sortedSourceMapForMethod: (in category 'source mapping') ----- >>>> + sortedSourceMapForMethod: aCompiledMethod >>>> + >>>> + ^ self sortedSourceMap! >>>> >>>> Item was changed: >>>> ----- Method: DebuggerMethodMapForFullBlockCompiledMethods>>abstractSourceMap (in category 'source mapping') ----- >>>> abstractSourceMap >>>> + >>>> + ^ self shouldNotImplement! >>>> - self shouldNotImplement! >>>> >>>> Item was removed: >>>> - ----- Method: DebuggerMethodMapForFullBlockCompiledMethods>>rangeForPC:in:contextIsActiveContext: (in category 'source mapping') ----- >>>> - rangeForPC: contextsConcretePC in: method contextIsActiveContext: contextIsActiveContext >>>> - "Answer the indices in the source code for the supplied pc. >>>> - If the context is the actve context (is at the hot end of the stack) >>>> - then its pc is the current pc. But if the context isn't, because it is >>>> - suspended sending a message, then its current pc is the previous pc." >>>> - >>>> - | pc i end mapForMethod sortedMap | >>>> - pc := method abstractPCForConcretePC: (contextIsActiveContext >>>> - ifTrue: [contextsConcretePC] >>>> - ifFalse: [(method pcPreviousTo: contextsConcretePC) >>>> - ifNotNil: [:prevpc| prevpc] >>>> - ifNil: [contextsConcretePC]]). >>>> - ((mapForMethod := self abstractSourceMapForMethod: method) includesKey: pc) ifTrue: >>>> - [^mapForMethod at: pc]. >>>> - sortedSourceMap ifNil: >>>> - [sortedSourceMap := IdentityDictionary new]. >>>> - sortedMap := sortedSourceMap >>>> - at: method >>>> - ifAbsentPut: [mapForMethod associations >>>> - replace: [ :each | each copy ]; >>>> - sort]. >>>> - sortedMap isEmpty ifTrue: [^1 to: 0]. >>>> - i := sortedMap findNearbyBinaryIndex: [:assoc| pc - assoc key]. >>>> - i < 1 ifTrue: [^1 to: 0]. >>>> - i > sortedMap size ifTrue: >>>> - [end := sortedMap inject: 0 into: >>>> - [:prev :this | prev max: this value last]. >>>> - ^end+1 to: end]. >>>> - ^(sortedMap at: i) value >>>> - >>>> - "| method source scanner map | >>>> - method := DebuggerMethodMapForFullBlockCompiledMethods compiledMethodAt: #rangeForPC:in:contextIsActiveContext:. >>>> - source := method getSourceFromFile asString. >>>> - scanner := InstructionStream on: method. >>>> - map := method debuggerMap. >>>> - Array streamContents: >>>> - [:ranges| >>>> - [scanner atEnd] whileFalse: >>>> - [| range | >>>> - range := map rangeForPC: scanner pc in: method contextIsActiveContext: true. >>>> - ((map abstractSourceMap includesKey: scanner abstractPC) >>>> - and: [range first ~= 0]) ifTrue: >>>> - [ranges nextPut: (source copyFrom: range first to: range last)]. >>>> - scanner interpretNextInstructionFor: InstructionClient new]]"! >>>> >>>> Item was added: >>>> + ----- Method: DebuggerMethodMapForFullBlockCompiledMethods>>sortedSourceMap (in category 'source mapping') ----- >>>> + sortedSourceMap >>>> + >>>> + ^ self shouldNotImplement! >>>> >>>> Item was added: >>>> + ----- Method: DebuggerMethodMapForFullBlockCompiledMethods>>sortedSourceMapForMethod: (in category 'source mapping') ----- >>>> + sortedSourceMapForMethod: method >>>> + >>>> + sortedSourceMap ifNil: [ >>>> + sortedSourceMap := IdentityDictionary new]. >>>> + ^ sortedSourceMap >>>> + at: method >>>> + ifAbsentPut: [(self abstractSourceMapForMethod: method) associations >>>> + replace: [ :each | each copy ]; >>>> + sort]! >>>> >>>> > > > -------------- next part -------------- An HTML attachment was scrubbed... URL: From builds at travis-ci.org Fri Oct 2 15:18:48 2020 From: builds at travis-ci.org (Travis CI) Date: Fri, 02 Oct 2020 15:18:48 +0000 Subject: [squeak-dev] [CRON] Passed: squeak-smalltalk/squeak-app#1846 (squeak-trunk - 25ebaf1) In-Reply-To: Message-ID: <5f7744d712596_13fc6eb22152c2653b3@travis-tasks-7c4568c65-jr9ss.mail> Build Update for squeak-smalltalk/squeak-app ------------------------------------- Build: #1846 Status: Passed Duration: 18 mins and 55 secs Commit: 25ebaf1 (squeak-trunk) Author: Marcel Taeumel Message: Hi all! The project "squeak-app" is part of the continuous build infrastructure (short: CI) for Squeak's bundles, which you can download at https://files.squeak.org/, followed by the version tag you are looking for. All bundles are updated on a regular basis, which is daily for Trunk (i.e. the current alpha version) and monthly for release versions. Note that there won't be new bundles if Squeak's build number, which reflects in-image code updates, did not change between CI jobs. -- The Squeak Oversight Board [ci skip] View the changeset: https://github.com/squeak-smalltalk/squeak-app/compare/fb55517f583fe544f9225413a23fe82a680200c2...25ebaf18249322227da1f7c767384cb35082fab7 View the full build log and details: https://travis-ci.org/github/squeak-smalltalk/squeak-app/builds/732280827?utm_medium=notification&utm_source=email -- You can unsubscribe from build emails from the squeak-smalltalk/squeak-app repository going to https://travis-ci.org/account/preferences/unsubscribe?repository=8901856&utm_medium=notification&utm_source=email. Or unsubscribe from *all* email updating your settings at https://travis-ci.org/account/preferences/unsubscribe?utm_medium=notification&utm_source=email. Or configure specific recipients for build notifications in your .travis.yml file. See https://docs.travis-ci.com/user/notifications. -------------- next part -------------- An HTML attachment was scrubbed... URL: From commits at source.squeak.org Fri Oct 2 15:32:36 2020 From: commits at source.squeak.org (commits at source.squeak.org) Date: Fri, 2 Oct 2020 15:32:36 0000 Subject: [squeak-dev] The Inbox: WebClient-Core-ct.127.mcz Message-ID: Christoph Thiede uploaded a new version of WebClient-Core to project The Inbox: http://source.squeak.org/inbox/WebClient-Core-ct.127.mcz ==================== Summary ==================== Name: WebClient-Core-ct.127 Author: ct Time: 2 October 2020, 5:32:32.7446 pm UUID: f078e024-2f40-5c4b-b608-e21114236743 Ancestors: WebClient-Core-mt.126 Moves WebClient utility methods to instance side (and forwards them on class-side). This allows to reuse them even when it is necessary to use #httpDo: for passing additional configuration to the WebClient instance, e.g. #timeout:. Also includes minor refactoring of #htmlSubmit:fields:method:encoding:. If the POST encoding is unknown, raise an error instead silently doing nothing. =============== Diff against WebClient-Core-mt.126 =============== Item was changed: ----- Method: WebClient class>>htmlSubmit:fields: (in category 'utilities') ----- htmlSubmit: urlString fields: fieldMap + "A utility method for html submit operations." - "A utility method for html submit operations. The fieldMap can be EITHER - an array of associations OR a Dictionary of key value pairs (the former is - useful for providing multiple fields and/or specifying the order of fields). + ^ self httpDo: [:client | + client htmlSubmit: urlString fields: fieldMap] - WebClient - htmlSubmit: 'http://www.google.com/search' - fields: { - 'hl' -> 'en'. - 'q' -> 'Squeak' - } - " - ^self htmlSubmit: urlString - fields: fieldMap - method: 'GET' ! Item was changed: ----- Method: WebClient class>>htmlSubmit:fields:method: (in category 'utilities') ----- htmlSubmit: urlString fields: fieldMap method: method + "A utility method for html submit operations." - "A utility method for html submit operations. The fieldMap can be EITHER - an array of associations OR a Dictionary of key value pairs (the former is - useful for providing multiple fields and/or specifying the order of fields). + ^ self httpDo: [:client | + client htmlSubmit: urlString fields: fieldMap method: method]! - WebClient - htmlSubmit: 'http://www.google.com/search' - fields: { - 'hl' -> 'en'. - 'q' -> 'Squeak' - } method: 'GET' - " - ^self htmlSubmit: urlString - fields: fieldMap - method: method - encoding: 'application/x-www-form-urlencoded' - ! Item was changed: ----- Method: WebClient class>>htmlSubmit:fields:method:encoding: (in category 'utilities') ----- htmlSubmit: urlString fields: fields method: method encoding: encoding + "A utility method for html submit operations." - "A utility method for html submit operations. The fieldMap can be EITHER - an array of associations OR a Dictionary of key value pairs (the former is - useful for providing multiple fields and/or specifying the order of fields). + ^ self httpDo: [:client | + client htmlSubmit: urlString fields: fields method: method encoding: encoding]! - WebClient - htmlSubmit: 'http://www.google.com/search' - fields: { - 'hl' -> 'en'. - 'q' -> 'Squeak' - } method: 'GET' - encoding: 'application/x-www-form-urlencoded' - " - - method = 'GET' ifTrue:[ - "GET only supports url encoded requests" - encoding = 'application/x-www-form-urlencoded' - ifFalse:[^self error: 'Unsupported encoding: ', encoding]. - ^self httpGet: urlString, '?', (WebUtils encodeUrlEncodedForm: fields). - ]. - - method = 'POST' ifTrue:[ - "Dispatch on encoding type" - encoding caseOf: { - [ 'application/x-www-form-urlencoded'] -> [ - ^self httpPost: urlString - content: (WebUtils encodeUrlEncodedForm: fields) - type: encoding. - ]. - ['multipart/form-data'] -> [ - ^self httpPost: urlString multipartFields: fields - ]. - } otherwise:[] - ]. - - self error: 'Unsupported method: ', method. - ! Item was changed: ----- Method: WebClient class>>httpPost:multipartFields: (in category 'utilities') ----- httpPost: url multipartFields: fieldMap + "Make a form submission using multipart/form-data POST. See comment on instance-side implementation." - "Make a form submission using multipart/form-data POST. + ^ self httpDo: [:client | + client httpPost: url multipartFields: fieldMap]! - The fieldMap may contain MIMEDocument instances to indicate the presence - of a file to upload to the server. If the MIMEDocument is present, its - content type and file name will be used for the upload. - - The fieldMap can be EITHER an array of associations OR a Dictionary of - key value pairs (the former is useful for providing multiple fields and/or - specifying the order of fields)." - - | boundary | - boundary := WebUtils multipartBoundary. - - ^self httpPost: url - content: (WebUtils encodeMultipartForm: fieldMap boundary: boundary) - type: 'multipart/form-data; boundary=', boundary! Item was added: + ----- Method: WebClient>>htmlSubmit:fields: (in category 'utilities') ----- + htmlSubmit: urlString fields: fieldMap + + ^ self + htmlSubmit: urlString + fields: fieldMap + method: 'GET'! Item was added: + ----- Method: WebClient>>htmlSubmit:fields:method: (in category 'utilities') ----- + htmlSubmit: urlString fields: fieldMap method: method + + ^ self + htmlSubmit: urlString + fields: fieldMap + method: method + encoding: 'application/x-www-form-urlencoded'! Item was added: + ----- Method: WebClient>>htmlSubmit:fields:method:encoding: (in category 'utilities') ----- + htmlSubmit: urlString fields: fields method: method encoding: encoding + "A utility method for html submit operations. The fieldMap can be EITHER an array of associations OR a Dictionary of key value pairs (the former is useful for providing multiple fields and/or specifying the order of fields). + + Usage: + WebClient + htmlSubmit: 'http://www.google.com/search' + fields: {'hl' -> 'en'. 'q' -> 'Squeak'} + method: 'GET' + encoding: 'application/x-www-form-urlencoded' + " + + ^ method + caseOf: { + ['GET'] -> [ + "GET only supports url encoded requests" + encoding = 'application/x-www-form-urlencoded' + ifFalse: [^self error: 'Unsupported encoding: ', encoding]. + self httpGet: urlString, '?', (WebUtils encodeUrlEncodedForm: fields)]. + ['POST'] -> [ + encoding caseOf: { + ['application/x-www-form-urlencoded'] -> [ + self + httpPost: urlString + content: (WebUtils encodeUrlEncodedForm: fields) + type: encoding]. + ['multipart/form-data'] -> [ + self httpPost: urlString multipartFields: fields] }] } + otherwise: [self error: 'Unsupported method: ', method]! Item was added: + ----- Method: WebClient>>httpPost:multipartFields: (in category 'utilities') ----- + httpPost: url multipartFields: fieldMap + "Make a form submission using multipart/form-data POST. + + The fieldMap may contain MIMEDocument instances to indicate the presence of a file to upload to the server. If the MIMEDocument is present, its content type and file name will be used for the upload. + + The fieldMap can be EITHER an array of associations OR a Dictionary of key value pairs (the former is useful for providing multiple fields and/or specifying the order of fields)." + + | boundary | + boundary := WebUtils multipartBoundary. + ^ self + httpPost: url + content: (WebUtils encodeMultipartForm: fieldMap boundary: boundary) + type: 'multipart/form-data; boundary=', boundary! From trygver at ifi.uio.no Fri Oct 2 15:53:44 2020 From: trygver at ifi.uio.no (Trygve Reenskaug) Date: Fri, 2 Oct 2020 17:53:44 +0200 Subject: [squeak-dev] =?utf-8?q?A_Sad_Day_=E2=80=93_concluded?= Message-ID: <05fa2ced-b4fd-f8a4-a6f1-2f50ed04b272@ifi.uio.no> Dear all, I need to use many words to explore why I can't understand current Squeak code. I believe the reason is a profound one, and I hope some of you have the patience to read about it. Thank you for your responses to my 'A Sad Day'-message. One response said  "/But please don't give up as an inventor of MVC, which has simplified writing software for all of us.// //We need new ideas to stabilize Smalltalk." /As to MVC, it was received with acclamation when I first presented it at PARC in 1978, and people suggested I should make it the theme of my article in the special Smalltalk issue of Byte. I couldn't understand it; MVC was so simple and obvious that is was not worth writing about it. Nevertheless, people seem to have problems understanding MVC. It took me a long time before I gleaned what was going on. The explanation is a deep one, rooted in our different mental paradigms. From around 1970, I was working on Prokon, a distributed system for managers in the shipbuilding industry:  Every manager has their own computer that they use for augmenting their mind. The manager understands their software and ideally writes it themselves. Managers delegate conversations with other managers to their computer's M-to-M network. (Marked with a heavy black line in the figure). I chose "distributed planning with central control" as my example project. Each manager creates a plan for their department, using apps suited to their particular needs. A */distributed algorithm/* ensures consistency across departments. I came to PARC in 1978 and could immediately relate to the Smalltalk image with its universe of collaborating objects. Alan's definition of object-orientation fitted my Prokon model: "Thus its semantics are a bit like having thousands and thousands of computers all hooked together by a very fast network." MVC prescribes a network of communicating objects. Any object can fill one or more positions in the network as long as it has the required behavior; their classes are irrelevant. It's so simple that it's not worth writing about it. ==================== The work on this post was interrupted at this point by an unexpected week in hospital. It gave me quiet days of pondering the futility of what I am doing and I will be terminating my memberships in the Pharo and Squeak mailing lists. I have also deleted most of the old draft of this message and will quickly conclude with two observations: 1. The Smalltalk image is a universe of communicating objects. I call it an object computer. It can be seen as the model of an entirely new kind of computer, a model on a level closer to the human mind than the von Neumann model of 1948. The new model is communication-centric and should supersede the ubiquitous CPU-centric model as soon as possible. Working out the details of this idea could make an exciting and disruptive Ph.D. thesis. 2. Smalltalk is called a programming language. It is a curious one, very different from well-known languages like Java with their syntax and semantics. Smalltalk, as a programming language, does not have the concept of a program. Smalltalk, as a class-oriented language, does not have syntax for the declaration of a class. Smalltalk, as an object-oriented language, can't describe how objects collaborate to achieve a goal. You appear to be happy with this state of affairs, at least, I see no sign of anybody wanting to move on from the unfinished Smalltalk language to a mature development environment. I do not find it satisfactory and it is not acceptable to the intended managers populating the distributed system shown in the first picture. Consequently, I have done something about it as described in my SoSym article "/Personal Programming and the Object Computer./" I am tired of being alone in my endeavors and this ends my work with Squeak and other Smalltalks. I wish you health and happiness wherever you happen to be. Trygve Personal programming and the object computer https://doi.org/10.1007/s10270-019-00768-3 -- /The essence of object orientation is that objects collaborateto achieve a goal. / Trygve Reenskaug mailto: trygver at ifi.uio.no Morgedalsvn. 5A http://folk.uio.no/trygver/ N-0378 Oslo http://fullOO.info Norway                     Tel: (+47) 468 58 625 -------------- next part -------------- An HTML attachment was scrubbed... URL: -------------- next part -------------- A non-text attachment was scrubbed... Name: kjjbmoogpajdimke.png Type: image/png Size: 45740 bytes Desc: not available URL: -------------- next part -------------- A non-text attachment was scrubbed... Name: cljooepacomafihh.png Type: image/png Size: 22069 bytes Desc: not available URL: From sumi at seagreen.ocn.ne.jp Fri Oct 2 18:14:00 2020 From: sumi at seagreen.ocn.ne.jp (masato sumi) Date: Sat, 3 Oct 2020 03:14:00 +0900 Subject: [squeak-dev] =?utf-8?q?A_Sad_Day_=E2=80=93_concluded?= In-Reply-To: <05fa2ced-b4fd-f8a4-a6f1-2f50ed04b272@ifi.uio.no> References: <05fa2ced-b4fd-f8a4-a6f1-2f50ed04b272@ifi.uio.no> Message-ID: Dear Trygve, Thank you for your very long term contribution and efforts. I'm very sorry that I couldn't help you at all now. I'm afraid, but could you please make your latest version of Loke/BabyIDE written on Squeak3.10.2 available for future generations of researchers and/or followers? Anyway, I think your ideas and thoughts should be passed on to future generations as faithfully as we can possible, and I myself will try to make sure that. Thank you so much and goodbye. Please take care of yourself. -- sumim 2020-10-03 0:54 Trygve Reenskaug : > Dear all, > I need to use many words to explore why I can't understand current Squeak > code. I believe the reason is a profound one, and I hope some of you have > the patience to read about it. > > Thank you for your responses to my 'A Sad Day'-message. One response said > "*But please don't give up as an inventor of MVC, which has simplified > writing software for all of us.* > > > *We need new ideas to stabilize Smalltalk." *As to MVC, it was received > with acclamation when I first presented it at PARC in 1978, and people > suggested I should make it the theme of my article in the special Smalltalk > issue of Byte. I couldn't understand it; MVC was so simple and obvious that > is was not worth writing about it. Nevertheless, people seem to have > problems understanding MVC. It took me a long time before I gleaned what > was going on. The explanation is a deep one, rooted in our different mental > paradigms. > > From around 1970, I was working on Prokon, a distributed system for > managers in the shipbuilding industry: > > Every manager has their own computer that they use for augmenting their > mind. The manager understands their software and ideally writes it > themselves. Managers delegate conversations with other managers to their > computer's M-to-M network. (Marked with a heavy black line in the figure). > I chose "distributed planning with central control" as my example project. > Each manager creates a plan for their department, using apps suited to > their particular needs. A **distributed algorithm** ensures consistency > across departments. > > I came to PARC in 1978 and could immediately relate to the Smalltalk image > with its universe of collaborating objects. Alan's definition of > object-orientation fitted my Prokon model: "Thus its semantics are a bit > like having thousands and thousands of computers all hooked together by a > very fast network." > > MVC prescribes a network of communicating objects. Any object can fill one > or more positions in the network as long as it has the required behavior; > their classes are irrelevant. It's so simple that it's not worth writing > about it. > > > ==================== > > The work on this post was interrupted at this point by an unexpected week > in hospital. It gave me quiet days of pondering the futility of what I am > doing and I will be terminating my memberships in the Pharo and Squeak > mailing lists. I have also deleted most of the old draft of this message > and will quickly conclude with two observations: > > > 1. > The Smalltalk image is a universe of communicating objects. I call it > an object computer. It can be seen as the model of an entirely new kind of > computer, a model on a level closer to the human mind than the von Neumann > model of 1948. The new model is communication-centric and should supersede > the ubiquitous CPU-centric model as soon as possible. Working out the > details of this idea could make an exciting and disruptive Ph.D. thesis. > 2. > Smalltalk is called a programming language. It is a curious one, very > different from well-known languages like Java with their syntax and > semantics. Smalltalk, as a programming language, does not have the concept > of a program. Smalltalk, as a class-oriented language, does not have syntax > for the declaration of a class. Smalltalk, as an object-oriented language, > can't describe how objects collaborate to achieve a goal. You appear to be > happy with this state of affairs, at least, I see no sign of anybody > wanting to move on from the unfinished Smalltalk language to a mature > development environment. I do not find it satisfactory and it is not > acceptable to the intended managers populating the distributed system shown > in the first picture. Consequently, I have done something about it as > described in my SoSym article "*Personal Programming and the Object > Computer.*" I am tired of being alone in my endeavors and this ends my > work with Squeak and other Smalltalks. I wish you health and happiness > wherever you happen to be. > > Trygve > Personal programming and the object computer > https://doi.org/10.1007/s10270-019-00768-3 > > -- > > *The essence of object orientation is that objects collaborate to achieve > a goal. * > Trygve Reenskaug mailto: trygver at ifi.uio.no <%20trygver at ifi.uio.no> > Morgedalsvn. 5A http://folk.uio.no/trygver/ > N-0378 Oslo http://fullOO.info > Norway Tel: (+47) 468 58 625 > > -------------- next part -------------- An HTML attachment was scrubbed... URL: -------------- next part -------------- A non-text attachment was scrubbed... Name: kjjbmoogpajdimke.png Type: image/png Size: 45740 bytes Desc: not available URL: -------------- next part -------------- A non-text attachment was scrubbed... Name: cljooepacomafihh.png Type: image/png Size: 22069 bytes Desc: not available URL: From commits at source.squeak.org Fri Oct 2 19:19:06 2020 From: commits at source.squeak.org (commits at source.squeak.org) Date: Fri, 2 Oct 2020 19:19:06 0000 Subject: [squeak-dev] The Trunk: Tools-eem.992.mcz Message-ID: Eliot Miranda uploaded a new version of Tools to project The Trunk: http://source.squeak.org/trunk/Tools-eem.992.mcz ==================== Summary ==================== Name: Tools-eem.992 Author: eem Time: 2 October 2020, 12:19:00.336286 pm UUID: 20c2a45a-e258-4a02-9e37-10ffc085290b Ancestors: Tools-eem.991 Go some way to speed up stepping in the debugger. Two of the identified costs are - scanning the method to produce its method/block start keys to block extents map - translating the 'all temp vars' and 'stack top' label With these two cached streaming and emphasizing the temp vars in a ContextInspector is now really fast (less than a millisecond). But stepping is still not fast enlough; one can easily click the mouse faster than step can keep up. So we have more analysis to do. Do futher clean up of DebuggerMethodMap in having it cache its startKeysToBlockExtents. Delete the obsolete privateTempAt:... methods that expect startpcsToBlockExtents:.Move all the scanning machinery from CompiledMethod into DebuggerMethodMap. =============== Diff against Tools-eem.991 =============== Item was changed: Inspector subclass: #ContextInspector instanceVariableNames: '' + classVariableNames: 'CachedStackTopLabel CachedTempVarsLabel CurrentLocale' - classVariableNames: '' poolDictionaries: '' category: 'Tools-Inspector'! !ContextInspector commentStamp: 'ct 1/12/2020 15:26' prior: 0! I am an Inspector that is specialized for inspecting Contexts.! Item was added: + ----- Method: ContextInspector>>allTempVarsTranslated (in category 'private') ----- + allTempVarsTranslated + "Alas translation is slow enough that we notice the slow down in trying to step in the debugger..." + (CurrentLocale ~= Locale current + or: [CachedTempVarsLabel isNil]) ifTrue: + [CurrentLocale := Locale current. + CachedTempVarsLabel := 'all temp vars' translated]. + ^CachedTempVarsLabel! Item was added: + ----- Method: ContextInspector>>stackTopTranslated (in category 'private') ----- + stackTopTranslated + "Alas translation is slow enough that we notice the slow down in trying to step in the debugger..." + (CurrentLocale ~= Locale current + or: [CachedTempVarsLabel isNil]) ifTrue: + [CurrentLocale := Locale current. + CachedStackTopLabel := 'stack top' translated]. + ^CachedStackTopLabel! Item was changed: ----- Method: ContextVariablesInspector>>fieldAllTempVars (in category 'fields') ----- fieldAllTempVars ^ (self newFieldForType: #all key: #allTempVars) + name: self allTempVarsTranslated; emphasizeName; - name: 'all temp vars' translated; emphasizeName; valueGetter: [:object | object tempsAndValues]; printValueAsIs; yourself! Item was changed: ----- Method: ContextVariablesInspector>>fieldStackTop (in category 'fields') ----- fieldStackTop ^ (self newFieldForType: #stackTop key: #stackTop) + name: self stackTopTranslated; emphasizeName; - name: 'stack top' translated; emphasizeName; valueGetter: [:context | context top]; valueGetterExpression: 'ThisContext top'; yourself! Item was changed: Object subclass: #DebuggerMethodMap + instanceVariableNames: 'timestamp methodReference methodNode startKeysToBlockExtents abstractSourceRanges sortedSourceMap' - instanceVariableNames: 'timestamp methodReference methodNode abstractSourceRanges sortedSourceMap' classVariableNames: 'AccessLock MapCache MapCacheEntries' poolDictionaries: '' category: 'Tools-Debugger'! !DebuggerMethodMap commentStamp: 'eem 10/1/2020 19:08' prior: 0! I am a place-holder for information needed by the Debugger to inspect method activations. I insulate the debugger from details of code generation such as exact bytecode offsets and temporary variable locations. I have two concrete subclasses, one for methods where block bytecodes are embedded in the home method and one for methods where blocks are separate objects (CompiledBlock). These classes deal with temporary variable access. My function is to abstract the source map away from actual bytecode pcs to abstract bytecode pcs. I used to have a subclass for "BlueBook" compiled methods, with non-closure blocks, but this was removed in October 2020 for simplicity's sake. To reduce compilation time I try and defer as much computation to access time as possible as instances of me will be created after each compilation. I maintain a WeakIdentityDictionary of method to DebuggerMethodMap to cache maps. I refer to my method through a WeakArray to keep the map cache functional. If the reference from a DebuggerMethodMap to its method were strong then the method would never be dropped from the cache because the reference from its map would keep it alive.! Item was added: + ----- Method: DebuggerMethodMap>>blockExtentsInto:from:to:method:numberer: (in category 'private') ----- + blockExtentsInto: aDictionary from: initialPC to: endPC method: method numberer: numbererBlock + "Support routine for startpcsToBlockExtents" + | pcs extentStart locator scanner blockSizeOrMethodOrLocator | + extentStart := numbererBlock value. + locator := BlockStartLocator new. + scanner := InstructionStream new method: method pc: initialPC. + pcs := OrderedCollection new. + [pcs addLast: scanner pc. + scanner pc <= endPC] whileTrue: + [blockSizeOrMethodOrLocator := scanner interpretNextInstructionFor: locator. + blockSizeOrMethodOrLocator ~~ locator ifTrue: + [blockSizeOrMethodOrLocator isInteger + ifTrue: + [self + blockExtentsInto: aDictionary + from: scanner pc + to: scanner pc + blockSizeOrMethodOrLocator - 1 + method: method + numberer: numbererBlock. + scanner pc: scanner pc + blockSizeOrMethodOrLocator] + ifFalse: + [self assert: blockSizeOrMethodOrLocator isCompiledBlock. + self + blockExtentsInto: aDictionary + from: blockSizeOrMethodOrLocator initialPC + to: blockSizeOrMethodOrLocator endPC + method: blockSizeOrMethodOrLocator + numberer: numbererBlock]]]. + aDictionary + at: (method isCompiledBlock + ifTrue: [method] + ifFalse: [initialPC]) + put: (extentStart to: numbererBlock value). + ^aDictionary! Item was changed: ----- Method: DebuggerMethodMap>>namedTempAt:in: (in category 'accessing') ----- namedTempAt: index in: aContext "Answer the value of the temp at index in aContext where index is relative to the array of temp names answered by tempNamesForContext:" + self assert: aContext method homeMethod == self method. ^self privateTempAt: index in: aContext + startKeysToBlockExtents: self startKeysToBlockExtents! - startKeysToBlockExtents: aContext method startKeysToBlockExtents! Item was changed: ----- Method: DebuggerMethodMap>>namedTempAt:put:in: (in category 'accessing') ----- namedTempAt: index put: aValue in: aContext "Assign the value of the temp at index in aContext where index is relative to the array of temp names answered by tempNamesForContext:. If the value is a copied value we also need to set it along the lexical chain." + self assert: aContext method homeMethod == self method. ^self privateTempAt: index in: aContext put: aValue + startKeysToBlockExtents: self startKeysToBlockExtents! - startKeysToBlockExtents: aContext method startKeysToBlockExtents! Item was changed: ----- Method: DebuggerMethodMap>>rangeForPC:in:contextIsActiveContext: (in category 'source mapping') ----- rangeForPC: contextsConcretePC in: method contextIsActiveContext: contextIsActiveContext "Answer the indices in the source code for the supplied pc. If the context is the actve context (is at the hot end of the stack) then its pc is the current pc. But if the context isn't, because it is suspended sending a message, then its current pc is the previous pc." + | pc abstractMap i end | - | pc i end | pc := method abstractPCForConcretePC: (contextIsActiveContext ifTrue: [contextsConcretePC] ifFalse: [(method pcPreviousTo: contextsConcretePC) ifNotNil: [:prevpc| prevpc] ifNil: [contextsConcretePC]]). + abstractMap := self abstractSourceMapForMethod: method. + (abstractMap includesKey: pc) ifTrue: + [^abstractMap at: pc]. - (self abstractSourceMap includesKey: pc) ifTrue: - [^self abstractSourceMap at: pc]. sortedSourceMap ifNil: + [sortedSourceMap := abstractMap associations - [sortedSourceMap := self abstractSourceMap associations replace: [ :each | each copy ]; sort]. sortedSourceMap isEmpty ifTrue: [^1 to: 0]. i := sortedSourceMap findNearbyBinaryIndex: [:assoc| pc - assoc key]. i < 1 ifTrue: [^1 to: 0]. i > sortedSourceMap size ifTrue: [end := sortedSourceMap inject: 0 into: [:prev :this | prev max: this value last]. ^end+1 to: end]. ^(sortedSourceMap at: i) value "| method source scanner map | method := DebuggerMethodMap compiledMethodAt: #rangeForPC:in:contextIsActiveContext:. source := method getSourceFromFile asString. scanner := InstructionStream on: method. map := method debuggerMap. Array streamContents: [:ranges| [scanner atEnd] whileFalse: [| range | range := map rangeForPC: scanner pc in: method contextIsActiveContext: true. ((map abstractSourceMap includesKey: scanner abstractPC) and: [range first ~= 0]) ifTrue: [ranges nextPut: (source copyFrom: range first to: range last)]. scanner interpretNextInstructionFor: InstructionClient new]]"! Item was added: + ----- Method: DebuggerMethodMap>>startKeysToBlockExtents (in category 'private') ----- + startKeysToBlockExtents + "Answer the map from start keys (either start pcs for embedded closures, or + full block methods for full blocks) to the block extents in that method, where + a block extent is an abstract representation of block nesting within a method." + + startKeysToBlockExtents ifNil: + [| index method | + index := 0. + method := self method homeMethod. + startKeysToBlockExtents := + self + blockExtentsInto: self newBlockStartMap + from: method initialPC + to: method endPC + method: method + numberer: [| value | value := index. index := index + 2. value]]. + ^startKeysToBlockExtents! Item was changed: ----- Method: DebuggerMethodMap>>tempNamesForContext: (in category 'accessing') ----- tempNamesForContext: aContext "Answer an Array of all the temp names in scope in aContext starting with the home's first local (the first argument or first temporary if no arguments)." + self assert: aContext method homeMethod == self method. ^(self privateTempRefsForContext: aContext + startKeysToBlockExtents: self startKeysToBlockExtents) collect: - startKeysToBlockExtents: aContext method startKeysToBlockExtents) collect: [:pair| pair first]! Item was changed: ----- Method: DebuggerMethodMap>>tempNamesForMethod: (in category 'accessing') ----- tempNamesForMethod: aMethod "Answer an Array of all the temp names in scope in aMethod starting with the home's first local (the first argument or first temporary if no arguments)." + self assert: aMethod homeMethod == self method. ^(self privateTempRefsForMethod: aMethod + startKeysToBlockExtents: self startKeysToBlockExtents) collect: - startKeysToBlockExtents: aMethod startKeysToBlockExtents) collect: [:pair| pair first]! Item was added: + ----- Method: DebuggerMethodMapForClosureCompiledMethods>>newBlockStartMap (in category 'private') ----- + newBlockStartMap + "If blocks are embedded then keys in the map are simple integer pcs and a Dictionary can be used. + If blocks are full (separate method objects) then keys in the map are CompiledBlocks and + IdentityDictionary must be used to avoid confusing blocks with identical code." + ^Dictionary new! Item was removed: - ----- Method: DebuggerMethodMapForClosureCompiledMethods>>privateTempAt:in:put:startpcsToBlockExtents: (in category 'private but obsolete') ----- - privateTempAt: index in: aContext put: aValue startpcsToBlockExtents: theContextsStartpcsToBlockExtents - | nameRefPair | - nameRefPair := (self privateTempRefsForContext: aContext - startpcsToBlockExtents: theContextsStartpcsToBlockExtents) - at: index - ifAbsent: [aContext errorSubscriptBounds: index]. - ^self privateDereference: nameRefPair last in: aContext put: aValue! Item was removed: - ----- Method: DebuggerMethodMapForClosureCompiledMethods>>privateTempAt:in:startpcsToBlockExtents: (in category 'private but obsolete') ----- - privateTempAt: index in: aContext startpcsToBlockExtents: theContextsStartpcsToBlockExtents - | nameRefPair | - nameRefPair := (self privateTempRefsForContext: aContext - startpcsToBlockExtents: theContextsStartpcsToBlockExtents) - at: index - ifAbsent: [aContext errorSubscriptBounds: index]. - ^self privateDereference: nameRefPair last in: aContext! Item was changed: ----- Method: DebuggerMethodMapForClosureCompiledMethods>>privateTempRefsForContext:startKeysToBlockExtents: (in category 'private') ----- privateTempRefsForContext: aContext startKeysToBlockExtents: theContextsStartKeysToBlockExtents "Answer the sequence of temps in scope in aContext in the natural order, outermost arguments and temporaries first, innermost last. Each temp is a pair of the temp's name followed by a reference. The reference can be integer - index of temp in aContext #( indirectionVectorIndex tempIndex ) - remote temp in indirectionVector at index in aContext #( outer. temp reference ) - a temp reference in an outer context." blockExtentsToTempRefs ifNil: [blockExtentsToTempRefs := (aContext method holdsTempNames ifTrue: [aContext method] ifFalse: [methodNode]) blockExtentsToTempsMap. blockExtentsToTempRefs ifNil: ["an empty method. shouldn't be able to step into here but it can happen in weird circumstances (i.e. with MethodWrapper)." blockExtentsToTempRefs := Dictionary new. blockExtentsToTempRefs at: (theContextsStartKeysToBlockExtents at: aContext startKey) put: {}] ifNotNil: [(blockExtentsToTempRefs isKindOf: IdentityDictionary) ifTrue: [blockExtentsToTempRefs := Dictionary withAll: blockExtentsToTempRefs associations]]. + startKeysToTempRefs := self newBlockStartMap]. - startKeysToTempRefs := aContext home method newBlockStartMap]. ^startKeysToTempRefs at: aContext startKey ifAbsentPut: [| localRefs | localRefs := blockExtentsToTempRefs at: (theContextsStartKeysToBlockExtents at: aContext startKey) ifAbsent: [#()]. aContext outerContext ifNil: [localRefs] ifNotNil: [:outer| | outerTemps | "Present temps in the order outermost to innermost left-to-right, but replace copied outermost temps with their innermost copies" outerTemps := (self privateTempRefsForContext: outer startKeysToBlockExtents: theContextsStartKeysToBlockExtents) collect: [:outerPair| localRefs detect: [:localPair| outerPair first = localPair first] ifNone: [{ outerPair first. { #outer. outerPair last } }]]. outerTemps, (localRefs reject: [:localPair| outerTemps anySatisfy: [:outerPair| localPair first = outerPair first]])]]! Item was removed: - ----- Method: DebuggerMethodMapForClosureCompiledMethods>>privateTempRefsForContext:startpcsToBlockExtents: (in category 'private but obsolete') ----- - privateTempRefsForContext: aContext startpcsToBlockExtents: theContextsStartpcsToBlockExtents - "Answer the sequence of temps in scope in aContext in the natural order, - outermost arguments and temporaries first, innermost last. Each temp is - a pair of the temp's name followed by a reference. The reference can be - integer - index of temp in aContext - #( indirectionVectorIndex tempIndex ) - remote temp in indirectionVector at index in aContext - #( outer. temp reference ) - a temp reference in an outer context." - blockExtentsToTempRefs ifNil: - [blockExtentsToTempRefs := (aContext method holdsTempNames - ifTrue: [aContext method] - ifFalse: [methodNode]) blockExtentsToTempsMap. - blockExtentsToTempRefs ifNil: - ["an empty method. shouldn't be able to step into here but it - can happen in weird circumstances (i.e. with MethodWrapper)." - blockExtentsToTempRefs := Dictionary new. - blockExtentsToTempRefs - at: (theContextsStartpcsToBlockExtents at: aContext startpc) - put: {}]. - startpcsToTempRefs := Dictionary new]. - ^startpcsToTempRefs - at: aContext startpc - ifAbsentPut: - [| localRefs | - localRefs := blockExtentsToTempRefs at: (theContextsStartpcsToBlockExtents at: aContext startpc). - aContext outerContext - ifNil: [localRefs] - ifNotNil: - [:outer| | outerTemps | - "Present temps in the order outermost to innermost left-to-right, but replace - copied outermost temps with their innermost copies" - outerTemps := (self - privateTempRefsForContext: outer - startpcsToBlockExtents: theContextsStartpcsToBlockExtents) collect: - [:outerPair| - localRefs - detect: [:localPair| outerPair first = localPair first] - ifNone: [{ outerPair first. { #outer. outerPair last } }]]. - outerTemps, - (localRefs reject: [:localPair| outerTemps anySatisfy: [:outerPair| localPair first = outerPair first]])]]! Item was removed: - ----- Method: DebuggerMethodMapForClosureCompiledMethods>>privateTempRefsForMethod:startpcsToBlockExtents: (in category 'private but obsolete') ----- - privateTempRefsForMethod: method startpcsToBlockExtents: startpcsToBlockExtents - "Answer the sequence of temps in scope in method in the natural order, - outermost arguments and temporaries first, innermost last. Each temp is - a pair of the temp's name followed by a reference. The reference can be - integer - index of temp in aContext - #( indirectionVectorIndex tempIndex ) - remote temp in indirectionVector at index in aContext - #( outer. temp reference ) - a temp reference in an outer context." - blockExtentsToTempRefs ifNil: - [blockExtentsToTempRefs := (method holdsTempNames - ifTrue: [method] - ifFalse: [methodNode]) blockExtentsToTempsMap. - blockExtentsToTempRefs ifNil: - ["an empty method. shouldn't be able to step into here but it - can happen in weird circumstances (i.e. with MethodWrapper)." - blockExtentsToTempRefs := Dictionary new. - blockExtentsToTempRefs - at: (startpcsToBlockExtents at: method initialPC) - put: {}]. - startpcsToTempRefs := Dictionary new]. - ^startpcsToTempRefs - at: method initialPC - ifAbsentPut: - [blockExtentsToTempRefs at: (startpcsToBlockExtents at: method initialPC)]! Item was added: + ----- Method: DebuggerMethodMapForFullBlockCompiledMethods>>newBlockStartMap (in category 'private') ----- + newBlockStartMap + "If blocks are embedded then keys in the map are simple integer pcs and a Dictionary can be used. + If blocks are full (separate method objects) then keys in the map are CompiledBlocks and + IdentityDictionary must be used to avoid confusing blocks with identical code." + ^WeakIdentityKeyDictionary new! From commits at source.squeak.org Fri Oct 2 19:20:51 2020 From: commits at source.squeak.org (commits at source.squeak.org) Date: Fri, 2 Oct 2020 19:20:51 0000 Subject: [squeak-dev] The Trunk: Tests-eem.438.mcz Message-ID: Eliot Miranda uploaded a new version of Tests to project The Trunk: http://source.squeak.org/trunk/Tests-eem.438.mcz ==================== Summary ==================== Name: Tests-eem.438 Author: eem Time: 2 October 2020, 12:20:47.276738 pm UUID: 13a36e35-c178-4b73-ba5b-0c66407c6d1a Ancestors: Tests-ct.437 ClosureCompilerTest: startKeysToBlockExtents has moved from CompiledMethod to DebuggerMethodMap. =============== Diff against Tests-ct.437 =============== Item was changed: ----- Method: ClosureCompilerTest>>testBlockNumbering (in category 'tests') ----- testBlockNumbering "Test that the compiler and CompiledMethod agree on the block numbering of a substantial doit." "self new testBlockNumbering" self bytecodeSetClassesForTests do: [:class| | methodNode method tempRefs | methodNode := Parser new encoderClass: EncoderForV3PlusClosures; parse: 'foo | numCopiedValuesCounts | numCopiedValuesCounts := Dictionary new. 0 to: 32 do: [:i| numCopiedValuesCounts at: i put: 0]. Transcript clear. Smalltalk allClasses remove: GeniePlugin; do: [:c| {c. c class} do: [:b| Transcript nextPut: b name first; endEntry. b selectorsAndMethodsDo: [:s :m| | pn | m isQuick not ifTrue: [pn := b parserClass new encoderClass: EncoderForV3PlusClosures; parse: (b sourceCodeAt: s) class: b. pn generate. [pn accept: nil] on: MessageNotUnderstood do: [:ex| | msg numCopied | msg := ex message. (msg selector == #visitBlockNode: and: [(msg argument instVarNamed: ''optimized'') not]) ifTrue: [numCopied := (msg argument computeCopiedValues: pn) size. numCopiedValuesCounts at: numCopied put: (numCopiedValuesCounts at: numCopied) + 1]. msg setSelector: #==. ex resume: nil]]]]]. numCopiedValuesCounts' class: Object. method := methodNode generate. tempRefs := methodNode encoder blockExtentsToTempsMap. + self assert: tempRefs keys asSet equals: method debuggerMap startKeysToBlockExtents values asSet]! - self assert: tempRefs keys asSet equals: method startKeysToBlockExtents values asSet]! Item was changed: ----- Method: ClosureCompilerTest>>testBlockNumberingForInjectInto (in category 'tests') ----- testBlockNumberingForInjectInto "Test that the compiler and CompiledMethod agree on the block numbering of Collection>>inject:into: and that temp names for inject:into: are recorded." "self new testBlockNumberingForInjectInto" self bytecodeSetClassesForTests do: [:class| | methodNode method tempRefs | methodNode := Parser new encoderClass: EncoderForV3PlusClosures; parse: (Collection sourceCodeAt: #inject:into:) class: Collection. method := methodNode generate. tempRefs := methodNode encoder blockExtentsToTempsMap. + self assert: tempRefs keys asSet equals: method debuggerMap startKeysToBlockExtents values asSet. - self assert: tempRefs keys asSet equals: method startKeysToBlockExtents values asSet. self assert: ((tempRefs includesKey: (0 to: 6)) and: [(tempRefs at: (0 to: 6)) hasEqualElements: #(('thisValue' 1) ('binaryBlock' 2) ('nextValue' (3 1)))]). self assert: ((tempRefs includesKey: (2 to: 4)) and: [(tempRefs at: (2 to: 4)) hasEqualElements: #(('each' 1) ('binaryBlock' 2) ('nextValue' (3 1)))])]! From commits at source.squeak.org Fri Oct 2 19:24:17 2020 From: commits at source.squeak.org (commits at source.squeak.org) Date: Fri, 2 Oct 2020 19:24:17 0000 Subject: [squeak-dev] The Trunk: Compiler-eem.442.mcz Message-ID: Eliot Miranda uploaded a new version of Compiler to project The Trunk: http://source.squeak.org/trunk/Compiler-eem.442.mcz ==================== Summary ==================== Name: Compiler-eem.442 Author: eem Time: 2 October 2020, 12:24:11.925015 pm UUID: b9e6bdcf-95df-433b-8bbb-b2168a1e8a90 Ancestors: Compiler-pre.441 Make sure that the default return value of a doit is self, not nil. =============== Diff against Compiler-pre.441 =============== Item was changed: ----- Method: Parser>>method:context: (in category 'expression types') ----- method: doit context: ctxt " pattern [ | temporaries ] block => MethodNode." | sap blk prim temps messageComment methodNode | sap := self pattern: doit inContext: ctxt. "sap={selector, arguments, precedence}" self properties selector: (sap at: 1). encoder selector: (sap at: 1). (sap at: 2) do: [:argNode | argNode beMethodArg]. doit ifFalse: [self pragmaSequence]. temps := self temporaries. messageComment := currentComment. currentComment := nil. doit ifFalse: [self pragmaSequence]. prim := self pragmaPrimitives. + self statements: #() innerBlock: false blockNode: BlockNode new. - self statements: #() innerBlock: doit. blk := parseNode. doit ifTrue: [blk returnLast] ifFalse: [blk returnSelfIfNoOther: encoder]. hereType == #doIt ifFalse: [^self expected: 'Nothing more']. methodNode := self newMethodNode comment: messageComment. methodNode selector: (sap at: 1) arguments: (sap at: 2) precedence: (sap at: 3) temporaries: temps block: blk encoder: encoder primitive: prim properties: properties. self interactive ifTrue: [self declareUndeclaredTemps: methodNode. self removeUnusedTemps: methodNode]. ^methodNode! From commits at source.squeak.org Fri Oct 2 19:25:37 2020 From: commits at source.squeak.org (commits at source.squeak.org) Date: Fri, 2 Oct 2020 19:25:37 0000 Subject: [squeak-dev] The Trunk: Compiler-eem.443.mcz Message-ID: Eliot Miranda uploaded a new version of Compiler to project The Trunk: http://source.squeak.org/trunk/Compiler-eem.443.mcz ==================== Summary ==================== Name: Compiler-eem.443 Author: eem Time: 2 October 2020, 12:25:28.42646 pm UUID: c0b19571-c72e-4d7e-9081-41b61e767e6b Ancestors: Compiler-eem.442 Decompiler/CompiledCode: startKeysToBlockExtents has moved from CompiledMethod to DebuggerMethodMap. =============== Diff against Compiler-eem.442 =============== Item was removed: - ----- Method: CompiledBlock>>startKeysToBlockExtents (in category '*Compiler-support') ----- - startKeysToBlockExtents - ^self homeMethod startKeysToBlockExtents! Item was removed: - ----- Method: CompiledMethod>>blockExtentsInto:from:to:method:numberer: (in category '*Compiler-support') ----- - blockExtentsInto: aDictionary from: initialPC to: endPC method: method numberer: numbererBlock - "Support routine for startpcsToBlockExtents" - | pcs extentStart locator scanner blockSizeOrMethodOrLocator | - self flag: 'belongs in DebuggerMethodMap'. - extentStart := numbererBlock value. - locator := BlockStartLocator new. - scanner := InstructionStream new method: method pc: initialPC. - pcs := OrderedCollection new. - [pcs addLast: scanner pc. - scanner pc <= endPC] whileTrue: - [blockSizeOrMethodOrLocator := scanner interpretNextInstructionFor: locator. - blockSizeOrMethodOrLocator ~~ locator ifTrue: - [blockSizeOrMethodOrLocator isInteger - ifTrue: - [self - blockExtentsInto: aDictionary - from: scanner pc - to: scanner pc + blockSizeOrMethodOrLocator - 1 - method: method - numberer: numbererBlock. - scanner pc: scanner pc + blockSizeOrMethodOrLocator] - ifFalse: - [self assert: blockSizeOrMethodOrLocator isCompiledBlock. - self - blockExtentsInto: aDictionary - from: blockSizeOrMethodOrLocator initialPC - to: blockSizeOrMethodOrLocator endPC - method: blockSizeOrMethodOrLocator - numberer: numbererBlock]]]. - aDictionary - at: (method isCompiledBlock - ifTrue: [method] - ifFalse: [initialPC]) - put: (extentStart to: numbererBlock value). - ^aDictionary! Item was removed: - ----- Method: CompiledMethod>>startKeysToBlockExtents (in category '*Compiler-support') ----- - startKeysToBlockExtents - "Answer a Dictionary of start key to Interval of blockExtent, using the - identical numbering scheme described in and orchestrated by - BlockNode>>analyseArguments:temporaries:rootNode:. A start key - identifies a block within a method and is either the startpc for an - embedded block or the block method itself for a full block. This is - used in part to find the temp names for any block in a method, as - needed by the debugger. The other half is to recompile the method, - obtaining the temp names for each block extent. By indirecting through - the blockExtent instead of using the startpc directly we decouple the - debugger's access to temp names from the exact bytecode; insulating - debugging from minor changes in the compiler (e.g. changes in literal - pooling, adding prefix bytecodes, adding inst vars to CompiledMethod - in literals towards the end of the literal frame, etc). If the recompilation - doesn't produce exactly the same bytecode at exactly the same offset - no matter; the blockExtents will be the same." - | index | - self flag: 'belongs in DebuggerMethodMap'. - index := 0. - ^self - blockExtentsInto: self newBlockStartMap - from: self initialPC - to: self endPC - method: self - numberer: [| value | value := index. index := index + 2. value]! Item was changed: ----- Method: Decompiler>>mapFromBlockKeysIn:toTempVarsFrom:constructor: (in category 'initialize-release') ----- mapFromBlockKeysIn: aMethod toTempVarsFrom: schematicTempNamesString constructor: aDecompilerConstructor + "Answer a (n Identity) Dictionary from block start key to sequence of TermpVarNode & RemoteTempVarNode" | startMap tempMap | + "This rather odd construct is to avoid recursion if we used aMethod methodNode startKeysToBlockExtents, + which will invoke this Decompiler if a method has no source." + startMap := (DebuggerMethodMap + forMethod: aMethod + methodNode: nil) startKeysToBlockExtents. - startMap := aMethod startKeysToBlockExtents. tempMap := aMethod mapFromBlockKeys: (startMap keys asArray sort: [:a :b| (startMap at: a) first <= (startMap at: b) first]) toSchematicTemps: schematicTempNamesString. tempMap keysAndValuesDo: [:startKey :tempNameTupleVector| tempNameTupleVector isEmpty ifFalse: [| subMap numTemps tempVector | subMap := Dictionary new. "Find how many temp slots there are (direct & indirect temp vectors) and for each indirect temp vector find how big it is." tempNameTupleVector do: [:tuple| tuple last isArray ifTrue: [subMap at: tuple last first put: tuple last last. numTemps := tuple last first] ifFalse: [numTemps := tuple last]]. "create the temp vector for this scope level." tempVector := Array new: numTemps. "fill it in with any indirect temp vectors" subMap keysAndValuesDo: [:index :size| tempVector at: index put: (Array new: size)]. "fill it in with temp nodes." tempNameTupleVector do: [:tuple| | itv | tuple last isArray ifTrue: [itv := tempVector at: tuple last first. itv at: tuple last last put: (aDecompilerConstructor codeTemp: tuple last last - 1 named: tuple first)] ifFalse: [tempVector at: tuple last put: (aDecompilerConstructor codeTemp: tuple last - 1 named: tuple first)]]. "replace any indirect temp vectors with proper RemoteTempVectorNodes" subMap keysAndValuesDo: [:index :size| tempVector at: index put: (aDecompilerConstructor codeRemoteTemp: index remoteTemps: (tempVector at: index))]. "and update the entry in the map" tempMap at: startKey put: tempVector]]. ^tempMap! From commits at source.squeak.org Fri Oct 2 19:36:06 2020 From: commits at source.squeak.org (commits at source.squeak.org) Date: Fri, 2 Oct 2020 19:36:06 0000 Subject: [squeak-dev] The Trunk: Tools-eem.993.mcz Message-ID: Eliot Miranda uploaded a new version of Tools to project The Trunk: http://source.squeak.org/trunk/Tools-eem.993.mcz ==================== Summary ==================== Name: Tools-eem.993 Author: eem Time: 2 October 2020, 12:35:57.69654 pm UUID: 0d492fb7-b306-4024-9a98-e18603f5d338 Ancestors: Tools-eem.992 Go a little further in speeding up stepping in the debugger. Cache the translation of 'all inst vars' in In szpector. Consequently move CurrentLocale up to Inspector form ContextInspector. Now stepping is pretty good, but even on my 2.9 GHz Core i9 MPB I can click faster than it can keep up, but it doesn't get further than a couple fo sends behind. That's still too slow; it *must* keep up for the debugger to feel comfortable. But we are hopefully only one more source of slow down away now. =============== Diff against Tools-eem.992 =============== Item was changed: Inspector subclass: #ContextInspector instanceVariableNames: '' + classVariableNames: 'CachedStackTopLabel CachedTempVarsLabel' - classVariableNames: 'CachedStackTopLabel CachedTempVarsLabel CurrentLocale' poolDictionaries: '' category: 'Tools-Inspector'! !ContextInspector commentStamp: 'ct 1/12/2020 15:26' prior: 0! I am an Inspector that is specialized for inspecting Contexts.! Item was changed: StringHolder subclass: #Inspector instanceVariableNames: 'object context fields customFields selectionIndex expression contentsTyped fieldListStyler shouldStyleValuePane selectionUpdateTime' + classVariableNames: 'CachedAllInstVarsLabel CurrentLocale' - classVariableNames: '' poolDictionaries: '' category: 'Tools-Inspector'! !Inspector commentStamp: 'mt 4/6/2020 15:16' prior: 0! I am a tool that allows to inspect and modify the internal representation of an object. As a StringHolder, the string I represent is the value of the currently selected inspector field, which may be an instance variable, of the observed object. Beside the #contents in my value pane, I have an extra code pane that holds an #expression to be evaluated on the inspected object -- not the currently selected inspector field. Take a look at my "fields ..." protocols as well as InspectorField. (Note that the idea of "elements" from the CollectionInspector bleeds a little bit down into this interface to simplify the implementation of field truncation as well as #inspectOne. Sorry for that. Usually, the inspected object will only produce "fields" to display, and maybe "items" in a pop-up menu. Only collections have "elements".)! Item was added: + ----- Method: Inspector>>allInstVarsTranslated (in category 'private') ----- + allInstVarsTranslated + "Alas translation is slow enough that we notice the slow down in trying to step in the debugger..." + (CurrentLocale ~= Locale current + or: [CachedAllInstVarsLabel isNil]) ifTrue: + [CurrentLocale := Locale current. + CachedAllInstVarsLabel := 'all inst vars' translated]. + ^CachedAllInstVarsLabel! Item was changed: ----- Method: Inspector>>fieldAllInstVars (in category 'fields') ----- fieldAllInstVars ^ (self newFieldForType: #all key: #allInstVars) + name: self allInstVarsTranslated; emphasizeName; - name: 'all inst vars' translated; emphasizeName; valueGetter: [:object | object longPrintString]; printValueAsIs; yourself! From lewis at mail.msen.com Fri Oct 2 20:06:39 2020 From: lewis at mail.msen.com (David T. Lewis) Date: Fri, 2 Oct 2020 16:06:39 -0400 Subject: [squeak-dev] Curious history In-Reply-To: References: <39CF58F8-AFA5-4BFD-9369-375613ADC72D@rowledge.org> Message-ID: <20201002200639.GA55484@shell.msen.com> On Thu, Oct 01, 2020 at 06:14:58PM -0700, Eliot Miranda wrote: > Hi Tim, > > On Thu, Oct 1, 2020 at 5:35 PM tim Rowledge wrote: > > > > > > > > On 2020-10-01, at 4:57 PM, Robert Withers via Squeak-dev < > > squeak-dev at lists.squeakfoundation.org> wrote: > > > > > > I am curious. Who was the original author of the VMMaker Tool? > > > > That would be me; back in exobox days. Written along with the original > > VMMaker and intended to be an example of clean, tidy, morphic usage. I've > > no idea if anyone ever uses it now, since running it via scripting has > > proven more valuable. > > > > Scripting usage is convenient for generating the whole caboodle, as they > call it. But for one off plugin generation I still use it. It is most > convenient for that. Thank you. > +1 I always use it when working on plugins, and I also use it on a regular basis when working with the classic interpreter VM. A very common thing that I do is generate the code for the platform I an using (i.e. my own computer), and the VMMaker tool is perfect for that. Two button clicks in the image followed by a "make; sudo make install" and I'm on an updated VM. It's very convenient. So thank you :-) Dave From commits at source.squeak.org Fri Oct 2 20:44:33 2020 From: commits at source.squeak.org (commits at source.squeak.org) Date: Fri, 2 Oct 2020 20:44:33 0000 Subject: [squeak-dev] The Trunk: Tools-eem.994.mcz Message-ID: Eliot Miranda uploaded a new version of Tools to project The Trunk: http://source.squeak.org/trunk/Tools-eem.994.mcz ==================== Summary ==================== Name: Tools-eem.994 Author: eem Time: 2 October 2020, 1:44:29.015648 pm UUID: 23145257-280d-4a4a-a4ba-3b5cc367f9a9 Ancestors: Tools-eem.993 Oops! Compiledmethod>>blockExtentsToTempsMap needs to observe that startKeysToBlockExtents has moved to DebuggerMethodMap. =============== Diff against Tools-eem.993 =============== Item was changed: ----- Method: CompiledMethod>>blockExtentsToTempsMap (in category '*Tools-Debugger-support') ----- blockExtentsToTempsMap "If the receiver has been copied with temp names answer a map from blockExtent to temps map in the same format as BytecodeEncoder>>blockExtentsToTempNamesMap. if the receiver has not been copied with temps answer nil." ^self holdsTempNames ifTrue: + [self mapFromBlockKeys: (self debuggerMap startKeysToBlockExtents values sort: [:assocA :assocB| assocA first <= assocB first]) - [self mapFromBlockKeys: (self startKeysToBlockExtents values sort: [:assocA :assocB| assocA first <= assocB first]) toSchematicTemps: self tempNamesString]! From tim at rowledge.org Fri Oct 2 20:52:40 2020 From: tim at rowledge.org (tim Rowledge) Date: Fri, 2 Oct 2020 13:52:40 -0700 Subject: [squeak-dev] Weird Pi Squeak slowdown alert In-Reply-To: References: Message-ID: <81AE03D4-506B-45BF-AC5C-8C0434D5BD3B@rowledge.org> > On 2020-10-01, at 3:19 PM, tim Rowledge wrote: > > This is weird, annoying and driving me nuts. I'm trying everything I can think of to work out what is happening but just in case anybody else here is using Squeak on a Pi4 ... Power supply. Some slow fading of the output voltage lead to the Pi throttling , swap PSU and all seems well. Fetching 27,000 records / sec from a postgreSQL DB on a different machine :-) tim -- tim Rowledge; tim at rowledge.org; http://www.rowledge.org/tim Useful random insult:- His head whistles in a cross wind. From eliot.miranda at gmail.com Fri Oct 2 20:59:04 2020 From: eliot.miranda at gmail.com (Eliot Miranda) Date: Fri, 2 Oct 2020 13:59:04 -0700 Subject: [squeak-dev] The Trunk: Tools-eem.994.mcz In-Reply-To: References: Message-ID: Hi Marcel, Hi Christoph, I emailed the list and cc'ed you to get your attention. Forgive my rude interruption. I finally found out where the slow down really is. It is in Inspector>>fieldList "Return a list of texts that identify the fields for the object under inspection so that the user can make an informed decision on what to inspect." ^ self fieldListStyler ifNil: [self fields collect: [:field | field name]] ifNotNil: [:styler | self updateStyler: styler. self fields collect: [:field | field shouldStyleName ifTrue: [styler styledTextFor: field name asText] ifFalse: [field name]]] So this runs a styler over the entire method every time one steps. And if one is stepping through a doit it will call the decompiler to generate the source to style, every time you step. We have to do better :-) Here's how to profile it. Debug a doit. I wrote this one: | t | t := 0. [| a b c | a := 1. b := 2. c := 100. (a = 1 and: [b = 2 and: [c = 100]]) ifTrue: [1 to: 100 by: 2 do: [:i| t := t + 1]] ifFalse: [a to: c by: b do: [:i| t := t + 1]]] repeat. t Once in the debugger inspect the "Over" button. Then in that inspector evaluate AndreasSystemProfiler spyOn: [1000 timesRepeat: [self performAction]] and you'll see that essentially all the time is going into SHTextStylerST80(SHTextStyler) styledTextFor: On Fri, Oct 2, 2020 at 1:44 PM wrote: > Eliot Miranda uploaded a new version of Tools to project The Trunk: > http://source.squeak.org/trunk/Tools-eem.994.mcz > > ==================== Summary ==================== > > Name: Tools-eem.994 > Author: eem > Time: 2 October 2020, 1:44:29.015648 pm > UUID: 23145257-280d-4a4a-a4ba-3b5cc367f9a9 > Ancestors: Tools-eem.993 > > Oops! Compiledmethod>>blockExtentsToTempsMap needs to observe that > startKeysToBlockExtents has moved to DebuggerMethodMap. > > =============== Diff against Tools-eem.993 =============== > > Item was changed: > ----- Method: CompiledMethod>>blockExtentsToTempsMap (in category > '*Tools-Debugger-support') ----- > blockExtentsToTempsMap > "If the receiver has been copied with temp names answer a > map from blockExtent to temps map in the same format as > BytecodeEncoder>>blockExtentsToTempNamesMap. if the > receiver has not been copied with temps answer nil." > ^self holdsTempNames ifTrue: > + [self mapFromBlockKeys: (self debuggerMap > startKeysToBlockExtents values sort: [:assocA :assocB| assocA first <= > assocB first]) > - [self mapFromBlockKeys: (self startKeysToBlockExtents > values sort: [:assocA :assocB| assocA first <= assocB first]) > toSchematicTemps: self tempNamesString]! > > > -- _,,,^..^,,,_ best, Eliot -------------- next part -------------- An HTML attachment was scrubbed... URL: From Christoph.Thiede at student.hpi.uni-potsdam.de Fri Oct 2 21:18:34 2020 From: Christoph.Thiede at student.hpi.uni-potsdam.de (Thiede, Christoph) Date: Fri, 2 Oct 2020 21:18:34 +0000 Subject: [squeak-dev] The Trunk: Tools-eem.994.mcz In-Reply-To: References: , Message-ID: <97d84f4313964fbc94240523f36e4d05@student.hpi.uni-potsdam.de> Hi Eliot, thanks for the exact steps to reproduce. I will use [1000 timesRepeat: [self performAction]] timeProfile because I don't have the AndreasSystemProfiler. Does ShoutCore-ct.78 from the inbox help you to speed things up? For me, it speeds up the call from 3.84 sec down to 1.07 sec - but still, there happens a lot of redundant shout styling. Hm, why can't we recreate the fields lazily in #fields instead of doing this eagerly in #resetFields? This is how I originally implemented it but then Marcel changed it - I don't know the reason. :-) Best, Christoph ________________________________ Von: Eliot Miranda Gesendet: Freitag, 2. Oktober 2020 22:59:04 An: The general-purpose Squeak developers list; Taeumel, Marcel; Thiede, Christoph Cc: packages at lists.squeakfoundation.org Betreff: Re: [squeak-dev] The Trunk: Tools-eem.994.mcz Hi Marcel, Hi Christoph, I emailed the list and cc'ed you to get your attention. Forgive my rude interruption. I finally found out where the slow down really is. It is in Inspector>>fieldList "Return a list of texts that identify the fields for the object under inspection so that the user can make an informed decision on what to inspect." ^ self fieldListStyler ifNil: [self fields collect: [:field | field name]] ifNotNil: [:styler | self updateStyler: styler. self fields collect: [:field | field shouldStyleName ifTrue: [styler styledTextFor: field name asText] ifFalse: [field name]]] So this runs a styler over the entire method every time one steps. And if one is stepping through a doit it will call the decompiler to generate the source to style, every time you step. We have to do better :-) Here's how to profile it. Debug a doit. I wrote this one: | t | t := 0. [| a b c | a := 1. b := 2. c := 100. (a = 1 and: [b = 2 and: [c = 100]]) ifTrue: [1 to: 100 by: 2 do: [:i| t := t + 1]] ifFalse: [a to: c by: b do: [:i| t := t + 1]]] repeat. t Once in the debugger inspect the "Over" button. Then in that inspector evaluate AndreasSystemProfiler spyOn: [1000 timesRepeat: [self performAction]] and you'll see that essentially all the time is going into SHTextStylerST80(SHTextStyler) styledTextFor: On Fri, Oct 2, 2020 at 1:44 PM > wrote: Eliot Miranda uploaded a new version of Tools to project The Trunk: http://source.squeak.org/trunk/Tools-eem.994.mcz ==================== Summary ==================== Name: Tools-eem.994 Author: eem Time: 2 October 2020, 1:44:29.015648 pm UUID: 23145257-280d-4a4a-a4ba-3b5cc367f9a9 Ancestors: Tools-eem.993 Oops! Compiledmethod>>blockExtentsToTempsMap needs to observe that startKeysToBlockExtents has moved to DebuggerMethodMap. =============== Diff against Tools-eem.993 =============== Item was changed: ----- Method: CompiledMethod>>blockExtentsToTempsMap (in category '*Tools-Debugger-support') ----- blockExtentsToTempsMap "If the receiver has been copied with temp names answer a map from blockExtent to temps map in the same format as BytecodeEncoder>>blockExtentsToTempNamesMap. if the receiver has not been copied with temps answer nil." ^self holdsTempNames ifTrue: + [self mapFromBlockKeys: (self debuggerMap startKeysToBlockExtents values sort: [:assocA :assocB| assocA first <= assocB first]) - [self mapFromBlockKeys: (self startKeysToBlockExtents values sort: [:assocA :assocB| assocA first <= assocB first]) toSchematicTemps: self tempNamesString]! -- _,,,^..^,,,_ best, Eliot -------------- next part -------------- An HTML attachment was scrubbed... URL: From tim at rowledge.org Fri Oct 2 21:37:02 2020 From: tim at rowledge.org (tim Rowledge) Date: Fri, 2 Oct 2020 14:37:02 -0700 Subject: [squeak-dev] The Trunk: Tools-eem.994.mcz In-Reply-To: <97d84f4313964fbc94240523f36e4d05@student.hpi.uni-potsdam.de> References: <97d84f4313964fbc94240523f36e4d05@student.hpi.uni-potsdam.de> Message-ID: <12AA64AA-4DA9-4E6F-9B0F-C70A02BA021A@rowledge.org> Forgive the potentially dumb question, but why exactly does one want to use any sort of styling stuff on fields in an inspector? And if one *does* feel a need for that, since we know quite a lot about what the field labels are, why can one not do some more focussed action than a general 'err, here, style this thing for me'? > On 2020-10-02, at 2:18 PM, Thiede, Christoph wrote: > > Hi Eliot, > > thanks for the exact steps to reproduce. I will use [1000 timesRepeat: [self performAction]] timeProfile because I don't have the AndreasSystemProfiler. > > Does ShoutCore-ct.78 from the inbox help you to speed things up? For me, it speeds up the call from 3.84 sec down to 1.07 sec - but still, there happens a lot of redundant shout styling. > Hm, why can't we recreate the fields lazily in #fields instead of doing this eagerly in #resetFields? This is how I originally implemented it but then Marcel changed it - I don't know the reason. :-) > > Best, > Christoph > Von: Eliot Miranda > Gesendet: Freitag, 2. Oktober 2020 22:59:04 > An: The general-purpose Squeak developers list; Taeumel, Marcel; Thiede, Christoph > Cc: packages at lists.squeakfoundation.org > Betreff: Re: [squeak-dev] The Trunk: Tools-eem.994.mcz > > Hi Marcel, Hi Christoph, > > I emailed the list and cc'ed you to get your attention. Forgive my rude interruption. I finally found out where the slow down really is. It is in > > Inspector>>fieldList > "Return a list of texts that identify the fields for the object under inspection so that the user can make an informed decision on what to inspect." > ^ self fieldListStyler > ifNil: [self fields collect: [:field | field name]] > ifNotNil: [:styler | > self updateStyler: styler. > self fields collect: [:field | > field shouldStyleName > ifTrue: [styler styledTextFor: field name asText] > ifFalse: [field name]]] > > So this runs a styler over the entire method every time one steps. And if one is stepping through a doit it will call the decompiler to generate the source to style, every time you step. We have to do better :-) > > Here's how to profile it. Debug a doit. I wrote this one: > > | t | > t := 0. > [| a b c | > a := 1. b := 2. c := 100. > (a = 1 and: [b = 2 and: [c = 100]]) > ifTrue: > [1 to: 100 by: 2 do: > [:i| t := t + 1]] > ifFalse: > [a to: c by: b do: > [:i| t := t + 1]]] repeat. > t > > Once in the debugger inspect the "Over" button. Then in that inspector evaluate > > AndreasSystemProfiler spyOn: [1000 timesRepeat: [self performAction]] > > and you'll see that essentially all the time is going into SHTextStylerST80(SHTextStyler) styledTextFor: > > On Fri, Oct 2, 2020 at 1:44 PM wrote: > Eliot Miranda uploaded a new version of Tools to project The Trunk: > http://source.squeak.org/trunk/Tools-eem.994.mcz > > ==================== Summary ==================== > > Name: Tools-eem.994 > Author: eem > Time: 2 October 2020, 1:44:29.015648 pm > UUID: 23145257-280d-4a4a-a4ba-3b5cc367f9a9 > Ancestors: Tools-eem.993 > > Oops! Compiledmethod>>blockExtentsToTempsMap needs to observe that startKeysToBlockExtents has moved to DebuggerMethodMap. > > =============== Diff against Tools-eem.993 =============== > > Item was changed: > ----- Method: CompiledMethod>>blockExtentsToTempsMap (in category '*Tools-Debugger-support') ----- > blockExtentsToTempsMap > "If the receiver has been copied with temp names answer a > map from blockExtent to temps map in the same format as > BytecodeEncoder>>blockExtentsToTempNamesMap. if the > receiver has not been copied with temps answer nil." > ^self holdsTempNames ifTrue: > + [self mapFromBlockKeys: (self debuggerMap startKeysToBlockExtents values sort: [:assocA :assocB| assocA first <= assocB first]) > - [self mapFromBlockKeys: (self startKeysToBlockExtents values sort: [:assocA :assocB| assocA first <= assocB first]) > toSchematicTemps: self tempNamesString]! > > > > > -- > _,,,^..^,,,_ > best, Eliot tim -- tim Rowledge; tim at rowledge.org; http://www.rowledge.org/tim Do files get embarrassed when they get unzipped? From herbertkoenig at gmx.net Fri Oct 2 21:42:48 2020 From: herbertkoenig at gmx.net (=?UTF-8?Q?Herbert_K=c3=b6nig?=) Date: Fri, 2 Oct 2020 23:42:48 +0200 Subject: [squeak-dev] Weird Pi Squeak slowdown alert In-Reply-To: <81AE03D4-506B-45BF-AC5C-8C0434D5BD3B@rowledge.org> References: <81AE03D4-506B-45BF-AC5C-8C0434D5BD3B@rowledge.org> Message-ID: <2d58ca71-f966-fcb0-6345-6da769880425@gmx.net> Am 02.10.2020 um 22:52 schrieb tim Rowledge: > Power supply. Some slow fading of the output voltage lead to the Pi throttling , swap PSU and all seems well. Fetching 27,000 records / sec from a postgreSQL DB on a different machine :-) > > That's HARDWARE :-)) Herbert From Christoph.Thiede at student.hpi.uni-potsdam.de Fri Oct 2 22:07:25 2020 From: Christoph.Thiede at student.hpi.uni-potsdam.de (Thiede, Christoph) Date: Fri, 2 Oct 2020 22:07:25 +0000 Subject: [squeak-dev] The Trunk: Tools-eem.994.mcz In-Reply-To: <12AA64AA-4DA9-4E6F-9B0F-C70A02BA021A@rowledge.org> References: <97d84f4313964fbc94240523f36e4d05@student.hpi.uni-potsdam.de>, <12AA64AA-4DA9-4E6F-9B0F-C70A02BA021A@rowledge.org> Message-ID: Hi Tim, I added the styling to the inspector fields because, in my opinion, this helps you to identify different kinds of fields faster. But we should start honoring the preference SHTextStylerST80 syntaxHighlightingAsYouType again, this would allow you to turn off styling in your individual image. > And if one *does* feel a need for that, since we know quite a lot about what the field labels are, why can one not do some more focussed action than a general 'err, here, style this thing for me'? This was simply a question of code quality vs. optimization. One main objective of the recent inspector refactoring was to make it easier to extend/subclass it, and reproducing the styler logic would make this unnecessarily complicated. Also, the styling must honor be updated when the user interface theme is changed, so using Shout out of the box simply looked like the most straightforward and elegant solution to me ... We could also introduce a cache of the styled field titles in Inspector >> #resetFields by computing a hash value from the list of unstyled field titles. Best, Christoph ________________________________ Von: Squeak-dev im Auftrag von tim Rowledge Gesendet: Freitag, 2. Oktober 2020 23:37:02 An: The general-purpose Squeak developers list Cc: packages at lists.squeakfoundation.org Betreff: Re: [squeak-dev] The Trunk: Tools-eem.994.mcz Forgive the potentially dumb question, but why exactly does one want to use any sort of styling stuff on fields in an inspector? And if one *does* feel a need for that, since we know quite a lot about what the field labels are, why can one not do some more focussed action than a general 'err, here, style this thing for me'? > On 2020-10-02, at 2:18 PM, Thiede, Christoph wrote: > > Hi Eliot, > > thanks for the exact steps to reproduce. I will use [1000 timesRepeat: [self performAction]] timeProfile because I don't have the AndreasSystemProfiler. > > Does ShoutCore-ct.78 from the inbox help you to speed things up? For me, it speeds up the call from 3.84 sec down to 1.07 sec - but still, there happens a lot of redundant shout styling. > Hm, why can't we recreate the fields lazily in #fields instead of doing this eagerly in #resetFields? This is how I originally implemented it but then Marcel changed it - I don't know the reason. :-) > > Best, > Christoph > Von: Eliot Miranda > Gesendet: Freitag, 2. Oktober 2020 22:59:04 > An: The general-purpose Squeak developers list; Taeumel, Marcel; Thiede, Christoph > Cc: packages at lists.squeakfoundation.org > Betreff: Re: [squeak-dev] The Trunk: Tools-eem.994.mcz > > Hi Marcel, Hi Christoph, > > I emailed the list and cc'ed you to get your attention. Forgive my rude interruption. I finally found out where the slow down really is. It is in > > Inspector>>fieldList > "Return a list of texts that identify the fields for the object under inspection so that the user can make an informed decision on what to inspect." > ^ self fieldListStyler > ifNil: [self fields collect: [:field | field name]] > ifNotNil: [:styler | > self updateStyler: styler. > self fields collect: [:field | > field shouldStyleName > ifTrue: [styler styledTextFor: field name asText] > ifFalse: [field name]]] > > So this runs a styler over the entire method every time one steps. And if one is stepping through a doit it will call the decompiler to generate the source to style, every time you step. We have to do better :-) > > Here's how to profile it. Debug a doit. I wrote this one: > > | t | > t := 0. > [| a b c | > a := 1. b := 2. c := 100. > (a = 1 and: [b = 2 and: [c = 100]]) > ifTrue: > [1 to: 100 by: 2 do: > [:i| t := t + 1]] > ifFalse: > [a to: c by: b do: > [:i| t := t + 1]]] repeat. > t > > Once in the debugger inspect the "Over" button. Then in that inspector evaluate > > AndreasSystemProfiler spyOn: [1000 timesRepeat: [self performAction]] > > and you'll see that essentially all the time is going into SHTextStylerST80(SHTextStyler) styledTextFor: > > On Fri, Oct 2, 2020 at 1:44 PM wrote: > Eliot Miranda uploaded a new version of Tools to project The Trunk: > http://source.squeak.org/trunk/Tools-eem.994.mcz > > ==================== Summary ==================== > > Name: Tools-eem.994 > Author: eem > Time: 2 October 2020, 1:44:29.015648 pm > UUID: 23145257-280d-4a4a-a4ba-3b5cc367f9a9 > Ancestors: Tools-eem.993 > > Oops! Compiledmethod>>blockExtentsToTempsMap needs to observe that startKeysToBlockExtents has moved to DebuggerMethodMap. > > =============== Diff against Tools-eem.993 =============== > > Item was changed: > ----- Method: CompiledMethod>>blockExtentsToTempsMap (in category '*Tools-Debugger-support') ----- > blockExtentsToTempsMap > "If the receiver has been copied with temp names answer a > map from blockExtent to temps map in the same format as > BytecodeEncoder>>blockExtentsToTempNamesMap. if the > receiver has not been copied with temps answer nil." > ^self holdsTempNames ifTrue: > + [self mapFromBlockKeys: (self debuggerMap startKeysToBlockExtents values sort: [:assocA :assocB| assocA first <= assocB first]) > - [self mapFromBlockKeys: (self startKeysToBlockExtents values sort: [:assocA :assocB| assocA first <= assocB first]) > toSchematicTemps: self tempNamesString]! > > > > > -- > _,,,^..^,,,_ > best, Eliot tim -- tim Rowledge; tim at rowledge.org; http://www.rowledge.org/tim Do files get embarrassed when they get unzipped? -------------- next part -------------- An HTML attachment was scrubbed... URL: From eliot.miranda at gmail.com Fri Oct 2 22:14:47 2020 From: eliot.miranda at gmail.com (Eliot Miranda) Date: Fri, 2 Oct 2020 15:14:47 -0700 Subject: [squeak-dev] Weird Pi Squeak slowdown alert In-Reply-To: <81AE03D4-506B-45BF-AC5C-8C0434D5BD3B@rowledge.org> References: <81AE03D4-506B-45BF-AC5C-8C0434D5BD3B@rowledge.org> Message-ID: <5891F6C6-6AC9-4C8F-991F-6C6FDE1854E0@gmail.com> Hi Tim, > On Oct 2, 2020, at 1:52 PM, tim Rowledge wrote: > >  > >> On 2020-10-01, at 3:19 PM, tim Rowledge wrote: >> >> This is weird, annoying and driving me nuts. I'm trying everything I can think of to work out what is happening but just in case anybody else here is using Squeak on a Pi4 ... > > Power supply. Some slow fading of the output voltage lead to the Pi throttling , swap PSU and all seems well. Fetching 27,000 records / sec from a postgreSQL DB on a different machine :-) So two questions, a) is there a way from software or GUI to find out if the pi is throttling? b) is there a way from software or GUI to find out if the input voltage is dripping oh, and c) how did you debug this? _,,,^..^,,,_ (phone) From marianopeck at gmail.com Fri Oct 2 22:52:22 2020 From: marianopeck at gmail.com (Mariano Martinez Peck) Date: Fri, 2 Oct 2020 19:52:22 -0300 Subject: [squeak-dev] Weird Pi Squeak slowdown alert In-Reply-To: <5891F6C6-6AC9-4C8F-991F-6C6FDE1854E0@gmail.com> References: <81AE03D4-506B-45BF-AC5C-8C0434D5BD3B@rowledge.org> <5891F6C6-6AC9-4C8F-991F-6C6FDE1854E0@gmail.com> Message-ID: Hi Tim, Last week Instantiations presented at RIoT Developer month "Faster & More Efficient: JITs for IoT", an experiment with VA Smalltalk and other languages like Python, Java, etc... the context was how a JIT compiler can also help you reduce energy consumption...which could be very important for IoT. We did experiments on a Raspberry Pi, run some benchmarks and with some hardware tool we were measuring the wattage. You can see the whole presentation here: https://youtu.be/2xO0ohUNnug And here the exact moment that shows the tool used: https://youtu.be/2xO0ohUNnug?t=1818 This is the tool we used: https://www.amazon.com/gp/product/B00O96NRE2/ref=ppx_yo_dt_b_asin_title_o00_s00?ie=UTF8&psc=1 I guess this is not exactly the same as detecting if it is throttling, but maybe it helps. Cheers, On Fri, Oct 2, 2020 at 7:14 PM Eliot Miranda wrote: > Hi Tim, > > > > On Oct 2, 2020, at 1:52 PM, tim Rowledge wrote: > > > >  > > > >> On 2020-10-01, at 3:19 PM, tim Rowledge wrote: > >> > >> This is weird, annoying and driving me nuts. I'm trying everything I > can think of to work out what is happening but just in case anybody else > here is using Squeak on a Pi4 ... > > > > Power supply. Some slow fading of the output voltage lead to the Pi > throttling , swap PSU and all seems well. Fetching 27,000 records / sec > from a postgreSQL DB on a different machine :-) > > So two questions, a) is there a way from software or GUI to find out if > the pi is throttling? b) is there a way from software or GUI to find out if > the input voltage is dripping > > oh, and c) how did you debug this? > > > > _,,,^..^,,,_ (phone) > > -- Mariano Martinez Peck Email: marianopeck at gmail.com Twitter: @MartinezPeck LinkedIn: www.linkedin.com/in/mariano-martinez-peck Blog: https://marianopeck.wordpress.com/ -------------- next part -------------- An HTML attachment was scrubbed... URL: From ma.chris.m at gmail.com Sat Oct 3 00:39:44 2020 From: ma.chris.m at gmail.com (Chris Muller) Date: Fri, 2 Oct 2020 19:39:44 -0500 Subject: [squeak-dev] The Inbox: Tools-ct.986.mcz In-Reply-To: <8CFEB74E-733B-4EC0-9C61-AA301D8F5E31@gmail.com> References: <8CFEB74E-733B-4EC0-9C61-AA301D8F5E31@gmail.com> Message-ID: Hi Eliot, I'll consider that MethodReference shortcut constructor then. Say, how about a single bracket, as in: MyClass > #theMethodSelector I *like this*, because the "Reference" is the highest-level coupling to the object whereas, *then*, when you want to go *deeper* (e.g., its CompiledMethod), there is always still the legacy #>>. And so, if anything, #>>> would go even deeper than that, but I don't know what that would be.. I just checked, looks like it's available. I hope you enjoy the idea of trying to design our API not merely based on what selectors are "still available", but _crafting_ beautiful API that makes sense. Just for analogy, a couple of my favorite high-powered API beauties are the Chronology's original Duration constructors (e.g., "1 minute + 30 seconds"), and also that fantastic SortBlock spaceship operator thingy we added a few years back. > Cool (very) but systemNavigation is tooooooo loooooooong. And unless you > show me an application which implements the selector search high up in the > class hierarchy I accuse you of the tail wagging the fog turfing me to > type s y s t e m N a v I g a t I o n over and over and over again (I got > a spam call yesterday afternoon: > Hello.. > Hello, how are you today sir? > I’m fine, who is this? > I’m so and so from such and such > Ok, and...? > I want to ask you one question. > Fire away > Do you have arthritis? > No (hangs up) > As the first thing I mentioned was code-completion, such an accusation should never have been made. I don't use any of the luxury (OCompletion, etc.) tools, but, at least in my image, I can type as little as "systemN" and the first hit of Cmd+q is it. That's just two more keystrokes for something that, if you're finding yourself typing it a lot, maybe it's a sign of a shortcoming in the IDE browsers that should be improved..? You could also implement #sn as a personal alias.. That's three alternatives to having to type the full "systemNavigation". IMO, developers are tough, we should leave the best, most-basic words like "search" and "help" and "save", available for external applications. "Ma-Search" is just such an application -- to search any Object -- I don't think it implements #search exactly, but I do want to implement that for the interactive (argument-free) version of search:. Regards, Chris -------------- next part -------------- An HTML attachment was scrubbed... URL: From tim at rowledge.org Sat Oct 3 01:04:47 2020 From: tim at rowledge.org (tim Rowledge) Date: Fri, 2 Oct 2020 18:04:47 -0700 Subject: [squeak-dev] Weird Pi Squeak slowdown alert In-Reply-To: <5891F6C6-6AC9-4C8F-991F-6C6FDE1854E0@gmail.com> References: <81AE03D4-506B-45BF-AC5C-8C0434D5BD3B@rowledge.org> <5891F6C6-6AC9-4C8F-991F-6C6FDE1854E0@gmail.com> Message-ID: <25F27C6F-4F5A-4A01-A162-79B1102701E4@rowledge.org> > On 2020-10-02, at 3:14 PM, Eliot Miranda wrote: > > So two questions, a) is there a way from software or GUI to find out if the pi is throttling? b) is there a way from software or GUI to find out if the input voltage is dripping There is existence proof of this in that the menubar has a widget (in Raspbian, at least) that shows the cpu temperature and changes color when it is throttling. I'm making a possibly naive assumption that it actually tells the truth. > > oh, and c) how did you debug this? Oh, the usual way; curse, swear, try ludicrous ideas that make no sense just moments later. Since I have two Pi4, one with an SSD and one without I was able to swap the SSD out and try the uSD to see if it was anything to do with that. I ran an eeprom state updater/checker (remember, unlike the earlier models the Pi 4 has a chunk of eeprom for the hardware boot code) and showed that they were claimed identical. I made sure to run the exact same vm/image on both. Eventually the Pi told me what the problem was itself - a widget I'd never seen before appeared saying 'voltage low. check your power supply'. Well, yes, there you go. I'd not previously considered that throttling was caused by anything other than temperature and was in the middle of writing a post to the Pi forums to ask why the problem Pi was indicating throttled when it was only at 30C, whereas the other was happy up to 50C with no throttling. Lesson learned. Luckily I had another suitable PSU on my desk awaiting a case build for the other Pi 4 so I had one to swap in. All in all, just like debugging an errant Cog. But swearier. tim -- tim Rowledge; tim at rowledge.org; http://www.rowledge.org/tim Java: the best argument for Smalltalk since C++ From tim at rowledge.org Sat Oct 3 01:06:34 2020 From: tim at rowledge.org (tim Rowledge) Date: Fri, 2 Oct 2020 18:06:34 -0700 Subject: [squeak-dev] Weird Pi Squeak slowdown alert In-Reply-To: <2d58ca71-f966-fcb0-6345-6da769880425@gmx.net> References: <81AE03D4-506B-45BF-AC5C-8C0434D5BD3B@rowledge.org> <2d58ca71-f966-fcb0-6345-6da769880425@gmx.net> Message-ID: <68261C02-E882-41F6-A82B-D718B2EB96CF@rowledge.org> > On 2020-10-02, at 2:42 PM, Herbert König wrote: > > Am 02.10.2020 um 22:52 schrieb tim Rowledge: >> Power supply. Some slow fading of the output voltage lead to the Pi throttling , swap PSU and all seems well. Fetching 27,000 records / sec from a postgreSQL DB on a different machine :-) >> >> > That's HARDWARE :-)) That's cool hardware with cool software running a very cool postgreSQL package from levente & co. Now all I have to do is finish porting a multithousand class VW package... with some very 'interesting' design decisions to unwrinkle. tim -- tim Rowledge; tim at rowledge.org; http://www.rowledge.org/tim Klingon Code Warrior:- 6) "Our competitors are without honor!" From tim at rowledge.org Sat Oct 3 01:16:56 2020 From: tim at rowledge.org (tim Rowledge) Date: Fri, 2 Oct 2020 18:16:56 -0700 Subject: [squeak-dev] Weird Pi Squeak slowdown alert In-Reply-To: References: <81AE03D4-506B-45BF-AC5C-8C0434D5BD3B@rowledge.org> <5891F6C6-6AC9-4C8F-991F-6C6FDE1854E0@gmail.com> Message-ID: <17A27EEB-0986-47C8-91C6-FAE2D02644DD@rowledge.org> > On 2020-10-02, at 3:52 PM, Mariano Martinez Peck wrote: > > Hi Tim, > > Last week Instantiations presented at RIoT Developer month "Faster & More Efficient: JITs for IoT", You guys are having a lot of fun. Nice. The real trick for IoT stuff would be to make a system that can run on an ESP32 class chip. I'm pretty sure it's doable, but not easy. The good news is that with built-in WiFi one could do a sort of OOZE/LOOM/network virtual memory thing. And really, just how much development software does a light switch need to load by default? tim -- tim Rowledge; tim at rowledge.org; http://www.rowledge.org/tim Strange OpCodes: DTF: Dump Tape to Floor From commits at source.squeak.org Sat Oct 3 02:26:05 2020 From: commits at source.squeak.org (commits at source.squeak.org) Date: Sat, 3 Oct 2020 02:26:05 0000 Subject: [squeak-dev] The Trunk: Kernel-ct.1321.mcz Message-ID: David T. Lewis uploaded a new version of Kernel to project The Trunk: http://source.squeak.org/trunk/Kernel-ct.1321.mcz ==================== Summary ==================== Name: Kernel-ct.1321 Author: ct Time: 9 April 2020, 7:55:56.724949 pm UUID: 6f8c6c8d-a379-5f46-b774-587e81ddb067 Ancestors: Kernel-eem.1319 Integrates ModificationForbidden into Error hierarchy. This makes ModificationForbidden catchable by #ifError:, TestResult exError and others. See also: http://forum.world.st/Why-is-ModificationForbidden-not-an-Error-td5114717.html Further refactorings applied: - Update class comment (use Smalltalk-typical format, update instvar names and don't hardcode their count) - Use #translated and #format: for message texts - Update method comment of #resume which was copied from Context =============== Diff against Kernel-eem.1319 =============== Item was changed: + Error subclass: #ModificationForbidden - Exception subclass: #ModificationForbidden instanceVariableNames: 'mirror object fieldIndex newValue retrySelector resumptionValue' classVariableNames: '' poolDictionaries: '' category: 'Kernel-Exceptions'! + !ModificationForbidden commentStamp: 'ct 4/9/2020 19:49' prior: 0! + This error is raised when attempting to mutate a read-only object. - !ModificationForbidden commentStamp: 'eem 3/11/2020 15:46' prior: 0! - This exception is raised when attempting to mutate a read-only object. + My instances describe the necessary state to be able to reproduce the modification via the #retryModification protocol. - My instances have 5 fields to be able to reproduce the modification via the retryModification method. + Instance Variables + mirror: + object: + fieldIndex: + newValue: + resumptionValue: + retrySelector: + + mirror + - the object that will perform the modification on object if modificationRetried + + object + - read-only object that attempted to mutate + + fieldIndex + - index of the field in the object mutated, relevant for the corresponding selector + + newValue + - value that was attempted to be stored into the read-only object + + resumptionValue + - value that will be returned when the ModificationForbidden is resumed + + retrySelector + - selector that can be used to reproduce the mutation (#object:basicAt:put:, #object:instVarAt:put:, etc.)! - mirror the object that will perform the modification on object if modificationRetried - object read-only object that attempted to mutate - index index of the field in the object mutated, relevant for the corresponding selector - value value that was attempted to be stored into the read-only object - selector selector that can be used to reproduce the mutation (#object:basicAt:put:, #object:instVarAt:put:, etc)! Item was removed: - ----- Method: ModificationForbidden>>defaultAction (in category 'priv handling') ----- - defaultAction - UnhandledError signalForException: self! Item was changed: ----- Method: ModificationForbidden>>indexedMessageText (in category 'printing') ----- indexedMessageText + + ^ 'Cannot modify field {2} of read-only object {1}' translated + format: { + self printObject: object. + fieldIndex }! - ^String streamContents: - [ :s | - s << ' '. - self printObject: object on: s. - s << ' is read-only, hence its field '. - fieldIndex printOn: s. - s << ' cannot be modified with '. - self printObject: newValue on: s]! Item was added: + ----- Method: ModificationForbidden>>isResumable (in category 'priv handling') ----- + isResumable + + ^ true! Item was changed: ----- Method: ModificationForbidden>>nonIndexedMessageText (in category 'printing') ----- nonIndexedMessageText + + ^ 'Cannot execute {2} on read-only object {1}' translated + format: { + self printObject: object. + retrySelector printString }! - ^String streamContents: - [ :s | - s << ' '. - self printObject: object on: s. - s << ' is read-only, hence its selector '. - s << retrySelector. - s << ' cannot be executed with '. - self printObject: newValue on: s]! Item was added: + ----- Method: ModificationForbidden>>printObject: (in category 'private') ----- + printObject: obj + + ^ [obj printString] + ifError: ['' translated]! Item was removed: - ----- Method: ModificationForbidden>>printObject:on: (in category 'printing') ----- - printObject: obj on: s - [obj printOn: s] - on: Exception - do: [ :ex | s << '' ]! Item was changed: ----- Method: ModificationForbidden>>resume (in category 'controlling') ----- resume + "Return from the message that signaled the receiver." - "Roll back thisContext to self and resume. Execute unwind blocks when rolling back. ASSUMES self is a sender of thisContext" + ^ self resume: resumptionValue! - self resume: resumptionValue! From commits at source.squeak.org Sat Oct 3 02:26:31 2020 From: commits at source.squeak.org (commits at source.squeak.org) Date: Sat, 3 Oct 2020 02:26:31 0000 Subject: [squeak-dev] The Trunk: Kernel-dtl.1343.mcz Message-ID: David T. Lewis uploaded a new version of Kernel to project The Trunk: http://source.squeak.org/trunk/Kernel-dtl.1343.mcz ==================== Summary ==================== Name: Kernel-dtl.1343 Author: dtl Time: 2 October 2020, 10:26:27.397227 pm UUID: 1fcc87a9-8b18-4a84-b240-4dd9f24cfa46 Ancestors: Kernel-eem.1342, Kernel-ct.1321 Merge Kernel-ct.1321 per http://lists.squeakfoundation.org/pipermail/squeak-dev/2020-October/211967.html =============== Diff against Kernel-eem.1342 =============== Item was changed: + Error subclass: #ModificationForbidden - Exception subclass: #ModificationForbidden instanceVariableNames: 'mirror object fieldIndex newValue retrySelector resumptionValue' classVariableNames: '' poolDictionaries: '' category: 'Kernel-Exceptions'! + !ModificationForbidden commentStamp: 'ct 4/9/2020 19:49' prior: 0! + This error is raised when attempting to mutate a read-only object. - !ModificationForbidden commentStamp: 'eem 3/11/2020 15:46' prior: 0! - This exception is raised when attempting to mutate a read-only object. + My instances describe the necessary state to be able to reproduce the modification via the #retryModification protocol. - My instances have 5 fields to be able to reproduce the modification via the retryModification method. + Instance Variables + mirror: + object: + fieldIndex: + newValue: + resumptionValue: + retrySelector: + + mirror + - the object that will perform the modification on object if modificationRetried + + object + - read-only object that attempted to mutate + + fieldIndex + - index of the field in the object mutated, relevant for the corresponding selector + + newValue + - value that was attempted to be stored into the read-only object + + resumptionValue + - value that will be returned when the ModificationForbidden is resumed + + retrySelector + - selector that can be used to reproduce the mutation (#object:basicAt:put:, #object:instVarAt:put:, etc.)! - mirror the object that will perform the modification on object if modificationRetried - object read-only object that attempted to mutate - index index of the field in the object mutated, relevant for the corresponding selector - value value that was attempted to be stored into the read-only object - selector selector that can be used to reproduce the mutation (#object:basicAt:put:, #object:instVarAt:put:, etc)! Item was removed: - ----- Method: ModificationForbidden>>defaultAction (in category 'priv handling') ----- - defaultAction - UnhandledError signalForException: self! Item was changed: ----- Method: ModificationForbidden>>indexedMessageText (in category 'printing') ----- indexedMessageText + + ^ 'Cannot modify field {2} of read-only object {1}' translated + format: { + self printObject: object. + fieldIndex }! - ^String streamContents: - [ :s | - s << ' '. - self printObject: object on: s. - s << ' is read-only, hence its field '. - fieldIndex printOn: s. - s << ' cannot be modified with '. - self printObject: newValue on: s]! Item was added: + ----- Method: ModificationForbidden>>isResumable (in category 'priv handling') ----- + isResumable + + ^ true! Item was changed: ----- Method: ModificationForbidden>>nonIndexedMessageText (in category 'printing') ----- nonIndexedMessageText + + ^ 'Cannot execute {2} on read-only object {1}' translated + format: { + self printObject: object. + retrySelector printString }! - ^String streamContents: - [ :s | - s << ' '. - self printObject: object on: s. - s << ' is read-only, hence its selector '. - s << retrySelector. - s << ' cannot be executed with '. - self printObject: newValue on: s]! Item was added: + ----- Method: ModificationForbidden>>printObject: (in category 'private') ----- + printObject: obj + + ^ [obj printString] + ifError: ['' translated]! Item was removed: - ----- Method: ModificationForbidden>>printObject:on: (in category 'printing') ----- - printObject: obj on: s - [obj printOn: s] - on: Exception - do: [ :ex | s << '' ]! Item was changed: ----- Method: ModificationForbidden>>resume (in category 'controlling') ----- resume + "Return from the message that signaled the receiver." - "Roll back thisContext to self and resume. Execute unwind blocks when rolling back. ASSUMES self is a sender of thisContext" + ^ self resume: resumptionValue! - self resume: resumptionValue! From lewis at mail.msen.com Sat Oct 3 02:29:44 2020 From: lewis at mail.msen.com (David T. Lewis) Date: Fri, 2 Oct 2020 22:29:44 -0400 Subject: [squeak-dev] Can Kernel-ct.1321 be merged into trunk now? (was: Why is ModificationForbidden not an Error?) In-Reply-To: References: <7cdc2ad647ff4d67bc0cc0aec6a184ea@student.hpi.uni-potsdam.de> <20200930172630.GA50082@shell.msen.com> <20200930195906.GA75715@shell.msen.com> Message-ID: <20201003022944.GA9837@shell.msen.com> On Thu, Oct 01, 2020 at 11:40:16AM -0700, Eliot Miranda wrote: > On Wed, Sep 30, 2020 at 12:59 PM David T. Lewis wrote: > > > Changing the subject line to ask the question directly. > > > > Can Kernel-ct.1321 be merged into trunk now? > > > > I have no objection. > Done - thanks Christoph. Dave From trygver at ifi.uio.no Sat Oct 3 06:47:57 2020 From: trygver at ifi.uio.no (Trygve Reenskaug) Date: Sat, 3 Oct 2020 08:47:57 +0200 Subject: [squeak-dev] =?utf-8?q?A_Sad_Day_=E2=80=93_concluded?= In-Reply-To: References: <05fa2ced-b4fd-f8a4-a6f1-2f50ed04b272@ifi.uio.no> Message-ID: <63d57fb2-3110-3762-7a8c-14ae6d6ef038@ifi.uio.no> Dear Sumim, Thank you for your kind words. The latest version of Loke/BabyIDE written on Squeak3.10.2 is at https://data.mendeley.com/datasets/5xxgzv7fsp/1 The image is my program repository. It includes some examples of DCI programming, Ellen's Personal Programming IDE, Squeak Reverse Engineering (SRE), and more. Best --Trygve On 2020-10-02 20:14, masato sumi wrote: > Dear Trygve, > > Thank you for your very long term contribution and efforts. > > I'm very sorry that I couldn't help you at all now. > > I'm afraid, but could you please make your latest version of > Loke/BabyIDE written on Squeak3.10.2 available for future generations > of researchers and/or followers? > > Anyway, I think your ideas and thoughts should be passed on to future > generations as faithfully as we can possible, and I myself will try to > make sure that. > > Thank you so much and goodbye. > Please take care of yourself. > > -- > sumim > > 2020-10-03 0:54 Trygve Reenskaug >: > > Dear all, > I need to use many words to explore why I can't understand current > Squeak code. I believe the reason is a profound one, and I hope > some of you have the patience to read about it. > > Thank you for your responses to my 'A Sad Day'-message. One > response said >  "/But please don't give up as an inventor of MVC, which has > simplified writing software for all of us.// > //We need new ideas to stabilize Smalltalk." > > /As to MVC, it was received with acclamation when I first > presented it at PARC in 1978, and people suggested I should make > it the theme of my article in the special Smalltalk issue of Byte. > I couldn't understand it; MVC was so simple and obvious that is > was not worth writing about it. Nevertheless, people seem to have > problems understanding MVC. It took me a long time before I > gleaned what was going on. The explanation is a deep one, rooted > in our different mental paradigms. > > From around 1970, I was working on Prokon, a distributed system > for managers in the shipbuilding industry: > >  Every manager has their own computer that they use for > augmenting their mind. The manager understands their software > and ideally writes it themselves. Managers delegate > conversations with other managers to their computer's M-to-M > network. (Marked with a heavy black line in the figure). I > chose "distributed planning with central control" as my > example project. Each manager creates a plan for their > department, using apps suited to their particular needs. A > */distributed algorithm/* ensures consistency across departments. > > I came to PARC in 1978 and could immediately relate to the > Smalltalk image with its universe of collaborating objects. Alan's > definition of object-orientation fitted my Prokon model: "Thus its > semantics are a bit like having thousands and thousands of > computers all hooked together by a very fast network." > > MVC prescribes a network of communicating objects. Any object can > fill one or more positions in the network as long as it has the > required behavior; their classes are irrelevant. It's so simple > that it's not worth writing about it. > > > ==================== > > The work on this post was interrupted at this point by an > unexpected week in hospital. It gave me quiet days of pondering > the futility of what I am doing and I will be terminating my > memberships in the Pharo and Squeak mailing lists. I have also > deleted most of the old draft of this message and will quickly > conclude with two observations: > > 1. > > > The Smalltalk image is a universe of communicating objects. I > call it an object computer. It can be seen as the model of an > entirely new kind of computer, a model on a level closer to > the human mind than the von Neumann model of 1948. The new > model is communication-centric and should supersede the > ubiquitous CPU-centric model as soon as possible. Working out > the details of this idea could make an exciting and disruptive > Ph.D. thesis. > 2. > > Smalltalk is called a programming language. It is a curious > one, very different from well-known languages like Java with > their syntax and semantics. Smalltalk, as a programming > language, does not have the concept of a program. Smalltalk, > as a class-oriented language, does not have syntax for the > declaration of a class. Smalltalk, as an object-oriented > language, can't describe how objects collaborate to achieve a > goal. You appear to be happy with this state of affairs, at > least, I see no sign of anybody wanting to move on from the > unfinished Smalltalk language to a mature development > environment. I do not find it satisfactory and it is not > acceptable to the intended managers populating the distributed > system shown in the first picture. Consequently, I have done > something about it as described in my SoSym article "/Personal > Programming and the Object Computer./" I am tired of being > alone in my endeavors and this ends my work with Squeak and > other Smalltalks. I wish you health and happiness wherever you > happen to be. > > Trygve > Personal programming and the object computer > https://doi.org/10.1007/s10270-019-00768-3 > > -- > > /The essence of object orientation is that objects collaborateto > achieve a goal. / > Trygve Reenskaug mailto: trygver at ifi.uio.no > > Morgedalsvn. 5A http://folk.uio.no/trygver/ > N-0378 Oslo http://fullOO.info > Norway                     Tel: (+47) 468 58 625 > > > -- /The essence of object orientation is that objects collaborateto achieve a goal. / Trygve Reenskaug mailto: trygver at ifi.uio.no Morgedalsvn. 5A http://folk.uio.no/trygver/ N-0378 Oslo http://fullOO.info Norway                     Tel: (+47) 468 58 625 -------------- next part -------------- An HTML attachment was scrubbed... URL: -------------- next part -------------- A non-text attachment was scrubbed... Name: kjjbmoogpajdimke.png Type: image/png Size: 45740 bytes Desc: not available URL: -------------- next part -------------- A non-text attachment was scrubbed... Name: cljooepacomafihh.png Type: image/png Size: 22069 bytes Desc: not available URL: From herbertkoenig at gmx.net Sat Oct 3 08:28:36 2020 From: herbertkoenig at gmx.net (=?UTF-8?Q?Herbert_K=c3=b6nig?=) Date: Sat, 3 Oct 2020 10:28:36 +0200 Subject: [squeak-dev] Weird Pi Squeak slowdown alert In-Reply-To: <68261C02-E882-41F6-A82B-D718B2EB96CF@rowledge.org> References: <81AE03D4-506B-45BF-AC5C-8C0434D5BD3B@rowledge.org> <2d58ca71-f966-fcb0-6345-6da769880425@gmx.net> <68261C02-E882-41F6-A82B-D718B2EB96CF@rowledge.org> Message-ID: <5635386b-67a0-ce02-1bcf-bc1df7dc8edf@gmx.net> Am 03.10.2020 um 03:06 schrieb tim Rowledge: > >> On 2020-10-02, at 2:42 PM, Herbert König wrote: >> >> Am 02.10.2020 um 22:52 schrieb tim Rowledge: >>> Power supply. Some slow fading of the output voltage lead to the Pi throttling , swap PSU and all seems well. Fetching 27,000 records / sec from a postgreSQL DB on a different machine :-) >>> >>> >> That's HARDWARE :-)) > That's cool hardware with cool software running a very cool postgreSQL package from levente & co. Now all I have to do is finish porting a multithousand class VW package... with some very 'interesting' design decisions to unwrinkle. > > > tim > -- > tim Rowledge; tim at rowledge.org; http://www.rowledge.org/tim > Klingon Code Warrior:- 6) "Our competitors are without honor!" > > > Was a joke, me owning 7 up to now. One A+ running Squeak 24/7 with 60% load. Living outside since 2014. Sometimes cool sometimes hot. When done in some years it will send a Bobby Car to the pooing cat. Cheers, Herbert -------------- next part -------------- A non-text attachment was scrubbed... Name: 2020-10-02T01 21 30.80743702 00Max 11.4.jpg Type: image/jpeg Size: 28755 bytes Desc: not available URL: From bruce.oneel at pckswarms.ch Sat Oct 3 09:03:49 2020 From: bruce.oneel at pckswarms.ch (Bruce O'Neel) Date: Sat, 03 Oct 2020 11:03:49 +0200 Subject: [squeak-dev] Weird Pi Squeak slowdown alert In-Reply-To: <25F27C6F-4F5A-4A01-A162-79B1102701E4@rowledge.org> References: <25F27C6F-4F5A-4A01-A162-79B1102701E4@rowledge.org> <81AE03D4-506B-45BF-AC5C-8C0434D5BD3B@rowledge.org> <5891F6C6-6AC9-4C8F-991F-6C6FDE1854E0@gmail.com> Message-ID: <1601715829-66e64d409ad2e8c2356e953269ef3b1d@pckswarms.ch> >From the command line...  Do note that I log in over X so nothing gets plugged in or removed from the USB ports.   1.  dmesg should be pretty clean.  Those times on the left are in seconds since boot. [   23.088460] Bluetooth: BNEP (Ethernet Emulation) ver 1.3 [   23.088467] Bluetooth: BNEP filters: protocol multicast [   23.088479] Bluetooth: BNEP socket layer initialized [   23.124540] Bluetooth: RFCOMM TTY layer initialized [   23.124559] Bluetooth: RFCOMM socket layer initialized [   23.124577] Bluetooth: RFCOMM ver 1.11  10:54:29 up 18 days, 15:37,  1 user,  load average: 0.00, 0.00, 0.00 2. Mine is not throttling now but my memory is that one of the following commands will give you some lines sudo zgrep -i throt  /var/log/messages*.gz sudo zgrep -i throt  /var/log/syslog*.gz 3.  There is a vcgencmd get_throttled [http://raspberrypi.stackexchange.com/questions/83184/ddg#83185](http://raspberrypi.stackexchange.com/questions/83184/ddg#83185) vcgencmd is an interesting command for many of these sorts of things.  You can measure the CPU and GPU temp. cheers bruce > > On 2020-10-02, at 3:14 PM, Eliot Miranda wrote: > > > > So two questions, a) is there a way from software or GUI to find out if the pi is throttling? b) is there a way from software or GUI to find out if the input voltage is dripping > > There is existence proof of this in that the menubar has a widget (in Raspbian, at least) that shows the cpu temperature and changes color when it is throttling. I'm making a possibly naive assumption that it actually tells the truth. > > > > > oh, and c) how did you debug this? > > Oh, the usual way; curse, swear, try ludicrous ideas that make no sense just moments later. Since I have two Pi4, one with an SSD and one without I was able to swap the SSD out and try the uSD to see if it was anything to do with that. I ran an eeprom state updater/checker (remember, unlike the earlier models the Pi 4 has a chunk of eeprom for the hardware boot code) and showed that they were claimed identical. I made sure to run the exact same vm/image on both. > > Eventually the Pi told me what the problem was itself - a widget I'd never seen before appeared saying 'voltage low. check your power supply'. Well, yes, there you go. I'd not previously considered that throttling was caused by anything other than temperature and was in the middle of writing a post to the Pi forums to ask why the problem Pi was indicating throttled when it was only at 30C, whereas the other was happy up to 50C with no throttling. Lesson learned. > Luckily I had another suitable PSU on my desk awaiting a case build for the other Pi 4 so I had one to swap in. > > All in all, just like debugging an errant Cog. But swearier. > > > tim > -- > tim Rowledge; tim at rowledge.org; http://www.rowledge.org/tim > Java: the best argument for Smalltalk since C++ -------------- next part -------------- An HTML attachment was scrubbed... URL: From gettimothy at zoho.com Sat Oct 3 10:56:36 2020 From: gettimothy at zoho.com (gettimothy) Date: Sat, 03 Oct 2020 06:56:36 -0400 Subject: [squeak-dev] "Pretty Print" collections as abstract syntax trees using plain text output In-Reply-To: References: <174e381dcff.eeb497c783798.6677692293294794906@zoho.com> <174e55bd5a7.c014fa865127.2243320247035478891@zoho.com> <174e57d48d9.baa6934d5684.7800204521222000565@zoho.com> <5E0863C4-2CFB-4AE0-A4DD-A12EE89DA00E@dcc.uchile.cl> Message-ID: <174ee1b3bca.d7b4540128778.8829159998323510248@zoho.com> I am currently familiarizing myself with the new-fangled git tools and after that  will be checking to see if Squeak can run the Cairo and Athens. Also, since the diagram shows that Cairo sits on top of OpenGL, I will check the OpenGL on the pharo-9 bleeding edge and if it works, correlate with openGL on squeak6.0 alpha. funny quirk is that Roassal3 is installed on the pristine image of pharo9, and there is Athens installed, but I do not see Cairo or OpenGL installed. Perhaps they are in the Athens Baseline, or I don't know where to look. cheers. ---- On Thu, 01 Oct 2020 15:58:00 -0400 Alexandre Bergel wrote ---- The GitHub of Roassal3 is https://github.com/ObjectProfile/Roassal3 I am not sure what are the difference between Pharo and Squeak. Long time I have not looked in detail. Roassal3 comes with plenty of unit tests. I guess than the starting point is to make the test pass.  Does Squeak has Athens / Cairo?  Cheers, Alexandre --  _,.;:~^~:;._,.;:~^~:;._,.;:~^~:;._,.;:~^~:;._,.;: Alexandre Bergel  http://www.bergel.eu ^~:;._,.;:~^~:;._,.;:~^~:;._,.;:~^~:;._,.;:~^~:;. On 01-10-2020, at 16:36, Eliot Miranda wrote: Hi Alexandre,   where are the Rossal repositories?  If we wanted to begin a port, what would be the best starting point? On Thu, Oct 1, 2020 at 12:28 PM Alexandre Bergel wrote: I think that Glamorous toolkit has its own visualization engine, unrelated to Roassal Alexandre --  _,.;:~^~:;._,.;:~^~:;._,.;:~^~:;._,.;:~^~:;._,.;: Alexandre Bergel  http://www.bergel.eu/ ^~:;._,.;:~^~:;._,.;:~^~:;._,.;:~^~:;._,.;:~^~:;. On 01-10-2020, at 15:47, gettimothy wrote: Hi Eiliot, re:  I don't see any mention of Rossal in the below.  What's the linkage between feek's use of either opensmalltalk-vm or Pharo's fork of it? IIRC Glamorous Toolkit  and Rossal are related; perhaps I have conflated the two. at  https://feenk.com/gt/ you can see the tree graphs I have in mind. ---- On Thu, 01 Oct 2020 14:24:24 -0400 Eliot Miranda wrote ---- Hi t, On Thu, Oct 1, 2020 at 11:11 AM gettimothy wrote: Hi Eliot ---- On Thu, 01 Oct 2020 11:07:08 -0400 Eliot Miranda wrote ---- Hi Tty,I don't see any mention of Rossal in the below.  What's the linkage between feek's use of either opensmalltalk-vm or Pharo's fork of it? On Oct 1, 2020, at 2:33 AM, gettimothy via Squeak-dev wrote: Hi folks. Has anybody coded a way , using plain text, to output a  https://en.wikipedia.org/wiki/Abstract_syntax_tree to a workspace? It would be a handy debug tool if so. An infinitely better way would be to port the Rossal visualisation system.  I’ve talked with Alexandre and he says Rossal is designed with portability in mind (it currently runs on Pharo and BisyalWorks and predates Pharo’s current imaging model).  This would give you a graphical representation of the entire tree, with the ability to attach behaviour to elements of the representation. thx I would love too, Rossal is intriguing. IIRC , "Mr. Feenk" and the board had a thread recently about "what it would take to make Rossal work on  Squeak" and the discussion decided on waiting on everybody having a block of time to make that happen. I don't see any mention of Rossal in the below.  What's the linkage between feek's use of either opensmalltalk-vm or Pharo's fork of it? Here is a cut-n-paste of that email, I saved it for future reference: Hi, Currently, at feenk we have feenkcom/opensmalltalk-vm: https://github.com/feenkcom/opensmalltalk-vm This is a small fork of the headless branch from pharo-project/opensmalltalk-vm that appeared out of practical necessities, but that we would like to avoid having. This post briefly describes the changes in the feenkcom/opensmalltalk-vm repo and the functionality those changes provide for Glamorous Toolkit. For Glamorous Toolkit we aimed for the following functionality:     • Open the GUI natively and have native display quality (GUI opened through FFI calls)     • Have a Glamorous Toolkit app for Mac OS that works as any other apps for Mac OS     • Create end-user applications that are fully customisable (executable name, menus, etc)     • Use Github actions for doing all compilations of external libraries and the vm instead of Travis CI.     • Have Iceberg running in native windows (which requires nested FFI callbacks) There has been work on these issues in both OpenSmalltalk/opensmalltalk-vm and pharo-project/opensmalltalk-vm but they were not entirely addressed. We needed to have something reliable a few months ago, and forking and doing some quick changes made that possible. Ideally we want to be able to run Glamorous Toolkit on both OpenSmalltalk/opensmalltalk-vm and pharo-project/opensmalltalk-vm. To have native GUIs we relied on Ronie Salgado’s work on the headless vm and started with pharo-project/opensmalltalk-vm - headless branch: https://github.com/pharo-project/opensmalltalk-vm/tree/headless That provided a solution for opening the GUI from the image through FFI calls. Currently we use Glutin (a library for OpenGL context creation, written in pure Rust) and this made it possible to run the entire Glamorous Toolkit inside a callback. On macOS when running an app, even a notarized one, the OS warns the user that the app is downloaded from the internet, and the user needs to confirm that they agree. Once the user agrees the app should automatically start. This is not currently possible with Pharo apps (for example PharoLaunched.app) and users have to again run the app manually after giving permission. Also Gatekeeper in macOS runs applications downloaded from zips in a randomized read-only DMG. We do not want this behaviour as users not copying Glamorous Toolkit to the Applications folder on macOS would then experience incorrect application behaviour. To create end-user applications we also need to fully customize the executable name (what the user sees in the Task Runner/Activity monitor), icons, native menus. Part of this work is already integrated in the pharo-project/opensmalltalk-vm - headless branch (Customizing the OS X icons, Brand the VM executable and package). Since last year Github offers Github Actions similar to Travis. We found it much easier to use than Travis for external libraries and the vm. Also we get to manage the code and the builds in the same place. This work is already integrated in the pharo-project/opensmalltalk-vm - headless branch (Build the VM under GitHub actions: https://github.com/pharo-project/opensmalltalk-vm/pull/56). The issues related to running Iceberg is a bit more technical. By moving to the headless vm we are running the entire image computation inside a callback from Glutin (https://github.com/rust-windowing/glutin/). When using Iceberg we get nested callbacks which we could not get to work using Alien. Instead we are using the ThreadedFFI Plugin and running all callback from Iceberg and Glutin using the Threaded FFI plugin (https://github.com/pharo-project/threadedFFI-Plugin). Currently we have a small fork of this plugin (feenkcom/threadedFFI-Plugin) and we also ship a custom plugin with the VM to fix a race condition due to having two copies of the callback stack (a pull request is here: https://github.com/pharo-project/threadedFFI-Plugin/pull/17). While not specific to our environment, openssl1.0 is no longer supported, and we are seeing users who are unable to run Pharo due to version conflicts, as reported in https://github.com/pharo-project/opensmalltalk-vm/issues/62. To sum up, a fork was the easiest way to get all this running. Now some changes are already in the pharo-project/opensmalltalk-vm - headless branch. What we are still missing are the changes that get the VM to work nicely with Mac OS and a bug fix in ThreadedFFI. We would also love it to have all these changes integrated in OpenSmalltalk/opensmalltalk-vm in the headless vm. This requires additional coordination as the required changes are somewhat deeper. Please let us know you would prefer to coordinate. Cheers, Tudor, on behalf of the feenk team -- http://feenk.com/ "The coherence of a trip is given by the clearness of the goal." If these things have already happened, I can push (most) other projects down the stack and take this up part-time.  Let me know. Wow, that's quite an offer.  I wish I could devote time to this, and probably won't be able to stay away once it starts, but for the moment I have other commitments precluding joining in this effort.  If not, I briefly looked into piping output to graphviz via OSProcess . Regardless, the tool would be invaluable in groking / debugging the PEG grammars. cheers, t _,,,^..^,,,_ best, Eliot --  _,.;:~^~:;._,.;:~^~:;._,.;:~^~:;._,.;:~^~:;._,.;: Alexandre Bergel  http://www.bergel.eu/ ^~:;._,.;:~^~:;._,.;:~^~:;._,.;:~^~:;._,.;:~^~:;. _,,,^..^,,,_ best, Eliot -------------- next part -------------- An HTML attachment was scrubbed... URL: From commits at source.squeak.org Sat Oct 3 10:57:16 2020 From: commits at source.squeak.org (commits at source.squeak.org) Date: Sat, 3 Oct 2020 10:57:16 0000 Subject: [squeak-dev] The Inbox: Monticello-tobe.729.mcz Message-ID: A new version of Monticello was added to project The Inbox: http://source.squeak.org/inbox/Monticello-tobe.729.mcz ==================== Summary ==================== Name: Monticello-tobe.729 Author: tobe Time: 3 October 2020, 12:57:12.690975 pm UUID: cbe1a05f-97e6-4780-9762-824be701f76a Ancestors: Monticello-ul.728 Include a dot when matching against extensions Packages of extension-less formats (e.g. tonel) will otherwise match for e.g. the MCStReader in MCReader>>#canReadFileNamed: if their name happens to end on an "st", e.g. "Roassal3-Sunburst" =============== Diff against Monticello-ul.728 =============== Item was changed: ----- Method: MCVersionReader class>>canReadFileNamed: (in category 'testing') ----- canReadFileNamed: fileName + ^ (fileName endsWith: '.', self extension)! - ^ (fileName endsWith: self extension)! From sumi at seagreen.ocn.ne.jp Sat Oct 3 10:56:43 2020 From: sumi at seagreen.ocn.ne.jp (masato sumi) Date: Sat, 3 Oct 2020 19:56:43 +0900 Subject: [squeak-dev] =?utf-8?q?A_Sad_Day_=E2=80=93_concluded?= In-Reply-To: <63d57fb2-3110-3762-7a8c-14ae6d6ef038@ifi.uio.no> References: <05fa2ced-b4fd-f8a4-a6f1-2f50ed04b272@ifi.uio.no> <63d57fb2-3110-3762-7a8c-14ae6d6ef038@ifi.uio.no> Message-ID: Dear Trygve, I confirmed that I could launch the Loke/BabyIDE image with the included SqueakVM for Windows (8.1 and 10) and I could also launch it in a web browser by using the SqueakJS VM ( https://squeak.js.org/run ). Thank you very much. -- sumim 2020-10-03 15:48 Trygve Reenskaug : > Dear Sumim, > Thank you for your kind words. > > The latest version of Loke/BabyIDE written on Squeak3.10.2 is at > https://data.mendeley.com/datasets/5xxgzv7fsp/1 > The image is my program repository. It includes some examples of DCI > programming, Ellen's Personal Programming IDE, Squeak Reverse Engineering > (SRE), and more. > > Best > --Trygve > > On 2020-10-02 20:14, masato sumi wrote: > > Dear Trygve, > > Thank you for your very long term contribution and efforts. > > I'm very sorry that I couldn't help you at all now. > > I'm afraid, but could you please make your latest version of Loke/BabyIDE > written on Squeak3.10.2 available for future generations of researchers > and/or followers? > > Anyway, I think your ideas and thoughts should be passed on to future > generations as faithfully as we can possible, and I myself will try to make > sure that. > > Thank you so much and goodbye. > Please take care of yourself. > > -- > sumim > > 2020-10-03 0:54 Trygve Reenskaug : > >> Dear all, >> I need to use many words to explore why I can't understand current Squeak >> code. I believe the reason is a profound one, and I hope some of you have >> the patience to read about it. >> >> Thank you for your responses to my 'A Sad Day'-message. One response said >> "*But please don't give up as an inventor of MVC, which has simplified >> writing software for all of us.* >> >> >> *We need new ideas to stabilize Smalltalk." *As to MVC, it was received >> with acclamation when I first presented it at PARC in 1978, and people >> suggested I should make it the theme of my article in the special Smalltalk >> issue of Byte. I couldn't understand it; MVC was so simple and obvious that >> is was not worth writing about it. Nevertheless, people seem to have >> problems understanding MVC. It took me a long time before I gleaned what >> was going on. The explanation is a deep one, rooted in our different mental >> paradigms. >> >> From around 1970, I was working on Prokon, a distributed system for >> managers in the shipbuilding industry: >> >> Every manager has their own computer that they use for augmenting their >> mind. The manager understands their software and ideally writes it >> themselves. Managers delegate conversations with other managers to their >> computer's M-to-M network. (Marked with a heavy black line in the figure). >> I chose "distributed planning with central control" as my example project. >> Each manager creates a plan for their department, using apps suited to >> their particular needs. A **distributed algorithm** ensures consistency >> across departments. >> >> I came to PARC in 1978 and could immediately relate to the Smalltalk >> image with its universe of collaborating objects. Alan's definition of >> object-orientation fitted my Prokon model: "Thus its semantics are a bit >> like having thousands and thousands of computers all hooked together by a >> very fast network." >> >> MVC prescribes a network of communicating objects. Any object can fill >> one or more positions in the network as long as it has the required >> behavior; their classes are irrelevant. It's so simple that it's not worth >> writing about it. >> >> >> ==================== >> >> The work on this post was interrupted at this point by an unexpected week >> in hospital. It gave me quiet days of pondering the futility of what I am >> doing and I will be terminating my memberships in the Pharo and Squeak >> mailing lists. I have also deleted most of the old draft of this message >> and will quickly conclude with two observations: >> >> >> 1. >> The Smalltalk image is a universe of communicating objects. I call it >> an object computer. It can be seen as the model of an entirely new kind of >> computer, a model on a level closer to the human mind than the von Neumann >> model of 1948. The new model is communication-centric and should supersede >> the ubiquitous CPU-centric model as soon as possible. Working out the >> details of this idea could make an exciting and disruptive Ph.D. thesis. >> 2. >> Smalltalk is called a programming language. It is a curious one, very >> different from well-known languages like Java with their syntax and >> semantics. Smalltalk, as a programming language, does not have the concept >> of a program. Smalltalk, as a class-oriented language, does not have syntax >> for the declaration of a class. Smalltalk, as an object-oriented language, >> can't describe how objects collaborate to achieve a goal. You appear to be >> happy with this state of affairs, at least, I see no sign of anybody >> wanting to move on from the unfinished Smalltalk language to a mature >> development environment. I do not find it satisfactory and it is not >> acceptable to the intended managers populating the distributed system shown >> in the first picture. Consequently, I have done something about it as >> described in my SoSym article "*Personal Programming and the Object >> Computer.*" I am tired of being alone in my endeavors and this ends >> my work with Squeak and other Smalltalks. I wish you health and happiness >> wherever you happen to be. >> >> Trygve >> Personal programming and the object computer >> https://doi.org/10.1007/s10270-019-00768-3 >> >> -- >> >> *The essence of object orientation is that objects collaborate to >> achieve a goal. * >> Trygve Reenskaug mailto: trygver at ifi.uio.no <%20trygver at ifi.uio.no> >> Morgedalsvn. 5A http://folk.uio.no/trygver/ >> N-0378 Oslo http://fullOO.info >> Norway Tel: (+47) 468 58 625 >> >> > > -- > > *The essence of object orientation is that objects collaborate to achieve > a goal. * > Trygve Reenskaug mailto: trygver at ifi.uio.no <%20trygver at ifi.uio.no> > Morgedalsvn. 5A http://folk.uio.no/trygver/ > N-0378 Oslo http://fullOO.info > Norway Tel: (+47) 468 58 625 > -------------- next part -------------- An HTML attachment was scrubbed... URL: -------------- next part -------------- A non-text attachment was scrubbed... Name: kjjbmoogpajdimke.png Type: image/png Size: 45740 bytes Desc: not available URL: -------------- next part -------------- A non-text attachment was scrubbed... Name: cljooepacomafihh.png Type: image/png Size: 22069 bytes Desc: not available URL: From gettimothy at zoho.com Sat Oct 3 11:17:40 2020 From: gettimothy at zoho.com (gettimothy) Date: Sat, 03 Oct 2020 07:17:40 -0400 Subject: [squeak-dev] you folks did a great job on the preferences wizard experience on the launch of a new squeak. Message-ID: <174ee2e8678.e34ea36628862.431992921320213564@zoho.com> Very polished, nice work, pleasure to use. thanks for your hard work. -------------- next part -------------- An HTML attachment was scrubbed... URL: From gettimothy at zoho.com Sat Oct 3 11:20:05 2020 From: gettimothy at zoho.com (gettimothy) Date: Sat, 03 Oct 2020 07:20:05 -0400 Subject: [squeak-dev] "Pretty Print" collections as abstract syntax trees using plain text output In-Reply-To: <98C74D06-A564-4B1B-8DBD-08D5CFAACDD7@dcc.uchile.cl> References: <174e381dcff.eeb497c783798.6677692293294794906@zoho.com> <174e55bd5a7.c014fa865127.2243320247035478891@zoho.com> <174e57d48d9.baa6934d5684.7800204521222000565@zoho.com> <5E0863C4-2CFB-4AE0-A4DD-A12EE89DA00E@dcc.uchile.cl> <174ee1b3bca.d7b4540128778.8829159998323510248@zoho.com> <98C74D06-A564-4B1B-8DBD-08D5CFAACDD7@dcc.uchile.cl> Message-ID: <174ee30bdff.bbbda87b28871.7114147881173247250@zoho.com> thank you. so, Athens tests, libcairo basic stuff verified on pharo, then install, cross-check on squeak. I have a new image spun up on the squeak-launcher 6.0alpha 19893 on the latest vm, should be fun. ---- On Sat, 03 Oct 2020 07:06:24 -0400 Alexandre Bergel wrote ---- OpenGL is not directly supported in Pharo I believe, and if it is, it will be more for aiming at 3D graphics than fast 2D. Cairo is offered using a native library which is accessed from Pharo using Athens. All the rendering of Roassal3 is made by Athens, which are ultimately translated into native calls to the libcairo using uFFI. Cheers, Alexandre --  _,.;:~^~:;._,.;:~^~:;._,.;:~^~:;._,.;:~^~:;._,.;: Alexandre Bergel  http://www.bergel.eu ^~:;._,.;:~^~:;._,.;:~^~:;._,.;:~^~:;._,.;:~^~:;. On 03-10-2020, at 07:56, gettimothy wrote: I am currently familiarizing myself with the new-fangled git tools and after that  will be checking to see if Squeak can run the Cairo and Athens. Also, since the diagram shows that Cairo sits on top of OpenGL, I will check the OpenGL on the pharo-9 bleeding edge and if it works, correlate with openGL on squeak6.0 alpha. funny quirk is that Roassal3 is installed on the pristine image of pharo9, and there is Athens installed, but I do not see Cairo or OpenGL installed. Perhaps they are in the Athens Baseline, or I don't know where to look. cheers. ---- On Thu, 01 Oct 2020 15:58:00 -0400 Alexandre Bergel wrote ---- The GitHub of Roassal3 is https://github.com/ObjectProfile/Roassal3 I am not sure what are the difference between Pharo and Squeak. Long time I have not looked in detail. Roassal3 comes with plenty of unit tests. I guess than the starting point is to make the test pass.  Does Squeak has Athens / Cairo?  Cheers, Alexandre --  _,.;:~^~:;._,.;:~^~:;._,.;:~^~:;._,.;:~^~:;._,.;: Alexandre Bergel  http://www.bergel.eu/ ^~:;._,.;:~^~:;._,.;:~^~:;._,.;:~^~:;._,.;:~^~:;. On 01-10-2020, at 16:36, Eliot Miranda wrote: Hi Alexandre,   where are the Rossal repositories?  If we wanted to begin a port, what would be the best starting point? On Thu, Oct 1, 2020 at 12:28 PM Alexandre Bergel wrote: I think that Glamorous toolkit has its own visualization engine, unrelated to Roassal Alexandre --  _,.;:~^~:;._,.;:~^~:;._,.;:~^~:;._,.;:~^~:;._,.;: Alexandre Bergel  http://www.bergel.eu/ ^~:;._,.;:~^~:;._,.;:~^~:;._,.;:~^~:;._,.;:~^~:;. On 01-10-2020, at 15:47, gettimothy wrote: Hi Eiliot, re:  I don't see any mention of Rossal in the below.  What's the linkage between feek's use of either opensmalltalk-vm or Pharo's fork of it? IIRC Glamorous Toolkit  and Rossal are related; perhaps I have conflated the two. at  https://feenk.com/gt/ you can see the tree graphs I have in mind. ---- On Thu, 01 Oct 2020 14:24:24 -0400 Eliot Miranda wrote ---- Hi t, On Thu, Oct 1, 2020 at 11:11 AM gettimothy wrote: Hi Eliot ---- On Thu, 01 Oct 2020 11:07:08 -0400 Eliot Miranda wrote ---- Hi Tty,I don't see any mention of Rossal in the below.  What's the linkage between feek's use of either opensmalltalk-vm or Pharo's fork of it? On Oct 1, 2020, at 2:33 AM, gettimothy via Squeak-dev wrote: Hi folks. Has anybody coded a way , using plain text, to output a  https://en.wikipedia.org/wiki/Abstract_syntax_tree to a workspace? It would be a handy debug tool if so. An infinitely better way would be to port the Rossal visualisation system.  I’ve talked with Alexandre and he says Rossal is designed with portability in mind (it currently runs on Pharo and BisyalWorks and predates Pharo’s current imaging model).  This would give you a graphical representation of the entire tree, with the ability to attach behaviour to elements of the representation. thx I would love too, Rossal is intriguing. IIRC , "Mr. Feenk" and the board had a thread recently about "what it would take to make Rossal work on  Squeak" and the discussion decided on waiting on everybody having a block of time to make that happen. I don't see any mention of Rossal in the below.  What's the linkage between feek's use of either opensmalltalk-vm or Pharo's fork of it? Here is a cut-n-paste of that email, I saved it for future reference: Hi, Currently, at feenk we have feenkcom/opensmalltalk-vm: https://github.com/feenkcom/opensmalltalk-vm This is a small fork of the headless branch from pharo-project/opensmalltalk-vm that appeared out of practical necessities, but that we would like to avoid having. This post briefly describes the changes in the feenkcom/opensmalltalk-vm repo and the functionality those changes provide for Glamorous Toolkit. For Glamorous Toolkit we aimed for the following functionality:     • Open the GUI natively and have native display quality (GUI opened through FFI calls)     • Have a Glamorous Toolkit app for Mac OS that works as any other apps for Mac OS     • Create end-user applications that are fully customisable (executable name, menus, etc)     • Use Github actions for doing all compilations of external libraries and the vm instead of Travis CI.     • Have Iceberg running in native windows (which requires nested FFI callbacks) There has been work on these issues in both OpenSmalltalk/opensmalltalk-vm and pharo-project/opensmalltalk-vm but they were not entirely addressed. We needed to have something reliable a few months ago, and forking and doing some quick changes made that possible. Ideally we want to be able to run Glamorous Toolkit on both OpenSmalltalk/opensmalltalk-vm and pharo-project/opensmalltalk-vm. To have native GUIs we relied on Ronie Salgado’s work on the headless vm and started with pharo-project/opensmalltalk-vm - headless branch: https://github.com/pharo-project/opensmalltalk-vm/tree/headless That provided a solution for opening the GUI from the image through FFI calls. Currently we use Glutin (a library for OpenGL context creation, written in pure Rust) and this made it possible to run the entire Glamorous Toolkit inside a callback. On macOS when running an app, even a notarized one, the OS warns the user that the app is downloaded from the internet, and the user needs to confirm that they agree. Once the user agrees the app should automatically start. This is not currently possible with Pharo apps (for example PharoLaunched.app) and users have to again run the app manually after giving permission. Also Gatekeeper in macOS runs applications downloaded from zips in a randomized read-only DMG. We do not want this behaviour as users not copying Glamorous Toolkit to the Applications folder on macOS would then experience incorrect application behaviour. To create end-user applications we also need to fully customize the executable name (what the user sees in the Task Runner/Activity monitor), icons, native menus. Part of this work is already integrated in the pharo-project/opensmalltalk-vm - headless branch (Customizing the OS X icons, Brand the VM executable and package). Since last year Github offers Github Actions similar to Travis. We found it much easier to use than Travis for external libraries and the vm. Also we get to manage the code and the builds in the same place. This work is already integrated in the pharo-project/opensmalltalk-vm - headless branch (Build the VM under GitHub actions: https://github.com/pharo-project/opensmalltalk-vm/pull/56). The issues related to running Iceberg is a bit more technical. By moving to the headless vm we are running the entire image computation inside a callback from Glutin (https://github.com/rust-windowing/glutin/). When using Iceberg we get nested callbacks which we could not get to work using Alien. Instead we are using the ThreadedFFI Plugin and running all callback from Iceberg and Glutin using the Threaded FFI plugin (https://github.com/pharo-project/threadedFFI-Plugin). Currently we have a small fork of this plugin (feenkcom/threadedFFI-Plugin) and we also ship a custom plugin with the VM to fix a race condition due to having two copies of the callback stack (a pull request is here: https://github.com/pharo-project/threadedFFI-Plugin/pull/17). While not specific to our environment, openssl1.0 is no longer supported, and we are seeing users who are unable to run Pharo due to version conflicts, as reported in https://github.com/pharo-project/opensmalltalk-vm/issues/62. To sum up, a fork was the easiest way to get all this running. Now some changes are already in the pharo-project/opensmalltalk-vm - headless branch. What we are still missing are the changes that get the VM to work nicely with Mac OS and a bug fix in ThreadedFFI. We would also love it to have all these changes integrated in OpenSmalltalk/opensmalltalk-vm in the headless vm. This requires additional coordination as the required changes are somewhat deeper. Please let us know you would prefer to coordinate. Cheers, Tudor, on behalf of the feenk team -- http://feenk.com/ "The coherence of a trip is given by the clearness of the goal." If these things have already happened, I can push (most) other projects down the stack and take this up part-time.  Let me know. Wow, that's quite an offer.  I wish I could devote time to this, and probably won't be able to stay away once it starts, but for the moment I have other commitments precluding joining in this effort.  If not, I briefly looked into piping output to graphviz via OSProcess . Regardless, the tool would be invaluable in groking / debugging the PEG grammars. cheers, t _,,,^..^,,,_ best, Eliot --  _,.;:~^~:;._,.;:~^~:;._,.;:~^~:;._,.;:~^~:;._,.;: Alexandre Bergel  http://www.bergel.eu/ ^~:;._,.;:~^~:;._,.;:~^~:;._,.;:~^~:;._,.;:~^~:;. _,,,^..^,,,_ best, Eliot -------------- next part -------------- An HTML attachment was scrubbed... URL: From gettimothy at zoho.com Sat Oct 3 13:45:53 2020 From: gettimothy at zoho.com (gettimothy) Date: Sat, 03 Oct 2020 09:45:53 -0400 Subject: [squeak-dev] GitReference class >> validateReferenceName Message-ID: <174eeb638b6.f4d3856229800.8904908272598967198@zoho.com> Hi folks, messing about with the new-fangled git stuff. I am 'Add Git remote" thing , click 'ok' and MNU on Text >>includesSubstring. I replace aName (which is a Text) with aName string and all works as expected. validateReferenceName: aName "See https://git-scm.com/docs/git-check-ref-format" | tokens illegalCharacters | illegalCharacters := '[?+~^\*: '. (aName includesAnyOf: illegalCharacters) ifTrue: [ GitInvalidReferenceName signal: 'A reference name can not include whitespace or any of the following characters: ' , illegalCharacters.]. aName isEmpty ifTrue: [GitInvalidReferenceName signal: 'A reference name can not be empty']. (aName string includesSubstring: '..') ifTrue: [GitInvalidReferenceName signal: 'A reference name can not include the string ''..''']. (aName string ncludesSubstring: '@{') ifTrue: [GitInvalidReferenceName signal: 'A reference name can not include the string ''@{''']. (aName string includesSubstring: '//') ifTrue: [GitInvalidReferenceName signal: 'A reference name can not include two consecutive slashes']. (aName string first = $/ or: [aName last = $/]) ifTrue: [GitInvalidReferenceName signal: 'A reference name can not start or end with a slash']. (aName string endsWith: '@') ifTrue: [GitInvalidReferenceName signal: '''@'' is not a valid reference name']. tokens := aName string findTokens: '/'. (tokens anySatisfy: [:t | (t first = $.) or: [t endsWith: '.lock']]) ifTrue: [ GitInvalidReferenceName signal: 'A reference component can not start with a dot or end with .lock']. hth. btw, books in pillar format (?) for squeakbooks.org/com will be hosted on github eventually and then hopefully auto-published on the website. hence, the git-tools stuff work. -------------- next part -------------- An HTML attachment was scrubbed... URL: From gettimothy at zoho.com Sat Oct 3 14:06:09 2020 From: gettimothy at zoho.com (gettimothy) Date: Sat, 03 Oct 2020 10:06:09 -0400 Subject: [squeak-dev] Getting from GitBrowser to the System Browser Message-ID: <174eec8c766.ff7b3acf29943.4093558483039111477@zoho.com> Hi folks, I am trying to get the Roassal stuff into Squeak. https://github.com/ObjectProfile/Roassal3 The GitBrowser has succesfully pulled it, I have several branches to choose from and I want to get the stuff into Squeak browser and tests tool. Anybody know how to proceed? thx -------------- next part -------------- An HTML attachment was scrubbed... URL: From forums.jakob at resfarm.de Sat Oct 3 14:10:39 2020 From: forums.jakob at resfarm.de (Jakob Reschke) Date: Sat, 3 Oct 2020 16:10:39 +0200 Subject: [squeak-dev] GitReference class >> validateReferenceName In-Reply-To: <174eeb638b6.f4d3856229800.8904908272598967198@zoho.com> References: <174eeb638b6.f4d3856229800.8904908272598967198@zoho.com> Message-ID: Hi Timothy, Thank you for the report. When did you install the Git Browser in this image? I published a new version on September 26th that should fix the issue. If you did not install it after that, please update and try again: in the window menu of the Git Browser (the third window button next to expand and collapse), choose "self-update". Kind regards, Jakob Am Sa., 3. Okt. 2020 um 15:46 Uhr schrieb gettimothy via Squeak-dev : > > Hi folks, > > messing about with the new-fangled git stuff. > > I am 'Add Git remote" thing , click 'ok' and MNU on > > Text >>includesSubstring. > > I replace aName (which is a Text) with aName string and all works as expected. > > validateReferenceName: aName > "See https://git-scm.com/docs/git-check-ref-format" > > | tokens illegalCharacters | > illegalCharacters := '[?+~^\*: '. > (aName includesAnyOf: illegalCharacters) ifTrue: [ > GitInvalidReferenceName signal: 'A reference name can not include whitespace or any of the following characters: ' , illegalCharacters.]. > aName isEmpty ifTrue: [GitInvalidReferenceName signal: 'A reference name can not be empty']. > (aName string includesSubstring: '..') ifTrue: [GitInvalidReferenceName signal: 'A reference name can not include the string ''..''']. > (aName string ncludesSubstring: '@{') ifTrue: [GitInvalidReferenceName signal: 'A reference name can not include the string ''@{''']. > (aName string includesSubstring: '//') ifTrue: [GitInvalidReferenceName signal: 'A reference name can not include two consecutive slashes']. > (aName string first = $/ or: [aName last = $/]) ifTrue: [GitInvalidReferenceName signal: 'A reference name can not start or end with a slash']. > (aName string endsWith: '@') ifTrue: [GitInvalidReferenceName signal: '''@'' is not a valid reference name']. > > tokens := aName string findTokens: '/'. > (tokens anySatisfy: [:t | (t first = $.) or: [t endsWith: '.lock']]) ifTrue: [ > GitInvalidReferenceName signal: 'A reference component can not start with a dot or end with .lock']. > > hth. > > btw, books in pillar format (?) for squeakbooks.org/com will be hosted on github eventually and then hopefully auto-published on the website. > > hence, the git-tools stuff work. > > > > From forums.jakob at resfarm.de Sat Oct 3 14:18:27 2020 From: forums.jakob at resfarm.de (Jakob Reschke) Date: Sat, 3 Oct 2020 09:18:27 -0500 (CDT) Subject: [squeak-dev] Getting from GitBrowser to the System Browser In-Reply-To: <174eec8c766.ff7b3acf29943.4093558483039111477@zoho.com> References: <174eec8c766.ff7b3acf29943.4093558483039111477@zoho.com> Message-ID: <1601734707834-0.post@n4.nabble.com> Hi, since you have already cloned the repository, right-click on the top commit in the commit list and choose "Checkout objects". This will load the packages. Kind regards, Jakob -- Sent from: http://forum.world.st/Squeak-Dev-f45488.html From gettimothy at zoho.com Sat Oct 3 14:21:56 2020 From: gettimothy at zoho.com (gettimothy) Date: Sat, 03 Oct 2020 10:21:56 -0400 Subject: [squeak-dev] Getting from GitBrowser to the System Browser In-Reply-To: <1601734707834-0.post@n4.nabble.com> References: <174eec8c766.ff7b3acf29943.4093558483039111477@zoho.com> <1601734707834-0.post@n4.nabble.com> Message-ID: <174eed738c8.b8a7c80f30082.3659648801928462541@zoho.com> Thank you. TonelParser >> hasStatefulTraits "Pharo has stateful traits starting on version 7" ^ SystemVersion current major >= 7 but I am on Squeak.... thx again ---- On Sat, 03 Oct 2020 10:18:27 -0400 Jakob Reschke wrote ---- Hi, since you have already cloned the repository, right-click on the top commit in the commit list and choose "Checkout objects". This will load the packages. Kind regards, Jakob -- Sent from: http://forum.world.st/Squeak-Dev-f45488.html -------------- next part -------------- An HTML attachment was scrubbed... URL: From gettimothy at zoho.com Sat Oct 3 14:27:46 2020 From: gettimothy at zoho.com (gettimothy) Date: Sat, 03 Oct 2020 10:27:46 -0400 Subject: [squeak-dev] Getting from GitBrowser to the System Browser In-Reply-To: <1601734707834-0.post@n4.nabble.com> References: <174eec8c766.ff7b3acf29943.4093558483039111477@zoho.com> <1601734707834-0.post@n4.nabble.com> Message-ID: <174eedc8f4b.1079ec69330115.3927426311965542891@zoho.com> Hi Jakob I wrapped the SystemVersion current major >= 7 in a block ^[SystemVersion current major >= 7] on: Error do:[false] and that got past that hump. ---- On Sat, 03 Oct 2020 10:18:27 -0400 Jakob Reschke wrote ---- Hi, since you have already cloned the repository, right-click on the top commit in the commit list and choose "Checkout objects". This will load the packages. Kind regards, Jakob -- Sent from: http://forum.world.st/Squeak-Dev-f45488.html -------------- next part -------------- An HTML attachment was scrubbed... URL: From forums.jakob at resfarm.de Sat Oct 3 14:32:02 2020 From: forums.jakob at resfarm.de (Jakob Reschke) Date: Sat, 3 Oct 2020 09:32:02 -0500 (CDT) Subject: [squeak-dev] Getting from GitBrowser to the System Browser In-Reply-To: <174eedc8f4b.1079ec69330115.3927426311965542891@zoho.com> References: <174eec8c766.ff7b3acf29943.4093558483039111477@zoho.com> <1601734707834-0.post@n4.nabble.com> <174eedc8f4b.1079ec69330115.3927426311965542891@zoho.com> Message-ID: <1601735522192-0.post@n4.nabble.com> I am in the middle of integrating a pull request to solve this bug in squeak-tonel. :-) -- Sent from: http://forum.world.st/Squeak-Dev-f45488.html From gettimothy at zoho.com Sat Oct 3 14:38:32 2020 From: gettimothy at zoho.com (gettimothy) Date: Sat, 03 Oct 2020 10:38:32 -0400 Subject: [squeak-dev] Getting from GitBrowser to the System Browser In-Reply-To: <1601735522192-0.post@n4.nabble.com> References: <174eec8c766.ff7b3acf29943.4093558483039111477@zoho.com> <1601734707834-0.post@n4.nabble.com> <174eedc8f4b.1079ec69330115.3927426311965542891@zoho.com> <1601735522192-0.post@n4.nabble.com> Message-ID: <174eee66cdb.10410223530191.9207816355957293298@zoho.com> Thank you. If you are interested, I will be figuring out Pillar with this github stuff and getting the beginnings of some books up on squeakbooks.org* I will be documenting these steps in a booklet. This squot/git stuff will both be used and the subject of that booklet. good stuff. thanks for your work. *Help Browser team...I am confident that an XTreams-Parsing grammar /actor pair can be written to auto-generate HelpBrowser books from the Pillar to the Help Browser. ---- On Sat, 03 Oct 2020 10:32:02 -0400 Jakob Reschke wrote ---- I am in the middle of integrating a pull request to solve this bug in squeak-tonel. :-) -- Sent from: http://forum.world.st/Squeak-Dev-f45488.html -------------- next part -------------- An HTML attachment was scrubbed... URL: From tomjonabc at gmail.com Sat Oct 3 14:49:20 2020 From: tomjonabc at gmail.com (Tom Beckmann) Date: Sat, 3 Oct 2020 16:49:20 +0200 Subject: [squeak-dev] Getting from GitBrowser to the System Browser In-Reply-To: References: <174eec8c766.ff7b3acf29943.4093558483039111477@zoho.com> <1601734707834-0.post@n4.nabble.com> <174eedc8f4b.1079ec69330115.3927426311965542891@zoho.com> <1601735522192-0.post@n4.nabble.com> Message-ID: Hi timothy, (you'll probably be seeing this mail twice, my first attempt bounced on the ML because my mail address had changed, sorry!) after I read yours and Eliot's conversation, I went to try loading Roassal3 to see how our Tonel support is doing. I stumbled over three errors: - The error you just mentioned [1] - Monticello was not strict enough with matching MCReader capabilities [2] - The Geometry package used in Roassal uses Unicode symbols in their code, which is not supported in Squeak [3] I then went ahead and tried to adapt things a little and got the result you can see in the attachment. The experiment is found here [4]. I decided to not load Athena at all and started putting together an alternative Balloon backend instead (I am aware that Athena has a Balloon backend as well, the one I found consisted mostly of stubs, however). The resulting quality does not compare with Cairo, of course, but the basics were up and running very quickly. In theory, this should give you the working installation, however, packages load out-of-order because I did not manage to the baseline quite right just yet: Metacello new baseline: 'Roassal3'; repository: 'github://tom95/Roassal3'; load. Best, Tom [1] https://github.com/squeak-smalltalk/squeak-tonel/pull/5 [2] http://forum.world.st/The-Inbox-Monticello-tobe-729-mcz-td5122924.html [3] https://github.com/tom95/Geometry/commit/5e7e1fa89bbd699baf41066e33d6242730d4766c [4] https://github.com/tom95/Roassal3 On Sat, Oct 3, 2020 at 4:38 PM gettimothy via Squeak-dev < squeak-dev at lists.squeakfoundation.org> wrote: > > Thank you. > > > If you are interested, I will be figuring out Pillar with this github > stuff and getting the beginnings of some books up on squeakbooks.org* > > I will be documenting these steps in a booklet. > > This squot/git stuff will both be used and the subject of that booklet. > > good stuff. > > thanks for your work. > > > > > *Help Browser team...I am confident that an XTreams-Parsing grammar /actor > pair can be written to auto-generate HelpBrowser books from the Pillar to > the Help Browser. > > > > > > > ---- On Sat, 03 Oct 2020 10:32:02 -0400 *Jakob Reschke > >* wrote ---- > > I am in the middle of integrating a pull request to solve this bug in > squeak-tonel. :-) > > > > -- > Sent from: http://forum.world.st/Squeak-Dev-f45488.html > > > > -------------- next part -------------- An HTML attachment was scrubbed... URL: From Yoshiki.Ohshima at acm.org Sat Oct 3 15:59:17 2020 From: Yoshiki.Ohshima at acm.org (Yoshiki Ohshima) Date: Sat, 3 Oct 2020 08:59:17 -0700 Subject: [squeak-dev] =?utf-8?q?A_Sad_Day_=E2=80=93_concluded?= In-Reply-To: References: <05fa2ced-b4fd-f8a4-a6f1-2f50ed04b272@ifi.uio.no> <63d57fb2-3110-3762-7a8c-14ae6d6ef038@ifi.uio.no> Message-ID: Thank you Trygve for the long-term efforts of illustrating the idea as a runnable environment, and thank you Sumim for proactively collecting interesting artifacts! On Sat, Oct 3, 2020 at 3:57 AM masato sumi wrote: > Dear Trygve, > > I confirmed that I could launch the Loke/BabyIDE image with the included > SqueakVM for Windows (8.1 and 10) > and I could also launch it in a web browser by using the SqueakJS VM ( > https://squeak.js.org/run ). > > Thank you very much. > > -- > sumim > > 2020-10-03 15:48 Trygve Reenskaug : > >> Dear Sumim, >> Thank you for your kind words. >> >> The latest version of Loke/BabyIDE written on Squeak3.10.2 is at >> https://data.mendeley.com/datasets/5xxgzv7fsp/1 >> The image is my program repository. It includes some examples of DCI >> programming, Ellen's Personal Programming IDE, Squeak Reverse Engineering >> (SRE), and more. >> >> Best >> --Trygve >> >> On 2020-10-02 20:14, masato sumi wrote: >> >> Dear Trygve, >> >> Thank you for your very long term contribution and efforts. >> >> I'm very sorry that I couldn't help you at all now. >> >> I'm afraid, but could you please make your latest version of Loke/BabyIDE >> written on Squeak3.10.2 available for future generations of researchers >> and/or followers? >> >> Anyway, I think your ideas and thoughts should be passed on to future >> generations as faithfully as we can possible, and I myself will try to make >> sure that. >> >> Thank you so much and goodbye. >> Please take care of yourself. >> >> -- >> sumim >> >> 2020-10-03 0:54 Trygve Reenskaug : >> >>> Dear all, >>> I need to use many words to explore why I can't understand current >>> Squeak code. I believe the reason is a profound one, and I hope some of you >>> have the patience to read about it. >>> >>> Thank you for your responses to my 'A Sad Day'-message. One response said >>> "*But please don't give up as an inventor of MVC, which has simplified >>> writing software for all of us.* >>> >>> >>> *We need new ideas to stabilize Smalltalk." *As to MVC, it was received >>> with acclamation when I first presented it at PARC in 1978, and people >>> suggested I should make it the theme of my article in the special Smalltalk >>> issue of Byte. I couldn't understand it; MVC was so simple and obvious that >>> is was not worth writing about it. Nevertheless, people seem to have >>> problems understanding MVC. It took me a long time before I gleaned what >>> was going on. The explanation is a deep one, rooted in our different mental >>> paradigms. >>> >>> From around 1970, I was working on Prokon, a distributed system for >>> managers in the shipbuilding industry: >>> >>> Every manager has their own computer that they use for augmenting their >>> mind. The manager understands their software and ideally writes it >>> themselves. Managers delegate conversations with other managers to their >>> computer's M-to-M network. (Marked with a heavy black line in the figure). >>> I chose "distributed planning with central control" as my example project. >>> Each manager creates a plan for their department, using apps suited to >>> their particular needs. A **distributed algorithm** ensures consistency >>> across departments. >>> >>> I came to PARC in 1978 and could immediately relate to the Smalltalk >>> image with its universe of collaborating objects. Alan's definition of >>> object-orientation fitted my Prokon model: "Thus its semantics are a bit >>> like having thousands and thousands of computers all hooked together by a >>> very fast network." >>> >>> MVC prescribes a network of communicating objects. Any object can fill >>> one or more positions in the network as long as it has the required >>> behavior; their classes are irrelevant. It's so simple that it's not worth >>> writing about it. >>> >>> >>> ==================== >>> >>> The work on this post was interrupted at this point by an unexpected >>> week in hospital. It gave me quiet days of pondering the futility of what I >>> am doing and I will be terminating my memberships in the Pharo and Squeak >>> mailing lists. I have also deleted most of the old draft of this message >>> and will quickly conclude with two observations: >>> >>> >>> 1. >>> The Smalltalk image is a universe of communicating objects. I call >>> it an object computer. It can be seen as the model of an entirely new kind >>> of computer, a model on a level closer to the human mind than the von >>> Neumann model of 1948. The new model is communication-centric and should >>> supersede the ubiquitous CPU-centric model as soon as possible. Working out >>> the details of this idea could make an exciting and disruptive Ph.D. thesis. >>> 2. >>> Smalltalk is called a programming language. It is a curious one, >>> very different from well-known languages like Java with their syntax and >>> semantics. Smalltalk, as a programming language, does not have the concept >>> of a program. Smalltalk, as a class-oriented language, does not have syntax >>> for the declaration of a class. Smalltalk, as an object-oriented language, >>> can't describe how objects collaborate to achieve a goal. You appear to be >>> happy with this state of affairs, at least, I see no sign of anybody >>> wanting to move on from the unfinished Smalltalk language to a mature >>> development environment. I do not find it satisfactory and it is not >>> acceptable to the intended managers populating the distributed system shown >>> in the first picture. Consequently, I have done something about it as >>> described in my SoSym article "*Personal Programming and the Object >>> Computer.*" I am tired of being alone in my endeavors and this ends >>> my work with Squeak and other Smalltalks. I wish you health and happiness >>> wherever you happen to be. >>> >>> Trygve >>> Personal programming and the object computer >>> https://doi.org/10.1007/s10270-019-00768-3 >>> >>> -- >>> >>> *The essence of object orientation is that objects collaborate to >>> achieve a goal. * >>> Trygve Reenskaug mailto: trygver at ifi.uio.no <%20trygver at ifi.uio.no> >>> Morgedalsvn. 5A http://folk.uio.no/trygver/ >>> N-0378 Oslo http://fullOO.info >>> Norway Tel: (+47) 468 58 625 >>> >>> >> >> -- >> >> *The essence of object orientation is that objects collaborate to >> achieve a goal. * >> Trygve Reenskaug mailto: trygver at ifi.uio.no <%20trygver at ifi.uio.no> >> Morgedalsvn. 5A http://folk.uio.no/trygver/ >> N-0378 Oslo http://fullOO.info >> Norway Tel: (+47) 468 58 625 >> > > -- -- Yoshiki -------------- next part -------------- An HTML attachment was scrubbed... URL: -------------- next part -------------- A non-text attachment was scrubbed... Name: kjjbmoogpajdimke.png Type: image/png Size: 45740 bytes Desc: not available URL: -------------- next part -------------- A non-text attachment was scrubbed... Name: cljooepacomafihh.png Type: image/png Size: 22069 bytes Desc: not available URL: From gettimothy at zoho.com Sat Oct 3 16:26:29 2020 From: gettimothy at zoho.com (gettimothy) Date: Sat, 03 Oct 2020 12:26:29 -0400 Subject: [squeak-dev] Getting from GitBrowser to the System Browser In-Reply-To: References: <174eec8c766.ff7b3acf29943.4093558483039111477@zoho.com> <1601734707834-0.post@n4.nabble.com> <174eedc8f4b.1079ec69330115.3927426311965542891@zoho.com> <1601735522192-0.post@n4.nabble.com> Message-ID: <174ef49400f.11bc1bbaf30912.1162000306490856123@zoho.com> Tom, Thank you very much for your work. Is this in support of Jakob's pull request? i.e. are you two working together? How should I proceed from here? Pull from your repo? cheers, t ---- On Sat, 03 Oct 2020 10:49:20 -0400 Tom Beckmann wrote ---- Hi timothy, (you'll probably be seeing this mail twice, my first attempt bounced on the ML because my mail address had changed, sorry!) after I read yours and Eliot's conversation, I went to try loading Roassal3 to see how our Tonel support is doing. I stumbled over three errors: - The error you just mentioned [1] - Monticello was not strict enough with matching MCReader capabilities [2] - The Geometry package used in Roassal uses Unicode symbols in their code, which is not supported in Squeak [3] I then went ahead and tried to adapt things a little and got the result you can see in the attachment. The experiment is found here [4]. I decided to not load Athena at all and started putting together an alternative Balloon backend instead (I am aware that Athena has a Balloon backend as well, the one I found consisted mostly of stubs, however). The resulting quality does not compare with Cairo, of course, but the basics were up and running very quickly. In theory, this should give you the working installation, however, packages load out-of-order because I did not manage to the baseline quite right just yet: Metacello new     baseline: 'Roassal3';     repository: 'github://tom95/Roassal3';     load. Best, Tom [1] https://github.com/squeak-smalltalk/squeak-tonel/pull/5 [2] http://forum.world.st/The-Inbox-Monticello-tobe-729-mcz-td5122924.html [3] https://github.com/tom95/Geometry/commit/5e7e1fa89bbd699baf41066e33d6242730d4766c [4] https://github.com/tom95/Roassal3 On Sat, Oct 3, 2020 at 4:38 PM gettimothy via Squeak-dev wrote: Thank you. If you are interested, I will be figuring out Pillar with this github stuff and getting the beginnings of some books up on http://squeakbooks.org* I will be documenting these steps in a booklet. This squot/git stuff will both be used and the subject of that booklet. good stuff. thanks for your work. *Help Browser team...I am confident that an XTreams-Parsing grammar /actor pair can be written to auto-generate HelpBrowser books from the Pillar to the Help Browser. ---- On Sat, 03 Oct 2020 10:32:02 -0400 Jakob Reschke wrote ---- I am in the middle of integrating a pull request to solve this bug in squeak-tonel. :-) -- Sent from: http://forum.world.st/Squeak-Dev-f45488.html -------------- next part -------------- An HTML attachment was scrubbed... URL: From bruce.oneel at pckswarms.ch Sat Oct 3 17:01:09 2020 From: bruce.oneel at pckswarms.ch (Bruce O'Neel) Date: Sat, 03 Oct 2020 19:01:09 +0200 Subject: [squeak-dev] Weird Pi Squeak slowdown alert In-Reply-To: <17A27EEB-0986-47C8-91C6-FAE2D02644DD@rowledge.org> References: <17A27EEB-0986-47C8-91C6-FAE2D02644DD@rowledge.org> <81AE03D4-506B-45BF-AC5C-8C0434D5BD3B@rowledge.org> <5891F6C6-6AC9-4C8F-991F-6C6FDE1854E0@gmail.com> Message-ID: <1601744469-c37f321275747de93f978e049322ef66@pckswarms.ch> *And really, just how much development software does a light switch need to load by default?* Given the number of updates they seem to need, quite a bit... -------------- next part -------------- An HTML attachment was scrubbed... URL: From forums.jakob at resfarm.de Sat Oct 3 17:15:11 2020 From: forums.jakob at resfarm.de (Jakob Reschke) Date: Sat, 3 Oct 2020 19:15:11 +0200 Subject: [squeak-dev] Getting from GitBrowser to the System Browser In-Reply-To: <174ef49400f.11bc1bbaf30912.1162000306490856123@zoho.com> References: <174eec8c766.ff7b3acf29943.4093558483039111477@zoho.com> <1601734707834-0.post@n4.nabble.com> <174eedc8f4b.1079ec69330115.3927426311965542891@zoho.com> <1601735522192-0.post@n4.nabble.com> <174ef49400f.11bc1bbaf30912.1162000306490856123@zoho.com> Message-ID: Hi, Tom provided the fix and the pull request, and I integrated it. So yes, we work together. Now to update an existing installation I suppose one should use Metacello: Metacello new repository: 'github://squeak-smalltalk/squeak-tonel:squeak'; baseline: 'Tonel'; get; load. Kind regards, Jakob Am Sa., 3. Okt. 2020 um 18:26 Uhr schrieb gettimothy : > > > Tom, > > Thank you very much for your work. > > Is this in support of Jakob's pull request? i.e. are you two working together? > > How should I proceed from here? Pull from your repo? > > > cheers, > > t > > > ---- On Sat, 03 Oct 2020 10:49:20 -0400 Tom Beckmann wrote ---- > > Hi timothy, > (you'll probably be seeing this mail twice, my first attempt bounced on the ML because my mail address had changed, sorry!) > > after I read yours and Eliot's conversation, I went to try loading Roassal3 to see how our Tonel support is doing. I stumbled over three errors: > - The error you just mentioned [1] > - Monticello was not strict enough with matching MCReader capabilities [2] > - The Geometry package used in Roassal uses Unicode symbols in their code, which is not supported in Squeak [3] > > I then went ahead and tried to adapt things a little and got the result you can see in the attachment. The experiment is found here [4]. I decided to not load Athena at all and started putting together an alternative Balloon backend instead (I am aware that Athena has a Balloon backend as well, the one I found consisted mostly of stubs, however). The resulting quality does not compare with Cairo, of course, but the basics were up and running very quickly. > > In theory, this should give you the working installation, however, packages load out-of-order because I did not manage to the baseline quite right just yet: > > Metacello new > baseline: 'Roassal3'; > repository: 'github://tom95/Roassal3'; > load. > > Best, > Tom > > [1] https://github.com/squeak-smalltalk/squeak-tonel/pull/5 > [2] http://forum.world.st/The-Inbox-Monticello-tobe-729-mcz-td5122924.html > [3] https://github.com/tom95/Geometry/commit/5e7e1fa89bbd699baf41066e33d6242730d4766c > [4] https://github.com/tom95/Roassal3 > > On Sat, Oct 3, 2020 at 4:38 PM gettimothy via Squeak-dev wrote: > > > Thank you. > > > If you are interested, I will be figuring out Pillar with this github stuff and getting the beginnings of some books up on squeakbooks.org* > > I will be documenting these steps in a booklet. > > This squot/git stuff will both be used and the subject of that booklet. > > good stuff. > > thanks for your work. > > > > > *Help Browser team...I am confident that an XTreams-Parsing grammar /actor pair can be written to auto-generate HelpBrowser books from the Pillar to the Help Browser. > > > > > > > ---- On Sat, 03 Oct 2020 10:32:02 -0400 Jakob Reschke wrote ---- > > I am in the middle of integrating a pull request to solve this bug in > squeak-tonel. :-) > > > > -- > Sent from: http://forum.world.st/Squeak-Dev-f45488.html > > > > > > From tim at rowledge.org Sat Oct 3 17:32:28 2020 From: tim at rowledge.org (tim Rowledge) Date: Sat, 3 Oct 2020 10:32:28 -0700 Subject: [squeak-dev] Weird Pi Squeak slowdown alert In-Reply-To: <1601715829-66e64d409ad2e8c2356e953269ef3b1d@pckswarms.ch> References: <25F27C6F-4F5A-4A01-A162-79B1102701E4@rowledge.org> <81AE03D4-506B-45BF-AC5C-8C0434D5BD3B@rowledge.org> <5891F6C6-6AC9-4C8F-991F-6C6FDE1854E0@gmail.com> <1601715829-66e64d409ad2e8c2356e953269ef3b1d@pckswarms.ch> Message-ID: <63E55F7C-3989-4FC4-B7DA-8C85EB55CC0B@rowledge.org> > On 2020-10-03, at 2:03 AM, Bruce O'Neel wrote: > > 3. There is a vcgencmd get_throttled > > http://raspberrypi.stackexchange.com/questions/83184/ddg#83185 > > vcgencmd is an interesting command for many of these sorts of things. You can measure the CPU and GPU temp. Ah, yes. I vaguely recall having to use it some years ago to set a bit to allow usd boot on early Pi 3 models. I found a useful script from RonR (who provides many such on the PI forums, including a v.useful "set up usb boot" script) to report the relevant status info - https://www.raspberrypi.org/forums/viewtopic.php?f=63&t=254024&p=1550160&hilit=pistatus#p1550160 Also finally found the doc for vcgencmd at https://www.raspberrypi.org/documentation/raspbian/applications/vcgencmd.md and boy, does it do a lot. Looking at the output of the vcgencmd commands command, there are more commands than currently documented. The source is on github though, so one could work it out eventually! Be cool to have a morph that displays the important status occasionally. Or I could hook up one of the dials I wrote for the weather station for that SteamPunk style :-) tim -- tim Rowledge; tim at rowledge.org; http://www.rowledge.org/tim Strange OpCodes: XI: Execute Invalid op-code From gettimothy at zoho.com Sat Oct 3 18:41:28 2020 From: gettimothy at zoho.com (gettimothy) Date: Sat, 03 Oct 2020 14:41:28 -0400 Subject: [squeak-dev] Getting from GitBrowser to the System Browser In-Reply-To: References: <174eec8c766.ff7b3acf29943.4093558483039111477@zoho.com> <1601734707834-0.post@n4.nabble.com> <174eedc8f4b.1079ec69330115.3927426311965542891@zoho.com> <1601735522192-0.post@n4.nabble.com> <174ef49400f.11bc1bbaf30912.1162000306490856123@zoho.com> Message-ID: <174efc4d758.12072de2631896.6313662930829906260@zoho.com> Hi, Thanks. On a brand new squeak6.0 alpha (easily spun up thanks to the squeak-launcher (:)   git tools, etc installed via the preference wizard. BaselineOftonel is in Monticello browser. I run  repository: 'github://squeak-smalltalk/squeak-tonel:squeak'; baseline: 'Tonel'; get; load. works fine. Open the Git browser,  Add Roassal3 project. RHClick..Add remote copy-n-paste in  https://github.com/gettimothy/hello-world.githttps://github.com/tom95/Roassal3 MNU Text(Object) does not understand #includesSubstring: what am I missing? thx The MNU again on  ---- On Sat, 03 Oct 2020 13:15:11 -0400 Jakob Reschke wrote ---- Hi, Tom provided the fix and the pull request, and I integrated it. So yes, we work together. Now to update an existing installation I suppose one should use Metacello: Metacello new repository: 'github://squeak-smalltalk/squeak-tonel:squeak'; baseline: 'Tonel'; get; load. Kind regards, Jakob Am Sa., 3. Okt. 2020 um 18:26 Uhr schrieb gettimothy : > > > Tom, > > Thank you very much for your work. > > Is this in support of Jakob's pull request? i.e. are you two working together? > > How should I proceed from here? Pull from your repo? > > > cheers, > > t > > > ---- On Sat, 03 Oct 2020 10:49:20 -0400 Tom Beckmann wrote ---- > > Hi timothy, > (you'll probably be seeing this mail twice, my first attempt bounced on the ML because my mail address had changed, sorry!) > > after I read yours and Eliot's conversation, I went to try loading Roassal3 to see how our Tonel support is doing. I stumbled over three errors: > - The error you just mentioned [1] > - Monticello was not strict enough with matching MCReader capabilities [2] > - The Geometry package used in Roassal uses Unicode symbols in their code, which is not supported in Squeak [3] > > I then went ahead and tried to adapt things a little and got the result you can see in the attachment. The experiment is found here [4]. I decided to not load Athena at all and started putting together an alternative Balloon backend instead (I am aware that Athena has a Balloon backend as well, the one I found consisted mostly of stubs, however). The resulting quality does not compare with Cairo, of course, but the basics were up and running very quickly. > > In theory, this should give you the working installation, however, packages load out-of-order because I did not manage to the baseline quite right just yet: > > Metacello new > baseline: 'Roassal3'; > repository: 'github://tom95/Roassal3'; > load. > > Best, > Tom > > [1] https://github.com/squeak-smalltalk/squeak-tonel/pull/5 > [2] http://forum.world.st/The-Inbox-Monticello-tobe-729-mcz-td5122924.html > [3] https://github.com/tom95/Geometry/commit/5e7e1fa89bbd699baf41066e33d6242730d4766c > [4] https://github.com/tom95/Roassal3 > > On Sat, Oct 3, 2020 at 4:38 PM gettimothy via Squeak-dev wrote: > > > Thank you. > > > If you are interested, I will be figuring out Pillar with this github stuff and getting the beginnings of some books up on squeakbooks.org* > > I will be documenting these steps in a booklet. > > This squot/git stuff will both be used and the subject of that booklet. > > good stuff. > > thanks for your work. > > > > > *Help Browser team...I am confident that an XTreams-Parsing grammar /actor pair can be written to auto-generate HelpBrowser books from the Pillar to the Help Browser. > > > > > > > ---- On Sat, 03 Oct 2020 10:32:02 -0400 Jakob Reschke wrote ---- > > I am in the middle of integrating a pull request to solve this bug in > squeak-tonel. :-) > > > > -- > Sent from: http://forum.world.st/Squeak-Dev-f45488.html > > > > > > -------------- next part -------------- An HTML attachment was scrubbed... URL: From tomjonabc at gmail.com Sat Oct 3 19:57:43 2020 From: tomjonabc at gmail.com (Tom Beckmann) Date: Sat, 3 Oct 2020 21:57:43 +0200 Subject: [squeak-dev] Getting from GitBrowser to the System Browser In-Reply-To: <6355391776fd465aa2e9301d080640e1@MX2018-DAG1.hpi.uni-potsdam.de> References: <174eec8c766.ff7b3acf29943.4093558483039111477@zoho.com> <1601734707834-0.post@n4.nabble.com> <174eedc8f4b.1079ec69330115.3927426311965542891@zoho.com> <1601735522192-0.post@n4.nabble.com> <174ef49400f.11bc1bbaf30912.1162000306490856123@zoho.com> <6355391776fd465aa2e9301d080640e1@MX2018-DAG1.hpi.uni-potsdam.de> Message-ID: Hi timothy, the snippet from Jakob should give you the updated Tonel such that you can load Roassal and its dependencies, at least syntax/format-wise. I would recommend using Metacello for loading it first, as it will install all dependencies. If you use my fork, you will get the "repaired" Geometry package. Afterwards, you can use the GitBrowser for proper development by cloning my Roassal fork and then checking out the code. Note that you will hit a great number of missing dependencies, which you need to all "Proceed" and potentially also fix manually. Some code may not be properly overridden, so be sure to check the -Squeak packages for missing overrides if you hit an error in a specific method. I'm hoping to get around to investigate the proper Baseline load order sometime in the next few days (especially also for my own curiosity...). Concerning next steps for porting: you can base your work off of my fork (for example simply fork it again and if you like, place pull requests). Or alternatively, take a different route to porting, potentially keeping Athens, and base your own work on the Roassal main repo. I'll provide a quick description of the things in my fork in the following. There are three packages with adaptations for Squeak (of which the naming can be improved): - Roassal3-Pharo-Squeak: some classes from the Pharo Base System that Roassal assumes exist. For a proper port, I would want to get rid of this entirely and instead introduce adapter where necessary. This has to be loaded first as Roassal3 (core) wants to extend these classes, too. - Roassal3-Squeak: this is the proper port, mostly the Balloon code for rendering and for our Morph. - Roassal3-Shapes-Squeak: the -Shapes package uses some functions from the font system. We need to override these. We can't put these in our other -Squeak package because we first need the other classes to be loaded. Important todo items that I can currently see: - only the basic packages work (I tested Charts in particular); others have different dependencies into the Pharo system (e.g. UML) - quality and performance are lacking when compared to the Cairo/Athens version - fonts do not scale currently Best, Tom On Sat, Oct 3, 2020 at 8:41 PM gettimothy via Squeak-dev < squeak-dev at lists.squeakfoundation.org> wrote: > Hi, > > Thanks. > > On a brand new squeak6.0 alpha (easily spun up thanks to the > squeak-launcher (:) > git tools, etc installed via the preference wizard. > BaselineOftonel is in Monticello browser. > > I run > > repository: 'github://squeak-smalltalk/squeak-tonel:squeak'; > baseline: 'Tonel'; > get; load. > > works fine. > > Open the Git browser, > > Add Roassal3 project. > > RHClick..Add remote copy-n-paste in > > https://github.com/tom95/Roassal3 > > > MNU Text(Object) does not understand #includesSubstring: > > what am I missing? > > thx > > > > The MNU again on > ---- On Sat, 03 Oct 2020 13:15:11 -0400 *Jakob Reschke > >* wrote ---- > > Hi, > > Tom provided the fix and the pull request, and I integrated it. So > yes, we work together. > > Now to update an existing installation I suppose one should use Metacello: > > Metacello new > repository: 'github://squeak-smalltalk/squeak-tonel:squeak'; > baseline: 'Tonel'; > get; load. > > Kind regards, > Jakob > > Am Sa., 3. Okt. 2020 um 18:26 Uhr schrieb gettimothy : > > > > > > > Tom, > > > > Thank you very much for your work. > > > > Is this in support of Jakob's pull request? i.e. are you two working > together? > > > > How should I proceed from here? Pull from your repo? > > > > > > cheers, > > > > t > > > > > > ---- On Sat, 03 Oct 2020 10:49:20 -0400 Tom Beckmann < > tomjonabc at gmail.com> wrote ---- > > > > Hi timothy, > > (you'll probably be seeing this mail twice, my first attempt bounced on > the ML because my mail address had changed, sorry!) > > > > after I read yours and Eliot's conversation, I went to try loading > Roassal3 to see how our Tonel support is doing. I stumbled over three > errors: > > - The error you just mentioned [1] > > - Monticello was not strict enough with matching MCReader capabilities > [2] > > - The Geometry package used in Roassal uses Unicode symbols in their > code, which is not supported in Squeak [3] > > > > I then went ahead and tried to adapt things a little and got the result > you can see in the attachment. The experiment is found here [4]. I decided > to not load Athena at all and started putting together an alternative > Balloon backend instead (I am aware that Athena has a Balloon backend as > well, the one I found consisted mostly of stubs, however). The resulting > quality does not compare with Cairo, of course, but the basics were up and > running very quickly. > > > > In theory, this should give you the working installation, however, > packages load out-of-order because I did not manage to the baseline quite > right just yet: > > > > Metacello new > > baseline: 'Roassal3'; > > repository: 'github://tom95/Roassal3'; > > load. > > > > Best, > > Tom > > > > [1] https://github.com/squeak-smalltalk/squeak-tonel/pull/5 > > [2] > http://forum.world.st/The-Inbox-Monticello-tobe-729-mcz-td5122924.html > > [3] > https://github.com/tom95/Geometry/commit/5e7e1fa89bbd699baf41066e33d6242730d4766c > > [4] https://github.com/tom95/Roassal3 > > > > On Sat, Oct 3, 2020 at 4:38 PM gettimothy via Squeak-dev < > squeak-dev at lists.squeakfoundation.org> wrote: > > > > > > Thank you. > > > > > > If you are interested, I will be figuring out Pillar with this github > stuff and getting the beginnings of some books up on squeakbooks.org* > > > > I will be documenting these steps in a booklet. > > > > This squot/git stuff will both be used and the subject of that booklet. > > > > good stuff. > > > > thanks for your work. > > > > > > > > > > *Help Browser team...I am confident that an XTreams-Parsing grammar > /actor pair can be written to auto-generate HelpBrowser books from the > Pillar to the Help Browser. > > > > > > > > > > > > > > ---- On Sat, 03 Oct 2020 10:32:02 -0400 Jakob Reschke < > forums.jakob at resfarm.de> wrote ---- > > > > I am in the middle of integrating a pull request to solve this bug in > > squeak-tonel. :-) > > > > > > > > -- > > Sent from: http://forum.world.st/Squeak-Dev-f45488.html > > > > > > > > > > > > > > > > > -------------- next part -------------- An HTML attachment was scrubbed... URL: From gettimothy at zoho.com Sat Oct 3 20:20:54 2020 From: gettimothy at zoho.com (gettimothy) Date: Sat, 03 Oct 2020 16:20:54 -0400 Subject: [squeak-dev] Getting from GitBrowser to the System Browser In-Reply-To: References: <174eec8c766.ff7b3acf29943.4093558483039111477@zoho.com> <1601734707834-0.post@n4.nabble.com> <174eedc8f4b.1079ec69330115.3927426311965542891@zoho.com> <1601735522192-0.post@n4.nabble.com> <174ef49400f.11bc1bbaf30912.1162000306490856123@zoho.com> <6355391776fd465aa2e9301d080640e1@MX2018-DAG1.hpi.uni-potsdam.de> Message-ID: <174f01fde8a.12281517694016.6166262710876056093@zoho.com> Hi Tom Thank you for the detailed reply. Re:"I would recommend using Metacello for loading it first, as it will install all dependencies. " Where do I find that Metaccello? I assume I will need a ConfigurationOfRoassal3 frome somewhere. Regarding the fork, I think yours us the way to go until I get the lay of the land. I haven't even wirked through roassak examples on pharo yet. When we get smooth installation abd Eliot has time to putter with it, the community can decide on the Athens thing. Thanks again ---- On Sat, 03 Oct 2020 15:57:43 -0400 tomjonabc at gmail.com wrote ---- Hi timothy, the snippet from Jakob should give you the updated Tonel such that you can load Roassal and its dependencies, at least syntax/format-wise. I would recommend using Metacello for loading it first, as it will install all dependencies. If you use my fork, you will get the "repaired" Geometry package. Afterwards, you can use the GitBrowser for proper development by cloning my Roassal fork and then checking out the code. Note that you will hit a great number of missing dependencies, which you need to all "Proceed" and potentially also fix manually. Some code may not be properly overridden, so be sure to check the -Squeak packages for missing overrides if you hit an error in a specific method. I'm hoping to get around to investigate the proper Baseline load order sometime in the next few days (especially also for my own curiosity...). Concerning next steps for porting: you can base your work off of my fork (for example simply fork it again and if you like, place pull requests). Or alternatively, take a different route to porting, potentially keeping Athens, and base your own work on the Roassal main repo. I'll provide a quick description of the things in my fork in the following. There are three packages with adaptations for Squeak (of which the naming can be improved): - Roassal3-Pharo-Squeak: some classes from the Pharo Base System that Roassal assumes exist. For a proper port, I would want to get rid of this entirely and instead introduce adapter where necessary. This has to be loaded first as Roassal3 (core) wants to extend these classes, too. - Roassal3-Squeak: this is the proper port, mostly the Balloon code for rendering and for our Morph. - Roassal3-Shapes-Squeak: the -Shapes package uses some functions from the font system. We need to override these. We can't put these in our other -Squeak package because we first need the other classes to be loaded. Important todo items that I can currently see: - only the basic packages work (I tested Charts in particular); others have different dependencies into the Pharo system (e.g. UML) - quality and performance are lacking when compared to the Cairo/Athens version - fonts do not scale currently Best, Tom On Sat, Oct 3, 2020 at 8:41 PM gettimothy via Squeak-dev wrote: Hi, Thanks. On a brand new squeak6.0 alpha (easily spun up thanks to the squeak-launcher (:)   git tools, etc installed via the preference wizard. BaselineOftonel is in Monticello browser. I run  repository: 'github://squeak-smalltalk/squeak-tonel:squeak'; baseline: 'Tonel'; get; load. works fine. Open the Git browser,  Add Roassal3 project. RHClick..Add remote copy-n-paste in  https://github.com/tom95/Roassal3 MNU Text(Object) does not understand #includesSubstring: what am I missing? thx The MNU again on  ---- On Sat, 03 Oct 2020 13:15:11 -0400 Jakob Reschke wrote ---- Hi, Tom provided the fix and the pull request, and I integrated it. So yes, we work together. Now to update an existing installation I suppose one should use Metacello: Metacello new repository: 'github://squeak-smalltalk/squeak-tonel:squeak'; baseline: 'Tonel'; get; load. Kind regards, Jakob Am Sa., 3. Okt. 2020 um 18:26 Uhr schrieb gettimothy : > > > Tom, > > Thank you very much for your work. > > Is this in support of Jakob's pull request? i.e. are you two working together? > > How should I proceed from here? Pull from your repo? > > > cheers, > > t > > > ---- On Sat, 03 Oct 2020 10:49:20 -0400 Tom Beckmann wrote ---- > > Hi timothy, > (you'll probably be seeing this mail twice, my first attempt bounced on the ML because my mail address had changed, sorry!) > > after I read yours and Eliot's conversation, I went to try loading Roassal3 to see how our Tonel support is doing. I stumbled over three errors: > - The error you just mentioned [1] > - Monticello was not strict enough with matching MCReader capabilities [2] > - The Geometry package used in Roassal uses Unicode symbols in their code, which is not supported in Squeak [3] > > I then went ahead and tried to adapt things a little and got the result you can see in the attachment. The experiment is found here [4]. I decided to not load Athena at all and started putting together an alternative Balloon backend instead (I am aware that Athena has a Balloon backend as well, the one I found consisted mostly of stubs, however). The resulting quality does not compare with Cairo, of course, but the basics were up and running very quickly. > > In theory, this should give you the working installation, however, packages load out-of-order because I did not manage to the baseline quite right just yet: > > Metacello new > baseline: 'Roassal3'; > repository: 'github://tom95/Roassal3'; > load. > > Best, > Tom > > [1] https://github.com/squeak-smalltalk/squeak-tonel/pull/5 > [2] http://forum.world.st/The-Inbox-Monticello-tobe-729-mcz-td5122924.html > [3] https://github.com/tom95/Geometry/commit/5e7e1fa89bbd699baf41066e33d6242730d4766c > [4] https://github.com/tom95/Roassal3 > > On Sat, Oct 3, 2020 at 4:38 PM gettimothy via Squeak-dev wrote: > > > Thank you. > > > If you are interested, I will be figuring out Pillar with this github stuff and getting the beginnings of some books up on squeakbooks.org* > > I will be documenting these steps in a booklet. > > This squot/git stuff will both be used and the subject of that booklet. > > good stuff. > > thanks for your work. > > > > > *Help Browser team...I am confident that an XTreams-Parsing grammar /actor pair can be written to auto-generate HelpBrowser books from the Pillar to the Help Browser. > > > > > > > ---- On Sat, 03 Oct 2020 10:32:02 -0400 Jakob Reschke wrote ---- > > I am in the middle of integrating a pull request to solve this bug in > squeak-tonel. :-) > > > > -- > Sent from: http://forum.world.st/Squeak-Dev-f45488.html > > > > > > -------------- next part -------------- An HTML attachment was scrubbed... URL: From tomjonabc at gmail.com Sat Oct 3 21:26:32 2020 From: tomjonabc at gmail.com (Tom Beckmann) Date: Sat, 3 Oct 2020 23:26:32 +0200 Subject: [squeak-dev] Getting from GitBrowser to the System Browser In-Reply-To: References: <174eec8c766.ff7b3acf29943.4093558483039111477@zoho.com> <1601734707834-0.post@n4.nabble.com> <174eedc8f4b.1079ec69330115.3927426311965542891@zoho.com> <1601735522192-0.post@n4.nabble.com> <174ef49400f.11bc1bbaf30912.1162000306490856123@zoho.com> <6355391776fd465aa2e9301d080640e1@MX2018-DAG1.hpi.uni-potsdam.de> Message-ID: Hi, Metacello new baseline: 'Roassal3'; repository: 'github://tom95/Roassal3'; load. will get you started, then you will have to handle the various errors that arise from the incorrect load order. Repeating the whole command once it's done will allow you to recover from some load errors, too. Best, Tom On Sat, Oct 3, 2020 at 10:21 PM gettimothy via Squeak-dev < squeak-dev at lists.squeakfoundation.org> wrote: > Hi Tom > > Thank you for the detailed reply. > > Re:"I would recommend using Metacello for loading it first, as it will > install all dependencies. " > > Where do I find that Metaccello? I assume I will need a > ConfigurationOfRoassal3 frome somewhere. > > Regarding the fork, I think yours us the way to go until I get the lay of > the land. > I haven't even wirked through roassak examples on pharo yet. > > When we get smooth installation abd Eliot has time to putter with it, the > community can decide on the Athens thing. > > Thanks again > > > > > ---- On Sat, 03 Oct 2020 15:57:43 -0400 *tomjonabc at gmail.com > * wrote ---- > > Hi timothy, > > the snippet from Jakob should give you the updated Tonel such that you can > load Roassal and its dependencies, at least syntax/format-wise. I would > recommend using Metacello for loading it first, as it will install all > dependencies. If you use my fork, you will get the "repaired" Geometry > package. Afterwards, you can use the GitBrowser for proper development by > cloning my Roassal fork and then checking out the code. Note that you will > hit a great number of missing dependencies, which you need to all "Proceed" > and potentially also fix manually. Some code may not be properly > overridden, so be sure to check the -Squeak packages for missing overrides > if you hit an error in a specific method. I'm hoping to get around to > investigate the proper Baseline load order sometime in the next few days > (especially also for my own curiosity...). > > Concerning next steps for porting: you can base your work off of my fork > (for example simply fork it again and if you like, place pull requests). Or > alternatively, take a different route to porting, potentially keeping > Athens, and base your own work on the Roassal main repo. > > I'll provide a quick description of the things in my fork in the > following. There are three packages with adaptations for Squeak (of which > the naming can be improved): > - Roassal3-Pharo-Squeak: some classes from the Pharo Base System that > Roassal assumes exist. For a proper port, I would want to get rid of this > entirely and instead introduce adapter where necessary. This has to be > loaded first as Roassal3 (core) wants to extend these classes, too. > - Roassal3-Squeak: this is the proper port, mostly the Balloon code for > rendering and for our Morph. > - Roassal3-Shapes-Squeak: the -Shapes package uses some functions from the > font system. We need to override these. We can't put these in our other > -Squeak package because we first need the other classes to be loaded. > > Important todo items that I can currently see: > - only the basic packages work (I tested Charts in particular); others > have different dependencies into the Pharo system (e.g. UML) > - quality and performance are lacking when compared to the Cairo/Athens > version > - fonts do not scale currently > > Best, > Tom > > On Sat, Oct 3, 2020 at 8:41 PM gettimothy via Squeak-dev < > squeak-dev at lists.squeakfoundation.org> wrote: > > Hi, > > Thanks. > > On a brand new squeak6.0 alpha (easily spun up thanks to the > squeak-launcher (:) > git tools, etc installed via the preference wizard. > BaselineOftonel is in Monticello browser. > > I run > > repository: 'github://squeak-smalltalk/squeak-tonel:squeak'; > baseline: 'Tonel'; > get; load. > > works fine. > > Open the Git browser, > > Add Roassal3 project. > > RHClick..Add remote copy-n-paste in > > https://github.com/tom95/Roassal3 > > > MNU Text(Object) does not understand #includesSubstring: > > what am I missing? > > thx > > > > The MNU again on > ---- On Sat, 03 Oct 2020 13:15:11 -0400 *Jakob Reschke > >* wrote ---- > > Hi, > > Tom provided the fix and the pull request, and I integrated it. So > yes, we work together. > > Now to update an existing installation I suppose one should use Metacello: > > Metacello new > repository: 'github://squeak-smalltalk/squeak-tonel:squeak'; > baseline: 'Tonel'; > get; load. > > Kind regards, > Jakob > > Am Sa., 3. Okt. 2020 um 18:26 Uhr schrieb gettimothy : > > > > > > > Tom, > > > > Thank you very much for your work. > > > > Is this in support of Jakob's pull request? i.e. are you two working > together? > > > > How should I proceed from here? Pull from your repo? > > > > > > cheers, > > > > t > > > > > > ---- On Sat, 03 Oct 2020 10:49:20 -0400 Tom Beckmann < > tomjonabc at gmail.com> wrote ---- > > > > Hi timothy, > > (you'll probably be seeing this mail twice, my first attempt bounced on > the ML because my mail address had changed, sorry!) > > > > after I read yours and Eliot's conversation, I went to try loading > Roassal3 to see how our Tonel support is doing. I stumbled over three > errors: > > - The error you just mentioned [1] > > - Monticello was not strict enough with matching MCReader capabilities > [2] > > - The Geometry package used in Roassal uses Unicode symbols in their > code, which is not supported in Squeak [3] > > > > I then went ahead and tried to adapt things a little and got the result > you can see in the attachment. The experiment is found here [4]. I decided > to not load Athena at all and started putting together an alternative > Balloon backend instead (I am aware that Athena has a Balloon backend as > well, the one I found consisted mostly of stubs, however). The resulting > quality does not compare with Cairo, of course, but the basics were up and > running very quickly. > > > > In theory, this should give you the working installation, however, > packages load out-of-order because I did not manage to the baseline quite > right just yet: > > > > Metacello new > > baseline: 'Roassal3'; > > repository: 'github://tom95/Roassal3'; > > load. > > > > Best, > > Tom > > > > [1] https://github.com/squeak-smalltalk/squeak-tonel/pull/5 > > [2] > http://forum.world.st/The-Inbox-Monticello-tobe-729-mcz-td5122924.html > > [3] > https://github.com/tom95/Geometry/commit/5e7e1fa89bbd699baf41066e33d6242730d4766c > > [4] https://github.com/tom95/Roassal3 > > > > On Sat, Oct 3, 2020 at 4:38 PM gettimothy via Squeak-dev < > squeak-dev at lists.squeakfoundation.org> wrote: > > > > > > Thank you. > > > > > > If you are interested, I will be figuring out Pillar with this github > stuff and getting the beginnings of some books up on squeakbooks.org* > > > > I will be documenting these steps in a booklet. > > > > This squot/git stuff will both be used and the subject of that booklet. > > > > good stuff. > > > > thanks for your work. > > > > > > > > > > *Help Browser team...I am confident that an XTreams-Parsing grammar > /actor pair can be written to auto-generate HelpBrowser books from the > Pillar to the Help Browser. > > > > > > > > > > > > > > ---- On Sat, 03 Oct 2020 10:32:02 -0400 Jakob Reschke < > forums.jakob at resfarm.de> wrote ---- > > > > I am in the middle of integrating a pull request to solve this bug in > > squeak-tonel. :-) > > > > > > > > -- > > Sent from: http://forum.world.st/Squeak-Dev-f45488.html > > > > > > > > > > > > > > > > > > -------------- next part -------------- An HTML attachment was scrubbed... URL: From gettimothy at zoho.com Sat Oct 3 21:39:58 2020 From: gettimothy at zoho.com (gettimothy) Date: Sat, 03 Oct 2020 17:39:58 -0400 Subject: [squeak-dev] Getting from GitBrowser to the System Browser In-Reply-To: References: <174eec8c766.ff7b3acf29943.4093558483039111477@zoho.com> <1601734707834-0.post@n4.nabble.com> <174eedc8f4b.1079ec69330115.3927426311965542891@zoho.com> <1601735522192-0.post@n4.nabble.com> <174ef49400f.11bc1bbaf30912.1162000306490856123@zoho.com> <6355391776fd465aa2e9301d080640e1@MX2018-DAG1.hpi.uni-potsdam.de> Message-ID: <174f0683fc4.cc21295694285.1255478267244623413@zoho.com> Tom thank you. I willhit it tomorrow! I am really looking forward to this port. Cheers. T ---- On Sat, 03 Oct 2020 17:26:32 -0400 tomjonabc at gmail.com wrote ---- Hi, Metacello new     baseline: 'Roassal3';     repository: 'github://tom95/Roassal3';     load. will get you started, then you will have to handle the various errors that arise from the incorrect load order. Repeating the whole command once it's done will allow you to recover from some load errors, too. Best, Tom On Sat, Oct 3, 2020 at 10:21 PM gettimothy via Squeak-dev wrote: Hi Tom Thank you for the detailed reply. Re:"I would recommend using Metacello for loading it first, as it will install all dependencies. " Where do I find that Metaccello? I assume I will need a ConfigurationOfRoassal3 frome somewhere. Regarding the fork, I think yours us the way to go until I get the lay of the land. I haven't even wirked through roassak examples on pharo yet. When we get smooth installation abd Eliot has time to putter with it, the community can decide on the Athens thing. Thanks again ---- On Sat, 03 Oct 2020 15:57:43 -0400 tomjonabc at gmail.com wrote ---- Hi timothy, the snippet from Jakob should give you the updated Tonel such that you can load Roassal and its dependencies, at least syntax/format-wise. I would recommend using Metacello for loading it first, as it will install all dependencies. If you use my fork, you will get the "repaired" Geometry package. Afterwards, you can use the GitBrowser for proper development by cloning my Roassal fork and then checking out the code. Note that you will hit a great number of missing dependencies, which you need to all "Proceed" and potentially also fix manually. Some code may not be properly overridden, so be sure to check the -Squeak packages for missing overrides if you hit an error in a specific method. I'm hoping to get around to investigate the proper Baseline load order sometime in the next few days (especially also for my own curiosity...). Concerning next steps for porting: you can base your work off of my fork (for example simply fork it again and if you like, place pull requests). Or alternatively, take a different route to porting, potentially keeping Athens, and base your own work on the Roassal main repo. I'll provide a quick description of the things in my fork in the following. There are three packages with adaptations for Squeak (of which the naming can be improved): - Roassal3-Pharo-Squeak: some classes from the Pharo Base System that Roassal assumes exist. For a proper port, I would want to get rid of this entirely and instead introduce adapter where necessary. This has to be loaded first as Roassal3 (core) wants to extend these classes, too. - Roassal3-Squeak: this is the proper port, mostly the Balloon code for rendering and for our Morph. - Roassal3-Shapes-Squeak: the -Shapes package uses some functions from the font system. We need to override these. We can't put these in our other -Squeak package because we first need the other classes to be loaded. Important todo items that I can currently see: - only the basic packages work (I tested Charts in particular); others have different dependencies into the Pharo system (e.g. UML) - quality and performance are lacking when compared to the Cairo/Athens version - fonts do not scale currently Best, Tom On Sat, Oct 3, 2020 at 8:41 PM gettimothy via Squeak-dev wrote: Hi, Thanks. On a brand new squeak6.0 alpha (easily spun up thanks to the squeak-launcher (:)   git tools, etc installed via the preference wizard. BaselineOftonel is in Monticello browser. I run  repository: 'github://squeak-smalltalk/squeak-tonel:squeak'; baseline: 'Tonel'; get; load. works fine. Open the Git browser,  Add Roassal3 project. RHClick..Add remote copy-n-paste in  https://github.com/tom95/Roassal3 MNU Text(Object) does not understand #includesSubstring: what am I missing? thx The MNU again on  ---- On Sat, 03 Oct 2020 13:15:11 -0400 Jakob Reschke wrote ---- Hi, Tom provided the fix and the pull request, and I integrated it. So yes, we work together. Now to update an existing installation I suppose one should use Metacello: Metacello new repository: 'github://squeak-smalltalk/squeak-tonel:squeak'; baseline: 'Tonel'; get; load. Kind regards, Jakob Am Sa., 3. Okt. 2020 um 18:26 Uhr schrieb gettimothy : > > > Tom, > > Thank you very much for your work. > > Is this in support of Jakob's pull request? i.e. are you two working together? > > How should I proceed from here? Pull from your repo? > > > cheers, > > t > > > ---- On Sat, 03 Oct 2020 10:49:20 -0400 Tom Beckmann wrote ---- > > Hi timothy, > (you'll probably be seeing this mail twice, my first attempt bounced on the ML because my mail address had changed, sorry!) > > after I read yours and Eliot's conversation, I went to try loading Roassal3 to see how our Tonel support is doing. I stumbled over three errors: > - The error you just mentioned [1] > - Monticello was not strict enough with matching MCReader capabilities [2] > - The Geometry package used in Roassal uses Unicode symbols in their code, which is not supported in Squeak [3] > > I then went ahead and tried to adapt things a little and got the result you can see in the attachment. The experiment is found here [4]. I decided to not load Athena at all and started putting together an alternative Balloon backend instead (I am aware that Athena has a Balloon backend as well, the one I found consisted mostly of stubs, however). The resulting quality does not compare with Cairo, of course, but the basics were up and running very quickly. > > In theory, this should give you the working installation, however, packages load out-of-order because I did not manage to the baseline quite right just yet: > > Metacello new > baseline: 'Roassal3'; > repository: 'github://tom95/Roassal3'; > load. > > Best, > Tom > > [1] https://github.com/squeak-smalltalk/squeak-tonel/pull/5 > [2] http://forum.world.st/The-Inbox-Monticello-tobe-729-mcz-td5122924.html > [3] https://github.com/tom95/Geometry/commit/5e7e1fa89bbd699baf41066e33d6242730d4766c > [4] https://github.com/tom95/Roassal3 > > On Sat, Oct 3, 2020 at 4:38 PM gettimothy via Squeak-dev wrote: > > > Thank you. > > > If you are interested, I will be figuring out Pillar with this github stuff and getting the beginnings of some books up on squeakbooks.org* > > I will be documenting these steps in a booklet. > > This squot/git stuff will both be used and the subject of that booklet. > > good stuff. > > thanks for your work. > > > > > *Help Browser team...I am confident that an XTreams-Parsing grammar /actor pair can be written to auto-generate HelpBrowser books from the Pillar to the Help Browser. > > > > > > > ---- On Sat, 03 Oct 2020 10:32:02 -0400 Jakob Reschke wrote ---- > > I am in the middle of integrating a pull request to solve this bug in > squeak-tonel. :-) > > > > -- > Sent from: http://forum.world.st/Squeak-Dev-f45488.html > > > > > > -------------- next part -------------- An HTML attachment was scrubbed... URL: From lewis at mail.msen.com Sun Oct 4 02:43:32 2020 From: lewis at mail.msen.com (David T. Lewis) Date: Sat, 3 Oct 2020 22:43:32 -0400 Subject: [squeak-dev] A Sad Day ??? concluded In-Reply-To: References: <05fa2ced-b4fd-f8a4-a6f1-2f50ed04b272@ifi.uio.no> <63d57fb2-3110-3762-7a8c-14ae6d6ef038@ifi.uio.no> Message-ID: <20201004024332.GA46334@shell.msen.com> Thank you Trygve, I confirm also that the image runs very well on my Ubuntu Linux laptop with a VM compiled per http://wiki.squeak.org/squeak/6354. Dave On Sat, Oct 03, 2020 at 07:56:43PM +0900, masato sumi wrote: > Dear Trygve, > > I confirmed that I could launch the Loke/BabyIDE image with the included > SqueakVM for Windows (8.1 and 10) > and I could also launch it in a web browser by using the SqueakJS VM ( > https://squeak.js.org/run ). > > Thank you very much. > > -- > sumim > > 2020-10-03 15:48 Trygve Reenskaug : > > > Dear Sumim, > > Thank you for your kind words. > > > > The latest version of Loke/BabyIDE written on Squeak3.10.2 is at > > https://data.mendeley.com/datasets/5xxgzv7fsp/1 > > The image is my program repository. It includes some examples of DCI > > programming, Ellen's Personal Programming IDE, Squeak Reverse Engineering > > (SRE), and more. > > > > Best > > --Trygve > > > > On 2020-10-02 20:14, masato sumi wrote: > > > > Dear Trygve, > > > > Thank you for your very long term contribution and efforts. > > > > I'm very sorry that I couldn't help you at all now. > > > > I'm afraid, but could you please make your latest version of Loke/BabyIDE > > written on Squeak3.10.2 available for future generations of researchers > > and/or followers? > > > > Anyway, I think your ideas and thoughts should be passed on to future > > generations as faithfully as we can possible, and I myself will try to make > > sure that. > > > > Thank you so much and goodbye. > > Please take care of yourself. > > > > -- > > sumim > > > > 2020-10-03 0:54 Trygve Reenskaug : > > > >> Dear all, > >> I need to use many words to explore why I can't understand current Squeak > >> code. I believe the reason is a profound one, and I hope some of you have > >> the patience to read about it. > >> > >> Thank you for your responses to my 'A Sad Day'-message. One response said > >> "*But please don't give up as an inventor of MVC, which has simplified > >> writing software for all of us.* > >> > >> > >> *We need new ideas to stabilize Smalltalk." *As to MVC, it was received > >> with acclamation when I first presented it at PARC in 1978, and people > >> suggested I should make it the theme of my article in the special Smalltalk > >> issue of Byte. I couldn't understand it; MVC was so simple and obvious that > >> is was not worth writing about it. Nevertheless, people seem to have > >> problems understanding MVC. It took me a long time before I gleaned what > >> was going on. The explanation is a deep one, rooted in our different mental > >> paradigms. > >> > >> From around 1970, I was working on Prokon, a distributed system for > >> managers in the shipbuilding industry: > >> > >> Every manager has their own computer that they use for augmenting their > >> mind. The manager understands their software and ideally writes it > >> themselves. Managers delegate conversations with other managers to their > >> computer's M-to-M network. (Marked with a heavy black line in the figure). > >> I chose "distributed planning with central control" as my example project. > >> Each manager creates a plan for their department, using apps suited to > >> their particular needs. A **distributed algorithm** ensures consistency > >> across departments. > >> > >> I came to PARC in 1978 and could immediately relate to the Smalltalk > >> image with its universe of collaborating objects. Alan's definition of > >> object-orientation fitted my Prokon model: "Thus its semantics are a bit > >> like having thousands and thousands of computers all hooked together by a > >> very fast network." > >> > >> MVC prescribes a network of communicating objects. Any object can fill > >> one or more positions in the network as long as it has the required > >> behavior; their classes are irrelevant. It's so simple that it's not worth > >> writing about it. > >> > >> > >> ==================== > >> > >> The work on this post was interrupted at this point by an unexpected week > >> in hospital. It gave me quiet days of pondering the futility of what I am > >> doing and I will be terminating my memberships in the Pharo and Squeak > >> mailing lists. I have also deleted most of the old draft of this message > >> and will quickly conclude with two observations: > >> > >> > >> 1. > >> The Smalltalk image is a universe of communicating objects. I call it > >> an object computer. It can be seen as the model of an entirely new kind of > >> computer, a model on a level closer to the human mind than the von Neumann > >> model of 1948. The new model is communication-centric and should supersede > >> the ubiquitous CPU-centric model as soon as possible. Working out the > >> details of this idea could make an exciting and disruptive Ph.D. thesis. > >> 2. > >> Smalltalk is called a programming language. It is a curious one, very > >> different from well-known languages like Java with their syntax and > >> semantics. Smalltalk, as a programming language, does not have the concept > >> of a program. Smalltalk, as a class-oriented language, does not have syntax > >> for the declaration of a class. Smalltalk, as an object-oriented language, > >> can't describe how objects collaborate to achieve a goal. You appear to be > >> happy with this state of affairs, at least, I see no sign of anybody > >> wanting to move on from the unfinished Smalltalk language to a mature > >> development environment. I do not find it satisfactory and it is not > >> acceptable to the intended managers populating the distributed system shown > >> in the first picture. Consequently, I have done something about it as > >> described in my SoSym article "*Personal Programming and the Object > >> Computer.*" I am tired of being alone in my endeavors and this ends > >> my work with Squeak and other Smalltalks. I wish you health and happiness > >> wherever you happen to be. > >> > >> Trygve > >> Personal programming and the object computer > >> https://doi.org/10.1007/s10270-019-00768-3 > >> > >> -- > >> > >> *The essence of object orientation is that objects collaborate to > >> achieve a goal. * > >> Trygve Reenskaug mailto: trygver at ifi.uio.no <%20trygver at ifi.uio.no> > >> Morgedalsvn. 5A http://folk.uio.no/trygver/ > >> N-0378 Oslo http://fullOO.info > >> Norway Tel: (+47) 468 58 625 > >> > >> > > > > -- > > > > *The essence of object orientation is that objects collaborate to achieve > > a goal. * > > Trygve Reenskaug mailto: trygver at ifi.uio.no <%20trygver at ifi.uio.no> > > Morgedalsvn. 5A http://folk.uio.no/trygver/ > > N-0378 Oslo http://fullOO.info > > Norway Tel: (+47) 468 58 625 > > > From sumi at seagreen.ocn.ne.jp Sun Oct 4 03:07:47 2020 From: sumi at seagreen.ocn.ne.jp (sumi masato) Date: Sun, 4 Oct 2020 12:07:47 +0900 Subject: [squeak-dev] A Sad Day ??? concluded In-Reply-To: <20201004024332.GA46334@shell.msen.com> References: <05fa2ced-b4fd-f8a4-a6f1-2f50ed04b272@ifi.uio.no> <63d57fb2-3110-3762-7a8c-14ae6d6ef038@ifi.uio.no> <20201004024332.GA46334@shell.msen.com> Message-ID: Hi Dave, Great! Could you build a Docker image and publish it for macOS users who are restricted 32 bit VM by Apple also to try it easily? -- sumim 2020-10-04 David T. Lewis : > Thank you Trygve, > > I confirm also that the image runs very well on my Ubuntu Linux laptop > with a VM compiled per http://wiki.squeak.org/squeak/6354. > > Dave > > On Sat, Oct 03, 2020 at 07:56:43PM +0900, masato sumi wrote: > > Dear Trygve, > > > > I confirmed that I could launch the Loke/BabyIDE image with the included > > SqueakVM for Windows (8.1 and 10) > > and I could also launch it in a web browser by using the SqueakJS VM ( > > https://squeak.js.org/run ). > > > > Thank you very much. > > > > -- > > sumim > > > > 2020-10-03 15:48 Trygve Reenskaug : > > > > > Dear Sumim, > > > Thank you for your kind words. > > > > > > The latest version of Loke/BabyIDE written on Squeak3.10.2 is at > > > https://data.mendeley.com/datasets/5xxgzv7fsp/1 > > > The image is my program repository. It includes some examples of DCI > > > programming, Ellen's Personal Programming IDE, Squeak Reverse > Engineering > > > (SRE), and more. > > > > > > Best > > > --Trygve > > > > > > On 2020-10-02 20:14, masato sumi wrote: > > > > > > Dear Trygve, > > > > > > Thank you for your very long term contribution and efforts. > > > > > > I'm very sorry that I couldn't help you at all now. > > > > > > I'm afraid, but could you please make your latest version of > Loke/BabyIDE > > > written on Squeak3.10.2 available for future generations of researchers > > > and/or followers? > > > > > > Anyway, I think your ideas and thoughts should be passed on to future > > > generations as faithfully as we can possible, and I myself will try to > make > > > sure that. > > > > > > Thank you so much and goodbye. > > > Please take care of yourself. > > > > > > -- > > > sumim > > > > > > 2020-10-03 0:54 Trygve Reenskaug : > > > > > >> Dear all, > > >> I need to use many words to explore why I can't understand current > Squeak > > >> code. I believe the reason is a profound one, and I hope some of you > have > > >> the patience to read about it. > > >> > > >> Thank you for your responses to my 'A Sad Day'-message. One response > said > > >> "*But please don't give up as an inventor of MVC, which has > simplified > > >> writing software for all of us.* > > >> > > >> > > >> *We need new ideas to stabilize Smalltalk." *As to MVC, it was > received > > >> with acclamation when I first presented it at PARC in 1978, and people > > >> suggested I should make it the theme of my article in the special > Smalltalk > > >> issue of Byte. I couldn't understand it; MVC was so simple and > obvious that > > >> is was not worth writing about it. Nevertheless, people seem to have > > >> problems understanding MVC. It took me a long time before I gleaned > what > > >> was going on. The explanation is a deep one, rooted in our different > mental > > >> paradigms. > > >> > > >> From around 1970, I was working on Prokon, a distributed system for > > >> managers in the shipbuilding industry: > > >> > > >> Every manager has their own computer that they use for augmenting > their > > >> mind. The manager understands their software and ideally writes it > > >> themselves. Managers delegate conversations with other managers to > their > > >> computer's M-to-M network. (Marked with a heavy black line in the > figure). > > >> I chose "distributed planning with central control" as my example > project. > > >> Each manager creates a plan for their department, using apps suited to > > >> their particular needs. A **distributed algorithm** ensures > consistency > > >> across departments. > > >> > > >> I came to PARC in 1978 and could immediately relate to the Smalltalk > > >> image with its universe of collaborating objects. Alan's definition of > > >> object-orientation fitted my Prokon model: "Thus its semantics are a > bit > > >> like having thousands and thousands of computers all hooked together > by a > > >> very fast network." > > >> > > >> MVC prescribes a network of communicating objects. Any object can fill > > >> one or more positions in the network as long as it has the required > > >> behavior; their classes are irrelevant. It's so simple that it's not > worth > > >> writing about it. > > >> > > >> > > >> ==================== > > >> > > >> The work on this post was interrupted at this point by an unexpected > week > > >> in hospital. It gave me quiet days of pondering the futility of what > I am > > >> doing and I will be terminating my memberships in the Pharo and Squeak > > >> mailing lists. I have also deleted most of the old draft of this > message > > >> and will quickly conclude with two observations: > > >> > > >> > > >> 1. > > >> The Smalltalk image is a universe of communicating objects. I call > it > > >> an object computer. It can be seen as the model of an entirely new > kind of > > >> computer, a model on a level closer to the human mind than the von > Neumann > > >> model of 1948. The new model is communication-centric and should > supersede > > >> the ubiquitous CPU-centric model as soon as possible. Working out > the > > >> details of this idea could make an exciting and disruptive Ph.D. > thesis. > > >> 2. > > >> Smalltalk is called a programming language. It is a curious one, > very > > >> different from well-known languages like Java with their syntax and > > >> semantics. Smalltalk, as a programming language, does not have the > concept > > >> of a program. Smalltalk, as a class-oriented language, does not > have syntax > > >> for the declaration of a class. Smalltalk, as an object-oriented > language, > > >> can't describe how objects collaborate to achieve a goal. You > appear to be > > >> happy with this state of affairs, at least, I see no sign of > anybody > > >> wanting to move on from the unfinished Smalltalk language to a > mature > > >> development environment. I do not find it satisfactory and it is > not > > >> acceptable to the intended managers populating the distributed > system shown > > >> in the first picture. Consequently, I have done something about it > as > > >> described in my SoSym article "*Personal Programming and the Object > > >> Computer.*" I am tired of being alone in my endeavors and this ends > > >> my work with Squeak and other Smalltalks. I wish you health and > happiness > > >> wherever you happen to be. > > >> > > >> Trygve > > >> Personal programming and the object computer > > >> https://doi.org/10.1007/s10270-019-00768-3 > > >> > > >> -- > > >> > > >> *The essence of object orientation is that objects collaborate to > > >> achieve a goal. * > > >> Trygve Reenskaug mailto: trygver at ifi.uio.no <% > 20trygver at ifi.uio.no> > > >> Morgedalsvn. 5A http://folk.uio.no/trygver/ > > >> N-0378 Oslo http://fullOO.info > > >> Norway Tel: (+47) 468 58 625 > > >> > > >> > > > > > > -- > > > > > > *The essence of object orientation is that objects collaborate to > achieve > > > a goal. * > > > Trygve Reenskaug mailto: trygver at ifi.uio.no <% > 20trygver at ifi.uio.no> > > > Morgedalsvn. 5A http://folk.uio.no/trygver/ > > > N-0378 Oslo http://fullOO.info > > > Norway Tel: (+47) 468 58 625 > > > > > > > > > > > > -- sent from mobile -------------- next part -------------- An HTML attachment was scrubbed... URL: From tomjonabc at gmail.com Sun Oct 4 11:20:59 2020 From: tomjonabc at gmail.com (Tom Beckmann) Date: Sun, 4 Oct 2020 13:20:59 +0200 Subject: [squeak-dev] Getting from GitBrowser to the System Browser In-Reply-To: <75ddd65341f5497884781b44fda6e136@MX2018-DAG1.hpi.uni-potsdam.de> References: <174eec8c766.ff7b3acf29943.4093558483039111477@zoho.com> <1601734707834-0.post@n4.nabble.com> <174eedc8f4b.1079ec69330115.3927426311965542891@zoho.com> <1601735522192-0.post@n4.nabble.com> <174ef49400f.11bc1bbaf30912.1162000306490856123@zoho.com> <6355391776fd465aa2e9301d080640e1@MX2018-DAG1.hpi.uni-potsdam.de> <75ddd65341f5497884781b44fda6e136@MX2018-DAG1.hpi.uni-potsdam.de> Message-ID: Hi timothy, just as a quick update: the Baseline is now finally correct (I hadn't realized that my base package cannot share a prefix with the main package or else all its classes will be removed again when the main package loads). So, if you execute the following in a Squeak-trunk image and click "Proceed" a good number of times when you're prompted about missing classes, hopefully you'll be greeted with a chart: Metacello new baseline: 'Roassal3'; repository: 'github://tom95/Roassal3'; load. RSChartExample new example01Markers open. A note to my earlier description of the changes: I dropped the Roassal3-Shapes-Squeak package and instead put the changes directly in the Roassal3-Shapes package in a way that they remain compatible with Pharo. Best, Tom On Sat, Oct 3, 2020 at 11:40 PM gettimothy via Squeak-dev < squeak-dev at lists.squeakfoundation.org> wrote: > Tom thank you. > > I willhit it tomorrow! > > I am really looking forward to this port. > > Cheers. > > T > > > ---- On Sat, 03 Oct 2020 17:26:32 -0400 *tomjonabc at gmail.com > *wrote ---- > > Hi, > > Metacello new > baseline: 'Roassal3'; > repository: 'github://tom95/Roassal3'; > load. > > will get you started, then you will have to handle the various errors that > arise from the incorrect load order. Repeating the whole command once it's > done will allow you to recover from some load errors, too. > > Best, > Tom > > On Sat, Oct 3, 2020 at 10:21 PM gettimothy via Squeak-dev < > squeak-dev at lists.squeakfoundation.org> wrote: > > Hi Tom > > Thank you for the detailed reply. > > Re:"I would recommend using Metacello for loading it first, as it will > install all dependencies. " > > Where do I find that Metaccello? I assume I will need a > ConfigurationOfRoassal3 frome somewhere. > > Regarding the fork, I think yours us the way to go until I get the lay of > the land. > I haven't even wirked through roassak examples on pharo yet. > > When we get smooth installation abd Eliot has time to putter with it, the > community can decide on the Athens thing. > > Thanks again > > > > > ---- On Sat, 03 Oct 2020 15:57:43 -0400 *tomjonabc at gmail.com > * wrote ---- > > Hi timothy, > > the snippet from Jakob should give you the updated Tonel such that you can > load Roassal and its dependencies, at least syntax/format-wise. I would > recommend using Metacello for loading it first, as it will install all > dependencies. If you use my fork, you will get the "repaired" Geometry > package. Afterwards, you can use the GitBrowser for proper development by > cloning my Roassal fork and then checking out the code. Note that you will > hit a great number of missing dependencies, which you need to all "Proceed" > and potentially also fix manually. Some code may not be properly > overridden, so be sure to check the -Squeak packages for missing overrides > if you hit an error in a specific method. I'm hoping to get around to > investigate the proper Baseline load order sometime in the next few days > (especially also for my own curiosity...). > > Concerning next steps for porting: you can base your work off of my fork > (for example simply fork it again and if you like, place pull requests). Or > alternatively, take a different route to porting, potentially keeping > Athens, and base your own work on the Roassal main repo. > > I'll provide a quick description of the things in my fork in the > following. There are three packages with adaptations for Squeak (of which > the naming can be improved): > - Roassal3-Pharo-Squeak: some classes from the Pharo Base System that > Roassal assumes exist. For a proper port, I would want to get rid of this > entirely and instead introduce adapter where necessary. This has to be > loaded first as Roassal3 (core) wants to extend these classes, too. > - Roassal3-Squeak: this is the proper port, mostly the Balloon code for > rendering and for our Morph. > - Roassal3-Shapes-Squeak: the -Shapes package uses some functions from the > font system. We need to override these. We can't put these in our other > -Squeak package because we first need the other classes to be loaded. > > Important todo items that I can currently see: > - only the basic packages work (I tested Charts in particular); others > have different dependencies into the Pharo system (e.g. UML) > - quality and performance are lacking when compared to the Cairo/Athens > version > - fonts do not scale currently > > Best, > Tom > > On Sat, Oct 3, 2020 at 8:41 PM gettimothy via Squeak-dev < > squeak-dev at lists.squeakfoundation.org> wrote: > > Hi, > > Thanks. > > On a brand new squeak6.0 alpha (easily spun up thanks to the > squeak-launcher (:) > git tools, etc installed via the preference wizard. > BaselineOftonel is in Monticello browser. > > I run > > repository: 'github://squeak-smalltalk/squeak-tonel:squeak'; > baseline: 'Tonel'; > get; load. > > works fine. > > Open the Git browser, > > Add Roassal3 project. > > RHClick..Add remote copy-n-paste in > > https://github.com/tom95/Roassal3 > > > MNU Text(Object) does not understand #includesSubstring: > > what am I missing? > > thx > > > > The MNU again on > ---- On Sat, 03 Oct 2020 13:15:11 -0400 *Jakob Reschke > >* wrote ---- > > Hi, > > Tom provided the fix and the pull request, and I integrated it. So > yes, we work together. > > Now to update an existing installation I suppose one should use Metacello: > > Metacello new > repository: 'github://squeak-smalltalk/squeak-tonel:squeak'; > baseline: 'Tonel'; > get; load. > > Kind regards, > Jakob > > Am Sa., 3. Okt. 2020 um 18:26 Uhr schrieb gettimothy : > > > > > > > Tom, > > > > Thank you very much for your work. > > > > Is this in support of Jakob's pull request? i.e. are you two working > together? > > > > How should I proceed from here? Pull from your repo? > > > > > > cheers, > > > > t > > > > > > ---- On Sat, 03 Oct 2020 10:49:20 -0400 Tom Beckmann < > tomjonabc at gmail.com> wrote ---- > > > > Hi timothy, > > (you'll probably be seeing this mail twice, my first attempt bounced on > the ML because my mail address had changed, sorry!) > > > > after I read yours and Eliot's conversation, I went to try loading > Roassal3 to see how our Tonel support is doing. I stumbled over three > errors: > > - The error you just mentioned [1] > > - Monticello was not strict enough with matching MCReader capabilities > [2] > > - The Geometry package used in Roassal uses Unicode symbols in their > code, which is not supported in Squeak [3] > > > > I then went ahead and tried to adapt things a little and got the result > you can see in the attachment. The experiment is found here [4]. I decided > to not load Athena at all and started putting together an alternative > Balloon backend instead (I am aware that Athena has a Balloon backend as > well, the one I found consisted mostly of stubs, however). The resulting > quality does not compare with Cairo, of course, but the basics were up and > running very quickly. > > > > In theory, this should give you the working installation, however, > packages load out-of-order because I did not manage to the baseline quite > right just yet: > > > > Metacello new > > baseline: 'Roassal3'; > > repository: 'github://tom95/Roassal3'; > > load. > > > > Best, > > Tom > > > > [1] https://github.com/squeak-smalltalk/squeak-tonel/pull/5 > > [2] > http://forum.world.st/The-Inbox-Monticello-tobe-729-mcz-td5122924.html > > [3] > https://github.com/tom95/Geometry/commit/5e7e1fa89bbd699baf41066e33d6242730d4766c > > [4] https://github.com/tom95/Roassal3 > > > > On Sat, Oct 3, 2020 at 4:38 PM gettimothy via Squeak-dev < > squeak-dev at lists.squeakfoundation.org> wrote: > > > > > > Thank you. > > > > > > If you are interested, I will be figuring out Pillar with this github > stuff and getting the beginnings of some books up on squeakbooks.org* > > > > I will be documenting these steps in a booklet. > > > > This squot/git stuff will both be used and the subject of that booklet. > > > > good stuff. > > > > thanks for your work. > > > > > > > > > > *Help Browser team...I am confident that an XTreams-Parsing grammar > /actor pair can be written to auto-generate HelpBrowser books from the > Pillar to the Help Browser. > > > > > > > > > > > > > > ---- On Sat, 03 Oct 2020 10:32:02 -0400 Jakob Reschke < > forums.jakob at resfarm.de> wrote ---- > > > > I am in the middle of integrating a pull request to solve this bug in > > squeak-tonel. :-) > > > > > > > > -- > > Sent from: http://forum.world.st/Squeak-Dev-f45488.html > > > > > > > > > > > > > > > > > > > -------------- next part -------------- An HTML attachment was scrubbed... URL: From forums.jakob at resfarm.de Sun Oct 4 11:53:25 2020 From: forums.jakob at resfarm.de (Jakob Reschke) Date: Sun, 4 Oct 2020 13:53:25 +0200 Subject: [squeak-dev] GitReference class >> validateReferenceName In-Reply-To: References: <174eeb638b6.f4d3856229800.8904908272598967198@zoho.com> Message-ID: Am Sa., 3. Okt. 2020 um 20:41 Uhr schrieb gettimothy : > > On a brand new squeak6.0 alpha [...] I run > > repository: 'github://squeak-smalltalk/squeak-tonel:squeak'; > baseline: 'Tonel'; > get; load. > > works fine. > > Open the Git browser, > > Add Roassal3 project. > > RHClick..Add remote copy-n-paste in > https://github.com/tom95/Roassal3 > > > MNU Text(Object) does not understand #includesSubstring: > > what am I missing? > Hi Timothy, Looks like I was mistaken, the fix is not in the release from September 26th. In the meantime, please replace the method SquitAddRemote>>#remoteName with the following text: remoteName ^ remoteName ifNil: [String empty] ifNotNil: [remoteName asString] Kind regards, Jakob Am Sa., 3. Okt. 2020 um 16:10 Uhr schrieb Jakob Reschke : > > Hi Timothy, > > Thank you for the report. When did you install the Git Browser in this > image? I published a new version on September 26th that should fix the > issue. If you did not install it after that, please update and try > again: in the window menu of the Git Browser (the third window button > next to expand and collapse), choose "self-update". > > Kind regards, > Jakob > > Am Sa., 3. Okt. 2020 um 15:46 Uhr schrieb gettimothy via Squeak-dev > : > > > > Hi folks, > > > > messing about with the new-fangled git stuff. > > > > I am 'Add Git remote" thing , click 'ok' and MNU on > > > > Text >>includesSubstring. > > > > I replace aName (which is a Text) with aName string and all works as expected. > > > > validateReferenceName: aName > > "See https://git-scm.com/docs/git-check-ref-format" > > > > | tokens illegalCharacters | > > illegalCharacters := '[?+~^\*: '. > > (aName includesAnyOf: illegalCharacters) ifTrue: [ > > GitInvalidReferenceName signal: 'A reference name can not include whitespace or any of the following characters: ' , illegalCharacters.]. > > aName isEmpty ifTrue: [GitInvalidReferenceName signal: 'A reference name can not be empty']. > > (aName string includesSubstring: '..') ifTrue: [GitInvalidReferenceName signal: 'A reference name can not include the string ''..''']. > > (aName string ncludesSubstring: '@{') ifTrue: [GitInvalidReferenceName signal: 'A reference name can not include the string ''@{''']. > > (aName string includesSubstring: '//') ifTrue: [GitInvalidReferenceName signal: 'A reference name can not include two consecutive slashes']. > > (aName string first = $/ or: [aName last = $/]) ifTrue: [GitInvalidReferenceName signal: 'A reference name can not start or end with a slash']. > > (aName string endsWith: '@') ifTrue: [GitInvalidReferenceName signal: '''@'' is not a valid reference name']. > > > > tokens := aName string findTokens: '/'. > > (tokens anySatisfy: [:t | (t first = $.) or: [t endsWith: '.lock']]) ifTrue: [ > > GitInvalidReferenceName signal: 'A reference component can not start with a dot or end with .lock']. > > > > hth. > > > > btw, books in pillar format (?) for squeakbooks.org/com will be hosted on github eventually and then hopefully auto-published on the website. > > > > hence, the git-tools stuff work. > > > > > > > > From gettimothy at zoho.com Sun Oct 4 12:31:13 2020 From: gettimothy at zoho.com (gettimothy) Date: Sun, 04 Oct 2020 08:31:13 -0400 Subject: [squeak-dev] Getting from GitBrowser to the System Browser In-Reply-To: References: <174eec8c766.ff7b3acf29943.4093558483039111477@zoho.com> <1601734707834-0.post@n4.nabble.com> <174eedc8f4b.1079ec69330115.3927426311965542891@zoho.com> <1601735522192-0.post@n4.nabble.com> <174ef49400f.11bc1bbaf30912.1162000306490856123@zoho.com> <6355391776fd465aa2e9301d080640e1@MX2018-DAG1.hpi.uni-potsdam.de> <75ddd65341f5497884781b44fda6e136@MX2018-DAG1.hpi.uni-potsdam.de> Message-ID: <174f39838d9.109ff20b934657.6309337774987617871@zoho.com> Hi folks. Tom I have been watching you commit since about 4 am this morning, while I try to install the baseline specs manually... That Metacello errors out for me....I am wondering if it is because the git repos are local... Could not resolve: BaselineOfRoassal3 [BaelineOfRoassal3] in /home/wm/Squeak/images/Roassal3Squeak6.0alpha.../package-cache github://tom95/Roassal3:master/src ERROR: `GoferRepositoryError: Array>>\` in MetacelloFetchingMCSpecLoaser(MetacelloCommonMCSpecLoader)>>retryingResolvePackageSpecReferences: packageSpec gofer: gofer I will send a followup email inquiring about how to do this whole thing from the Git repos... cheers. t ---- On Sun, 04 Oct 2020 07:20:59 -0400 Tom Beckmann wrote ---- Hi timothy, just as a quick update: the Baseline is now finally correct (I hadn't realized that my base package cannot share a prefix with the main package or else all its classes will be removed again when the main package loads). So, if you execute the following in a Squeak-trunk image and click "Proceed" a good number of times when you're prompted about missing classes, hopefully you'll be greeted with a chart: Metacello new     baseline: 'Roassal3';     repository: 'github://tom95/Roassal3';     load. RSChartExample new example01Markers open. A note to my earlier description of the changes: I dropped the Roassal3-Shapes-Squeak package and instead put the changes directly in the Roassal3-Shapes package in a way that they remain compatible with Pharo. Best, Tom On Sat, Oct 3, 2020 at 11:40 PM gettimothy via Squeak-dev wrote: Tom thank you. I willhit it tomorrow! I am really looking forward to this port.   Cheers. T ---- On Sat, 03 Oct 2020 17:26:32 -0400mailto:tomjonabc at gmail.com wrote ---- Hi, Metacello new     baseline: 'Roassal3';     repository: 'github://tom95/Roassal3';     load. will get you started, then you will have to handle the various errors that arise from the incorrect load order. Repeating the whole command once it's done will allow you to recover from some load errors, too. Best, Tom On Sat, Oct 3, 2020 at 10:21 PM gettimothy via Squeak-dev wrote: Hi Tom Thank you for the detailed reply. Re:"I would recommend using Metacello for loading it first, as it will install all dependencies. " Where do I find that Metaccello? I assume I will need a ConfigurationOfRoassal3 frome somewhere. Regarding the fork, I think yours us the way to go until I get the lay of the land. I haven't even wirked through roassak examples on pharo yet. When we get smooth installation abd Eliot has time to putter with it, the community can decide on the Athens thing. Thanks again ---- On Sat, 03 Oct 2020 15:57:43 -0400 mailto:tomjonabc at gmail.com wrote ---- Hi timothy, the snippet from Jakob should give you the updated Tonel such that you can load Roassal and its dependencies, at least syntax/format-wise. I would recommend using Metacello for loading it first, as it will install all dependencies. If you use my fork, you will get the "repaired" Geometry package. Afterwards, you can use the GitBrowser for proper development by cloning my Roassal fork and then checking out the code. Note that you will hit a great number of missing dependencies, which you need to all "Proceed" and potentially also fix manually. Some code may not be properly overridden, so be sure to check the -Squeak packages for missing overrides if you hit an error in a specific method. I'm hoping to get around to investigate the proper Baseline load order sometime in the next few days (especially also for my own curiosity...). Concerning next steps for porting: you can base your work off of my fork (for example simply fork it again and if you like, place pull requests). Or alternatively, take a different route to porting, potentially keeping Athens, and base your own work on the Roassal main repo. I'll provide a quick description of the things in my fork in the following. There are three packages with adaptations for Squeak (of which the naming can be improved): - Roassal3-Pharo-Squeak: some classes from the Pharo Base System that Roassal assumes exist. For a proper port, I would want to get rid of this entirely and instead introduce adapter where necessary. This has to be loaded first as Roassal3 (core) wants to extend these classes, too. - Roassal3-Squeak: this is the proper port, mostly the Balloon code for rendering and for our Morph. - Roassal3-Shapes-Squeak: the -Shapes package uses some functions from the font system. We need to override these. We can't put these in our other -Squeak package because we first need the other classes to be loaded. Important todo items that I can currently see: - only the basic packages work (I tested Charts in particular); others have different dependencies into the Pharo system (e.g. UML) - quality and performance are lacking when compared to the Cairo/Athens version - fonts do not scale currently Best, Tom On Sat, Oct 3, 2020 at 8:41 PM gettimothy via Squeak-dev wrote: Hi, Thanks. On a brand new squeak6.0 alpha (easily spun up thanks to the squeak-launcher (:)   git tools, etc installed via the preference wizard. BaselineOftonel is in Monticello browser. I run  repository: 'github://squeak-smalltalk/squeak-tonel:squeak'; baseline: 'Tonel'; get; load. works fine. Open the Git browser,  Add Roassal3 project. RHClick..Add remote copy-n-paste in  https://github.com/gettimothy/hello-world.githttps://github.com/tom95/Roassal3 MNU Text(Object) does not understand #includesSubstring: what am I missing? thx The MNU again on  ---- On Sat, 03 Oct 2020 13:15:11 -0400 Jakob Reschke wrote ---- Hi, Tom provided the fix and the pull request, and I integrated it. So yes, we work together. Now to update an existing installation I suppose one should use Metacello: Metacello new repository: 'github://squeak-smalltalk/squeak-tonel:squeak'; baseline: 'Tonel'; get; load. Kind regards, Jakob Am Sa., 3. Okt. 2020 um 18:26 Uhr schrieb gettimothy : > > > Tom, > > Thank you very much for your work. > > Is this in support of Jakob's pull request? i.e. are you two working together? > > How should I proceed from here? Pull from your repo? > > > cheers, > > t > > > ---- On Sat, 03 Oct 2020 10:49:20 -0400 Tom Beckmann wrote ---- > > Hi timothy, > (you'll probably be seeing this mail twice, my first attempt bounced on the ML because my mail address had changed, sorry!) > > after I read yours and Eliot's conversation, I went to try loading Roassal3 to see how our Tonel support is doing. I stumbled over three errors: > - The error you just mentioned [1] > - Monticello was not strict enough with matching MCReader capabilities [2] > - The Geometry package used in Roassal uses Unicode symbols in their code, which is not supported in Squeak [3] > > I then went ahead and tried to adapt things a little and got the result you can see in the attachment. The experiment is found here [4]. I decided to not load Athena at all and started putting together an alternative Balloon backend instead (I am aware that Athena has a Balloon backend as well, the one I found consisted mostly of stubs, however). The resulting quality does not compare with Cairo, of course, but the basics were up and running very quickly. > > In theory, this should give you the working installation, however, packages load out-of-order because I did not manage to the baseline quite right just yet: > > Metacello new > baseline: 'Roassal3'; > repository: 'github://tom95/Roassal3'; > load. > > Best, > Tom > > [1] https://github.com/squeak-smalltalk/squeak-tonel/pull/5 > [2] http://forum.world.st/The-Inbox-Monticello-tobe-729-mcz-td5122924.html > [3] https://github.com/tom95/Geometry/commit/5e7e1fa89bbd699baf41066e33d6242730d4766c > [4] https://github.com/tom95/Roassal3 > > On Sat, Oct 3, 2020 at 4:38 PM gettimothy via Squeak-dev wrote: > > > Thank you. > > > If you are interested, I will be figuring out Pillar with this github stuff and getting the beginnings of some books up on http://squeakbooks.org* > > I will be documenting these steps in a booklet. > > This squot/git stuff will both be used and the subject of that booklet. > > good stuff. > > thanks for your work. > > > > > *Help Browser team...I am confident that an XTreams-Parsing grammar /actor pair can be written to auto-generate HelpBrowser books from the Pillar to the Help Browser. > > > > > > > ---- On Sat, 03 Oct 2020 10:32:02 -0400 Jakob Reschke wrote ---- > > I am in the middle of integrating a pull request to solve this bug in > squeak-tonel. :-) > > > > -- > Sent from: http://forum.world.st/Squeak-Dev-f45488.html > > > > > > -------------- next part -------------- An HTML attachment was scrubbed... URL: From gettimothy at zoho.com Sun Oct 4 12:34:29 2020 From: gettimothy at zoho.com (gettimothy) Date: Sun, 04 Oct 2020 08:34:29 -0400 Subject: [squeak-dev] Getting from GitBrowser to the System Browser Message-ID: <174f39b350f.b3bca56534674.418444634630814984@zoho.com> Hi folks, backing up from the specifics and looking at the "correct" way to go about this so we are all on the same page. Could you please check my assumptions as this Git stuff in squeak is new to me. If we have the Git, why do we need the Metacello? Can/should we do all the work in the Git and then when it is done, do the Metacello? Assuming "doing all the work in Git" is the way to go... Is just "working through the baseline" and getting things in the system a good approach? Thoughts? thx tty -------------- next part -------------- An HTML attachment was scrubbed... URL: From gettimothy at zoho.com Sun Oct 4 13:12:55 2020 From: gettimothy at zoho.com (gettimothy) Date: Sun, 04 Oct 2020 09:12:55 -0400 Subject: [squeak-dev] Getting from GitBrowser to the System Browser In-Reply-To: References: <174eec8c766.ff7b3acf29943.4093558483039111477@zoho.com> <1601734707834-0.post@n4.nabble.com> <174eedc8f4b.1079ec69330115.3927426311965542891@zoho.com> <1601735522192-0.post@n4.nabble.com> <174ef49400f.11bc1bbaf30912.1162000306490856123@zoho.com> <6355391776fd465aa2e9301d080640e1@MX2018-DAG1.hpi.uni-potsdam.de> <75ddd65341f5497884781b44fda6e136@MX2018-DAG1.hpi.uni-potsdam.de> Message-ID: <174f3be673b.db4b7fbd34942.5250858335404937199@zoho.com> Hi folks. I am on a brand new image, no git repos cloned or fetched. /home/wm/Squeak/images/RoassalSqueak6.0alpha-19893-64bit/RoassalSqueak6.0alpha-19893-64bit.image Squeak6.0alpha latest update: #19900 Current Change Set: HomeProject Image format 68021 (64 bit) my working notes step-by-step are: pristine image Installer ensureRecentMetacello SquitAddRemote >>remoteName       ^ remoteName ifNil: [String empty] ifNotNil: [remoteName asString] load: http://source.squeak.org/inbox/Monticello-tobe.729.mcz (Smalltalk classNamed: #Metacello) new    repository: 'github://squeak-smalltalk/squeak-tonel:squeak';    baseline: 'Tonel';    load. Metacello new     baseline: 'Roassal3';     repository: 'github://tom95/Roassal3';     load. all work fine so far excelp the Roassal3 install. The last one throws: MessageNotUnderstood: MCStReader class>>on:fileName: I am going clone Tom's repo now and see what happens. cheers, t ---- On Sun, 04 Oct 2020 07:20:59 -0400 Tom Beckmann wrote ---- Hi timothy, just as a quick update: the Baseline is now finally correct (I hadn't realized that my base package cannot share a prefix with the main package or else all its classes will be removed again when the main package loads). So, if you execute the following in a Squeak-trunk image and click "Proceed" a good number of times when you're prompted about missing classes, hopefully you'll be greeted with a chart: Metacello new     baseline: 'Roassal3';     repository: 'github://tom95/Roassal3';     load. RSChartExample new example01Markers open. A note to my earlier description of the changes: I dropped the Roassal3-Shapes-Squeak package and instead put the changes directly in the Roassal3-Shapes package in a way that they remain compatible with Pharo. Best, Tom On Sat, Oct 3, 2020 at 11:40 PM gettimothy via Squeak-dev wrote: Tom thank you. I willhit it tomorrow! I am really looking forward to this port.   Cheers. T ---- On Sat, 03 Oct 2020 17:26:32 -0400mailto:tomjonabc at gmail.com wrote ---- Hi, Metacello new     baseline: 'Roassal3';     repository: 'github://tom95/Roassal3';     load. will get you started, then you will have to handle the various errors that arise from the incorrect load order. Repeating the whole command once it's done will allow you to recover from some load errors, too. Best, Tom On Sat, Oct 3, 2020 at 10:21 PM gettimothy via Squeak-dev wrote: Hi Tom Thank you for the detailed reply. Re:"I would recommend using Metacello for loading it first, as it will install all dependencies. " Where do I find that Metaccello? I assume I will need a ConfigurationOfRoassal3 frome somewhere. Regarding the fork, I think yours us the way to go until I get the lay of the land. I haven't even wirked through roassak examples on pharo yet. When we get smooth installation abd Eliot has time to putter with it, the community can decide on the Athens thing. Thanks again ---- On Sat, 03 Oct 2020 15:57:43 -0400 mailto:tomjonabc at gmail.com wrote ---- Hi timothy, the snippet from Jakob should give you the updated Tonel such that you can load Roassal and its dependencies, at least syntax/format-wise. I would recommend using Metacello for loading it first, as it will install all dependencies. If you use my fork, you will get the "repaired" Geometry package. Afterwards, you can use the GitBrowser for proper development by cloning my Roassal fork and then checking out the code. Note that you will hit a great number of missing dependencies, which you need to all "Proceed" and potentially also fix manually. Some code may not be properly overridden, so be sure to check the -Squeak packages for missing overrides if you hit an error in a specific method. I'm hoping to get around to investigate the proper Baseline load order sometime in the next few days (especially also for my own curiosity...). Concerning next steps for porting: you can base your work off of my fork (for example simply fork it again and if you like, place pull requests). Or alternatively, take a different route to porting, potentially keeping Athens, and base your own work on the Roassal main repo. I'll provide a quick description of the things in my fork in the following. There are three packages with adaptations for Squeak (of which the naming can be improved): - Roassal3-Pharo-Squeak: some classes from the Pharo Base System that Roassal assumes exist. For a proper port, I would want to get rid of this entirely and instead introduce adapter where necessary. This has to be loaded first as Roassal3 (core) wants to extend these classes, too. - Roassal3-Squeak: this is the proper port, mostly the Balloon code for rendering and for our Morph. - Roassal3-Shapes-Squeak: the -Shapes package uses some functions from the font system. We need to override these. We can't put these in our other -Squeak package because we first need the other classes to be loaded. Important todo items that I can currently see: - only the basic packages work (I tested Charts in particular); others have different dependencies into the Pharo system (e.g. UML) - quality and performance are lacking when compared to the Cairo/Athens version - fonts do not scale currently Best, Tom On Sat, Oct 3, 2020 at 8:41 PM gettimothy via Squeak-dev wrote: Hi, Thanks. On a brand new squeak6.0 alpha (easily spun up thanks to the squeak-launcher (:)   git tools, etc installed via the preference wizard. BaselineOftonel is in Monticello browser. I run  repository: 'github://squeak-smalltalk/squeak-tonel:squeak'; baseline: 'Tonel'; get; load. works fine. Open the Git browser,  Add Roassal3 project. RHClick..Add remote copy-n-paste in  https://github.com/gettimothy/hello-world.githttps://github.com/tom95/Roassal3 MNU Text(Object) does not understand #includesSubstring: what am I missing? thx The MNU again on  ---- On Sat, 03 Oct 2020 13:15:11 -0400 Jakob Reschke wrote ---- Hi, Tom provided the fix and the pull request, and I integrated it. So yes, we work together. Now to update an existing installation I suppose one should use Metacello: Metacello new repository: 'github://squeak-smalltalk/squeak-tonel:squeak'; baseline: 'Tonel'; get; load. Kind regards, Jakob Am Sa., 3. Okt. 2020 um 18:26 Uhr schrieb gettimothy : > > > Tom, > > Thank you very much for your work. > > Is this in support of Jakob's pull request? i.e. are you two working together? > > How should I proceed from here? Pull from your repo? > > > cheers, > > t > > > ---- On Sat, 03 Oct 2020 10:49:20 -0400 Tom Beckmann wrote ---- > > Hi timothy, > (you'll probably be seeing this mail twice, my first attempt bounced on the ML because my mail address had changed, sorry!) > > after I read yours and Eliot's conversation, I went to try loading Roassal3 to see how our Tonel support is doing. I stumbled over three errors: > - The error you just mentioned [1] > - Monticello was not strict enough with matching MCReader capabilities [2] > - The Geometry package used in Roassal uses Unicode symbols in their code, which is not supported in Squeak [3] > > I then went ahead and tried to adapt things a little and got the result you can see in the attachment. The experiment is found here [4]. I decided to not load Athena at all and started putting together an alternative Balloon backend instead (I am aware that Athena has a Balloon backend as well, the one I found consisted mostly of stubs, however). The resulting quality does not compare with Cairo, of course, but the basics were up and running very quickly. > > In theory, this should give you the working installation, however, packages load out-of-order because I did not manage to the baseline quite right just yet: > > Metacello new > baseline: 'Roassal3'; > repository: 'github://tom95/Roassal3'; > load. > > Best, > Tom > > [1] https://github.com/squeak-smalltalk/squeak-tonel/pull/5 > [2] http://forum.world.st/The-Inbox-Monticello-tobe-729-mcz-td5122924.html > [3] https://github.com/tom95/Geometry/commit/5e7e1fa89bbd699baf41066e33d6242730d4766c > [4] https://github.com/tom95/Roassal3 > > On Sat, Oct 3, 2020 at 4:38 PM gettimothy via Squeak-dev wrote: > > > Thank you. > > > If you are interested, I will be figuring out Pillar with this github stuff and getting the beginnings of some books up on http://squeakbooks.org* > > I will be documenting these steps in a booklet. > > This squot/git stuff will both be used and the subject of that booklet. > > good stuff. > > thanks for your work. > > > > > *Help Browser team...I am confident that an XTreams-Parsing grammar /actor pair can be written to auto-generate HelpBrowser books from the Pillar to the Help Browser. > > > > > > > ---- On Sat, 03 Oct 2020 10:32:02 -0400 Jakob Reschke wrote ---- > > I am in the middle of integrating a pull request to solve this bug in > squeak-tonel. :-) > > > > -- > Sent from: http://forum.world.st/Squeak-Dev-f45488.html > > > > > > -------------- next part -------------- An HTML attachment was scrubbed... URL: From forums.jakob at resfarm.de Sun Oct 4 13:13:44 2020 From: forums.jakob at resfarm.de (Jakob Reschke) Date: Sun, 4 Oct 2020 15:13:44 +0200 Subject: [squeak-dev] Getting from GitBrowser to the System Browser In-Reply-To: <174f39b350f.b3bca56534674.418444634630814984@zoho.com> References: <174f39b350f.b3bca56534674.418444634630814984@zoho.com> Message-ID: Hi, Loading the repository packages with Git will only load the packages that belong to Roassal, but not its dependencies (other third-party packages) if any. To get the dependencies, Metacello is used. (Moreover the Metacello baseline could indicate that some packages are only relevant for Pharo version x and others for Pharo version y, or others for Squeak version z. I suppose that is something Tom has been modifying for his *-Squeak package.) So I would recommend: first install the software via Metacello, then start using Git on the loaded packages. It does not really matter whether you initialize the Git project before or after loading with Metacello. That is because currently the Clone action does not load the packages into the image (you would still have to "Checkout objects" after cloning). I should probably change that in the future. If you Add the repository instead of Clone, nothing will be loaded at first either. After you have both loaded the code via Metacello and set up the Git repository, check whether there are any differences between your image and what is on the active branch (the one with the green dot) by pushing the Commit button or right-clicking the top commit or active branch and choosing "Compare with working copy". If there are differences and if that is because a different branch or commit was used in the Metacello load, you have some options to fix the situation: 1) Identify the correct branch that you installed via Metacello. Then shift+right-click on the branch and choose "Make this the current branch". This will change the active branch, but not make any changes to the loaded classes (similar to Reparent in Monticello). 2) If there is no branch, identify the commit that matches what you installed, find it in the commit list, right-click on it and choose "Create new branch at this commit". Then proceed with option 1. 3) Overwrite the loaded classes with the state of the active branch: right-click on the top commit and choose "Checkout objects". If you do not use Metacello, you must collect the dependencies manually and load them with Git or Monticello in the correct order. To find the dependencies, you would read the baseline(s) and thus follow the dependency graph. Kind regards, Jakob Am So., 4. Okt. 2020 um 14:34 Uhr schrieb gettimothy : > > Hi folks, > > backing up from the specifics and looking at the "correct" way to go about this so we are all on the same page. > > Could you please check my assumptions as this Git stuff in squeak is new to me. > > > If we have the Git, why do we need the Metacello? Can/should we do all the work in the Git and then when it is done, do the Metacello? > > > Assuming "doing all the work in Git" is the way to go... > > Is just "working through the baseline" and getting things in the system a good approach? > > Thoughts? > > thx > > tty > From lewis at mail.msen.com Sun Oct 4 13:14:07 2020 From: lewis at mail.msen.com (David T. Lewis) Date: Sun, 4 Oct 2020 09:14:07 -0400 Subject: [squeak-dev] A Sad Day ??? concluded In-Reply-To: References: <05fa2ced-b4fd-f8a4-a6f1-2f50ed04b272@ifi.uio.no> <63d57fb2-3110-3762-7a8c-14ae6d6ef038@ifi.uio.no> <20201004024332.GA46334@shell.msen.com> Message-ID: <20201004131407.GA61026@shell.msen.com> On Sun, Oct 04, 2020 at 12:07:47PM +0900, sumi masato wrote: > Hi Dave, > > Great! > > Could you build a Docker image and publish it for macOS users > who are restricted 32 bit VM by Apple also to try it easily? > > -- > sumim I have no experience with Docker, but if you or someone else knows how to do that, I'll be happy help if you run into any difficulty compiling the VM. I do not understand "restricted 32 bit VM by Apple" but to clarify, the Linux VM I use is a 64 bit VM running the 32-bit Squeak image. I expect this is what you would want to use if you were building a Docker image, although you can also compile the VM as a 32 bit application if needed. But I saw no problems running Trygve's image on the 64 bit VM. Dave > > 2020-10-04 David T. Lewis : > > > Thank you Trygve, > > > > I confirm also that the image runs very well on my Ubuntu Linux laptop > > with a VM compiled per http://wiki.squeak.org/squeak/6354. > > > > Dave > > > > On Sat, Oct 03, 2020 at 07:56:43PM +0900, masato sumi wrote: > > > Dear Trygve, > > > > > > I confirmed that I could launch the Loke/BabyIDE image with the included > > > SqueakVM for Windows (8.1 and 10) > > > and I could also launch it in a web browser by using the SqueakJS VM ( > > > https://squeak.js.org/run ). > > > > > > Thank you very much. > > > > > > -- > > > sumim > > > > > > 2020-10-03 15:48 Trygve Reenskaug : > > > > > > > Dear Sumim, > > > > Thank you for your kind words. > > > > > > > > The latest version of Loke/BabyIDE written on Squeak3.10.2 is at > > > > https://data.mendeley.com/datasets/5xxgzv7fsp/1 > > > > The image is my program repository. It includes some examples of DCI > > > > programming, Ellen's Personal Programming IDE, Squeak Reverse > > Engineering > > > > (SRE), and more. > > > > > > > > Best > > > > --Trygve > > > > > > > > On 2020-10-02 20:14, masato sumi wrote: > > > > > > > > Dear Trygve, > > > > > > > > Thank you for your very long term contribution and efforts. > > > > > > > > I'm very sorry that I couldn't help you at all now. > > > > > > > > I'm afraid, but could you please make your latest version of > > Loke/BabyIDE > > > > written on Squeak3.10.2 available for future generations of researchers > > > > and/or followers? > > > > > > > > Anyway, I think your ideas and thoughts should be passed on to future > > > > generations as faithfully as we can possible, and I myself will try to > > make > > > > sure that. > > > > > > > > Thank you so much and goodbye. > > > > Please take care of yourself. > > > > > > > > -- > > > > sumim > > > > > > > > 2020-10-03 0:54 Trygve Reenskaug : > > > > > > > >> Dear all, > > > >> I need to use many words to explore why I can't understand current > > Squeak > > > >> code. I believe the reason is a profound one, and I hope some of you > > have > > > >> the patience to read about it. > > > >> > > > >> Thank you for your responses to my 'A Sad Day'-message. One response > > said > > > >> "*But please don't give up as an inventor of MVC, which has > > simplified > > > >> writing software for all of us.* > > > >> > > > >> > > > >> *We need new ideas to stabilize Smalltalk." *As to MVC, it was > > received > > > >> with acclamation when I first presented it at PARC in 1978, and people > > > >> suggested I should make it the theme of my article in the special > > Smalltalk > > > >> issue of Byte. I couldn't understand it; MVC was so simple and > > obvious that > > > >> is was not worth writing about it. Nevertheless, people seem to have > > > >> problems understanding MVC. It took me a long time before I gleaned > > what > > > >> was going on. The explanation is a deep one, rooted in our different > > mental > > > >> paradigms. > > > >> > > > >> From around 1970, I was working on Prokon, a distributed system for > > > >> managers in the shipbuilding industry: > > > >> > > > >> Every manager has their own computer that they use for augmenting > > their > > > >> mind. The manager understands their software and ideally writes it > > > >> themselves. Managers delegate conversations with other managers to > > their > > > >> computer's M-to-M network. (Marked with a heavy black line in the > > figure). > > > >> I chose "distributed planning with central control" as my example > > project. > > > >> Each manager creates a plan for their department, using apps suited to > > > >> their particular needs. A **distributed algorithm** ensures > > consistency > > > >> across departments. > > > >> > > > >> I came to PARC in 1978 and could immediately relate to the Smalltalk > > > >> image with its universe of collaborating objects. Alan's definition of > > > >> object-orientation fitted my Prokon model: "Thus its semantics are a > > bit > > > >> like having thousands and thousands of computers all hooked together > > by a > > > >> very fast network." > > > >> > > > >> MVC prescribes a network of communicating objects. Any object can fill > > > >> one or more positions in the network as long as it has the required > > > >> behavior; their classes are irrelevant. It's so simple that it's not > > worth > > > >> writing about it. > > > >> > > > >> > > > >> ==================== > > > >> > > > >> The work on this post was interrupted at this point by an unexpected > > week > > > >> in hospital. It gave me quiet days of pondering the futility of what > > I am > > > >> doing and I will be terminating my memberships in the Pharo and Squeak > > > >> mailing lists. I have also deleted most of the old draft of this > > message > > > >> and will quickly conclude with two observations: > > > >> > > > >> > > > >> 1. > > > >> The Smalltalk image is a universe of communicating objects. I call > > it > > > >> an object computer. It can be seen as the model of an entirely new > > kind of > > > >> computer, a model on a level closer to the human mind than the von > > Neumann > > > >> model of 1948. The new model is communication-centric and should > > supersede > > > >> the ubiquitous CPU-centric model as soon as possible. Working out > > the > > > >> details of this idea could make an exciting and disruptive Ph.D. > > thesis. > > > >> 2. > > > >> Smalltalk is called a programming language. It is a curious one, > > very > > > >> different from well-known languages like Java with their syntax and > > > >> semantics. Smalltalk, as a programming language, does not have the > > concept > > > >> of a program. Smalltalk, as a class-oriented language, does not > > have syntax > > > >> for the declaration of a class. Smalltalk, as an object-oriented > > language, > > > >> can't describe how objects collaborate to achieve a goal. You > > appear to be > > > >> happy with this state of affairs, at least, I see no sign of > > anybody > > > >> wanting to move on from the unfinished Smalltalk language to a > > mature > > > >> development environment. I do not find it satisfactory and it is > > not > > > >> acceptable to the intended managers populating the distributed > > system shown > > > >> in the first picture. Consequently, I have done something about it > > as > > > >> described in my SoSym article "*Personal Programming and the Object > > > >> Computer.*" I am tired of being alone in my endeavors and this ends > > > >> my work with Squeak and other Smalltalks. I wish you health and > > happiness > > > >> wherever you happen to be. > > > >> > > > >> Trygve > > > >> Personal programming and the object computer > > > >> https://doi.org/10.1007/s10270-019-00768-3 > > > >> > > > >> -- > > > >> > > > >> *The essence of object orientation is that objects collaborate to > > > >> achieve a goal. * > > > >> Trygve Reenskaug mailto: trygver at ifi.uio.no <% > > 20trygver at ifi.uio.no> > > > >> Morgedalsvn. 5A http://folk.uio.no/trygver/ > > > >> N-0378 Oslo http://fullOO.info > > > >> Norway Tel: (+47) 468 58 625 > > > >> > > > >> > > > > > > > > -- > > > > > > > > *The essence of object orientation is that objects collaborate to > > achieve > > > > a goal. * > > > > Trygve Reenskaug mailto: trygver at ifi.uio.no <% > > 20trygver at ifi.uio.no> > > > > Morgedalsvn. 5A http://folk.uio.no/trygver/ > > > > N-0378 Oslo http://fullOO.info > > > > Norway Tel: (+47) 468 58 625 > > > > > > > > > > > > > > > > > > > > > > > -- > sent from mobile > From tomjonabc at gmail.com Sun Oct 4 13:13:56 2020 From: tomjonabc at gmail.com (Tom Beckmann) Date: Sun, 4 Oct 2020 15:13:56 +0200 Subject: [squeak-dev] Getting from GitBrowser to the System Browser In-Reply-To: <174f39b350f.b3bca56534674.418444634630814984@zoho.com> References: <174f39b350f.b3bca56534674.418444634630814984@zoho.com> Message-ID: Hi timothy, first, on the Array>>\ error, this is likely because you somehow ended up with the master instead of the squeak branch of squeak-tonel. I would recommend to manually unload all three tonel packages using the Monticello Browser and then running: Metacello new repository: 'github://squeak-smalltalk/squeak-tonel:squeak'; baseline: 'Tonel'; load. On Metacello vs Git and the general workflow: - from my understanding, it is generally recommendable to first install a package using Metacello as it takes care to resolve and install third-party dependencies you may not want to care about - Metacello is, however, end-user oriented if you will; the sources are stored in a github-cache folder, which only exists for caching purposes. My usual workflow is thus, after installing the desired package once using Metacello, to clone the main repo (the repo that I actually care about) again using the GitBrowser and do a checkout on the most recent commit on master; this should leave things unchanged provided that Metacello also installed the version from the master branch - You can then work in your image and adapt things as needed; when you have a working increment, you can use the GitBrowser again to create commits and push them Github, typically to a fork that belongs to you and then place a pull request You can skip Metacello if you clone all dependencies using the GitBrowser and install them one after the other in the right order. If you look at the many dependencies of for example Roassal [1], it will however be pretty obvious why you would usually want to have Metacello automate this for you. Hope this helps you to get started. Please feel free to ask again if I left something unanswered or if you feel like the workflow should be easier in some way. Maybe there is something we can improve :) Best, Tom [1] https://github.com/tom95/Roassal3/blob/master/src/BaselineOfRoassal3/BaselineOfRoassal3.class.st#L64 On Sun, Oct 4, 2020 at 2:34 PM gettimothy via Squeak-dev < squeak-dev at lists.squeakfoundation.org> wrote: > Hi folks, > > backing up from the specifics and looking at the "correct" way to go about > this so we are all on the same page. > > Could you please check my assumptions as this Git stuff in squeak is new > to me. > > > If we have the Git, why do we need the Metacello? Can/should we do all the > work in the Git and then when it is done, do the Metacello? > > > Assuming "doing all the work in Git" is the way to go... > > Is just "working through the baseline" and getting things in the system a > good approach? > > Thoughts? > > thx > > tty > > > -------------- next part -------------- An HTML attachment was scrubbed... URL: From tomjonabc at gmail.com Sun Oct 4 13:17:54 2020 From: tomjonabc at gmail.com (Tom Beckmann) Date: Sun, 4 Oct 2020 15:17:54 +0200 Subject: [squeak-dev] Getting from GitBrowser to the System Browser In-Reply-To: <277e8a6be9754639bf79ff79b2a1822b@MX2018-DAG1.hpi.uni-potsdam.de> References: <174f39b350f.b3bca56534674.418444634630814984@zoho.com> <277e8a6be9754639bf79ff79b2a1822b@MX2018-DAG1.hpi.uni-potsdam.de> Message-ID: It looks like Jakob beat me by a couple of seconds :D Concerning the MCStReader error, have a look at this Inbox commit to fix it locally in your image for the moment :) http://forum.world.st/The-Inbox-Monticello-tobe-729-mcz-td5122924.html On Sun, Oct 4, 2020 at 3:14 PM Tom Beckmann wrote: > Hi timothy, > > first, on the Array>>\ error, this is likely because you somehow ended up > with the master instead of the squeak branch of squeak-tonel. I would > recommend to manually unload all three tonel packages using the Monticello > Browser and then running: > Metacello new > repository: 'github://squeak-smalltalk/squeak-tonel:squeak'; > baseline: 'Tonel'; > load. > > On Metacello vs Git and the general workflow: > - from my understanding, it is generally recommendable to first install a > package using Metacello as it takes care to resolve and install third-party > dependencies you may not want to care about > - Metacello is, however, end-user oriented if you will; the sources are > stored in a github-cache folder, which only exists for caching purposes. My > usual workflow is thus, after installing the desired package once using > Metacello, to clone the main repo (the repo that I actually care about) > again using the GitBrowser and do a checkout on the most recent commit on > master; this should leave things unchanged provided that Metacello also > installed the version from the master branch > - You can then work in your image and adapt things as needed; when you > have a working increment, you can use the GitBrowser again to create > commits and push them Github, typically to a fork that belongs to you and > then place a pull request > > You can skip Metacello if you clone all dependencies using the GitBrowser > and install them one after the other in the right order. If you look at the > many dependencies of for example Roassal [1], it will however be pretty > obvious why you would usually want to have Metacello automate this for you. > > Hope this helps you to get started. Please feel free to ask again if I > left something unanswered or if you feel like the workflow should be easier > in some way. Maybe there is something we can improve :) > > Best, > Tom > > [1] > https://github.com/tom95/Roassal3/blob/master/src/BaselineOfRoassal3/BaselineOfRoassal3.class.st#L64 > > On Sun, Oct 4, 2020 at 2:34 PM gettimothy via Squeak-dev < > squeak-dev at lists.squeakfoundation.org> wrote: > >> Hi folks, >> >> backing up from the specifics and looking at the "correct" way to go >> about this so we are all on the same page. >> >> Could you please check my assumptions as this Git stuff in squeak is new >> to me. >> >> >> If we have the Git, why do we need the Metacello? Can/should we do all >> the work in the Git and then when it is done, do the Metacello? >> >> >> Assuming "doing all the work in Git" is the way to go... >> >> Is just "working through the baseline" and getting things in the system a >> good approach? >> >> Thoughts? >> >> thx >> >> tty >> >> >> -------------- next part -------------- An HTML attachment was scrubbed... URL: From gettimothy at zoho.com Sun Oct 4 13:39:14 2020 From: gettimothy at zoho.com (gettimothy) Date: Sun, 04 Oct 2020 09:39:14 -0400 Subject: [squeak-dev] Getting from GitBrowser to the System Browser In-Reply-To: References: <174f39b350f.b3bca56534674.418444634630814984@zoho.com> Message-ID: <174f3d67e8e.fe39606835178.775127364609810974@zoho.com> Jacob and Tom I have both your workflow responses saved to workspaces that I have filed out to work by. Where do you guys store your cloned repos? I put mine in git-cache and that appears to conflict with what Metacello gets. Ok, "its a loop" meaning that the MetacelloConfiguration is created from the Git repo with data from the BaselineOfFoo   somehow.  The Metacello is loaded. Git is cloned. You do the smalltalk-git dance by checkout objects which takes them from git and puts them in the image. Tools are available to diff. So, I think it is best that I match your workflows to avoid confusion as we progress. Ok, gotta solve the Metacello "somehow" before getting the git. I will do that on a pristine image. thx again. ---- On Sun, 04 Oct 2020 09:13:44 -0400 Jakob Reschke wrote ---- Hi, Loading the repository packages with Git will only load the packages that belong to Roassal, but not its dependencies (other third-party packages) if any. To get the dependencies, Metacello is used. (Moreover the Metacello baseline could indicate that some packages are only relevant for Pharo version x and others for Pharo version y, or others for Squeak version z. I suppose that is something Tom has been modifying for his *-Squeak package.) So I would recommend: first install the software via Metacello, then start using Git on the loaded packages. It does not really matter whether you initialize the Git project before or after loading with Metacello. That is because currently the Clone action does not load the packages into the image (you would still have to "Checkout objects" after cloning). I should probably change that in the future. If you Add the repository instead of Clone, nothing will be loaded at first either. After you have both loaded the code via Metacello and set up the Git repository, check whether there are any differences between your image and what is on the active branch (the one with the green dot) by pushing the Commit button or right-clicking the top commit or active branch and choosing "Compare with working copy". If there are differences and if that is because a different branch or commit was used in the Metacello load, you have some options to fix the situation: 1) Identify the correct branch that you installed via Metacello. Then shift+right-click on the branch and choose "Make this the current branch". This will change the active branch, but not make any changes to the loaded classes (similar to Reparent in Monticello). 2) If there is no branch, identify the commit that matches what you installed, find it in the commit list, right-click on it and choose "Create new branch at this commit". Then proceed with option 1. 3) Overwrite the loaded classes with the state of the active branch: right-click on the top commit and choose "Checkout objects". If you do not use Metacello, you must collect the dependencies manually and load them with Git or Monticello in the correct order. To find the dependencies, you would read the baseline(s) and thus follow the dependency graph. Kind regards, Jakob Am So., 4. Okt. 2020 um 14:34 Uhr schrieb gettimothy : > > Hi folks, > > backing up from the specifics and looking at the "correct" way to go about this so we are all on the same page. > > Could you please check my assumptions as this Git stuff in squeak is new to me. > > > If we have the Git, why do we need the Metacello? Can/should we do all the work in the Git and then when it is done, do the Metacello? > > > Assuming "doing all the work in Git" is the way to go... > > Is just "working through the baseline" and getting things in the system a good approach? > > Thoughts? > > thx > > tty > -------------- next part -------------- An HTML attachment was scrubbed... URL: From gettimothy at zoho.com Sun Oct 4 13:48:01 2020 From: gettimothy at zoho.com (gettimothy) Date: Sun, 04 Oct 2020 09:48:01 -0400 Subject: [squeak-dev] getting squeak-launcher to git. Message-ID: <174f3de8721.b54a8c9135269.1208527717959704678@zoho.com> Hi Jakob Marcel suggested This repository could be easily created: https://github.com/OpenSmalltalk/opensmalltalk-launcher Should I get this to my github account and then ask you folks to clone it? Also, I will need to get the changes we have made into a repo and I don't know how to do that on Pharo. Ideas? "No" is a good answer if you are too busy. cordially, t -------------- next part -------------- An HTML attachment was scrubbed... URL: From forums.jakob at resfarm.de Sun Oct 4 13:52:30 2020 From: forums.jakob at resfarm.de (Jakob Reschke) Date: Sun, 4 Oct 2020 15:52:30 +0200 Subject: [squeak-dev] Getting from GitBrowser to the System Browser In-Reply-To: <174f3d67e8e.fe39606835178.775127364609810974@zoho.com> References: <174f39b350f.b3bca56534674.418444634630814984@zoho.com> <174f3d67e8e.fe39606835178.775127364609810974@zoho.com> Message-ID: Am So., 4. Okt. 2020 um 15:39 Uhr schrieb gettimothy : > > Where do you guys store your cloned repos? I put mine in git-cache and that appears to conflict with what Metacello gets. > Basically any place goes if it is not already used by something else. The git-cache directory is "already used by" Metacello. I have my repositories under a Squeak folder in My Documents, for example. You could also check them out next to the image if you like. > > Ok, "its a loop" meaning that the MetacelloConfiguration is created from the Git repo with data from the BaselineOfFoo somehow. The baseline is manually written by the maintainer of the repository. Metacello downloads the zip snapshot of the code and reads the baseline class first, to determine what to load into the image. Originally Metacello works with baselines and configurations, where the baselines specify which packages and dependencies there are and the configurations specify which versions of the stuff from a baseline to load. But in a Git repository, each commit is exactly one configuration of the contained packages. That's why only a baseline is needed for Git projects. This baseline should specify the versions or branches/commits of the dependencies, though. From forums.jakob at resfarm.de Sun Oct 4 14:06:01 2020 From: forums.jakob at resfarm.de (Jakob Reschke) Date: Sun, 4 Oct 2020 16:06:01 +0200 Subject: [squeak-dev] getting squeak-launcher to git. In-Reply-To: <174f3de8721.b54a8c9135269.1208527717959704678@zoho.com> References: <174f3de8721.b54a8c9135269.1208527717959704678@zoho.com> Message-ID: Hi Timothy, I don't have time for this at the moment, but you may put it in your own fork for now. In Pharo you would use IceBerg instead of the Git Browser to deal with Git projects. I have not used it myself though, so I cannot help any further without learning it myself (which is one of the aspects of also why I don't have time for this project). My hack of the launcher is no sustainable solution. Because after applying the hack you can no longer launch Pharo images. That's why I would not commit it to OpenSmalltalk/opensmalltalk-launcher if it existed. The "right" solution would rather need more work to be able to distinguish between Squeak and Pharo and use appropriate VM executable names. Or add further text entries in the GUI so this is not all forcibly-automatically determined, but can also be overridden manually. Or we create a genuine fork of the launcher and bend it officially for Squeak, but I would not like this. For one it would be odd to use a Pharo-built app as the semi-official Squeak launcher, and most importantly Sean DeNigris initially changed the launcher in an effort to foster more companionship between Squeak and Pharo again. Kind regards, Jakob Am So., 4. Okt. 2020 um 15:48 Uhr schrieb gettimothy : > > Hi Jakob > > Marcel suggested This repository could be easily created: https://github.com/OpenSmalltalk/opensmalltalk-launcher > > Should I get this to my github account and then ask you folks to clone it? > > Also, I will need to get the changes we have made into a repo and I don't know how to do that on Pharo. > > Ideas? > > "No" is a good answer if you are too busy. > > cordially, > > t > > > From gettimothy at zoho.com Sun Oct 4 14:31:16 2020 From: gettimothy at zoho.com (gettimothy) Date: Sun, 04 Oct 2020 10:31:16 -0400 Subject: [squeak-dev] Getting from GitBrowser to the System Browser In-Reply-To: References: <174f39b350f.b3bca56534674.418444634630814984@zoho.com> <277e8a6be9754639bf79ff79b2a1822b@MX2018-DAG1.hpi.uni-potsdam.de> Message-ID: <174f4061f54.1128ef67735528.4028957471702222795@zoho.com> Hi Tom, Still having problems loading Roassal3 via Metacello Here are my steps: pristine image Preference Wizard last page install git, refactor etc. Installer ensureRecentMetacello SquitAddRemote >>remoteName ^ remoteName ifNil: [String empty] ifNotNil: [remoteName asString] Manually unload all three tonel packages using the Monticello Browser MonticelloTonel-Core MonticelloTonel-FileSystem MonticelloTonel-Tests and then running: Metacello new      repository: 'github://squeak-smalltalk/squeak-tonel:squeak';      baseline: 'Tonel';      load. Metacello new     baseline: 'Roassal3';     repository: 'github://tom95/Roassal3';     load. GoferRepositoryError: UndefinedObject>>directoryFromPath:relativeTo: from MetacelloFetchingMCSPecLoader >> linearLoadPackageSpec: gover: this call here:      references := self         retryingResolvePackageSpecReferences: packageSpec         gofer: gofer. "look up mcz file" Transcript shows: ...RETRY->BaselineOfRoassal3 ...RETRY->BaselineOfRoassal3 gofer repository error: 'GoferRepositoryError: UndefinedObject>>directoryFromPath:relativeTo:'...ignoring ...FAILED->BaselineOfRoassal3 I am on 9.0 alpha...should I try a 5.3 image? cheers. ---- On Sun, 04 Oct 2020 09:17:54 -0400 Tom Beckmann wrote ---- It looks like Jakob beat me by a couple of seconds :D Concerning the MCStReader error, have a look at this Inbox commit to fix it locally in your image for the moment :) http://forum.world.st/The-Inbox-Monticello-tobe-729-mcz-td5122924.html On Sun, Oct 4, 2020 at 3:14 PM Tom Beckmann wrote: Hi timothy, first, on the Array>>\ error, this is likely because you somehow ended up with the master instead of the squeak branch of squeak-tonel. I would recommend to manually unload all three tonel packages using the Monticello Browser and then running: Metacello new      repository: 'github://squeak-smalltalk/squeak-tonel:squeak';      baseline: 'Tonel';      load. On Metacello vs Git and the general workflow: - from my understanding, it is generally recommendable to first install a package using Metacello as it takes care to resolve and install third-party dependencies you may not want to care about - Metacello is, however, end-user oriented if you will; the sources are stored in a github-cache folder, which only exists for caching purposes. My usual workflow is thus, after installing the desired package once using Metacello, to clone the main repo (the repo that I actually care about) again using the GitBrowser and do a checkout on the most recent commit on master; this should leave things unchanged provided that Metacello also installed the version from the master branch - You can then work in your image and adapt things as needed; when you have a working increment, you can use the GitBrowser again to create commits and push them Github, typically to a fork that belongs to you and then place a pull request You can skip Metacello if you clone all dependencies using the GitBrowser and install them one after the other in the right order. If you look at the many dependencies of for example Roassal [1], it will however be pretty obvious why you would usually want to have Metacello automate this for you. Hope this helps you to get started. Please feel free to ask again if I left something unanswered or if you feel like the workflow should be easier in some way. Maybe there is something we can improve :) Best, Tom [1] https://github.com/tom95/Roassal3/blob/master/src/BaselineOfRoassal3/BaselineOfRoassal3.class.st#L64 On Sun, Oct 4, 2020 at 2:34 PM gettimothy via Squeak-dev wrote: Hi folks, backing up from the specifics and looking at the "correct" way to go about this so we are all on the same page. Could you please check my assumptions as this Git stuff in squeak is new to me. If we have the Git, why do we need the Metacello? Can/should we do all the work in the Git and then when it is done, do the Metacello? Assuming "doing all the work in Git" is the way to go... Is just "working through the baseline" and getting things in the system a good approach? Thoughts? thx tty -------------- next part -------------- An HTML attachment was scrubbed... URL: From gettimothy at zoho.com Sun Oct 4 14:47:27 2020 From: gettimothy at zoho.com (gettimothy) Date: Sun, 04 Oct 2020 10:47:27 -0400 Subject: [squeak-dev] getting squeak-launcher to git. In-Reply-To: References: <174f3de8721.b54a8c9135269.1208527717959704678@zoho.com> Message-ID: <174f414f36e.1160f8f7635617.8526586964453118235@zoho.com> Jakob Thank you. I agree with all your points. For an interim "squeak only" version, I will figure out how to "iceberg" it up to my github account. >From that, I can start hacking it to be truly interoperable and automated. cheers. t ---- On Sun, 04 Oct 2020 10:06:01 -0400 Jakob Reschke wrote ---- Hi Timothy, I don't have time for this at the moment, but you may put it in your own fork for now. In Pharo you would use IceBerg instead of the Git Browser to deal with Git projects. I have not used it myself though, so I cannot help any further without learning it myself (which is one of the aspects of also why I don't have time for this project). My hack of the launcher is no sustainable solution. Because after applying the hack you can no longer launch Pharo images. That's why I would not commit it to OpenSmalltalk/opensmalltalk-launcher if it existed. The "right" solution would rather need more work to be able to distinguish between Squeak and Pharo and use appropriate VM executable names. Or add further text entries in the GUI so this is not all forcibly-automatically determined, but can also be overridden manually. Or we create a genuine fork of the launcher and bend it officially for Squeak, but I would not like this. For one it would be odd to use a Pharo-built app as the semi-official Squeak launcher, and most importantly Sean DeNigris initially changed the launcher in an effort to foster more companionship between Squeak and Pharo again. Kind regards, Jakob Am So., 4. Okt. 2020 um 15:48 Uhr schrieb gettimothy : > > Hi Jakob > > Marcel suggested This repository could be easily created: https://github.com/OpenSmalltalk/opensmalltalk-launcher > > Should I get this to my github account and then ask you folks to clone it? > > Also, I will need to get the changes we have made into a repo and I don't know how to do that on Pharo. > > Ideas? > > "No" is a good answer if you are too busy. > > cordially, > > t > > > -------------- next part -------------- An HTML attachment was scrubbed... URL: From gettimothy at zoho.com Sun Oct 4 15:02:54 2020 From: gettimothy at zoho.com (gettimothy) Date: Sun, 04 Oct 2020 11:02:54 -0400 Subject: [squeak-dev] Getting from GitBrowser to the System Browser In-Reply-To: <174f4061f54.1128ef67735528.4028957471702222795@zoho.com> References: <174f39b350f.b3bca56534674.418444634630814984@zoho.com> <277e8a6be9754639bf79ff79b2a1822b@MX2018-DAG1.hpi.uni-potsdam.de> <174f4061f54.1128ef67735528.4028957471702222795@zoho.com> Message-ID: <174f42318ca.e90ad08935719.881121529789828712@zoho.com> Ok, spun up a fresh 5.3 and ran the steps as below on the 6 alpha. Same error. I will hit it again next weekend when I have a functioning brain. Thanks for all your help. much appreciated. ---- On Sun, 04 Oct 2020 10:31:16 -0400 gettimothy via Squeak-dev wrote ---- Hi Tom, Still having problems loading Roassal3 via Metacello Here are my steps: pristine image Preference Wizard last page install git, refactor etc. Installer ensureRecentMetacello SquitAddRemote >>remoteName ^ remoteName ifNil: [String empty] ifNotNil: [remoteName asString] Manually unload all three tonel packages using the Monticello Browser MonticelloTonel-Core MonticelloTonel-FileSystem MonticelloTonel-Tests and then running: Metacello new      repository: 'github://squeak-smalltalk/squeak-tonel:squeak';      baseline: 'Tonel';      load. Metacello new     baseline: 'Roassal3';     repository: 'github://tom95/Roassal3';     load. GoferRepositoryError: UndefinedObject>>directoryFromPath:relativeTo: from MetacelloFetchingMCSPecLoader >> linearLoadPackageSpec: gover: this call here:      references := self         retryingResolvePackageSpecReferences: packageSpec         gofer: gofer. "look up mcz file" Transcript shows: ...RETRY->BaselineOfRoassal3 ...RETRY->BaselineOfRoassal3 gofer repository error: 'GoferRepositoryError: UndefinedObject>>directoryFromPath:relativeTo:'...ignoring ...FAILED->BaselineOfRoassal3 I am on 9.0 alpha...should I try a 5.3 image? cheers. ---- On Sun, 04 Oct 2020 09:17:54 -0400 Tom Beckmann wrote ---- It looks like Jakob beat me by a couple of seconds :D Concerning the MCStReader error, have a look at this Inbox commit to fix it locally in your image for the moment :) http://forum.world.st/The-Inbox-Monticello-tobe-729-mcz-td5122924.html On Sun, Oct 4, 2020 at 3:14 PM Tom Beckmann wrote: Hi timothy, first, on the Array>>\ error, this is likely because you somehow ended up with the master instead of the squeak branch of squeak-tonel. I would recommend to manually unload all three tonel packages using the Monticello Browser and then running: Metacello new      repository: 'github://squeak-smalltalk/squeak-tonel:squeak';      baseline: 'Tonel';      load. On Metacello vs Git and the general workflow: - from my understanding, it is generally recommendable to first install a package using Metacello as it takes care to resolve and install third-party dependencies you may not want to care about - Metacello is, however, end-user oriented if you will; the sources are stored in a github-cache folder, which only exists for caching purposes. My usual workflow is thus, after installing the desired package once using Metacello, to clone the main repo (the repo that I actually care about) again using the GitBrowser and do a checkout on the most recent commit on master; this should leave things unchanged provided that Metacello also installed the version from the master branch - You can then work in your image and adapt things as needed; when you have a working increment, you can use the GitBrowser again to create commits and push them Github, typically to a fork that belongs to you and then place a pull request You can skip Metacello if you clone all dependencies using the GitBrowser and install them one after the other in the right order. If you look at the many dependencies of for example Roassal [1], it will however be pretty obvious why you would usually want to have Metacello automate this for you. Hope this helps you to get started. Please feel free to ask again if I left something unanswered or if you feel like the workflow should be easier in some way. Maybe there is something we can improve :) Best, Tom [1] https://github.com/tom95/Roassal3/blob/master/src/BaselineOfRoassal3/BaselineOfRoassal3.class.st#L64 On Sun, Oct 4, 2020 at 2:34 PM gettimothy via Squeak-dev wrote: Hi folks, backing up from the specifics and looking at the "correct" way to go about this so we are all on the same page. Could you please check my assumptions as this Git stuff in squeak is new to me. If we have the Git, why do we need the Metacello? Can/should we do all the work in the Git and then when it is done, do the Metacello? Assuming "doing all the work in Git" is the way to go... Is just "working through the baseline" and getting things in the system a good approach? Thoughts? thx tty -------------- next part -------------- An HTML attachment was scrubbed... URL: From leves at caesar.elte.hu Sun Oct 4 16:00:06 2020 From: leves at caesar.elte.hu (Levente Uzonyi) Date: Sun, 4 Oct 2020 18:00:06 +0200 (CEST) Subject: [squeak-dev] The Inbox: Monticello-tobe.729.mcz In-Reply-To: References: Message-ID: Hi Tom, On Sat, 3 Oct 2020, commits at source.squeak.org wrote: > A new version of Monticello was added to project The Inbox: > http://source.squeak.org/inbox/Monticello-tobe.729.mcz > > ==================== Summary ==================== > > Name: Monticello-tobe.729 > Author: tobe > Time: 3 October 2020, 12:57:12.690975 pm > UUID: cbe1a05f-97e6-4780-9762-824be701f76a > Ancestors: Monticello-ul.728 > > Include a dot when matching against extensions > > Packages of extension-less formats (e.g. tonel) will otherwise match for e.g. the MCStReader in MCReader>>#canReadFileNamed: if their name happens to end on an "st", e.g. "Roassal3-Sunburst" > > =============== Diff against Monticello-ul.728 =============== > > Item was changed: > ----- Method: MCVersionReader class>>canReadFileNamed: (in category 'testing') ----- > canReadFileNamed: fileName > + ^ (fileName endsWith: '.', self extension)! > - ^ (fileName endsWith: self extension)! This is a reasonable change. But the very same method is implemented by the superclass MCReader. So, I think this method should be removed and the change should be applied to MCReader class>>canReadFileNamed:. What do you think? Levente From tomjonabc at gmail.com Sun Oct 4 16:02:52 2020 From: tomjonabc at gmail.com (Tom Beckmann) Date: Sun, 4 Oct 2020 18:02:52 +0200 Subject: [squeak-dev] The Inbox: Monticello-tobe.729.mcz In-Reply-To: References: Message-ID: Hi Levente, good catch! Yes that would indeed be a better solution. Would you like me to submit a new version to the inbox or will you just move this to treated and create an according version in trunk directly? :) Best, Tom On Sun, Oct 4, 2020 at 6:00 PM Levente Uzonyi wrote: > Hi Tom, > > On Sat, 3 Oct 2020, commits at source.squeak.org wrote: > > > A new version of Monticello was added to project The Inbox: > > http://source.squeak.org/inbox/Monticello-tobe.729.mcz > > > > ==================== Summary ==================== > > > > Name: Monticello-tobe.729 > > Author: tobe > > Time: 3 October 2020, 12:57:12.690975 pm > > UUID: cbe1a05f-97e6-4780-9762-824be701f76a > > Ancestors: Monticello-ul.728 > > > > Include a dot when matching against extensions > > > > Packages of extension-less formats (e.g. tonel) will otherwise match for > e.g. the MCStReader in MCReader>>#canReadFileNamed: if their name happens > to end on an "st", e.g. "Roassal3-Sunburst" > > > > =============== Diff against Monticello-ul.728 =============== > > > > Item was changed: > > ----- Method: MCVersionReader class>>canReadFileNamed: (in category > 'testing') ----- > > canReadFileNamed: fileName > > + ^ (fileName endsWith: '.', self extension)! > > - ^ (fileName endsWith: self extension)! > > This is a reasonable change. But the very same method is implemented by > the superclass MCReader. So, I think this method should be removed and > the change should be applied to MCReader class>>canReadFileNamed:. > What do you think? > > > Levente > > -------------- next part -------------- An HTML attachment was scrubbed... URL: From leves at caesar.elte.hu Sun Oct 4 16:07:03 2020 From: leves at caesar.elte.hu (Levente Uzonyi) Date: Sun, 4 Oct 2020 18:07:03 +0200 (CEST) Subject: [squeak-dev] The Inbox: Monticello-tobe.729.mcz In-Reply-To: References: Message-ID: On Sun, 4 Oct 2020, Tom Beckmann wrote: > Hi Levente, > > good catch! Yes that would indeed be a better solution. Would you like me to submit a new version to the inbox or will you just move this to treated and create an according version in trunk directly? :) Whichever you prefer. :) Levente > > Best, > Tom > > On Sun, Oct 4, 2020 at 6:00 PM Levente Uzonyi wrote: > Hi Tom, > > On Sat, 3 Oct 2020, commits at source.squeak.org wrote: > > > A new version of Monticello was added to project The Inbox: > > http://source.squeak.org/inbox/Monticello-tobe.729.mcz > > > > ==================== Summary ==================== > > > > Name: Monticello-tobe.729 > > Author: tobe > > Time: 3 October 2020, 12:57:12.690975 pm > > UUID: cbe1a05f-97e6-4780-9762-824be701f76a > > Ancestors: Monticello-ul.728 > > > > Include a dot when matching against extensions > > > > Packages of extension-less formats (e.g. tonel) will otherwise match for e.g. the MCStReader in MCReader>>#canReadFileNamed: if their name happens to end on an "st", e.g. "Roassal3-Sunburst" > > > > =============== Diff against Monticello-ul.728 =============== > > > > Item was changed: > >  ----- Method: MCVersionReader class>>canReadFileNamed: (in category 'testing') ----- > >  canReadFileNamed: fileName > > +     ^ (fileName endsWith: '.', self extension)! > > -     ^ (fileName endsWith: self extension)! > > This is a reasonable change. But the very same method is implemented by > the superclass MCReader. So, I think this method should be removed and > the change should be applied to MCReader class>>canReadFileNamed:. > What do you think? > > > Levente > > > From tomjonabc at gmail.com Sun Oct 4 16:16:55 2020 From: tomjonabc at gmail.com (Tom Beckmann) Date: Sun, 4 Oct 2020 18:16:55 +0200 Subject: [squeak-dev] The Inbox: Monticello-tobe.729.mcz In-Reply-To: References: Message-ID: Then please go ahead and create a new version directly if you don't mind :) I'm still getting sweaty palms each time Monticello warns me about ancestry while committing... Thank you! Tom On Sun, Oct 4, 2020 at 6:07 PM Levente Uzonyi wrote: > On Sun, 4 Oct 2020, Tom Beckmann wrote: > > > Hi Levente, > > > > good catch! Yes that would indeed be a better solution. Would you like > me to submit a new version to the inbox or will you just move this to > treated and create an according version in trunk directly? :) > > Whichever you prefer. :) > > > Levente > > > > > Best, > > Tom > > > > On Sun, Oct 4, 2020 at 6:00 PM Levente Uzonyi > wrote: > > Hi Tom, > > > > On Sat, 3 Oct 2020, commits at source.squeak.org wrote: > > > > > A new version of Monticello was added to project The Inbox: > > > http://source.squeak.org/inbox/Monticello-tobe.729.mcz > > > > > > ==================== Summary ==================== > > > > > > Name: Monticello-tobe.729 > > > Author: tobe > > > Time: 3 October 2020, 12:57:12.690975 pm > > > UUID: cbe1a05f-97e6-4780-9762-824be701f76a > > > Ancestors: Monticello-ul.728 > > > > > > Include a dot when matching against extensions > > > > > > Packages of extension-less formats (e.g. tonel) will otherwise > match for e.g. the MCStReader in MCReader>>#canReadFileNamed: if their name > happens to end on an "st", e.g. "Roassal3-Sunburst" > > > > > > =============== Diff against Monticello-ul.728 =============== > > > > > > Item was changed: > > > ----- Method: MCVersionReader class>>canReadFileNamed: (in > category 'testing') ----- > > > canReadFileNamed: fileName > > > + ^ (fileName endsWith: '.', self extension)! > > > - ^ (fileName endsWith: self extension)! > > > > This is a reasonable change. But the very same method is > implemented by > > the superclass MCReader. So, I think this method should be removed > and > > the change should be applied to MCReader class>>canReadFileNamed:. > > What do you think? > > > > > > Levente > > > > > > > -------------- next part -------------- An HTML attachment was scrubbed... URL: From commits at source.squeak.org Sun Oct 4 16:18:02 2020 From: commits at source.squeak.org (commits at source.squeak.org) Date: Sun, 4 Oct 2020 16:18:02 0000 Subject: [squeak-dev] The Inbox: PromisesTests-rww.10.mcz Message-ID: A new version of PromisesTests was added to project The Inbox: http://source.squeak.org/inbox/PromisesTests-rww.10.mcz ==================== Summary ==================== Name: PromisesTests-rww.10 Author: rww Time: 4 October 2020, 12:01:59.781672 pm UUID: 380cc875-64e7-41a3-ad9e-93cb54eeb338 Ancestors: PromisesTests-rww.9 calls includesKey: ==================== Snapshot ==================== SystemOrganization addCategory: #PromisesTests! ----- Method: Promise>>isFulfilled (in category '*promisestests') ----- isFulfilled ^ state == #fulfilled.! ----- Method: Promise>>isResolved (in category '*promisestests') ----- isResolved ^ self isFulfilled or: [self isRejected]! ----- Method: Promise>>rejectWith: (in category '*promisestests') ----- rejectWith: anObject "Reject this promise." | exception | mutex critical: [ exception := (anObject isKindOf: Exception) ifTrue: [anObject] ifFalse: [BrokenPromiseValue value: anObject]. (state == #pending) ifTrue: [ | worklist | error := exception. state := #rejected. worklist := rejecters. resolvers := #(). rejecters := #(). worklist do: [:r | self evaluateRejecter: r]] ifFalse: [PromiseAlreadyResolved new signal]]! ----- Method: Promise>>resolveWith: (in category '*promisestests') ----- resolveWith: arg "Resolve this promise. If arg is itself a Promise, make this promise depend upon it, as detailed in the Promises/A+ spec: https://promisesaplus.com/#the-promise-resolution-procedure" arg isPromise ifTrue: [ arg whenResolved: [:v | self resolveWith: v]. arg whenRejected: [:e | self rejectWith: e]] ifFalse: [ mutex critical: [ (arg isKindOf: Error) ifTrue: [^ self rejectWith: arg]. (state == #pending) ifTrue: [ | worklist | value := arg. state := #fulfilled. worklist := resolvers. resolvers := #(). rejecters := #(). worklist do: [:r | self evaluateResolver: r]] ifFalse: [PromiseAlreadyResolved new signal]]]! ----- Method: Promise>>wait (in category '*promisestests') ----- wait "Wait unconditionally for this promise to become fulfilled or rejected." | sema | sema := Semaphore new. self whenResolved:[sema signal]. self whenRejected:[sema signal]. sema wait. ^ self isFulfilled ifTrue: [ value ] ifFalse: [ self isRejected ifTrue: [ self error signal ] ifFalse: [ self ]]! ----- Method: Promise>>waitTimeoutMSecs: (in category '*promisestests') ----- waitTimeoutMSecs: msecs "Wait for at most the given number of milliseconds for this promise to settle. Answer true if it is resolved, false otherwise. False can therefore mean EITHER 'timeout' OR 'rejected'." | sema delay | sema := Semaphore new. self whenResolved: [sema signal]. self whenRejected: [sema signal]. delay := Delay timeoutSemaphore: sema afterMSecs: msecs. [sema wait] ensure: [delay unschedule]. ^ self isFulfilled ifTrue: [ value ] ifFalse: [ self isRejected ifTrue: [ self error signal ] ifFalse: [ self ]]! ----- Method: PromiseTest>>privateTestNilErrBlockPropagationResolvedReactorEvaluated (in category '*promisestests') ----- privateTestNilErrBlockPropagationResolvedReactorEvaluated "https://promisesaplus.com section 2.2.7.4" | p q | p := Promise new. q := p then: [:v | self error: 'Shouldn''t call resolvedBlock'] ifRejected: nil. p rejectWith: 1. self should: [q waitTimeoutMSecs: 1] raise: Error. self assert: p isRejected. self assert: q isRejected. self assert: p error class equals: BrokenPromiseValue. self assert: q error class equals: Error. self assert: p error value equals: 1. ! ----- Method: PromiseTest>>privateTestNilErrBlockPropagationResolvedReactorNotEvaluated (in category '*promisestests') ----- privateTestNilErrBlockPropagationResolvedReactorNotEvaluated "https://promisesaplus.com section 2.2.7.4" | p q | p := Promise new. q := p then: [:v | self error: 'Shouldn''t call resolvedBlock'] ifRejected: nil. p rejectWith: 1. self should: [q waitTimeoutMSecs: 1] raise: Error. self assert: p isRejected. self assert: q isRejected. self assert: p error class equals: BrokenPromiseValue. self assert: q error class equals: BrokenPromiseValue. self assert: p error value equals: 1. self assert: q error value equals: 1.! ----- Method: PromiseTest>>testAnErrorInOnRejectedRejectsPromise (in category '*promisestests') ----- testAnErrorInOnRejectedRejectsPromise "https://promisesaplus.com section 2.2.7.2" | p q error | p := Promise new. q := p ifRejected: [:e | (error := KeyNotFound new) signal]. p rejectWith: 1. self should: [q waitTimeoutMSecs: 1] raise: KeyNotFound. self assert: p isRejected description: 'Original Promise not rejected'. self assert: q isRejected description: 'Broken Promise not rejected'. self assert: p error class = BrokenPromiseValue. self assert: q error class = KeyNotFound. self assert: p error value == 1. self assert: q error == error.! ----- Method: PromiseTest>>testAnErrorInThenRejectsPromise (in category '*promisestests') ----- testAnErrorInThenRejectsPromise "https://promisesaplus.com section 2.2.7.2" | p q error | p := Promise new. q := p then: [:v | (error := KeyNotFound new) signal]. p resolveWith: 1. self should: [q waitTimeoutMSecs: 1] raise: KeyNotFound. self deny: p isRejected description: 'Original Promise rejected'. self assert: q isRejected description: 'Broken Promise not rejected'. self assert: p value = 1. self assert: q error == error.! ----- Method: PromiseTest>>testCannotRejectFulfilledPromise (in category '*promisestests') ----- testCannotRejectFulfilledPromise | p | p := Promise unit: 1. self should: [p rejectWith: Error new] raise: PromiseAlreadyResolved. self assert: p isResolved. self assert: 1 equals: p value. ! ----- Method: PromiseTest>>testCannotResolveaRejectedPromise (in category '*promisestests') ----- testCannotResolveaRejectedPromise | p e | p := Promise new. e := Error new. p rejectWith: e. self should: [p resolveWith: 1] raise: PromiseAlreadyResolved. self assert: p isRejected. self assert: p error == e. ! ----- Method: PromiseTest>>testChainedResolvers (in category '*promisestests') ----- testChainedResolvers | promise1 promise2 result | promise1 := Promise new. promise2 := Promise new. promise1 whenResolved: [:bool | promise2 resolveWith: bool not]. promise2 whenResolved: [:bool | result := bool]. promise1 resolveWith: false. promise2 waitTimeoutMSecs: 10. self should: [result].! ----- Method: PromiseTest>>testCollapsesChainsOfPromises (in category '*promisestests') ----- testCollapsesChainsOfPromises "The monadic bind operator has signature (m a -> (a -> m b) -> m b): that is, in our setting, the block given to `then:` is expected to return a *Promise* of a value, not a value directly. It is convenient to accept non-promise values and automatically lift them into the monad, but we must also ensure we treat the case where a `then:`-block yields a Promise correctly." | p q r | p := Promise new. q := p then: [:v | Promise unit: v * 2]. r := q then: [:v | Promise unit: v + 1]. p resolveWith: 4. q waitTimeoutMSecs: 1. r waitTimeoutMSecs: 1. self assert: 4 * 2 equals: q value. self assert: (4 * 2 + 1) equals: r value.! ----- Method: PromiseTest>>testFirstResolutionWins (in category '*promisestests') ----- testFirstResolutionWins | p | p := Promise new. p resolveWith: 1. self should: [p resolveWith: 2] raise: PromiseAlreadyResolved. self assert: p isResolved. self assert: p value == 1. ! ----- Method: PromiseTest>>testMultipleResolvers (in category '*promisestests') ----- testMultipleResolvers | promise sum | sum := 0. promise := Promise new. 5 timesRepeat: [ promise whenResolved: [:val | sum := sum + val]. ]. promise resolveWith: 5. (Delay forMilliseconds: 3) wait. self should: [sum = 25].! ----- Method: PromiseTest>>testNilErrBlockPropagation (in category '*promisestests') ----- testNilErrBlockPropagation "https://promisesaplus.com section 2.2.7.4" (Smalltalk includesKey: #PriorityVat) ifTrue: [self privateTestNilErrBlockPropagationResolvedReactorEvaluated] ifFalse: [self privateTestNilErrBlockPropagationResolvedReactorNotEvaluated].! ----- Method: PromiseTest>>testNilResolvedBlockPropagation (in category '*promisestests') ----- testNilResolvedBlockPropagation "https://promisesaplus.com section 2.2.7.3" | p q | p := Promise new. q := p then: nil ifRejected: [:e | self error: 'Shouldn''t call errBlock']. p resolveWith: 1. q waitTimeoutMSecs: 1.. self assert: p isResolved. self assert: q isResolved. self assert: p value equals: 1. self assert: q value equals: 1.! ----- Method: PromiseTest>>testRejectWithInvokesErrorHandlers (in category '*promisestests') ----- testRejectWithInvokesErrorHandlers | p error returnedError | returnedError := nil. error := KeyNotFound new. p := Promise ifRejected: [:e | returnedError := e]. p rejectWith: error. (Delay forMilliseconds: 1) wait. self assert: returnedError notNil description: 'Error block did not run.'. self assert: error equals: returnedError description: 'Error not passed into block'. self assert: error equals: p error description: 'Promise didn''t store error'.! ----- Method: PromiseTest>>testSingleResolver (in category '*promisestests') ----- testSingleResolver | promise sum | sum := 0. promise := Promise new. promise whenResolved: [:val | sum := sum + val]. promise resolveWith: 5. (Delay forMilliseconds: 1) wait. self assert: 5 equals: sum. ! ----- Method: PromiseTest>>testThenPermitsChainingOfPromises (in category '*promisestests') ----- testThenPermitsChainingOfPromises | p q r | p := Promise new. q := p then: [:v | v * 2]. r := q then: [:v | v + 1]. p resolveWith: 4. q waitTimeoutMSecs: 1. r waitTimeoutMSecs: 1. self assert: 4 * 2 equals: q value. self assert: (4 * 2 + 1) equals: r value.! ----- Method: PromiseTest>>testTimeout (in category '*promisestests') ----- testTimeout | promise | promise := Promise new. self should: [(promise waitTimeoutMSecs: 1) isPromise]. self shouldnt: [promise isResolved]. self shouldnt: [promise isRejected]. promise resolveWith: 45. self should: [(promise waitTimeoutMSecs: 1) == 45]. self should: [promise isResolved]. self shouldnt: [promise isRejected].! ----- Method: PromiseTest>>testTimeoutRejected (in category '*promisestests') ----- testTimeoutRejected | promise | promise := Promise new. self should: [(promise waitTimeoutMSecs: 1) isPromise]. self shouldnt: [promise isFulfilled]. self shouldnt: [promise isResolved]. self shouldnt: [promise isRejected]. promise rejectWith: 45. self should: [promise waitTimeoutMSecs: 1] raise: BrokenPromiseValue. self shouldnt: [promise isFulfilled]. self should: [promise isResolved]. self should: [promise isRejected].! ----- Method: PromiseTest>>testUnitReturnsaPromise (in category '*promisestests') ----- testUnitReturnsaPromise | p | p := Promise unit: 1. self assert: p isResolved.! ----- Method: PromiseTest>>testWaitForRejection (in category '*promisestests') ----- testWaitForRejection | p | p := Promise new. [ (Delay forMilliseconds: 1) wait. p rejectWith: Error new ] fork. self should: [ p wait ] raise: Error. ! ----- Method: PromiseTest>>testWaitForResolution (in category '*promisestests') ----- testWaitForResolution | p | p := Promise new. [ (Delay forMilliseconds: 1) wait. p resolveWith: #ok ] fork. p waitTimeoutMSecs: 3. self assert: [ p wait = #ok ]! ----- Method: PromiseTest>>testWaitRejectionYieldsCorrectBrokenPromise (in category '*promisestests') ----- testWaitRejectionYieldsCorrectBrokenPromise | p error | p := Promise new. [ (Delay forMilliseconds: 1) wait. p rejectWith: (error := Error new) ] fork. self should: [p wait] raise: Error. [ p wait ] on: Error do: [ :bp | ^ self assert: [ bp == error ] ]. self fail: 'Should not reach this point'! ----- Method: PromiseTest>>testifRejectedRunsBlockIfPromiseFails (in category '*promisestests') ----- testifRejectedRunsBlockIfPromiseFails "https://promisesaplus.com section 2.2.7.1" | p q error | error := nil. p := Promise new. q := p ifRejected: [:e | error := e "N.B. returns a value, does not signal an Exception"]. p rejectWith: KeyNotFound new. self should: [q waitTimeoutMSecs: 1] raise: KeyNotFound. self assert: q isResolved. self assert: q isRejected. self assert: KeyNotFound equals: error class. self assert: q error == error.! Error subclass: #BrokenPromiseValue instanceVariableNames: 'value' classVariableNames: '' poolDictionaries: '' category: 'PromisesTests'! ----- Method: BrokenPromiseValue class>>value: (in category 'instance creation') ----- value: obj ^ self new value: obj; yourself! ----- Method: BrokenPromiseValue>>defaultAction (in category 'handling') ----- defaultAction self messageText: 'Promise was rejected with value: ', value. ^super defaultAction! ----- Method: BrokenPromiseValue>>isResumable (in category 'handling') ----- isResumable ^ true! ----- Method: BrokenPromiseValue>>value (in category 'accessing') ----- value ^ value.! ----- Method: BrokenPromiseValue>>value: (in category 'accessing') ----- value: anObject value := anObject.! Error subclass: #PromiseAlreadyResolved instanceVariableNames: '' classVariableNames: '' poolDictionaries: '' category: 'PromisesTests'! From commits at source.squeak.org Sun Oct 4 16:24:06 2020 From: commits at source.squeak.org (commits at source.squeak.org) Date: Sun, 4 Oct 2020 16:24:06 0000 Subject: [squeak-dev] The Inbox: PromisesLocal-rww.20.mcz Message-ID: A new version of PromisesLocal was added to project The Inbox: http://source.squeak.org/inbox/PromisesLocal-rww.20.mcz ==================== Summary ==================== Name: PromisesLocal-rww.20 Author: rww Time: 4 October 2020, 10:43:29.453407 am UUID: ff0cd0f9-170e-4cfb-b64a-47a1b0446903 Ancestors: PromisesLocal-rww.19 use eventual sending to handle nil blocks, both the #then: block and the #ifRejected: block ==================== Snapshot ==================== SystemOrganization addCategory: #PromisesLocal! SystemOrganization addCategory: #'PromisesLocal-Testing'! Object subclass: #AbstractEventual instanceVariableNames: '' classVariableNames: '' poolDictionaries: '' category: 'PromisesLocal'! ----- Method: AbstractEventual class>>broken: (in category 'promises') ----- broken: error "self broken: Error new" ^ BrokenEventual new exception: error; yourself! ----- Method: AbstractEventual class>>isReference: (in category 'resolution') ----- isReference: object ^ object class includesBehavior: AbstractEventual ! ----- Method: AbstractEventual class>>promise (in category 'promises') ----- promise "self promise" ^ self promiseInVat: self vat. ! ----- Method: AbstractEventual class>>promiseClass (in category 'promises') ----- promiseClass ^ Promise ! ----- Method: AbstractEventual class>>promiseInVat: (in category 'promises') ----- promiseInVat: aVat "self promise" | promise buf | buf := OrderedCollection new: 0. promise := self promiseClass newOnBuffer: buf vat: aVat. ^ Association key: promise value: promise resolver ! ----- Method: AbstractEventual class>>refDescriptionString (in category 'accessing') ----- refDescriptionString ^ 'eventual'! ----- Method: AbstractEventual class>>resolution: (in category 'immediate') ----- resolution: obj ^ obj! ----- Method: AbstractEventual class>>resolverClass (in category 'promises') ----- resolverClass ^ LocalResolver ! ----- Method: AbstractEventual class>>toReferenceContext: (in category 'resolution') ----- toReferenceContext: value ^ self toReferenceContext: value vat: self vat. ! ----- Method: AbstractEventual class>>toReferenceContext:vat: (in category 'resolution') ----- toReferenceContext: value vat: vat (self isReference: value) ifTrue: [^ value]. (value isKindOf: Exception) ifTrue: [^ AbstractEventual broken: value] ifFalse: [^ NearEventual newOn: value vat: vat.]. ! ----- Method: AbstractEventual>>at: (in category 'overrides') ----- at: index | pair | pair := AbstractEventual promiseInVat: self vat. self redirectEventualMessage: (EventualMessageSend message: (Message selector: #at: argument: index) resolver: pair value). ^ pair key ! ----- Method: AbstractEventual>>at:put: (in category 'overrides') ----- at: index put: value | pair | pair := AbstractEventual promiseInVat: self vat. self redirectEventualMessage: (EventualMessageSend message: (Message selector: #at:put: arguments: {index. value}) resolver: pair value). ^ pair key ! ----- Method: AbstractEventual>>becomeContext: (in category 'messaging') ----- becomeContext: context self becomeForward: context. ! ----- Method: AbstractEventual>>doesNotUnderstand: (in category 'messaging') ----- doesNotUnderstand: aMessage ^ self redirectMessage: aMessage ! ----- Method: AbstractEventual>>eventual (in category 'accessing') ----- eventual ^ self! ----- Method: AbstractEventual>>eventualInVat: (in category 'accessing') ----- eventualInVat: aVat ^ self ! ----- Method: AbstractEventual>>isEventual (in category 'testing') ----- isEventual ^ true! ----- Method: AbstractEventual>>isFulfilled (in category 'testing') ----- isFulfilled ^ false! ----- Method: AbstractEventual>>isInteger (in category 'overrides') ----- isInteger | pair | pair := AbstractEventual promiseInVat: self vat. self redirectEventualMessage: (EventualMessageSend message: (Message selector: #isInteger) resolver: pair value). ^ pair key ! ----- Method: AbstractEventual>>isLocal (in category 'testing') ----- isLocal ^ true! ----- Method: AbstractEventual>>isNear (in category 'testing') ----- isNear ^ true! ----- Method: AbstractEventual>>isPassByConstruction (in category 'testing') ----- isPassByConstruction ^ false! ----- Method: AbstractEventual>>isPassByProxy (in category 'testing') ----- isPassByProxy ^ true! ----- Method: AbstractEventual>>isRejected (in category 'testing') ----- isRejected ^ false! ----- Method: AbstractEventual>>isRemote (in category 'testing') ----- isRemote ^ false! ----- Method: AbstractEventual>>isResolved (in category 'testing') ----- isResolved ^ false! ----- Method: AbstractEventual>>mustBeBoolean (in category 'messaging') ----- mustBeBoolean | context | context := thisContext sender. self resolution. context skipBackBeforeJump. ^ true! ----- Method: AbstractEventual>>printOn: (in category 'printing') ----- printOn: stream stream nextPutAll: self class name; nextPutAll: '::'; nextPutAll: self refDescriptionString; nextPutAll: '('. self vat printOn: stream. stream nextPutAll: ')'. ! ----- Method: AbstractEventual>>redirectMessage: (in category 'messaging') ----- redirectMessage: aMessage | pair | pair := AbstractEventual promiseInVat: self vat. self redirectEventualMessage: (EventualMessageSend message: aMessage resolver: pair value). ^ pair key ! ----- Method: AbstractEventual>>redirectMessageOneWay: (in category 'messaging') ----- redirectMessageOneWay: aMessage self redirectEventualMessage: (EventualMessageSend message: aMessage). ^ nil ! ----- Method: AbstractEventual>>refDescriptionString (in category 'printing') ----- refDescriptionString ^ self class refDescriptionString ! ----- Method: AbstractEventual>>rejectWith: (in category 'Promise/A+ protocol') ----- rejectWith: reason self subclassResponsibility! ----- Method: AbstractEventual>>resolution (in category 'accessing') ----- resolution ^ self! ----- Method: AbstractEventual>>resolveWith: (in category 'Promise/A+ protocol') ----- resolveWith: arg self subclassResponsibility! ----- Method: AbstractEventual>>send: (in category 'eventual sending') ----- send: selector | pair | pair := AbstractEventual promiseInVat: self vat. self redirectEventualMessage: (EventualMessageSend selector: selector resolver: pair value). ^ pair key ! ----- Method: AbstractEventual>>send:args: (in category 'eventual sending') ----- send: selector args: args | pair | pair := AbstractEventual promiseInVat: self vat. self redirectEventualMessage: (EventualMessageSend selector: selector arguments: args resolver: pair value). ^ pair key ! ----- Method: AbstractEventual>>sendOneWay: (in category 'eventual sending') ----- sendOneWay: selector self redirectEventualMessage: (EventualMessageSend selector: selector). ^ nil ! ----- Method: AbstractEventual>>sendOneWay:args: (in category 'eventual sending') ----- sendOneWay: selector args: args self redirectEventualMessage: (EventualMessageSend selector: selector arguments: args). ^ nil ! ----- Method: AbstractEventual>>wait (in category 'waiting') ----- wait "Wait unconditionally for this promise to become fulfilled or rejected." PromiseWaiter waitTimeoutMSecs: 1000 onPromise: self. ^ self resolution.! ----- Method: AbstractEventual>>waitTimeoutMSecs: (in category 'waiting') ----- waitTimeoutMSecs: msecs "Wait for at most the given number of milliseconds for this promise to settle. Answer true if it is resolved, false otherwise. False can therefore mean EITHER 'timeout' OR 'rejected'." PromiseWaiter waitTimeoutMSecs: msecs onPromise: self. ^ self resolution.! ----- Method: AbstractEventual>>waitTimeoutSeconds: (in category 'waiting') ----- waitTimeoutSeconds: secs "Wait for at most the given number of milliseconds for this promise to settle. Answer true if it is resolved, false otherwise. False can therefore mean EITHER 'timeout' OR 'rejected'." PromiseWaiter waitTimeoutSeconds: secs onPromise: self. ^ self resolution.! AbstractEventual subclass: #BrokenEventual instanceVariableNames: 'exception' classVariableNames: '' poolDictionaries: '' category: 'PromisesLocal'! ----- Method: BrokenEventual class>>refDescriptionString (in category 'accessing') ----- refDescriptionString ^ 'broken' ! ----- Method: BrokenEventual>>becomeContext: (in category 'messaging') ----- becomeContext: ref ^ self error: 'not switchable'! ----- Method: BrokenEventual>>doesNotUnderstand: (in category 'messaging') ----- doesNotUnderstand: aMessage ^ self exception signal! ----- Method: BrokenEventual>>error (in category 'accessing') ----- error ^ self exception! ----- Method: BrokenEventual>>exception (in category 'accessing') ----- exception ^exception! ----- Method: BrokenEventual>>exception: (in category 'accessing') ----- exception: anException exception := anException! ----- Method: BrokenEventual>>isBroken (in category 'testing') ----- isBroken ^ true! ----- Method: BrokenEventual>>isRejected (in category 'testing') ----- isRejected ^ true! ----- Method: BrokenEventual>>isResolved (in category 'testing') ----- isResolved ^ true! ----- Method: BrokenEventual>>printOn: (in category 'printing') ----- printOn: stream super printOn: stream. stream nextPutAll: '{'; nextPutAll: self exception description; nextPutAll: '}'. ! ----- Method: BrokenEventual>>redirectEventualMessage: (in category 'messaging') ----- redirectEventualMessage: anEventualMessage anEventualMessage receiver: exception. self vat schedule: anEventualMessage. ! ----- Method: BrokenEventual>>rejectWith: (in category 'Promise/A+ protocol') ----- rejectWith: arg PromiseAlreadyResolved new signal. ! ----- Method: BrokenEventual>>resolution (in category 'Promise/A+ protocol') ----- resolution ^ exception signal! ----- Method: BrokenEventual>>resolveWith: (in category 'Promise/A+ protocol') ----- resolveWith: arg PromiseAlreadyResolved new signal. ! ----- Method: BrokenEventual>>value (in category 'accessing') ----- value ^ exception! AbstractEventual subclass: #NearEventual instanceVariableNames: 'vat value' classVariableNames: '' poolDictionaries: '' category: 'PromisesLocal'! ----- Method: NearEventual class>>newOn: (in category 'instance creation') ----- newOn: anObject ^ self newOn: anObject vat: anObject vat. ! ----- Method: NearEventual class>>newOn:vat: (in category 'instance creation') ----- newOn: anObject vat: vat ^ self new initializeOnTarget: anObject vat: vat; yourself. ! ----- Method: NearEventual class>>refDescriptionString (in category 'accessing') ----- refDescriptionString ^ 'near'! ----- Method: NearEventual>>= (in category 'comparing') ----- = anObject "Answer whether the receiver and the argument represent the same object. If = is redefined in any subclass, consider also redefining the message hash." ^anObject = value! ----- Method: NearEventual>>basicEquality: (in category 'comparing') ----- basicEquality: anObject "Answer whether the receiver and the argument represent the same object. If = is redefined in any subclass, consider also redefining the message hash." ^value basicEquality: anObject! ----- Method: NearEventual>>becomeContext: (in category 'messaging') ----- becomeContext: context ! ----- Method: NearEventual>>hash (in category 'comparing') ----- hash ^value hash! ----- Method: NearEventual>>initializeOnTarget:vat: (in category 'initialization') ----- initializeOnTarget: anObject vat: aVat value := anObject. vat := aVat. ! ----- Method: NearEventual>>isFulfilled (in category 'testing') ----- isFulfilled ^ true! ----- Method: NearEventual>>isInteger (in category 'number protocol') ----- isInteger ^ value isInteger! ----- Method: NearEventual>>isPassByConstruction (in category 'serializing') ----- isPassByConstruction ^ value isPassByConstruction ! ----- Method: NearEventual>>isResolved (in category 'testing') ----- isResolved ^ true! ----- Method: NearEventual>>passByConstruction (in category 'serializing') ----- passByConstruction self isPassByConstruction ifTrue: [^ value] ifFalse: [self error: 'not passByConstruction']. ! ----- Method: NearEventual>>printOn: (in category 'printing') ----- printOn: stream stream nextPutAll: '{ '. value printOn: stream. stream nextPutAll: ' } >> '. super printOn: stream. ! ----- Method: NearEventual>>redirectEventualMessage: (in category 'messaging') ----- redirectEventualMessage: anEventualMessage anEventualMessage receiver: value. self vat schedule: anEventualMessage. ! ----- Method: NearEventual>>rejectWith: (in category 'Promise/A+ protocol') ----- rejectWith: arg PromiseAlreadyResolved new signal. ! ----- Method: NearEventual>>resolution (in category 'accessing') ----- resolution ^ value! ----- Method: NearEventual>>resolveWith: (in category 'Promise/A+ protocol') ----- resolveWith: arg PromiseAlreadyResolved new signal. ! ----- Method: NearEventual>>value (in category 'accessing') ----- value ^ value! ----- Method: NearEventual>>vat (in category 'accessing') ----- vat ^ vat! ----- Method: NearEventual>>wait (in category 'waiting') ----- wait super waitTimeoutMSecs: 3. super wait. ^ self resolution.! ----- Method: NearEventual>>waitTimeoutMSecs: (in category 'waiting') ----- waitTimeoutMSecs: msecs super waitTimeoutMSecs: 3. super waitTimeoutMSecs: msecs. ^ self resolution.! ----- Method: NearEventual>>waitTimeoutSeconds: (in category 'waiting') ----- waitTimeoutSeconds: secs super waitTimeoutMSecs: 3. super waitTimeoutSeconds: secs. ^ self resolution.! AbstractEventual subclass: #Promise instanceVariableNames: 'vat msgBuffer resolver' classVariableNames: '' poolDictionaries: '' category: 'PromisesLocal'! !Promise commentStamp: 'tonyg 1/31/2018 23:34' prior: 0! I represent the result of an asynchronous message. Once the message is processed, I will be resolved to a value. I am typically instantiated by invocations of #futureSend:at:args: (and not by #futureDo:atArgs:). See class-comment of FutureNode. I also implement the Promises/A+ Javascript specification. This allows you to chain my instances to perform arbitrarily complex asynchronous tasks with error handling baked in. A Promise may be in one of three possible states: #pending, #fulfilled or #rejected. A Promise may move from #pending -> #fulfilled (by way of the resolveWith: message), or from #pending -> #rejected (by way of rejectWith:). No other state changes may occur. Once #fulfilled or #rejected, a Promise's value must not change. In keeping with the major Javascript Promise implementations' interpretations of this, calls to resolveWith: or rejectWith: when a Promise is in #fulfilled or #rejected state are simply ignored - an error is not signalled. (See test cases PromiseTest testFirstResolutionWins, testCannotRejectFulfilledPromise and testCannotResolveaRejectedPromise.)! ----- Method: Promise class>>ifRejected: (in category 'instance creation') ----- ifRejected: aBlock ^ self new whenRejected: aBlock; yourself. ! ----- Method: Promise class>>new (in category 'instance creation') ----- new ^ self newOnBuffer: (OrderedCollection new: 0) vat: self vat! ----- Method: Promise class>>newOnBuffer:vat: (in category 'instance creation') ----- newOnBuffer: buf vat: vat ^ self basicNew initializeOnBuffer: buf vat: vat; yourself! ----- Method: Promise class>>refDescriptionString (in category 'accessing') ----- refDescriptionString ^ 'promise'! ----- Method: Promise class>>unit: (in category 'instance creation') ----- unit: anObject "Return a resolved Promise. #new is the other half of Promise's unit function; #new returns an unresolved Promise." ^ Promise new resolveWith: anObject.! ----- Method: Promise>>error (in category 'accessing') ----- error ^ nil! ----- Method: Promise>>fulfillWith: (in category 'Promise/A+ protocol') ----- fulfillWith: aBlock self fulfillWith: aBlock passErrors: (msgBuffer collect: [:e | e isRejector]) isEmpty! ----- Method: Promise>>fulfillWith:passErrors: (in category 'Promise/A+ protocol') ----- fulfillWith: aBlock passErrors: aBoolean "Evaluate aBlock. If it signals an exception, reject this promise with the exception as the argument; if it returns a value [or another Promise], resolve this promise with the result. If aBoolean is true, and an exception is signaled, it is passed out to the caller. If aBoolean is false, signaled exceptions are considered handled after the promise has been rejected." [ self resolveWith: aBlock value ] on: Exception do: [ :ex | (ex isKindOf: Halt) ifTrue: [ex pass] ifFalse: [ self rejectWith: ex. aBoolean ifTrue: [ ex pass ] ]]! ----- Method: Promise>>ifRejected: (in category 'Promise/A+ protocol') ----- ifRejected: errBlock ^ errBlock ifNil: [^ self whenBroken: [:e | e]] ifNotNil: [:b | self whenBroken: errBlock]. ! ----- Method: Promise>>initializeOnBuffer:vat: (in category 'initialization') ----- initializeOnBuffer: buf vat: aVat super initialize. msgBuffer := buf. vat := aVat. resolver := self resolverClass onRef: self buffer: buf. ! ----- Method: Promise>>isEventual (in category 'testing') ----- isEventual ^ true! ----- Method: Promise>>isNear (in category 'testing') ----- isNear ^ false! ----- Method: Promise>>isPromise (in category 'testing') ----- isPromise ^ true! ----- Method: Promise>>isRejected (in category 'testing') ----- isRejected ^ false! ----- Method: Promise>>printOn: (in category 'printing') ----- printOn: stream stream nextPutAll: 'a Promise<'; nextPutAll: self class name; nextPutAll: '>::'; nextPutAll: self refDescriptionString; nextPutAll: '('. self vat printOn: stream. stream nextPutAll: ')'. ! ----- Method: Promise>>redirectEventualMessage: (in category 'Promise/A+ protocol') ----- redirectEventualMessage: anEventualMessage [msgBuffer addLast: anEventualMessage] on: Exception do: [:error | self redirectEventualMessage: anEventualMessage]. ! ----- Method: Promise>>reject (in category 'Promise/A+ protocol') ----- reject self rejectWith: nil! ----- Method: Promise>>rejectWith: (in category 'resolving') ----- rejectWith: reason self resolver smash: reason.! ----- Method: Promise>>resolve (in category 'Promise/A+ protocol') ----- resolve self resolveWith: nil! ----- Method: Promise>>resolveWith: (in category 'resolving') ----- resolveWith: arg "Resolve this promise. If arg is itself a Promise, make this promise depend upon it, as detailed in the Promises/A+ spec: https://promisesaplus.com/#the-promise-resolution-procedure" self resolver resolve: arg. ! ----- Method: Promise>>resolver (in category 'accessing') ----- resolver ^ resolver! ----- Method: Promise>>resolverClass (in category 'accessing') ----- resolverClass ^ self class resolverClass! ----- Method: Promise>>then: (in category 'Promise/A+ protocol') ----- then: resolvedBlock resolvedBlock ifNil: [^ self whenResolved: [:o | o]] ifNotNil: [:b | ^ self whenResolved: resolvedBlock].! ----- Method: Promise>>then:ifRejected: (in category 'Promise/A+ protocol') ----- then: resolvedBlock ifRejected: errBlock "Return a Promise that, if it resolves, runs the resolvedBlock. If resolution throws an Exception, it runs the errBlock." | p | p := self then: resolvedBlock. self ifRejected: errBlock. ^ p.! ----- Method: Promise>>value (in category 'accessing') ----- value ^ self! ----- Method: Promise>>vat (in category 'accessing') ----- vat vat isNil ifTrue: [vat := super vat]. ^ vat! ----- Method: Promise>>vat: (in category 'accessing') ----- vat: aVat vat := aVat! ----- Method: Promise>>whenMoreResolved: (in category 'when clause') ----- whenMoreResolved: reactor "aBlock numArgs <= 1 ifFalse: [self error: 'Must be 0- or 1-argument block']." self redirectMessageOneWay: (Message selector: #whenMoreResolved: argument: reactor). ! Object subclass: #ELib instanceVariableNames: '' classVariableNames: 'ForkDebugger' poolDictionaries: '' category: 'PromisesLocal'! ----- Method: ELib class>>debugEventualException: (in category 'debugging') ----- debugEventualException: anException "For convenience. Construct a helper process to debug an exception that occurred in the active process later on so that the active process can (try to) resume. Uses a temporary variable to access and copy the signaler context now before it gets GC'ed." self forkDebugger ifTrue: [ | helperProcess | helperProcess := (EventualProcess forContext: anException signalerContext copyStack priority: Processor activeProcess priority onVat: Processor activeProcess vat) shouldResumeFromDebugger: true; yourself. Project current addDeferredUIMessage: [ helperProcess debugWithTitle: anException description full: false] ]. ! ----- Method: ELib class>>forkDebugger (in category 'preferences') ----- forkDebugger ^ ForkDebugger ifNil: [false]! ----- Method: ELib class>>forkDebugger: (in category 'preferences') ----- forkDebugger: bool ForkDebugger := bool. ! ----- Method: Object>>basicEquality: (in category '*promiseslocal') ----- basicEquality: anObject "Answer whether the receiver and the argument represent the same object. If = is redefined in any subclass, consider also redefining the message hash." ^self == anObject! ----- Method: Object>>basicEquivalence: (in category '*promiseslocal') ----- basicEquivalence: anObject "Primitive. Answer whether the receiver and the argument are the same object (have the same object pointer). Do not redefine the message == in any other class!! Essential. No Lookup. Do not override in any subclass. See Object documentation whatIsAPrimitive." "primitiveEquivalent" self primitiveFailed! ----- Method: Object>>eventual (in category '*promiseslocal') ----- eventual ^ NearEventual newOn: self ! ----- Method: Object>>eventualInVat: (in category '*promiseslocal') ----- eventualInVat: aVat ^ NearEventual newOn: self vat: aVat ! ----- Method: Object>>whenBroken: (in category '*promiseslocal') ----- whenBroken: reactor | pair | pair := AbstractEventual promiseInVat: self vat. self whenMoreResolved: (WhenBrokenReactor onClosure: reactor ref: self resolver: pair value). ^ pair key ! ----- Method: Object>>whenBrokenOnly: (in category '*promiseslocal') ----- whenBrokenOnly: reactor self whenMoreResolved: (WhenBrokenReactor onClosure: reactor ref: self resolver: nil). ^ nil ! ----- Method: Object>>whenMoreResolved: (in category '*promiseslocal') ----- whenMoreResolved: reactor (reactor isEventual and: [reactor isRemote]) ifTrue: [ reactor redirectMessageOneWay: (Message selector: #value: argument: self value)] ifFalse: [reactor value: self value] ! ----- Method: Object>>whenRejected: (in category '*promiseslocal') ----- whenRejected: aBlock ^ self whenBroken: aBlock ! ----- Method: Object>>whenResolved: (in category '*promiseslocal') ----- whenResolved: reactor | pair | pair := AbstractEventual promiseInVat: self vat. self whenMoreResolved: (WhenResolvedReactor onClosure: reactor ref: self resolver: pair value). ^ pair key ! ----- Method: Object>>whenResolvedOnly: (in category '*promiseslocal') ----- whenResolvedOnly: reactor self whenMoreResolved: (WhenResolvedReactor onClosure: reactor ref: self resolver: nil). ^ nil! Object subclass: #PriorityVat instanceVariableNames: 'vatNick currentState normalQ immediateQ flashQ flashOverrideQ eventualProcess accessProtect readSynch' classVariableNames: 'LocalVat' poolDictionaries: '' category: 'PromisesLocal'! ----- Method: PriorityVat class>>clearLocalVat (in category 'accessing') ----- clearLocalVat "PriorityVat clearLocalVat" ^ LocalVat ifNotNil: [LocalVat stop. LocalVat := nil] ! ----- Method: PriorityVat class>>localVat (in category 'accessing') ----- localVat "PriorityVat localVat" ^ LocalVat ifNil: [LocalVat := self newWithNick: 'local'] ! ----- Method: PriorityVat class>>newWithNick: (in category 'instance creation') ----- newWithNick: nick ^ self new vatNick: nick; yourself! ----- Method: PriorityVat class>>stateMap (in category 'class initialization') ----- stateMap "(((PriorityVat stateMap compile)))" | desc | desc := ProtocolStateCompiler initialState: #running. (desc newState: #running -> (nil -> #stopped)) add: #stopping -> (nil -> #stopping). (desc newState: #stopping -> (nil -> #stopped)) add: #stopping -> (nil -> #stopping); addInteger: #stopped -> (nil -> #stopped). (desc newState: #stopped -> (nil -> #stopped)). ^desc. ! ----- Method: PriorityVat>>initialize (in category 'private') ----- initialize self vatNick: ''. self start. currentState := self class stateMap compile.! ----- Method: PriorityVat>>isRunning (in category 'action') ----- isRunning ^ currentState ifNil: [false] ifNotNil: [:state | state isStateNamed: #running].! ----- Method: PriorityVat>>nextPriorityMsg (in category 'private') ----- nextPriorityMsg readSynch wait. accessProtect critical: [ flashOverrideQ isEmpty ifFalse: [ ^ flashOverrideQ next ]. flashQ isEmpty ifFalse: [ ^ flashQ next ]. immediateQ isEmpty ifFalse: [ ^ immediateQ next ]. normalQ isEmpty ifFalse: [ ^ normalQ next ]. ^ nil].! ----- Method: PriorityVat>>postCopy (in category 'private') ----- postCopy super postCopy. self initialize.! ----- Method: PriorityVat>>printOn: (in category 'private') ----- printOn: stream stream nextPutAll: 'vat#'. stream nextPutAll: self vatNick. ! ----- Method: PriorityVat>>processSends (in category 'private') ----- processSends [[ Processor yield. self nextPriorityMsg ifNotNil: [:msg | msg value]. self isRunning ] whileTrue] ifCurtailed: [self isRunning ifTrue: [self restartEventLoop]]. ! ----- Method: PriorityVat>>restartEventLoop (in category 'action') ----- restartEventLoop | currentEventLoop | eventualProcess ifNotNil: [:ea | currentEventLoop := ea]. eventualProcess := nil. eventualProcess := EventualProcess newOnVat: self. eventualProcess resumeAsProcess. currentEventLoop ifNotNil: [:ea | ea terminate ].! ----- Method: PriorityVat>>schedule: (in category 'action') ----- schedule: msg self schedule: msg priority: #Normal. ! ----- Method: PriorityVat>>schedule:priority: (in category 'action') ----- schedule: msg priority: priority self isRunning ifFalse: [^ self]. accessProtect critical: [ (priority == 3 or: [priority == #FlashOverride]) ifTrue: [flashOverrideQ nextPut: msg]. (priority == 2 or: [priority == #Flash]) ifTrue: [flashQ nextPut: msg]. (priority == 1 or: [priority == #Immediate]) ifTrue: [immediateQ nextPut: msg]. (priority == 0 or: [priority == #Normal]) ifTrue: [normalQ nextPut: msg]]. readSynch signal. ! ----- Method: PriorityVat>>start (in category 'action') ----- start self isRunning ifTrue: [^ self]. normalQ := SharedQueue new. immediateQ := SharedQueue new. flashQ := SharedQueue new. flashOverrideQ := SharedQueue new. accessProtect := Semaphore forMutualExclusion. readSynch := Semaphore new. eventualProcess := EventualProcess newOnVat: self. eventualProcess resumeAsProcess. ! ----- Method: PriorityVat>>stop (in category 'action') ----- stop self transitionEvent: #stopping. self schedule: [#cycle]. (Delay forMilliseconds: 1) wait. eventualProcess ifNotNil: [:p | eventualProcess terminate]. eventualProcess := nil. normalQ := nil. immediateQ := nil. flashQ := nil. flashOverrideQ := nil. accessProtect := nil. readSynch := nil. ! ----- Method: PriorityVat>>stopped (in category 'action') ----- stopped self transitionEvent: #stopped. ! ----- Method: PriorityVat>>transitionEvent: (in category 'events') ----- transitionEvent: event | newState | newState := currentState transitionEvent: event value: event client: self. (newState ~= currentState) ifTrue: [ currentState := newState. ^ true] ifFalse: [^ false]! ----- Method: PriorityVat>>vatNick (in category 'accessing') ----- vatNick ^ vatNick! ----- Method: PriorityVat>>vatNick: (in category 'accessing') ----- vatNick: nick vatNick := nick. ! Object subclass: #PromiseWaiter instanceVariableNames: 'promise value state' classVariableNames: '' poolDictionaries: '' category: 'PromisesLocal'! ----- Method: PromiseWaiter class>>newOnPromise: (in category 'as yet unclassified') ----- newOnPromise: promise "Wait unconditionally for this promise to become fulfilled or rejected." ^ self new initializeOnPromise: promise; yourself. ! ----- Method: PromiseWaiter class>>waitOnPromise: (in category 'as yet unclassified') ----- waitOnPromise: promise "Wait unconditionally for this promise to become fulfilled or rejected." | waiter | waiter := PromiseWaiter newOnPromise: promise. ^ waiter wait. ! ----- Method: PromiseWaiter class>>waitTimeoutMSecs:onPromise: (in category 'as yet unclassified') ----- waitTimeoutMSecs: msecs onPromise: promise | waiter | waiter := PromiseWaiter newOnPromise: promise. ^ waiter waitTimeoutMSecs: msecs. ! ----- Method: PromiseWaiter class>>waitTimeoutSeconds:onPromise: (in category 'as yet unclassified') ----- waitTimeoutSeconds: secs onPromise: promise ^ self waitTimeoutMSecs: (secs * 1000) onPromise: promise! ----- Method: PromiseWaiter>>initializeOnPromise: (in category 'initialize-release') ----- initializeOnPromise: prom state := #pending. promise := prom. promise whenResolved: [:v | self result: v]. promise whenRejected: [:v | self result: v]. (promise isResolved or: [promise isRejected]) ifTrue: [self result: promise]. ! ----- Method: PromiseWaiter>>result: (in category 'accessing') ----- result: anObject "Set the value of result" (state == #fulfilled) ifTrue: [^self]. state := #fulfilled. ! ----- Method: PromiseWaiter>>wait (in category 'control') ----- wait "Wait unconditionally for this promise to become fulfilled or rejected." | sema | (state == #fulfilled) ifTrue: [ promise removeActionsWithReceiver: self. ^ promise value]. sema := Semaphore new. promise whenResolved: [sema signal]. [[sema wait] on: TestFailure do: [:e | ]] ensure: [promise removeActionsWithReceiver: self]. ^ promise value. ! ----- Method: PromiseWaiter>>waitTimeoutMSecs: (in category 'control') ----- waitTimeoutMSecs: timeout | sema delay | (state == #fulfilled) ifTrue: [ promise removeActionsWithReceiver: self. ^ promise resolution]. sema := Semaphore new. promise whenResolved: [sema signal]. delay := Delay timeoutSemaphore: sema afterMSecs: timeout. [sema wait] ensure: [ delay unschedule. promise removeActionsWithReceiver: self]. ^ promise resolution. ! ----- Method: PromiseWaiter>>waitTimeoutSeconds: (in category 'control') ----- waitTimeoutSeconds: seconds ^self waitTimeoutMSecs: seconds * 1000 ! Object subclass: #Reactor instanceVariableNames: 'ref resolver closure' classVariableNames: '' poolDictionaries: '' category: 'PromisesLocal'! ----- Method: Reactor class>>onClosure:ref:resolver: (in category 'instance creation') ----- onClosure: closure ref: ref resolver: resolver ^ self new initOnClosure: closure ref: ref resolver: resolver; yourself. ! ----- Method: Reactor>>initOnClosure:ref:resolver: (in category 'initialize-release') ----- initOnClosure: aClosure ref: aRef resolver: aResolver closure := aClosure. ref := aRef. resolver := aResolver. ! ----- Method: Reactor>>isRejector (in category 'testing') ----- isRejector ^ false! ----- Method: Reactor>>isResolver (in category 'testing') ----- isResolver ^ false! ----- Method: Reactor>>reactToLostClient: (in category 'reacting') ----- reactToLostClient: anException self value: anException. ^ nil! ----- Method: Reactor>>value: (in category 'reacting') ----- value: ignored closure isNil ifTrue:[^ nil]. ^ closure cull: ref value. ! Reactor subclass: #WhenBrokenReactor instanceVariableNames: '' classVariableNames: '' poolDictionaries: '' category: 'PromisesLocal'! ----- Method: WhenBrokenReactor class>>isPassByConstruction (in category 'serialization') ----- isPassByConstruction ^ true! ----- Method: WhenBrokenReactor>>isRejector (in category 'testing') ----- isRejector ^ true! ----- Method: WhenBrokenReactor>>value: (in category 'as yet unclassified') ----- value: ignored | aRef aResolver aClosure result | closure isNil ifTrue:[^ nil]. (ref isBroken) ifTrue: [ aRef := ref. aResolver := resolver. aClosure := closure. ref := nil. resolver := nil. closure := nil. [result := aClosure cull: aRef value] on: Error do: [:ex | result := ex]. aResolver notNil ifTrue: [ aResolver resolve: result]. ^ nil]. (ref isNear) ifTrue: [ ref := nil. resolver := nil. closure := nil. ^ nil]. (ref isResolved) ifTrue: [^ nil] ifFalse: [ref whenMoreResolved: self. ^ nil]. ! Reactor subclass: #WhenResolvedReactor instanceVariableNames: '' classVariableNames: '' poolDictionaries: '' category: 'PromisesLocal'! ----- Method: WhenResolvedReactor class>>isPassByConstruction (in category 'serialization') ----- isPassByConstruction ^ true! ----- Method: WhenResolvedReactor>>isResolver (in category 'testing') ----- isResolver ^ true! ----- Method: WhenResolvedReactor>>value: (in category 'as yet unclassified') ----- value: ignored | aRef aResolver aClosure result | closure isNil ifTrue:[^ nil]. (ref isResolved) ifTrue: [ aRef := ref. aResolver := resolver. aClosure := closure. ref := nil. resolver := nil. closure := nil. [result := aClosure cull: aRef value] on: Error do: [:ex | result := ex]. aResolver isNil ifFalse: [aResolver resolve: result]. ^ nil] ifFalse: [ ref whenMoreResolved: self. ^ nil]. ! Object subclass: #Resolver instanceVariableNames: '' classVariableNames: '' poolDictionaries: '' category: 'PromisesLocal'! Resolver subclass: #LocalResolver instanceVariableNames: 'ref buf' classVariableNames: '' poolDictionaries: '' category: 'PromisesLocal'! ----- Method: LocalResolver class>>onRef:buffer: (in category 'instance creation') ----- onRef: ref buffer: buf ^ self new initializeOnRef: ref buffer: buf; yourself ! ----- Method: LocalResolver>>initializeOnRef:buffer: (in category 'initialize-release') ----- initializeOnRef: aRef buffer: aBuf ref := aRef. buf := aBuf. ! ----- Method: LocalResolver>>isDone (in category 'resolving') ----- isDone ^ ref isNil ! ----- Method: LocalResolver>>resolve: (in category 'resolving') ----- resolve: resolutionValue | tmp1 | self isDone ifTrue: [ ^ PromiseAlreadyResolved new signal ]. tmp1 := AbstractEventual toReferenceContext: resolutionValue. ref becomeContext: tmp1. self sendMsgsToNewRef: ref. ref := nil. ^ nil ! ----- Method: LocalResolver>>sendMsgsToNewRef: (in category 'resolving') ----- sendMsgsToNewRef: newRef | pendingMessages msg | buf isNil ifTrue: [^nil]. pendingMessages := buf readStream. buf := nil. [pendingMessages atEnd] whileFalse: [ msg := pendingMessages next. newRef redirectEventualMessage: msg]. ! ----- Method: LocalResolver>>smash: (in category 'resolving') ----- smash: exception self isDone ifTrue: [ ^ PromiseAlreadyResolved new signal ]. ^ (AbstractEventual isReference: exception) ifTrue: [self resolve: exception] ifFalse: [ (exception class includesBehavior: Exception) ifTrue: [self resolve: exception] ifFalse: [self resolve: (BrokenEventual new exception: (BrokenPromiseValue value: exception); yourself)]]. ! ----- Method: Resolver>>isDone (in category 'resolving') ----- isDone self subclassResponsibility ! ----- Method: Resolver>>resolve: (in category 'resolving') ----- resolve: value self subclassResponsibility ! ----- Method: Resolver>>smash: (in category 'resolving') ----- smash: exception self subclassResponsibility ! ----- Method: Resolver>>smashString: (in category 'resolving') ----- smashString: exceptionTxt ^ self smash: (Error new messageText: exceptionTxt)! ServiceProvider subclass: #PromisesLocalServiceProvider instanceVariableNames: '' classVariableNames: '' poolDictionaries: '' category: 'PromisesLocal'! ----- Method: PromisesLocalServiceProvider class>>initialize (in category 'initialization') ----- initialize ServiceRegistry current buildProvider: self new! MessageSend subclass: #EventualMessageSend instanceVariableNames: 'resolver' classVariableNames: '' poolDictionaries: '' category: 'PromisesLocal'! ----- Method: EventualMessageSend class>>message: (in category 'instance creation') ----- message: aMessage ^ self new selector: aMessage selector; arguments: aMessage arguments; resolver: nil; yourself! ----- Method: EventualMessageSend class>>message:resolver: (in category 'instance creation') ----- message: aMessage resolver: aResolver ^ self new selector: aMessage selector; arguments: aMessage arguments; resolver: aResolver; yourself! ----- Method: EventualMessageSend class>>receiver:resolver:selector: (in category 'instance creation') ----- receiver: anObject resolver: aResolver selector: aSymbol ^ (super receiver: anObject selector: aSymbol) resolver: aResolver; yourself! ----- Method: EventualMessageSend class>>receiver:resolver:selector:arguments: (in category 'instance creation') ----- receiver: anObject resolver: aResolver selector: aSymbol arguments: anArray ^ (super receiver: anObject selector: aSymbol arguments: anArray) resolver: aResolver; yourself! ----- Method: EventualMessageSend class>>selector: (in category 'as yet unclassified') ----- selector: aSymbol ^ (super receiver: nil selector: aSymbol) resolver: nil; yourself! ----- Method: EventualMessageSend class>>selector:arguments: (in category 'as yet unclassified') ----- selector: aSymbol arguments: anArray ^ (super receiver: nil selector: aSymbol arguments: anArray) resolver: nil; yourself! ----- Method: EventualMessageSend class>>selector:arguments:resolver: (in category 'as yet unclassified') ----- selector: aSymbol arguments: anArray resolver: aResolver ^ (super receiver: nil selector: aSymbol arguments: anArray) resolver: aResolver; yourself! ----- Method: EventualMessageSend class>>selector:resolver: (in category 'as yet unclassified') ----- selector: aSymbol resolver: aResolver ^ (super receiver: nil selector: aSymbol) resolver: aResolver; yourself! ----- Method: EventualMessageSend>>isOneWay (in category 'testing') ----- isOneWay ^ self resolver isNil! ----- Method: EventualMessageSend>>isRejector (in category 'testing') ----- isRejector ^ (self selector == #whenMoreResolved:) and: [self arguments first isRejector]! ----- Method: EventualMessageSend>>printOn: (in category 'private') ----- printOn: t1 | t2 | t1 nextPutAll: 'EventualSend ('. receiver printOn: t1. t1 nextPutAll: ' '. (selector isUnary or: [selector isInfix]) ifTrue: [selector printOn: t1. t1 nextPutAll: ' '. self arguments do: [:t3 | t1 print: t3] separatedBy: [t1 nextPutAll: ' ']] ifFalse: [t2 := (self selector subStrings: ':') collect: [:t3 | t3 asSymbol asSimpleSetter asString]. t2 with: self arguments do: [:t3 :t4 | t1 nextPutAll: ' '; nextPutAll: t3; nextPutAll: ' '. t4 printOn: t1]]. t1 nextPutAll: ') -> ['. resolver printOn: t1. t1 nextPutAll: ']'! ----- Method: EventualMessageSend>>resolve: (in category 'api') ----- resolve: ref self resolver ifNotNil: [self resolver resolve: ref].! ----- Method: EventualMessageSend>>resolver (in category 'accessing') ----- resolver ^ resolver! ----- Method: EventualMessageSend>>resolver: (in category 'accessing') ----- resolver: aResolver resolver := aResolver! ----- Method: EventualMessageSend>>smash: (in category 'api') ----- smash: exception self resolver ifNotNil: [self resolver smash: exception].! ----- Method: EventualMessageSend>>value (in category 'api') ----- value | value | [ value := receiver perform: selector withArguments: (self collectArguments: arguments) inSuperclass: receiver class. self resolver notNil ifTrue: [ self resolver resolve: value ] ] on: Exception do: [:ex | self resolver ifNotNil: [:r | r smash: ex]. (ex isKindOf: Halt) ifTrue: [ex pass] ifFalse: [ELib debugEventualException: ex]]. ! Process subclass: #EventualProcess instanceVariableNames: 'eventualName vat' classVariableNames: '' poolDictionaries: '' category: 'PromisesLocal'! ----- Method: EventualProcess class>>forContext:priority:onVat: (in category 'instance creation') ----- forContext: aContext priority: anInteger onVat: aVat "Answer an instance of me that has suspended aContext at priority anInteger." | newProcess | newProcess := self newOnVat: aVat. newProcess suspendedContext: aContext. newProcess priority: anInteger. ^newProcess! ----- Method: EventualProcess class>>newOnVat: (in category 'instance creation') ----- newOnVat: vat ^ super new priority: Processor userBackgroundPriority; eventualName: 'vat thread'; vat: vat; setupContext; yourself! ----- Method: EventualProcess>>eventualName (in category 'accessing') ----- eventualName ^ eventualName! ----- Method: EventualProcess>>eventualName: (in category 'accessing') ----- eventualName: aName eventualName := aName. ! ----- Method: EventualProcess>>printOn: (in category 'accessing') ----- printOn: aStream aStream nextPutAll: '{squeake'. self eventualName notNil ifTrue: [ aStream nextPutAll: '-'. aStream nextPutAll: self eventualName asString]. aStream nextPutAll: '} '. super printOn: aStream. ! ----- Method: EventualProcess>>resume (in category 'changing process state') ----- resume (Processor activeProcess == self) ifTrue: [self resumeAsProcess] ifFalse: [self resumeInVat]. ! ----- Method: EventualProcess>>resumeAsProcess (in category 'changing process state') ----- resumeAsProcess super resume.! ----- Method: EventualProcess>>resumeInVat (in category 'changing process state') ----- resumeInVat self vat schedule: self suspendedContext.! ----- Method: EventualProcess>>setupContext (in category 'initialize-release') ----- setupContext self suspendedContext: [ self vat processSends. Processor terminateActive] asContext.! ----- Method: EventualProcess>>vat (in category 'accessing') ----- vat ^ vat! ----- Method: EventualProcess>>vat: (in category 'accessing') ----- vat: aVat vat := aVat! ----- Method: Process>>vat (in category '*promiseslocal') ----- vat ^ PriorityVat localVat.! ----- Method: BlockClosure>>eventual (in category '*promiseslocal') ----- eventual | pair eMsg | pair := AbstractEventual promiseInVat: self vat. eMsg := EventualMessageSend receiver: self resolver: pair value selector: #value. self vat schedule: eMsg. ^ pair key ! ----- Method: ProtoObject>>basicEquivalence: (in category '*promiseslocal') ----- basicEquivalence: anObject "Primitive. Answer whether the receiver and the argument are the same object (have the same object pointer). Do not redefine the message == in any other class!! Essential. No Lookup. Do not override in any subclass. See Object documentation whatIsAPrimitive." self primitiveFailed! ----- Method: ProtoObject>>defaultLabelForInspector (in category '*promiseslocal') ----- defaultLabelForInspector "Answer the default label to be used for an Inspector window on the receiver." ^ self class name! ----- Method: ProtoObject>>inspect (in category '*promiseslocal') ----- inspect "Create and schedule an Inspector in which the user can examine the receiver's variables." Inspector openOn: self withEvalPane: true! ----- Method: ProtoObject>>isBroken (in category '*promiseslocal') ----- isBroken ^ false! ----- Method: ProtoObject>>isEventual (in category '*promiseslocal') ----- isEventual ^ false ! ----- Method: ProtoObject>>isFulfilled (in category '*promiseslocal') ----- isFulfilled ^ self isNear ! ----- Method: ProtoObject>>isNear (in category '*promiseslocal') ----- isNear ^ true! ----- Method: ProtoObject>>isPromise (in category '*promiseslocal') ----- isPromise ^ false ! ----- Method: ProtoObject>>isProxy (in category '*promiseslocal') ----- isProxy ^ false ! ----- Method: ProtoObject>>isResolved (in category '*promiseslocal') ----- isResolved ^ self isPromise not ! ----- Method: ProtoObject>>redirectEventualMessage: (in category '*promiseslocal') ----- redirectEventualMessage: anEventualMessage anEventualMessage receiver: self. self vat schedule: anEventualMessage. ! ----- Method: ProtoObject>>resolution (in category '*promiseslocal') ----- resolution ^ self! ----- Method: ProtoObject>>vat (in category '*promiseslocal') ----- vat ^ Processor activeProcess vat ! TestCase subclass: #PriorityVatTest instanceVariableNames: 'eventReceived' classVariableNames: '' poolDictionaries: '' category: 'PromisesLocal-Testing'! ----- Method: PriorityVatTest>>tearDown (in category 'initialize-release') ----- tearDown (PriorityVat clearLocalVat; localVat) restartEventLoop. ! ----- Method: PriorityVatTest>>testPriorityVat (in category 'testing') ----- testPriorityVat | vat | vat := PriorityVat newWithNick: 'testVat'. eventReceived := false. vat schedule: [eventReceived := true]. (Delay forMilliseconds: 1) wait. self assert: eventReceived. vat stop.! TestCase subclass: #RefsTest instanceVariableNames: '' classVariableNames: '' poolDictionaries: '' category: 'PromisesLocal-Testing'! ----- Method: RefsTest>>tearDown (in category 'initialize-release') ----- tearDown (PriorityVat clearLocalVat; localVat) restartEventLoop. ! ----- Method: RefsTest>>testArithmeticPrimitivesWithPromiseReceiver (in category 'testing') ----- testArithmeticPrimitivesWithPromiseReceiver | t1 t2 | t1 := 42 eventual. t2 := 10. t1 * t2 whenResolved: [:t3 | self assert: t3 resolution == 420]! ----- Method: RefsTest>>testBasicPromiseResolution (in category 'testing') ----- testBasicPromiseResolution | pair | pair := AbstractEventual promise. self assert: pair key isEventual. pair value resolve: 'rob'. self assert: pair key isNear. self assert: pair key = 'rob'. ! ----- Method: RefsTest>>testBasicPromiseSmashing (in category 'testing') ----- testBasicPromiseSmashing | pair | pair := AbstractEventual promise. self assert: pair key isEventual. pair value smashString: 'test promise smashing'. self assert: pair key isBroken. self should: [pair key immediate] raise: Error! ----- Method: RefsTest>>testBasicPromiseToBooleanResolution (in category 'testing') ----- testBasicPromiseToBooleanResolution | tmp1 | tmp1 := AbstractEventual promise. self assert: tmp1 key isEventual. tmp1 value resolve: true. self assert: tmp1 key isNear; assert: tmp1 key = true! ----- Method: RefsTest>>testBlockClosure (in category 'testing') ----- testBlockClosure | result | [42 * 10] eventual whenResolved: [:r | result := r resolution]. (Delay forMilliseconds: 100) wait. self assert: result = 420.! ----- Method: RefsTest>>testFailureArithmeticPrimitivesWithPromiseArgument (in category 'testing') ----- testFailureArithmeticPrimitivesWithPromiseArgument | num1 num2 | num1 := 10. num2 := 42 eventual. [num1 * num2 whenResolved: [:result | self assert: result == 420]. self assert: false] on: Exception do: [:ex | ^ self assert: true]. self assert: false! ----- Method: RefsTest>>testLocalResolve (in category 'testing') ----- testLocalResolve | pair | pair := AbstractEventual promise. pair value resolve: 'rob'. self assert: (pair key = 'rob'). self should: [pair value smashString: 'test smash'] raise: Error. ! ----- Method: RefsTest>>testLocalSmash (in category 'testing') ----- testLocalSmash | pair | pair := AbstractEventual promise. pair value smashString: 'smash promise test'. self should: [pair key foobar] raise: Error. self should: [pair value smashString: 'smash promise test'] raise: Error! ----- Method: RefsTest>>testNearRefs (in category 'testing') ----- testNearRefs | obj | obj := Object new. self assert: (obj eventual = obj eventual). ! ----- Method: RefsTest>>testUsedLocalResolver (in category 'testing') ----- testUsedLocalResolver | resolver | resolver := LocalResolver onRef: nil buffer: nil. self assert: resolver isDone. self should: [resolver resolve: 2] raise: Error. self should: [resolver smashString: 'test smash'] raise: Error. ! ----- Method: RefsTest>>testWhenBroken (in category 'testing') ----- testWhenBroken | result oldForkDebugger | oldForkDebugger := ELib forkDebugger. ELib forkDebugger: false. 42 eventual / 0 whenBroken: [:t3 | result := t3 resolution. self assert: result isError]. (Delay forMilliseconds: 100) wait. self assert: (result class == ZeroDivide). ELib forkDebugger: oldForkDebugger. ! ----- Method: RefsTest>>testWhenResolved (in category 'testing') ----- testWhenResolved | result t1 t2 | t1 := 42 eventual. t2 := 10. t1 * t2 whenResolved: [:t3 | result := t3 resolution. self assert: result == 420]. (Delay forMilliseconds: 100) wait. self assert: result == 420.! Error subclass: #BrokenPromise instanceVariableNames: 'exception' classVariableNames: '' poolDictionaries: '' category: 'PromisesLocal'! !BrokenPromise commentStamp: 'tonyg 2/17/2017 13:53' prior: 0! I am signalled when, during a Promise>>wait, the promise is rejected. promise: the promise itself. ! ----- Method: BrokenPromise>>defaultAction (in category 'as yet unclassified') ----- defaultAction self messageText: 'Promise was rejected'. ^super defaultAction! ----- Method: BrokenPromise>>exception (in category 'as yet unclassified') ----- exception ^ exception! ----- Method: BrokenPromise>>exception: (in category 'as yet unclassified') ----- exception: aX exception := aX! ----- Method: BrokenPromise>>isResumable (in category 'as yet unclassified') ----- isResumable ^ true! ----- Method: BrokenPromise>>promise (in category 'as yet unclassified') ----- promise ^ self exception! Error subclass: #BrokenPromiseValue instanceVariableNames: 'value' classVariableNames: '' poolDictionaries: '' category: 'PromisesLocal'! ----- Method: BrokenPromiseValue class>>value: (in category 'instance creation') ----- value: obj ^ self new value: obj; yourself! ----- Method: BrokenPromiseValue>>defaultAction (in category 'handling') ----- defaultAction self messageText: 'Promise was rejected with value: ', value. ^super defaultAction! ----- Method: BrokenPromiseValue>>isResumable (in category 'handling') ----- isResumable ^ true! ----- Method: BrokenPromiseValue>>value (in category 'accessing') ----- value ^ value.! ----- Method: BrokenPromiseValue>>value: (in category 'accessing') ----- value: anObject value := anObject.! Error subclass: #PromiseAlreadyResolved instanceVariableNames: '' classVariableNames: '' poolDictionaries: '' category: 'PromisesLocal'! From rabbit at churchofthesacrifice.org Sun Oct 4 16:27:10 2020 From: rabbit at churchofthesacrifice.org (rabbit) Date: Sun, 04 Oct 2020 16:27:10 +0000 Subject: [squeak-dev] The Inbox: PromisesTests-rww.10.mcz In-Reply-To: References: Message-ID: Hello Tony, all, I made some changes to the trunk Promise and the PromiseTest. Mainly, to the tests I added short waits and delays. This allows the PromisesLocal to be tested by the Promises/A* tests that you have written, Tony. I changed the Promise as well, in some small ways. Due to the chart and description, here on ERights.org [1], a resolved promise can either a fulfilled promise to a value or a broken promise for rejection. I added isFulfilled and changed isResolved. I also changed the return value of the #waitTimeoutMSecs: to match #wait and return the value or signal the exception. There is a difference between trunk Promise and PromisesLocal when a resolveReactor is chained onto a promise that with be rejected. In PromisesLocal, the ResolvedReactor is run with a resolved rejection/broken. In trunk Promise the #then: block is NOT run, but the error propagates. I separated the tests into these two scenarios. It is possible to load PromisesLocal on top of this update and pass green. Kindly, rabbit [1] ERight's Reference Mechanics - http://erights.org/elib/concurrency/refmech.html On 10/4/20 12:18 PM, commits at source.squeak.org wrote: > A new version of PromisesTests was added to project The Inbox: > http://source.squeak.org/inbox/PromisesTests-rww.10.mcz > > ==================== Summary ==================== > > Name: PromisesTests-rww.10 > Author: rww > Time: 4 October 2020, 12:01:59.781672 pm > UUID: 380cc875-64e7-41a3-ad9e-93cb54eeb338 > Ancestors: PromisesTests-rww.9 > > calls includesKey: > > ==================== Snapshot ==================== > > SystemOrganization addCategory: #PromisesTests! > > ----- Method: Promise>>isFulfilled (in category '*promisestests') ----- > isFulfilled > > ^ state == #fulfilled.! > > ----- Method: Promise>>isResolved (in category '*promisestests') ----- > isResolved > > ^ self isFulfilled or: [self isRejected]! > > ----- Method: Promise>>rejectWith: (in category '*promisestests') ----- > rejectWith: anObject > "Reject this promise." > | exception | > mutex critical: [ > exception := (anObject isKindOf: Exception) > ifTrue: [anObject] > ifFalse: [BrokenPromiseValue value: anObject]. > (state == #pending) > ifTrue: [ | worklist | > error := exception. > state := #rejected. > worklist := rejecters. > resolvers := #(). > rejecters := #(). > worklist do: [:r | self evaluateRejecter: r]] > ifFalse: [PromiseAlreadyResolved new signal]]! > > ----- Method: Promise>>resolveWith: (in category '*promisestests') ----- > resolveWith: arg > "Resolve this promise. If arg is itself a Promise, make this promise depend upon it, > as detailed in the Promises/A+ spec: > https://promisesaplus.com/#the-promise-resolution-procedure" > > arg isPromise > ifTrue: [ > arg whenResolved: [:v | self resolveWith: v]. > arg whenRejected: [:e | self rejectWith: e]] > ifFalse: [ > mutex critical: [ > (arg isKindOf: Error) > ifTrue: [^ self rejectWith: arg]. > (state == #pending) > ifTrue: [ | worklist | > value := arg. > state := #fulfilled. > worklist := resolvers. > resolvers := #(). > rejecters := #(). > worklist do: [:r | self evaluateResolver: r]] > ifFalse: [PromiseAlreadyResolved new signal]]]! > > ----- Method: Promise>>wait (in category '*promisestests') ----- > wait > "Wait unconditionally for this promise to become fulfilled or rejected." > | sema | > sema := Semaphore new. > self whenResolved:[sema signal]. > self whenRejected:[sema signal]. > sema wait. > ^ self isFulfilled > ifTrue: [ value ] > ifFalse: [ self isRejected > ifTrue: [ self error signal ] > ifFalse: [ self ]]! > > ----- Method: Promise>>waitTimeoutMSecs: (in category '*promisestests') ----- > waitTimeoutMSecs: msecs > "Wait for at most the given number of milliseconds for this promise to settle. > Answer true if it is resolved, false otherwise. False can therefore mean EITHER 'timeout' OR 'rejected'." > | sema delay | > sema := Semaphore new. > self whenResolved: [sema signal]. > self whenRejected: [sema signal]. > delay := Delay timeoutSemaphore: sema afterMSecs: msecs. > [sema wait] ensure: [delay unschedule]. > ^ self isFulfilled > ifTrue: [ value ] > ifFalse: [ self isRejected > ifTrue: [ self error signal ] > ifFalse: [ self ]]! > > ----- Method: PromiseTest>>privateTestNilErrBlockPropagationResolvedReactorEvaluated (in category '*promisestests') ----- > privateTestNilErrBlockPropagationResolvedReactorEvaluated > > "https://promisesaplus.com section 2.2.7.4" > | p q | > p := Promise new. > q := p then: [:v | self error: 'Shouldn''t call resolvedBlock'] ifRejected: nil. > p rejectWith: 1. > self should: [q waitTimeoutMSecs: 1] raise: Error. > self assert: p isRejected. > self assert: q isRejected. > self assert: p error class equals: BrokenPromiseValue. > self assert: q error class equals: Error. > self assert: p error value equals: 1. > ! > > ----- Method: PromiseTest>>privateTestNilErrBlockPropagationResolvedReactorNotEvaluated (in category '*promisestests') ----- > privateTestNilErrBlockPropagationResolvedReactorNotEvaluated > > "https://promisesaplus.com section 2.2.7.4" > | p q | > p := Promise new. > q := p then: [:v | self error: 'Shouldn''t call resolvedBlock'] ifRejected: nil. > p rejectWith: 1. > self should: [q waitTimeoutMSecs: 1] raise: Error. > self assert: p isRejected. > self assert: q isRejected. > self assert: p error class equals: BrokenPromiseValue. > self assert: q error class equals: BrokenPromiseValue. > self assert: p error value equals: 1. > self assert: q error value equals: 1.! > > ----- Method: PromiseTest>>testAnErrorInOnRejectedRejectsPromise (in category '*promisestests') ----- > testAnErrorInOnRejectedRejectsPromise > "https://promisesaplus.com section 2.2.7.2" > | p q error | > p := Promise new. > q := p ifRejected: [:e | (error := KeyNotFound new) signal]. > p rejectWith: 1. > self should: [q waitTimeoutMSecs: 1] raise: KeyNotFound. > self assert: p isRejected description: 'Original Promise not rejected'. > self assert: q isRejected description: 'Broken Promise not rejected'. > self assert: p error class = BrokenPromiseValue. > self assert: q error class = KeyNotFound. > self assert: p error value == 1. > self assert: q error == error.! > > ----- Method: PromiseTest>>testAnErrorInThenRejectsPromise (in category '*promisestests') ----- > testAnErrorInThenRejectsPromise > "https://promisesaplus.com section 2.2.7.2" > | p q error | > p := Promise new. > q := p then: [:v | (error := KeyNotFound new) signal]. > p resolveWith: 1. > self should: [q waitTimeoutMSecs: 1] raise: KeyNotFound. > self deny: p isRejected description: 'Original Promise rejected'. > self assert: q isRejected description: 'Broken Promise not rejected'. > self assert: p value = 1. > self assert: q error == error.! > > ----- Method: PromiseTest>>testCannotRejectFulfilledPromise (in category '*promisestests') ----- > testCannotRejectFulfilledPromise > | p | > p := Promise unit: 1. > self should: [p rejectWith: Error new] raise: PromiseAlreadyResolved. > self assert: p isResolved. > self assert: 1 equals: p value. > ! > > ----- Method: PromiseTest>>testCannotResolveaRejectedPromise (in category '*promisestests') ----- > testCannotResolveaRejectedPromise > | p e | > p := Promise new. > e := Error new. > p rejectWith: e. > self should: [p resolveWith: 1] raise: PromiseAlreadyResolved. > self assert: p isRejected. > self assert: p error == e. > ! > > ----- Method: PromiseTest>>testChainedResolvers (in category '*promisestests') ----- > testChainedResolvers > | promise1 promise2 result | > promise1 := Promise new. > promise2 := Promise new. > promise1 whenResolved: [:bool | promise2 resolveWith: bool not]. > promise2 whenResolved: [:bool | result := bool]. > promise1 resolveWith: false. > promise2 waitTimeoutMSecs: 10. > self should: [result].! > > ----- Method: PromiseTest>>testCollapsesChainsOfPromises (in category '*promisestests') ----- > testCollapsesChainsOfPromises > "The monadic bind operator has signature (m a -> (a -> m b) -> m b): that is, in our setting, > the block given to `then:` is expected to return a *Promise* of a value, not a value directly. > It is convenient to accept non-promise values and automatically lift them into the monad, > but we must also ensure we treat the case where a `then:`-block yields a Promise correctly." > | p q r | > p := Promise new. > q := p then: [:v | Promise unit: v * 2]. > r := q then: [:v | Promise unit: v + 1]. > p resolveWith: 4. > q waitTimeoutMSecs: 1. > r waitTimeoutMSecs: 1. > self assert: 4 * 2 equals: q value. > self assert: (4 * 2 + 1) equals: r value.! > > ----- Method: PromiseTest>>testFirstResolutionWins (in category '*promisestests') ----- > testFirstResolutionWins > | p | > p := Promise new. > p resolveWith: 1. > self should: [p resolveWith: 2] raise: PromiseAlreadyResolved. > self assert: p isResolved. > self assert: p value == 1. > ! > > ----- Method: PromiseTest>>testMultipleResolvers (in category '*promisestests') ----- > testMultipleResolvers > > | promise sum | > sum := 0. > promise := Promise new. > 5 timesRepeat: [ > promise whenResolved: [:val | sum := sum + val]. > ]. > promise resolveWith: 5. > (Delay forMilliseconds: 3) wait. > self should: [sum = 25].! > > ----- Method: PromiseTest>>testNilErrBlockPropagation (in category '*promisestests') ----- > testNilErrBlockPropagation > > "https://promisesaplus.com section 2.2.7.4" > (Smalltalk includesKey: #PriorityVat) > ifTrue: [self privateTestNilErrBlockPropagationResolvedReactorEvaluated] > ifFalse: [self privateTestNilErrBlockPropagationResolvedReactorNotEvaluated].! > > ----- Method: PromiseTest>>testNilResolvedBlockPropagation (in category '*promisestests') ----- > testNilResolvedBlockPropagation > > "https://promisesaplus.com section 2.2.7.3" > | p q | > p := Promise new. > q := p then: nil ifRejected: [:e | self error: 'Shouldn''t call errBlock']. > p resolveWith: 1. > q waitTimeoutMSecs: 1.. > self assert: p isResolved. > self assert: q isResolved. > self assert: p value equals: 1. > self assert: q value equals: 1.! > > ----- Method: PromiseTest>>testRejectWithInvokesErrorHandlers (in category '*promisestests') ----- > testRejectWithInvokesErrorHandlers > | p error returnedError | > returnedError := nil. > error := KeyNotFound new. > p := Promise ifRejected: [:e | returnedError := e]. > p rejectWith: error. > (Delay forMilliseconds: 1) wait. > self assert: returnedError notNil description: 'Error block did not run.'. > self assert: error equals: returnedError description: 'Error not passed into block'. > self assert: error equals: p error description: 'Promise didn''t store error'.! > > ----- Method: PromiseTest>>testSingleResolver (in category '*promisestests') ----- > testSingleResolver > > | promise sum | > sum := 0. > promise := Promise new. > promise whenResolved: [:val | sum := sum + val]. > promise resolveWith: 5. > (Delay forMilliseconds: 1) wait. > self assert: 5 equals: sum. > ! > > ----- Method: PromiseTest>>testThenPermitsChainingOfPromises (in category '*promisestests') ----- > testThenPermitsChainingOfPromises > | p q r | > p := Promise new. > q := p then: [:v | v * 2]. > r := q then: [:v | v + 1]. > p resolveWith: 4. > q waitTimeoutMSecs: 1. > r waitTimeoutMSecs: 1. > self assert: 4 * 2 equals: q value. > self assert: (4 * 2 + 1) equals: r value.! > > ----- Method: PromiseTest>>testTimeout (in category '*promisestests') ----- > testTimeout > | promise | > promise := Promise new. > self should: [(promise waitTimeoutMSecs: 1) isPromise]. > self shouldnt: [promise isResolved]. > self shouldnt: [promise isRejected]. > promise resolveWith: 45. > self should: [(promise waitTimeoutMSecs: 1) == 45]. > self should: [promise isResolved]. > self shouldnt: [promise isRejected].! > > ----- Method: PromiseTest>>testTimeoutRejected (in category '*promisestests') ----- > testTimeoutRejected > | promise | > promise := Promise new. > self should: [(promise waitTimeoutMSecs: 1) isPromise]. > self shouldnt: [promise isFulfilled]. > self shouldnt: [promise isResolved]. > self shouldnt: [promise isRejected]. > promise rejectWith: 45. > self should: [promise waitTimeoutMSecs: 1] raise: BrokenPromiseValue. > self shouldnt: [promise isFulfilled]. > self should: [promise isResolved]. > self should: [promise isRejected].! > > ----- Method: PromiseTest>>testUnitReturnsaPromise (in category '*promisestests') ----- > testUnitReturnsaPromise > | p | > p := Promise unit: 1. > self assert: p isResolved.! > > ----- Method: PromiseTest>>testWaitForRejection (in category '*promisestests') ----- > testWaitForRejection > | p | > p := Promise new. > [ (Delay forMilliseconds: 1) wait. p rejectWith: Error new ] fork. > self should: [ p wait ] raise: Error. > ! > > ----- Method: PromiseTest>>testWaitForResolution (in category '*promisestests') ----- > testWaitForResolution > | p | > p := Promise new. > [ (Delay forMilliseconds: 1) wait. p resolveWith: #ok ] fork. > p waitTimeoutMSecs: 3. > self assert: [ p wait = #ok ]! > > ----- Method: PromiseTest>>testWaitRejectionYieldsCorrectBrokenPromise (in category '*promisestests') ----- > testWaitRejectionYieldsCorrectBrokenPromise > | p error | > p := Promise new. > [ (Delay forMilliseconds: 1) wait. p rejectWith: (error := Error new) ] fork. > self should: [p wait] raise: Error. > [ p wait ] on: Error do: [ :bp | ^ self assert: [ bp == error ] ]. > self fail: 'Should not reach this point'! > > ----- Method: PromiseTest>>testifRejectedRunsBlockIfPromiseFails (in category '*promisestests') ----- > testifRejectedRunsBlockIfPromiseFails > "https://promisesaplus.com section 2.2.7.1" > | p q error | > error := nil. > p := Promise new. > q := p ifRejected: [:e | error := e "N.B. returns a value, does not signal an Exception"]. > p rejectWith: KeyNotFound new. > self should: [q waitTimeoutMSecs: 1] raise: KeyNotFound. > self assert: q isResolved. > self assert: q isRejected. > self assert: KeyNotFound equals: error class. > self assert: q error == error.! > > Error subclass: #BrokenPromiseValue > instanceVariableNames: 'value' > classVariableNames: '' > poolDictionaries: '' > category: 'PromisesTests'! > > ----- Method: BrokenPromiseValue class>>value: (in category 'instance creation') ----- > value: obj > > ^ self new > value: obj; > yourself! > > ----- Method: BrokenPromiseValue>>defaultAction (in category 'handling') ----- > defaultAction > > self messageText: 'Promise was rejected with value: ', value. > ^super defaultAction! > > ----- Method: BrokenPromiseValue>>isResumable (in category 'handling') ----- > isResumable > > ^ true! > > ----- Method: BrokenPromiseValue>>value (in category 'accessing') ----- > value > > ^ value.! > > ----- Method: BrokenPromiseValue>>value: (in category 'accessing') ----- > value: anObject > > value := anObject.! > > Error subclass: #PromiseAlreadyResolved > instanceVariableNames: '' > classVariableNames: '' > poolDictionaries: '' > category: 'PromisesTests'! > > From commits at source.squeak.org Sun Oct 4 16:53:41 2020 From: commits at source.squeak.org (commits at source.squeak.org) Date: Sun, 4 Oct 2020 16:53:41 0000 Subject: [squeak-dev] The Inbox: ProtocolState-rww.1.mcz Message-ID: A new version of ProtocolState was added to project The Inbox: http://source.squeak.org/inbox/ProtocolState-rww.1.mcz ==================== Summary ==================== Name: ProtocolState-rww.1 Author: rww Time: 3 October 2020, 11:35:56.550112 am UUID: f7bda3e4-a8e9-4bfc-a2a1-c48130f1d006 Ancestors: split out ProtocolState ==================== Snapshot ==================== SystemOrganization addCategory: #ProtocolState! IdentityDictionary subclass: #ProtocolState instanceVariableNames: 'stateName default' classVariableNames: '' poolDictionaries: '' category: 'ProtocolState'! !ProtocolState commentStamp: 'rww 6/8/2019 21:59' prior: 0! I am a single state within a cyclic graph of states. My values are edges leading to another state in the graph. If the edge has an action associated with it then I perform the method of that name in my client object, passing the object which stepped me as argument, before following the edge. Structure: name Symbol -- my state's name keys Object -- the input tokens that cause me to step values #(Symbol1 Symbol2) -- an edge: the next state and a client action selector default #(Symbol1 Symbol2) -- the edge I follow if no key matches the stepping object I am intended to be inserted somewhere in the middle of a LayeredProtocol stack. Originally from Ian Piumarta's [1] Telnet changeset [2] and PseudoTTY changeset [3]. [1] Ian Piumarta - http://piumarta.com/cv/bio.html [2] telnet.103.cs - http://squeakvm.org/unix/goodies/telnet.301.cs [3] PseudoTTY-3.2-4.st - http://squeakvm.org/unix/goodies/PseudoTTY-3.2-4.st! ----- Method: ProtocolState class>>basicNew (in category 'instance creation') ----- basicNew ^ super basicNew initialize; yourself! ----- Method: ProtocolState class>>created (in category 'accessing') ----- created ^ self new stateName: #created; yourself! ----- Method: ProtocolState class>>example (in category 'examples') ----- example "ProtocolState example" ^(self name: #initial default: #echo: -> #initial) at: 42 put: #echo42: -> #initial; yourself! ----- Method: ProtocolState class>>name:default: (in category 'instance creation') ----- name: myName default: aTransition ^self new stateName: myName; default: aTransition! ----- Method: ProtocolState class>>submitted (in category 'accessing') ----- submitted ^ self new stateName: #submitted; yourself! ----- Method: ProtocolState>>= (in category 'comparing') ----- = anotherState ^ self == anotherState or: [ self class == anotherState class and: [ stateName = anotherState stateName ] ]! ----- Method: ProtocolState>>add: (in category 'accessing') ----- add: anAssociation ^self transitionAt: anAssociation key put: (self transitionFor: anAssociation value)! ----- Method: ProtocolState>>addAll: (in category 'accessing') ----- addAll: anAssociation ^self atAll: anAssociation key put: anAssociation value! ----- Method: ProtocolState>>addAllInteger: (in category 'accessing') ----- addAllInteger: anAssociation ^self atAllInteger: anAssociation key put: anAssociation value! ----- Method: ProtocolState>>addInteger: (in category 'accessing') ----- addInteger: anAssociation ^self transitionAt: anAssociation key asInteger put: (self transitionFor: anAssociation value)! ----- Method: ProtocolState>>at:put: (in category 'accessing') ----- at: key put: transition ^self transitionAt: key put: (self transitionFor: transition)! ----- Method: ProtocolState>>at:to:put: (in category 'accessing') ----- at: anObject to: limit put: transition | edge | edge := self transitionFor: transition. anObject to: limit do: [:target | self transitionAt: target put: edge]! ----- Method: ProtocolState>>atAll:put: (in category 'accessing') ----- atAll: collection put: transition | edge | edge := self transitionFor: transition. collection do: [:elt | self transitionAt: elt put: edge]! ----- Method: ProtocolState>>atAllInteger:put: (in category 'accessing') ----- atAllInteger: collection put: transition | edge | edge := self transitionFor: transition. collection do: [:elt | self transitionAt: elt asInteger put: edge]! ----- Method: ProtocolState>>default (in category 'accessing') ----- default ^default! ----- Method: ProtocolState>>default: (in category 'accessing') ----- default: transition self defaultTransition: (self transitionFor: transition)! ----- Method: ProtocolState>>defaultTransition: (in category 'accessing') ----- defaultTransition: aTransition default := aTransition! ----- Method: ProtocolState>>hash (in category 'comparing') ----- hash ^ stateName hash + (self collect: [:e | e key]) hash! ----- Method: ProtocolState>>isStateNamed: (in category 'actions') ----- isStateNamed: aSymbol ^ stateName == aSymbol! ----- Method: ProtocolState>>name (in category 'accessing') ----- name ^ self stateName! ----- Method: ProtocolState>>name: (in category 'accessing') ----- name: aSymbol stateName := aSymbol! ----- Method: ProtocolState>>printElementsOn: (in category 'printing') ----- printElementsOn: aStream aStream nextPutAll: '(name: ' , stateName printString. aStream nextPutAll: ' default: ' , default printString. aStream nextPutAll: ' transitions:'. self associationsDo: [:transition | aStream space. transition printOn: aStream.]. aStream nextPut: $).! ----- Method: ProtocolState>>printOn: (in category 'printing') ----- printOn: aStream aStream nextPutAll: 'State: '; nextPutAll: stateName asString! ----- Method: ProtocolState>>stateName (in category 'accessing') ----- stateName ^ stateName! ----- Method: ProtocolState>>stateName: (in category 'accessing') ----- stateName: aSymbol stateName := aSymbol! ----- Method: ProtocolState>>transitionAt: (in category 'accessing') ----- transitionAt: key ^super at: key ifAbsent: [default]! ----- Method: ProtocolState>>transitionAt:put: (in category 'accessing') ----- transitionAt: key put: edge ^super at: key put: edge! ----- Method: ProtocolState>>transitionEvent:value:client: (in category 'actions') ----- transitionEvent: event value: value client: client | transition action toState | self validateEvent: event. transition := self transitionAt: event. action := transition key. toState := transition value. action isNil ifFalse: [(action numArgs == 0) ifTrue: [client cull: value]]. toState ifNil: [(KeyNotFound key: toState) signal] ifNotNil: [^toState] ! ----- Method: ProtocolState>>transitionExistsForEvent: (in category 'private') ----- transitionExistsForEvent: event self keysDo: [:key | (key = event) ifTrue: [^ true] ]. ^ false! ----- Method: ProtocolState>>transitionFor: (in category 'private') ----- transitionFor: transition ^transition key -> transition value! ----- Method: ProtocolState>>validateEvent: (in category 'private') ----- validateEvent: event ^ (self transitionExistsForEvent: event) ifTrue: [ true ] ifFalse: [ (KeyNotFound new key: event) signal ]! IdentityDictionary subclass: #ProtocolStateCompiler instanceVariableNames: 'initialState' classVariableNames: '' poolDictionaries: '' category: 'ProtocolState'! !ProtocolStateCompiler commentStamp: '' prior: 0! I am a collection of ProtocolStates constituting a transition graph for a StatefulProtocol. See my class side for some examples of how I construct state machine descriptions for you. Note that before I can be used to drive a StatefulProtocol you *must* send me #compile. I will answer the initial ProtocolState in the compiled transition graph. (I will also complain if your protocol is broken. ;-) You subsequently pass this ProtocolState as the argument to StatefulProtocol class>>initialState: in order to instantiate a new StatefulProtocol. Structure: initialState Symbol -- the name of the initial (root) node in my transition graph! ----- Method: ProtocolStateCompiler class>>example (in category 'examples') ----- example "A state machine that recognises occurrences of 'x' 'xy' and 'xy[digits...]z' in a stream of characters. Note: this is used by StateMachineTester, so don't modify it. See StateMachineTester class>>test for an example of use." "ProtocolStateCompiler example" | desc | desc := self new. (desc newState: #initial -> (#echo: -> #initial)) add: $x -> (nil -> #statex). (desc newState: #statex -> (#echox: -> #initial)) add: $y -> (#initPrefix: -> #statexy). (desc newState: #statexy -> (#echoxy: -> #initial)) add: $z -> (#echoxyz: -> #initial); addAll: '0123456789' -> (#addPrefix: -> nil). desc initialState: #initial. ^desc! ----- Method: ProtocolStateCompiler class>>example2 (in category 'examples') ----- example2 "ProtocolStateCompiler example2 explore" ^self example compile! ----- Method: ProtocolStateCompiler class>>example3 (in category 'examples') ----- example3 "Note: this example should pop up an error notifier during compilation" "ProtocolStateCompiler example3 compile" | desc | desc := self new. (desc newState: #initial -> (#echo: -> #initial)) add: $x -> (nil -> #statex). (desc newState: #statex -> (#echox: -> #initial)) add: $y -> (nil -> #statexy). (desc newState: #statexy -> (#echoxy: -> #initial)) add: $z -> (#echoxy: -> #statexyz). (desc newState: #statexyz -> (#echoxy: -> #initial)) add: $z -> (#echoxyz: -> #statexyz). desc initialState: #initial. ^desc! ----- Method: ProtocolStateCompiler class>>example4 (in category 'examples') ----- example4 "Note: this example should pop up an error notifier during compilation" "ProtocolStateCompiler example4 compile" | desc | desc := self new. (desc newState: 0 -> (#echo: -> 0)) add: $x -> (nil -> 1). (desc newState: 1 -> (#echox: -> 0)) add: $y -> (nil -> 2). (desc newState: 2 -> (#echoxy: -> 0)) add: $z -> (#echoxy: -> 3). (desc newState: 3 -> (#echoxy: -> 0)) add: $z -> (#echoxyz: ->3). desc initialState: 0. ^desc! ----- Method: ProtocolStateCompiler class>>initialState: (in category 'instance creation') ----- initialState: stateName ^self new initialState: stateName! ----- Method: ProtocolStateCompiler>>compile (in category 'compiling') ----- compile "Compile my symbolic representation into a cyclic DAG and answer the root node" | edge | self valuesDo: [:state | state defaultTransition: (self resolve: state default). state keysDo: [:key | edge := state at: key. state transitionAt: key put: (self resolve: edge)]]. ^self at: initialState! ----- Method: ProtocolStateCompiler>>initialState: (in category 'initialize-release') ----- initialState: stateName initialState := stateName! ----- Method: ProtocolStateCompiler>>newState: (in category 'initialize-release') ----- newState: rule ^self newState: rule key default: rule value! ----- Method: ProtocolStateCompiler>>newState:default: (in category 'initialize-release') ----- newState: stateName default: transition ^self at: stateName put: (ProtocolState name: stateName default: transition)! ----- Method: ProtocolStateCompiler>>printElementsOn: (in category 'printing') ----- printElementsOn: aStream aStream nextPutAll: '(initial: ' , initialState printString , ' states:'. self keysDo: [:key | aStream space. key printOn: aStream]. aStream nextPut: $)! ----- Method: ProtocolStateCompiler>>resolve: (in category 'compiling') ----- resolve: edge | action target | action := edge key. target := edge value. target := (self includesKey: target) ifTrue: [self at: target] ifFalse: [target isNil ifTrue: [nil] ifFalse: [self error: 'unknown target state ' , edge printString]]. ^ action -> target! From commits at source.squeak.org Sun Oct 4 17:21:28 2020 From: commits at source.squeak.org (commits at source.squeak.org) Date: Sun, 4 Oct 2020 17:21:28 0000 Subject: [squeak-dev] The Inbox: PromisesLocal-rww.23.mcz Message-ID: A new version of PromisesLocal was added to project The Inbox: http://source.squeak.org/inbox/PromisesLocal-rww.23.mcz ==================== Summary ==================== Name: PromisesLocal-rww.23 Author: rww Time: 4 October 2020, 1:20:20.780612 pm UUID: c8dc6ade-af3b-4dc2-96cf-328fbe79fed6 Ancestors: PromisesLocal-rww.22 finish cycling out unused protocol =============== Diff against PromisesLocal-rww.21 =============== Item was removed: - ----- Method: BrokenPromise>>promise (in category 'as yet unclassified') ----- - promise - ^ self exception! Item was added: + ----- Method: Promise>>>> (in category 'monad') ----- + >> resolvedBlock + "Like >>=, but discards the result of the promise." + ^ self then: [:v | resolvedBlock value]! Item was added: + ----- Method: Promise>>>>= (in category 'monad') ----- + >>= resolvedBlock + "Alias for `then:` allowing convenient chaining." + ^ self then: resolvedBlock! Item was added: + ----- Method: Promise>>waitTimeoutSeconds: (in category 'waiting') ----- + waitTimeoutSeconds: seconds + "Wait for at most the given number of seconds for this promise to resolve. Answer true if it is resolved, false otherwise." + ^self waitTimeoutMSecs: seconds*1000! From rabbit at churchofthesacrifice.org Sun Oct 4 17:41:03 2020 From: rabbit at churchofthesacrifice.org (rabbit) Date: Sun, 04 Oct 2020 17:41:03 +0000 Subject: [squeak-dev] how to protocol removal Message-ID: <368a0251-44fd-77a8-2dd9-15a03fcbf6cd@churchofthesacrifice.org> I have a package PromisesLocal which redefines a trunk class, Promise. There is some old protocol from trunk Promise which remains as part of the new definition and this is breaking tests (, Promise>>#whenResolved:, Promise>>#whenBroken:). Is there a way with Monticello or loading where I can remove this protocol? Or a better question is how to best remove this protocol when loading a Monticello package? K, r From commits at source.squeak.org Sun Oct 4 17:49:04 2020 From: commits at source.squeak.org (commits at source.squeak.org) Date: Sun, 4 Oct 2020 17:49:04 0000 Subject: [squeak-dev] The Inbox: PromisesLocal-rww.27.mcz Message-ID: A new version of PromisesLocal was added to project The Inbox: http://source.squeak.org/inbox/PromisesLocal-rww.27.mcz ==================== Summary ==================== Name: PromisesLocal-rww.27 Author: rww Time: 4 October 2020, 1:47:26.100611 pm UUID: 030d5bc0-a354-4b22-b576-9b47e589c410 Ancestors: PromisesLocal-rww.26 explicitly take protocol from trunk Promise =============== Diff against PromisesLocal-rww.23 =============== Item was added: + ----- Method: BrokenPromise>>promise (in category 'as yet unclassified') ----- + promise + + self shouldNotImplement.! Item was added: + ----- Method: BrokenPromise>>promise: (in category 'as yet unclassified') ----- + promise: aPromise + + self shouldNotImplement.! Item was changed: ----- Method: Promise>>>> (in category 'monad') ----- >> resolvedBlock "Like >>=, but discards the result of the promise." + ^ self then: [:v | resolvedBlock value] ! - ^ self then: [:v | resolvedBlock value]! Item was changed: ----- Method: Promise>>>>= (in category 'monad') ----- >>= resolvedBlock "Alias for `then:` allowing convenient chaining." + ^ self then: resolvedBlock ! - ^ self then: resolvedBlock! Item was added: + ----- Method: Promise>>evaluateRejecter: (in category 'private') ----- + evaluateRejecter: rejecterBlock + + ! Item was added: + ----- Method: Promise>>evaluateResolver: (in category 'private') ----- + evaluateResolver: resolverBlock + + ! Item was added: + ----- Method: Promise>>initialize (in category 'initialize') ----- + initialize + + ! Item was added: + ----- Method: Promise>>initializeWithIfRejected: (in category 'initialize') ----- + initializeWithIfRejected: aBlock + + ! Item was added: + ----- Method: Promise>>initializeWithResolvedValue: (in category 'initialize') ----- + initializeWithResolvedValue: anObject + + ! Item was added: + ----- Method: Promise>>whenRejected: (in category 'resolving') ----- + whenRejected: aBlock + + ^ super whenRejected: aBlock! Item was added: + ----- Method: Promise>>whenResolved: (in category 'resolving') ----- + whenResolved: aBlock + + ^ super whenResolved: aBlock! From leves at caesar.elte.hu Sun Oct 4 17:55:11 2020 From: leves at caesar.elte.hu (Levente Uzonyi) Date: Sun, 4 Oct 2020 19:55:11 +0200 (CEST) Subject: [squeak-dev] The Inbox: Monticello-tobe.729.mcz In-Reply-To: References: Message-ID: The change is in Monticello-ul.729. Moved Monticello-tobe.729 to the Treated Inbox. Levente On Sun, 4 Oct 2020, Tom Beckmann wrote: > Then please go ahead and create a new version directly if you don't mind :) > I'm still getting sweaty palms each time Monticello warns me about ancestry while committing... > > Thank you! > Tom > > On Sun, Oct 4, 2020 at 6:07 PM Levente Uzonyi wrote: > On Sun, 4 Oct 2020, Tom Beckmann wrote: > > > Hi Levente, > > > > good catch! Yes that would indeed be a better solution. Would you like me to submit a new version to the inbox or will you just move this to treated and create an according version in trunk directly? :) > > Whichever you prefer. :) > > > Levente > > > > > Best, > > Tom > > > > On Sun, Oct 4, 2020 at 6:00 PM Levente Uzonyi wrote: > >       Hi Tom, > > > >       On Sat, 3 Oct 2020, commits at source.squeak.org wrote: > > > >       > A new version of Monticello was added to project The Inbox: > >       > http://source.squeak.org/inbox/Monticello-tobe.729.mcz > >       > > >       > ==================== Summary ==================== > >       > > >       > Name: Monticello-tobe.729 > >       > Author: tobe > >       > Time: 3 October 2020, 12:57:12.690975 pm > >       > UUID: cbe1a05f-97e6-4780-9762-824be701f76a > >       > Ancestors: Monticello-ul.728 > >       > > >       > Include a dot when matching against extensions > >       > > >       > Packages of extension-less formats (e.g. tonel) will otherwise match for e.g. the MCStReader in MCReader>>#canReadFileNamed: if their name happens to end on an "st", e.g. "Roassal3-Sunburst" > >       > > >       > =============== Diff against Monticello-ul.728 =============== > >       > > >       > Item was changed: > >       >  ----- Method: MCVersionReader class>>canReadFileNamed: (in category 'testing') ----- > >       >  canReadFileNamed: fileName > >       > +     ^ (fileName endsWith: '.', self extension)! > >       > -     ^ (fileName endsWith: self extension)! > > > >       This is a reasonable change. But the very same method is implemented by > >       the superclass MCReader. So, I think this method should be removed and > >       the change should be applied to MCReader class>>canReadFileNamed:. > >       What do you think? > > > > > >       Levente > > > > > > > > > From monty2 at programmer.net Sun Oct 4 19:44:38 2020 From: monty2 at programmer.net (monty) Date: Sun, 4 Oct 2020 21:44:38 +0200 Subject: [squeak-dev] The XML libraries run fine on Squeak 6 alpha Message-ID: Installing the (head)s of: XMLParser (which loads "XMLWriter" too) XMLParser-XPath (be careful not to install the old, unfinished "XPath" project) XMLParser-StAX XMLParser-HTML from the SqueakMap works fine; all the tests still pass. XMLParser installation still pops up a warning you have to click through b/c of a conflict with the old XMLParser in the image, but it's fine other than that. Supposedly there are conflicts with XStreams, but I have nothing to do with that. An aside: some tests are skipped by default because they rely on external resources, like the file system or HTTP, which makes it easier to distinguish real regressions from something like a network outage. The skipping is more obvious on Pharo because their TestCase has a #skip message that the TestRunner UI supports. On Squeak these tests just silently pass. To run them, send XMLSkippableTest #stopSkippingAll. Unfortunately b/c of the W3C rate limiting, the tests using xhtml DTDs timeout if you run them more than once. You could say they should be cached (the default resolver does just that), but the purpose of these tests is to test real HTTP retrieval, so that defeats the purpose. ___ montyos.wordpress.com From sumi at seagreen.ocn.ne.jp Sun Oct 4 19:45:17 2020 From: sumi at seagreen.ocn.ne.jp (sumi masato) Date: Mon, 5 Oct 2020 04:45:17 +0900 Subject: [squeak-dev] A Sad Day ??? concluded In-Reply-To: <20201004131407.GA61026@shell.msen.com> References: <05fa2ced-b4fd-f8a4-a6f1-2f50ed04b272@ifi.uio.no> <63d57fb2-3110-3762-7a8c-14ae6d6ef038@ifi.uio.no> <20201004024332.GA46334@shell.msen.com> <20201004131407.GA61026@shell.msen.com> Message-ID: Hi Dave, Oh, I assumed that there had been no 64-bit version of 3.10 VM and also that 32-bit virtual images could not run on 64-bit VMs. Or, does it means that by building from source on current Unix-like system, former VM for 32-bit VI can also be generated as 64-bit executables? Anyway, I'll try to build a 3.10 VM on the latest macOS by following your instruction. Thank you. -- sumim 2020-10-04 David T. Lewis : > On Sun, Oct 04, 2020 at 12:07:47PM +0900, sumi masato wrote: > > Hi Dave, > > > > Great! > > > > Could you build a Docker image and publish it for macOS users > > who are restricted 32 bit VM by Apple also to try it easily? > > > > -- > > sumim > > I have no experience with Docker, but if you or someone else > knows how to do that, I'll be happy help if you run into any > difficulty compiling the VM. > > I do not understand "restricted 32 bit VM by Apple" but to > clarify, the Linux VM I use is a 64 bit VM running the 32-bit > Squeak image. I expect this is what you would want to use if > you were building a Docker image, although you can also compile > the VM as a 32 bit application if needed. But I saw no problems > running Trygve's image on the 64 bit VM. > > Dave > > > > > > 2020-10-04 David T. Lewis : > > > > > Thank you Trygve, > > > > > > I confirm also that the image runs very well on my Ubuntu Linux laptop > > > with a VM compiled per http://wiki.squeak.org/squeak/6354. > > > > > > Dave > > > > > > On Sat, Oct 03, 2020 at 07:56:43PM +0900, masato sumi wrote: > > > > Dear Trygve, > > > > > > > > I confirmed that I could launch the Loke/BabyIDE image with the > included > > > > SqueakVM for Windows (8.1 and 10) > > > > and I could also launch it in a web browser by using the SqueakJS VM > ( > > > > https://squeak.js.org/run ). > > > > > > > > Thank you very much. > > > > > > > > -- > > > > sumim > > > > > > > > 2020-10-03 15:48 Trygve Reenskaug : > > > > > > > > > Dear Sumim, > > > > > Thank you for your kind words. > > > > > > > > > > The latest version of Loke/BabyIDE written on Squeak3.10.2 is at > > > > > https://data.mendeley.com/datasets/5xxgzv7fsp/1 > > > > > The image is my program repository. It includes some examples of > DCI > > > > > programming, Ellen's Personal Programming IDE, Squeak Reverse > > > Engineering > > > > > (SRE), and more. > > > > > > > > > > Best > > > > > --Trygve > > > > > > > > > > On 2020-10-02 20:14, masato sumi wrote: > > > > > > > > > > Dear Trygve, > > > > > > > > > > Thank you for your very long term contribution and efforts. > > > > > > > > > > I'm very sorry that I couldn't help you at all now. > > > > > > > > > > I'm afraid, but could you please make your latest version of > > > Loke/BabyIDE > > > > > written on Squeak3.10.2 available for future generations of > researchers > > > > > and/or followers? > > > > > > > > > > Anyway, I think your ideas and thoughts should be passed on to > future > > > > > generations as faithfully as we can possible, and I myself will > try to > > > make > > > > > sure that. > > > > > > > > > > Thank you so much and goodbye. > > > > > Please take care of yourself. > > > > > > > > > > -- > > > > > sumim > > > > > > > > > > 2020-10-03 0:54 Trygve Reenskaug : > > > > > > > > > >> Dear all, > > > > >> I need to use many words to explore why I can't understand current > > > Squeak > > > > >> code. I believe the reason is a profound one, and I hope some of > you > > > have > > > > >> the patience to read about it. > > > > >> > > > > >> Thank you for your responses to my 'A Sad Day'-message. One > response > > > said > > > > >> "*But please don't give up as an inventor of MVC, which has > > > simplified > > > > >> writing software for all of us.* > > > > >> > > > > >> > > > > >> *We need new ideas to stabilize Smalltalk." *As to MVC, it was > > > received > > > > >> with acclamation when I first presented it at PARC in 1978, and > people > > > > >> suggested I should make it the theme of my article in the special > > > Smalltalk > > > > >> issue of Byte. I couldn't understand it; MVC was so simple and > > > obvious that > > > > >> is was not worth writing about it. Nevertheless, people seem to > have > > > > >> problems understanding MVC. It took me a long time before I > gleaned > > > what > > > > >> was going on. The explanation is a deep one, rooted in our > different > > > mental > > > > >> paradigms. > > > > >> > > > > >> From around 1970, I was working on Prokon, a distributed system > for > > > > >> managers in the shipbuilding industry: > > > > >> > > > > >> Every manager has their own computer that they use for augmenting > > > their > > > > >> mind. The manager understands their software and ideally writes it > > > > >> themselves. Managers delegate conversations with other managers to > > > their > > > > >> computer's M-to-M network. (Marked with a heavy black line in the > > > figure). > > > > >> I chose "distributed planning with central control" as my example > > > project. > > > > >> Each manager creates a plan for their department, using apps > suited to > > > > >> their particular needs. A **distributed algorithm** ensures > > > consistency > > > > >> across departments. > > > > >> > > > > >> I came to PARC in 1978 and could immediately relate to the > Smalltalk > > > > >> image with its universe of collaborating objects. Alan's > definition of > > > > >> object-orientation fitted my Prokon model: "Thus its semantics > are a > > > bit > > > > >> like having thousands and thousands of computers all hooked > together > > > by a > > > > >> very fast network." > > > > >> > > > > >> MVC prescribes a network of communicating objects. Any object can > fill > > > > >> one or more positions in the network as long as it has the > required > > > > >> behavior; their classes are irrelevant. It's so simple that it's > not > > > worth > > > > >> writing about it. > > > > >> > > > > >> > > > > >> ==================== > > > > >> > > > > >> The work on this post was interrupted at this point by an > unexpected > > > week > > > > >> in hospital. It gave me quiet days of pondering the futility of > what > > > I am > > > > >> doing and I will be terminating my memberships in the Pharo and > Squeak > > > > >> mailing lists. I have also deleted most of the old draft of this > > > message > > > > >> and will quickly conclude with two observations: > > > > >> > > > > >> > > > > >> 1. > > > > >> The Smalltalk image is a universe of communicating objects. I > call > > > it > > > > >> an object computer. It can be seen as the model of an entirely > new > > > kind of > > > > >> computer, a model on a level closer to the human mind than the > von > > > Neumann > > > > >> model of 1948. The new model is communication-centric and > should > > > supersede > > > > >> the ubiquitous CPU-centric model as soon as possible. Working > out > > > the > > > > >> details of this idea could make an exciting and disruptive > Ph.D. > > > thesis. > > > > >> 2. > > > > >> Smalltalk is called a programming language. It is a curious > one, > > > very > > > > >> different from well-known languages like Java with their > syntax and > > > > >> semantics. Smalltalk, as a programming language, does not have > the > > > concept > > > > >> of a program. Smalltalk, as a class-oriented language, does not > > > have syntax > > > > >> for the declaration of a class. Smalltalk, as an > object-oriented > > > language, > > > > >> can't describe how objects collaborate to achieve a goal. You > > > appear to be > > > > >> happy with this state of affairs, at least, I see no sign of > > > anybody > > > > >> wanting to move on from the unfinished Smalltalk language to a > > > mature > > > > >> development environment. I do not find it satisfactory and it > is > > > not > > > > >> acceptable to the intended managers populating the distributed > > > system shown > > > > >> in the first picture. Consequently, I have done something > about it > > > as > > > > >> described in my SoSym article "*Personal Programming and the > Object > > > > >> Computer.*" I am tired of being alone in my endeavors and this > ends > > > > >> my work with Squeak and other Smalltalks. I wish you health and > > > happiness > > > > >> wherever you happen to be. > > > > >> > > > > >> Trygve > > > > >> Personal programming and the object computer > > > > >> https://doi.org/10.1007/s10270-019-00768-3 > > > > >> > > > > >> -- > > > > >> > > > > >> *The essence of object orientation is that objects collaborate to > > > > >> achieve a goal. * > > > > >> Trygve Reenskaug mailto: trygver at ifi.uio.no <% > > > 20trygver at ifi.uio.no> > > > > >> Morgedalsvn. 5A http://folk.uio.no/trygver/ > > > > >> N-0378 Oslo http://fullOO.info > > > > >> Norway Tel: (+47) 468 58 625 > > > > >> > > > > >> > > > > > > > > > > -- > > > > > > > > > > *The essence of object orientation is that objects collaborate to > > > achieve > > > > > a goal. * > > > > > Trygve Reenskaug mailto: trygver at ifi.uio.no <% > > > 20trygver at ifi.uio.no> > > > > > Morgedalsvn. 5A http://folk.uio.no/trygver/ > > > > > N-0378 Oslo http://fullOO.info > > > > > Norway Tel: (+47) 468 58 625 > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > -- > > sent from mobile > > > > > > -- sent from mobile -------------- next part -------------- An HTML attachment was scrubbed... URL: From asqueaker at gmail.com Sun Oct 4 20:36:15 2020 From: asqueaker at gmail.com (Chris Muller) Date: Sun, 4 Oct 2020 15:36:15 -0500 Subject: [squeak-dev] Development methodology (was: tedious programming-in-the-debugger error needs fixing) In-Reply-To: References: <1a26fe2675b14feaa16b483d54afa361@student.hpi.uni-potsdam.de> <1599137423163-0.post@n4.nabble.com> <23476c3e0a68492c8cc917c38ba2c9d4@student.hpi.uni-potsdam.de> <1601475775699-0.post@n4.nabble.com> <1601590406774-0.post@n4.nabble.com> <076817EE-1506-47F9-9AF4-3126C6D3BC76@rowledge.org> Message-ID: Hi Christoph and Jakob, > Now since Squeak does not switch to Git (given the feelings of several prominent people here towards Git) Hmm, that doesn't sound quite right. What I sense are such (positive) "feelings" TOWARDS Git in some members, it has them wanting to use *that particular tool* (vs. other tools or solutions which could also address the community's needs, i.e., see below). I sometimes think "the tool" and the associated "popularity" is the end-goal in and of itself, rather than the output artifact. Please pardon me if I'm mistaken about that. For me, it's not really anything about any "feelings" about Git as the (im)practicality of integration. It's a beast. To bring a beast into _everyone's_ workflow that has 90% more "stuff" than we need, and requires them to sign up just to use -- I think it would be a "filter" on the community, especially of non-developers (hint: You and Jakob are developers). For me, being hosted by a private company is not so attractive. I do think some of these issues you describe with the Inbox contribution process are shallow enough they could be largely mitigated with simple upgrades to our existing tools. For example, you could submit an improvement that allows original contributors of Inbox items to move them to Treated themself. You could add a button to filter out all entries in the Inbox which have further descendants also in the Inbox. You could make an, "update from Inbox" which would only download packages for which have your loaded versions as ancestors. There are many simple things that could be done. A bug-tracker is a bigger deal, but it's often a lot less overhead to just FIX the bug than open, track, and close a bug report. We do have Mantis to keep track of the longer-term bugs. But, again, this is "not Git", which seems to be the desired "feature". :/ We have *decades* of Monticello packages for Squeak across not just our own repositories, but many other "external" legacy repositories. (i.e., see the "repositories" category of Installer class side). Obviously, our tools and methodology will be an on-going discussion, but I don't see this legacy ever going away completely, no matter what we do, Monticello will continue to be used by some. It seems clear that the only path to Git and other tools is a backward-compatible integration with existing tools, a "stepping stone" that doesn't require a major adjustment like losing method-level timestamp information. But it's not going to write itself. Only the burning interest within people like you and/or Jakob will get it done. :) - Chris -------------- next part -------------- An HTML attachment was scrubbed... URL: From kirtai+st at gmail.com Sun Oct 4 21:39:10 2020 From: kirtai+st at gmail.com (Douglas Brebner) Date: Sun, 4 Oct 2020 22:39:10 +0100 Subject: [squeak-dev] Development methodology (was: tedious programming-in-the-debugger error needs fixing) In-Reply-To: References: <1a26fe2675b14feaa16b483d54afa361@student.hpi.uni-potsdam.de> <1599137423163-0.post@n4.nabble.com> <23476c3e0a68492c8cc917c38ba2c9d4@student.hpi.uni-potsdam.de> <1601475775699-0.post@n4.nabble.com> <1601590406774-0.post@n4.nabble.com> <076817EE-1506-47F9-9AF4-3126C6D3BC76@rowledge.org> Message-ID: <3a092169-086d-6192-a1ec-99f20fb599c4@gmail.com> On 04/10/2020 21:36, Chris Muller wrote: > For me, being hosted by a private company is not so attractive. > Are you confusing git with Github here? There are many git hosters and you can host it yourself. From pbpublist at gmail.com Sun Oct 4 21:55:42 2020 From: pbpublist at gmail.com (Phil B) Date: Sun, 4 Oct 2020 17:55:42 -0400 Subject: [squeak-dev] Development methodology (was: tedious programming-in-the-debugger error needs fixing) In-Reply-To: References: <1a26fe2675b14feaa16b483d54afa361@student.hpi.uni-potsdam.de> <1599137423163-0.post@n4.nabble.com> <23476c3e0a68492c8cc917c38ba2c9d4@student.hpi.uni-potsdam.de> <1601475775699-0.post@n4.nabble.com> <1601590406774-0.post@n4.nabble.com> <076817EE-1506-47F9-9AF4-3126C6D3BC76@rowledge.org> Message-ID: Christoph, On Thu, Oct 1, 2020 at 7:23 PM Thiede, Christoph < Christoph.Thiede at student.hpi.uni-potsdam.de> wrote: > Well I can tell that in my generation, mailing lists are definitively much > more considered as obsolete and disliked. > This is largely a statement about fashion/trends and overlooks one massive advantage mailing lists have over the several *generations* of web approaches: while they are crusty (they have been since the 90's) they are also relatively eternal. You want to traverse the entire history of discussions on the Squeak mailing list? The archives are there, in a trivial and open format, and so you can. Just this week I looked up some 20 year old posts in squeak-dev, it's not a theoretical argument. (try doing that with your sourceforge... err, google+... umm, slack... history) > Everyone has a GitHub account (or if not yet, this costs you one minute > for millions of projects) while for a mailing list, you have to fill in a > subscription form for every new project ... > Here you're showing you've already fallen behind: the github trend for discussing things is already fading and those trendier than you have already moved on to the next thing: Slack is where it's at! In a year or two it will be something else... and the treadmill keeps going but not really going anywhere. Now I've been saying this somewhat kidding: I'd actually love to see something *better* replace email for discussions. But it has to be open[1] and adaptable to various existing technologies as well as the new ones that come along. So far, there has been no critical mass around anything viable mainly because the masses (even in the tech space) keep hopping from trend to trend. So many old fogies say 'meh, why bother'. It's not that we love email so much, it's that everything that's been proposed to replace it is worse and fleeting. [1] github issues fail on the open front. Unlike git which you can always prop up your own server for, you're always one corporate decision away from issues being broken/taken away. > IMO email has failed in so many points where alternatives provide better > solutions. How many "> > > > original post > > > quoted by me > > quoted by > you > don't eat my quote characters!1", unwanted > line breaks after > every third word or > so, different confusing fonts and sizes, and much more have I been > reading in this list! Platforms have the uniform Markdown standard to get > rid of all this mess. Also, managing subscriptions for individual threads > is so much easier on GitHub & Co. I think could carry on for a few more > paragraphs, but that's probably not the point. :-) > I don't like HTML email myself and find it a lot easier just to read the text version. I know... it's not nearly as pretty, but it does work and avoids many of the formatting issues you're complaining about. > Best, > Christoph > ------------------------------ > Thanks, Phil -------------- next part -------------- An HTML attachment was scrubbed... URL: From pbpublist at gmail.com Sun Oct 4 21:56:58 2020 From: pbpublist at gmail.com (Phil B) Date: Sun, 4 Oct 2020 17:56:58 -0400 Subject: [squeak-dev] Development methodology (was: tedious programming-in-the-debugger error needs fixing) In-Reply-To: <3a092169-086d-6192-a1ec-99f20fb599c4@gmail.com> References: <1a26fe2675b14feaa16b483d54afa361@student.hpi.uni-potsdam.de> <1599137423163-0.post@n4.nabble.com> <23476c3e0a68492c8cc917c38ba2c9d4@student.hpi.uni-potsdam.de> <1601475775699-0.post@n4.nabble.com> <1601590406774-0.post@n4.nabble.com> <076817EE-1506-47F9-9AF4-3126C6D3BC76@rowledge.org> <3a092169-086d-6192-a1ec-99f20fb599c4@gmail.com> Message-ID: On Sun, Oct 4, 2020 at 5:39 PM Douglas Brebner wrote: > > On 04/10/2020 21:36, Chris Muller wrote: > > For me, being hosted by a private company is not so attractive. > > > > Are you confusing git with Github here? There are many git hosters and > you can host it yourself. > Github issues are not based on git, it's a proprietary solution exclusive to github. -------------- next part -------------- An HTML attachment was scrubbed... URL: From commits at source.squeak.org Sun Oct 4 22:14:26 2020 From: commits at source.squeak.org (commits at source.squeak.org) Date: Sun, 4 Oct 2020 22:14:26 0000 Subject: [squeak-dev] The Trunk: Monticello-ul.729.mcz Message-ID: Levente Uzonyi uploaded a new version of Monticello to project The Trunk: http://source.squeak.org/trunk/Monticello-ul.729.mcz ==================== Summary ==================== Name: Monticello-ul.729 Author: ul Time: 4 October 2020, 7:52:30.808712 pm UUID: 2c45d8d2-9d9c-414c-8200-19e139a5e661 Ancestors: Monticello-ul.728 Do what Monticello-tobe.729 did, but apply the change to MCReader instead of MCVersionReader and remove the unnecessary override from MCVersionReader: Include a dot when matching against extensions Packages of extension-less formats (e.g. tonel) will otherwise match for e.g. the MCStReader in MCReader>>#canReadFileNamed: if their name happens to end on an "st", e.g. "Roassal3-Sunburst" =============== Diff against Monticello-ul.728 =============== Item was changed: ----- Method: MCReader class>>canReadFileNamed: (in category 'testing') ----- canReadFileNamed: fileName + ^ (fileName endsWith: '.', self extension)! - ^ (fileName endsWith: self extension)! Item was removed: - ----- Method: MCVersionReader class>>canReadFileNamed: (in category 'testing') ----- - canReadFileNamed: fileName - ^ (fileName endsWith: self extension)! From commits at source.squeak.org Sun Oct 4 22:31:44 2020 From: commits at source.squeak.org (commits at source.squeak.org) Date: Sun, 4 Oct 2020 22:31:44 0000 Subject: [squeak-dev] The Trunk: Collections-ul.915.mcz Message-ID: Levente Uzonyi uploaded a new version of Collections to project The Trunk: http://source.squeak.org/trunk/Collections-ul.915.mcz ==================== Summary ==================== Name: Collections-ul.915 Author: ul Time: 5 October 2020, 12:30:33.597525 am UUID: 93341c2a-ebb2-4d2b-abee-e3f42f509836 Ancestors: Collections-eem.913 HashedCollection changes: - make #capacity return the actual capacity of the collection instead of the size of the internal array. This change is obviously not backwards compatible. - improve the performance of #isEmpty when tally is 0 OrderedDictionary changes: - make it a subclass of PluggableDictionary. This lets one create e.g. an ordered identity dictionary without creating a subclass with duplicated behavior - simplify #initialize and #growTo: now that #capacity is accurate =============== Diff against Collections-eem.913 =============== Item was changed: ----- Method: HashedCollection>>capacity (in category 'accessing') ----- capacity + "Answer the current capacity of the receiver - aka the number of elements the receiver can hold without growing." - "Answer the current capacity of the receiver." + ^ array size * 3 // 4! - ^ array size! Item was changed: ----- Method: HashedCollection>>isEmpty (in category 'testing') ----- isEmpty "For non-weak collections, we can use the tally to speed up the empty check. For weak collections, we must use the traditional way because the tally is unreliable. Also see #size vs. #slowSize." + tally = 0 ifTrue: [ ^true ]. + ^array class isWeak and: [ super isEmpty ]! - ^ array class isWeak - ifFalse: [ tally = 0 ] - ifTrue: [ super isEmpty ]! Item was changed: ----- Method: HashedCollection>>removeAll (in category 'removing') ----- removeAll "remove all elements from this collection. Preserve the capacity" + self initialize: array size! - self initialize: self capacity! Item was changed: + PluggableDictionary subclass: #OrderedDictionary - Dictionary subclass: #OrderedDictionary instanceVariableNames: 'order' classVariableNames: '' poolDictionaries: '' category: 'Collections-Sequenceable'! !OrderedDictionary commentStamp: 'mt 1/16/2015 10:42' prior: 0! I am an ordered dictionary. I have an additional index (called 'order') to keep track of the insertion order of my associations. The read access is not affected by the additional index. The index is updated in O(1) [time] when inserting new keys. For present keys, that insertion involves actions in O(n) to move the respective element to the end of the order. The growth operation compacts the index and takes O(n) additional time. NOTE: This is still no instance of SequenceableCollection. Having this, some protocols are missing and may require working on #associations, which is an Array and thus sequenceable.! Item was changed: ----- Method: OrderedDictionary>>growTo: (in category 'private') ----- growTo: anInteger - | oldOrder | super growTo: anInteger. + order := order grownBy: self capacity - order size! - oldOrder := order. - "Grow only to 75%. See #atNewIndex:put: in HashedCollection." - order := self arrayType new: anInteger + 1 * 3 // 4. - order - replaceFrom: 1 - to: tally - with: oldOrder - startingAt: 1! Item was changed: ----- Method: OrderedDictionary>>initialize: (in category 'private') ----- initialize: n super initialize: n. + order := self arrayType new: self capacity! - order := self arrayType new: n + 1 * 3 // 4! From commits at source.squeak.org Sun Oct 4 22:32:39 2020 From: commits at source.squeak.org (commits at source.squeak.org) Date: Sun, 4 Oct 2020 22:32:39 0000 Subject: [squeak-dev] The Trunk: CollectionsTests-ul.344.mcz Message-ID: Levente Uzonyi uploaded a new version of CollectionsTests to project The Trunk: http://source.squeak.org/trunk/CollectionsTests-ul.344.mcz ==================== Summary ==================== Name: CollectionsTests-ul.344 Author: ul Time: 28 September 2020, 11:52:49.129468 pm UUID: 82e7d021-2a4e-4e58-8758-c4e8838805cf Ancestors: CollectionsTests-eem.342 Hashed collections: - updated tests to send #array and #size instead of #capacity - added a few tests for #capacity =============== Diff against CollectionsTests-eem.342 =============== Item was added: + ----- Method: DictionaryTest>>testArraySizeOfNew (in category 'tests - basic') ----- + testArraySizeOfNew + "Test the special cases implemented in HashedCollection class >> #new and #new: using Dictionary as an example because HashedCollection is abstract." + + | goodPrimes | + goodPrimes := HashedCollection goodPrimes. + self assert: (goodPrimes includes: Dictionary new array size). + 0 to: 100 do: [ :size | + | dictionary | + dictionary := Dictionary new: size. + self assert: (goodPrimes includes: dictionary array size). + self assert: dictionary capacity >= size ]! Item was removed: - ----- Method: DictionaryTest>>testCapcityOfNew (in category 'tests - basic') ----- - testCapcityOfNew - "Test the special cases implemented in HashedCollection class >> #new and #new: using Dictionary as an example because HashedCollection is abstract." - - | goodPrimes | - goodPrimes := HashedCollection goodPrimes. - self assert: (goodPrimes includes: Dictionary new capacity). - 0 to: 100 do: [ :size | - | dictionary | - dictionary := Dictionary new: size. - self assert: (goodPrimes includes: dictionary capacity) ]! Item was added: + ----- Method: HashedCollectionTest>>testArraySize (in category 'tests - integrity') ----- + testArraySize + + | inconsistentCollections | + inconsistentCollections := HashedCollection allSubInstances reject: [ :each | + each class == MethodDictionary "MethodDictionary is the only HashedCollection which doesn't have prime array size" + ifTrue: [ each array size isPowerOfTwo ] + ifFalse: [ each array size isPrime ] ]. + self assert: inconsistentCollections isEmpty! Item was changed: ----- Method: HashedCollectionTest>>testCapacity (in category 'tests - integrity') ----- testCapacity + self assert: (HashedCollection allSubInstances allSatisfy: [ :each | + each array size * 3 // 4 = each capacity ])! - | inconsistentCollections | - inconsistentCollections := HashedCollection allSubInstances reject: [ :each | - each class == MethodDictionary "MethodDictionary is the only HashedCollection which doesn't have prime array size" - ifTrue: [ each capacity isPowerOfTwo ] - ifFalse: [ each capacity isPrime ] ]. - self assert: inconsistentCollections isEmpty! Item was changed: ----- Method: OrderedDictionaryTest>>testGrow (in category 'tests') ----- testGrow self + assert: 11 equals: sut array size; "next prime number to 7; see #setUp" + assert: sut capacity = (sut instVarNamed: #order) size; + assert: sut array size >(sut instVarNamed: #order) size. "save memory" - assert: 11 equals: sut capacity; "next prime number to 7; see #setUp" - assert: sut capacity > (sut instVarNamed: #order) size. "save memory" + 1 to: sut array size do: [:ea | - 1 to: sut capacity do: [:ea | sut at: ea put: nil]. self + assert: sut array size > 11; + assert: sut capacity = (sut instVarNamed: #order) size; + assert: sut array size > (sut instVarNamed: #order) size. "save memory"! - assert: sut capacity > 11; - assert: sut capacity > (sut instVarNamed: #order) size. "save memory"! Item was added: + ----- Method: SetTest>>testCapacity (in category 'tests') ----- + testCapacity + + | set capacity | + set := Set new. + self assert: set size = 0. + 10 timesRepeat: [ + capacity := set capacity. + self assert: set size < capacity. + set size + 1 to: capacity do: [ :i | + set add: i. + self assert: set capacity = capacity ]. + self assert: set size equals: capacity. + set add: set capacity + 1. + self assert: set capacity > capacity ]! Item was changed: ----- Method: WeakIdentityKeyDictionaryTest>>testFinalizeValuesWhenLastChainContinuesAtFront (in category 'tests') ----- testFinalizeValuesWhenLastChainContinuesAtFront + | objectWithHashModulo dictionary arraySize a b c | - | objectWithHashModulo dictionary capacity a b c | objectWithHashModulo := [ :requestedHash :modulo | | object | [ object := Object new. object hash \\ modulo = requestedHash ] whileFalse. object ]. dictionary := self classToBeTested new. + arraySize := dictionary array size. + a := objectWithHashModulo value: arraySize - 2 value: arraySize. - capacity := dictionary capacity. - a := objectWithHashModulo value: capacity - 2 value: capacity. dictionary at: a put: 1. + b := objectWithHashModulo value: arraySize - 1 value: arraySize. - b := objectWithHashModulo value: capacity - 1 value: capacity. dictionary at: b put: 2. + c := objectWithHashModulo value: arraySize - 2 value: arraySize. - c := objectWithHashModulo value: capacity - 2 value: capacity. dictionary at: c put: 3. + self assert: dictionary array size = arraySize. + self assert: (dictionary array at: arraySize - 1) key == a. + self assert: (dictionary array at: arraySize) key == b. - self assert: dictionary capacity = capacity. - self assert: (dictionary array at: capacity - 1) key == a. - self assert: (dictionary array at: capacity) key == b. self assert: (dictionary array at: 1) key == c. a := nil. Smalltalk garbageCollect. dictionary finalizeValues. self assert: (dictionary includesKey: b). self assert: (dictionary includesKey: c). + self assert: dictionary slowSize = 2! - self assert: dictionary slowSize = 2. - ! Item was changed: ----- Method: WeakSetTest>>testIncludes (in category 'tests') ----- testIncludes | weakSet transientFakeNilObject | weakSet := WeakSet new. #(true nil 1) do: [ :each | self deny: (weakSet includes: each) ]. weakSet add: true. self assert: (weakSet includes: true). weakSet remove: true. self deny: (weakSet includes: true). + transientFakeNilObject := ((1 to: 1000) detect: [ :each | each asString hash - nil hash \\ weakSet array size = 0 ]) asString. "this string will occupy the same slot as nil would" - transientFakeNilObject := ((1 to: 1000) detect: [ :each | each asString hash - nil hash \\ weakSet capacity = 0 ]) asString. "this string will occupy the same slot as nil would" weakSet add: transientFakeNilObject. transientFakeNilObject := transientFakeNilObject copy. Smalltalk garbageCollect. "get rid of transientFakeNilObject" self deny: (weakSet includes: transientFakeNilObject). self deny: (weakSet includes: nil) ! From asqueaker at gmail.com Sun Oct 4 22:32:23 2020 From: asqueaker at gmail.com (Chris Muller) Date: Sun, 4 Oct 2020 17:32:23 -0500 Subject: [squeak-dev] you folks did a great job on the preferences wizard experience on the launch of a new squeak. In-Reply-To: <174ee2e8678.e34ea36628862.431992921320213564@zoho.com> References: <174ee2e8678.e34ea36628862.431992921320213564@zoho.com> Message-ID: I believe sole credit goes to Marcel for that one. I agree, it's fantastic. On Sat, Oct 3, 2020 at 6:17 AM gettimothy via Squeak-dev < squeak-dev at lists.squeakfoundation.org> wrote: > Very polished, nice work, pleasure to use. > > thanks for your hard work. > > > -------------- next part -------------- An HTML attachment was scrubbed... URL: From lewis at mail.msen.com Sun Oct 4 22:59:53 2020 From: lewis at mail.msen.com (David T. Lewis) Date: Sun, 4 Oct 2020 18:59:53 -0400 Subject: [squeak-dev] 64 bit VM for running older images (was: A Sad Day ??? concluded) In-Reply-To: References: <05fa2ced-b4fd-f8a4-a6f1-2f50ed04b272@ifi.uio.no> <63d57fb2-3110-3762-7a8c-14ae6d6ef038@ifi.uio.no> <20201004024332.GA46334@shell.msen.com> <20201004131407.GA61026@shell.msen.com> Message-ID: <20201004225953.GA48028@shell.msen.com> Changing the subject line because this is not related to the original discussion. In general, a 32-bit image can run on a 64-bit VM (and vice versa). An explanation is at http://squeakvm.org/squeak64/faq.html The more recent Cog and Spur VMs are more restrictive in the sense that we always use a 64-bit VM when running a 64-bit image, and we use a 32-bit VM when running a 32-bit image. The reason for this is that the modern VMs are optimized to provide code generation ("Cog") and it would be a good deal of effort to make this work on the various combinations image word size and VM pointer size. For the traditional interpreter VM (http://squeakvm.org/) the restriction is not necessary, and it is usually better to use a native 64-bit VM regardless of the word size of the image being run. Dave On Mon, Oct 05, 2020 at 04:45:17AM +0900, sumi masato wrote: > Hi Dave, > > Oh, I assumed that there had been no 64-bit version of 3.10 VM > and also that 32-bit virtual images could not run on 64-bit VMs. > > Or, does it means that by building from source on current Unix-like system, > former VM for 32-bit VI can also be generated as 64-bit executables? > > Anyway, I'll try to build a 3.10 VM on the latest macOS by following your > instruction. > > Thank you. > > -- > sumim > > 2020-10-04 David T. Lewis : > > > On Sun, Oct 04, 2020 at 12:07:47PM +0900, sumi masato wrote: > > > Hi Dave, > > > > > > Great! > > > > > > Could you build a Docker image and publish it for macOS users > > > who are restricted 32 bit VM by Apple also to try it easily? > > > > > > -- > > > sumim > > > > I have no experience with Docker, but if you or someone else > > knows how to do that, I'll be happy help if you run into any > > difficulty compiling the VM. > > > > I do not understand "restricted 32 bit VM by Apple" but to > > clarify, the Linux VM I use is a 64 bit VM running the 32-bit > > Squeak image. I expect this is what you would want to use if > > you were building a Docker image, although you can also compile > > the VM as a 32 bit application if needed. But I saw no problems > > running Trygve's image on the 64 bit VM. > > > > Dave > > > > > > > > > > 2020-10-04 David T. Lewis : > > > > > > > Thank you Trygve, > > > > > > > > I confirm also that the image runs very well on my Ubuntu Linux laptop > > > > with a VM compiled per http://wiki.squeak.org/squeak/6354. > > > > > > > > Dave > > > > > > > > On Sat, Oct 03, 2020 at 07:56:43PM +0900, masato sumi wrote: > > > > > Dear Trygve, > > > > > > > > > > I confirmed that I could launch the Loke/BabyIDE image with the > > included > > > > > SqueakVM for Windows (8.1 and 10) > > > > > and I could also launch it in a web browser by using the SqueakJS VM > > ( > > > > > https://squeak.js.org/run ). > > > > > > > > > > Thank you very much. > > > > > > > > > > -- > > > > > sumim > > > > > > > > > > 2020-10-03 15:48 Trygve Reenskaug : > > > > > > > > > > > Dear Sumim, > > > > > > Thank you for your kind words. > > > > > > > > > > > > The latest version of Loke/BabyIDE written on Squeak3.10.2 is at > > > > > > https://data.mendeley.com/datasets/5xxgzv7fsp/1 > > > > > > The image is my program repository. It includes some examples of > > DCI > > > > > > programming, Ellen's Personal Programming IDE, Squeak Reverse > > > > Engineering > > > > > > (SRE), and more. > > > > > > > > > > > > Best > > > > > > --Trygve > > > > > > > > > > > > On 2020-10-02 20:14, masato sumi wrote: > > > > > > > > > > > > Dear Trygve, > > > > > > > > > > > > Thank you for your very long term contribution and efforts. > > > > > > > > > > > > I'm very sorry that I couldn't help you at all now. > > > > > > > > > > > > I'm afraid, but could you please make your latest version of > > > > Loke/BabyIDE > > > > > > written on Squeak3.10.2 available for future generations of > > researchers > > > > > > and/or followers? > > > > > > > > > > > > Anyway, I think your ideas and thoughts should be passed on to > > future > > > > > > generations as faithfully as we can possible, and I myself will > > try to > > > > make > > > > > > sure that. > > > > > > > > > > > > Thank you so much and goodbye. > > > > > > Please take care of yourself. > > > > > > > > > > > > -- > > > > > > sumim > > > > > > > > > > > > 2020-10-03 0:54 Trygve Reenskaug : > > > > > > > > > > > >> Dear all, > > > > > >> I need to use many words to explore why I can't understand current > > > > Squeak > > > > > >> code. I believe the reason is a profound one, and I hope some of > > you > > > > have > > > > > >> the patience to read about it. > > > > > >> > > > > > >> Thank you for your responses to my 'A Sad Day'-message. One > > response > > > > said > > > > > >> "*But please don't give up as an inventor of MVC, which has > > > > simplified > > > > > >> writing software for all of us.* > > > > > >> > > > > > >> > > > > > >> *We need new ideas to stabilize Smalltalk." *As to MVC, it was > > > > received > > > > > >> with acclamation when I first presented it at PARC in 1978, and > > people > > > > > >> suggested I should make it the theme of my article in the special > > > > Smalltalk > > > > > >> issue of Byte. I couldn't understand it; MVC was so simple and > > > > obvious that > > > > > >> is was not worth writing about it. Nevertheless, people seem to > > have > > > > > >> problems understanding MVC. It took me a long time before I > > gleaned > > > > what > > > > > >> was going on. The explanation is a deep one, rooted in our > > different > > > > mental > > > > > >> paradigms. > > > > > >> > > > > > >> From around 1970, I was working on Prokon, a distributed system > > for > > > > > >> managers in the shipbuilding industry: > > > > > >> > > > > > >> Every manager has their own computer that they use for augmenting > > > > their > > > > > >> mind. The manager understands their software and ideally writes it > > > > > >> themselves. Managers delegate conversations with other managers to > > > > their > > > > > >> computer's M-to-M network. (Marked with a heavy black line in the > > > > figure). > > > > > >> I chose "distributed planning with central control" as my example > > > > project. > > > > > >> Each manager creates a plan for their department, using apps > > suited to > > > > > >> their particular needs. A **distributed algorithm** ensures > > > > consistency > > > > > >> across departments. > > > > > >> > > > > > >> I came to PARC in 1978 and could immediately relate to the > > Smalltalk > > > > > >> image with its universe of collaborating objects. Alan's > > definition of > > > > > >> object-orientation fitted my Prokon model: "Thus its semantics > > are a > > > > bit > > > > > >> like having thousands and thousands of computers all hooked > > together > > > > by a > > > > > >> very fast network." > > > > > >> > > > > > >> MVC prescribes a network of communicating objects. Any object can > > fill > > > > > >> one or more positions in the network as long as it has the > > required > > > > > >> behavior; their classes are irrelevant. It's so simple that it's > > not > > > > worth > > > > > >> writing about it. > > > > > >> > > > > > >> > > > > > >> ==================== > > > > > >> > > > > > >> The work on this post was interrupted at this point by an > > unexpected > > > > week > > > > > >> in hospital. It gave me quiet days of pondering the futility of > > what > > > > I am > > > > > >> doing and I will be terminating my memberships in the Pharo and > > Squeak > > > > > >> mailing lists. I have also deleted most of the old draft of this > > > > message > > > > > >> and will quickly conclude with two observations: > > > > > >> > > > > > >> > > > > > >> 1. > > > > > >> The Smalltalk image is a universe of communicating objects. I > > call > > > > it > > > > > >> an object computer. It can be seen as the model of an entirely > > new > > > > kind of > > > > > >> computer, a model on a level closer to the human mind than the > > von > > > > Neumann > > > > > >> model of 1948. The new model is communication-centric and > > should > > > > supersede > > > > > >> the ubiquitous CPU-centric model as soon as possible. Working > > out > > > > the > > > > > >> details of this idea could make an exciting and disruptive > > Ph.D. > > > > thesis. > > > > > >> 2. > > > > > >> Smalltalk is called a programming language. It is a curious > > one, > > > > very > > > > > >> different from well-known languages like Java with their > > syntax and > > > > > >> semantics. Smalltalk, as a programming language, does not have > > the > > > > concept > > > > > >> of a program. Smalltalk, as a class-oriented language, does not > > > > have syntax > > > > > >> for the declaration of a class. Smalltalk, as an > > object-oriented > > > > language, > > > > > >> can't describe how objects collaborate to achieve a goal. You > > > > appear to be > > > > > >> happy with this state of affairs, at least, I see no sign of > > > > anybody > > > > > >> wanting to move on from the unfinished Smalltalk language to a > > > > mature > > > > > >> development environment. I do not find it satisfactory and it > > is > > > > not > > > > > >> acceptable to the intended managers populating the distributed > > > > system shown > > > > > >> in the first picture. Consequently, I have done something > > about it > > > > as > > > > > >> described in my SoSym article "*Personal Programming and the > > Object > > > > > >> Computer.*" I am tired of being alone in my endeavors and this > > ends > > > > > >> my work with Squeak and other Smalltalks. I wish you health and > > > > happiness > > > > > >> wherever you happen to be. > > > > > >> > > > > > >> Trygve > > > > > >> Personal programming and the object computer > > > > > >> https://doi.org/10.1007/s10270-019-00768-3 > > > > > >> > > > > > >> -- > > > > > >> > > > > > >> *The essence of object orientation is that objects collaborate to > > > > > >> achieve a goal. * > > > > > >> Trygve Reenskaug mailto: trygver at ifi.uio.no <% > > > > 20trygver at ifi.uio.no> > > > > > >> Morgedalsvn. 5A http://folk.uio.no/trygver/ > > > > > >> N-0378 Oslo http://fullOO.info > > > > > >> Norway Tel: (+47) 468 58 625 > > > > > >> > > > > > >> > > > > > > > > > > > > -- > > > > > > > > > > > > *The essence of object orientation is that objects collaborate to > > > > achieve > > > > > > a goal. * > > > > > > Trygve Reenskaug mailto: trygver at ifi.uio.no <% > > > > 20trygver at ifi.uio.no> > > > > > > Morgedalsvn. 5A http://folk.uio.no/trygver/ > > > > > > N-0378 Oslo http://fullOO.info > > > > > > Norway Tel: (+47) 468 58 625 > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > -- > > > sent from mobile > > > > > > > > > > > > > -- > sent from mobile > From rabbit at churchofthesacrifice.org Sun Oct 4 23:11:12 2020 From: rabbit at churchofthesacrifice.org (rabbit) Date: Sun, 04 Oct 2020 23:11:12 +0000 Subject: [squeak-dev] would someone add me to Core Developers, please Message-ID: To the source.squeak.org server? Please add me to Core Developers, I am rww. Thanks! rabbit From asqueaker at gmail.com Mon Oct 5 00:25:34 2020 From: asqueaker at gmail.com (Chris Muller) Date: Sun, 4 Oct 2020 19:25:34 -0500 Subject: [squeak-dev] =?utf-8?q?A_Sad_Day_=E2=80=93_concluded?= In-Reply-To: <05fa2ced-b4fd-f8a4-a6f1-2f50ed04b272@ifi.uio.no> References: <05fa2ced-b4fd-f8a4-a6f1-2f50ed04b272@ifi.uio.no> Message-ID: > I am tired of being alone in my endeavors... I hope you won't mind one last farewell, Trygve, to assure you that you are *not* alone. The Introduction of your paper, *Personal programming and the object computer*, says: _____________ My goal is to empower laypeople to control their electronic environment with programs that they write themselves. While a professional programmer is a highly trained expert, the personal programmer writes programs for personal use and values simplicity and convenience over programming sophistication. _____________ Which is, and has been, also, exactly my mission with Squeak. A system for people who want and need the capability of a computer, but _without_ the desire to be a developer. I've been referring to these laypeople as "power users", and have been championing for them within this community for at least the last 15 or so years, even straight to the board. Like you, I've found it challenging to convince this community that Microsoft Excel users have been waiting since 2001 for something better, but I'm here and also Stéphan Rollandin has expressed similar interests. I'm sorry we didn't get a chance to collaborate in real-time, but I'm really glad you've made your work in this area accessible on-line. I've only just begun and it's already hard to stop reading this paper! I can see it's probably going to keep me up tonight, and probably add yet another project to my already long list.. :) So, please, consider it joyful day, not a sad one. Your efforts in moving us further down that highway to the holy grail of Personal Computing have been successful -- it's just that it's a very long and, indeed, lonely highway. But, I believe the Emerald City is finally starting to come into view ahead, thanks to your and a few others' contributions, we may have just enough gas to get there. You may be on the exit ramp that heads west into the sunset, but your work appears to fill one of the last remaining gaps needed to complete the stack. Best Wishes, Chris Muller On Fri, Oct 2, 2020 at 10:53 AM Trygve Reenskaug wrote: > Dear all, > I need to use many words to explore why I can't understand current Squeak > code. I believe the reason is a profound one, and I hope some of you have > the patience to read about it. > > Thank you for your responses to my 'A Sad Day'-message. One response said > "*But please don't give up as an inventor of MVC, which has simplified > writing software for all of us.* > > > *We need new ideas to stabilize Smalltalk." *As to MVC, it was received > with acclamation when I first presented it at PARC in 1978, and people > suggested I should make it the theme of my article in the special Smalltalk > issue of Byte. I couldn't understand it; MVC was so simple and obvious that > is was not worth writing about it. Nevertheless, people seem to have > problems understanding MVC. It took me a long time before I gleaned what > was going on. The explanation is a deep one, rooted in our different mental > paradigms. > > From around 1970, I was working on Prokon, a distributed system for > managers in the shipbuilding industry: > > Every manager has their own computer that they use for augmenting their > mind. The manager understands their software and ideally writes it > themselves. Managers delegate conversations with other managers to their > computer's M-to-M network. (Marked with a heavy black line in the figure). > I chose "distributed planning with central control" as my example project. > Each manager creates a plan for their department, using apps suited to > their particular needs. A **distributed algorithm** ensures consistency > across departments. > > I came to PARC in 1978 and could immediately relate to the Smalltalk image > with its universe of collaborating objects. Alan's definition of > object-orientation fitted my Prokon model: "Thus its semantics are a bit > like having thousands and thousands of computers all hooked together by a > very fast network." > > MVC prescribes a network of communicating objects. Any object can fill one > or more positions in the network as long as it has the required behavior; > their classes are irrelevant. It's so simple that it's not worth writing > about it. > > > ==================== > > The work on this post was interrupted at this point by an unexpected week > in hospital. It gave me quiet days of pondering the futility of what I am > doing and I will be terminating my memberships in the Pharo and Squeak > mailing lists. I have also deleted most of the old draft of this message > and will quickly conclude with two observations: > > > 1. > The Smalltalk image is a universe of communicating objects. I call it > an object computer. It can be seen as the model of an entirely new kind of > computer, a model on a level closer to the human mind than the von Neumann > model of 1948. The new model is communication-centric and should supersede > the ubiquitous CPU-centric model as soon as possible. Working out the > details of this idea could make an exciting and disruptive Ph.D. thesis. > 2. > Smalltalk is called a programming language. It is a curious one, very > different from well-known languages like Java with their syntax and > semantics. Smalltalk, as a programming language, does not have the concept > of a program. Smalltalk, as a class-oriented language, does not have syntax > for the declaration of a class. Smalltalk, as an object-oriented language, > can't describe how objects collaborate to achieve a goal. You appear to be > happy with this state of affairs, at least, I see no sign of anybody > wanting to move on from the unfinished Smalltalk language to a mature > development environment. I do not find it satisfactory and it is not > acceptable to the intended managers populating the distributed system shown > in the first picture. Consequently, I have done something about it as > described in my SoSym article "*Personal Programming and the Object > Computer.*" I am tired of being alone in my endeavors and this ends my > work with Squeak and other Smalltalks. I wish you health and happiness > wherever you happen to be. > > Trygve > Personal programming and the object computer > https://doi.org/10.1007/s10270-019-00768-3 > > -- > > *The essence of object orientation is that objects collaborate to achieve > a goal. * > Trygve Reenskaug mailto: trygver at ifi.uio.no <%20trygver at ifi.uio.no> > Morgedalsvn. 5A http://folk.uio.no/trygver/ > N-0378 Oslo http://fullOO.info > Norway Tel: (+47) 468 58 625 > > -------------- next part -------------- An HTML attachment was scrubbed... URL: -------------- next part -------------- A non-text attachment was scrubbed... Name: kjjbmoogpajdimke.png Type: image/png Size: 45740 bytes Desc: not available URL: -------------- next part -------------- A non-text attachment was scrubbed... Name: cljooepacomafihh.png Type: image/png Size: 22069 bytes Desc: not available URL: From forums.jakob at resfarm.de Mon Oct 5 01:14:07 2020 From: forums.jakob at resfarm.de (Jakob Reschke) Date: Sun, 4 Oct 2020 20:14:07 -0500 (CDT) Subject: [squeak-dev] Development methodology (was: tedious programming-in-the-debugger error needs fixing) In-Reply-To: References: <23476c3e0a68492c8cc917c38ba2c9d4@student.hpi.uni-potsdam.de> <1601475775699-0.post@n4.nabble.com> <1601590406774-0.post@n4.nabble.com> <076817EE-1506-47F9-9AF4-3126C6D3BC76@rowledge.org> Message-ID: <1601860447473-0.post@n4.nabble.com> Hi Chris, I suppose many of us drawn towards Git instead of Monticello find Monticello lacking in not only minor ways. The alternative or improvement needs not necessarily be Git, but given its acceptance in the wider developer community, it is an obvious choice. Chris Muller-3 wrote > For me, > it's not really anything about any "feelings" about Git as the > (im)practicality of integration. It's a beast. To bring a beast into > _everyone's_ workflow that has 90% more "stuff" than we need [...] What exactly do you think is so massive about Git? The basics are really quite simple. The complexity comes with the vast number of possibilities to transform a graph of history, and canonical Git supporting many of them, but you do not have to do or support all of these. Other idiosyncrasies of Git can be simply omitted. For example, you will not find anything about the "index" or staging area of Git in the Git Browser tools. Git vocabulary is different from Monticello vocabulary (that is true for almost all pairs of version control systems) and Git has some different ideas of how tracking works and what to put in a single repository. But if you stick to the Monticello workflows and know the corresponding Git vocabulary, I contend that Git is not more complicated than Monticello. Fixing a Monticello ancestry is at least as complicated as doing a rebase ("advanced feature") in Git; after you have learned either, you can confidently wield either. In other ways, Monticello just looks simpler because something is in fact missing. Consider branches: most Git tools have knobs to deal with them in various ways, while Monticello tools just deny to talk about branches. Monticello ancestry does support branching, yet I think Monticello lacks first-class objects for branches, with all the implications for repository handling. The tools might look simpler without branch management, but it is not a feature but rather the lack of one. Note that you can also avoid branch management in Git: just stay on the mainline branch forever and merge your commits back and forth with the upstream repository's mainline. While it might appear simpler that way, you might as well call it less organized. Chris Muller-3 wrote > [...] requires > them to sign up just to use -- I think it would be a "filter" on the > community, especially of non-developers (hint: You and Jakob are > developers). For me, being hosted by a private company is not so > attractive. As Phil pointed out, you seem to confuse Git with GitHub here. But your arguments are applicable if we take the integrated issue tracker into account because that needs to be run by someone. In theory Squeak could host an own GitLab Community Edition server instead of relying on GitHub. Note that you also have to sign up to use Mantis or participate on the mailing list or the Slack channel. About the "filter": how many non-developers try to trace inbox contributions or engage in code reviews? How many non-developers use Monticello (given that it can only track packages and configuations thereof)? The "filter" might not take anything interesting away from the other target audiences after all. We do not wish to move all discussions from the list to pull requests. Also the idea was to link up pull request conversations with the list, like the CI job reports, or conversations on the OpenSmalltalk-VM repository to the vm-dev list. Chris Muller-3 wrote > For example, you could submit an > improvement that allows original contributors of Inbox items to move them > to Treated themself. How? Only Trunk committers have access to the Squeaksource treating backend, so neither the code nor the tool is available to normal users for improvement. Guest users cannot even delete versions from the inbox repository, can they? Chris Muller-3 wrote > You could add a button to filter out all entries in > the Inbox which have further descendants also in the Inbox. You could > make > an, "update from Inbox" which would only download packages for which have > your loaded versions as ancestors. I don't understand how these would help in the tracking of issues, can you elaborate please? My understanding: The first shows you the tips of all loose branches in the inbox, but still without a mapping to issues (which is not necessarily a 1:1 mapping, with reinforced complexity because of the drive towards a compact ancestry...). Combined with some client-side extensions it might allow us to track branches locally, but not share them explicitly. To find remote branches, you would have to download many of these versions first because only then you can access their ancestry (you don't know in advance which versions are the tips, and combined with the redundancy among versions, this is a Monticello implementation flaw). The second would allow an update if someone moved some of your own branches forward. But it rarely happens nowadays. Chris Muller-3 wrote > There are many simple things that could > be done. A bug-tracker is a bigger deal, but it's often a lot less > overhead to just FIX the bug than open, track, and close a bug report. We > do have Mantis to keep track of the longer-term bugs. I think this plays down the issue. It being a bigger deal is exactly why we would like to use an existing platform. "Just FIX the bug" is not always so straightforward that a single new version is sufficient. There might be multiple iterations, or multiple packages affected, or many versions towards a larger goal over an extended period of time. That's why we would like some integrated issue tracking, even for short-term bugs. Think more of pull requests with conversation and review facilities than of bug tickets. Pull requests, combined with a system that can actually track branches or tasks, allow for iterative refinement and feedback while binding all the iterations or steps together. Mantis is not integrated with Monticello, is it? Also it doesn't look very active. Chris Muller-3 wrote > We have *decades* of Monticello packages for Squeak across not just our > own > repositories, but many other "external" legacy repositories. [...] > Monticello will continue > to be used by some. In my opinion this is no argument against different tools because nobody suggested to remove Monticello from Squeak. As we already see in practice, Git tools and Monticello tools, as well as both kinds of repositories, can co-exist. Otherwise we could still use floppy disks because there are decades of software packages that were distributed on floppy disks, yet we don't. :-) Chris Muller-3 wrote > It seems clear that the only path to Git and other > tools is a backward-compatible integration with existing tools Well, other paths have already been walked. ;-) But in which direction goes this backwards- compatibility? Do you want be able to use newer tools also on old repositories? Alright, that would be nice. Do you want to be able to use newer repositories in old tools? Why, given that it will probably restrict the newer repositories? Chris Muller-3 wrote > a "stepping > stone" that doesn't require a major adjustment like losing method-level > timestamp information. This seems to confound the use of Git with the use of the Tonel format with a Pharo-style implementation. Otherwise it affirms what I wrote a few messages before: maybe we do have to bite the bullet and write a proper MCGitRepository that molds Git-hosted projects into the Monticello tools, even though we have already created other tools. By the way, the draft spec of Tonel that Martin was offering to the list in a recent thread demands that custom attributes on classes, methods, ... be preserved by the system. So even if Squeak woulde use Tonel more often in the future, it would not necessarily mean that method timestamps have to be sacrificed. Squot and its Git tools are stored in the FileTree format, have been Git-hosted from the start, include some packages whose Monticello ancestries have been converted and integrated into the Git history, and has method timestamps all over. Chris Muller-3 wrote > But it's not going to write itself. Only the > burning interest within people like you and/or Jakob will get it done. :) Thank you for the encouragement. Unfortunately with regards to Monticello tools it recurrently sounds like: "If you want contemporary features, you must add them to the old tools because we do not want to adopt new tools that can already do the job." Forgive me if this reads too polemic. Kind regards, Jakob -- Sent from: http://forum.world.st/Squeak-Dev-f45488.html From sumi at seagreen.ocn.ne.jp Mon Oct 5 05:17:47 2020 From: sumi at seagreen.ocn.ne.jp (sumi masato) Date: Mon, 5 Oct 2020 14:17:47 +0900 Subject: [squeak-dev] 64 bit VM for running older images (was: A Sad Day ??? concluded) In-Reply-To: <20201004225953.GA48028@shell.msen.com> References: <05fa2ced-b4fd-f8a4-a6f1-2f50ed04b272@ifi.uio.no> <63d57fb2-3110-3762-7a8c-14ae6d6ef038@ifi.uio.no> <20201004024332.GA46334@shell.msen.com> <20201004131407.GA61026@shell.msen.com> <20201004225953.GA48028@shell.msen.com> Message-ID: Hi Dave, Thanks for the detailed explanation. > In general, a 32-bit image can run on a 64-bit VM (and vice versa). I had a misunderstanding about it completely.. -- sumim 2020年10月5日(月) 8:00 David T. Lewis : > > Changing the subject line because this is not related to the original > discussion. > > In general, a 32-bit image can run on a 64-bit VM (and vice versa). > An explanation is at http://squeakvm.org/squeak64/faq.html > > The more recent Cog and Spur VMs are more restrictive in the sense > that we always use a 64-bit VM when running a 64-bit image, and we > use a 32-bit VM when running a 32-bit image. The reason for this is > that the modern VMs are optimized to provide code generation ("Cog") > and it would be a good deal of effort to make this work on the > various combinations image word size and VM pointer size. > > For the traditional interpreter VM (http://squeakvm.org/) the restriction > is not necessary, and it is usually better to use a native 64-bit VM > regardless of the word size of the image being run. > > Dave > > > On Mon, Oct 05, 2020 at 04:45:17AM +0900, sumi masato wrote: > > Hi Dave, > > > > Oh, I assumed that there had been no 64-bit version of 3.10 VM > > and also that 32-bit virtual images could not run on 64-bit VMs. > > > > Or, does it means that by building from source on current Unix-like system, > > former VM for 32-bit VI can also be generated as 64-bit executables? > > > > Anyway, I'll try to build a 3.10 VM on the latest macOS by following your > > instruction. > > > > Thank you. > > > > -- > > sumim > > > > 2020-10-04 David T. Lewis : > > > > > On Sun, Oct 04, 2020 at 12:07:47PM +0900, sumi masato wrote: > > > > Hi Dave, > > > > > > > > Great! > > > > > > > > Could you build a Docker image and publish it for macOS users > > > > who are restricted 32 bit VM by Apple also to try it easily? > > > > > > > > -- > > > > sumim > > > > > > I have no experience with Docker, but if you or someone else > > > knows how to do that, I'll be happy help if you run into any > > > difficulty compiling the VM. > > > > > > I do not understand "restricted 32 bit VM by Apple" but to > > > clarify, the Linux VM I use is a 64 bit VM running the 32-bit > > > Squeak image. I expect this is what you would want to use if > > > you were building a Docker image, although you can also compile > > > the VM as a 32 bit application if needed. But I saw no problems > > > running Trygve's image on the 64 bit VM. > > > > > > Dave > > > > > > > > > > > > > > 2020-10-04 David T. Lewis : > > > > > > > > > Thank you Trygve, > > > > > > > > > > I confirm also that the image runs very well on my Ubuntu Linux laptop > > > > > with a VM compiled per http://wiki.squeak.org/squeak/6354. > > > > > > > > > > Dave > > > > > > > > > > On Sat, Oct 03, 2020 at 07:56:43PM +0900, masato sumi wrote: > > > > > > Dear Trygve, > > > > > > > > > > > > I confirmed that I could launch the Loke/BabyIDE image with the > > > included > > > > > > SqueakVM for Windows (8.1 and 10) > > > > > > and I could also launch it in a web browser by using the SqueakJS VM > > > ( > > > > > > https://squeak.js.org/run ). > > > > > > > > > > > > Thank you very much. > > > > > > > > > > > > -- > > > > > > sumim > > > > > > > > > > > > 2020-10-03 15:48 Trygve Reenskaug : > > > > > > > > > > > > > Dear Sumim, > > > > > > > Thank you for your kind words. > > > > > > > > > > > > > > The latest version of Loke/BabyIDE written on Squeak3.10.2 is at > > > > > > > https://data.mendeley.com/datasets/5xxgzv7fsp/1 > > > > > > > The image is my program repository. It includes some examples of > > > DCI > > > > > > > programming, Ellen's Personal Programming IDE, Squeak Reverse > > > > > Engineering > > > > > > > (SRE), and more. > > > > > > > > > > > > > > Best > > > > > > > --Trygve > > > > > > > > > > > > > > On 2020-10-02 20:14, masato sumi wrote: > > > > > > > > > > > > > > Dear Trygve, > > > > > > > > > > > > > > Thank you for your very long term contribution and efforts. > > > > > > > > > > > > > > I'm very sorry that I couldn't help you at all now. > > > > > > > > > > > > > > I'm afraid, but could you please make your latest version of > > > > > Loke/BabyIDE > > > > > > > written on Squeak3.10.2 available for future generations of > > > researchers > > > > > > > and/or followers? > > > > > > > > > > > > > > Anyway, I think your ideas and thoughts should be passed on to > > > future > > > > > > > generations as faithfully as we can possible, and I myself will > > > try to > > > > > make > > > > > > > sure that. > > > > > > > > > > > > > > Thank you so much and goodbye. > > > > > > > Please take care of yourself. > > > > > > > > > > > > > > -- > > > > > > > sumim > > > > > > > > > > > > > > 2020-10-03 0:54 Trygve Reenskaug : > > > > > > > > > > > > > >> Dear all, > > > > > > >> I need to use many words to explore why I can't understand current > > > > > Squeak > > > > > > >> code. I believe the reason is a profound one, and I hope some of > > > you > > > > > have > > > > > > >> the patience to read about it. > > > > > > >> > > > > > > >> Thank you for your responses to my 'A Sad Day'-message. One > > > response > > > > > said > > > > > > >> "*But please don't give up as an inventor of MVC, which has > > > > > simplified > > > > > > >> writing software for all of us.* > > > > > > >> > > > > > > >> > > > > > > >> *We need new ideas to stabilize Smalltalk." *As to MVC, it was > > > > > received > > > > > > >> with acclamation when I first presented it at PARC in 1978, and > > > people > > > > > > >> suggested I should make it the theme of my article in the special > > > > > Smalltalk > > > > > > >> issue of Byte. I couldn't understand it; MVC was so simple and > > > > > obvious that > > > > > > >> is was not worth writing about it. Nevertheless, people seem to > > > have > > > > > > >> problems understanding MVC. It took me a long time before I > > > gleaned > > > > > what > > > > > > >> was going on. The explanation is a deep one, rooted in our > > > different > > > > > mental > > > > > > >> paradigms. > > > > > > >> > > > > > > >> From around 1970, I was working on Prokon, a distributed system > > > for > > > > > > >> managers in the shipbuilding industry: > > > > > > >> > > > > > > >> Every manager has their own computer that they use for augmenting > > > > > their > > > > > > >> mind. The manager understands their software and ideally writes it > > > > > > >> themselves. Managers delegate conversations with other managers to > > > > > their > > > > > > >> computer's M-to-M network. (Marked with a heavy black line in the > > > > > figure). > > > > > > >> I chose "distributed planning with central control" as my example > > > > > project. > > > > > > >> Each manager creates a plan for their department, using apps > > > suited to > > > > > > >> their particular needs. A **distributed algorithm** ensures > > > > > consistency > > > > > > >> across departments. > > > > > > >> > > > > > > >> I came to PARC in 1978 and could immediately relate to the > > > Smalltalk > > > > > > >> image with its universe of collaborating objects. Alan's > > > definition of > > > > > > >> object-orientation fitted my Prokon model: "Thus its semantics > > > are a > > > > > bit > > > > > > >> like having thousands and thousands of computers all hooked > > > together > > > > > by a > > > > > > >> very fast network." > > > > > > >> > > > > > > >> MVC prescribes a network of communicating objects. Any object can > > > fill > > > > > > >> one or more positions in the network as long as it has the > > > required > > > > > > >> behavior; their classes are irrelevant. It's so simple that it's > > > not > > > > > worth > > > > > > >> writing about it. > > > > > > >> > > > > > > >> > > > > > > >> ==================== > > > > > > >> > > > > > > >> The work on this post was interrupted at this point by an > > > unexpected > > > > > week > > > > > > >> in hospital. It gave me quiet days of pondering the futility of > > > what > > > > > I am > > > > > > >> doing and I will be terminating my memberships in the Pharo and > > > Squeak > > > > > > >> mailing lists. I have also deleted most of the old draft of this > > > > > message > > > > > > >> and will quickly conclude with two observations: > > > > > > >> > > > > > > >> > > > > > > >> 1. > > > > > > >> The Smalltalk image is a universe of communicating objects. I > > > call > > > > > it > > > > > > >> an object computer. It can be seen as the model of an entirely > > > new > > > > > kind of > > > > > > >> computer, a model on a level closer to the human mind than the > > > von > > > > > Neumann > > > > > > >> model of 1948. The new model is communication-centric and > > > should > > > > > supersede > > > > > > >> the ubiquitous CPU-centric model as soon as possible. Working > > > out > > > > > the > > > > > > >> details of this idea could make an exciting and disruptive > > > Ph.D. > > > > > thesis. > > > > > > >> 2. > > > > > > >> Smalltalk is called a programming language. It is a curious > > > one, > > > > > very > > > > > > >> different from well-known languages like Java with their > > > syntax and > > > > > > >> semantics. Smalltalk, as a programming language, does not have > > > the > > > > > concept > > > > > > >> of a program. Smalltalk, as a class-oriented language, does not > > > > > have syntax > > > > > > >> for the declaration of a class. Smalltalk, as an > > > object-oriented > > > > > language, > > > > > > >> can't describe how objects collaborate to achieve a goal. You > > > > > appear to be > > > > > > >> happy with this state of affairs, at least, I see no sign of > > > > > anybody > > > > > > >> wanting to move on from the unfinished Smalltalk language to a > > > > > mature > > > > > > >> development environment. I do not find it satisfactory and it > > > is > > > > > not > > > > > > >> acceptable to the intended managers populating the distributed > > > > > system shown > > > > > > >> in the first picture. Consequently, I have done something > > > about it > > > > > as > > > > > > >> described in my SoSym article "*Personal Programming and the > > > Object > > > > > > >> Computer.*" I am tired of being alone in my endeavors and this > > > ends > > > > > > >> my work with Squeak and other Smalltalks. I wish you health and > > > > > happiness > > > > > > >> wherever you happen to be. > > > > > > >> > > > > > > >> Trygve > > > > > > >> Personal programming and the object computer > > > > > > >> https://doi.org/10.1007/s10270-019-00768-3 > > > > > > >> > > > > > > >> -- > > > > > > >> > > > > > > >> *The essence of object orientation is that objects collaborate to > > > > > > >> achieve a goal. * > > > > > > >> Trygve Reenskaug mailto: trygver at ifi.uio.no <% > > > > > 20trygver at ifi.uio.no> > > > > > > >> Morgedalsvn. 5A http://folk.uio.no/trygver/ > > > > > > >> N-0378 Oslo http://fullOO.info > > > > > > >> Norway Tel: (+47) 468 58 625 > > > > > > >> > > > > > > >> > > > > > > > > > > > > > > -- > > > > > > > > > > > > > > *The essence of object orientation is that objects collaborate to > > > > > achieve > > > > > > > a goal. * > > > > > > > Trygve Reenskaug mailto: trygver at ifi.uio.no <% > > > > > 20trygver at ifi.uio.no> > > > > > > > Morgedalsvn. 5A http://folk.uio.no/trygver/ > > > > > > > N-0378 Oslo http://fullOO.info > > > > > > > Norway Tel: (+47) 468 58 625 > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > -- > > > > sent from mobile > > > > > > > > > > > > > > > > > > > > -- > > sent from mobile > > > > > From eliot.miranda at gmail.com Mon Oct 5 06:50:36 2020 From: eliot.miranda at gmail.com (Eliot Miranda) Date: Sun, 4 Oct 2020 23:50:36 -0700 Subject: [squeak-dev] Development methodology (was: tedious programming-in-the-debugger error needs fixing) In-Reply-To: <1601860447473-0.post@n4.nabble.com> References: <1601860447473-0.post@n4.nabble.com> Message-ID: <025A3F5C-E26E-44C6-B19B-FBED361CE779@gmail.com> Hi Jakob, > On Oct 4, 2020, at 6:14 PM, Jakob Reschke wrote: > > Hi Chris, > > I suppose many of us drawn towards Git instead of Monticello find Monticello > lacking in not only minor ways. The alternative or improvement needs not > necessarily be Git, but given its acceptance in the wider developer > community, it is an obvious choice. > > > Chris Muller-3 wrote >> For me, >> it's not really anything about any "feelings" about Git as the >> (im)practicality of integration. It's a beast. To bring a beast into >> _everyone's_ workflow that has 90% more "stuff" than we need [...] > > What exactly do you think is so massive about Git? The basics are really > quite simple. The complexity comes with the vast number of possibilities to > transform a graph of history, and canonical Git supporting many of them, but > you do not have to do or support all of these. Other idiosyncrasies of Git > can be simply omitted. For example, you will not find anything about the > "index" or staging area of Git in the Git Browser tools. Git vocabulary is > different from Monticello vocabulary (that is true for almost all pairs of > version control systems) and Git has some different ideas of how tracking > works and what to put in a single repository. But if you stick to the > Monticello workflows and know the corresponding Git vocabulary, I contend > that Git is not more complicated than Monticello. Fixing a Monticello > ancestry is at least as complicated as doing a rebase ("advanced feature") > in Git; after you have learned either, you can confidently wield either. > > In other ways, Monticello just looks simpler because something is in fact > missing. Consider branches: most Git tools have knobs to deal with them in > various ways, while Monticello tools just deny to talk about branches. > Monticello ancestry does support branching, yet I think Monticello lacks > first-class objects for branches, with all the implications for repository > handling. The tools might look simpler without branch management, but it is > not a feature but rather the lack of one. Note that you can also avoid > branch management in Git: just stay on the mainline branch forever and merge > your commits back and forth with the upstream repository's mainline. While > it might appear simpler that way, you might as well call it less organized. Monticello supports branches. And merging between them is as easy as merging any other version of a package. And Monticello does support recording histories across branches. The two things that Monticello has over git are - that it is used without leaving the image. I’ve yet to see a git integration where at some stage one was forced to try and fix things in git, or that the image and the git repository got out of sync, or that if one tried to use more than one image against a git repository something horrible broke - that it can be extended using our own tools. Git is written in C and controlled by a separate community. One gives up great autonomy when allowing ones core VCS to be in a foreign system. When git crashes it crashes. It doesn’t raise a friendly debugger in which one can determine and fix and proceed from the bug, it segfaults, in optimized code, and you’re hosed. Personally I don’t want to work in that kind of world. The Pharo crowd do. I will do everything in my power to prevent Squeak going the same way. And if I’m unsuccessful I’ll go somewhere else. > > Chris Muller-3 wrote >> [...] requires >> them to sign up just to use -- I think it would be a "filter" on the >> community, especially of non-developers (hint: You and Jakob are >> developers). For me, being hosted by a private company is not so >> attractive. > > As Phil pointed out, you seem to confuse Git with GitHub here. But your > arguments are applicable if we take the integrated issue tracker into > account because that needs to be run by someone. In theory Squeak could host > an own GitLab Community Edition server instead of relying on GitHub. > > Note that you also have to sign up to use Mantis or participate on the > mailing list or the Slack channel. > > About the "filter": how many non-developers try to trace inbox contributions > or engage in code reviews? How many non-developers use Monticello (given > that it can only track packages and configuations thereof)? The "filter" > might not take anything interesting away from the other target audiences > after all. > > We do not wish to move all discussions from the list to pull requests. Also > the idea was to link up pull request conversations with the list, like the > CI job reports, or conversations on the OpenSmalltalk-VM repository to the > vm-dev list. > > > Chris Muller-3 wrote >> For example, you could submit an >> improvement that allows original contributors of Inbox items to move them >> to Treated themself. > > How? Only Trunk committers have access to the Squeaksource treating backend, > so neither the code nor the tool is available to normal users for > improvement. Guest users cannot even delete versions from the inbox > repository, can they? > > > Chris Muller-3 wrote >> You could add a button to filter out all entries in >> the Inbox which have further descendants also in the Inbox. You could >> make >> an, "update from Inbox" which would only download packages for which have >> your loaded versions as ancestors. > > I don't understand how these would help in the tracking of issues, can you > elaborate please? My understanding: The first shows you the tips of all > loose branches in the inbox, but still without a mapping to issues (which is > not necessarily a 1:1 mapping, with reinforced complexity because of the > drive towards a compact ancestry...). Combined with some client-side > extensions it might allow us to track branches locally, but not share them > explicitly. To find remote branches, you would have to download many of > these versions first because only then you can access their ancestry (you > don't know in advance which versions are the tips, and combined with the > redundancy among versions, this is a Monticello implementation flaw). The > second would allow an update if someone moved some of your own branches > forward. But it rarely happens nowadays. > > > Chris Muller-3 wrote >> There are many simple things that could >> be done. A bug-tracker is a bigger deal, but it's often a lot less >> overhead to just FIX the bug than open, track, and close a bug report. We >> do have Mantis to keep track of the longer-term bugs. > > I think this plays down the issue. It being a bigger deal is exactly why we > would like to use an existing platform. "Just FIX the bug" is not always so > straightforward that a single new version is sufficient. There might be > multiple iterations, or multiple packages affected, or many versions towards > a larger goal over an extended period of time. That's why we would like some > integrated issue tracking, even for short-term bugs. Think more of pull > requests with conversation and review facilities than of bug tickets. Pull > requests, combined with a system that can actually track branches or tasks, > allow for iterative refinement and feedback while binding all the iterations > or steps together. > > Mantis is not integrated with Monticello, is it? Also it doesn't look very > active. > > > Chris Muller-3 wrote >> We have *decades* of Monticello packages for Squeak across not just our >> own >> repositories, but many other "external" legacy repositories. [...] >> Monticello will continue >> to be used by some. > > In my opinion this is no argument against different tools because nobody > suggested to remove Monticello from Squeak. As we already see in practice, > Git tools and Monticello tools, as well as both kinds of repositories, can > co-exist. > > Otherwise we could still use floppy disks because there are decades of > software packages that were distributed on floppy disks, yet we don't. :-) > > > Chris Muller-3 wrote >> It seems clear that the only path to Git and other >> tools is a backward-compatible integration with existing tools > > Well, other paths have already been walked. ;-) But in which direction goes > this backwards- compatibility? Do you want be able to use newer tools also > on old repositories? Alright, that would be nice. Do you want to be able to > use newer repositories in old tools? Why, given that it will probably > restrict the newer repositories? > > > Chris Muller-3 wrote >> a "stepping >> stone" that doesn't require a major adjustment like losing method-level >> timestamp information. > > This seems to confound the use of Git with the use of the Tonel format with > a Pharo-style implementation. > > Otherwise it affirms what I wrote a few messages before: maybe we do have to > bite the bullet and write a proper MCGitRepository that molds Git-hosted > projects into the Monticello tools, even though we have already created > other tools. > > By the way, the draft spec of Tonel that Martin was offering to the list in > a recent thread demands that custom attributes on classes, methods, ... be > preserved by the system. So even if Squeak woulde use Tonel more often in > the future, it would not necessarily mean that method timestamps have to be > sacrificed. Squot and its Git tools are stored in the FileTree format, have > been Git-hosted from the start, include some packages whose Monticello > ancestries have been converted and integrated into the Git history, and has > method timestamps all over. > > > Chris Muller-3 wrote >> But it's not going to write itself. Only the >> burning interest within people like you and/or Jakob will get it done. :) > > Thank you for the encouragement. Unfortunately with regards to Monticello > tools it recurrently sounds like: "If you want contemporary features, you > must add them to the old tools because we do not want to adopt new tools > that can already do the job." Forgive me if this reads too polemic. > > Kind regards, > Jakob > > > > -- > Sent from: http://forum.world.st/Squeak-Dev-f45488.html > From marcel.taeumel at hpi.de Mon Oct 5 09:14:25 2020 From: marcel.taeumel at hpi.de (Marcel Taeumel) Date: Mon, 5 Oct 2020 11:14:25 +0200 Subject: [squeak-dev] Development methodology (was: tedious programming-in-the-debugger error needs fixing) In-Reply-To: <025A3F5C-E26E-44C6-B19B-FBED361CE779@gmail.com> References: <1601860447473-0.post@n4.nabble.com> <025A3F5C-E26E-44C6-B19B-FBED361CE779@gmail.com> Message-ID: Hi Eliot. :-) > that it is used without leaving the image +1 > that it can be extended using our own tools +1 > One gives up great autonomy when allowing ones core VCS to be in a foreign system +1000 > Personally I don’t want to work in that kind of world. Me neither. Let's keep on working hard (or even fighting^^) for those values! Best, Marcel Am 05.10.2020 08:50:48 schrieb Eliot Miranda : Hi Jakob, > On Oct 4, 2020, at 6:14 PM, Jakob Reschke wrote: > > Hi Chris, > > I suppose many of us drawn towards Git instead of Monticello find Monticello > lacking in not only minor ways. The alternative or improvement needs not > necessarily be Git, but given its acceptance in the wider developer > community, it is an obvious choice. > > > Chris Muller-3 wrote >> For me, >> it's not really anything about any "feelings" about Git as the >> (im)practicality of integration. It's a beast. To bring a beast into >> _everyone's_ workflow that has 90% more "stuff" than we need [...] > > What exactly do you think is so massive about Git? The basics are really > quite simple. The complexity comes with the vast number of possibilities to > transform a graph of history, and canonical Git supporting many of them, but > you do not have to do or support all of these. Other idiosyncrasies of Git > can be simply omitted. For example, you will not find anything about the > "index" or staging area of Git in the Git Browser tools. Git vocabulary is > different from Monticello vocabulary (that is true for almost all pairs of > version control systems) and Git has some different ideas of how tracking > works and what to put in a single repository. But if you stick to the > Monticello workflows and know the corresponding Git vocabulary, I contend > that Git is not more complicated than Monticello. Fixing a Monticello > ancestry is at least as complicated as doing a rebase ("advanced feature") > in Git; after you have learned either, you can confidently wield either. > > In other ways, Monticello just looks simpler because something is in fact > missing. Consider branches: most Git tools have knobs to deal with them in > various ways, while Monticello tools just deny to talk about branches. > Monticello ancestry does support branching, yet I think Monticello lacks > first-class objects for branches, with all the implications for repository > handling. The tools might look simpler without branch management, but it is > not a feature but rather the lack of one. Note that you can also avoid > branch management in Git: just stay on the mainline branch forever and merge > your commits back and forth with the upstream repository's mainline. While > it might appear simpler that way, you might as well call it less organized. Monticello supports branches. And merging between them is as easy as merging any other version of a package. And Monticello does support recording histories across branches. The two things that Monticello has over git are - that it is used without leaving the image. I’ve yet to see a git integration where at some stage one was forced to try and fix things in git, or that the image and the git repository got out of sync, or that if one tried to use more than one image against a git repository something horrible broke - that it can be extended using our own tools. Git is written in C and controlled by a separate community. One gives up great autonomy when allowing ones core VCS to be in a foreign system. When git crashes it crashes. It doesn’t raise a friendly debugger in which one can determine and fix and proceed from the bug, it segfaults, in optimized code, and you’re hosed. Personally I don’t want to work in that kind of world. The Pharo crowd do. I will do everything in my power to prevent Squeak going the same way. And if I’m unsuccessful I’ll go somewhere else. > > Chris Muller-3 wrote >> [...] requires >> them to sign up just to use -- I think it would be a "filter" on the >> community, especially of non-developers (hint: You and Jakob are >> developers). For me, being hosted by a private company is not so >> attractive. > > As Phil pointed out, you seem to confuse Git with GitHub here. But your > arguments are applicable if we take the integrated issue tracker into > account because that needs to be run by someone. In theory Squeak could host > an own GitLab Community Edition server instead of relying on GitHub. > > Note that you also have to sign up to use Mantis or participate on the > mailing list or the Slack channel. > > About the "filter": how many non-developers try to trace inbox contributions > or engage in code reviews? How many non-developers use Monticello (given > that it can only track packages and configuations thereof)? The "filter" > might not take anything interesting away from the other target audiences > after all. > > We do not wish to move all discussions from the list to pull requests. Also > the idea was to link up pull request conversations with the list, like the > CI job reports, or conversations on the OpenSmalltalk-VM repository to the > vm-dev list. > > > Chris Muller-3 wrote >> For example, you could submit an >> improvement that allows original contributors of Inbox items to move them >> to Treated themself. > > How? Only Trunk committers have access to the Squeaksource treating backend, > so neither the code nor the tool is available to normal users for > improvement. Guest users cannot even delete versions from the inbox > repository, can they? > > > Chris Muller-3 wrote >> You could add a button to filter out all entries in >> the Inbox which have further descendants also in the Inbox. You could >> make >> an, "update from Inbox" which would only download packages for which have >> your loaded versions as ancestors. > > I don't understand how these would help in the tracking of issues, can you > elaborate please? My understanding: The first shows you the tips of all > loose branches in the inbox, but still without a mapping to issues (which is > not necessarily a 1:1 mapping, with reinforced complexity because of the > drive towards a compact ancestry...). Combined with some client-side > extensions it might allow us to track branches locally, but not share them > explicitly. To find remote branches, you would have to download many of > these versions first because only then you can access their ancestry (you > don't know in advance which versions are the tips, and combined with the > redundancy among versions, this is a Monticello implementation flaw). The > second would allow an update if someone moved some of your own branches > forward. But it rarely happens nowadays. > > > Chris Muller-3 wrote >> There are many simple things that could >> be done. A bug-tracker is a bigger deal, but it's often a lot less >> overhead to just FIX the bug than open, track, and close a bug report. We >> do have Mantis to keep track of the longer-term bugs. > > I think this plays down the issue. It being a bigger deal is exactly why we > would like to use an existing platform. "Just FIX the bug" is not always so > straightforward that a single new version is sufficient. There might be > multiple iterations, or multiple packages affected, or many versions towards > a larger goal over an extended period of time. That's why we would like some > integrated issue tracking, even for short-term bugs. Think more of pull > requests with conversation and review facilities than of bug tickets. Pull > requests, combined with a system that can actually track branches or tasks, > allow for iterative refinement and feedback while binding all the iterations > or steps together. > > Mantis is not integrated with Monticello, is it? Also it doesn't look very > active. > > > Chris Muller-3 wrote >> We have *decades* of Monticello packages for Squeak across not just our >> own >> repositories, but many other "external" legacy repositories. [...] >> Monticello will continue >> to be used by some. > > In my opinion this is no argument against different tools because nobody > suggested to remove Monticello from Squeak. As we already see in practice, > Git tools and Monticello tools, as well as both kinds of repositories, can > co-exist. > > Otherwise we could still use floppy disks because there are decades of > software packages that were distributed on floppy disks, yet we don't. :-) > > > Chris Muller-3 wrote >> It seems clear that the only path to Git and other >> tools is a backward-compatible integration with existing tools > > Well, other paths have already been walked. ;-) But in which direction goes > this backwards- compatibility? Do you want be able to use newer tools also > on old repositories? Alright, that would be nice. Do you want to be able to > use newer repositories in old tools? Why, given that it will probably > restrict the newer repositories? > > > Chris Muller-3 wrote >> a "stepping >> stone" that doesn't require a major adjustment like losing method-level >> timestamp information. > > This seems to confound the use of Git with the use of the Tonel format with > a Pharo-style implementation. > > Otherwise it affirms what I wrote a few messages before: maybe we do have to > bite the bullet and write a proper MCGitRepository that molds Git-hosted > projects into the Monticello tools, even though we have already created > other tools. > > By the way, the draft spec of Tonel that Martin was offering to the list in > a recent thread demands that custom attributes on classes, methods, ... be > preserved by the system. So even if Squeak woulde use Tonel more often in > the future, it would not necessarily mean that method timestamps have to be > sacrificed. Squot and its Git tools are stored in the FileTree format, have > been Git-hosted from the start, include some packages whose Monticello > ancestries have been converted and integrated into the Git history, and has > method timestamps all over. > > > Chris Muller-3 wrote >> But it's not going to write itself. Only the >> burning interest within people like you and/or Jakob will get it done. :) > > Thank you for the encouragement. Unfortunately with regards to Monticello > tools it recurrently sounds like: "If you want contemporary features, you > must add them to the old tools because we do not want to adopt new tools > that can already do the job." Forgive me if this reads too polemic. > > Kind regards, > Jakob > > > > -- > Sent from: http://forum.world.st/Squeak-Dev-f45488.html > -------------- next part -------------- An HTML attachment was scrubbed... URL: From marcel.taeumel at hpi.de Mon Oct 5 09:18:43 2020 From: marcel.taeumel at hpi.de (Marcel Taeumel) Date: Mon, 5 Oct 2020 11:18:43 +0200 Subject: [squeak-dev] you folks did a great job on the preferences wizard experience on the launch of a new squeak. In-Reply-To: References: <174ee2e8678.e34ea36628862.431992921320213564@zoho.com> Message-ID: Thanks ^__^ ... it's implementation still needs some clean up, though ... ~.~' A classic example of powerful quick-and-dirty scripting ... :-D ... (c) 2016 ...  Best, Marcel Am 05.10.2020 00:33:07 schrieb Chris Muller : I believe sole credit goes to Marcel for that one. I agree, it's fantastic. On Sat, Oct 3, 2020 at 6:17 AM gettimothy via Squeak-dev wrote: Very polished, nice work, pleasure to use. thanks for your hard work. -------------- next part -------------- An HTML attachment was scrubbed... URL: From eliot.miranda at gmail.com Mon Oct 5 09:43:27 2020 From: eliot.miranda at gmail.com (Eliot Miranda) Date: Mon, 5 Oct 2020 02:43:27 -0700 Subject: [squeak-dev] The XML libraries run fine on Squeak 6 alpha In-Reply-To: References: Message-ID: Hi All, votes for & against inclusion of Monty’s XML in trunk/6 beta? +1 _,,,^..^,,,_ (phone) > On Oct 4, 2020, at 12:44 PM, monty wrote: > > Installing the (head)s of: > XMLParser (which loads "XMLWriter" too) > XMLParser-XPath (be careful not to install the old, unfinished "XPath" project) > XMLParser-StAX > XMLParser-HTML > from the SqueakMap works fine; all the tests still pass. XMLParser installation still pops up a warning you have to click through b/c of a conflict with the old XMLParser in the image, but it's fine other than that. > > Supposedly there are conflicts with XStreams, but I have nothing to do with that. > > An aside: some tests are skipped by default because they rely on external resources, like the file system or HTTP, which makes it easier to distinguish real regressions from something like a network outage. The skipping is more obvious on Pharo because their TestCase has a #skip message that the TestRunner UI supports. On Squeak these tests just silently pass. To run them, send XMLSkippableTest #stopSkippingAll. Unfortunately b/c of the W3C rate limiting, the tests using xhtml DTDs timeout if you run them more than once. You could say they should be cached (the default resolver does just that), but the purpose of these tests is to test real HTTP retrieval, so that defeats the purpose. > ___ > montyos.wordpress.com > > From marcel.taeumel at hpi.de Mon Oct 5 09:47:42 2020 From: marcel.taeumel at hpi.de (Marcel Taeumel) Date: Mon, 5 Oct 2020 11:47:42 +0200 Subject: [squeak-dev] Notice | On inbox treatment, pleaes use "move to" instead of "copy to" Message-ID: Hi all! I notice several, already-merged, versions in the inbox:  When treating inbox versions, please use "move to trunk" or "move to treated" from the source.squeak.org Web interface. The "copy to" from within the image does not clean up the inbox. ... Can we have that "move" as a button besides "copy" in Monitcello tools? Is a move operation possible through that interface? Best, Marcel -------------- next part -------------- An HTML attachment was scrubbed... URL: -------------- next part -------------- A non-text attachment was scrubbed... Name: image.png Type: image/png Size: 83113 bytes Desc: not available URL: From marcel.taeumel at hpi.de Mon Oct 5 09:50:05 2020 From: marcel.taeumel at hpi.de (Marcel Taeumel) Date: Mon, 5 Oct 2020 11:50:05 +0200 Subject: [squeak-dev] The XML libraries run fine on Squeak 6 alpha In-Reply-To: References: Message-ID: +1  XML parsing is already in the image and thus should get the latest treatments. :-) Best, Marcel Am 05.10.2020 11:43:40 schrieb Eliot Miranda : Hi All, votes for & against inclusion of Monty’s XML in trunk/6 beta? +1 _,,,^..^,,,_ (phone) > On Oct 4, 2020, at 12:44 PM, monty wrote: > > Installing the (head)s of: > XMLParser (which loads "XMLWriter" too) > XMLParser-XPath (be careful not to install the old, unfinished "XPath" project) > XMLParser-StAX > XMLParser-HTML > from the SqueakMap works fine; all the tests still pass. XMLParser installation still pops up a warning you have to click through b/c of a conflict with the old XMLParser in the image, but it's fine other than that. > > Supposedly there are conflicts with XStreams, but I have nothing to do with that. > > An aside: some tests are skipped by default because they rely on external resources, like the file system or HTTP, which makes it easier to distinguish real regressions from something like a network outage. The skipping is more obvious on Pharo because their TestCase has a #skip message that the TestRunner UI supports. On Squeak these tests just silently pass. To run them, send XMLSkippableTest #stopSkippingAll. Unfortunately b/c of the W3C rate limiting, the tests using xhtml DTDs timeout if you run them more than once. You could say they should be cached (the default resolver does just that), but the purpose of these tests is to test real HTTP retrieval, so that defeats the purpose. > ___ > montyos.wordpress.com > > -------------- next part -------------- An HTML attachment was scrubbed... URL: From marcel.taeumel at hpi.de Mon Oct 5 09:55:53 2020 From: marcel.taeumel at hpi.de (Marcel Taeumel) Date: Mon, 5 Oct 2020 11:55:53 +0200 Subject: [squeak-dev] The Trunk: Tools-eem.994.mcz In-Reply-To: References: <97d84f4313964fbc94240523f36e4d05@student.hpi.uni-potsdam.de> <,> <12AA64AA-4DA9-4E6F-9B0F-C70A02BA021A@rowledge.org> Message-ID: Interesting! Yes, there is redundant work happening when styling field-by-field. Hmmm... one could add some kind cache shared between all "inspector fields" in an inspector. That stepping is not the issue here because debugger inspectors do not step. Best, Marcel Am 03.10.2020 00:07:35 schrieb Thiede, Christoph : Hi Tim, I added the styling to the inspector fields because, in my opinion, this helps you to identify different kinds of fields faster. But we should start honoring the preference SHTextStylerST80 syntaxHighlightingAsYouType again, this would allow you to turn off styling in your individual image. > And if one *does* feel a need for that, since we know quite a lot about what the field labels are, why can one not do some more focussed action than a general 'err, here, style this thing for me'? This was simply a question of code quality vs. optimization. One main objective of the recent inspector refactoring was to make it easier to extend/subclass it, and reproducing the styler logic would make this unnecessarily complicated. Also, the styling must honor be updated when the user interface theme is changed, so using Shout out of the box simply looked like the most straightforward and elegant solution to me ... We could also introduce a cache of the styled field titles in Inspector >> #resetFields by computing a hash value from the list of unstyled field titles. Best, Christoph Von: Squeak-dev im Auftrag von tim Rowledge Gesendet: Freitag, 2. Oktober 2020 23:37:02 An: The general-purpose Squeak developers list Cc: packages at lists.squeakfoundation.org Betreff: Re: [squeak-dev] The Trunk: Tools-eem.994.mcz   Forgive the potentially dumb question, but why exactly does one want to use any sort of styling stuff on fields in an inspector? And if one *does* feel a need for that, since we know quite a lot about what the field labels are, why can one not do some more focussed action than a general 'err, here, style this thing for me'? > On 2020-10-02, at 2:18 PM, Thiede, Christoph wrote: > > Hi Eliot, > > thanks for the exact steps to reproduce. I will use [1000 timesRepeat: [self performAction]] timeProfile because I don't have the AndreasSystemProfiler. > > Does ShoutCore-ct.78 from the inbox help you to speed things up? For me, it speeds up the call from 3.84 sec down to 1.07 sec - but still, there happens a lot of redundant shout styling. > Hm, why can't we recreate the fields lazily in #fields instead of doing this eagerly in #resetFields? This is how I originally implemented it but then Marcel changed it - I don't know the reason. :-) > > Best, > Christoph > Von: Eliot Miranda > Gesendet: Freitag, 2. Oktober 2020 22:59:04 > An: The general-purpose Squeak developers list; Taeumel, Marcel; Thiede, Christoph > Cc: packages at lists.squeakfoundation.org > Betreff: Re: [squeak-dev] The Trunk: Tools-eem.994.mcz >  > Hi Marcel, Hi Christoph, > >     I emailed the list and cc'ed you to get your attention.  Forgive my rude interruption.  I finally found out where the slow down really is.  It is in > > Inspector>>fieldList > "Return a list of texts that identify the fields for the object under inspection so that the user can make an informed decision on what to inspect." > ^ self fieldListStyler > ifNil: [self fields collect: [:field | field name]] > ifNotNil: [:styler | > self updateStyler: styler. > self fields collect: [:field | > field shouldStyleName > ifTrue: [styler styledTextFor: field name asText] > ifFalse: [field name]]] > > So this runs a styler over the entire method every time one steps.  And if one is stepping through a doit it will call the decompiler to generate the source to style, every time you step.  We have to do better :-) > > Here's how to profile it.  Debug a doit.  I wrote this one: > > | t | > t := 0. > [| a b c | > a := 1. b := 2. c := 100. > (a = 1 and: [b = 2 and: [c = 100]]) > ifTrue: > [1 to: 100 by: 2 do: > [:i| t := t + 1]] > ifFalse: > [a to: c by: b do: > [:i| t := t + 1]]] repeat. > t > > Once in the debugger inspect the "Over" button.  Then in that inspector evaluate > >       AndreasSystemProfiler spyOn: [1000 timesRepeat: [self performAction]] > > and you'll see that essentially all the time is going into SHTextStylerST80(SHTextStyler) styledTextFor: > > On Fri, Oct 2, 2020 at 1:44 PM wrote: > Eliot Miranda uploaded a new version of Tools to project The Trunk: > http://source.squeak.org/trunk/Tools-eem.994.mcz [http://source.squeak.org/trunk/Tools-eem.994.mcz] > > ==================== Summary ==================== > > Name: Tools-eem.994 > Author: eem > Time: 2 October 2020, 1:44:29.015648 pm > UUID: 23145257-280d-4a4a-a4ba-3b5cc367f9a9 > Ancestors: Tools-eem.993 > > Oops! Compiledmethod>>blockExtentsToTempsMap needs to observe that startKeysToBlockExtents has moved to DebuggerMethodMap. > > =============== Diff against Tools-eem.993 =============== > > Item was changed: >   ----- Method: CompiledMethod>>blockExtentsToTempsMap (in category '*Tools-Debugger-support') ----- >   blockExtentsToTempsMap >         "If the receiver has been copied with temp names answer a >          map from blockExtent to temps map in the same format as >          BytecodeEncoder>>blockExtentsToTempNamesMap.  if the >          receiver has not been copied with temps answer nil." >         ^self holdsTempNames ifTrue: > +               [self mapFromBlockKeys: (self debuggerMap startKeysToBlockExtents values sort: [:assocA :assocB| assocA first <= assocB first]) > -               [self mapFromBlockKeys: (self startKeysToBlockExtents values sort: [:assocA :assocB| assocA first <= assocB first]) >                         toSchematicTemps: self tempNamesString]! > > > > > -- > _,,,^..^,,,_ > best, Eliot tim -- tim Rowledge; tim at rowledge.org; http://www.rowledge.org/tim [http://www.rowledge.org/tim] Do files get embarrassed when they get unzipped? -------------- next part -------------- An HTML attachment was scrubbed... URL: From Das.Linux at gmx.de Mon Oct 5 10:04:54 2020 From: Das.Linux at gmx.de (Tobias Pape) Date: Mon, 5 Oct 2020 12:04:54 +0200 Subject: [squeak-dev] The XML libraries run fine on Squeak 6 alpha In-Reply-To: References: Message-ID: +1 > On 05.10.2020, at 11:43, Eliot Miranda wrote: > > Hi All, > > votes for & against inclusion of Monty’s XML in trunk/6 beta? > > +1 > > _,,,^..^,,,_ (phone) > >> On Oct 4, 2020, at 12:44 PM, monty wrote: >> >> Installing the (head)s of: >> XMLParser (which loads "XMLWriter" too) >> XMLParser-XPath (be careful not to install the old, unfinished "XPath" project) >> XMLParser-StAX >> XMLParser-HTML >> from the SqueakMap works fine; all the tests still pass. XMLParser installation still pops up a warning you have to click through b/c of a conflict with the old XMLParser in the image, but it's fine other than that. >> >> Supposedly there are conflicts with XStreams, but I have nothing to do with that. >> >> An aside: some tests are skipped by default because they rely on external resources, like the file system or HTTP, which makes it easier to distinguish real regressions from something like a network outage. The skipping is more obvious on Pharo because their TestCase has a #skip message that the TestRunner UI supports. On Squeak these tests just silently pass. To run them, send XMLSkippableTest #stopSkippingAll. Unfortunately b/c of the W3C rate limiting, the tests using xhtml DTDs timeout if you run them more than once. You could say they should be cached (the default resolver does just that), but the purpose of these tests is to test real HTTP retrieval, so that defeats the purpose. >> ___ >> montyos.wordpress.com >> >> > From gettimothy at zoho.com Mon Oct 5 13:31:01 2020 From: gettimothy at zoho.com (gettimothy) Date: Mon, 05 Oct 2020 09:31:01 -0400 Subject: [squeak-dev] Development methodology (was: tedious        programming-in-the-debugger error needs fixing) In-Reply-To: <025A3F5C-E26E-44C6-B19B-FBED361CE779@gmail.com> References: <1601860447473-0.post@n4.nabble.com> <025A3F5C-E26E-44C6-B19B-FBED361CE779@gmail.com> Message-ID: <174f8f5548b.e4c3e13b138475.8358330872058455280@zoho.com> Brainstorming here, laugh, mock, fume, etc as appropriate An enterprising dev implements the git server in squeak .... 1. any git client interacts just as with the c git. 2. Behind the scenes, git uuid's are used but so are monticello "stuff" 3. Monticello interacts with the sqGit server seamlessly.( Handoff?) 4. Bug happens...native squeak tools... I have learned and forgotten Git at least twice,but iirc, it is a tree of uuids and ops on that tree. If that is true, I sense an opportunity for a dev who is interested If i had time, I would do it as it sounds like a fun project. I do not have time. ): ---- On Mon, 05 Oct 2020 02:50:36 -0400 eliot.miranda at gmail.com wrote ---- Hi Jakob, > On Oct 4, 2020, at 6:14 PM, Jakob Reschke wrote: > > Hi Chris, > > I suppose many of us drawn towards Git instead of Monticello find Monticello > lacking in not only minor ways. The alternative or improvement needs not > necessarily be Git, but given its acceptance in the wider developer > community, it is an obvious choice. > > > Chris Muller-3 wrote >> For me, >> it's not really anything about any "feelings" about Git as the >> (im)practicality of integration. It's a beast. To bring a beast into >> _everyone's_ workflow that has 90% more "stuff" than we need [...] > > What exactly do you think is so massive about Git? The basics are really > quite simple. The complexity comes with the vast number of possibilities to > transform a graph of history, and canonical Git supporting many of them, but > you do not have to do or support all of these. Other idiosyncrasies of Git > can be simply omitted. For example, you will not find anything about the > "index" or staging area of Git in the Git Browser tools. Git vocabulary is > different from Monticello vocabulary (that is true for almost all pairs of > version control systems) and Git has some different ideas of how tracking > works and what to put in a single repository. But if you stick to the > Monticello workflows and know the corresponding Git vocabulary, I contend > that Git is not more complicated than Monticello. Fixing a Monticello > ancestry is at least as complicated as doing a rebase ("advanced feature") > in Git; after you have learned either, you can confidently wield either. > > In other ways, Monticello just looks simpler because something is in fact > missing. Consider branches: most Git tools have knobs to deal with them in > various ways, while Monticello tools just deny to talk about branches. > Monticello ancestry does support branching, yet I think Monticello lacks > first-class objects for branches, with all the implications for repository > handling. The tools might look simpler without branch management, but it is > not a feature but rather the lack of one. Note that you can also avoid > branch management in Git: just stay on the mainline branch forever and merge > your commits back and forth with the upstream repository's mainline. While > it might appear simpler that way, you might as well call it less organized. Monticello supports branches. And merging between them is as easy as merging any other version of a package. And Monticello does support recording histories across branches. The two things that Monticello has over git are - that it is used without leaving the image. I’ve yet to see a git integration where at some stage one was forced to try and fix things in git, or that the image and the git repository got out of sync, or that if one tried to use more than one image against a git repository something horrible broke - that it can be extended using our own tools. Git is written in C and controlled by a separate community. One gives up great autonomy when allowing ones core VCS to be in a foreign system. When git crashes it crashes. It doesn’t raise a friendly debugger in which one can determine and fix and proceed from the bug, it segfaults, in optimized code, and you’re hosed. Personally I don’t want to work in that kind of world. The Pharo crowd do. I will do everything in my power to prevent Squeak going the same way. And if I’m unsuccessful I’ll go somewhere else. > > Chris Muller-3 wrote >> [...] requires >> them to sign up just to use -- I think it would be a "filter" on the >> community, especially of non-developers (hint: You and Jakob are >> developers). For me, being hosted by a private company is not so >> attractive. > > As Phil pointed out, you seem to confuse Git with GitHub here. But your > arguments are applicable if we take the integrated issue tracker into > account because that needs to be run by someone. In theory Squeak could host > an own GitLab Community Edition server instead of relying on GitHub. > > Note that you also have to sign up to use Mantis or participate on the > mailing list or the Slack channel. > > About the "filter": how many non-developers try to trace inbox contributions > or engage in code reviews? How many non-developers use Monticello (given > that it can only track packages and configuations thereof)? The "filter" > might not take anything interesting away from the other target audiences > after all. > > We do not wish to move all discussions from the list to pull requests. Also > the idea was to link up pull request conversations with the list, like the > CI job reports, or conversations on the OpenSmalltalk-VM repository to the > vm-dev list. > > > Chris Muller-3 wrote >> For example, you could submit an >> improvement that allows original contributors of Inbox items to move them >> to Treated themself. > > How? Only Trunk committers have access to the Squeaksource treating backend, > so neither the code nor the tool is available to normal users for > improvement. Guest users cannot even delete versions from the inbox > repository, can they? > > > Chris Muller-3 wrote >> You could add a button to filter out all entries in >> the Inbox which have further descendants also in the Inbox. You could >> make >> an, "update from Inbox" which would only download packages for which have >> your loaded versions as ancestors. > > I don't understand how these would help in the tracking of issues, can you > elaborate please? My understanding: The first shows you the tips of all > loose branches in the inbox, but still without a mapping to issues (which is > not necessarily a 1:1 mapping, with reinforced complexity because of the > drive towards a compact ancestry...). Combined with some client-side > extensions it might allow us to track branches locally, but not share them > explicitly. To find remote branches, you would have to download many of > these versions first because only then you can access their ancestry (you > don't know in advance which versions are the tips, and combined with the > redundancy among versions, this is a Monticello implementation flaw). The > second would allow an update if someone moved some of your own branches > forward. But it rarely happens nowadays. > > > Chris Muller-3 wrote >> There are many simple things that could >> be done. A bug-tracker is a bigger deal, but it's often a lot less >> overhead to just FIX the bug than open, track, and close a bug report. We >> do have Mantis to keep track of the longer-term bugs. > > I think this plays down the issue. It being a bigger deal is exactly why we > would like to use an existing platform. "Just FIX the bug" is not always so > straightforward that a single new version is sufficient. There might be > multiple iterations, or multiple packages affected, or many versions towards > a larger goal over an extended period of time. That's why we would like some > integrated issue tracking, even for short-term bugs. Think more of pull > requests with conversation and review facilities than of bug tickets. Pull > requests, combined with a system that can actually track branches or tasks, > allow for iterative refinement and feedback while binding all the iterations > or steps together. > > Mantis is not integrated with Monticello, is it? Also it doesn't look very > active. > > > Chris Muller-3 wrote >> We have *decades* of Monticello packages for Squeak across not just our >> own >> repositories, but many other "external" legacy repositories. [...] >> Monticello will continue >> to be used by some. > > In my opinion this is no argument against different tools because nobody > suggested to remove Monticello from Squeak. As we already see in practice, > Git tools and Monticello tools, as well as both kinds of repositories, can > co-exist. > > Otherwise we could still use floppy disks because there are decades of > software packages that were distributed on floppy disks, yet we don't. :-) > > > Chris Muller-3 wrote >> It seems clear that the only path to Git and other >> tools is a backward-compatible integration with existing tools > > Well, other paths have already been walked. ;-) But in which direction goes > this backwards- compatibility? Do you want be able to use newer tools also > on old repositories? Alright, that would be nice. Do you want to be able to > use newer repositories in old tools? Why, given that it will probably > restrict the newer repositories? > > > Chris Muller-3 wrote >> a "stepping >> stone" that doesn't require a major adjustment like losing method-level >> timestamp information. > > This seems to confound the use of Git with the use of the Tonel format with > a Pharo-style implementation. > > Otherwise it affirms what I wrote a few messages before: maybe we do have to > bite the bullet and write a proper MCGitRepository that molds Git-hosted > projects into the Monticello tools, even though we have already created > other tools. > > By the way, the draft spec of Tonel that Martin was offering to the list in > a recent thread demands that custom attributes on classes, methods, ... be > preserved by the system. So even if Squeak woulde use Tonel more often in > the future, it would not necessarily mean that method timestamps have to be > sacrificed. Squot and its Git tools are stored in the FileTree format, have > been Git-hosted from the start, include some packages whose Monticello > ancestries have been converted and integrated into the Git history, and has > method timestamps all over. > > > Chris Muller-3 wrote >> But it's not going to write itself. Only the >> burning interest within people like you and/or Jakob will get it done. :) > > Thank you for the encouragement. Unfortunately with regards to Monticello > tools it recurrently sounds like: "If you want contemporary features, you > must add them to the old tools because we do not want to adopt new tools > that can already do the job." Forgive me if this reads too polemic. > > Kind regards, > Jakob > > > > -- > Sent from: http://forum.world.st/Squeak-Dev-f45488.html > -------------- next part -------------- An HTML attachment was scrubbed... URL: From tonyg at leastfixedpoint.com Mon Oct 5 15:04:04 2020 From: tonyg at leastfixedpoint.com (Tony Garnock-Jones) Date: Mon, 5 Oct 2020 17:04:04 +0200 Subject: [squeak-dev] OnScreenKeyboardMorph :-) Message-ID: OnScreenKeyboardMorph -------------- next part -------------- An HTML attachment was scrubbed... URL: -------------- next part -------------- A non-text attachment was scrubbed... Name: PXL_20201005_130239618.jpg Type: image/jpeg Size: 79856 bytes Desc: not available URL: From herbertkoenig at gmx.net Mon Oct 5 15:09:53 2020 From: herbertkoenig at gmx.net (Herbert) Date: Mon, 5 Oct 2020 17:09:53 +0200 Subject: [squeak-dev] OnScreenKeyboardMorph :-) In-Reply-To: References: Message-ID: Coool!! How are right/middle click (panned to be) handled? Cheers, Herbert Am 05.10.20 um 17:04 schrieb Tony Garnock-Jones: > image snipped > -------------- next part -------------- An HTML attachment was scrubbed... URL: From marcel.taeumel at hpi.de Mon Oct 5 16:36:41 2020 From: marcel.taeumel at hpi.de (Marcel Taeumel) Date: Mon, 5 Oct 2020 18:36:41 +0200 Subject: [squeak-dev] OnScreenKeyboardMorph :-) In-Reply-To: References: Message-ID: Yeah! B-) Am 05.10.2020 17:04:20 schrieb Tony Garnock-Jones : [OnScreenKeyboardMorph] -------------- next part -------------- An HTML attachment was scrubbed... URL: -------------- next part -------------- A non-text attachment was scrubbed... Name: PXL_20201005_130239618.jpg Type: image/jpeg Size: 79856 bytes Desc: not available URL: From tonyg at leastfixedpoint.com Mon Oct 5 17:23:57 2020 From: tonyg at leastfixedpoint.com (Tony Garnock-Jones) Date: Mon, 5 Oct 2020 19:23:57 +0200 Subject: [squeak-dev] OnScreenKeyboardMorph :-) In-Reply-To: References: Message-ID: <1794d21d-3f1a-a1c5-48c9-2fea71bd6719@leastfixedpoint.com> I'm going to see if control-click and cmd-click (via virtual keyboard) will work out OK. If not (and perhaps in addition) I will experiment with something like in Vanessa's recently-reposted video from 2010, with a little "shift" key in a screen corner. Tony On 10/5/20 5:09 PM, Herbert wrote: > Coool!! How are right/middle click (panned to be) handled? > > Cheers, > > > Herbert > > Am 05.10.20 um 17:04 schrieb Tony Garnock-Jones: >> image snipped >> > > From rabbit at churchofthesacrifice.org Mon Oct 5 18:21:58 2020 From: rabbit at churchofthesacrifice.org (rabbit) Date: Mon, 05 Oct 2020 18:21:58 +0000 Subject: [squeak-dev] [OFF TOPIC} repeat after me Message-ID: <1de04eea-f23e-2d59-fb0c-df2da722c995@churchofthesacrifice.org> - One hen - Two ducks - Three squawking geese - Four limerick oysters - Five corpulent porpoises - Six pairs of Don Alverzo's tweezers - Seven thousand Macedonians in full battle array - Eight brass monkeys from the ancient sacred crypts of Egypt - Nine apathetic, sympathetic, diabetic old men on roller skates, with a marked propensity towards procrastination and sloth - Ten lyrical, spherical, diabolical denizens of the deep who all stall around the corner of the quo of the quay of the quivery, all at the same time. -------------- next part -------------- An HTML attachment was scrubbed... URL: From forums.jakob at resfarm.de Mon Oct 5 18:47:00 2020 From: forums.jakob at resfarm.de (Jakob Reschke) Date: Mon, 5 Oct 2020 13:47:00 -0500 (CDT) Subject: [squeak-dev] Development methodology (was: tedious programming-in-the-debugger error needs fixing) In-Reply-To: <025A3F5C-E26E-44C6-B19B-FBED361CE779@gmail.com> References: <23476c3e0a68492c8cc917c38ba2c9d4@student.hpi.uni-potsdam.de> <1601475775699-0.post@n4.nabble.com> <1601590406774-0.post@n4.nabble.com> <076817EE-1506-47F9-9AF4-3126C6D3BC76@rowledge.org> <1601860447473-0.post@n4.nabble.com> <025A3F5C-E26E-44C6-B19B-FBED361CE779@gmail.com> Message-ID: <1601923620443-0.post@n4.nabble.com> Hi Eliot, Eliot Miranda-2 wrote >> On Oct 4, 2020, at 6:14 PM, Jakob Reschke < > forums.jakob@ > > wrote: >> >> In other ways, Monticello just looks simpler because something is in fact >> missing. Consider branches: most Git tools have knobs to deal with them >> in >> various ways, while Monticello tools just deny to talk about branches. >> Monticello ancestry does support branching, yet I think Monticello lacks >> first-class objects for branches, with all the implications for >> repository >> handling. The tools might look simpler without branch management, but it >> is >> not a feature but rather the lack of one. Note that you can also avoid >> branch management in Git: just stay on the mainline branch forever and >> merge >> your commits back and forth with the upstream repository's mainline. >> While >> it might appear simpler that way, you might as well call it less >> organized. > > Monticello supports branches. And merging between them is as easy as > merging any other version of a package. And Monticello does support > recording histories across branches. That is what I wrote: Monticello ancestry does support branching. But there is no list of branches and there is no object for a branch. Instead one has to find the loose ends in a sea of versions. Chris's first tool suggestion would alleviate this, but it may be quite expensive and would still not give names to branches. Anyway, to have branches was not what Christoph and I were after. Topic tracking and integrated conversations it is. Eliot Miranda-2 wrote > The two things that Monticello has over git are > - that it is used without leaving the image. I’ve yet to see a git > integration where at some stage one was forced to try and fix things in > git, or that the image and the git repository got out of sync, or that if > one tried to use more than one image against a git repository something > horrible broke > - that it can be extended using our own tools. Git is written in C and > controlled by a separate community. One gives up great autonomy when > allowing ones core VCS to be in a foreign system. When git crashes it > crashes. It doesn’t raise a friendly debugger in which one can determine > and fix and proceed from the bug, it segfaults, in optimized code, and > you’re hosed. I can see your point. Although I cannot remember seeing Git crash for me in the last ten years. And we are in a serious lock-in if we extend this notion to everything in the world. I'm glad the other programming languages did not all have to implement their own VCS first, otherwise there would be even more of these around. Luckily, we already have a Git implementation in Smalltalk. Thank Tobias for urging me to salvage this rather than concentrating on FFI and libgit2 three years ago. The Git Browser tools are as Squeak as they can be for dealing with Smalltalk packages. Except maybe that the Git repository is still stored outside, but what is a commit worth if it gets trapped in an unsaved, unexpectedly broken image. Even if we didn't have this Smalltalk implementation, the canonical Git has lots of plumbing tools that could be controlled via OSProcess to query and manipulate repositories. It wouldn't crash the VM like errors in libgit2 might, at the cost of being much slower. Eliot Miranda-2 wrote > Personally I don’t want to work in that kind of world. The Pharo crowd > do. I will do everything in my power to prevent Squeak going the same > way. And if I’m unsuccessful I’ll go somewhere else. Understood. I don't wish to see you leave. Yet in my opinion Squeak really needs to get along with the outside world for the mutual benefit; we cannot afford to always reimplement everything in Smalltalk just to be able to comfortably debug the issues we wouldn't have if we had used something mature. Originally this thread was about the development process and how it can be improved. Sorry for drifting into the Squeak vs. the World discussion again. Some things just trouble me and make me sad. Kind regards, Jakob -- Sent from: http://forum.world.st/Squeak-Dev-f45488.html From forums.jakob at resfarm.de Mon Oct 5 19:18:46 2020 From: forums.jakob at resfarm.de (Jakob Reschke) Date: Mon, 5 Oct 2020 14:18:46 -0500 (CDT) Subject: [squeak-dev] Development methodology (was: tedious        programming-in-the-debugger error needs fixing) In-Reply-To: <174f8f5548b.e4c3e13b138475.8358330872058455280@zoho.com> References: <23476c3e0a68492c8cc917c38ba2c9d4@student.hpi.uni-potsdam.de> <1601475775699-0.post@n4.nabble.com> <1601590406774-0.post@n4.nabble.com> <076817EE-1506-47F9-9AF4-3126C6D3BC76@rowledge.org> <1601860447473-0.post@n4.nabble.com> <025A3F5C-E26E-44C6-B19B-FBED361CE779@gmail.com> <174f8f5548b.e4c3e13b138475.8358330872058455280@zoho.com> Message-ID: <1601925526567-0.post@n4.nabble.com> Squeak - Dev mailing list wrote > An enterprising dev implements the git server in squeak .... Sigh, if it were really necessary to satisfy the community... One could start from the FileSystem-Git package that ships with Squot and the Git Browser. At the heart Git is just a key-value (or rather sha1-to-object) store that contains blobs, trees, commits, and tags, plus a another key-value (string-to-string/sha1) store for the refs, so the server would even be free to choose how to persist the data. Still, I think there are enough Git servers and implementations out there already. We should not write our own. If we had the time to write a Git platform, we could instead write that integrated issue tracking platform for Monticello. The problem is already solved for Git. Squeak - Dev mailing list wrote > 1. any git client interacts just as with the c git. > 2. Behind the scenes, git uuid's are used but so are monticello "stuff" SHA-1 hashes, not UUIDs in Git, but yeah you could put anything behind the scenes as long as you can satisfy the interface. Squeak - Dev mailing list wrote > 3. Monticello interacts with the sqGit server seamlessly.( Handoff?) So either we have that true Git adapter for Monticello (then we would also not need our own server implementation), or the server has a Monticello frontend in front of the Git backend. Squeak - Dev mailing list wrote > 4. Bug happens...native squeak tools... Unless the bug is on the server. Then hidden native Squeak tools and broken connection... Squeak - Dev mailing list wrote > If i had time, I would do it as it sounds like a fun project. I do not > have time. ): Oh if only I had too much time... -- Sent from: http://forum.world.st/Squeak-Dev-f45488.html From forums.jakob at resfarm.de Mon Oct 5 19:29:48 2020 From: forums.jakob at resfarm.de (Jakob Reschke) Date: Mon, 5 Oct 2020 21:29:48 +0200 Subject: [squeak-dev] how to protocol removal In-Reply-To: <368a0251-44fd-77a8-2dd9-15a03fcbf6cd@churchofthesacrifice.org> References: <368a0251-44fd-77a8-2dd9-15a03fcbf6cd@churchofthesacrifice.org> Message-ID: Hi, What about a preamble script to remove the existing class or methods? Though it does not sound like a good idea to me if the interface is not compatible. It will probably break other stuff in the image. Kind regards, Jakob Am So., 4. Okt. 2020 um 19:41 Uhr schrieb rabbit : > > I have a package PromisesLocal which redefines a trunk class, Promise. > There is some old protocol from trunk Promise which remains as part of > the new definition and this is breaking tests (, > Promise>>#whenResolved:, Promise>>#whenBroken:). Is there a way with > Monticello or loading where I can remove this protocol? Or a better > question is how to best remove this protocol when loading a Monticello > package? > > K, r > > > From leves at caesar.elte.hu Mon Oct 5 19:51:13 2020 From: leves at caesar.elte.hu (Levente Uzonyi) Date: Mon, 5 Oct 2020 21:51:13 +0200 (CEST) Subject: [squeak-dev] The XML libraries run fine on Squeak 6 alpha In-Reply-To: References: Message-ID: -1 After a bit of analysis, I came to the conclusion that it would be a bad idea to include those packages in the Trunk. Why? 1. There are more important things than XML 2. These packages are huge 3. The code is not backwards compatible 4. It would introduce parallel collection hierarchies which would cause confusion 5. Some undeclared variables Details: 1. There are more important things than XML I think there's not much to say here. Among the serialization formats, JSON, YAML are far more popular than XML nowadays. Yet, we have neither supported in the Trunk (apart from a minimal hence incomplete JSON implementation in WebClient. It's really amazing how small it is though.) 2. These packages are huge The current version of the XML-Parser in Trunk has the following stats: classes: 26 methods: 379 linesOfCode: 2069 It's obviously incomplete though. The proposed packages have the following stats: classes: 758 (21.5% of all classes in the Trunk including the XML packages) methods: 10129 (14%) linesOfCode: 73897 (13.7%) That's 25x-35x more than the current implementation. When the packages are loaded in the current Trunk image, they take up 21.5%, 14%, 13.7% of all classes, methods, linesOfCode, respectively. One could say that the extensive tests are responsible for the bloat, but no, it's probably related to the complexity of XML. Without tests, the numbers are: classes: 512 (15.6%) methods: 6744 (9.8%) linesOfCode: 32886 (6.6%) I don't think XML is important enough in general to justify those numbers. 3. The code is not backwards compatible The code is not a drop-in replacement. The interface is different. Code using the current package would have to be migrated. 4. It would introduce parallel collection hierarchies which would cause confusion The code uses various collections similar to those in the Trunk but not compatible with them and not in the same class hierarchy: BitmapCharcterSet - An independent character set implementation. Not a subclass of CharacterSet. StandardOrderedDictioanry (and its 5 subclasses) - An alternative to OrderedDictionary implementation. A subclass of Collection, so not part of the HashedCollection hierarchy (for good reasons). If these were part of the Trunk, one could be wondering which one to use: OrderedDictionary or OrderPreservingDictionary? What's the difference? Maybe StandardOrderedDictionary? 5. Some undeclared variables The code is written with compatibility in mind, so it supports Pharo and Squeak. Even if you use Squeak, code related to Zinc, Pharo's HTTP library will still be loaded directly referencing Zinc's classes. Without going any deeper, I think the best would be to not include these packages in the Trunk. I'd go even further: I would remove the current XML-Parser as well but provide an easy way to load either version. That way the image would be smaller, simpler. If we had the CI infrastructure (we probably have, but I'm not sure), we could even test whether these packages work as expected, and treat them as official external packages. There's currently one method that depends on the XML-Parser package in Trunk: SugarLauncher >> #gconfPropertiesAt:. It uses the current XML-Parser API, so even if we decide to include the more complete XML implementation in Trunk, we will still have to change it to make it work. Levente On Mon, 5 Oct 2020, Eliot Miranda wrote: > Hi All, > > votes for & against inclusion of Monty’s XML in trunk/6 beta? > > +1 > > _,,,^..^,,,_ (phone) > >> On Oct 4, 2020, at 12:44 PM, monty wrote: >> >> Installing the (head)s of: >> XMLParser (which loads "XMLWriter" too) >> XMLParser-XPath (be careful not to install the old, unfinished "XPath" project) >> XMLParser-StAX >> XMLParser-HTML >> from the SqueakMap works fine; all the tests still pass. XMLParser installation still pops up a warning you have to click through b/c of a conflict with the old XMLParser in the image, but it's fine other than that. >> >> Supposedly there are conflicts with XStreams, but I have nothing to do with that. >> >> An aside: some tests are skipped by default because they rely on external resources, like the file system or HTTP, which makes it easier to distinguish real regressions from something like a network outage. The skipping is more obvious on Pharo because their TestCase has a #skip message that the TestRunner UI supports. On Squeak these tests just silently pass. To run them, send XMLSkippableTest #stopSkippingAll. Unfortunately b/c of the W3C rate limiting, the tests using xhtml DTDs timeout if you run them more than once. You could say they should be cached (the default resolver does just that), but the purpose of these tests is to test real HTTP retrieval, so that defeats the purpose. >> ___ >> montyos.wordpress.com >> >> From rabbit at churchofthesacrifice.org Mon Oct 5 20:03:09 2020 From: rabbit at churchofthesacrifice.org (rabbit) Date: Mon, 05 Oct 2020 20:03:09 +0000 Subject: [squeak-dev] how to protocol removal In-Reply-To: References: <368a0251-44fd-77a8-2dd9-15a03fcbf6cd@churchofthesacrifice.org> Message-ID: Hi Jakob, Thanks for the info! How could I define such a preamble in Monticello? I ended up redefining the methods to call the super impl and pass the tests. So these methods are present in the package I published. I modified the PromiseTest in KernelTests-Processes to add small delay to allow for async completions. The only changes in semantics are that when a second attempt for a resolution, of a previously resolved promise, I throw a PromiseAlreadyResolved exception. When an arbitrary rejection value is used I wrap it in a BrokenPromiseValue excption. These are the only two classes & exceptions I added to the trunk impl. PromisesLocal pass those tests when it is loaded. K, r On 10/5/20 3:29 PM, Jakob Reschke wrote: > Hi, > > What about a preamble script to remove the existing class or methods? > > Though it does not sound like a good idea to me if the interface is > not compatible. It will probably break other stuff in the image. > > Kind regards, > Jakob > > Am So., 4. Okt. 2020 um 19:41 Uhr schrieb rabbit > : >> I have a package PromisesLocal which redefines a trunk class, Promise. >> There is some old protocol from trunk Promise which remains as part of >> the new definition and this is breaking tests (, >> Promise>>#whenResolved:, Promise>>#whenBroken:). Is there a way with >> Monticello or loading where I can remove this protocol? Or a better >> question is how to best remove this protocol when loading a Monticello >> package? >> >> K, r >> >> >> From forums.jakob at resfarm.de Mon Oct 5 20:23:13 2020 From: forums.jakob at resfarm.de (Jakob Reschke) Date: Mon, 5 Oct 2020 22:23:13 +0200 Subject: [squeak-dev] how to protocol removal In-Reply-To: References: <368a0251-44fd-77a8-2dd9-15a03fcbf6cd@churchofthesacrifice.org> Message-ID: You can access the scripts in the Monticello browser by selecting the package and clicking the Scripts button in the bar. Am Mo., 5. Okt. 2020 um 22:03 Uhr schrieb rabbit : > > Hi Jakob, > > Thanks for the info! How could I define such a preamble in Monticello? I > ended up redefining the methods to call the super impl and pass the > tests. So these methods are present in the package I published. > > I modified the PromiseTest in KernelTests-Processes to add small delay > to allow for async completions. The only changes in semantics are that > when a second attempt for a resolution, of a previously resolved > promise, I throw a PromiseAlreadyResolved exception. When an arbitrary > rejection value is used I wrap it in a BrokenPromiseValue excption. > These are the only two classes & exceptions I added to the trunk impl. > > PromisesLocal pass those tests when it is loaded. > > K, r > > On 10/5/20 3:29 PM, Jakob Reschke wrote: > > Hi, > > > > What about a preamble script to remove the existing class or methods? > > > > Though it does not sound like a good idea to me if the interface is > > not compatible. It will probably break other stuff in the image. > > > > Kind regards, > > Jakob > > > > Am So., 4. Okt. 2020 um 19:41 Uhr schrieb rabbit > > : > >> I have a package PromisesLocal which redefines a trunk class, Promise. > >> There is some old protocol from trunk Promise which remains as part of > >> the new definition and this is breaking tests (, > >> Promise>>#whenResolved:, Promise>>#whenBroken:). Is there a way with > >> Monticello or loading where I can remove this protocol? Or a better > >> question is how to best remove this protocol when loading a Monticello > >> package? > >> > >> K, r > >> > >> > >> > From rabbit at churchofthesacrifice.org Mon Oct 5 22:09:48 2020 From: rabbit at churchofthesacrifice.org (rabbit) Date: Mon, 05 Oct 2020 22:09:48 +0000 Subject: [squeak-dev] how to protocol removal In-Reply-To: References: <368a0251-44fd-77a8-2dd9-15a03fcbf6cd@churchofthesacrifice.org> Message-ID: <7f62203c-cb6b-2339-14f6-6506853c2411@churchofthesacrifice.org> Great! Thanks! The first time I have 'seen' that button. On 10/5/20 4:23 PM, Jakob Reschke wrote: > You can access the scripts in the Monticello browser by selecting the > package and clicking the Scripts button in the bar. > > Am Mo., 5. Okt. 2020 um 22:03 Uhr schrieb rabbit > : >> Hi Jakob, >> >> Thanks for the info! How could I define such a preamble in Monticello? I >> ended up redefining the methods to call the super impl and pass the >> tests. So these methods are present in the package I published. >> >> I modified the PromiseTest in KernelTests-Processes to add small delay >> to allow for async completions. The only changes in semantics are that >> when a second attempt for a resolution, of a previously resolved >> promise, I throw a PromiseAlreadyResolved exception. When an arbitrary >> rejection value is used I wrap it in a BrokenPromiseValue excption. >> These are the only two classes & exceptions I added to the trunk impl. >> >> PromisesLocal pass those tests when it is loaded. >> >> K, r >> >> On 10/5/20 3:29 PM, Jakob Reschke wrote: >>> Hi, >>> >>> What about a preamble script to remove the existing class or methods? >>> >>> Though it does not sound like a good idea to me if the interface is >>> not compatible. It will probably break other stuff in the image. >>> >>> Kind regards, >>> Jakob >>> >>> Am So., 4. Okt. 2020 um 19:41 Uhr schrieb rabbit >>> : >>>> I have a package PromisesLocal which redefines a trunk class, Promise. >>>> There is some old protocol from trunk Promise which remains as part of >>>> the new definition and this is breaking tests (, >>>> Promise>>#whenResolved:, Promise>>#whenBroken:). Is there a way with >>>> Monticello or loading where I can remove this protocol? Or a better >>>> question is how to best remove this protocol when loading a Monticello >>>> package? >>>> >>>> K, r >>>> >>>> >>>> From monty2 at programmer.net Tue Oct 6 00:01:41 2020 From: monty2 at programmer.net (monty) Date: Tue, 6 Oct 2020 02:01:41 +0200 Subject: [squeak-dev] The XML libraries run fine on Squeak 6 alpha In-Reply-To: References: Message-ID: I believe I suggested the same thing you did (just removing the old parser from the image, which would remove the warning during SM installation). The undeclared global var refs to Zinc classes were mistakenly left in during development (done on Pharo), and will be made indirect like other Zn class refs. (The offending methods are in classes that aren't used unless Zinc is installed, which is why they don't cause any Squeak test failures.) ___ montyos.wordpress.com From vanessa at codefrau.net Tue Oct 6 01:14:42 2020 From: vanessa at codefrau.net (Vanessa Freudenberg) Date: Mon, 5 Oct 2020 18:14:42 -0700 Subject: [squeak-dev] [OFF TOPIC} repeat after me In-Reply-To: <1de04eea-f23e-2d59-fb0c-df2da722c995@churchofthesacrifice.org> References: <1de04eea-f23e-2d59-fb0c-df2da722c995@churchofthesacrifice.org> Message-ID: Please, don't. Vanessa On Mon, Oct 5, 2020 at 11:22 AM rabbit wrote: > > - One hen > - Two ducks > - Three squawking geese > - Four limerick oysters > - Five corpulent porpoises > - Six pairs of Don Alverzo's tweezers > - Seven thousand Macedonians in full battle array > - Eight brass monkeys from the ancient sacred crypts of Egypt > - Nine apathetic, sympathetic, diabetic old men on roller skates, with > a marked propensity towards procrastination and sloth > - Ten lyrical, spherical, diabolical denizens of the deep who all > stall around the corner of the quo of the quay of the quivery, all at the > same time. > > > -------------- next part -------------- An HTML attachment was scrubbed... URL: From rabbit at churchofthesacrifice.org Tue Oct 6 01:18:59 2020 From: rabbit at churchofthesacrifice.org (rabbit) Date: Tue, 06 Oct 2020 01:18:59 +0000 Subject: [squeak-dev] [OFF TOPIC} repeat after me In-Reply-To: References: <1de04eea-f23e-2d59-fb0c-df2da722c995@churchofthesacrifice.org> Message-ID: Alright, I wont. Excuse me. This is the so-called Announcer's test. On 10/5/20 9:14 PM, Vanessa Freudenberg wrote: > Please, don't. > > Vanessa > > On Mon, Oct 5, 2020 at 11:22 AM rabbit wrote: > >> - One hen >> - Two ducks >> - Three squawking geese >> - Four limerick oysters >> - Five corpulent porpoises >> - Six pairs of Don Alverzo's tweezers >> - Seven thousand Macedonians in full battle array >> - Eight brass monkeys from the ancient sacred crypts of Egypt >> - Nine apathetic, sympathetic, diabetic old men on roller skates, with a marked propensity towards procrastination and sloth >> - Ten lyrical, spherical, diabolical denizens of the deep who all stall around the corner of the quo of the quay of the quivery, all at the same time. -------------- next part -------------- An HTML attachment was scrubbed... URL: From vanessa at codefrau.net Tue Oct 6 01:20:21 2020 From: vanessa at codefrau.net (Vanessa Freudenberg) Date: Mon, 5 Oct 2020 18:20:21 -0700 Subject: [squeak-dev] OnScreenKeyboardMorph :-) In-Reply-To: <1794d21d-3f1a-a1c5-48c9-2fea71bd6719@leastfixedpoint.com> References: <1794d21d-3f1a-a1c5-48c9-2fea71bd6719@leastfixedpoint.com> Message-ID: Looks cool! For phone-sized screens you probably want one-handed operations. I'd imagine tapping e.g. alt would cause the next tap to have the "alt" modifier bit set. So if tapping a key after alt, it would be alt-key, but when tapping outside the keyboard after tapping alt, it would be interpreted as blue-click. Vanessa On Mon, Oct 5, 2020 at 10:24 AM Tony Garnock-Jones < tonyg at leastfixedpoint.com> wrote: > I'm going to see if control-click and cmd-click (via virtual keyboard) > will work out OK. If not (and perhaps in addition) I will experiment > with something like in Vanessa's recently-reposted video from 2010, with > a little "shift" key in a screen corner. > > Tony > > > On 10/5/20 5:09 PM, Herbert wrote: > > Coool!! How are right/middle click (panned to be) handled? > > > > Cheers, > > > > > > Herbert > > > > Am 05.10.20 um 17:04 schrieb Tony Garnock-Jones: > >> image snipped > >> > > > > > > -------------- next part -------------- An HTML attachment was scrubbed... URL: From commits at source.squeak.org Tue Oct 6 05:19:38 2020 From: commits at source.squeak.org (commits at source.squeak.org) Date: Tue, 6 Oct 2020 05:19:38 0000 Subject: [squeak-dev] The Trunk: Chronology-Core-eem.61.mcz Message-ID: Eliot Miranda uploaded a new version of Chronology-Core to project The Trunk: http://source.squeak.org/trunk/Chronology-Core-eem.61.mcz ==================== Summary ==================== Name: Chronology-Core-eem.61 Author: eem Time: 5 October 2020, 10:19:35.996376 pm UUID: 13de44be-afb9-4f0f-81b1-5f3f8fa821db Ancestors: Chronology-Core-dtl.60 Provide Time class>>millisecondClock and DateAndTime class>>millisecondClock to indicate that this is now a proiper clock. It will not roll-over after 45 days like the old 30 bit millisecond clock. Nw code should use millisecondClock, not millisecondClockValue, and old code (senders of millisecondClockValue) should be migrated whenever convenient. =============== Diff against Chronology-Core-dtl.60 =============== Item was added: + ----- Method: DateAndTime class>>millisecondClock (in category 'smalltalk-80') ----- + millisecondClock + + ^self clock millisecondClock! Item was added: + ----- Method: Time class>>millisecondClock (in category 'general inquiries') ----- + millisecondClock + "Answer the value of the millisecond clock. Unlike older implementatins, this is a clock; it will never roll-over." + + ^self utcMicrosecondClock // 1000! From eliot.miranda at gmail.com Tue Oct 6 06:08:02 2020 From: eliot.miranda at gmail.com (Eliot Miranda) Date: Mon, 5 Oct 2020 23:08:02 -0700 Subject: [squeak-dev] Development methodology (was: tedious        programming-in-the-debugger error needs fixing) In-Reply-To: <1601925526567-0.post@n4.nabble.com> References: <23476c3e0a68492c8cc917c38ba2c9d4@student.hpi.uni-potsdam.de> <1601475775699-0.post@n4.nabble.com> <1601590406774-0.post@n4.nabble.com> <076817EE-1506-47F9-9AF4-3126C6D3BC76@rowledge.org> <1601860447473-0.post@n4.nabble.com> <025A3F5C-E26E-44C6-B19B-FBED361CE779@gmail.com> <174f8f5548b.e4c3e13b138475.8358330872058455280@zoho.com> <1601925526567-0.post@n4.nabble.com> Message-ID: Hi Jakob, On Mon, Oct 5, 2020 at 12:18 PM Jakob Reschke wrote: > Squeak - Dev mailing list wrote > > An enterprising dev implements the git server in squeak .... > > Sigh, if it were really necessary to satisfy the community... One could > start from the FileSystem-Git package that ships with Squot and the Git > Browser. At the heart Git is just a key-value (or rather sha1-to-object) > store that contains blobs, trees, commits, and tags, plus a another > key-value (string-to-string/sha1) store for the refs, so the server would > even be free to choose how to persist the data. > > Still, I think there are enough Git servers and implementations out there > already. We should not write our own. > > If we had the time to write a Git platform, we could instead write that > integrated issue tracking platform for Monticello. The problem is already > solved for Git. > > > Squeak - Dev mailing list wrote > > 1. any git client interacts just as with the c git. > > 2. Behind the scenes, git uuid's are used but so are monticello "stuff" > > SHA-1 hashes, not UUIDs in Git, but yeah you could put anything behind the > scenes as long as you can satisfy the interface. > > > Squeak - Dev mailing list wrote > > 3. Monticello interacts with the sqGit server seamlessly.( Handoff?) > > So either we have that true Git adapter for Monticello (then we would also > not need our own server implementation), or the server has a Monticello > frontend in front of the Git backend. > If you were architecting this on a tight budget, which would you choose and why? If you were architecting this with an unlimited budget, what would you choose and why? > > > Squeak - Dev mailing list wrote > > 4. Bug happens...native squeak tools... > > Unless the bug is on the server. Then hidden native Squeak tools and broken > connection... > Right. But we suffer that with Monticello too. However, Git, like Monticello, has the advantage that one can work locally without uploading, unlike, say, Subversion, which (IIRC) can only do remote commits. > > > Squeak - Dev mailing list wrote > > If i had time, I would do it as it sounds like a fun project. I do not > > have time. ): > > Oh if only I had too much time... > Amen. But there is a corollary I can attest to. I've been able to work on Cog since 2008, 12 years already. That's as long as I worked on VisualWorks, and there's no sign that I'll have to stop working on opensmalltak-vm (Cog), Squeak or Terf any time soon. I had the architectural idea for Sista back in 2003, and had to ait for Clément's arrival to see it realised. This is to say that it is really important not to allow your ambition to be limited by your perceptio of how much time you have. Likely, if you're committed and passionate and lucky, you will have much more time than you imagine. Patience *is* a virtue, along with stubborn doggedness. > -- > Sent from: http://forum.world.st/Squeak-Dev-f45488.html > _,,,^..^,,,_ best, Eliot -------------- next part -------------- An HTML attachment was scrubbed... URL: From nicolas.cellier.aka.nice at gmail.com Tue Oct 6 06:32:43 2020 From: nicolas.cellier.aka.nice at gmail.com (Nicolas Cellier) Date: Tue, 6 Oct 2020 08:32:43 +0200 Subject: [squeak-dev] The Trunk: Chronology-Core-eem.61.mcz In-Reply-To: References: Message-ID: Le mar. 6 oct. 2020 à 07:19, a écrit : > Eliot Miranda uploaded a new version of Chronology-Core to project The > Trunk: > http://source.squeak.org/trunk/Chronology-Core-eem.61.mcz > > ==================== Summary ==================== > > Name: Chronology-Core-eem.61 > Author: eem > Time: 5 October 2020, 10:19:35.996376 pm > UUID: 13de44be-afb9-4f0f-81b1-5f3f8fa821db > Ancestors: Chronology-Core-dtl.60 > > Provide Time class>>millisecondClock and DateAndTime > class>>millisecondClock to indicate that this is now a proiper clock. It > will not roll-over after 45 days like the old 30 bit millisecond clock. > > Nw code should use millisecondClock, not millisecondClockValue, and old > code (senders of millisecondClockValue) should be migrated whenever > convenient. > > =============== Diff against Chronology-Core-dtl.60 =============== > > Item was added: > + ----- Method: DateAndTime class>>millisecondClock (in category > 'smalltalk-80') ----- > + millisecondClock > + > + ^self clock millisecondClock! > > Item was added: > + ----- Method: Time class>>millisecondClock (in category 'general > inquiries') ----- > + millisecondClock > + "Answer the value of the millisecond clock. Unlike older > implementatins, this is a clock; it will never roll-over." > +1 Oh, but didn't traditional clock use to rollover every 12 hours or so ? ;) + > + ^self utcMicrosecondClock // 1000! > > > -------------- next part -------------- An HTML attachment was scrubbed... URL: From marcel.taeumel at hpi.de Tue Oct 6 07:22:14 2020 From: marcel.taeumel at hpi.de (Marcel Taeumel) Date: Tue, 6 Oct 2020 09:22:14 +0200 Subject: [squeak-dev] The XML libraries run fine on Squeak 6 alpha In-Reply-To: References: Message-ID: Hi Levente, thanks for this review. The points (4), (3), and (2) are very serious. There needs to be a lot of work done before this can be treated as a valuable addition to Trunk's XML implementation. Especially backwards compatibility must be considered. I am -1 then. Sorry for not taking a look at the code before. I would still like to see improvements happen in the Trunk's XML implementation. Best, Marcel Am 05.10.2020 21:53:34 schrieb Levente Uzonyi : -1 After a bit of analysis, I came to the conclusion that it would be a bad idea to include those packages in the Trunk. Why? 1. There are more important things than XML 2. These packages are huge 3. The code is not backwards compatible 4. It would introduce parallel collection hierarchies which would cause confusion 5. Some undeclared variables Details: 1. There are more important things than XML I think there's not much to say here. Among the serialization formats, JSON, YAML are far more popular than XML nowadays. Yet, we have neither supported in the Trunk (apart from a minimal hence incomplete JSON implementation in WebClient. It's really amazing how small it is though.) 2. These packages are huge The current version of the XML-Parser in Trunk has the following stats: classes: 26 methods: 379 linesOfCode: 2069 It's obviously incomplete though. The proposed packages have the following stats: classes: 758 (21.5% of all classes in the Trunk including the XML packages) methods: 10129 (14%) linesOfCode: 73897 (13.7%) That's 25x-35x more than the current implementation. When the packages are loaded in the current Trunk image, they take up 21.5%, 14%, 13.7% of all classes, methods, linesOfCode, respectively. One could say that the extensive tests are responsible for the bloat, but no, it's probably related to the complexity of XML. Without tests, the numbers are: classes: 512 (15.6%) methods: 6744 (9.8%) linesOfCode: 32886 (6.6%) I don't think XML is important enough in general to justify those numbers. 3. The code is not backwards compatible The code is not a drop-in replacement. The interface is different. Code using the current package would have to be migrated. 4. It would introduce parallel collection hierarchies which would cause confusion The code uses various collections similar to those in the Trunk but not compatible with them and not in the same class hierarchy: BitmapCharcterSet - An independent character set implementation. Not a subclass of CharacterSet. StandardOrderedDictioanry (and its 5 subclasses) - An alternative to OrderedDictionary implementation. A subclass of Collection, so not part of the HashedCollection hierarchy (for good reasons). If these were part of the Trunk, one could be wondering which one to use: OrderedDictionary or OrderPreservingDictionary? What's the difference? Maybe StandardOrderedDictionary? 5. Some undeclared variables The code is written with compatibility in mind, so it supports Pharo and Squeak. Even if you use Squeak, code related to Zinc, Pharo's HTTP library will still be loaded directly referencing Zinc's classes. Without going any deeper, I think the best would be to not include these packages in the Trunk. I'd go even further: I would remove the current XML-Parser as well but provide an easy way to load either version. That way the image would be smaller, simpler. If we had the CI infrastructure (we probably have, but I'm not sure), we could even test whether these packages work as expected, and treat them as official external packages. There's currently one method that depends on the XML-Parser package in Trunk: SugarLauncher >> #gconfPropertiesAt:. It uses the current XML-Parser API, so even if we decide to include the more complete XML implementation in Trunk, we will still have to change it to make it work. Levente On Mon, 5 Oct 2020, Eliot Miranda wrote: > Hi All, > > votes for & against inclusion of Monty’s XML in trunk/6 beta? > > +1 > > _,,,^..^,,,_ (phone) > >> On Oct 4, 2020, at 12:44 PM, monty wrote: >> >> Installing the (head)s of: >> XMLParser (which loads "XMLWriter" too) >> XMLParser-XPath (be careful not to install the old, unfinished "XPath" project) >> XMLParser-StAX >> XMLParser-HTML >> from the SqueakMap works fine; all the tests still pass. XMLParser installation still pops up a warning you have to click through b/c of a conflict with the old XMLParser in the image, but it's fine other than that. >> >> Supposedly there are conflicts with XStreams, but I have nothing to do with that. >> >> An aside: some tests are skipped by default because they rely on external resources, like the file system or HTTP, which makes it easier to distinguish real regressions from something like a network outage. The skipping is more obvious on Pharo because their TestCase has a #skip message that the TestRunner UI supports. On Squeak these tests just silently pass. To run them, send XMLSkippableTest #stopSkippingAll. Unfortunately b/c of the W3C rate limiting, the tests using xhtml DTDs timeout if you run them more than once. You could say they should be cached (the default resolver does just that), but the purpose of these tests is to test real HTTP retrieval, so that defeats the purpose. >> ___ >> montyos.wordpress.com >> >> -------------- next part -------------- An HTML attachment was scrubbed... URL: From Christoph.Thiede at student.hpi.uni-potsdam.de Tue Oct 6 08:20:01 2020 From: Christoph.Thiede at student.hpi.uni-potsdam.de (Thiede, Christoph) Date: Tue, 6 Oct 2020 08:20:01 +0000 Subject: [squeak-dev] The Trunk: Tools-eem.994.mcz In-Reply-To: <00CF2F63-0F85-4E0C-A4AE-8EE9B5644A18@gmail.com> References: <3c98ed3f0efa473b8e9fc19ec9633928@student.hpi.uni-potsdam.de>, <00CF2F63-0F85-4E0C-A4AE-8EE9B5644A18@gmail.com> Message-ID: <3b1c779f588c444088e997a6c267a183@student.hpi.uni-potsdam.de> Hi Eliot, sorry for the late reply, and sorry for the private message, I just hit "Reply all" ... We're back on list now. :-) Your answer contains many important insights! > Does my perspective make sense or does it feel wrong to you? I see you want to make the debugger robust and minimal. Still, I have the feeling that we would need to reinvent a piece of the whole if styled the fields manually. Wouldn't this raise the complexity again and open the doors way to new bugs? And yes, I admit that I ran a number of times into undebuggable situations because the Decompiler was broken for the method I tried to debug, which is an undesired behavior, of course. But a) in this option I'd be fine to turn off a preference and b) we can just wrap the calls to the styler from the Inspector into an #ifError: block if we want to. Would such an approach satisfy your criteria of robustness? :-) > > If you debug code in a collection, you will see a collection inspector ... if you debug code in a Morph, you will see a MorphInspector etc. ... See the whole inspector hierarchy and implementors of #inspectorClass. I have the impression that optimizing this on the level you are proposing would be a quite excessive optimization. :-) > > Hmm, I see. This is a major change in semantics, and IMO in general not a good one. Inside a method one is seeing the raw representation of an object. The receiver inspector used to present the view that accorded with the method, showing inside the object. I can u set stand why one might want the external view but at the very least this should be a preference. Ideally one would be able to toggle the preference on an individual debugger. But, for example, if I’m debugging some internals in Dictionary et al I *need* to see that internal state in the debugger. > > Note that if I want to see the external state I can always spawn a normal inspector on self. I can’t do the opposite easily; I have to send basicInspect. Well, I never considered that argument, but it's a justified one, of course. I took advantage of the "arbitrary" receiver inspectors a number of times, e. g. when debugging through a morph tree and identifying the morphs quickly by selecting the screenshot field. For some cases, I'd even wish to nest inspectors or embed explorers into the debugger; but yes, all of this can slow down or destabilize the debugging experience ... So maybe we are searching something like a "BasicDebugger"? Should this become an extra concept or would this be misleading? The simplest solution I could imagine would be a new toggle switch in the debugger's window menu (at the right top corner), something like " basic mode". If enabled, we could use a regular inspector instead of an arbitrary (that's literally one selector we have to exchange), and if you think it would be helpful, we could also turn off styling in this case. However, I believe the latter should rather be an automatic fallback via #ifError:. Alternatively, this switch could also go into the inspector's field list menu as well, maybe this would be even more straightforward? Everyone might feel free to send proposals of any degree; if nothing happens, I will try to plan this for somewhen this month. @Marcel: > Hmmm... one could add some kind cache shared between all "inspector fields" in an inspector. Why not cache the styling results directly in the styler? Best, Christoph ________________________________ Von: Eliot Miranda Gesendet: Samstag, 3. Oktober 2020 01:46:01 An: Thiede, Christoph Betreff: Re: [squeak-dev] The Trunk: Tools-eem.994.mcz Hi Christoph, On Oct 2, 2020, at 3:32 PM, Thiede, Christoph wrote:  Hi Eliot, as proposed on the list, wouldn't it be enough to cache the styled field titles if the unstyled field titles didn't change? Or would it be helpful to implement a general cache for every text passed to shout directly in the styler class? The thing about caching is that it’s slow for the first click. And in general this highlighting could be so much simpler if this unnecessary parsing is avoided. But it’s your code. Why do you not want to discuss on list? Here’s a thing to think about with debuggers, and if you look at Pharo you’ll find they’ve strayed too far the wrong way. In a reflective system such as Smalltalk there is a tension between having a rich debugger experience and having a reliable debugger. The richer the debugger’s functionality the greater the surface over which bugs can affect and break the debugger. The same goes for the compiler. It used to be that the compiler used only whileTrue: rather than both whileTrue: & whileFalse: (IIRC) to avoid the compiler depending on a particular kind of branch (long branch on false perhaps? There was an asymmetry in the blue book bytecode set’s long jump bytecodes, there was only a long branch false, and so by using one kind of loop this byte code wasn’t needed by the compiler. You get the idea. And of course that’s why there is an emergency evaluator, because historically people broke debugging or opening a debugger (halts in Croquet’s teatime protocol come in via the emergency evaluator in our work with Terf at the moment :-) :-/ :-O ). So if it is possible to avoid parsing at all I would go that route because, even if the code wasn’t initially as elegant (because I’d need new shout support code and an interconnection with the ContextInspector to make it read well) I’d go that route because I’d want the debugger to be as minimal as possible. And yes, we’re using shout to style the method text itself. But that screams to me: why aren’t we using a publish/subscribe scheme to allow the styled method to be pushed to the inspectors in the debugger do they can reuse its result? The thing to think about fundamentally is that the debugger is a core piece of system engineering. You’ve made it much better, but because of the importance of the tool, it’s incumbent upon you to engineer it as well as possible and not just leave it as elegant as possible. You’ve got to also make it as robust and minimal as possible. You will thank yourself for the extra effort at some time in the future. And the Pharo experience? A debugger that jams up mysteriously. Inspectors that retain objects, causing garbage to accumulate, even after the inspectors have been closed. These are evils to be banished with as much effort as you can muster. Does my perspective make sense or does it feel wrong to you? Apart from that, to answer your questions: As a rule of thumb, every field title should be styled exactly as if it would be typed into the evaluate/field pane - with the exception of derived fields as you mentioned, see InspectorField >> #emphasizeName. So: > - is field name emphasis expected to respond to shadowing by temp vars or not? Yes. > - what categories of field name occur in the debugger’s receiver inspector This is a "regular", i.e. arbitrary inspector again, only. If you debug code in a collection, you will see a collection inspector ... if you debug code in a Morph, you will see a MorphInspector etc. ... See the whole inspector hierarchy and implementors of #inspectorClass. I have the impression that optimizing this on the level you are proposing would be a quite excessive optimization. :-) Hmm, I see. This is a major change in semantics, and IMO in general not a good one. Inside a method one is seeing the raw representation of an object. The receiver inspector used to present the view that accorded with the method, showing inside the object. I can u set stand why one might want the external view but at the very least this should be a preference. Ideally one would be able to toggle the preference on an individual debugger. But, for example, if I’m debugging some internals in Dictionary et al I *need* to see that internal state in the debugger. Note that if I want to see the external state I can always spawn a normal inspector on self. I can’t do the opposite easily; I have to send basicInspect. Now, if your intent is that the emphasizing of the field names reflects their emphasis in code that’s another strong argument for showing in the inspector the internal inst var names and not synthetic fields as presented by a higher level inspector. You might experiment with a check box in the debugger control bar or just above or below the receiver inspector to allow toggling between basic and higher level inspectors. Please note that, for the long term, I also had in mind to fix the limitations of LazyListMorph which currently only respects the attributes of the first character of an item, and then to style custom field titles according to their code expressions. At least in this scenario, we would need to do a full Shout run indeed for the relevant fields. Best, Christoph ________________________________ Von: Eliot Miranda Gesendet: Samstag, 3. Oktober 2020 00:08:58 An: Thiede, Christoph Betreff: Re: [squeak-dev] The Trunk: Tools-eem.994.mcz Hi Christoph, Hi Marcel, On Oct 2, 2020, at 2:18 PM, Thiede, Christoph wrote:  Hi Eliot, thanks for the exact steps to reproduce. I will use [1000 timesRepeat: [self performAction]] timeProfile because I don't have the AndreasSystemProfiler. Does ShoutCore-ct.78 from the inbox help you to speed things up? For me, it speeds up the call from 3.84 sec down to 1.07 sec - but still, there happens a lot of redundant shout styling. Hm, why can't we recreate the fields lazily in #fields instead of doing this eagerly in #resetFields? This is how I originally implemented it but then Marcel changed it - I don't know the reason. :-) Well, what I want to know are what are the semantics? What I mean is that AFAIA, in an Inspector the only kinds of field names we have are: - the pseudo variable self - instance variable names - integer indices (indexed inst vars) - literal and object print strings (the keys in dictionary) - some derived field name (such as ‘hex’ or ‘octal’ in an Integer inspector) But in the basic object inspector in the debugger we only have the first three (I think; this is my preconception). But Marcel, you may have something richer in mind which I may be missing. Now, let’s assume for the moment that I’m right, then the only decisions to be made in styling the inst vars are a) is the field name the pseudo variable self? => style as a pseudo variable b) is it a variable name => check if it is shadowed by a temp var (which we can find out much more directly *and* correctly by asking the ContextInspector, more accurately because the ContextInspector knows which temps are in scope at the current instance) - if if is shadowed emphasize it red - if it is not shadowed emphasize it as an inst var c) if it is an integer emphasize it at a literal integer So to do this we don’t have to parse the method at all. We only have to query Shout to find out what its emphases for particular categories are. So if we have a better definition if the semantics (answering questions like - is field name emphasis expected to respond to shadowing by temp vars or not? (I swear if autocorrect renamed var to car one more time I will scream) - what categories of field name occur in the debugger’s receiver inspector) then I could optimize. But I didn’t because I didn’t know what was going on and was afraid to break something. Best, Christoph ________________________________ Von: Eliot Miranda Gesendet: Freitag, 2. Oktober 2020 22:59:04 An: The general-purpose Squeak developers list; Taeumel, Marcel; Thiede, Christoph Cc: packages at lists.squeakfoundation.org Betreff: Re: [squeak-dev] The Trunk: Tools-eem.994.mcz Hi Marcel, Hi Christoph, I emailed the list and cc'ed you to get your attention. Forgive my rude interruption. I finally found out where the slow down really is. It is in Inspector>>fieldList "Return a list of texts that identify the fields for the object under inspection so that the user can make an informed decision on what to inspect." ^ self fieldListStyler ifNil: [self fields collect: [:field | field name]] ifNotNil: [:styler | self updateStyler: styler. self fields collect: [:field | field shouldStyleName ifTrue: [styler styledTextFor: field name asText] ifFalse: [field name]]] So this runs a styler over the entire method every time one steps. And if one is stepping through a doit it will call the decompiler to generate the source to style, every time you step. We have to do better :-) Here's how to profile it. Debug a doit. I wrote this one: | t | t := 0. [| a b c | a := 1. b := 2. c := 100. (a = 1 and: [b = 2 and: [c = 100]]) ifTrue: [1 to: 100 by: 2 do: [:i| t := t + 1]] ifFalse: [a to: c by: b do: [:i| t := t + 1]]] repeat. t Once in the debugger inspect the "Over" button. Then in that inspector evaluate AndreasSystemProfiler spyOn: [1000 timesRepeat: [self performAction]] and you'll see that essentially all the time is going into SHTextStylerST80(SHTextStyler) styledTextFor: On Fri, Oct 2, 2020 at 1:44 PM > wrote: Eliot Miranda uploaded a new version of Tools to project The Trunk: http://source.squeak.org/trunk/Tools-eem.994.mcz ==================== Summary ==================== Name: Tools-eem.994 Author: eem Time: 2 October 2020, 1:44:29.015648 pm UUID: 23145257-280d-4a4a-a4ba-3b5cc367f9a9 Ancestors: Tools-eem.993 Oops! Compiledmethod>>blockExtentsToTempsMap needs to observe that startKeysToBlockExtents has moved to DebuggerMethodMap. =============== Diff against Tools-eem.993 =============== Item was changed: ----- Method: CompiledMethod>>blockExtentsToTempsMap (in category '*Tools-Debugger-support') ----- blockExtentsToTempsMap "If the receiver has been copied with temp names answer a map from blockExtent to temps map in the same format as BytecodeEncoder>>blockExtentsToTempNamesMap. if the receiver has not been copied with temps answer nil." ^self holdsTempNames ifTrue: + [self mapFromBlockKeys: (self debuggerMap startKeysToBlockExtents values sort: [:assocA :assocB| assocA first <= assocB first]) - [self mapFromBlockKeys: (self startKeysToBlockExtents values sort: [:assocA :assocB| assocA first <= assocB first]) toSchematicTemps: self tempNamesString]! -- _,,,^..^,,,_ best, Eliot -------------- next part -------------- An HTML attachment was scrubbed... URL: From tonyg at leastfixedpoint.com Tue Oct 6 08:28:36 2020 From: tonyg at leastfixedpoint.com (Tony Garnock-Jones) Date: Tue, 6 Oct 2020 10:28:36 +0200 Subject: [squeak-dev] OnScreenKeyboardMorph :-) In-Reply-To: References: <1794d21d-3f1a-a1c5-48c9-2fea71bd6719@leastfixedpoint.com> Message-ID: Yes, that's exactly what I had in mind! I gave it a good go yesterday, but don't have enough Morphic chops to quite get it to work right: the problem was that if I let the ALT modifier apply to the next click, then there are two possibilities: - the next click is to a key on the keyboard - the next click is off the keyboard somewhere Really you only want the synthetic blue-click when it's off the keyboard, but you don't know that at the time you're synthesising the event... It'd be interesting if anyone with more Morphic experience than I could suggest a good way forward! I ended up giving up and switching to having three red/yellow/blue buttons at the bottom of the keyboard that act like shift keys and require multiple touches simultaneously. (Image attached) So the keyboard shift/ctrl/alt work as you describe, but only for entering text. The coloured buttons at the bottom work differently, more like a real keyboard's shift key, and only for clicking on things. Also there are lots of weirdnesses around switching projects, so it's definitely pre-alpha! Also some oddness with scrollbars not being draggable (though windows are draggable). And for some reason popping up a halo on the World via a simulated yellow-click results in 100% CPU usage and a hung image that needs the VM to be interrupted? (And an unrelated issue, I can't seem to disable balloon help.) But in the end I feel pretty happy with it. It works surprisingly well for a day's hacking. (I just now used the on-screen keyboard to reprogram the on-screen keyboard to have an escape key! Woo! Final step: OnScreenKeyboardMorph rebuildFlap, alt-D, reopen the flap... presto, an escape key! Finally, a programmable cellphone) Tony On 10/6/20 3:20 AM, Vanessa Freudenberg wrote: > Looks cool! > > For phone-sized screens you probably want one-handed operations. I'd > imagine tapping e.g. alt would cause the next tap to have the "alt" > modifier bit set. So if tapping a key after alt, it would be alt-key, > but when tapping outside the keyboard after tapping alt, it would be > interpreted as blue-click.  > > Vanessa > > On Mon, Oct 5, 2020 at 10:24 AM Tony Garnock-Jones > > wrote: > > I'm going to see if control-click and cmd-click (via virtual keyboard) > will work out OK. If not (and perhaps in addition) I will experiment > with something like in Vanessa's recently-reposted video from 2010, with > a little "shift" key in a screen corner. > > Tony > > > On 10/5/20 5:09 PM, Herbert wrote: > > Coool!! How are right/middle click (panned to be) handled? > > > > Cheers, > > > > > > Herbert > > > > Am 05.10.20 um 17:04 schrieb Tony Garnock-Jones: > >> image snipped > >> > > > > > > > -------------- next part -------------- A non-text attachment was scrubbed... Name: PXL_20201006_074301201.jpg Type: image/jpeg Size: 78078 bytes Desc: not available URL: From Christoph.Thiede at student.hpi.uni-potsdam.de Tue Oct 6 08:35:20 2020 From: Christoph.Thiede at student.hpi.uni-potsdam.de (Thiede, Christoph) Date: Tue, 6 Oct 2020 08:35:20 +0000 Subject: [squeak-dev] The Trunk: Collections-ul.915.mcz In-Reply-To: References: Message-ID: > OrderedDictionary changes: > - make it a subclass of PluggableDictionary. This lets one create e.g. an ordered identity dictionary without creating a subclass with duplicated behavior Just a stupid question: Why do we have separate Pluggable/IdentityDictionary subclasses of Dictionary at all and did not directly implement Dictionary with a pluggable block? Is this a historic decision or an optimization thing? :-) Best, Christoph ________________________________ Von: Squeak-dev im Auftrag von commits at source.squeak.org Gesendet: Montag, 5. Oktober 2020 00:31:44 An: squeak-dev at lists.squeakfoundation.org; packages at lists.squeakfoundation.org Betreff: [squeak-dev] The Trunk: Collections-ul.915.mcz Levente Uzonyi uploaded a new version of Collections to project The Trunk: http://source.squeak.org/trunk/Collections-ul.915.mcz ==================== Summary ==================== Name: Collections-ul.915 Author: ul Time: 5 October 2020, 12:30:33.597525 am UUID: 93341c2a-ebb2-4d2b-abee-e3f42f509836 Ancestors: Collections-eem.913 HashedCollection changes: - make #capacity return the actual capacity of the collection instead of the size of the internal array. This change is obviously not backwards compatible. - improve the performance of #isEmpty when tally is 0 OrderedDictionary changes: - make it a subclass of PluggableDictionary. This lets one create e.g. an ordered identity dictionary without creating a subclass with duplicated behavior - simplify #initialize and #growTo: now that #capacity is accurate =============== Diff against Collections-eem.913 =============== Item was changed: ----- Method: HashedCollection>>capacity (in category 'accessing') ----- capacity + "Answer the current capacity of the receiver - aka the number of elements the receiver can hold without growing." - "Answer the current capacity of the receiver." + ^ array size * 3 // 4! - ^ array size! Item was changed: ----- Method: HashedCollection>>isEmpty (in category 'testing') ----- isEmpty "For non-weak collections, we can use the tally to speed up the empty check. For weak collections, we must use the traditional way because the tally is unreliable. Also see #size vs. #slowSize." + tally = 0 ifTrue: [ ^true ]. + ^array class isWeak and: [ super isEmpty ]! - ^ array class isWeak - ifFalse: [ tally = 0 ] - ifTrue: [ super isEmpty ]! Item was changed: ----- Method: HashedCollection>>removeAll (in category 'removing') ----- removeAll "remove all elements from this collection. Preserve the capacity" + self initialize: array size! - self initialize: self capacity! Item was changed: + PluggableDictionary subclass: #OrderedDictionary - Dictionary subclass: #OrderedDictionary instanceVariableNames: 'order' classVariableNames: '' poolDictionaries: '' category: 'Collections-Sequenceable'! !OrderedDictionary commentStamp: 'mt 1/16/2015 10:42' prior: 0! I am an ordered dictionary. I have an additional index (called 'order') to keep track of the insertion order of my associations. The read access is not affected by the additional index. The index is updated in O(1) [time] when inserting new keys. For present keys, that insertion involves actions in O(n) to move the respective element to the end of the order. The growth operation compacts the index and takes O(n) additional time. NOTE: This is still no instance of SequenceableCollection. Having this, some protocols are missing and may require working on #associations, which is an Array and thus sequenceable.! Item was changed: ----- Method: OrderedDictionary>>growTo: (in category 'private') ----- growTo: anInteger - | oldOrder | super growTo: anInteger. + order := order grownBy: self capacity - order size! - oldOrder := order. - "Grow only to 75%. See #atNewIndex:put: in HashedCollection." - order := self arrayType new: anInteger + 1 * 3 // 4. - order - replaceFrom: 1 - to: tally - with: oldOrder - startingAt: 1! Item was changed: ----- Method: OrderedDictionary>>initialize: (in category 'private') ----- initialize: n super initialize: n. + order := self arrayType new: self capacity! - order := self arrayType new: n + 1 * 3 // 4! -------------- next part -------------- An HTML attachment was scrubbed... URL: From Christoph.Thiede at student.hpi.uni-potsdam.de Tue Oct 6 08:40:36 2020 From: Christoph.Thiede at student.hpi.uni-potsdam.de (Thiede, Christoph) Date: Tue, 6 Oct 2020 08:40:36 +0000 Subject: [squeak-dev] The Trunk: Tools-mt.990.mcz In-Reply-To: References: <33cfc4d5734a4e60889777cffcee8713@student.hpi.uni-potsdam.de>, Message-ID: Hi Marcel, just an idea - as we are talking about adding possible mode checkboxes to an inspector in [1], we could also add a checkbox for stepping there. We already have such a menu item in the Process Browser ... And then we could add a preference for choosing the default stepping boolean. Hypothetically. :-) Best, Christoph [1] http://forum.world.st/The-Trunk-Tools-eem-994-mcz-td5122902.html ________________________________ Von: Squeak-dev im Auftrag von Taeumel, Marcel Gesendet: Donnerstag, 1. Oktober 2020 13:58:32 An: squeak-dev; packages at lists.squeakfoundation.org Betreff: Re: [squeak-dev] The Trunk: Tools-mt.990.mcz Hi Christoph, it has "always" been that way.. I suppose that its (a) for performance reasonse and (b) you are "stopping time" when debugging anyway. :-) Best, Marcel Am 01.10.2020 13:56:55 schrieb Thiede, Christoph : Hi Marcel, just a basic question - why do we disable stepping in Debuggers? :-) Best, Christoph ________________________________ Von: Squeak-dev im Auftrag von commits at source.squeak.org Gesendet: Dienstag, 29. September 2020 10:20:36 An: squeak-dev at lists.squeakfoundation.org; packages at lists.squeakfoundation.org Betreff: [squeak-dev] The Trunk: Tools-mt.990.mcz Marcel Taeumel uploaded a new version of Tools to project The Trunk: http://source.squeak.org/trunk/Tools-mt.990.mcz ==================== Summary ==================== Name: Tools-mt.990 Author: mt Time: 29 September 2020, 10:20:33.276444 am UUID: e7da396b-a8ec-7a44-8f15-5ba7d0d30b37 Ancestors: Tools-mt.989 In debuggers, forward model-wake-up call to update inspectors. This fixes the bug where a 'nil' receiver had no fields in the receiver inspector. For example, try debug-it on any expression in the workspace to trigger that bug. Note that the underlying challenge is that the inspectors in debuggers are not stepping. Field updates are triggered manually via #updateInspectors. An inspector's initial object is 'nil'. So, "changing" that to 'nil' will not update the field list in inspectors bc. it is considered redundant and will be ignored there. While stepping is not required to produce the initial field list, the model-wake-up call will usually trigger that initial update in a stand-alone inspector. That's why I think that it is not necessary to change anything in the inspector code but only here in the debugger. =============== Diff against Tools-mt.989 =============== Item was added: + ----- Method: Debugger>>modelWakeUpIn: (in category 'user interface') ----- + modelWakeUpIn: aWindow + + super modelWakeUpIn: aWindow. + self updateInspectors.! -------------- next part -------------- An HTML attachment was scrubbed... URL: From Christoph.Thiede at student.hpi.uni-potsdam.de Tue Oct 6 08:45:17 2020 From: Christoph.Thiede at student.hpi.uni-potsdam.de (Thiede, Christoph) Date: Tue, 6 Oct 2020 08:45:17 +0000 Subject: [squeak-dev] The Trunk: Tools-eem.992.mcz In-Reply-To: References: Message-ID: <3c425d1297144ed385f0faaccc2a30c0@student.hpi.uni-potsdam.de> Hi Eliot, > - translating the 'all temp vars' and 'stack top' label Translating is a really low-level operation because it appears everywhere in the system. I'm quite sure that these two calls in the inspector are only the tip of the iceberg. Wouldn't it be more sustainable, and also better readable in the inspectors' implementations, to implement such a cache somewhere in the #translated logic? If necessary, we could make it an LRU cache of an appropriate size, 16 or 32 entries might suffice. What do you think? Best, Christoph ________________________________ Von: Squeak-dev im Auftrag von commits at source.squeak.org Gesendet: Freitag, 2. Oktober 2020 21:19:06 An: squeak-dev at lists.squeakfoundation.org; packages at lists.squeakfoundation.org Betreff: [squeak-dev] The Trunk: Tools-eem.992.mcz Eliot Miranda uploaded a new version of Tools to project The Trunk: http://source.squeak.org/trunk/Tools-eem.992.mcz ==================== Summary ==================== Name: Tools-eem.992 Author: eem Time: 2 October 2020, 12:19:00.336286 pm UUID: 20c2a45a-e258-4a02-9e37-10ffc085290b Ancestors: Tools-eem.991 Go some way to speed up stepping in the debugger. Two of the identified costs are - scanning the method to produce its method/block start keys to block extents map - translating the 'all temp vars' and 'stack top' label With these two cached streaming and emphasizing the temp vars in a ContextInspector is now really fast (less than a millisecond). But stepping is still not fast enlough; one can easily click the mouse faster than step can keep up. So we have more analysis to do. Do futher clean up of DebuggerMethodMap in having it cache its startKeysToBlockExtents. Delete the obsolete privateTempAt:... methods that expect startpcsToBlockExtents:.Move all the scanning machinery from CompiledMethod into DebuggerMethodMap. =============== Diff against Tools-eem.991 =============== Item was changed: Inspector subclass: #ContextInspector instanceVariableNames: '' + classVariableNames: 'CachedStackTopLabel CachedTempVarsLabel CurrentLocale' - classVariableNames: '' poolDictionaries: '' category: 'Tools-Inspector'! !ContextInspector commentStamp: 'ct 1/12/2020 15:26' prior: 0! I am an Inspector that is specialized for inspecting Contexts.! Item was added: + ----- Method: ContextInspector>>allTempVarsTranslated (in category 'private') ----- + allTempVarsTranslated + "Alas translation is slow enough that we notice the slow down in trying to step in the debugger..." + (CurrentLocale ~= Locale current + or: [CachedTempVarsLabel isNil]) ifTrue: + [CurrentLocale := Locale current. + CachedTempVarsLabel := 'all temp vars' translated]. + ^CachedTempVarsLabel! Item was added: + ----- Method: ContextInspector>>stackTopTranslated (in category 'private') ----- + stackTopTranslated + "Alas translation is slow enough that we notice the slow down in trying to step in the debugger..." + (CurrentLocale ~= Locale current + or: [CachedTempVarsLabel isNil]) ifTrue: + [CurrentLocale := Locale current. + CachedStackTopLabel := 'stack top' translated]. + ^CachedStackTopLabel! Item was changed: ----- Method: ContextVariablesInspector>>fieldAllTempVars (in category 'fields') ----- fieldAllTempVars ^ (self newFieldForType: #all key: #allTempVars) + name: self allTempVarsTranslated; emphasizeName; - name: 'all temp vars' translated; emphasizeName; valueGetter: [:object | object tempsAndValues]; printValueAsIs; yourself! Item was changed: ----- Method: ContextVariablesInspector>>fieldStackTop (in category 'fields') ----- fieldStackTop ^ (self newFieldForType: #stackTop key: #stackTop) + name: self stackTopTranslated; emphasizeName; - name: 'stack top' translated; emphasizeName; valueGetter: [:context | context top]; valueGetterExpression: 'ThisContext top'; yourself! Item was changed: Object subclass: #DebuggerMethodMap + instanceVariableNames: 'timestamp methodReference methodNode startKeysToBlockExtents abstractSourceRanges sortedSourceMap' - instanceVariableNames: 'timestamp methodReference methodNode abstractSourceRanges sortedSourceMap' classVariableNames: 'AccessLock MapCache MapCacheEntries' poolDictionaries: '' category: 'Tools-Debugger'! !DebuggerMethodMap commentStamp: 'eem 10/1/2020 19:08' prior: 0! I am a place-holder for information needed by the Debugger to inspect method activations. I insulate the debugger from details of code generation such as exact bytecode offsets and temporary variable locations. I have two concrete subclasses, one for methods where block bytecodes are embedded in the home method and one for methods where blocks are separate objects (CompiledBlock). These classes deal with temporary variable access. My function is to abstract the source map away from actual bytecode pcs to abstract bytecode pcs. I used to have a subclass for "BlueBook" compiled methods, with non-closure blocks, but this was removed in October 2020 for simplicity's sake. To reduce compilation time I try and defer as much computation to access time as possible as instances of me will be created after each compilation. I maintain a WeakIdentityDictionary of method to DebuggerMethodMap to cache maps. I refer to my method through a WeakArray to keep the map cache functional. If the reference from a DebuggerMethodMap to its method were strong then the method would never be dropped from the cache because the reference from its map would keep it alive.! Item was added: + ----- Method: DebuggerMethodMap>>blockExtentsInto:from:to:method:numberer: (in category 'private') ----- + blockExtentsInto: aDictionary from: initialPC to: endPC method: method numberer: numbererBlock + "Support routine for startpcsToBlockExtents" + | pcs extentStart locator scanner blockSizeOrMethodOrLocator | + extentStart := numbererBlock value. + locator := BlockStartLocator new. + scanner := InstructionStream new method: method pc: initialPC. + pcs := OrderedCollection new. + [pcs addLast: scanner pc. + scanner pc <= endPC] whileTrue: + [blockSizeOrMethodOrLocator := scanner interpretNextInstructionFor: locator. + blockSizeOrMethodOrLocator ~~ locator ifTrue: + [blockSizeOrMethodOrLocator isInteger + ifTrue: + [self + blockExtentsInto: aDictionary + from: scanner pc + to: scanner pc + blockSizeOrMethodOrLocator - 1 + method: method + numberer: numbererBlock. + scanner pc: scanner pc + blockSizeOrMethodOrLocator] + ifFalse: + [self assert: blockSizeOrMethodOrLocator isCompiledBlock. + self + blockExtentsInto: aDictionary + from: blockSizeOrMethodOrLocator initialPC + to: blockSizeOrMethodOrLocator endPC + method: blockSizeOrMethodOrLocator + numberer: numbererBlock]]]. + aDictionary + at: (method isCompiledBlock + ifTrue: [method] + ifFalse: [initialPC]) + put: (extentStart to: numbererBlock value). + ^aDictionary! Item was changed: ----- Method: DebuggerMethodMap>>namedTempAt:in: (in category 'accessing') ----- namedTempAt: index in: aContext "Answer the value of the temp at index in aContext where index is relative to the array of temp names answered by tempNamesForContext:" + self assert: aContext method homeMethod == self method. ^self privateTempAt: index in: aContext + startKeysToBlockExtents: self startKeysToBlockExtents! - startKeysToBlockExtents: aContext method startKeysToBlockExtents! Item was changed: ----- Method: DebuggerMethodMap>>namedTempAt:put:in: (in category 'accessing') ----- namedTempAt: index put: aValue in: aContext "Assign the value of the temp at index in aContext where index is relative to the array of temp names answered by tempNamesForContext:. If the value is a copied value we also need to set it along the lexical chain." + self assert: aContext method homeMethod == self method. ^self privateTempAt: index in: aContext put: aValue + startKeysToBlockExtents: self startKeysToBlockExtents! - startKeysToBlockExtents: aContext method startKeysToBlockExtents! Item was changed: ----- Method: DebuggerMethodMap>>rangeForPC:in:contextIsActiveContext: (in category 'source mapping') ----- rangeForPC: contextsConcretePC in: method contextIsActiveContext: contextIsActiveContext "Answer the indices in the source code for the supplied pc. If the context is the actve context (is at the hot end of the stack) then its pc is the current pc. But if the context isn't, because it is suspended sending a message, then its current pc is the previous pc." + | pc abstractMap i end | - | pc i end | pc := method abstractPCForConcretePC: (contextIsActiveContext ifTrue: [contextsConcretePC] ifFalse: [(method pcPreviousTo: contextsConcretePC) ifNotNil: [:prevpc| prevpc] ifNil: [contextsConcretePC]]). + abstractMap := self abstractSourceMapForMethod: method. + (abstractMap includesKey: pc) ifTrue: + [^abstractMap at: pc]. - (self abstractSourceMap includesKey: pc) ifTrue: - [^self abstractSourceMap at: pc]. sortedSourceMap ifNil: + [sortedSourceMap := abstractMap associations - [sortedSourceMap := self abstractSourceMap associations replace: [ :each | each copy ]; sort]. sortedSourceMap isEmpty ifTrue: [^1 to: 0]. i := sortedSourceMap findNearbyBinaryIndex: [:assoc| pc - assoc key]. i < 1 ifTrue: [^1 to: 0]. i > sortedSourceMap size ifTrue: [end := sortedSourceMap inject: 0 into: [:prev :this | prev max: this value last]. ^end+1 to: end]. ^(sortedSourceMap at: i) value "| method source scanner map | method := DebuggerMethodMap compiledMethodAt: #rangeForPC:in:contextIsActiveContext:. source := method getSourceFromFile asString. scanner := InstructionStream on: method. map := method debuggerMap. Array streamContents: [:ranges| [scanner atEnd] whileFalse: [| range | range := map rangeForPC: scanner pc in: method contextIsActiveContext: true. ((map abstractSourceMap includesKey: scanner abstractPC) and: [range first ~= 0]) ifTrue: [ranges nextPut: (source copyFrom: range first to: range last)]. scanner interpretNextInstructionFor: InstructionClient new]]"! Item was added: + ----- Method: DebuggerMethodMap>>startKeysToBlockExtents (in category 'private') ----- + startKeysToBlockExtents + "Answer the map from start keys (either start pcs for embedded closures, or + full block methods for full blocks) to the block extents in that method, where + a block extent is an abstract representation of block nesting within a method." + + startKeysToBlockExtents ifNil: + [| index method | + index := 0. + method := self method homeMethod. + startKeysToBlockExtents := + self + blockExtentsInto: self newBlockStartMap + from: method initialPC + to: method endPC + method: method + numberer: [| value | value := index. index := index + 2. value]]. + ^startKeysToBlockExtents! Item was changed: ----- Method: DebuggerMethodMap>>tempNamesForContext: (in category 'accessing') ----- tempNamesForContext: aContext "Answer an Array of all the temp names in scope in aContext starting with the home's first local (the first argument or first temporary if no arguments)." + self assert: aContext method homeMethod == self method. ^(self privateTempRefsForContext: aContext + startKeysToBlockExtents: self startKeysToBlockExtents) collect: - startKeysToBlockExtents: aContext method startKeysToBlockExtents) collect: [:pair| pair first]! Item was changed: ----- Method: DebuggerMethodMap>>tempNamesForMethod: (in category 'accessing') ----- tempNamesForMethod: aMethod "Answer an Array of all the temp names in scope in aMethod starting with the home's first local (the first argument or first temporary if no arguments)." + self assert: aMethod homeMethod == self method. ^(self privateTempRefsForMethod: aMethod + startKeysToBlockExtents: self startKeysToBlockExtents) collect: - startKeysToBlockExtents: aMethod startKeysToBlockExtents) collect: [:pair| pair first]! Item was added: + ----- Method: DebuggerMethodMapForClosureCompiledMethods>>newBlockStartMap (in category 'private') ----- + newBlockStartMap + "If blocks are embedded then keys in the map are simple integer pcs and a Dictionary can be used. + If blocks are full (separate method objects) then keys in the map are CompiledBlocks and + IdentityDictionary must be used to avoid confusing blocks with identical code." + ^Dictionary new! Item was removed: - ----- Method: DebuggerMethodMapForClosureCompiledMethods>>privateTempAt:in:put:startpcsToBlockExtents: (in category 'private but obsolete') ----- - privateTempAt: index in: aContext put: aValue startpcsToBlockExtents: theContextsStartpcsToBlockExtents - | nameRefPair | - nameRefPair := (self privateTempRefsForContext: aContext - startpcsToBlockExtents: theContextsStartpcsToBlockExtents) - at: index - ifAbsent: [aContext errorSubscriptBounds: index]. - ^self privateDereference: nameRefPair last in: aContext put: aValue! Item was removed: - ----- Method: DebuggerMethodMapForClosureCompiledMethods>>privateTempAt:in:startpcsToBlockExtents: (in category 'private but obsolete') ----- - privateTempAt: index in: aContext startpcsToBlockExtents: theContextsStartpcsToBlockExtents - | nameRefPair | - nameRefPair := (self privateTempRefsForContext: aContext - startpcsToBlockExtents: theContextsStartpcsToBlockExtents) - at: index - ifAbsent: [aContext errorSubscriptBounds: index]. - ^self privateDereference: nameRefPair last in: aContext! Item was changed: ----- Method: DebuggerMethodMapForClosureCompiledMethods>>privateTempRefsForContext:startKeysToBlockExtents: (in category 'private') ----- privateTempRefsForContext: aContext startKeysToBlockExtents: theContextsStartKeysToBlockExtents "Answer the sequence of temps in scope in aContext in the natural order, outermost arguments and temporaries first, innermost last. Each temp is a pair of the temp's name followed by a reference. The reference can be integer - index of temp in aContext #( indirectionVectorIndex tempIndex ) - remote temp in indirectionVector at index in aContext #( outer. temp reference ) - a temp reference in an outer context." blockExtentsToTempRefs ifNil: [blockExtentsToTempRefs := (aContext method holdsTempNames ifTrue: [aContext method] ifFalse: [methodNode]) blockExtentsToTempsMap. blockExtentsToTempRefs ifNil: ["an empty method. shouldn't be able to step into here but it can happen in weird circumstances (i.e. with MethodWrapper)." blockExtentsToTempRefs := Dictionary new. blockExtentsToTempRefs at: (theContextsStartKeysToBlockExtents at: aContext startKey) put: {}] ifNotNil: [(blockExtentsToTempRefs isKindOf: IdentityDictionary) ifTrue: [blockExtentsToTempRefs := Dictionary withAll: blockExtentsToTempRefs associations]]. + startKeysToTempRefs := self newBlockStartMap]. - startKeysToTempRefs := aContext home method newBlockStartMap]. ^startKeysToTempRefs at: aContext startKey ifAbsentPut: [| localRefs | localRefs := blockExtentsToTempRefs at: (theContextsStartKeysToBlockExtents at: aContext startKey) ifAbsent: [#()]. aContext outerContext ifNil: [localRefs] ifNotNil: [:outer| | outerTemps | "Present temps in the order outermost to innermost left-to-right, but replace copied outermost temps with their innermost copies" outerTemps := (self privateTempRefsForContext: outer startKeysToBlockExtents: theContextsStartKeysToBlockExtents) collect: [:outerPair| localRefs detect: [:localPair| outerPair first = localPair first] ifNone: [{ outerPair first. { #outer. outerPair last } }]]. outerTemps, (localRefs reject: [:localPair| outerTemps anySatisfy: [:outerPair| localPair first = outerPair first]])]]! Item was removed: - ----- Method: DebuggerMethodMapForClosureCompiledMethods>>privateTempRefsForContext:startpcsToBlockExtents: (in category 'private but obsolete') ----- - privateTempRefsForContext: aContext startpcsToBlockExtents: theContextsStartpcsToBlockExtents - "Answer the sequence of temps in scope in aContext in the natural order, - outermost arguments and temporaries first, innermost last. Each temp is - a pair of the temp's name followed by a reference. The reference can be - integer - index of temp in aContext - #( indirectionVectorIndex tempIndex ) - remote temp in indirectionVector at index in aContext - #( outer. temp reference ) - a temp reference in an outer context." - blockExtentsToTempRefs ifNil: - [blockExtentsToTempRefs := (aContext method holdsTempNames - ifTrue: [aContext method] - ifFalse: [methodNode]) blockExtentsToTempsMap. - blockExtentsToTempRefs ifNil: - ["an empty method. shouldn't be able to step into here but it - can happen in weird circumstances (i.e. with MethodWrapper)." - blockExtentsToTempRefs := Dictionary new. - blockExtentsToTempRefs - at: (theContextsStartpcsToBlockExtents at: aContext startpc) - put: {}]. - startpcsToTempRefs := Dictionary new]. - ^startpcsToTempRefs - at: aContext startpc - ifAbsentPut: - [| localRefs | - localRefs := blockExtentsToTempRefs at: (theContextsStartpcsToBlockExtents at: aContext startpc). - aContext outerContext - ifNil: [localRefs] - ifNotNil: - [:outer| | outerTemps | - "Present temps in the order outermost to innermost left-to-right, but replace - copied outermost temps with their innermost copies" - outerTemps := (self - privateTempRefsForContext: outer - startpcsToBlockExtents: theContextsStartpcsToBlockExtents) collect: - [:outerPair| - localRefs - detect: [:localPair| outerPair first = localPair first] - ifNone: [{ outerPair first. { #outer. outerPair last } }]]. - outerTemps, - (localRefs reject: [:localPair| outerTemps anySatisfy: [:outerPair| localPair first = outerPair first]])]]! Item was removed: - ----- Method: DebuggerMethodMapForClosureCompiledMethods>>privateTempRefsForMethod:startpcsToBlockExtents: (in category 'private but obsolete') ----- - privateTempRefsForMethod: method startpcsToBlockExtents: startpcsToBlockExtents - "Answer the sequence of temps in scope in method in the natural order, - outermost arguments and temporaries first, innermost last. Each temp is - a pair of the temp's name followed by a reference. The reference can be - integer - index of temp in aContext - #( indirectionVectorIndex tempIndex ) - remote temp in indirectionVector at index in aContext - #( outer. temp reference ) - a temp reference in an outer context." - blockExtentsToTempRefs ifNil: - [blockExtentsToTempRefs := (method holdsTempNames - ifTrue: [method] - ifFalse: [methodNode]) blockExtentsToTempsMap. - blockExtentsToTempRefs ifNil: - ["an empty method. shouldn't be able to step into here but it - can happen in weird circumstances (i.e. with MethodWrapper)." - blockExtentsToTempRefs := Dictionary new. - blockExtentsToTempRefs - at: (startpcsToBlockExtents at: method initialPC) - put: {}]. - startpcsToTempRefs := Dictionary new]. - ^startpcsToTempRefs - at: method initialPC - ifAbsentPut: - [blockExtentsToTempRefs at: (startpcsToBlockExtents at: method initialPC)]! Item was added: + ----- Method: DebuggerMethodMapForFullBlockCompiledMethods>>newBlockStartMap (in category 'private') ----- + newBlockStartMap + "If blocks are embedded then keys in the map are simple integer pcs and a Dictionary can be used. + If blocks are full (separate method objects) then keys in the map are CompiledBlocks and + IdentityDictionary must be used to avoid confusing blocks with identical code." + ^WeakIdentityKeyDictionary new! -------------- next part -------------- An HTML attachment was scrubbed... URL: From Christoph.Thiede at student.hpi.uni-potsdam.de Tue Oct 6 08:46:18 2020 From: Christoph.Thiede at student.hpi.uni-potsdam.de (Thiede, Christoph) Date: Tue, 6 Oct 2020 08:46:18 +0000 Subject: [squeak-dev] Compiler evaluate: '' | 'inner' argument in parser In-Reply-To: References: <459d23268a2141dd87d2a951c5b02366@student.hpi.uni-potsdam.de>, Message-ID: Hi Eliot, thanks for your reaction to change this behavior via Compiler-eem.442. Best, Christoph ________________________________ Von: Squeak-dev im Auftrag von Eliot Miranda Gesendet: Montag, 14. September 2020 15:29:00 An: The general-purpose Squeak developers list Betreff: Re: [squeak-dev] Compiler evaluate: '' | 'inner' argument in parser Hi Christoph, ignore my first response. I hadn't looked at the code yet. It hasn't changed my conclusions, but it alters the proposed solution. On Mon, Sep 14, 2020 at 5:17 AM Thiede, Christoph > wrote: Hi all, I just evaluated the following line and was surprised by the result: Compiler evaluate: '' for: 42. The answer was nil, whereas I rather would have expected the answer to life the universe and everything 42, as it is the case for full methods compiled on an object. What do you think about this, which should be the right output? I agree with you that the null statement should evaluate to self at method level. IIRC, the ANSI standard says that the null statement evaluated to the last block argument did blocks with arguments (to legalize a quirk in Peter Deutsch’s closure compiler for ObjectWorks 2.5 and subsequent). And clearly the null statement in a block evaluates to nil. I hunk that the null statement should evaluate to self at method level and nil at block level, irrespective of the number of block arguments. To be clear I would have these tests self assert: (Compiler evaluate: '' for: 42) equals: 42. self assert: ([:arg|] value: 42) equals: nil. self assert: [] value equals: nil. Looking at the code, when I added closures I took the existing compiler as a given and hence perpetuated the bug that (Compiler evaluate: '' for: 42) isNil. Looking at the code I don't like the inner: argument, and for the longest time I have felt like the statements:innerBlock: method was unnecessary. So one fix in Parser>>#method:context: is to replace self statements: #() innerBlock: doit. with self statements: #() innerBlock: false blockNode: BlockNode new. Another improvement would be to simply substitute the variable to be used for empty statements, so we would use Parser>>#method:context: ... self statements: #() defaultVariable: 'self' blockNode: BlockNode new. ... Parser>>#statements: argNodes defaultVariable: selfOrNil blockNode: theBlockNode ... ifFalse: [self addComment. stmts size = 0 ifTrue: [stmts addLast: (encoder encodeVariable: selfOrNil)]]]. ... Parser>>#blockExpression ... self statements: variableNodes defaultVariable: 'nil' blockNode: blockNode. ... but maybe the following: Parser>>#method:context: ... doit ifTrue: [blk returnLast] ifFalse: [blk returnSelfIfNoOther: encoder]. ... indicates that either stmts size = 0 ifTrue: [stmts addLast: (encoder encodeVariable: selfOrNil)] is wrong and the defaulting should happen in the sender (in Parser>>#method:context: and Parser>>#primaryExpression where it sends blockExpression), or that we should pass in a selector which is performed in the method to determine what to do. So the method would then be e.g. Parser>>#statements:blockNode:ifEmpty: and the senders would look like, e.g. Parser>>#method:context: ... self statements: #() blockNode: BlockNode new ifEmpty: (doit ifTrue: [#returnLast:] ifFalse: [#returnSelfIfNoOther:). blk := parseNode. hereType == #doIt ifFalse: [^self expected: 'Nothing more']. ... Parser>>#blockExpression ... self statements: variableNodes blockNode: BlockNode new ifEmpty: #returnNilIfEmpty:. ... I'm interested in your reading. I think you should implement whatever makes most sense to you. I'm happy to rebiew. I was even more surprised after taking a look into the relevant Parser implementation, which is #statements:innerBlock:blockNode:. Actually, the 'inner' argument's sole purpose is to use 'nil' instead of 'self' as a return value if there are zero statements. If we would not like to have this extra rule for doIt snippets, we would only have to change #method:context:[encoder:] and pass 'false' instead of 'doit' to #statements:innerBlock:. I'm probably missing some logical consequences of the syntactic concept of blocks, methods, and doits, so I would like to hear your thoughts on this. This is not so much philosophical as rushed. When I added closures I wanted not to break the compiler and DTSTTCPW because I had a VM to write. I wanted to clean things up but I risked making too many mistakes so I erred on the side of minimally extending the compiler rather than making it better. Best, Christoph _,,,^..^,,,_ best, Eliot -------------- next part -------------- An HTML attachment was scrubbed... URL: From Christoph.Thiede at student.hpi.uni-potsdam.de Tue Oct 6 08:58:03 2020 From: Christoph.Thiede at student.hpi.uni-potsdam.de (Thiede, Christoph) Date: Tue, 6 Oct 2020 08:58:03 +0000 Subject: [squeak-dev] The Trunk: Tools-eem.993.mcz In-Reply-To: References: Message-ID: <9a4acae8a4084e9d8a0b10b934bffe81@student.hpi.uni-potsdam.de> Hi Eliot, see Tools-eem.992 for my question about caching the translation. Allow me another basic question: Did you make sure the delay of "clicking the button frequently" is not (partially) caused by the underlying Morphic code? I'm asking because I believe there are a small number of other situations in plain Squeak where you can press a button without anything being opened so you wouldn't notice the inherent delay of the button. For example, I noticed a small bug in the PluggableButtonMorph that leads to drawing the button as non-hovered after a click, even if it is being hovered; but at the beginning, I assumed the UI not yet being responsive again. You could also try out your debugging example in MVC (probably you already did this) to see whether the delay is the same. If you should find any potential for optimization in the PluggableButtonMorph hierarchy, it would be nice if you could report them on the list first before fixing because I am preparing a larger changeset that renews event handling in these classes, so this would probably result in merge conflicts. Best, Christoph ________________________________ Von: Squeak-dev im Auftrag von commits at source.squeak.org Gesendet: Freitag, 2. Oktober 2020 21:36:06 An: squeak-dev at lists.squeakfoundation.org; packages at lists.squeakfoundation.org Betreff: [squeak-dev] The Trunk: Tools-eem.993.mcz Eliot Miranda uploaded a new version of Tools to project The Trunk: http://source.squeak.org/trunk/Tools-eem.993.mcz ==================== Summary ==================== Name: Tools-eem.993 Author: eem Time: 2 October 2020, 12:35:57.69654 pm UUID: 0d492fb7-b306-4024-9a98-e18603f5d338 Ancestors: Tools-eem.992 Go a little further in speeding up stepping in the debugger. Cache the translation of 'all inst vars' in In szpector. Consequently move CurrentLocale up to Inspector form ContextInspector. Now stepping is pretty good, but even on my 2.9 GHz Core i9 MPB I can click faster than it can keep up, but it doesn't get further than a couple fo sends behind. That's still too slow; it *must* keep up for the debugger to feel comfortable. But we are hopefully only one more source of slow down away now. =============== Diff against Tools-eem.992 =============== Item was changed: Inspector subclass: #ContextInspector instanceVariableNames: '' + classVariableNames: 'CachedStackTopLabel CachedTempVarsLabel' - classVariableNames: 'CachedStackTopLabel CachedTempVarsLabel CurrentLocale' poolDictionaries: '' category: 'Tools-Inspector'! !ContextInspector commentStamp: 'ct 1/12/2020 15:26' prior: 0! I am an Inspector that is specialized for inspecting Contexts.! Item was changed: StringHolder subclass: #Inspector instanceVariableNames: 'object context fields customFields selectionIndex expression contentsTyped fieldListStyler shouldStyleValuePane selectionUpdateTime' + classVariableNames: 'CachedAllInstVarsLabel CurrentLocale' - classVariableNames: '' poolDictionaries: '' category: 'Tools-Inspector'! !Inspector commentStamp: 'mt 4/6/2020 15:16' prior: 0! I am a tool that allows to inspect and modify the internal representation of an object. As a StringHolder, the string I represent is the value of the currently selected inspector field, which may be an instance variable, of the observed object. Beside the #contents in my value pane, I have an extra code pane that holds an #expression to be evaluated on the inspected object -- not the currently selected inspector field. Take a look at my "fields ..." protocols as well as InspectorField. (Note that the idea of "elements" from the CollectionInspector bleeds a little bit down into this interface to simplify the implementation of field truncation as well as #inspectOne. Sorry for that. Usually, the inspected object will only produce "fields" to display, and maybe "items" in a pop-up menu. Only collections have "elements".)! Item was added: + ----- Method: Inspector>>allInstVarsTranslated (in category 'private') ----- + allInstVarsTranslated + "Alas translation is slow enough that we notice the slow down in trying to step in the debugger..." + (CurrentLocale ~= Locale current + or: [CachedAllInstVarsLabel isNil]) ifTrue: + [CurrentLocale := Locale current. + CachedAllInstVarsLabel := 'all inst vars' translated]. + ^CachedAllInstVarsLabel! Item was changed: ----- Method: Inspector>>fieldAllInstVars (in category 'fields') ----- fieldAllInstVars ^ (self newFieldForType: #all key: #allInstVars) + name: self allInstVarsTranslated; emphasizeName; - name: 'all inst vars' translated; emphasizeName; valueGetter: [:object | object longPrintString]; printValueAsIs; yourself! -------------- next part -------------- An HTML attachment was scrubbed... URL: From Das.Linux at gmx.de Tue Oct 6 10:41:49 2020 From: Das.Linux at gmx.de (Tobias Pape) Date: Tue, 6 Oct 2020 12:41:49 +0200 Subject: [squeak-dev] The XML libraries run fine on Squeak 6 alpha In-Reply-To: References: Message-ID: Hi > On 06.10.2020, at 09:22, Marcel Taeumel wrote: > > Hi Levente, > > thanks for this review. The points (4), (3), and (2) are very serious. There needs to be a lot of work done before this can be treated as a valuable addition to Trunk's XML implementation. Especially backwards compatibility must be considered. > > I am -1 then. Sorry for not taking a look at the code before. I would still like to see improvements happen in the Trunk's XML implementation. I like the idea of "removing" XML and making it loadable in either the Old form or monty's package. But in that case, we somehow need a mechanism to communicate the fact that these two exists… -t > > Best, > Marcel >> Am 05.10.2020 21:53:34 schrieb Levente Uzonyi : >> >> -1 >> >> After a bit of analysis, I came to the conclusion that it would be a bad >> idea to include those packages in the Trunk. Why? >> >> 1. There are more important things than XML >> 2. These packages are huge >> 3. The code is not backwards compatible >> 4. It would introduce parallel collection hierarchies which would cause >> confusion >> 5. Some undeclared variables >> >> >> Details: >> >> 1. There are more important things than XML >> >> I think there's not much to say here. Among the serialization formats, >> JSON, YAML are far more popular than XML nowadays. Yet, we have neither >> supported in the Trunk (apart from a minimal hence incomplete JSON >> implementation in WebClient. It's really amazing how small it is though.) >> >> >> 2. These packages are huge >> >> The current version of the XML-Parser in Trunk has the following stats: >> >> classes: 26 >> methods: 379 >> linesOfCode: 2069 >> >> It's obviously incomplete though. >> The proposed packages have the following stats: >> >> classes: 758 (21.5% of all classes in the Trunk including the XML packages) >> methods: 10129 (14%) >> linesOfCode: 73897 (13.7%) >> >> That's 25x-35x more than the current implementation. >> When the packages are loaded in the current Trunk image, they take up >> 21.5%, 14%, 13.7% of all classes, methods, linesOfCode, respectively. >> One could say that the extensive tests are responsible for the bloat, but >> no, it's probably related to the complexity of XML. Without tests, the >> numbers are: >> >> classes: 512 (15.6%) >> methods: 6744 (9.8%) >> linesOfCode: 32886 (6.6%) >> >> I don't think XML is important enough in general to justify those numbers. >> >> >> 3. The code is not backwards compatible >> >> The code is not a drop-in replacement. The interface is different. Code >> using the current package would have to be migrated. >> >> >> 4. It would introduce parallel collection hierarchies which would cause >> confusion >> >> The code uses various collections similar to those in the Trunk but not >> compatible with them and not in the same class hierarchy: >> >> BitmapCharcterSet - An independent character set implementation. Not a >> subclass of CharacterSet. >> >> StandardOrderedDictioanry (and its 5 subclasses) - An alternative to >> OrderedDictionary implementation. A subclass of Collection, so not part of >> the HashedCollection hierarchy (for good reasons). >> >> If these were part of the Trunk, one could be wondering which one to use: >> OrderedDictionary or OrderPreservingDictionary? What's the difference? >> Maybe StandardOrderedDictionary? >> >> 5. Some undeclared variables >> >> The code is written with compatibility in mind, so it supports Pharo and >> Squeak. Even if you use Squeak, code related to Zinc, Pharo's HTTP library >> will still be loaded directly referencing Zinc's classes. >> >> >> Without going any deeper, I think the best would be to not include these >> packages in the Trunk. >> I'd go even further: I would remove the current XML-Parser as well but >> provide an easy way to load either version. That way the image would be >> smaller, simpler. >> If we had the CI infrastructure (we probably have, but I'm not sure), we >> could even test whether these packages work as expected, and treat them >> as official external packages. >> >> There's currently one method that depends on the XML-Parser package in >> Trunk: SugarLauncher >> #gconfPropertiesAt:. >> It uses the current XML-Parser API, so even if we decide to include the >> more complete XML implementation in Trunk, we will still have to change >> it to make it work. >> >> >> Levente >> >> On Mon, 5 Oct 2020, Eliot Miranda wrote: >> >> > Hi All, >> > >> > votes for & against inclusion of Monty’s XML in trunk/6 beta? >> > >> > +1 >> > >> > _,,,^..^,,,_ (phone) >> > >> >> On Oct 4, 2020, at 12:44 PM, monty wrote: >> >> >> >> Installing the (head)s of: >> >> XMLParser (which loads "XMLWriter" too) >> >> XMLParser-XPath (be careful not to install the old, unfinished "XPath" project) >> >> XMLParser-StAX >> >> XMLParser-HTML >> >> from the SqueakMap works fine; all the tests still pass. XMLParser installation still pops up a warning you have to click through b/c of a conflict with the old XMLParser in the image, but it's fine other than that. >> >> >> >> Supposedly there are conflicts with XStreams, but I have nothing to do with that. >> >> >> >> An aside: some tests are skipped by default because they rely on external resources, like the file system or HTTP, which makes it easier to distinguish real regressions from something like a network outage. The skipping is more obvious on Pharo because their TestCase has a #skip message that the TestRunner UI supports. On Squeak these tests just silently pass. To run them, send XMLSkippableTest #stopSkippingAll. Unfortunately b/c of the W3C rate limiting, the tests using xhtml DTDs timeout if you run them more than once. You could say they should be cached (the default resolver does just that), but the purpose of these tests is to test real HTTP retrieval, so that defeats the purpose. >> >> ___ >> >> montyos.wordpress.com >> >> >> >> From christoph.thiede at student.hpi.uni-potsdam.de Tue Oct 6 10:47:58 2020 From: christoph.thiede at student.hpi.uni-potsdam.de (Christoph Thiede) Date: Tue, 6 Oct 2020 05:47:58 -0500 (CDT) Subject: [squeak-dev] Development methodology (was: tedious        programming-in-the-debugger error needs fixing) In-Reply-To: References: <1601475775699-0.post@n4.nabble.com> <1601590406774-0.post@n4.nabble.com> <076817EE-1506-47F9-9AF4-3126C6D3BC76@rowledge.org> <1601860447473-0.post@n4.nabble.com> <025A3F5C-E26E-44C6-B19B-FBED361CE779@gmail.com> <174f8f5548b.e4c3e13b138475.8358330872058455280@zoho.com> <1601925526567-0.post@n4.nabble.com> Message-ID: <1601981278751-0.post@n4.nabble.com> Hi all, looks like I'm a bit late back to this debate again, but it's very nice it is still going on! There are many arguments I wanted to tell but Jakob already explained all of them better than I could do. So just let me come back to some points: Mantis: I just took another look at bugs.squeak.org again, and I'm sorry but I still think that our community deserves a better bug tracking solution than this. It really looks old-fashioned and, from today's point of view, quite chaotic and confusing. And compared to something like GitHub, it does not give me an idea of how to report a bug. Do I have to log in? Which credentials do I need to use? Why is there no register button anywhere? Also, there must be some reason why the latest issue was submitted nearly two years ago. Is Mantis connected to the mailing list at all? Asking all of you who have used Mantis in past and reported newer bugs to the mailing list instead, why did you do that? I would guess because mails provid higher visibility and interactivity, is this correct? Phil, you called GitHub & Co. one trend of many that's durability is uncertain (correct me if I misunderstood you). I see this point, but looking at the current numbers I strongly believe that GitHub has reached a critical mass of developers and projects that won't move so quickly again. How many large global players have decided to use GitHub, including competitors of Microsoft itself such as Google, Apple, Facebook, etc.? At least, according to the trends GitHub is way more popular than SourceForge, for example, has ever been, actually, it has even overtaken git itself on Google Trends: https://trends.google.com/trends/explore?date=all&q=github,sourceforge,gitlab,bitbucket,slack (By the way, if you search any old threads you can also find it on web.archive.org in most cases). > Here you're showing you've already fallen behind: the github trend for > discussing things is already fading and those trendier than you have > already moved on to the next thing: Slack is where it's at! In a year or > two it will be something else... and the treadmill keeps going but not > really going anywhere. Slack is a group messenger used for communication in small to medium teams, but I can hardly imagine someone seriously uses this as a bug tracker for a large-scale software project with a big community, there is just too much noise when pressing Enter sends a new message. The same goes for social media platforms such as Google Plus that do not even offer basic tracking features such as closing or labeling. I don't think you can compare this. > Monticello ancestry does support branching, yet I think Monticello lacks > first-class objects for branches, with all the implications for repository > handling. +1. And I feel the lack of branches for about every second or third submission I make to the inbox and am forced to reinvent my one pseudo branch wheel. Git vs. GitHub vs. GitLab: As Jakob already mentioned, they're not the same. I believe that GitHub offers the largest range by far, but personally I would still consider it as an improvement to set up a self-hosted GitLab instance (actually, from a technical point of view, I think GitLab offers even more convenience features for free). But still, it's right what Eliot said about git and companies: > One gives up great autonomy when allowing ones core VCS to be in a foreign > system So why do you use git & GitHub for OpenSmalltalk-VM and not something like Monticello? Which leads me to my most important point which Uncle Bob from Jakob's linked talk above gives this striking name to: elitism. In plain theory, I would consider it as an ideal, too, to have a Smalltalk system in which you can literally control every bit (ultimately, this might be a Smalltalk computer with no separate host system, where all drivers etc. are written in Smalltalk - completely neglecting every question of optimization). But in reality, the Squeak community, or even the entire Smalltalk community, is a quite small community, and I would love to change this and make Squeak/Smalltalk competitive again for contemporary development tasks, which involves the mutual boosting between tools/frameworks and developers. And because we are quite small at this point, we have two alternative ways we could go: Either we can spend our time on reimplementing every good and relevant idea from the "real world" in Squeak and making ourself even more comfortable in our small niche (which is, as I'm convinced, already very comfortable in many terms, compared to most other languages and environments); or we can join our forces and focus for now on opening our system towards the real world, both in terms of solutions and people. Which one would you choose? > Yet in my opinion Squeak really needs to get along with the outside world > for the mutual benefit; we cannot afford to always reimplement everything > in Smalltalk just to be able to comfortably debug the issues we wouldn't > have if we had used something mature. +1000 Best, Christoph PS: And as a matter of course, I'm neither in the position nor willing to enforce any innovations that would deter some of our important community members from the Squeak Project. But I'm not giving up the hope that this discussion may reveal some more interesting insights about the desires and demands of us as a community. :-) -- Sent from: http://forum.world.st/Squeak-Dev-f45488.html From Christoph.Thiede at student.hpi.uni-potsdam.de Tue Oct 6 11:36:53 2020 From: Christoph.Thiede at student.hpi.uni-potsdam.de (Thiede, Christoph) Date: Tue, 6 Oct 2020 11:36:53 +0000 Subject: [squeak-dev] Overhead of SystemProgressMorph/#do:displayingProgress: is huge Message-ID: <88320e6951f147939dd02fb013008db1@student.hpi.uni-potsdam.de> [(1 to: 1000) do: [:i | 10 milliSeconds wait]] timeToRun. "--> 11758" [(1 to: 1000) do: [:i | 10 milliSeconds wait] displayingProgress: [:x | x asString]] timeToRun. "--> 18528" 18528 / 11758. "--> 1.57" In this example, in total, 3.9 seconds are spent in SystemProgressMorph(Morph) >> #updateDropShadowCache. I found out that in #setLayoutBoundsFromLayout:, the #dropShadow cache is cleared in every second iteration of the code from above! Why is bounds ~= outer? Is this a new layout problem? :-) Best, Christoph -------------- next part -------------- An HTML attachment was scrubbed... URL: From leves at caesar.elte.hu Tue Oct 6 12:17:00 2020 From: leves at caesar.elte.hu (Levente Uzonyi) Date: Tue, 6 Oct 2020 14:17:00 +0200 (CEST) Subject: [squeak-dev] The Trunk: Collections-ul.915.mcz In-Reply-To: References: Message-ID: Hi Christoph, On Tue, 6 Oct 2020, Thiede, Christoph wrote: > > > OrderedDictionary changes: > > > - make it a subclass of PluggableDictionary. This lets one create e.g. an ordered identity dictionary without creating a subclass with duplicated behavior > > Just a stupid question: Why do we have separate Pluggable/IdentityDictionary subclasses of Dictionary at all and did not directly implement Dictionary with a pluggable block? Is this a historic decision or an optimization > thing? :-) AFAIK PluggableDictionary was not part of Smalltalk-80, but Dictionary and IdentityDictionary were. Dictionary and IdentityDictionary are slightly faster than their PluggableDictionary equivalents. In theory, we could simplify the HashedCollection hierarchy by making Set and Dictionary pluggable. But in practice, too many things use IdentitySet and IdentityDictionary directly. Perhaps we could replace those classes with stubs having the right "constructor" but we couldn't remove those classes. From the users' point of view, it's probably better that we have separate classes. (And there are all sorts of interesting questsions raising from making Set and Dictionary pluggable. E.g. how would that affect other subclasses of Set/Dictionary? Levente > > Best, > Christoph > > _________________________________________________________________________________________________________________________________________________________________________________________________________________________________ > Von: Squeak-dev im Auftrag von commits at source.squeak.org > Gesendet: Montag, 5. Oktober 2020 00:31:44 > An: squeak-dev at lists.squeakfoundation.org; packages at lists.squeakfoundation.org > Betreff: [squeak-dev] The Trunk: Collections-ul.915.mcz   > Levente Uzonyi uploaded a new version of Collections to project The Trunk: > http://source.squeak.org/trunk/Collections-ul.915.mcz > > ==================== Summary ==================== > > Name: Collections-ul.915 > Author: ul > Time: 5 October 2020, 12:30:33.597525 am > UUID: 93341c2a-ebb2-4d2b-abee-e3f42f509836 > Ancestors: Collections-eem.913 > > HashedCollection changes: > - make #capacity return the actual capacity of the collection instead of the size of the internal array. This change is obviously not backwards compatible. > - improve the performance of #isEmpty when tally is 0 > > OrderedDictionary changes: > - make it a subclass of PluggableDictionary. This lets one create e.g. an ordered identity dictionary without creating a subclass with duplicated behavior > - simplify #initialize and #growTo: now that #capacity is accurate > > =============== Diff against Collections-eem.913 =============== > > Item was changed: >   ----- Method: HashedCollection>>capacity (in category 'accessing') ----- >   capacity > +        "Answer the current capacity of the receiver - aka the number of elements the receiver can hold without growing." > -        "Answer the current capacity of the receiver." >   > +        ^ array size * 3 // 4! > -        ^ array size! > > Item was changed: >   ----- Method: HashedCollection>>isEmpty (in category 'testing') ----- >   isEmpty >          "For non-weak collections, we can use the tally to speed up the empty check. For weak collections, we must use the traditional way because the tally is unreliable. Also see #size vs. #slowSize." >   > +        tally = 0 ifTrue: [ ^true ]. > +        ^array class isWeak and: [ super isEmpty ]! > -        ^ array class isWeak > -                ifFalse: [ tally = 0 ] > -                ifTrue: [ super isEmpty ]! > > Item was changed: >   ----- Method: HashedCollection>>removeAll (in category 'removing') ----- >   removeAll >          "remove all elements from this collection. >          Preserve the capacity" >          > +        self initialize: array size! > -        self initialize: self capacity! > > Item was changed: > + PluggableDictionary subclass: #OrderedDictionary > - Dictionary subclass: #OrderedDictionary >          instanceVariableNames: 'order' >          classVariableNames: '' >          poolDictionaries: '' >          category: 'Collections-Sequenceable'! >   >   !OrderedDictionary commentStamp: 'mt 1/16/2015 10:42' prior: 0! >   I am an ordered dictionary. I have an additional index (called 'order') to keep track of the insertion order of my associations. >   >   The read access is not affected by the additional index. >   >   The index is updated in O(1) [time] when inserting new keys. For present keys, that insertion involves actions in O(n) to move the respective element to the end of the order. >   >   The growth operation compacts the index and takes O(n) additional time. >   >   NOTE: This is still no instance of SequenceableCollection. Having this, some protocols are missing and may require working on #associations, which is an Array and thus sequenceable.! > > Item was changed: >   ----- Method: OrderedDictionary>>growTo: (in category 'private') ----- >   growTo: anInteger >   > -        | oldOrder | >          super growTo: anInteger. > +        order := order grownBy: self capacity - order size! > -        oldOrder := order. > -        "Grow only to 75%. See #atNewIndex:put: in HashedCollection." > -        order := self arrayType new: anInteger + 1 * 3 // 4. > -        order > -                replaceFrom: 1 > -                to: tally > -                with: oldOrder > -                startingAt: 1! > > Item was changed: >   ----- Method: OrderedDictionary>>initialize: (in category 'private') ----- >   initialize: n >   >          super initialize: n. > +        order := self arrayType new: self capacity! > -        order := self arrayType new: n + 1 * 3 // 4! > > > > From Christoph.Thiede at student.hpi.uni-potsdam.de Tue Oct 6 12:20:54 2020 From: Christoph.Thiede at student.hpi.uni-potsdam.de (Thiede, Christoph) Date: Tue, 6 Oct 2020 12:20:54 +0000 Subject: [squeak-dev] Changeset: Interpolation search Message-ID: <46698de07ed340a3aaa84c44cf40aad7@student.hpi.uni-potsdam.de> Hi all, please find the attached changeset in which I'm proposing a set of new methods on SequenceableCollection that implement interpolation search in Squeak. Interpolation search works similar for linear search, but it is supplied a number indicating distance rather than a binary/ternary information like binary search. Interpolation search is a bit slower for small collections because handling the distance value introduces some overhead, but it outperforms the other in the case of a) very large collections and b) expensive block operations. In addition, the changeset contains tests for both all #findBinary: and all #findDelta: overloads. The following example demonstrates usage + benchmarks of the new methods: data := (1 to: 10000000) select: [:i | i isPrime]. probe := (1 to: 10000) collect: [:i | data atRandom]. [probe collect: [:p | data findBinaryIndex: [:d | p <=> d]]] benchFor: 10 seconds. "--> '107 per second. 9.37 milliseconds per run. 5.21896 % GC time.'" [probe collect: [:p | data findDeltaIndex: [:d | p - d]]] benchFor: 10 seconds. "--> '196 per second. 5.1 milliseconds per run. 9.89901 % GC time.'" (9.37 milliSeconds / 5.1 milliSeconds) asScaledDecimal reciprocal "--> 0.54429028s8" Looking forward to your review! :-) In particular, I already wondered whether #findDelta: is the best name for this feature. Does anyone know a better one? We could also add a fourth parameter for specifying a custom interpolation function. However, I could not find any real-world example for this, so this would probably be speculative generality. Best, Christoph ________________________________ 'From Squeak6.0alpha of 1 October 2020 [latest update: #19893] on 6 October 2020 at 1:53:27 pm'! !SequenceableCollection methodsFor: 'enumerating' stamp: 'ct 10/4/2020 15:46'! findBinary: aBlock do: actionBlock ifNone: exceptionBlock "Search for an element in the receiver using binary search. The argument aBlock is a one-element block returning 0 - if the element is the one searched for; <0 - if the search should continue in the first half; >0 - if the search should continue in the second half. If found, evaluate actionBlock with the found element as argument. If no matching element is found, evaluate exceptionBlock, with the 'bounding' elements (or nil) as optional arguments. If aBlock performs expensive operations, also consider using #findDelta:do:ifNone: instead. Examples: #(1 3 5 7 11 15 23) findBinary: [ :arg | 11 <=> arg ] do: [ :found | found ] ifNone: [ :a :b | ('between: ', {a. b} printString) ] #(1 3 5 7 11 15 23) findBinary: [ :arg | 12 <=> arg ] do: [ :found | found ] ifNone: [ :a :b | ('between: ', {a. b} printString) ] #(1 3 5 7 11 15 23) findBinary: [ :arg | 0.5 - arg ] do: [ :found | found ] ifNone: [ :a :b | ('between: ', {a. b} printString) ] #(1 3 5 7 11 15 23) findBinary: [ :arg | 25 - arg ] do: [ :found | found ] ifNone: [ :a :b | ('between: ',{a. b} printString) ] " ^self findBinaryIndex: aBlock do: [ :foundIndex | actionBlock value: (self at: foundIndex) ] ifNone: [ :prevIndex :nextIndex | exceptionBlock cull: (prevIndex > 0 ifTrue: [ self at: prevIndex ]) cull: (nextIndex <= self size ifTrue: [ self at: nextIndex ]) ]! ! !SequenceableCollection methodsFor: 'enumerating' stamp: 'ct 10/4/2020 15:46'! findBinaryIndex: aBlock "Search for an element in the receiver using binary search. The argument aBlock is a one-element block returning 0 - if the element is the one searched for; <0 - if the search should continue in the first half; >0 - if the search should continue in the second half. If no matching element is found, raise an error. If aBlock performs expensive operations, also consider using #findDeltaIndex: instead. Example: #(1 3 5 7 11 15 23) findBinaryIndex: [ :arg | 11 <=> arg ] " ^self findBinaryIndex: aBlock do: [ :found | found ] ifNone: [ self errorNotFound: aBlock]! ! !SequenceableCollection methodsFor: 'enumerating' stamp: 'ct 10/4/2020 15:47'! findBinaryIndex: aBlock do: actionBlock ifNone: exceptionBlock "Search for an element in the receiver using binary search. The argument aBlock is a one-element block returning 0 - if the element is the one searched for; <0 - if the search should continue in the first half; >0 - if the search should continue in the second half. If found, evaluate actionBlock with the index as argument. If no matching element is found, evaluate exceptionBlock, with the indexes of the 'bounding' elements as optional arguments. Warning: Might give invalid indexes, see examples below. If aBlock performs expensive operations, also consider using #findDeltaIndex:do:ifNone: instead. Examples: #(1 3 5 7 11 15 23) findBinaryIndex: [ :arg | 11 <=> arg ] do: [ :found | found ] ifNone: [ :a :b | ('between: ', {a. b} printString)] #(1 3 5 7 11 15 23) findBinaryIndex: [ :arg | 1 <=> arg ] do: [ :found | found ] ifNone: [ :a :b | ('between: ', {a. b} printString) ] #(1 3 5 7 11 15 23) d findBinaryIndex: [ :arg | 0.5 - arg ] do: [ :found | found ] ifNone: [ :a :b | ('between: ', {a. b} printString) ] #(1 3 5 7 11 15 23) findBinaryIndex: [ :arg | 25 - arg ] do: [ :found | found ] ifNone: [ :a :b | ('between: ',{a. b} printString) ] " | index low high test | low := 1. high := self size. [ high < low ] whileFalse: [ index := high + low // 2. (test := aBlock value: (self at: index)) < 0 ifTrue: [ high := index - 1 ] ifFalse: [ 0 < test ifTrue: [ low := index + 1 ] ifFalse: [ "test = 0" ^actionBlock value: index ] ] ]. ^exceptionBlock cull: high cull: low! ! !SequenceableCollection methodsFor: 'enumerating' stamp: 'ct 10/4/2020 15:47'! findBinaryIndex: aBlock ifNone: exceptionBlock "Search for an element in the receiver using binary search. The argument aBlock is a one-element block returning 0 - if the element is the one searched for; <0 - if the search should continue in the first half; >0 - if the search should continue in the second half. If no matching element is found, evaluate exceptionBlock, with the indexes of the 'bounding' elements as optional arguments. Warning: Might give invalid indexes. If aBlock performs expensive operations, also consider using #findDeltaIndex:ifNone: instead." ^self findBinaryIndex: aBlock do: [ :found | found ] ifNone: exceptionBlock! ! !SequenceableCollection methodsFor: 'enumerating' stamp: 'ct 10/4/2020 15:47'! findBinary: aBlock "Search for an element in the receiver using binary search. The argument aBlock is a one-element block returning 0 - if the element is the one searched for; <0 - if the search should continue in the first half; >0 - if the search should continue in the second half. If no matching element is found, raise an error. If aBlock performs expensive operations, also consider using #findDelta: instead. Example: #(1 3 5 7 11 15 23) findBinary: [ :arg | 11 <=> arg ] " ^self findBinary: aBlock do: [ :found | found ] ifNone: [ self errorNotFound: aBlock ]! ! !SequenceableCollection methodsFor: 'enumerating' stamp: 'ct 10/4/2020 15:47'! findBinary: aBlock ifNone: exceptionBlock "Search for an element in the receiver using binary search. The argument aBlock is a one-element block returning 0 - if the element is the one searched for; <0 - if the search should continue in the first half; >0 - if the search should continue in the second half. If no matching element is found, evaluate exceptionBlock, with the 'bounding' elements (or nil) as optional arguments. If aBlock performs expensive operations, also consider using #findDelta:ifNone: instead." ^self findBinary: aBlock do: [ :found | found ] ifNone: exceptionBlock! ! !SequenceableCollection methodsFor: 'enumerating' stamp: 'ct 10/4/2020 15:45'! findDelta: aBlock "Search for an element in the receiver using interpolation search with a linear interpolation function. The argument aBlock is a one-element block returning 0 - if the element is the one searched for; <0 - the distance to the searched value, if the search should continue in the first half; >0 - the distance to the searched, if the search should continue in the second half. Practical performance of interpolation search depends on whether the reduced number of probes is outweighed by the more complicated calculations needed for each probe. For more information, read the Wikipedia article (which the previous sentence was cited from). Example: #(1 3 5 7 11 15 23) findDelta: [ :arg | 11 - arg ] " ^ self findDelta: aBlock do: [ :found | found ] ifNone: [ self errorNotFound: aBlock ]! ! !SequenceableCollection methodsFor: 'enumerating' stamp: 'ct 10/4/2020 15:45'! findDelta: aBlock do: actionBlock ifNone: exceptionBlock "Search for an element in the receiver using interpolation search with a linear interpolation function. The argument aBlock is a one-element block returning 0 - if the element is the one searched for; <0 - the distance to the searched value, if the search should continue in the first half; >0 - the distance to the searched, if the search should continue in the second half. If found, evaluate actionBlock with the found element as argument. If no matching element is found, evaluate exceptionBlock, with the 'bounding' elements (or nil) as optional arguments. Practical performance of interpolation search depends on whether the reduced number of probes is outweighed by the more complicated calculations needed for each probe. For more information, read the Wikipedia article (which the previous sentence was cited from). Examples: #(1 3 5 7 11 15 23) findDelta: [ :arg | 11 - arg ] do: [ :found | found ] ifNone: [ :a :b | ('between: ', {a. b} printString) ] #(1 3 5 7 11 15 23) findDelta: [ :arg | 12 - arg ] do: [ :found | found ] ifNone: [ :a :b | ('between: ', {a. b} printString) ] #(1 3 5 7 11 15 23) findDelta: [ :arg | 0.5 - arg ] do: [ :found | found ] ifNone: [ :a :b | ('between: ', {a. b} printString) ] #(1 3 5 7 11 15 23) findDelta: [ :arg | 25 - arg ] do: [ :found | found ] ifNone: [ :a :b | ('between: ',{a. b} printString) ] " ^ self findDeltaIndex: aBlock do: [ :foundIndex | actionBlock value: (self at: foundIndex) ] ifNone: [ :prevIndex :nextIndex | exceptionBlock cull: (prevIndex > 0 ifTrue: [ self at: prevIndex ]) cull: (nextIndex <= self size ifTrue: [ self at: nextIndex ]) ]! ! !SequenceableCollection methodsFor: 'enumerating' stamp: 'ct 10/4/2020 15:45'! findDelta: aBlock ifNone: exceptionBlock "Search for an element in the receiver using interpolation search with a linear interpolation function. The argument aBlock is a one-element block returning 0 - if the element is the one searched for; <0 - the distance to the searched value, if the search should continue in the first half; >0 - the distance to the searched, if the search should continue in the second half. If no matching element is found, evaluate exceptionBlock, with the 'bounding' elements (or nil) as optional arguments. Practical performance of interpolation search depends on whether the reduced number of probes is outweighed by the more complicated calculations needed for each probe. For more information, read the Wikipedia article (which the previous sentence was cited from)." ^ self findDelta: aBlock do: [ :found | found ] ifNone: exceptionBlock! ! !SequenceableCollection methodsFor: 'enumerating' stamp: 'ct 10/4/2020 15:45'! findDeltaIndex: aBlock "Search for an element in the receiver using interpolation search with a linear interpolation function. The argument aBlock is a one-element block returning 0 - if the element is the one searched for; <0 - the distance to the searched value, if the search should continue in the first half; >0 - the distance to the searched, if the search should continue in the second half. If no matching element is found, raise an error. Warning: Might give invalid indexes. Practical performance of interpolation search depends on whether the reduced number of probes is outweighed by the more complicated calculations needed for each probe. For more information, read the Wikipedia article (which the previous sentence was cited from). Example: #(1 3 5 7 11 15 23) findDeltaIndex: [ :arg | 11 - arg ] " ^ self findDeltaIndex: aBlock do: [ :found | found ] ifNone: [ self errorNotFound: aBlock ]! ! !SequenceableCollection methodsFor: 'enumerating' stamp: 'ct 10/6/2020 13:52'! findDeltaIndex: aBlock do: actionBlock ifNone: exceptionBlock "Search for an element in the receiver using interpolation search with a linear interpolation function. The argument aBlock is a one-element block returning 0 - if the element is the one searched for; <0 - the distance to the searched value, if the search should continue in the first half; >0 - the distance to the searched, if the search should continue in the second half. If found, evaluate actionBlock with the index as argument. If no matching element is found, evaluate exceptionBlock, with the indexes of the 'bounding' elements as optional arguments. Warning: Might give invalid indexes, see examples below. Practical performance of interpolation search depends on whether the reduced number of probes is outweighed by the more complicated calculations needed for each probe. For more information, read the Wikipedia article (which the previous sentence was cited from). Examples: #(1 3 5 7 11 15 23) findDeltaIndex: [ :arg | 11 - arg ] do: [ :found | found ] ifNone: [ :a :b | ('between: ', {a. b} printString)] #(1 3 5 7 11 15 23) findDeltaIndex: [ :arg | 12 - arg ] do: [ :found | found ] ifNone: [ :a :b | ('between: ', {a. b} printString) ] #(1 3 5 7 11 15 23) d findDeltaIndex: [ :arg | 0.5 - arg ] do: [ :found | found ] ifNone: [ :a :b | ('between: ', {a. b} printString) ] #(1 3 5 7 11 15 23) findDeltaIndex: [ :arg | 25 - arg ] do: [ :found | found ] ifNone: [ :a :b | ('between: ',{a. b} printString) ] " | index low high delta | low := 1. high := self size. index := low + high // 2. [ index between: low and: high ] whileTrue: [ | range | index := ((delta := aBlock value: (self at: index)) < 0 ifTrue: [ high := index - 1. (range := (self at: index) - (self at: low)) = 0 ifTrue: [ high ] ifFalse: [ high + (high - low * delta // range) ] ] ifFalse: [ 0 < delta ifTrue: [ low := index + 1. (range := (self at: high) - (self at: index)) = 0 ifTrue: [ low ] ifFalse: [ low + (high - low * delta // range) ] ] ifFalse: [ "delta = 0" ^ actionBlock value: index ] ]) min: high max: low. ]. ^ exceptionBlock cull: high cull: low! ! !SequenceableCollection methodsFor: 'enumerating' stamp: 'ct 10/4/2020 15:45'! findDeltaIndex: aBlock ifNone: exceptionBlock "Search for an element in the receiver using interpolation search with a linear interpolation function. The argument aBlock is a one-element block returning 0 - if the element is the one searched for; <0 - the distance to the searched value, if the search should continue in the first half; >0 - the distance to the searched, if the search should continue in the second half. If no matching element is found, evaluate exceptionBlock, with the indexes of the 'bounding' elements as optional arguments. Warning: Might give invalid indexes. Practical performance of interpolation search depends on whether the reduced number of probes is outweighed by the more complicated calculations needed for each probe. For more information, read the Wikipedia article (which the previous sentence was cited from)." ^ self findDeltaIndex: aBlock do: [ :found | found ] ifNone: exceptionBlock! ! !SequenceableCollectionTest methodsFor: 'tests - enumerating' stamp: 'ct 10/2/2020 22:47'! testFindBinary | values | values := (1 to: 100) select: #isPrime. 1 to: 100 do: [:every | every isPrime ifTrue: [ self assert: every equals: ( values findBinary: [:each | every <=> each])] ifFalse: [ self should: [values findBinary: [:each | every <=> each]] raise: NotFound]].! ! !SequenceableCollectionTest methodsFor: 'tests - enumerating' stamp: 'ct 10/2/2020 22:48'! testFindBinaryDoIfNone | values | values := (1 to: 100) select: #isPrime. 1 to: 100 do: [:every | every isPrime ifTrue: [ self assert: every negated equals: (values findBinary: [:each | every <=> each] do: [:each | each negated] ifNone: [self fail])] ifFalse: [ self assert: self equals: (values findBinary: [:each | every <=> each] do: [self fail] ifNone: [self])]].! ! !SequenceableCollectionTest methodsFor: 'tests - enumerating' stamp: 'ct 10/2/2020 22:49'! testFindBinaryIfNone | values | values := (1 to: 100) select: #isPrime. 1 to: 100 do: [:every | every isPrime ifTrue: [ self assert: every equals: (values findBinary: [:each | every <=> each] ifNone: [self fail])] ifFalse: [ self assert: self equals: (values findBinary: [:each | every <=> each] ifNone: [self])]].! ! !SequenceableCollectionTest methodsFor: 'tests - enumerating' stamp: 'ct 10/2/2020 22:51'! testFindBinaryIndex | values | values := (1 to: 100) select: #isPrime. 1 to: 100 do: [:every | every isPrime ifTrue: [ self assert: (values indexOf: every) equals: ( values findBinaryIndex: [:each | every <=> each])] ifFalse: [ self should: [values findBinaryIndex: [:each | every <=> each]] raise: NotFound]].! ! !SequenceableCollectionTest methodsFor: 'tests - enumerating' stamp: 'ct 10/2/2020 22:52'! testFindBinaryIndexDoIfNone | values | values := (1 to: 100) select: #isPrime. 1 to: 100 do: [:every | every isPrime ifTrue: [ self assert: (values indexOf: every) negated equals: ((values findBinaryIndex: [:each | every <=> each] do: [:result | result negated] ifNone: [self fail]))] ifFalse: [ self assert: self equals: (values findBinaryIndex: [:each | every <=> each] do: [:result | self fail] ifNone: [self])]].! ! !SequenceableCollectionTest methodsFor: 'tests - enumerating' stamp: 'ct 10/2/2020 22:52'! testFindBinaryIndexIfNone | values | values := (1 to: 100) select: #isPrime. 1 to: 100 do: [:every | every isPrime ifTrue: [ self assert: (values indexOf: every) equals: (values findBinaryIndex: [:each | every <=> each] ifNone: [self fail])] ifFalse: [ self assert: self equals: (values findBinaryIndex: [:each | every <=> each] ifNone: [self])]].! ! !SequenceableCollectionTest methodsFor: 'tests - enumerating' stamp: 'ct 10/2/2020 23:03'! testFindDelta | values | values := (1 to: 100) select: #isPrime. 1 to: 100 do: [:every | every isPrime ifTrue: [ self assert: every equals: ( values findDelta: [:each | every - each])] ifFalse: [ self should: [values findDelta: [:each | every - each]] raise: NotFound]].! ! !SequenceableCollectionTest methodsFor: 'tests - enumerating' stamp: 'ct 10/3/2020 00:12'! testFindDeltaDoIfNone | values | values := (1 to: 100) select: #isPrime. 1 to: 100 do: [:every | every isPrime ifTrue: [ self assert: every negated equals: (values findDelta: [:each | every - each] do: [:each | each negated] ifNone: [self fail])] ifFalse: [ self assert: self equals: (values findDelta: [:each | every - each] do: [self fail] ifNone: [self])]].! ! !SequenceableCollectionTest methodsFor: 'tests - enumerating' stamp: 'ct 10/3/2020 00:13'! testFindDeltaIfNone | values | values := (1 to: 100) select: #isPrime. 1 to: 100 do: [:every | every isPrime ifTrue: [ self assert: every equals: (values findDelta: [:each | every - each] ifNone: [self fail])] ifFalse: [ self assert: self equals: (values findDelta: [:each | every - each] ifNone: [self])]].! ! !SequenceableCollectionTest methodsFor: 'tests - enumerating' stamp: 'ct 10/3/2020 00:13'! testFindDeltaIndex | values | values := (1 to: 100) select: #isPrime. 1 to: 100 do: [:every | every isPrime ifTrue: [ self assert: (values indexOf: every) equals: ( values findDeltaIndex: [:each | every - each])] ifFalse: [ self should: [values findDeltaIndex: [:each | every - each]] raise: NotFound]].! ! !SequenceableCollectionTest methodsFor: 'tests - enumerating' stamp: 'ct 10/3/2020 00:13'! testFindDeltaIndexDoIfNone | values | values := (1 to: 100) select: #isPrime. 1 to: 100 do: [:every | every isPrime ifTrue: [ self assert: (values indexOf: every) negated equals: ((values findDeltaIndex: [:each | every - each] do: [:result | result negated] ifNone: [self fail]))] ifFalse: [ self assert: self equals: (values findDeltaIndex: [:each | every - each] do: [:result | self fail] ifNone: [self])]].! ! !SequenceableCollectionTest methodsFor: 'tests - enumerating' stamp: 'ct 10/3/2020 00:14'! testFindDeltaIndexIfNone | values | values := (1 to: 100) select: #isPrime. 1 to: 100 do: [:every | every isPrime ifTrue: [ self assert: (values indexOf: every) equals: (values findDeltaIndex: [:each | every - each] ifNone: [self fail])] ifFalse: [ self assert: self equals: (values findDeltaIndex: [:each | every - each] ifNone: [self])]].! ! -------------- next part -------------- An HTML attachment was scrubbed... URL: -------------- next part -------------- An embedded and charset-unspecified text was scrubbed... Name: interpolation search.2.cs URL: From marcel.taeumel at hpi.de Tue Oct 6 12:32:17 2020 From: marcel.taeumel at hpi.de (Marcel Taeumel) Date: Tue, 6 Oct 2020 14:32:17 +0200 Subject: [squeak-dev] Overhead of SystemProgressMorph/#do:displayingProgress: is huge In-Reply-To: <88320e6951f147939dd02fb013008db1@student.hpi.uni-potsdam.de> References: <88320e6951f147939dd02fb013008db1@student.hpi.uni-potsdam.de> Message-ID: > Is this a new layout problem? :-) Showing visual progress is of course an overhead compared to not showing anything. The usual update rate is about 25 milliseconds? Hmmm... 11 vs. 18 seconds sounds reasonable given that you update the progress bar in this example about 400 times. This 7 second overhead amounts then to 17.5 milliseconds per update. Not good, right. Resizing my code browser from 500 to 1000 pixels in width takes about 4 milliseconds to re-layout -- but 36 milliseconds to re-layout and re-draw. Hmm.... We can improve those 17.5 milliseconds or increase the progress-bar update rate from 25 milliseconds to 200 milliseconds. :-) Best, Marcel Am 06.10.2020 13:37:00 schrieb Thiede, Christoph : [(1 to: 1000) do: [:i | 10 milliSeconds wait]] timeToRun. "--> 11758" [(1 to: 1000) do: [:i | 10 milliSeconds wait] displayingProgress: [:x | x asString]] timeToRun. "--> 18528" 18528 / 11758. "--> 1.57" In this example, in total, 3.9 seconds are spent in SystemProgressMorph(Morph) >> #updateDropShadowCache. I found out that in #setLayoutBoundsFromLayout:, the #dropShadow cache is cleared in every second iteration of the code from above! Why is bounds ~= outer? Is this a new layout problem? :-) Best, Christoph -------------- next part -------------- An HTML attachment was scrubbed... URL: From Christoph.Thiede at student.hpi.uni-potsdam.de Tue Oct 6 13:09:31 2020 From: Christoph.Thiede at student.hpi.uni-potsdam.de (Thiede, Christoph) Date: Tue, 6 Oct 2020 13:09:31 +0000 Subject: [squeak-dev] Overhead of SystemProgressMorph/#do:displayingProgress: is huge In-Reply-To: References: <88320e6951f147939dd02fb013008db1@student.hpi.uni-potsdam.de>, Message-ID: <052f3ca046c444fa99a73a3473871732@student.hpi.uni-potsdam.de> Hi Marcel, while doing a #do:displayingProgress: operation, nothing should be redrawn but the inner progress bar rectangle (and maybe the system clock), unless other morphs are changed at the same time, is this correct? In this case I do not understand why the dropShadow has to be recomputed within every draw cycle. Of 7.5 seconds in PasteUpMorph >> #displayWorld, my TimeProfileBrowser shows 5.3 seconds in #updateDropShadowCache. Sorry for the ugly screenshot: [cid:25f1bcc4-8b9c-4c0c-9328-1c08d3491e65] Apart from that, I think 10 fps would be enough, too, yes. Maybe we should reuse the selectionUpdateTime mechanism from Inspector if the displayDuring-aStringOrBlock block takes more time. :-) Best, Christoph ________________________________ Von: Squeak-dev im Auftrag von Taeumel, Marcel Gesendet: Dienstag, 6. Oktober 2020 14:32:17 An: squeak-dev Betreff: Re: [squeak-dev] Overhead of SystemProgressMorph/#do:displayingProgress: is huge > Is this a new layout problem? :-) Showing visual progress is of course an overhead compared to not showing anything. The usual update rate is about 25 milliseconds? Hmmm... 11 vs. 18 seconds sounds reasonable given that you update the progress bar in this example about 400 times. This 7 second overhead amounts then to 17.5 milliseconds per update. Not good, right. Resizing my code browser from 500 to 1000 pixels in width takes about 4 milliseconds to re-layout -- but 36 milliseconds to re-layout and re-draw. Hmm.... We can improve those 17.5 milliseconds or increase the progress-bar update rate from 25 milliseconds to 200 milliseconds. :-) Best, Marcel Am 06.10.2020 13:37:00 schrieb Thiede, Christoph : [(1 to: 1000) do: [:i | 10 milliSeconds wait]] timeToRun. "--> 11758" [(1 to: 1000) do: [:i | 10 milliSeconds wait] displayingProgress: [:x | x asString]] timeToRun. "--> 18528" 18528 / 11758. "--> 1.57" In this example, in total, 3.9 seconds are spent in SystemProgressMorph(Morph) >> #updateDropShadowCache. I found out that in #setLayoutBoundsFromLayout:, the #dropShadow cache is cleared in every second iteration of the code from above! Why is bounds ~= outer? Is this a new layout problem? :-) Best, Christoph -------------- next part -------------- An HTML attachment was scrubbed... URL: -------------- next part -------------- A non-text attachment was scrubbed... Name: pastedImage.png Type: image/png Size: 373109 bytes Desc: pastedImage.png URL: From marcel.taeumel at hpi.de Tue Oct 6 13:11:44 2020 From: marcel.taeumel at hpi.de (Marcel Taeumel) Date: Tue, 6 Oct 2020 15:11:44 +0200 Subject: [squeak-dev] Overhead of SystemProgressMorph/#do:displayingProgress: is huge In-Reply-To: <052f3ca046c444fa99a73a3473871732@student.hpi.uni-potsdam.de> References: <88320e6951f147939dd02fb013008db1@student.hpi.uni-potsdam.de> <,> <052f3ca046c444fa99a73a3473871732@student.hpi.uni-potsdam.de> Message-ID: Hmm... the progress morph's extent changes, thus the shadow is invalidated. Hmpf. Best, Marcel Am 06.10.2020 15:09:43 schrieb Thiede, Christoph : Hi Marcel, while doing a #do:displayingProgress: operation, nothing should be redrawn but the inner progress bar rectangle (and maybe the system clock), unless other morphs are changed at the same time, is this correct? In this case I do not understand why the dropShadow has to be recomputed within every draw cycle. Of 7.5 seconds in PasteUpMorph >> #displayWorld, my TimeProfileBrowser shows 5.3 seconds in #updateDropShadowCache.  Sorry for the ugly screenshot: Apart from that, I think 10 fps would be enough, too, yes. Maybe we should reuse the selectionUpdateTime mechanism from Inspector if the displayDuring-aStringOrBlock block takes more time. :-) Best, Christoph [http://www.hpi.de/] Von: Squeak-dev im Auftrag von Taeumel, Marcel Gesendet: Dienstag, 6. Oktober 2020 14:32:17 An: squeak-dev Betreff: Re: [squeak-dev] Overhead of SystemProgressMorph/#do:displayingProgress: is huge   > Is this a new layout problem? :-) Showing visual progress is of course an overhead compared to not showing anything. The usual update rate is about 25 milliseconds? Hmmm... 11 vs. 18 seconds sounds reasonable given that you update the progress bar in this example about 400 times. This 7 second overhead amounts then to 17.5 milliseconds per update. Not good, right. Resizing my code browser from 500 to 1000 pixels in width takes about 4 milliseconds to re-layout -- but 36 milliseconds to re-layout and re-draw. Hmm.... We can improve those 17.5 milliseconds or increase the progress-bar update rate from 25 milliseconds to 200 milliseconds. :-) Best, Marcel Am 06.10.2020 13:37:00 schrieb Thiede, Christoph : [(1 to: 1000) do: [:i | 10 milliSeconds wait]] timeToRun. "--> 11758" [(1 to: 1000) do: [:i | 10 milliSeconds wait] displayingProgress: [:x | x asString]] timeToRun. "--> 18528" 18528 / 11758. "--> 1.57" In this example, in total, 3.9 seconds are spent in SystemProgressMorph(Morph) >> #updateDropShadowCache. I found out that in #setLayoutBoundsFromLayout:, the #dropShadow cache is cleared in every second iteration of the code from above! Why is bounds ~= outer? Is this a new layout problem? :-) Best, Christoph -------------- next part -------------- An HTML attachment was scrubbed... URL: -------------- next part -------------- A non-text attachment was scrubbed... Name: pastedImage.png Type: image/png Size: 373109 bytes Desc: not available URL: From gettimothy at zoho.com Tue Oct 6 13:20:54 2020 From: gettimothy at zoho.com (gettimothy) Date: Tue, 06 Oct 2020 09:20:54 -0400 Subject: [squeak-dev] Development methodology (was: tedious        programming-in-the-debugger error needs fixing) In-Reply-To: <1601981278751-0.post@n4.nabble.com> References: <1601475775699-0.post@n4.nabble.com> <1601590406774-0.post@n4.nabble.com> <076817EE-1506-47F9-9AF4-3126C6D3BC76@rowledge.org> <1601860447473-0.post@n4.nabble.com> <025A3F5C-E26E-44C6-B19B-FBED361CE779@gmail.com> <174f8f5548b.e4c3e13b138475.8358330872058455280@zoho.com> <1601925526567-0.post@n4.nabble.com> <1601981278751-0.post@n4.nabble.com> Message-ID: <174fe126dc5.cc7ebadc193943.7050288176231897571@zoho.com> My opinion for what it us worth. I prefer the monticelloand I agree it should be kept as the core squeak repo for reasons Eliot has given; its very similar to the Slackware tgz ways of doing things. Easy peasy, consistent and routine* I see Jakob's git tool as a means to establish two way communication with the gitster userbase. The Roassal attempt uses it to get from git into squeak and then, hopefully into monticello for ease if installation. Call this the git-pull. Regarding the git-push from squeak to git, Eliot mentioned a git centric use-case recently that he noted was very convenient. Let me thow in my initial thioughts for squeakbooks.irg/doc/seasideDoc...each book will live in sqyeak as a class; its content can be built internally in squeak via a workspace, helpbrowser, (what are those old fangled books in the flaps? Can it handle that?). From squeak, we can commit to github and monticelli, keeping monticello the spine if the project. From the outreach perspective, some git-heads will prefer to clone, checkout, edit and commit entirely from Emacs** Count me in the keep monticello camp, and also count me in the outreach/facilitate camp. Frankly, I do not like git. I have learned it twice and forgotten it twice, now I am on relearn three for the Roassal effort. Cordially, *Slackware is a very conservative linux distro, their community has solved the "next cool thing" itch with Slackbuilds.org. Core Slackware stays lean and old school while Slackbuilds has the cutting edge stuff. A cool featyre of that site is that each package lists its dependencies as links to the required package . For example, here us Rasterman's ground breaking E16 wirh ine dependency https://slackbuilds.org/repository/14.2/desktop/e16/ While this one https://slackbuilds.org/repository/14.2/ham/wsjtx/ has 3 deps and the first dep has its deps...I find this model far easier to use than Metacello. Slackbuoilds is tarballs all the way down. Squeakbuilds can/ should be .mcz's all the way down abd That! Is Monticello, baby. Nite too that the drop down filters by version. The latest BabyIDE stuff would be solved with that. Couple that, with squeak-launcher that makes it easy to launch different squeak images wuth different VM's and you got yourself a user friendly sysrem. **cue Tim screaming.... ---- On Tue, 06 Oct 2020 06:47:58 -0400 christoph.thiede at student.hpi.uni-potsdam.de wrote ---- Hi all, looks like I'm a bit late back to this debate again, but it's very nice it is still going on! There are many arguments I wanted to tell but Jakob already explained all of them better than I could do. So just let me come back to some points: Mantis: I just took another look at bugs.squeak.org again, and I'm sorry but I still think that our community deserves a better bug tracking solution than this. It really looks old-fashioned and, from today's point of view, quite chaotic and confusing. And compared to something like GitHub, it does not give me an idea of how to report a bug. Do I have to log in? Which credentials do I need to use? Why is there no register button anywhere? Also, there must be some reason why the latest issue was submitted nearly two years ago. Is Mantis connected to the mailing list at all? Asking all of you who have used Mantis in past and reported newer bugs to the mailing list instead, why did you do that? I would guess because mails provid higher visibility and interactivity, is this correct? Phil, you called GitHub & Co. one trend of many that's durability is uncertain (correct me if I misunderstood you). I see this point, but looking at the current numbers I strongly believe that GitHub has reached a critical mass of developers and projects that won't move so quickly again. How many large global players have decided to use GitHub, including competitors of Microsoft itself such as Google, Apple, Facebook, etc.? At least, according to the trends GitHub is way more popular than SourceForge, for example, has ever been, actually, it has even overtaken git itself on Google Trends: https://trends.google.com/trends/explore?date=all&q=github,sourceforge,gitlab,bitbucket,slack (By the way, if you search any old threads you can also find it on web.archive.org in most cases). > Here you're showing you've already fallen behind: the github trend for > discussing things is already fading and those trendier than you have > already moved on to the next thing: Slack is where it's at! In a year or > two it will be something else... and the treadmill keeps going but not > really going anywhere. Slack is a group messenger used for communication in small to medium teams, but I can hardly imagine someone seriously uses this as a bug tracker for a large-scale software project with a big community, there is just too much noise when pressing Enter sends a new message. The same goes for social media platforms such as Google Plus that do not even offer basic tracking features such as closing or labeling. I don't think you can compare this. > Monticello ancestry does support branching, yet I think Monticello lacks > first-class objects for branches, with all the implications for repository > handling. +1. And I feel the lack of branches for about every second or third submission I make to the inbox and am forced to reinvent my one pseudo branch wheel. Git vs. GitHub vs. GitLab: As Jakob already mentioned, they're not the same. I believe that GitHub offers the largest range by far, but personally I would still consider it as an improvement to set up a self-hosted GitLab instance (actually, from a technical point of view, I think GitLab offers even more convenience features for free). But still, it's right what Eliot said about git and companies: > One gives up great autonomy when allowing ones core VCS to be in a foreign > system So why do you use git & GitHub for OpenSmalltalk-VM and not something like Monticello? Which leads me to my most important point which Uncle Bob from Jakob's linked talk above gives this striking name to: elitism. In plain theory, I would consider it as an ideal, too, to have a Smalltalk system in which you can literally control every bit (ultimately, this might be a Smalltalk computer with no separate host system, where all drivers etc. are written in Smalltalk - completely neglecting every question of optimization). But in reality, the Squeak community, or even the entire Smalltalk community, is a quite small community, and I would love to change this and make Squeak/Smalltalk competitive again for contemporary development tasks, which involves the mutual boosting between tools/frameworks and developers. And because we are quite small at this point, we have two alternative ways we could go: Either we can spend our time on reimplementing every good and relevant idea from the "real world" in Squeak and making ourself even more comfortable in our small niche (which is, as I'm convinced, already very comfortable in many terms, compared to most other languages and environments); or we can join our forces and focus for now on opening our system towards the real world, both in terms of solutions and people. Which one would you choose? > Yet in my opinion Squeak really needs to get along with the outside world > for the mutual benefit; we cannot afford to always reimplement everything > in Smalltalk just to be able to comfortably debug the issues we wouldn't > have if we had used something mature. +1000 Best, Christoph PS: And as a matter of course, I'm neither in the position nor willing to enforce any innovations that would deter some of our important community members from the Squeak Project. But I'm not giving up the hope that this discussion may reveal some more interesting insights about the desires and demands of us as a community. :-) -- Sent from: http://forum.world.st/Squeak-Dev-f45488.html -------------- next part -------------- An HTML attachment was scrubbed... URL: From eliot.miranda at gmail.com Tue Oct 6 14:16:38 2020 From: eliot.miranda at gmail.com (Eliot Miranda) Date: Tue, 6 Oct 2020 07:16:38 -0700 Subject: [squeak-dev] The Trunk: Tools-eem.992.mcz In-Reply-To: <3c425d1297144ed385f0faaccc2a30c0@student.hpi.uni-potsdam.de> References: <3c425d1297144ed385f0faaccc2a30c0@student.hpi.uni-potsdam.de> Message-ID: Hi Christoph, > On Oct 6, 2020, at 1:45 AM, Thiede, Christoph wrote: > >  > Hi Eliot, > > > > > - translating the 'all temp vars' and 'stack top' label > > > Translating is a really low-level operation because it appears everywhere in the system. I'm quite sure that these two calls in the inspector are only the tip of the iceberg. Wouldn't it be more sustainable, and also better readable in the inspectors' implementations, to implement such a cache somewhere in the #translated logic? If necessary, we could make it an LRU cache of an appropriate size, 16 or 32 entries might suffice. > > What do you think? Indeed I do. But I was desperate for better speed in the debugger. You have to realise that clicking furiously to advance the execution to get to where one wants to get to only to find it goes too far is horribly frustrating, as is having to click, watch, click watch, and have execution crawl. So mine was an attempt to lessen the problem without having to tackle the bigger issue if slow translation. I know the debugger and inspector hierarchy; I’ve never even looked at translation. If you have energy please do speed it up, and if it gets much faster feel Fred yo revert my changes. But the debugger *must* step faster than it is possible to click. > > Best, > Christoph > Von: Squeak-dev im Auftrag von commits at source.squeak.org > Gesendet: Freitag, 2. Oktober 2020 21:19:06 > An: squeak-dev at lists.squeakfoundation.org; packages at lists.squeakfoundation.org > Betreff: [squeak-dev] The Trunk: Tools-eem.992.mcz > > Eliot Miranda uploaded a new version of Tools to project The Trunk: > http://source.squeak.org/trunk/Tools-eem.992.mcz > > ==================== Summary ==================== > > Name: Tools-eem.992 > Author: eem > Time: 2 October 2020, 12:19:00.336286 pm > UUID: 20c2a45a-e258-4a02-9e37-10ffc085290b > Ancestors: Tools-eem.991 > > Go some way to speed up stepping in the debugger. Two of the identified costs are > - scanning the method to produce its method/block start keys to block extents map > - translating the 'all temp vars' and 'stack top' label > With these two cached streaming and emphasizing the temp vars in a ContextInspector is now really fast (less than a millisecond). But stepping is still not fast enlough; one can easily click the mouse faster than step can keep up. So we have more analysis to do. > > Do futher clean up of DebuggerMethodMap in having it cache its startKeysToBlockExtents. Delete the obsolete privateTempAt:... methods that expect startpcsToBlockExtents:.Move all the scanning machinery from CompiledMethod into DebuggerMethodMap. > > =============== Diff against Tools-eem.991 =============== > > Item was changed: > Inspector subclass: #ContextInspector > instanceVariableNames: '' > + classVariableNames: 'CachedStackTopLabel CachedTempVarsLabel CurrentLocale' > - classVariableNames: '' > poolDictionaries: '' > category: 'Tools-Inspector'! > > !ContextInspector commentStamp: 'ct 1/12/2020 15:26' prior: 0! > I am an Inspector that is specialized for inspecting Contexts.! > > Item was added: > + ----- Method: ContextInspector>>allTempVarsTranslated (in category 'private') ----- > + allTempVarsTranslated > + "Alas translation is slow enough that we notice the slow down in trying to step in the debugger..." > + (CurrentLocale ~= Locale current > + or: [CachedTempVarsLabel isNil]) ifTrue: > + [CurrentLocale := Locale current. > + CachedTempVarsLabel := 'all temp vars' translated]. > + ^CachedTempVarsLabel! > > Item was added: > + ----- Method: ContextInspector>>stackTopTranslated (in category 'private') ----- > + stackTopTranslated > + "Alas translation is slow enough that we notice the slow down in trying to step in the debugger..." > + (CurrentLocale ~= Locale current > + or: [CachedTempVarsLabel isNil]) ifTrue: > + [CurrentLocale := Locale current. > + CachedStackTopLabel := 'stack top' translated]. > + ^CachedStackTopLabel! > > Item was changed: > ----- Method: ContextVariablesInspector>>fieldAllTempVars (in category 'fields') ----- > fieldAllTempVars > > ^ (self newFieldForType: #all key: #allTempVars) > + name: self allTempVarsTranslated; emphasizeName; > - name: 'all temp vars' translated; emphasizeName; > valueGetter: [:object | object tempsAndValues]; printValueAsIs; > yourself! > > Item was changed: > ----- Method: ContextVariablesInspector>>fieldStackTop (in category 'fields') ----- > fieldStackTop > > ^ (self newFieldForType: #stackTop key: #stackTop) > + name: self stackTopTranslated; emphasizeName; > - name: 'stack top' translated; emphasizeName; > valueGetter: [:context | context top]; > valueGetterExpression: 'ThisContext top'; > yourself! > > Item was changed: > Object subclass: #DebuggerMethodMap > + instanceVariableNames: 'timestamp methodReference methodNode startKeysToBlockExtents abstractSourceRanges sortedSourceMap' > - instanceVariableNames: 'timestamp methodReference methodNode abstractSourceRanges sortedSourceMap' > classVariableNames: 'AccessLock MapCache MapCacheEntries' > poolDictionaries: '' > category: 'Tools-Debugger'! > > !DebuggerMethodMap commentStamp: 'eem 10/1/2020 19:08' prior: 0! > I am a place-holder for information needed by the Debugger to inspect method activations. I insulate the debugger from details of code generation such as exact bytecode offsets and temporary variable locations. I have two concrete subclasses, one for methods where block bytecodes are embedded in the home method and one for methods where blocks are separate objects (CompiledBlock). These classes deal with temporary variable access. My function is to abstract the source map away from actual bytecode pcs to abstract bytecode pcs. I used to have a subclass for "BlueBook" compiled methods, with non-closure blocks, but this was removed in October 2020 for simplicity's sake. > > To reduce compilation time I try and defer as much computation to access time as possible as instances of me will be created after each compilation. > > I maintain a WeakIdentityDictionary of method to DebuggerMethodMap to cache maps. I refer to my method through a WeakArray to keep the map cache functional. If the reference from a DebuggerMethodMap to its method were strong then the method would never be dropped from the cache because the reference from its map would keep it alive.! > > Item was added: > + ----- Method: DebuggerMethodMap>>blockExtentsInto:from:to:method:numberer: (in category 'private') ----- > + blockExtentsInto: aDictionary from: initialPC to: endPC method: method numberer: numbererBlock > + "Support routine for startpcsToBlockExtents" > + | pcs extentStart locator scanner blockSizeOrMethodOrLocator | > + extentStart := numbererBlock value. > + locator := BlockStartLocator new. > + scanner := InstructionStream new method: method pc: initialPC. > + pcs := OrderedCollection new. > + [pcs addLast: scanner pc. > + scanner pc <= endPC] whileTrue: > + [blockSizeOrMethodOrLocator := scanner interpretNextInstructionFor: locator. > + blockSizeOrMethodOrLocator ~~ locator ifTrue: > + [blockSizeOrMethodOrLocator isInteger > + ifTrue: > + [self > + blockExtentsInto: aDictionary > + from: scanner pc > + to: scanner pc + blockSizeOrMethodOrLocator - 1 > + method: method > + numberer: numbererBlock. > + scanner pc: scanner pc + blockSizeOrMethodOrLocator] > + ifFalse: > + [self assert: blockSizeOrMethodOrLocator isCompiledBlock. > + self > + blockExtentsInto: aDictionary > + from: blockSizeOrMethodOrLocator initialPC > + to: blockSizeOrMethodOrLocator endPC > + method: blockSizeOrMethodOrLocator > + numberer: numbererBlock]]]. > + aDictionary > + at: (method isCompiledBlock > + ifTrue: [method] > + ifFalse: [initialPC]) > + put: (extentStart to: numbererBlock value). > + ^aDictionary! > > Item was changed: > ----- Method: DebuggerMethodMap>>namedTempAt:in: (in category 'accessing') ----- > namedTempAt: index in: aContext > "Answer the value of the temp at index in aContext where index is relative > to the array of temp names answered by tempNamesForContext:" > + self assert: aContext method homeMethod == self method. > ^self > privateTempAt: index > in: aContext > + startKeysToBlockExtents: self startKeysToBlockExtents! > - startKeysToBlockExtents: aContext method startKeysToBlockExtents! > > Item was changed: > ----- Method: DebuggerMethodMap>>namedTempAt:put:in: (in category 'accessing') ----- > namedTempAt: index put: aValue in: aContext > "Assign the value of the temp at index in aContext where index is relative > to the array of temp names answered by tempNamesForContext:. > If the value is a copied value we also need to set it along the lexical chain." > + self assert: aContext method homeMethod == self method. > ^self > privateTempAt: index > in: aContext > put: aValue > + startKeysToBlockExtents: self startKeysToBlockExtents! > - startKeysToBlockExtents: aContext method startKeysToBlockExtents! > > Item was changed: > ----- Method: DebuggerMethodMap>>rangeForPC:in:contextIsActiveContext: (in category 'source mapping') ----- > rangeForPC: contextsConcretePC in: method contextIsActiveContext: contextIsActiveContext > "Answer the indices in the source code for the supplied pc. > If the context is the actve context (is at the hot end of the stack) > then its pc is the current pc. But if the context isn't, because it is > suspended sending a message, then its current pc is the previous pc." > > + | pc abstractMap i end | > - | pc i end | > pc := method abstractPCForConcretePC: (contextIsActiveContext > ifTrue: [contextsConcretePC] > ifFalse: [(method pcPreviousTo: contextsConcretePC) > ifNotNil: [:prevpc| prevpc] > ifNil: [contextsConcretePC]]). > + abstractMap := self abstractSourceMapForMethod: method. > + (abstractMap includesKey: pc) ifTrue: > + [^abstractMap at: pc]. > - (self abstractSourceMap includesKey: pc) ifTrue: > - [^self abstractSourceMap at: pc]. > sortedSourceMap ifNil: > + [sortedSourceMap := abstractMap associations > - [sortedSourceMap := self abstractSourceMap associations > replace: [ :each | each copy ]; > sort]. > sortedSourceMap isEmpty ifTrue: [^1 to: 0]. > i := sortedSourceMap findNearbyBinaryIndex: [:assoc| pc - assoc key]. > i < 1 ifTrue: [^1 to: 0]. > i > sortedSourceMap size ifTrue: > [end := sortedSourceMap inject: 0 into: > [:prev :this | prev max: this value last]. > ^end+1 to: end]. > ^(sortedSourceMap at: i) value > > "| method source scanner map | > method := DebuggerMethodMap compiledMethodAt: #rangeForPC:in:contextIsActiveContext:. > source := method getSourceFromFile asString. > scanner := InstructionStream on: method. > map := method debuggerMap. > Array streamContents: > [:ranges| > [scanner atEnd] whileFalse: > [| range | > range := map rangeForPC: scanner pc in: method contextIsActiveContext: true. > ((map abstractSourceMap includesKey: scanner abstractPC) > and: [range first ~= 0]) ifTrue: > [ranges nextPut: (source copyFrom: range first to: range last)]. > scanner interpretNextInstructionFor: InstructionClient new]]"! > > Item was added: > + ----- Method: DebuggerMethodMap>>startKeysToBlockExtents (in category 'private') ----- > + startKeysToBlockExtents > + "Answer the map from start keys (either start pcs for embedded closures, or > + full block methods for full blocks) to the block extents in that method, where > + a block extent is an abstract representation of block nesting within a method." > + > + startKeysToBlockExtents ifNil: > + [| index method | > + index := 0. > + method := self method homeMethod. > + startKeysToBlockExtents := > + self > + blockExtentsInto: self newBlockStartMap > + from: method initialPC > + to: method endPC > + method: method > + numberer: [| value | value := index. index := index + 2. value]]. > + ^startKeysToBlockExtents! > > Item was changed: > ----- Method: DebuggerMethodMap>>tempNamesForContext: (in category 'accessing') ----- > tempNamesForContext: aContext > "Answer an Array of all the temp names in scope in aContext starting with > the home's first local (the first argument or first temporary if no arguments)." > + self assert: aContext method homeMethod == self method. > ^(self > privateTempRefsForContext: aContext > + startKeysToBlockExtents: self startKeysToBlockExtents) collect: > - startKeysToBlockExtents: aContext method startKeysToBlockExtents) collect: > [:pair| pair first]! > > Item was changed: > ----- Method: DebuggerMethodMap>>tempNamesForMethod: (in category 'accessing') ----- > tempNamesForMethod: aMethod > "Answer an Array of all the temp names in scope in aMethod starting with > the home's first local (the first argument or first temporary if no arguments)." > + self assert: aMethod homeMethod == self method. > ^(self > privateTempRefsForMethod: aMethod > + startKeysToBlockExtents: self startKeysToBlockExtents) collect: > - startKeysToBlockExtents: aMethod startKeysToBlockExtents) collect: > [:pair| pair first]! > > Item was added: > + ----- Method: DebuggerMethodMapForClosureCompiledMethods>>newBlockStartMap (in category 'private') ----- > + newBlockStartMap > + "If blocks are embedded then keys in the map are simple integer pcs and a Dictionary can be used. > + If blocks are full (separate method objects) then keys in the map are CompiledBlocks and > + IdentityDictionary must be used to avoid confusing blocks with identical code." > + ^Dictionary new! > > Item was removed: > - ----- Method: DebuggerMethodMapForClosureCompiledMethods>>privateTempAt:in:put:startpcsToBlockExtents: (in category 'private but obsolete') ----- > - privateTempAt: index in: aContext put: aValue startpcsToBlockExtents: theContextsStartpcsToBlockExtents > - | nameRefPair | > - nameRefPair := (self privateTempRefsForContext: aContext > - startpcsToBlockExtents: theContextsStartpcsToBlockExtents) > - at: index > - ifAbsent: [aContext errorSubscriptBounds: index]. > - ^self privateDereference: nameRefPair last in: aContext put: aValue! > > Item was removed: > - ----- Method: DebuggerMethodMapForClosureCompiledMethods>>privateTempAt:in:startpcsToBlockExtents: (in category 'private but obsolete') ----- > - privateTempAt: index in: aContext startpcsToBlockExtents: theContextsStartpcsToBlockExtents > - | nameRefPair | > - nameRefPair := (self privateTempRefsForContext: aContext > - startpcsToBlockExtents: theContextsStartpcsToBlockExtents) > - at: index > - ifAbsent: [aContext errorSubscriptBounds: index]. > - ^self privateDereference: nameRefPair last in: aContext! > > Item was changed: > ----- Method: DebuggerMethodMapForClosureCompiledMethods>>privateTempRefsForContext:startKeysToBlockExtents: (in category 'private') ----- > privateTempRefsForContext: aContext startKeysToBlockExtents: theContextsStartKeysToBlockExtents > "Answer the sequence of temps in scope in aContext in the natural order, > outermost arguments and temporaries first, innermost last. Each temp is > a pair of the temp's name followed by a reference. The reference can be > integer - index of temp in aContext > #( indirectionVectorIndex tempIndex ) - remote temp in indirectionVector at index in aContext > #( outer. temp reference ) - a temp reference in an outer context." > blockExtentsToTempRefs ifNil: > [blockExtentsToTempRefs := (aContext method holdsTempNames > ifTrue: [aContext method] > ifFalse: [methodNode]) blockExtentsToTempsMap. > blockExtentsToTempRefs > ifNil: ["an empty method. shouldn't be able to step into here but it > can happen in weird circumstances (i.e. with MethodWrapper)." > blockExtentsToTempRefs := Dictionary new. > blockExtentsToTempRefs > at: (theContextsStartKeysToBlockExtents at: aContext startKey) > put: {}] > ifNotNil: > [(blockExtentsToTempRefs isKindOf: IdentityDictionary) ifTrue: > [blockExtentsToTempRefs := Dictionary withAll: blockExtentsToTempRefs associations]]. > + startKeysToTempRefs := self newBlockStartMap]. > - startKeysToTempRefs := aContext home method newBlockStartMap]. > ^startKeysToTempRefs > at: aContext startKey > ifAbsentPut: > [| localRefs | > localRefs := blockExtentsToTempRefs at: (theContextsStartKeysToBlockExtents at: aContext startKey) ifAbsent: [#()]. > aContext outerContext > ifNil: [localRefs] > ifNotNil: > [:outer| | outerTemps | > "Present temps in the order outermost to innermost left-to-right, but replace > copied outermost temps with their innermost copies" > outerTemps := (self > privateTempRefsForContext: outer > startKeysToBlockExtents: theContextsStartKeysToBlockExtents) collect: > [:outerPair| > localRefs > detect: [:localPair| outerPair first = localPair first] > ifNone: [{ outerPair first. { #outer. outerPair last } }]]. > outerTemps, > (localRefs reject: [:localPair| outerTemps anySatisfy: [:outerPair| localPair first = outerPair first]])]]! > > Item was removed: > - ----- Method: DebuggerMethodMapForClosureCompiledMethods>>privateTempRefsForContext:startpcsToBlockExtents: (in category 'private but obsolete') ----- > - privateTempRefsForContext: aContext startpcsToBlockExtents: theContextsStartpcsToBlockExtents > - "Answer the sequence of temps in scope in aContext in the natural order, > - outermost arguments and temporaries first, innermost last. Each temp is > - a pair of the temp's name followed by a reference. The reference can be > - integer - index of temp in aContext > - #( indirectionVectorIndex tempIndex ) - remote temp in indirectionVector at index in aContext > - #( outer. temp reference ) - a temp reference in an outer context." > - blockExtentsToTempRefs ifNil: > - [blockExtentsToTempRefs := (aContext method holdsTempNames > - ifTrue: [aContext method] > - ifFalse: [methodNode]) blockExtentsToTempsMap. > - blockExtentsToTempRefs ifNil: > - ["an empty method. shouldn't be able to step into here but it > - can happen in weird circumstances (i.e. with MethodWrapper)." > - blockExtentsToTempRefs := Dictionary new. > - blockExtentsToTempRefs > - at: (theContextsStartpcsToBlockExtents at: aContext startpc) > - put: {}]. > - startpcsToTempRefs := Dictionary new]. > - ^startpcsToTempRefs > - at: aContext startpc > - ifAbsentPut: > - [| localRefs | > - localRefs := blockExtentsToTempRefs at: (theContextsStartpcsToBlockExtents at: aContext startpc). > - aContext outerContext > - ifNil: [localRefs] > - ifNotNil: > - [:outer| | outerTemps | > - "Present temps in the order outermost to innermost left-to-right, but replace > - copied outermost temps with their innermost copies" > - outerTemps := (self > - privateTempRefsForContext: outer > - startpcsToBlockExtents: theContextsStartpcsToBlockExtents) collect: > - [:outerPair| > - localRefs > - detect: [:localPair| outerPair first = localPair first] > - ifNone: [{ outerPair first. { #outer. outerPair last } }]]. > - outerTemps, > - (localRefs reject: [:localPair| outerTemps anySatisfy: [:outerPair| localPair first = outerPair first]])]]! > > Item was removed: > - ----- Method: DebuggerMethodMapForClosureCompiledMethods>>privateTempRefsForMethod:startpcsToBlockExtents: (in category 'private but obsolete') ----- > - privateTempRefsForMethod: method startpcsToBlockExtents: startpcsToBlockExtents > - "Answer the sequence of temps in scope in method in the natural order, > - outermost arguments and temporaries first, innermost last. Each temp is > - a pair of the temp's name followed by a reference. The reference can be > - integer - index of temp in aContext > - #( indirectionVectorIndex tempIndex ) - remote temp in indirectionVector at index in aContext > - #( outer. temp reference ) - a temp reference in an outer context." > - blockExtentsToTempRefs ifNil: > - [blockExtentsToTempRefs := (method holdsTempNames > - ifTrue: [method] > - ifFalse: [methodNode]) blockExtentsToTempsMap. > - blockExtentsToTempRefs ifNil: > - ["an empty method. shouldn't be able to step into here but it > - can happen in weird circumstances (i.e. with MethodWrapper)." > - blockExtentsToTempRefs := Dictionary new. > - blockExtentsToTempRefs > - at: (startpcsToBlockExtents at: method initialPC) > - put: {}]. > - startpcsToTempRefs := Dictionary new]. > - ^startpcsToTempRefs > - at: method initialPC > - ifAbsentPut: > - [blockExtentsToTempRefs at: (startpcsToBlockExtents at: method initialPC)]! > > Item was added: > + ----- Method: DebuggerMethodMapForFullBlockCompiledMethods>>newBlockStartMap (in category 'private') ----- > + newBlockStartMap > + "If blocks are embedded then keys in the map are simple integer pcs and a Dictionary can be used. > + If blocks are full (separate method objects) then keys in the map are CompiledBlocks and > + IdentityDictionary must be used to avoid confusing blocks with identical code." > + ^WeakIdentityKeyDictionary new! > > > -------------- next part -------------- An HTML attachment was scrubbed... URL: From Christoph.Thiede at student.hpi.uni-potsdam.de Tue Oct 6 14:35:51 2020 From: Christoph.Thiede at student.hpi.uni-potsdam.de (Thiede, Christoph) Date: Tue, 6 Oct 2020 14:35:51 +0000 Subject: [squeak-dev] Overhead of SystemProgressMorph/#do:displayingProgress: is huge In-Reply-To: References: <88320e6951f147939dd02fb013008db1@student.hpi.uni-potsdam.de> <, > <052f3ca046c444fa99a73a3473871732@student.hpi.uni-potsdam.de>, Message-ID: Hi Marcel, actually, the visible progress morph's extent seems not to change. However, during the #extent: call, it is every time changed but after the layout is recomputed, the value is changed back. Unfortunately, at this time the dropShadow cache has already been cleared ... Can we move that "self removeProperty: #dropShadow" statement from Morph >> #extent: to some deferred point, maybe #doLayoutIn:? Or add a second property, #dropShadowBounds, and invalidate the cache when looking it up only? Best, Christoph ________________________________ Von: Squeak-dev im Auftrag von Taeumel, Marcel Gesendet: Dienstag, 6. Oktober 2020 15:11:44 An: squeak-dev Betreff: Re: [squeak-dev] Overhead of SystemProgressMorph/#do:displayingProgress: is huge Hmm... the progress morph's extent changes, thus the shadow is invalidated. Hmpf. Best, Marcel Am 06.10.2020 15:09:43 schrieb Thiede, Christoph : Hi Marcel, while doing a #do:displayingProgress: operation, nothing should be redrawn but the inner progress bar rectangle (and maybe the system clock), unless other morphs are changed at the same time, is this correct? In this case I do not understand why the dropShadow has to be recomputed within every draw cycle. Of 7.5 seconds in PasteUpMorph >> #displayWorld, my TimeProfileBrowser shows 5.3 seconds in #updateDropShadowCache. Sorry for the ugly screenshot: [cid:25f1bcc4-8b9c-4c0c-9328-1c08d3491e65] Apart from that, I think 10 fps would be enough, too, yes. Maybe we should reuse the selectionUpdateTime mechanism from Inspector if the displayDuring-aStringOrBlock block takes more time. :-) Best, Christoph ________________________________ Von: Squeak-dev im Auftrag von Taeumel, Marcel Gesendet: Dienstag, 6. Oktober 2020 14:32:17 An: squeak-dev Betreff: Re: [squeak-dev] Overhead of SystemProgressMorph/#do:displayingProgress: is huge > Is this a new layout problem? :-) Showing visual progress is of course an overhead compared to not showing anything. The usual update rate is about 25 milliseconds? Hmmm... 11 vs. 18 seconds sounds reasonable given that you update the progress bar in this example about 400 times. This 7 second overhead amounts then to 17.5 milliseconds per update. Not good, right. Resizing my code browser from 500 to 1000 pixels in width takes about 4 milliseconds to re-layout -- but 36 milliseconds to re-layout and re-draw. Hmm.... We can improve those 17.5 milliseconds or increase the progress-bar update rate from 25 milliseconds to 200 milliseconds. :-) Best, Marcel Am 06.10.2020 13:37:00 schrieb Thiede, Christoph : [(1 to: 1000) do: [:i | 10 milliSeconds wait]] timeToRun. "--> 11758" [(1 to: 1000) do: [:i | 10 milliSeconds wait] displayingProgress: [:x | x asString]] timeToRun. "--> 18528" 18528 / 11758. "--> 1.57" In this example, in total, 3.9 seconds are spent in SystemProgressMorph(Morph) >> #updateDropShadowCache. I found out that in #setLayoutBoundsFromLayout:, the #dropShadow cache is cleared in every second iteration of the code from above! Why is bounds ~= outer? Is this a new layout problem? :-) Best, Christoph -------------- next part -------------- An HTML attachment was scrubbed... URL: -------------- next part -------------- A non-text attachment was scrubbed... Name: pastedImage.png Type: image/png Size: 373109 bytes Desc: pastedImage.png URL: From marcel.taeumel at hpi.de Tue Oct 6 14:39:44 2020 From: marcel.taeumel at hpi.de (Marcel Taeumel) Date: Tue, 6 Oct 2020 16:39:44 +0200 Subject: [squeak-dev] Overhead of SystemProgressMorph/#do:displayingProgress: is huge In-Reply-To: References: <88320e6951f147939dd02fb013008db1@student.hpi.uni-potsdam.de> <,> <052f3ca046c444fa99a73a3473871732@student.hpi.uni-potsdam.de> <,> Message-ID: Hi Christoph, try to get rid of that extra send of #extent: with bogus values. > Can we move that "self removeProperty: #dropShadow" statement from Morph >> #extent: to some deferred point, maybe #doLayoutIn:? Or add a second property, #dropShadowBounds, and invalidate the cache when looking it up only? Doesn't sound like a good idea. I would focus on that extra send of #extent: that has strange values. Best, Marcel Am 06.10.2020 16:36:05 schrieb Thiede, Christoph : Hi Marcel, actually, the visible progress morph's extent seems not to change. However, during  the #extent: call, it is every time changed but after the layout is recomputed, the value is changed back. Unfortunately, at this time the dropShadow cache has already been cleared ... Can we move that "self removeProperty: #dropShadow" statement from Morph >> #extent: to some deferred point, maybe #doLayoutIn:? Or add a second property, #dropShadowBounds, and invalidate the cache when looking it up only? Best, Christoph [http://www.hpi.de/] Von: Squeak-dev im Auftrag von Taeumel, Marcel Gesendet: Dienstag, 6. Oktober 2020 15:11:44 An: squeak-dev Betreff: Re: [squeak-dev] Overhead of SystemProgressMorph/#do:displayingProgress: is huge   Hmm... the progress morph's extent changes, thus the shadow is invalidated. Hmpf. Best, Marcel Am 06.10.2020 15:09:43 schrieb Thiede, Christoph : Hi Marcel, while doing a #do:displayingProgress: operation, nothing should be redrawn but the inner progress bar rectangle (and maybe the system clock), unless other morphs are changed at the same time, is this correct? In this case I do not understand why the dropShadow has to be recomputed within every draw cycle. Of 7.5 seconds in PasteUpMorph >> #displayWorld, my TimeProfileBrowser shows 5.3 seconds in #updateDropShadowCache.  Sorry for the ugly screenshot: Apart from that, I think 10 fps would be enough, too, yes. Maybe we should reuse the selectionUpdateTime mechanism from Inspector if the displayDuring-aStringOrBlock block takes more time. :-) Best, Christoph [http://www.hpi.de/] Von: Squeak-dev im Auftrag von Taeumel, Marcel Gesendet: Dienstag, 6. Oktober 2020 14:32:17 An: squeak-dev Betreff: Re: [squeak-dev] Overhead of SystemProgressMorph/#do:displayingProgress: is huge   > Is this a new layout problem? :-) Showing visual progress is of course an overhead compared to not showing anything. The usual update rate is about 25 milliseconds? Hmmm... 11 vs. 18 seconds sounds reasonable given that you update the progress bar in this example about 400 times. This 7 second overhead amounts then to 17.5 milliseconds per update. Not good, right. Resizing my code browser from 500 to 1000 pixels in width takes about 4 milliseconds to re-layout -- but 36 milliseconds to re-layout and re-draw. Hmm.... We can improve those 17.5 milliseconds or increase the progress-bar update rate from 25 milliseconds to 200 milliseconds. :-) Best, Marcel Am 06.10.2020 13:37:00 schrieb Thiede, Christoph : [(1 to: 1000) do: [:i | 10 milliSeconds wait]] timeToRun. "--> 11758" [(1 to: 1000) do: [:i | 10 milliSeconds wait] displayingProgress: [:x | x asString]] timeToRun. "--> 18528" 18528 / 11758. "--> 1.57" In this example, in total, 3.9 seconds are spent in SystemProgressMorph(Morph) >> #updateDropShadowCache. I found out that in #setLayoutBoundsFromLayout:, the #dropShadow cache is cleared in every second iteration of the code from above! Why is bounds ~= outer? Is this a new layout problem? :-) Best, Christoph -------------- next part -------------- An HTML attachment was scrubbed... URL: -------------- next part -------------- A non-text attachment was scrubbed... Name: pastedImage.png Type: image/png Size: 373109 bytes Desc: not available URL: From pbpublist at gmail.com Tue Oct 6 15:12:38 2020 From: pbpublist at gmail.com (Phil B) Date: Tue, 6 Oct 2020 11:12:38 -0400 Subject: [squeak-dev] Development methodology (was: tedious        programming-in-the-debugger error needs fixing) In-Reply-To: <1601981278751-0.post@n4.nabble.com> References: <1601475775699-0.post@n4.nabble.com> <1601590406774-0.post@n4.nabble.com> <076817EE-1506-47F9-9AF4-3126C6D3BC76@rowledge.org> <1601860447473-0.post@n4.nabble.com> <025A3F5C-E26E-44C6-B19B-FBED361CE779@gmail.com> <174f8f5548b.e4c3e13b138475.8358330872058455280@zoho.com> <1601925526567-0.post@n4.nabble.com> <1601981278751-0.post@n4.nabble.com> Message-ID: Christoph, On Tue, Oct 6, 2020 at 6:48 AM Christoph Thiede < christoph.thiede at student.hpi.uni-potsdam.de> wrote: > Phil, you called GitHub & Co. one trend of many that's durability is > uncertain (correct me if I misunderstood you). I see this point, but > looking > at the current numbers I strongly believe that GitHub has reached a > critical > mass of developers and projects that won't move so quickly again. How many > large global players have decided to use GitHub, including competitors of > Microsoft itself such as Google, Apple, Facebook, etc.? > You can always switch from github to gitlab to some other 3rd party to self hosted which is key. If that weren't an option, I think there's about a 0% chance most of us would be using github as the entire conversation about migrating would have been a non-starter. Separate git from github. I don't doubt the durability of git as a VCS, github is just a convenient server implementation. As nice as github is, I believe the open source world flocked to github because of its underlying use of git rather than github itself. I do very much doubt the durability of github issues, especially given github's corporate ownership. As has been shown repeatedly over the decades, if Microsoft (like any other for-profit entity) decides it's in their best interest to deprecate/migrate this functionality to something else (say a Teams-centric solution or whatever) they *will* leave people who don't want to migrate high and dry or left with some semi-functional solution that tries to push them into a commercial offering. Since it's a proprietary solution, Smalltalk users would be stuck in that scenario if they become dependent on it. The majority of projects I follow that existed pre-github migrated to github with one eye on the door (i.e. 'what will we do if github ever shuts down free access or otherwise does something anti-open source?') and are very reluctant to embrace github issues for that reason: it makes leaving harder should the situation change. The smart move is to remain skeptical and keep your options open given how many different times and ways this has played out badly in the past. There have been numerous times in the past when 'everyone' (esp. major companies) flocked to things because they had achieved critical mass and weren't ever going to go away. Visual Basic and Java come to mind. SourceForge used to be that type of solution for a number of open source projects and see how well that turned out. > At least, according to the trends GitHub is way more popular than > SourceForge, for example, has ever been, actually, it has even overtaken > git > itself on Google Trends: > > https://trends.google.com/trends/explore?date=all&q=github,sourceforge,gitlab,bitbucket,slack Popularity is fleeting. Notice how that red line (SourceForge popularity) comes in on the left? (which probably also represent the years it was in decline, BTW) For the first 5 years of that graph one could have made the argument 'look how popular SourceForge is, we should be using it' (oh boy, did people make that argument back then!)... it's a bad metric to base decisions on. > > > (By the way, if you search any old threads you can also find it on > web.archive.org in most cases). > A truly awful solution only viable if you've bought into the 'it's never going to go away' line of thinking and then it does. > > > Here you're showing you've already fallen behind: the github trend for > > discussing things is already fading and those trendier than you have > > already moved on to the next thing: Slack is where it's at! In a year > or > > two it will be something else... and the treadmill keeps going but not > > really going anywhere. > > Slack is a group messenger used for communication in small to medium teams, > but I can hardly imagine someone seriously uses this as a bug tracker for a > large-scale software project with a big community, there is just too much > noise when pressing Enter sends a new message. The same goes for social > media platforms such as Google Plus that do not even offer basic tracking > features such as closing or labeling. I don't think you can compare this. > I don't disagree re: Slack but I've seen plenty of younger people not care: they want to use Slack because it's what they know. That's basically your argument for Squeak to use github issues: that's what you, and people in your peer group, know and use.[1] I actually don't take issue with that: if github issues really were a better, viable, long-term reliable replacement for open source projects I think most of us would bite down and make the switch (as many did when the discussion of migrating to git occurred). The problem is github issues isn't that. I can hardly imagine open source projects even considering using a proprietary solution, which is very different from using commercial hosting of an open solution, but here we are discussing even thinking about github issues. [1] Which I'd counter with: learn something new (to you), not something that is merely new. > Best, > Christoph > Thanks, Phil -------------- next part -------------- An HTML attachment was scrubbed... URL: From eliot.miranda at gmail.com Tue Oct 6 15:24:24 2020 From: eliot.miranda at gmail.com (Eliot Miranda) Date: Tue, 6 Oct 2020 08:24:24 -0700 Subject: [squeak-dev] VM Development methodology (was: Development methodology, was: tedious programming-in-the-debugger error needs fixing) In-Reply-To: <1601981278751-0.post@n4.nabble.com> References: <1601475775699-0.post@n4.nabble.com> <1601590406774-0.post@n4.nabble.com> <076817EE-1506-47F9-9AF4-3126C6D3BC76@rowledge.org> <1601860447473-0.post@n4.nabble.com> <025A3F5C-E26E-44C6-B19B-FBED361CE779@gmail.com> <174f8f5548b.e4c3e13b138475.8358330872058455280@zoho.com> <1601925526567-0.post@n4.nabble.com> <1601981278751-0.post@n4.nabble.com> Message-ID: Hi Christoph, in this reply I’m only going to address the question about using GitHub for OpenSmalltalk-VM (for focus, see below). > On Oct 6, 2020, at 3:48 AM, Christoph Thiede < christoph.thiede at student.hpi.uni-potsdam.de> wrote: > > Hi all, > > looks like I'm a bit late back to this debate again, but it's very nice it > is still going on! There are many arguments I wanted to tell but Jakob > already explained all of them better than I could do. So just let me come > back to some points: > > > Mantis: > > I just took another look at bugs.squeak.org again, and I'm sorry but I still > think that our community deserves a better bug tracking solution than this. > It really looks old-fashioned and, from today's point of view, quite chaotic > and confusing. And compared to something like GitHub, it does not give me an > idea of how to report a bug. Do I have to log in? Which credentials do I > need to use? Why is there no register button anywhere? > Also, there must be some reason why the latest issue was submitted nearly > two years ago. Is Mantis connected to the mailing list at all? Asking all of > you who have used Mantis in past and reported newer bugs to the mailing list > instead, why did you do that? I would guess because mails provid higher > visibility and interactivity, is this correct? > > > Phil, you called GitHub & Co. one trend of many that's durability is > uncertain (correct me if I misunderstood you). I see this point, but looking > at the current numbers I strongly believe that GitHub has reached a critical > mass of developers and projects that won't move so quickly again. How many > large global players have decided to use GitHub, including competitors of > Microsoft itself such as Google, Apple, Facebook, etc.? > > At least, according to the trends GitHub is way more popular than > SourceForge, for example, has ever been, actually, it has even overtaken git > itself on Google Trends: > https://trends.google.com/trends/explore?date=all&q=github,sourceforge,gitlab,bitbucket,slack > > (By the way, if you search any old threads you can also find it on > web.archive.org in most cases). > >> Here you're showing you've already fallen behind: the github trend for >> discussing things is already fading and those trendier than you have >> already moved on to the next thing: Slack is where it's at! In a year or >> two it will be something else... and the treadmill keeps going but not >> really going anywhere. > > Slack is a group messenger used for communication in small to medium teams, > but I can hardly imagine someone seriously uses this as a bug tracker for a > large-scale software project with a big community, there is just too much > noise when pressing Enter sends a new message. The same goes for social > media platforms such as Google Plus that do not even offer basic tracking > features such as closing or labeling. I don't think you can compare this. > > >> Monticello ancestry does support branching, yet I think Monticello lacks >> first-class objects for branches, with all the implications for repository >> handling. > > +1. And I feel the lack of branches for about every second or third > submission I make to the inbox and am forced to reinvent my one pseudo > branch wheel. > > > Git vs. GitHub vs. GitLab: > > As Jakob already mentioned, they're not the same. I believe that GitHub > offers the largest range by far, but personally I would still consider it as > an improvement to set up a self-hosted GitLab instance (actually, from a > technical point of view, I think GitLab offers even more convenience > features for free). > > But still, it's right what Eliot said about git and companies: > >> One gives up great autonomy when allowing ones core VCS to be in a foreign >> system > > So why do you use git & GitHub for OpenSmalltalk-VM and not something like > Monticello? But I do :-) The VM is implemented in Smalltalk and a mixture of other languages but the core VM is *developed* in Smalltalk. See source.squeak.org/VMMaker, and in particular the branch VMMaker.oscog which is the branch of VMMaker that is the trunk of OpenSmalltalk-VM development. Other notable branches from this "trunk" are VMMaker.oscogLLP64, where Nicolas fixed all the work size/pointer size issues for Windows' horrible LLP64 code model (where sizeof(long) != sizeof(void *)), VMMaker.oscogSPC, where I branched to keep the default compactor working while Clément took the mainline along the path to multiple compactor implementations, from which we will derive a production incremental compiler when time allows (see Clément Béra, Eliot Miranda, and Elisa Gonzalez Boix. “Lazy Pointer Update for Low Heap Compaction Pause Times.” In Proceedings of the 15th ACM SIGPLAN International Symposium on Dynamic Languages, 15–27. DLS ’19. ACM, 2019. https://doi.org/10.1145/3359619.3359741) and VMMaker.gdb where Boris is aiming to replace the JIT execution simulation machinery with the gdb framework. And then of course there's VMMaker itself which is the "old" Context Interpreter, plus the flexible 32-bit/64-bit pre-Spur system. The style of development, plus the things we can do that no one else does, are described in some detail in Daniel Ingalls, Eliot Miranda, Clément Béra, and Elisa Gonzalez Boix. *“Two Decades of Live Coding and Debugging of Virtual Machines through Simulation.”**Software: Practice and Experience* 50, no. 9 (2020): 1629–50. https://onlinelibrary.wiley.com/doi/abs/10.1002/spe.2841. Contact me for a private copy. Suffice it to say that because the VM is developed in Smalltalk both the pace and reliability of development is exceptional, and I speak in the light of my own trivial experience with the BrouHaHa VM which was implemented in C, a series of four VMs that grew out of my early experience at RAL and undergrad student projects, and 12 years at ParcPlace/DarcPlace-Dodgytalk/ObjectShaft/CincompletelyDysfunctional where I architected a VM with the same closure model as we have now, and the transition to 64-bits. So VMMaker.oscog, in Squeak, is used to develop the VM, and from this C source is generated that comprises one third of the OpenSmalltalk-VM repository. The other two thirds are - a set of platform-specific support files that provide the OS-specific implementation of facilities needed by the core VM, plus (importantly) the implementation of many important plugins, such as the SoundPlugin - a set of build environments to allow us to build on MacOS, WIndows, Linux, Solaris (these are the active ones I'm aware of) All work on the core VM (the core execution engine, including interpreter, JIT, and core primitives and plugins, and the two memory managers, the old V3, and the new Spur) is done in Smalltalk, and pushed to OpenSmalltalk-VM. All work on the platform sources and build environments is done against the OpenSmalltalk-VM repository. Were it that Monticello had good file support I would have considered moving the platform sources into Monticello form Subversion, instead of to github. But that would have been a mistake; the integration with modern CI infrastructure is most important. ANd in fact had those behind Tonel been open at the time to make the inclusion of method timestamps possible I would have (and still want to) moved the back end of the VMMaker Monticello system into OpenSmalltalk-VM. It makes sense to have all source co-located. What does *not* make sense is replacing the beautifully integrated and efficient Monticello image experience with the nonsense I see in Iceberg where one has to ape git, checking out a new branch first before branching, etc. So I have no objection to git/github as being a backend for Monticello. But experience with Pharo and Iceberg, where the promise was made years ago that a Monticello experience would be preserved, and has not been achieved years later with considerable engineering effort available. What they have in Iceberg is, frankly, a mess where git's model and terminology intrude into Smalltalk (I talk from experience having used it with Synchrony Systems late last year/early this). On Tue, Oct 6, 2020 at 3:48 AM Christoph Thiede < christoph.thiede at student.hpi.uni-potsdam.de> wrote: > Hi all, > > looks like I'm a bit late back to this debate again, but it's very nice it > is still going on! There are many arguments I wanted to tell but Jakob > already explained all of them better than I could do. So just let me come > back to some points: > > > Mantis: > > I just took another look at bugs.squeak.org again, and I'm sorry but I > still > think that our community deserves a better bug tracking solution than this. > It really looks old-fashioned and, from today's point of view, quite > chaotic > and confusing. And compared to something like GitHub, it does not give me > an > idea of how to report a bug. Do I have to log in? Which credentials do I > need to use? Why is there no register button anywhere? > Also, there must be some reason why the latest issue was submitted nearly > two years ago. Is Mantis connected to the mailing list at all? Asking all > of > you who have used Mantis in past and reported newer bugs to the mailing > list > instead, why did you do that? I would guess because mails provid higher > visibility and interactivity, is this correct? > > > Phil, you called GitHub & Co. one trend of many that's durability is > uncertain (correct me if I misunderstood you). I see this point, but > looking > at the current numbers I strongly believe that GitHub has reached a > critical > mass of developers and projects that won't move so quickly again. How many > large global players have decided to use GitHub, including competitors of > Microsoft itself such as Google, Apple, Facebook, etc.? > > At least, according to the trends GitHub is way more popular than > SourceForge, for example, has ever been, actually, it has even overtaken > git > itself on Google Trends: > > https://trends.google.com/trends/explore?date=all&q=github,sourceforge,gitlab,bitbucket,slack > > (By the way, if you search any old threads you can also find it on > web.archive.org in most cases). > > > Here you're showing you've already fallen behind: the github trend for > > discussing things is already fading and those trendier than you have > > already moved on to the next thing: Slack is where it's at! In a year > or > > two it will be something else... and the treadmill keeps going but not > > really going anywhere. > > Slack is a group messenger used for communication in small to medium teams, > but I can hardly imagine someone seriously uses this as a bug tracker for a > large-scale software project with a big community, there is just too much > noise when pressing Enter sends a new message. The same goes for social > media platforms such as Google Plus that do not even offer basic tracking > features such as closing or labeling. I don't think you can compare this. > > > > Monticello ancestry does support branching, yet I think Monticello lacks > > first-class objects for branches, with all the implications for > repository > > handling. > > +1. And I feel the lack of branches for about every second or third > submission I make to the inbox and am forced to reinvent my one pseudo > branch wheel. > > > Git vs. GitHub vs. GitLab: > > As Jakob already mentioned, they're not the same. I believe that GitHub > offers the largest range by far, but personally I would still consider it > as > an improvement to set up a self-hosted GitLab instance (actually, from a > technical point of view, I think GitLab offers even more convenience > features for free). > > But still, it's right what Eliot said about git and companies: > > > One gives up great autonomy when allowing ones core VCS to be in a > foreign > > system > > So why do you use git & GitHub for OpenSmalltalk-VM and not something like > Monticello? > > Which leads me to my most important point which Uncle Bob from Jakob's > linked talk above gives this striking name to: elitism. > In plain theory, I would consider it as an ideal, too, to have a Smalltalk > system in which you can literally control every bit (ultimately, this might > be a Smalltalk computer with no separate host system, where all drivers > etc. > are written in Smalltalk - completely neglecting every question of > optimization). But in reality, the Squeak community, or even the entire > Smalltalk community, is a quite small community, and I would love to change > this and make Squeak/Smalltalk competitive again for contemporary > development tasks, which involves the mutual boosting between > tools/frameworks and developers. And because we are quite small at this > point, we have two alternative ways we could go: > Either we can spend our time on reimplementing every good and relevant idea > from the "real world" in Squeak and making ourself even more comfortable in > our small niche (which is, as I'm convinced, already very comfortable in > many terms, compared to most other languages and environments); or we can > join our forces and focus for now on opening our system towards the real > world, both in terms of solutions and people. Which one would you choose? > > > Yet in my opinion Squeak really needs to get along with the outside world > > for the mutual benefit; we cannot afford to always reimplement everything > > in Smalltalk just to be able to comfortably debug the issues we wouldn't > > have if we had used something mature. > > +1000 > > > Best, > Christoph > > PS: And as a matter of course, I'm neither in the position nor willing to > enforce any innovations that would deter some of our important community > members from the Squeak Project. But I'm not giving up the hope that this > discussion may reveal some more interesting insights about the desires and > demands of us as a community. :-) > > > > -- > Sent from: http://forum.world.st/Squeak-Dev-f45488.html > > -- _,,,^..^,,,_ best, Eliot -------------- next part -------------- An HTML attachment was scrubbed... URL: From eliot.miranda at gmail.com Tue Oct 6 15:33:57 2020 From: eliot.miranda at gmail.com (Eliot Miranda) Date: Tue, 6 Oct 2020 08:33:57 -0700 Subject: [squeak-dev] Development methodology (was: tedious        programming-in-the-debugger error needs fixing) In-Reply-To: <1601981278751-0.post@n4.nabble.com> References: <1601475775699-0.post@n4.nabble.com> <1601590406774-0.post@n4.nabble.com> <076817EE-1506-47F9-9AF4-3126C6D3BC76@rowledge.org> <1601860447473-0.post@n4.nabble.com> <025A3F5C-E26E-44C6-B19B-FBED361CE779@gmail.com> <174f8f5548b.e4c3e13b138475.8358330872058455280@zoho.com> <1601925526567-0.post@n4.nabble.com> <1601981278751-0.post@n4.nabble.com> Message-ID: Hi Christoph, I answered your Q's about OpenSmalltalk in another thread. But to your other points, c below... On Tue, Oct 6, 2020 at 3:48 AM Christoph Thiede < christoph.thiede at student.hpi.uni-potsdam.de> wrote: > Hi all, > > looks like I'm a bit late back to this debate again, but it's very nice it > is still going on! There are many arguments I wanted to tell but Jakob > already explained all of them better than I could do. So just let me come > back to some points: > > > Mantis: > > I just took another look at bugs.squeak.org again, and I'm sorry but I > still > think that our community deserves a better bug tracking solution than this. > It really looks old-fashioned and, from today's point of view, quite > chaotic > and confusing. And compared to something like GitHub, it does not give me > an > idea of how to report a bug. Do I have to log in? Which credentials do I > need to use? Why is there no register button anywhere? > Also, there must be some reason why the latest issue was submitted nearly > two years ago. Is Mantis connected to the mailing list at all? Asking all > of > you who have used Mantis in past and reported newer bugs to the mailing > list > instead, why did you do that? I would guess because mails provid higher > visibility and interactivity, is this correct? > > > Phil, you called GitHub & Co. one trend of many that's durability is > uncertain (correct me if I misunderstood you). I see this point, but > looking > at the current numbers I strongly believe that GitHub has reached a > critical > mass of developers and projects that won't move so quickly again. How many > large global players have decided to use GitHub, including competitors of > Microsoft itself such as Google, Apple, Facebook, etc.? > > At least, according to the trends GitHub is way more popular than > SourceForge, for example, has ever been, actually, it has even overtaken > git > itself on Google Trends: > > https://trends.google.com/trends/explore?date=all&q=github,sourceforge,gitlab,bitbucket,slack > > (By the way, if you search any old threads you can also find it on > web.archive.org in most cases). > > > Here you're showing you've already fallen behind: the github trend for > > discussing things is already fading and those trendier than you have > > already moved on to the next thing: Slack is where it's at! In a year > or > > two it will be something else... and the treadmill keeps going but not > > really going anywhere. > > Slack is a group messenger used for communication in small to medium teams, > but I can hardly imagine someone seriously uses this as a bug tracker for a > large-scale software project with a big community, there is just too much > noise when pressing Enter sends a new message. The same goes for social > media platforms such as Google Plus that do not even offer basic tracking > features such as closing or labeling. I don't think you can compare this. > > > > Monticello ancestry does support branching, yet I think Monticello lacks > > first-class objects for branches, with all the implications for > repository > > handling. > > +1. And I feel the lack of branches for about every second or third > submission I make to the inbox and am forced to reinvent my one pseudo > branch wheel. > I don't understand/ To branch all you do is add a dash and a name after the current branch. It seems to me that we want to surface that Monticello supports branches by - providing a branch button in the commit dialog which would provide a name template with the string '' for one to edit - providing a "merge branch" operation that would offer only to merge the changes from the branch against the most recent common ancestor Git vs. GitHub vs. GitLab: > > As Jakob already mentioned, they're not the same. I believe that GitHub > offers the largest range by far, but personally I would still consider it > as > an improvement to set up a self-hosted GitLab instance (actually, from a > technical point of view, I think GitLab offers even more convenience > features for free). > > But still, it's right what Eliot said about git and companies: > > > One gives up great autonomy when allowing ones core VCS to be in a > foreign > > system > > So why do you use git & GitHub for OpenSmalltalk-VM and not something like > Monticello? > > Which leads me to my most important point which Uncle Bob from Jakob's > linked talk above gives this striking name to: elitism. > In plain theory, I would consider it as an ideal, too, to have a Smalltalk > system in which you can literally control every bit (ultimately, this might > be a Smalltalk computer with no separate host system, where all drivers > etc. > are written in Smalltalk - completely neglecting every question of > optimization). But in reality, the Squeak community, or even the entire > Smalltalk community, is a quite small community, and I would love to change > this and make Squeak/Smalltalk competitive again for contemporary > development tasks, which involves the mutual boosting between > tools/frameworks and developers. And because we are quite small at this > point, we have two alternative ways we could go: > Either we can spend our time on reimplementing every good and relevant idea > from the "real world" in Squeak and making ourself even more comfortable in > our small niche (which is, as I'm convinced, already very comfortable in > many terms, compared to most other languages and environments); or we can > join our forces and focus for now on opening our system towards the real > world, both in terms of solutions and people. Which one would you choose? > I agree. But this is not about reinventing the wheel. This is about whether we discard a rather beautifully crafted wheel that is one of the main supports and propulsive engines we have for an uncertain future based on git. And I am not encouraged by the Pharo exerience. In Monticello we have something that works *very well*, something that can be extended quickly (look at Vanessa's beautiful selective check-in facility, which mimics git's add/reset staging functionality but in a much lighter-weight and better-integrated way, which Vanessa was able to implement quickly and which I believe involved a single commit for trunk and has worked flawlessly ever since). In git we have a massive dependence on a black box, which, if one looks at the Pharo community has changed entirely their SCM experience, and not for the better. So other than SCM, I agree we should not be reinventing the wheel. But in proposing we move to git you're actually suggesting we get rid of our wheels and go back to rolling logs... > > Yet in my opinion Squeak really needs to get along with the outside world > > for the mutual benefit; we cannot afford to always reimplement everything > > in Smalltalk just to be able to comfortably debug the issues we wouldn't > > have if we had used something mature. > > +1000 > > > Best, > Christoph > > PS: And as a matter of course, I'm neither in the position nor willing to > enforce any innovations that would deter some of our important community > members from the Squeak Project. But I'm not giving up the hope that this > discussion may reveal some more interesting insights about the desires and > demands of us as a community. :-) > > > > -- > Sent from: http://forum.world.st/Squeak-Dev-f45488.html > > -- _,,,^..^,,,_ best, Eliot -------------- next part -------------- An HTML attachment was scrubbed... URL: From vanessa at codefrau.net Tue Oct 6 16:04:43 2020 From: vanessa at codefrau.net (Vanessa Freudenberg) Date: Tue, 6 Oct 2020 09:04:43 -0700 Subject: [squeak-dev] OnScreenKeyboardMorph :-) In-Reply-To: References: <1794d21d-3f1a-a1c5-48c9-2fea71bd6719@leastfixedpoint.com> Message-ID: Nice! Re distinguishing click areas - for “my” modifier button the morph registered a screen rectangle with the “system” so the event hacking could test against that in more low level code. when the morph was moved or resized it would update that rectangle. (at last that’s what I remember, is quite possible that’s not how it actually worked at all) Vanessa On Tue, Oct 6, 2020 at 01:28 Tony Garnock-Jones wrote: > Yes, that's exactly what I had in mind! > > I gave it a good go yesterday, but don't have enough Morphic chops to > quite get it to work right: the problem was that if I let the ALT > modifier apply to the next click, then there are two possibilities: > > - the next click is to a key on the keyboard > - the next click is off the keyboard somewhere > > Really you only want the synthetic blue-click when it's off the > keyboard, but you don't know that at the time you're synthesising the > event... > > It'd be interesting if anyone with more Morphic experience than I could > suggest a good way forward! > > I ended up giving up and switching to having three red/yellow/blue > buttons at the bottom of the keyboard that act like shift keys and > require multiple touches simultaneously. (Image attached) > > So the keyboard shift/ctrl/alt work as you describe, but only for > entering text. The coloured buttons at the bottom work differently, more > like a real keyboard's shift key, and only for clicking on things. > > Also there are lots of weirdnesses around switching projects, so it's > definitely pre-alpha! Also some oddness with scrollbars not being > draggable (though windows are draggable). And for some reason popping up > a halo on the World via a simulated yellow-click results in 100% CPU > usage and a hung image that needs the VM to be interrupted? (And an > unrelated issue, I can't seem to disable balloon help.) > > But in the end I feel pretty happy with it. It works surprisingly well > for a day's hacking. > > (I just now used the on-screen keyboard to reprogram the on-screen > keyboard to have an escape key! Woo! Final step: OnScreenKeyboardMorph > rebuildFlap, alt-D, reopen the flap... presto, an escape key! Finally, a > programmable cellphone) > > Tony > > > > On 10/6/20 3:20 AM, Vanessa Freudenberg wrote: > > Looks cool! > > > > For phone-sized screens you probably want one-handed operations. I'd > > imagine tapping e.g. alt would cause the next tap to have the "alt" > > modifier bit set. So if tapping a key after alt, it would be alt-key, > > but when tapping outside the keyboard after tapping alt, it would be > > interpreted as blue-click. > > > > Vanessa > > > > On Mon, Oct 5, 2020 at 10:24 AM Tony Garnock-Jones > > > wrote: > > > > I'm going to see if control-click and cmd-click (via virtual > keyboard) > > will work out OK. If not (and perhaps in addition) I will experiment > > with something like in Vanessa's recently-reposted video from 2010, > with > > a little "shift" key in a screen corner. > > > > Tony > > > > > > On 10/5/20 5:09 PM, Herbert wrote: > > > Coool!! How are right/middle click (panned to be) handled? > > > > > > Cheers, > > > > > > > > > Herbert > > > > > > Am 05.10.20 um 17:04 schrieb Tony Garnock-Jones: > > >> image snipped > > >> > > > > > > > > > > > > > -------------- next part -------------- An HTML attachment was scrubbed... URL: From tim at rowledge.org Tue Oct 6 16:55:59 2020 From: tim at rowledge.org (tim Rowledge) Date: Tue, 6 Oct 2020 09:55:59 -0700 Subject: [squeak-dev] The Trunk: Collections-ul.915.mcz In-Reply-To: References: Message-ID: <24AD2D3A-8A97-4BBE-93CA-178403655DFA@rowledge.org> > On 2020-10-06, at 5:17 AM, Levente Uzonyi wrote: > > > AFAIK PluggableDictionary was not part of Smalltalk-80, but Dictionary and IdentityDictionary were. Correct. > > Dictionary and IdentityDictionary are slightly faster than their PluggableDictionary equivalents. Yah; the #scanFor.... methods will be slightly slower because of the test for the relevant block. However, for anything much more complicated than a SmallInteger #= test I suspect that the actual total time will be very close. After all the object being added has to evaluate its #= against whatever is already in the slot and comparing two Wooblies with 100 instvars (and instvar related sub-tests) to try will likely swamp the #scanFor... loop. I don't think I've had any reason to use a PluggableDictionary before but I can see that having a way to use an application specific equivalence check instead of relying on a system-wide and inevitably limiting definition has its uses. I can imagine cases where one might need two dictionaries of nominally the same contents but where the equivalence test for inclusion needs to be different in order to make comparisons of some interesting state. tim -- tim Rowledge; tim at rowledge.org; http://www.rowledge.org/tim Strange OpCodes: DC: Divide and Conquer From tim at rowledge.org Tue Oct 6 16:58:36 2020 From: tim at rowledge.org (tim Rowledge) Date: Tue, 6 Oct 2020 09:58:36 -0700 Subject: [squeak-dev] Overhead of SystemProgressMorph/#do:displayingProgress: is huge In-Reply-To: References: <88320e6951f147939dd02fb013008db1@student.hpi.uni-potsdam.de> <, > <052f3ca046c444fa99a73a3473871732@student.hpi.uni-potsdam.de> <,> Message-ID: <91238D33-E250-439C-93EB-2298B6F7795B@rowledge.org> > On 2020-10-06, at 7:39 AM, Marcel Taeumel wrote: > > Hi Christoph, > > try to get rid of that extra send of #extent: with bogus values. > > > Can we move that "self removeProperty: #dropShadow" statement from Morph >> #extent: to some deferred point, maybe #doLayoutIn:? Or add a second property, #dropShadowBounds, and invalidate the cache when looking it up only? > Or maybe just drop the drop shadows idiom entirely. It's a tired UI trope. tim -- tim Rowledge; tim at rowledge.org; http://www.rowledge.org/tim Strange OpCodes: PWB: Put to Waste Basket From tim at rowledge.org Tue Oct 6 17:13:43 2020 From: tim at rowledge.org (tim Rowledge) Date: Tue, 6 Oct 2020 10:13:43 -0700 Subject: [squeak-dev] The Trunk: Tools-eem.992.mcz In-Reply-To: References: <3c425d1297144ed385f0faaccc2a30c0@student.hpi.uni-potsdam.de> Message-ID: > On 2020-10-06, at 7:16 AM, Eliot Miranda wrote: > > If you have energy please do speed it up, and if it gets much faster feel Fred yo revert my changes. But the debugger *must* step faster than it is possible to click. And it must do that on a slow machine like a Pi 3 (not even a Pi 4 please) tim -- tim Rowledge; tim at rowledge.org; http://www.rowledge.org/tim loggerheads - lumberjack sniffing addicts From eric.gade at gmail.com Tue Oct 6 17:18:57 2020 From: eric.gade at gmail.com (Eric Gade) Date: Tue, 6 Oct 2020 13:18:57 -0400 Subject: [squeak-dev] [Offtopic] Documentary Project Message-ID: Fellow Squeakers and Pharo-ers, Please forgive me if this message is inappropriate for the list. I am hoping you all will be interested in the following project. For the past year and a half I have been working on a team that is developing a documentary on the history of personal computing. Our goal is to interview the very people who laid the foundations for personal computing while they are still with us, learning about their original visions and getting their take on the present. In this sense it is both an aspiring feature length documentary project but also an endeavor in oral history and posterity. Many of the themes we want to explore will be familiar to the members of this community (as will the title). Last fall we were able to shoot our first three interviews. We used these to make a short teaser , with the idea it could be used to raise funds for future rounds of interviews. That said, we are currently in the middle of a Kickstarter campaign to get the second round funded. If you are interested in learning more, feel free to reach out to me directly and to visit the film's campaign site and website . We need all the promotion we can get! Thanks! -- Eric -------------- next part -------------- An HTML attachment was scrubbed... URL: From eliot.miranda at gmail.com Tue Oct 6 18:04:52 2020 From: eliot.miranda at gmail.com (Eliot Miranda) Date: Tue, 6 Oct 2020 11:04:52 -0700 Subject: [squeak-dev] [Offtopic] Documentary Project In-Reply-To: References: Message-ID: Hi Eric, On Tue, Oct 6, 2020 at 10:19 AM Eric Gade wrote: > Fellow Squeakers and Pharo-ers, > > Please forgive me if this message is inappropriate for the list. I am > hoping you all will be interested in the following project. > I for one am extremely interested and excited to see the results. I've contributed. All the best with continued fundraising. Thanks for the teaser!! > For the past year and a half I have been working on a team that is > developing a documentary > > on the history of personal computing. Our goal is to interview the very > people who laid the foundations for personal computing while they are still > with us, learning about their original visions and getting their take on > the present. In this sense it is both an aspiring feature length > documentary project but also an endeavor in oral history and posterity. > Many of the themes we want to explore will be familiar to the members of > this community (as will the title). > > Last fall we were able to shoot our first three interviews. We used these > to make a short teaser , with the idea it > could be used to raise funds for future rounds of interviews. That said, we > are currently in the middle of a Kickstarter campaign > > to get the second round funded. If you are interested in learning more, > feel free to reach out to me directly and to visit the film's campaign > site > > and website . We need all the > promotion we can get! > > Thanks! > > -- > Eric > > -- _,,,^..^,,,_ best, Eliot -------------- next part -------------- An HTML attachment was scrubbed... URL: From tim at rowledge.org Tue Oct 6 18:40:19 2020 From: tim at rowledge.org (tim Rowledge) Date: Tue, 6 Oct 2020 11:40:19 -0700 Subject: [squeak-dev] The Trunk: Tools-eem.994.mcz In-Reply-To: <3b1c779f588c444088e997a6c267a183@student.hpi.uni-potsdam.de> References: <3c98ed3f0efa473b8e9fc19ec9633928@student.hpi.uni-potsdam.de> <00CF2F63-0F85-4E0C-A4AE-8EE9B5644A18@gmail.com> <3b1c779f588c444088e997a6c267a183@student.hpi.uni-potsdam.de> Message-ID: <7BABEA31-9EBA-4840-91AD-4C31FEB43F8C@rowledge.org> So, we are debating debuggers here, along with a bit about inspectors. I'd urge keeping the 'normal' case for both as simple as possible - no styling, no trying to make special views for each object that becomes the receiver, nothing like that. Focus on the operation of the tool. Stepping needs to be fast and most importantly, correct. Rely on as little as possible because the debugger is *what has to work when you've broken everything*. If you want fancy extras, make them extras, and make them easy to open or activate or indeed close. Make the receiver & context inspectors the most basic kind with a button to swap them for a fancier one. We already have the 'inspect/explore' switch for inspectors, for example. Fancy highlighting and colouring, or showing tiny thumbnails of images have no place in a lot of important debugging scenarios. They are certainly an obstruction when it is the thumbnail code or styling code that has to be debugged! More generally it would be really nice if the styling stuff could be turned off/on easily. I tolerate it on recent Pi systems but only because it is a pain to faff around removing the package. tim -- tim Rowledge; tim at rowledge.org; http://www.rowledge.org/tim Strange OpCodes: IBLU: Ignore Basic Laws of Universe From tim at rowledge.org Tue Oct 6 18:56:17 2020 From: tim at rowledge.org (tim Rowledge) Date: Tue, 6 Oct 2020 11:56:17 -0700 Subject: [squeak-dev] The Trunk: Tools-eem.992.mcz In-Reply-To: <3c425d1297144ed385f0faaccc2a30c0@student.hpi.uni-potsdam.de> References: <3c425d1297144ed385f0faaccc2a30c0@student.hpi.uni-potsdam.de> Message-ID: <8AA6F756-50C5-42BC-A219-75F125282650@rowledge.org> > On 2020-10-06, at 1:45 AM, Thiede, Christoph wrote: > > Hi Eliot, > > > - translating the 'all temp vars' and 'stack top' label > > Translating is a really low-level operation because it appears everywhere in the system. I'm quite sure that these two calls in the inspector are only the tip of the iceberg. Wouldn't it be more sustainable, and also better readable in the inspectors' implementations, to implement such a cache somewhere in the #translated logic? If necessary, we could make it an LRU cache of an appropriate size, 16 or 32 entries might suffice. tl;dr - Translating everywhere is the entrance to the road to perdition. An example from ancient history. Skip if you can't be bothered to read the ramblings of an old fart. In the late 1980's (I said it was ancient history) there were three companies trying to make what you would recognise as proto-iPads. Two were actually Smalltalk based, the Active Book (based on Eliot's BHH with quite a lot of my blood in it, running on an ARM2 @ 8MHZ) and the Momenta (based on Smalltalk/V and DOS on some intel thing). There was also the AT&T/EOS/sometihng or other (which was certainly the nicest industrial design) and it ran carefully hand optimised c++ code written by experts and running on a 20MHz or so Hobbit cpu. There are good reasons why almost none of you will have heard of it; it was *horrible*. In fact it was one of the reason Apple got involved with ARM and thus lead to the utter domination of ARM these days. The interesting thing was that the Active Book performance was waaaaaaay better than the others. Years late I actually got to know one of the guys that worked on it and learned a bit about why the thing was so slow to use. It turned out that they put everything through a translation layer; every open of a button, every entry in a menu, every label, got passed through this. It cost so much that the 'carefully optimised' system was crushed. Now of course, our machines are literally a million times faster these days, so surely this is not a problem? Well, look around at the software you use daily. Does it work a million times faster? Nah. Obviously it isn't all down to any kind of translation but remember - I said it was the entrance to the road to perdition. And perdition ain't no resort town in Mexico. PS - the Active Book was killed by AT&T buying the company and stopping development precisely because this tiny UK company was showing up their large investment. tim -- tim Rowledge; tim at rowledge.org; http://www.rowledge.org/tim "Bother" said Pooh, as the Vice Squad took his GIFS .. From marianopeck at gmail.com Tue Oct 6 19:02:37 2020 From: marianopeck at gmail.com (Mariano Martinez Peck) Date: Tue, 6 Oct 2020 16:02:37 -0300 Subject: [squeak-dev] Weird Pi Squeak slowdown alert In-Reply-To: <63E55F7C-3989-4FC4-B7DA-8C85EB55CC0B@rowledge.org> References: <25F27C6F-4F5A-4A01-A162-79B1102701E4@rowledge.org> <81AE03D4-506B-45BF-AC5C-8C0434D5BD3B@rowledge.org> <5891F6C6-6AC9-4C8F-991F-6C6FDE1854E0@gmail.com> <1601715829-66e64d409ad2e8c2356e953269ef3b1d@pckswarms.ch> <63E55F7C-3989-4FC4-B7DA-8C85EB55CC0B@rowledge.org> Message-ID: That vcgencmd would be a great addition to the rpi monitor I normally use: https://rpi-experiences.blogspot.com/p/rpi-monitor.html On Sat, Oct 3, 2020 at 2:32 PM tim Rowledge wrote: > > > > On 2020-10-03, at 2:03 AM, Bruce O'Neel > wrote: > > > > 3. There is a vcgencmd get_throttled > > > > http://raspberrypi.stackexchange.com/questions/83184/ddg#83185 > > > > vcgencmd is an interesting command for many of these sorts of things. > You can measure the CPU and GPU temp. > > Ah, yes. I vaguely recall having to use it some years ago to set a bit to > allow usd boot on early Pi 3 models. > I found a useful script from RonR (who provides many such on the PI > forums, including a v.useful "set up usb boot" script) to report the > relevant status info - > > https://www.raspberrypi.org/forums/viewtopic.php?f=63&t=254024&p=1550160&hilit=pistatus#p1550160 > > Also finally found the doc for vcgencmd at > https://www.raspberrypi.org/documentation/raspbian/applications/vcgencmd.md > and boy, does it do a lot. Looking at the output of the vcgencmd commands > command, there are more commands than currently documented. The source is > on github though, so one could work it out eventually! > > Be cool to have a morph that displays the important status occasionally. > Or I could hook up one of the dials I wrote for the weather station for > that SteamPunk style :-) > > tim > -- > tim Rowledge; tim at rowledge.org; http://www.rowledge.org/tim > Strange OpCodes: XI: Execute Invalid op-code > > > > -- Mariano Martinez Peck Email: marianopeck at gmail.com Twitter: @MartinezPeck LinkedIn: www.linkedin.com/in/mariano-martinez-peck Blog: https://marianopeck.wordpress.com/ -------------- next part -------------- An HTML attachment was scrubbed... URL: From tim at rowledge.org Tue Oct 6 19:05:25 2020 From: tim at rowledge.org (tim Rowledge) Date: Tue, 6 Oct 2020 12:05:25 -0700 Subject: [squeak-dev] Development methodology (was: tedious        programming-in-the-debugger error needs fixing) In-Reply-To: <1601981278751-0.post@n4.nabble.com> References: <1601475775699-0.post@n4.nabble.com> <1601590406774-0.post@n4.nabble.com> <076817EE-1506-47F9-9AF4-3126C6D3BC76@rowledge.org> <1601860447473-0.post@n4.nabble.com> <025A3F5C-E26E-44C6-B19B-FBED361CE779@gmail.com> <174f8f5548b.e4c3e13b138475.8358330872058455280@zoho.com> <1601925526567-0.post@n4.nabble.com> <1601981278751-0.post@n4.nabble.com> Message-ID: <62765B44-C34F-42C1-96D6-DE1C7B080AE5@rowledge.org> > On 2020-10-06, at 3:47 AM, Christoph Thiede wrote: > > Mantis: > > I just took another look at bugs.squeak.org again, and I'm sorry but I still > think that our community deserves a better bug tracking solution than this. Nobody could ever look at Mantis and honestly call it 'good'. Our use of it pretty much faded away as it good flooded by bug reports that nobody had time to handle. As system like that takes too much effort to maintain unless you have people (like proper project managers etc) that can spend all their time tracking, pushing, tidying, linking, cleaning out and so on. Git as an entity has some decent aspects for dead-text systems. It can probably be pushed to handle storing code for our needs without breaking too badly. BUT there is no way in hell that its interface is sometihng one would want to intrude into a development system. That's about as good an idea as a commandline version of monticello - if the commands were entered in inverted Braille via dripping hot oil on the back of your hand. If someone can make a system that provides the reasonably decent user experience of MC (which could certainly be improved) and uses git related backend stuff, sure, go for it. But as a daily driver, it just doesn't do it. tim -- tim Rowledge; tim at rowledge.org; http://www.rowledge.org/tim Strange OpCodes: XER: Exclusive ERror From marianopeck at gmail.com Tue Oct 6 19:05:52 2020 From: marianopeck at gmail.com (Mariano Martinez Peck) Date: Tue, 6 Oct 2020 16:05:52 -0300 Subject: [squeak-dev] Weird Pi Squeak slowdown alert In-Reply-To: <17A27EEB-0986-47C8-91C6-FAE2D02644DD@rowledge.org> References: <81AE03D4-506B-45BF-AC5C-8C0434D5BD3B@rowledge.org> <5891F6C6-6AC9-4C8F-991F-6C6FDE1854E0@gmail.com> <17A27EEB-0986-47C8-91C6-FAE2D02644DD@rowledge.org> Message-ID: On Fri, Oct 2, 2020 at 10:17 PM tim Rowledge wrote: > > > > On 2020-10-02, at 3:52 PM, Mariano Martinez Peck > wrote: > > > > Hi Tim, > > > > Last week Instantiations presented at RIoT Developer month "Faster & > More Efficient: JITs for IoT", > > You guys are having a lot of fun. Nice. > > The real trick for IoT stuff would be to make a system that can run on an > ESP32 class chip. I'm pretty sure it's doable, but not easy. The good news > is that with built-in WiFi one could do a sort of OOZE/LOOM/network virtual > memory thing. And really, just how much development software does a light > switch need to load by default? > > Being that also the topic of my PhD with Marea, I would say that I love the idea hahaha. Something that VAST has that is very cool is that you can bootstrap images from scratch with what you need and then use the "Packager" to reduce even the "unused" code. A few examples we have: 1) Seaside running in 3MB image 2) TCP/HTTP server running in 1MB image 3) VM benchmarks running in a 500KB image (used in the above JIT presentation) So yeah... so many nice research projects :) -------------- next part -------------- An HTML attachment was scrubbed... URL: From monty2 at programmer.net Tue Oct 6 19:24:38 2020 From: monty2 at programmer.net (monty) Date: Tue, 6 Oct 2020 21:24:38 +0200 Subject: [squeak-dev] The XML libraries run fine on Squeak 6 alpha In-Reply-To: References: Message-ID: I believe it was called YAXO originally, and the SM project is still there. Just create a new YAXO release based on the most recent trunk version of XMLParser, remove it from the trunk, and direct people to "XMLParser" unless they specifically want the old version, then you direct them to "YAXO." Problem solved. ___ montyos.wordpress.com > Sent: Tuesday, October 06, 2020 at 10:41 AM > From: "Tobias Pape" > To: "The general-purpose Squeak developers list" > Subject: Re: [squeak-dev] The XML libraries run fine on Squeak 6 alpha > > Hi > > > On 06.10.2020, at 09:22, Marcel Taeumel wrote: > > > > Hi Levente, > > > > thanks for this review. The points (4), (3), and (2) are very serious. There needs to be a lot of work done before this can be treated as a valuable addition to Trunk's XML implementation. Especially backwards compatibility must be considered. > > > > I am -1 then. Sorry for not taking a look at the code before. I would still like to see improvements happen in the Trunk's XML implementation. > > I like the idea of "removing" XML and making it loadable in either the Old form or monty's package. > But in that case, we somehow need a mechanism to communicate the fact that these two exists… > > -t > > > > > Best, > > Marcel > >> Am 05.10.2020 21:53:34 schrieb Levente Uzonyi : > >> > >> -1 > >> > >> After a bit of analysis, I came to the conclusion that it would be a bad > >> idea to include those packages in the Trunk. Why? > >> > >> 1. There are more important things than XML > >> 2. These packages are huge > >> 3. The code is not backwards compatible > >> 4. It would introduce parallel collection hierarchies which would cause > >> confusion > >> 5. Some undeclared variables > >> > >> > >> Details: > >> > >> 1. There are more important things than XML > >> > >> I think there's not much to say here. Among the serialization formats, > >> JSON, YAML are far more popular than XML nowadays. Yet, we have neither > >> supported in the Trunk (apart from a minimal hence incomplete JSON > >> implementation in WebClient. It's really amazing how small it is though.) > >> > >> > >> 2. These packages are huge > >> > >> The current version of the XML-Parser in Trunk has the following stats: > >> > >> classes: 26 > >> methods: 379 > >> linesOfCode: 2069 > >> > >> It's obviously incomplete though. > >> The proposed packages have the following stats: > >> > >> classes: 758 (21.5% of all classes in the Trunk including the XML packages) > >> methods: 10129 (14%) > >> linesOfCode: 73897 (13.7%) > >> > >> That's 25x-35x more than the current implementation. > >> When the packages are loaded in the current Trunk image, they take up > >> 21.5%, 14%, 13.7% of all classes, methods, linesOfCode, respectively. > >> One could say that the extensive tests are responsible for the bloat, but > >> no, it's probably related to the complexity of XML. Without tests, the > >> numbers are: > >> > >> classes: 512 (15.6%) > >> methods: 6744 (9.8%) > >> linesOfCode: 32886 (6.6%) > >> > >> I don't think XML is important enough in general to justify those numbers. > >> > >> > >> 3. The code is not backwards compatible > >> > >> The code is not a drop-in replacement. The interface is different. Code > >> using the current package would have to be migrated. > >> > >> > >> 4. It would introduce parallel collection hierarchies which would cause > >> confusion > >> > >> The code uses various collections similar to those in the Trunk but not > >> compatible with them and not in the same class hierarchy: > >> > >> BitmapCharcterSet - An independent character set implementation. Not a > >> subclass of CharacterSet. > >> > >> StandardOrderedDictioanry (and its 5 subclasses) - An alternative to > >> OrderedDictionary implementation. A subclass of Collection, so not part of > >> the HashedCollection hierarchy (for good reasons). > >> > >> If these were part of the Trunk, one could be wondering which one to use: > >> OrderedDictionary or OrderPreservingDictionary? What's the difference? > >> Maybe StandardOrderedDictionary? > >> > >> 5. Some undeclared variables > >> > >> The code is written with compatibility in mind, so it supports Pharo and > >> Squeak. Even if you use Squeak, code related to Zinc, Pharo's HTTP library > >> will still be loaded directly referencing Zinc's classes. > >> > >> > >> Without going any deeper, I think the best would be to not include these > >> packages in the Trunk. > >> I'd go even further: I would remove the current XML-Parser as well but > >> provide an easy way to load either version. That way the image would be > >> smaller, simpler. > >> If we had the CI infrastructure (we probably have, but I'm not sure), we > >> could even test whether these packages work as expected, and treat them > >> as official external packages. > >> > >> There's currently one method that depends on the XML-Parser package in > >> Trunk: SugarLauncher >> #gconfPropertiesAt:. > >> It uses the current XML-Parser API, so even if we decide to include the > >> more complete XML implementation in Trunk, we will still have to change > >> it to make it work. > >> > >> > >> Levente > >> > >> On Mon, 5 Oct 2020, Eliot Miranda wrote: > >> > >> > Hi All, > >> > > >> > votes for & against inclusion of Monty’s XML in trunk/6 beta? > >> > > >> > +1 > >> > > >> > _,,,^..^,,,_ (phone) > >> > > >> >> On Oct 4, 2020, at 12:44 PM, monty wrote: > >> >> > >> >> Installing the (head)s of: > >> >> XMLParser (which loads "XMLWriter" too) > >> >> XMLParser-XPath (be careful not to install the old, unfinished "XPath" project) > >> >> XMLParser-StAX > >> >> XMLParser-HTML > >> >> from the SqueakMap works fine; all the tests still pass. XMLParser installation still pops up a warning you have to click through b/c of a conflict with the old XMLParser in the image, but it's fine other than that. > >> >> > >> >> Supposedly there are conflicts with XStreams, but I have nothing to do with that. > >> >> > >> >> An aside: some tests are skipped by default because they rely on external resources, like the file system or HTTP, which makes it easier to distinguish real regressions from something like a network outage. The skipping is more obvious on Pharo because their TestCase has a #skip message that the TestRunner UI supports. On Squeak these tests just silently pass. To run them, send XMLSkippableTest #stopSkippingAll. Unfortunately b/c of the W3C rate limiting, the tests using xhtml DTDs timeout if you run them more than once. You could say they should be cached (the default resolver does just that), but the purpose of these tests is to test real HTTP retrieval, so that defeats the purpose. > >> >> ___ > >> >> montyos.wordpress.com > >> >> > >> >> > > > > From Christoph.Thiede at student.hpi.uni-potsdam.de Tue Oct 6 20:15:01 2020 From: Christoph.Thiede at student.hpi.uni-potsdam.de (Thiede, Christoph) Date: Tue, 6 Oct 2020 20:15:01 +0000 Subject: [squeak-dev] Metacello broken again In-Reply-To: <0b4db772e37c42aa819c1565f6cec34c@student.hpi.uni-potsdam.de> References: <2c3359358004407498a8d3331c381203@student.hpi.uni-potsdam.de>, , , <53086722e7f443a79e1aa74757004963@student.hpi.uni-potsdam.de>, <0b4db772e37c42aa819c1565f6cec34c@student.hpi.uni-potsdam.de> Message-ID: <95264dba9e6340fb9b793a6938a66caa@student.hpi.uni-potsdam.de> Hi all, am I the only person to still face this issue? Not even Tom's Metacello SAR is allowing me to install any Metacello packages any longer, and I cannot install Squot for the same reason. This is very disruptive for me because I cannot set up a new image with any packages. Is there any one who could fix the servers just another time? :-) Best, Christoph ________________________________ Von: Squeak-dev im Auftrag von Thiede, Christoph Gesendet: Mittwoch, 30. September 2020 19:06:14 An: Squeak Dev Betreff: Re: [squeak-dev] Metacello broken again Hi all, I would not reply to this thread if I did not perceive a similar issue just again. Installer ensureRecentMetacello --> Could not resolve: BaselineOfMetacello [BaselineOfMetacello] in C:\path\to\package-cache github://Metacello/metacello:master/repository ERROR: 'GoferRepositoryError: UndefinedObject>>isAlphaNumeric' Are there any server errors again? The SAR works, of course, but if I try to #installGitInfrastructure after loading the SAR and skip #ensureRecentMetacello, I receive another error: MessageNotUnderstood: Array>>setLoadsInMetacelloProject: from MetacelloCypressBaselineProjectSpec(MetacelloProjectSpec)>>loads:. Best, Christoph ________________________________ Von: Squeak-dev im Auftrag von Thiede, Christoph Gesendet: Mittwoch, 2. September 2020 23:37:06 An: Squeak Dev Betreff: Re: [squeak-dev] Metacello broken again Thank you Tom :-) ________________________________ Von: Squeak-dev im Auftrag von Beckmann, Tom Gesendet: Dienstag, 1. September 2020 12:32:05 An: Squeak Dev Betreff: Re: [squeak-dev] Metacello broken again ...and now the servers are fixed, too :) http://forum.world.st/VOMongoConnectionError-when-dowloading-mcz-from-smalltalkhub-com-tp5120870p5121140.html ________________________________________ From: Squeak-dev on behalf of Beckmann, Tom Sent: Tuesday, September 1, 2020 12:23:39 PM To: Squeak Dev Subject: Re: [squeak-dev] Metacello broken again Hi Christoph, the smalltalkhub servers recently had some reconfigurations that are potentially the culprit [1] (just heard back, they are already on it :)). I attached a .sar for bootstrapping based on this issue's [2] suggestion for a new bootstrapping process that should allow you to get a working metacello in the meantime. Best, Tom [1] http://forum.world.st/VOMongoConnectionError-when-dowloading-mcz-from-smalltalkhub-com-tp5120870p5121135.html [2] https://github.com/Metacello/metacello/issues/524 ________________________________________ From: Squeak-dev on behalf of Thiede, Christoph Sent: Tuesday, September 1, 2020 11:56:10 AM To: Squeak Dev Subject: [squeak-dev] Metacello broken again Hi all, I did not follow the recent Metacello discussions again, but just now in my fresh Trunk image, Metacello new failed again multiple times saying 'retry with alternate repository failed: ''MessageNotUnderstood: UndefinedObject>>contentStreamFromEncoding:'''. Is this a known problem? How can I solve this without waiting for any server to be online again? After this command failed, you cannot even retry it, because #Metacello is no longer a registered class in the image. This is rather inconvenient ... Best, Christoph -------------- next part -------------- An HTML attachment was scrubbed... URL: From forums.jakob at resfarm.de Tue Oct 6 21:03:09 2020 From: forums.jakob at resfarm.de (Jakob Reschke) Date: Tue, 6 Oct 2020 16:03:09 -0500 (CDT) Subject: [squeak-dev] Development methodology (was: tedious        programming-in-the-debugger error needs fixing) In-Reply-To: References: <076817EE-1506-47F9-9AF4-3126C6D3BC76@rowledge.org> <1601860447473-0.post@n4.nabble.com> <025A3F5C-E26E-44C6-B19B-FBED361CE779@gmail.com> <174f8f5548b.e4c3e13b138475.8358330872058455280@zoho.com> <1601925526567-0.post@n4.nabble.com> <1601981278751-0.post@n4.nabble.com> Message-ID: <1602018189652-0.post@n4.nabble.com> Hi, Now I do not know to which message to reply first :-) and unfortunately most of this is again not about the development process, but at least it is about the experience. I prefer Git over Monticello not only because Git is more wide-spread and has platforms available to support it. I marked some key points in bold in the following paragraphs in case you cannot afford to read all of it. Sorry to those on plaintext mail clients. *You can track more objects with Git* (or any unspecialized VCS) *than with Monticello.* As you confirmed Eliot, you cannot track files in Monticello. You also cannot track a Morph or a Readme in Monticello. Instead we need to squeeze everything into classes and methods. You can track anything with Git that you can transform into a tree of blobs. Including Smalltalk code, it is just a special case. Want a new kind of MCDefinition? Git does not care and will store it for you, whatever it is. Monticello, not so easy. (In the end in both cases you would probably have to write some kind of de/serialization to get something nice, but in Monticello you have to modify the VCS, whereas for generic systems you would extend "above" the VCS.) Using *Git does not imply that you have to use tools outside of the image*. And it does not mean to "be less Smalltalk". Eliot, you asked what I would do if I had unlimited resources. I would improve the Git Browser and accompanying tools so that one could do everything as comfortably as with Monticello, and yet be able to do more than Monticello allows. Well, depending on who you ask, the new tools have already surpassed the Monticello tools in some usability aspects, but certainly not in every way. ;-) But what I meant to say here is that *the long-time Monticello user should be able to feel "at home" even though the repository is a Git repository now*. Regarding the integration of code review, conversation etc. and the tracking of contributions, which got us going here, one can probably build this all in Squeak. There have been projects going in this direction in the past, right Tobias? ;-) With unlimited resources, I would also do that in Squeak because unlimited resources, especially time, means that I could patiently build all the middleware, connectivity, cloud-readiness and OS integration stuff that are more present in the Java, .NET, JavaScript, and Python ecosystems. Or I might try to give those other things more of a Squeak experience, which is one of the things I like about the work Fabio is doing about polyglot programming. Back to reality for now... Of course *it is possible to have domain-specific tools on top of Git* (or any other suitable, unspecialized VCS), to get a "Monticello expericence" (at least the good parts of it). "Git tools" do not need to stop at the level of file trees and branches of them. I have not used IceBerg myself Eliot, but it sounds like it is on the wrong level of abstraction for your taste. We can have "easy" yet rich and powerful tools in the image with just about any VCS, this is *not a conceptual monopoly of Monticello* (or at least it doesn't have to be). So in my opinion we should go with the most practical (to avoid saying "the best") VCS of the respective time. Squot is built with a certain degree of agnosticism toward the kind of repository, as long as it can store arbitrary objects. The Git Browser of course is somewhat specific to Git, as the name tells. For one because of Git-specifics like remotes, but also regarding the vocabulary on the buttons ("commit", "push", "pull"), to look familiar to Git users (of which there are arguably more than there are Smalltalkers). But we could create a different version of the tool that presents things differently, for sure. I think a "real" Git backend for Monticello is also feasible, now that we have a usable Git implemenation in Smalltalk already. That's why I brought it up at all. But it would still be a compromise because *Monticello has more quirks* than just being limited to the respective class hierarchy of MCDefinition. For one, there is this *awful implementation of storage* in Monticello, both on the disk and in memory. What a waste to store the whole snapshot again with each version. And how easy it is to have *a version in the middle of the history missing* from a repository, which makes "diffy versions" dangerous. Git's solution to that (but Mercurial would also be good enough there) is much more space- and time-efficient. You might object that you have to clone the whole Git repository (though there are ways out of that, Microsoft's vfsforgit being one of them), but for the below-Enterprise-scale project it is just not a problem in Git! Copying the whole history of Squeak Trunk on the other hand will probably take longer than to clone an equivalent Git repository, and it will take up more disk space. Using Git as a backend could solve the efficiency problem in the repository, but *without core changes to Monticello itself, there would still be waste in the image*. This is the reason why we are asked to compress history through less granular commits and contribution reshaping. Quite extraordinary how our tool shapes our process! To refactor this for the better would mean to increase the complexity of Monticello, though. Just as Squot is definitely more complex than Monticello if you count all of Squot's parts (by the way, Squot still uses Monticello for package capturing, loading and image patching, but not the Monticello tools and not the ancestry implementation). Then there is the delineation of a project. In Monticello, you have to save each package of a project separately. And you may have to create a configuration map on top of that. *In Git* (or just about anything else) *you would just have multiple packages in the tree and save them all together*, and each commit constitutes an implicit configuration of the packages. I think this is a *tremendous advantage in usability*. Many projects consist of more than one package. Yet most of the time the -Core, -Test, -Fluff packages evolve simultaneously. This flaw of Monticello as I am willing to call it is at the core of its model, and therefore also its tools! ("Whew, does anyone remember which version of System corresponds to the changes in this Kernel version...?", because the System version didn't have a number yet when the Kernel version was saved, and therefore was not manually !!! referenced in the log message.) We already talked about branches. VMMaker is surprisingly just one package, therefore it is easier to create branches through the naming conventions of packages or versions. *Imagine you would have to care about the branch suffix for three or five, let alone 12 or 50 packages* to create and manage a branch of a project. Well, you could create a branched configuration map, but good luck for not letting stuff that belongs to the branch slip into a package that didn't initially get the new naming. Most of the time it seems easier to branch in Monticello by creating a separate repository to hold the branch. This is also something I would consider for a real Git-in-Monticello: to create a branch, create another repo (with the same Git backing); to "push", copy from a local repsitory to a remote repository (and also copy the ancestors along because everything else would be pointless); to merge, well merge the version from the other repo, be it local or remote. Yet this betrays the concept of a repository if you have multiple instances of the same one on your list of repositories. So it still feels like a workaround, just like relying on version name or package name conventions feels to me. I think this is where Eric Evan's book of Domain-Driven Design calls for "Making an implicit concept explicit". One might also say that branches are not a good idea anyway . That there should only be feature flags or really-short-lived branches that are quickly reviewed and then merged. But to have only short-lived branches without the overhead of actual branch management, *we would need better tools to track contributions and a commitment to process them quickly*! The last part might not be feasible even if we had the tools, because you currently cannot earn a living from maintaining and supervising Squeak Trunk development. And about feature flags: I hear we have too many preferences already? ;-) Now hitting "Post Message" before it's 3 a.m. again... Kind regards, Jakob -- Sent from: http://forum.world.st/Squeak-Dev-f45488.html From forums.jakob at resfarm.de Tue Oct 6 21:06:16 2020 From: forums.jakob at resfarm.de (Jakob Reschke) Date: Tue, 6 Oct 2020 23:06:16 +0200 Subject: [squeak-dev] Development methodology (was: tedious        programming-in-the-debugger error needs fixing) In-Reply-To: <1602018189652-0.post@n4.nabble.com> References: <076817EE-1506-47F9-9AF4-3126C6D3BC76@rowledge.org> <1601860447473-0.post@n4.nabble.com> <025A3F5C-E26E-44C6-B19B-FBED361CE779@gmail.com> <174f8f5548b.e4c3e13b138475.8358330872058455280@zoho.com> <1601925526567-0.post@n4.nabble.com> <1601981278751-0.post@n4.nabble.com> <1602018189652-0.post@n4.nabble.com> Message-ID: Am Di., 6. Okt. 2020 um 23:03 Uhr schrieb Jakob Reschke : > I marked some key points in bold in > the following paragraphs in case you cannot afford to read all of it. Sorry > to those on plaintext mail clients. Haha, Nabble converts everything to plain text with some markup anyway. So look out for the *text between asterisks* if you are in the target audience. From forums.jakob at resfarm.de Tue Oct 6 21:13:44 2020 From: forums.jakob at resfarm.de (Jakob Reschke) Date: Tue, 6 Oct 2020 16:13:44 -0500 (CDT) Subject: [squeak-dev] Development methodology (was: tedious        programming-in-the-debugger error needs fixing) In-Reply-To: References: <076817EE-1506-47F9-9AF4-3126C6D3BC76@rowledge.org> <1601860447473-0.post@n4.nabble.com> <025A3F5C-E26E-44C6-B19B-FBED361CE779@gmail.com> <174f8f5548b.e4c3e13b138475.8358330872058455280@zoho.com> <1601925526567-0.post@n4.nabble.com> <1601981278751-0.post@n4.nabble.com> Message-ID: <1602018824386-0.post@n4.nabble.com> Eliot Miranda-2 wrote > In git we have a massive dependence > on a black box Just to make sure it's noticed, once again in a separate email: We have a usable Git implementation in Smalltalk by now. Not complete, but serviceable. If by black box and dependence you mean that we cannot simply turn the Git interfaces and protocols around, true. But we also don't do that in Monticello, and Monticello is simply not spoken by anyone else. -- Sent from: http://forum.world.st/Squeak-Dev-f45488.html From forums.jakob at resfarm.de Tue Oct 6 21:27:08 2020 From: forums.jakob at resfarm.de (Jakob Reschke) Date: Tue, 6 Oct 2020 16:27:08 -0500 (CDT) Subject: [squeak-dev] Development methodology (was: tedious        programming-in-the-debugger error needs fixing) In-Reply-To: References: <1601475775699-0.post@n4.nabble.com> <1601590406774-0.post@n4.nabble.com> <076817EE-1506-47F9-9AF4-3126C6D3BC76@rowledge.org> <1601860447473-0.post@n4.nabble.com> <025A3F5C-E26E-44C6-B19B-FBED361CE779@gmail.com> <174f8f5548b.e4c3e13b138475.8358330872058455280@zoho.com> <1601925526567-0.post@n4.nabble.com> Message-ID: <1602019628824-0.post@n4.nabble.com> Eliot Miranda-2 wrote > On Mon, Oct 5, 2020 at 12:18 PM Jakob Reschke wrote: > >> So either we have that true Git adapter for Monticello (then we would >> also >> not need our own server implementation), or the server has a Monticello >> frontend in front of the Git backend. >> > > If you were architecting this on a tight budget, which would you choose > and why? This one I didn't answer. Starting from what we have today, I would just remove some big dents from the Git Browser and try to create that differently looking GUI variant of it for the "Monticello appeal". Because this does not have the flaws of Monticello I mentioned, but it can have all its benefits, and much of the work has been done already. Alternatively, try to get this MCGitRepository underway, so you can enjoy whatever you like about the Monticello tools and despise about the Git tools (those in the image, not on the command line), and we could still profit from pull requests etc. on platforms like GitHub, or other kinds of Git integrations. One positive thing about this approach is that it should be possible to copy versions between Git repositories and Monticello repositories as we know them today. The big downside for me in this is that I suspect many will then not even look at the alternative tools and their benefits. On a tight budget, I think the Git server in Smalltalk is not really feasible in a way that it provides any benefit over a self-hosted GitLab. -- Sent from: http://forum.world.st/Squeak-Dev-f45488.html From forums.jakob at resfarm.de Tue Oct 6 21:43:17 2020 From: forums.jakob at resfarm.de (Jakob Reschke) Date: Tue, 6 Oct 2020 16:43:17 -0500 (CDT) Subject: [squeak-dev] Development methodology (was: tedious        programming-in-the-debugger error needs fixing) In-Reply-To: References: <076817EE-1506-47F9-9AF4-3126C6D3BC76@rowledge.org> <1601860447473-0.post@n4.nabble.com> <025A3F5C-E26E-44C6-B19B-FBED361CE779@gmail.com> <174f8f5548b.e4c3e13b138475.8358330872058455280@zoho.com> <1601925526567-0.post@n4.nabble.com> <1601981278751-0.post@n4.nabble.com> Message-ID: <1602020597026-0.post@n4.nabble.com> Phil B wrote > I do very much doubt the durability > of github issues, especially given github's corporate ownership. I think we should focus more on pull requests, not bug reports, and quick wins, even if temporary. If pull requests were no longer free on GitHub (which would mean to cut away the prime feature around which that platform originally revolved), so be it. We could then still push the code somewhere else and return to another tool or process. The benefit of using GitHub would be to get an improvement in contribution tracking *now* (or, rather quickly) without the investment of setting up a custom GitLab and spending the money on additional hosting resources if necessary, or developing a custom Monticello solution. Phil B wrote > There have been numerous times in the past when 'everyone' (esp. major > companies) flocked to things because they had achieved critical mass and > weren't ever going to go away. Visual Basic and Java come to mind. Java is very much alive in the enterprise and still looks like it isn't ever going to go away. Unfortunately, C isn't going away either. ;-) -- Sent from: http://forum.world.st/Squeak-Dev-f45488.html From kirtai+st at gmail.com Tue Oct 6 21:48:25 2020 From: kirtai+st at gmail.com (Douglas Brebner) Date: Tue, 6 Oct 2020 22:48:25 +0100 Subject: [squeak-dev] Development methodology (was: tedious        programming-in-the-debugger error needs fixing) In-Reply-To: <1602020597026-0.post@n4.nabble.com> References: <076817EE-1506-47F9-9AF4-3126C6D3BC76@rowledge.org> <1601860447473-0.post@n4.nabble.com> <025A3F5C-E26E-44C6-B19B-FBED361CE779@gmail.com> <174f8f5548b.e4c3e13b138475.8358330872058455280@zoho.com> <1601925526567-0.post@n4.nabble.com> <1601981278751-0.post@n4.nabble.com> <1602020597026-0.post@n4.nabble.com> Message-ID: <91766959-f9e1-5927-30be-86221e3cfb80@gmail.com> On 06/10/2020 22:43, Jakob Reschke wrote: > The benefit of using GitHub would be to get an improvement in contribution > tracking *now* (or, rather quickly) without the investment of setting up a > custom GitLab and spending the money on additional hosting resources if > necessary, or developing a custom Monticello solution. There are also many other self hosting choices available like gitea which aren't as heavyweight as GitLab. From christoph.thiede at student.hpi.uni-potsdam.de Tue Oct 6 23:09:21 2020 From: christoph.thiede at student.hpi.uni-potsdam.de (Christoph Thiede) Date: Tue, 6 Oct 2020 18:09:21 -0500 (CDT) Subject: [squeak-dev] Metacello broken again In-Reply-To: <95264dba9e6340fb9b793a6938a66caa@student.hpi.uni-potsdam.de> References: <2c3359358004407498a8d3331c381203@student.hpi.uni-potsdam.de> <53086722e7f443a79e1aa74757004963@student.hpi.uni-potsdam.de> <0b4db772e37c42aa819c1565f6cec34c@student.hpi.uni-potsdam.de> <95264dba9e6340fb9b793a6938a66caa@student.hpi.uni-potsdam.de> Message-ID: <1602025761647-0.post@n4.nabble.com> Alright, it works. You must not try to install the SAR after running Metacello new once - even the attempt to install Metacello breaks the things. Best, Christoph -- Sent from: http://forum.world.st/Squeak-Dev-f45488.html From marcel.taeumel at hpi.de Wed Oct 7 07:04:52 2020 From: marcel.taeumel at hpi.de (Marcel Taeumel) Date: Wed, 7 Oct 2020 09:04:52 +0200 Subject: [squeak-dev] The Trunk: Tools-mt.990.mcz In-Reply-To: References: <33cfc4d5734a4e60889777cffcee8713@student.hpi.uni-potsdam.de> <,> Message-ID: Hi Christoph, hi all. Every time you provide an option, you expect the user to make a decision. Easy-to-use interfaces might be found on a different path. ;-) Just my two cents. Best, Marcel Am 06.10.2020 10:40:46 schrieb Thiede, Christoph : Hi Marcel, just an idea - as we are talking about adding possible mode checkboxes to an inspector in [1], we could also add a checkbox for stepping there. We already have such a menu item in the Process Browser ... And then we could add a preference for choosing the default stepping boolean. Hypothetically. :-) Best, Christoph [1] http://forum.world.st/The-Trunk-Tools-eem-994-mcz-td5122902.html [http://forum.world.st/The-Trunk-Tools-eem-994-mcz-td5122902.html] [http://www.hpi.de/] Von: Squeak-dev im Auftrag von Taeumel, Marcel Gesendet: Donnerstag, 1. Oktober 2020 13:58:32 An: squeak-dev; packages at lists.squeakfoundation.org Betreff: Re: [squeak-dev] The Trunk: Tools-mt.990.mcz   Hi Christoph, it has "always" been that way.. I suppose that its (a) for performance reasonse and (b) you are "stopping time" when debugging anyway. :-) Best, Marcel Am 01.10.2020 13:56:55 schrieb Thiede, Christoph : Hi Marcel, just a basic question - why do we disable stepping in Debuggers? :-) Best, Christoph [http://www.hpi.de/] Von: Squeak-dev im Auftrag von commits at source.squeak.org Gesendet: Dienstag, 29. September 2020 10:20:36 An: squeak-dev at lists.squeakfoundation.org; packages at lists.squeakfoundation.org Betreff: [squeak-dev] The Trunk: Tools-mt.990.mcz   Marcel Taeumel uploaded a new version of Tools to project The Trunk: http://source.squeak.org/trunk/Tools-mt.990.mcz [http://source.squeak.org/trunk/Tools-mt.990.mcz] ==================== Summary ==================== Name: Tools-mt.990 Author: mt Time: 29 September 2020, 10:20:33.276444 am UUID: e7da396b-a8ec-7a44-8f15-5ba7d0d30b37 Ancestors: Tools-mt.989 In debuggers, forward model-wake-up call to update inspectors. This fixes the bug where a 'nil' receiver had no fields in the receiver inspector. For example, try debug-it on any expression in the workspace to trigger that bug. Note that the underlying challenge is that the inspectors in debuggers are not stepping. Field updates are triggered manually via #updateInspectors. An inspector's initial object is 'nil'. So, "changing" that to 'nil' will not update the field list in inspectors bc. it is considered redundant and will be ignored there. While stepping is not required to produce the initial field list, the model-wake-up call will usually trigger that initial update in a stand-alone inspector. That's why I think that it is not necessary to change anything in the inspector code but only here in the debugger. =============== Diff against Tools-mt.989 =============== Item was added: + ----- Method: Debugger>>modelWakeUpIn: (in category 'user interface') ----- + modelWakeUpIn: aWindow + +        super modelWakeUpIn: aWindow. +        self updateInspectors.! -------------- next part -------------- An HTML attachment was scrubbed... URL: From marcel.taeumel at hpi.de Wed Oct 7 07:07:27 2020 From: marcel.taeumel at hpi.de (Marcel Taeumel) Date: Wed, 7 Oct 2020 09:07:27 +0200 Subject: [squeak-dev] The Inbox: Graphics-ct.441.mcz In-Reply-To: <891495ff79994782a743b4f01b49f4e8@student.hpi.uni-potsdam.de> References: <1c939280-8685-4c3d-0f8a-f1c2287dc2fa@zogotounga.net> <,> <891495ff79994782a743b4f01b49f4e8@student.hpi.uni-potsdam.de> Message-ID: Then make it at least consistent. ;-) That ifNil-case will still produce parentheses. So ... Best, Marcel Am 01.10.2020 14:09:59 schrieb Thiede, Christoph : Hm, isn't it enough to add the parentheses in the store string? (6 at 7) printString does not have parentheses either ... Best, Christoph [http://www.hpi.de/] Von: Squeak-dev im Auftrag von Taeumel, Marcel Gesendet: Donnerstag, 1. Oktober 2020 12:55:16 An: squeak-dev Betreff: Re: [squeak-dev] The Inbox: Graphics-ct.441.mcz   Nice. Given that #storeOn: is used, we should take care to always wrap the result in parentheses. -> '(Color red alpha: 0.4)' Best, Marcel Am 01.10.2020 10:51:29 schrieb Stéphane Rollandin : > Proposal: Isolate alpha channel when printing a named color. This allows it to reuse the color name even for translucent color. > > Example: > (Color red alpha: 0.4) printString > Output (new): > 'Color red alpha: 0.4' > Output (old): > '(TranslucentColor r: 1 g: 0.0 b: 0.0 alpha: 0.4)' +1 Stef -------------- next part -------------- An HTML attachment was scrubbed... URL: From marcel.taeumel at hpi.de Wed Oct 7 07:11:53 2020 From: marcel.taeumel at hpi.de (Marcel Taeumel) Date: Wed, 7 Oct 2020 09:11:53 +0200 Subject: [squeak-dev] The Inbox: Morphic-ct.1691.mcz In-Reply-To: References: Message-ID: Hehe. "aMorph" is a good example for unfortunate naming. Took me a while to figure out that the "a" stands for "alpha" after reading the list of inst vars: hsvMorph, aMorph :-D Best, Marcel Am 01.10.2020 02:50:29 schrieb commits at source.squeak.org : Christoph Thiede uploaded a new version of Morphic to project The Inbox: http://source.squeak.org/inbox/Morphic-ct.1691.mcz ==================== Summary ==================== Name: Morphic-ct.1691 Author: ct Time: 1 October 2020, 2:50:08.612807 am UUID: f9f5e618-2e8a-3f4b-a1f8-1c9aca2b5f01 Ancestors: Morphic-eem.1686 Fixes alpha selection strip in HSVA color selector, which has always lived one click back in past. =============== Diff against Morphic-eem.1686 =============== Item was changed: ----- Method: HSVAColorSelectorMorph>>alphaSelected: (in category 'accessing') ----- alphaSelected: aFloat "The alpha has changed." + self aMorph value: aFloat. self triggerSelectedColor! -------------- next part -------------- An HTML attachment was scrubbed... URL: From marcel.taeumel at hpi.de Wed Oct 7 07:19:05 2020 From: marcel.taeumel at hpi.de (Marcel Taeumel) Date: Wed, 7 Oct 2020 09:19:05 +0200 Subject: [squeak-dev] The Inbox: Morphic-ct.1690.mcz In-Reply-To: References: Message-ID: Hi Christoph. > However, in some cases the list morph is redrawn while the #getList operation is being performed ... Not sure whether such cases are worth addressing as they tend to blow up implementations rather quickly. There is *a lot* of code in Squeak/Morphic that is either non re-entrant or non transactional. One solution could be to exclusively draw the system progress bar. But this could lead to other small visual glitches. -1 on this one bc. it complicates the implementation (list can now be #locked, extra inst var) to cure a rare visual glitch Best, Marcel Am 01.10.2020 02:42:35 schrieb commits at source.squeak.org : A new version of Morphic was added to project The Inbox: http://source.squeak.org/inbox/Morphic-ct.1690.mcz ==================== Summary ==================== Name: Morphic-ct.1690 Author: ct Time: 1 October 2020, 2:42:17.443188 am UUID: 58a1128e-5547-4236-bc03-0c1f1366bb7b Ancestors: Morphic-eem.1686 Fixes display invalidation in PluggableListMorph when displayed during updating the list contents. To avoid recursive #getList sends, since Morphic-mt.1576, the list variable has been cleaned up before sending #getFullList/#getFilteredList. However, in some cases the list morph is redrawn while the #getList operation is being performed, for example if the model code shows a system progress bar (e.g. when loading/refreshing code in Monticello). In the past, this led to drawing artifacts during the list update. To avoid these artifacts, this version implements the list update as an atomic operation by storing the previous list contents in the variable previousStableList while recomputing the list. In addition, if #getList is curtailed, the previous list contents are restored (which is especially helpful during debugging). =============== Diff against Morphic-eem.1686 =============== Item was changed: ScrollPane subclass: #PluggableListMorph + instanceVariableNames: 'list fullList modelToView viewToModel getListSelector getListSizeSelector getListElementSelector getIndexSelector setIndexSelector keystrokeActionSelector autoDeselect lastKeystrokeTime lastKeystrokes lastClickTime doubleClickSelector handlesBasicKeys potentialDropRow hoverRow listMorph keystrokePreviewSelector priorSelection getIconSelector getHelpSelector previousStableList' - instanceVariableNames: 'list fullList modelToView viewToModel getListSelector getListSizeSelector getListElementSelector getIndexSelector setIndexSelector keystrokeActionSelector autoDeselect lastKeystrokeTime lastKeystrokes lastClickTime doubleClickSelector handlesBasicKeys potentialDropRow hoverRow listMorph keystrokePreviewSelector priorSelection getIconSelector getHelpSelector' classVariableNames: 'ClearFilterAutomatically ClearFilterDelay FilterableLists FlashOnErrors HighlightHoveredRow HighlightPreSelection MenuRequestUpdatesSelection' poolDictionaries: '' category: 'Morphic-Pluggable Widgets'! !PluggableListMorph commentStamp: 'mt 10/12/2019 11:04' prior: 0! I am a list widget that uses the change/update mechanism to display model data as a vertical arrangement of (maybe formatted) strings and icons in a scroll pane. When I am in keyboard focus, type in a letter (or several letters quickly) to go to the next item that begins with that letter. If you enabled the "filterable lists" preference, I will hide all items that do not match the filter. Special keys (arrow up/down, page up/down, home, end) are also supported.! Item was changed: ----- Method: PluggableListMorph>>getList (in category 'model access - cached') ----- getList + "Answer the (maybe filtered) list to be displayed. Cached result, see #updateList. If the list needs to be updated, do this atomically." + + list = #locked ifTrue: [ + "The list is already being updated at the moment but needs to be accessed again during the update. To avoid recursion, the update is implemented as an atomic operation. This can happen, for example, when the model fetches data that opens the system progress bar which then will redraw periodically." + ^ previousStableList ifNil: #()]. - "Answer the (maybe filtered) list to be displayed. Cached result, see #updateList." - ^ list ifNil: [ + list := #locked. - list := #(). "To make this call safe when re-entering it while fetching the list. This can happen, for example, when the model fetches data that opens the system progress bar which then will redraw periodically." list := self filterableList ifTrue: [self getFilteredList] ifFalse: [self getFullList]. self updateListMorph. list]! Item was changed: ----- Method: PluggableListMorph>>updateListFilter (in category 'updating') ----- updateListFilter | selection | selection := self selectionIndex = 0 "Avoid fetching #getList here." ifTrue: [nil] ifFalse: [self selection]. + previousStableList := list. + [list := nil. - list := nil. modelToView := Dictionary new. viewToModel := Dictionary new. + self getList] ensure: [ + list ifNil: [list := previousStableList]. + previousStableList := nil]. - self getList. "Try to restore the last selection." selection ifNotNil: [self selection: selection].! -------------- next part -------------- An HTML attachment was scrubbed... URL: From tonyg at leastfixedpoint.com Wed Oct 7 08:30:07 2020 From: tonyg at leastfixedpoint.com (Tony Garnock-Jones) Date: Wed, 7 Oct 2020 10:30:07 +0200 Subject: [squeak-dev] BitSyntax for Squeak Message-ID: <68bf17b6-91c6-529d-7d23-11cb76aee428@leastfixedpoint.com> Hi all, As I've been working on getting a working cellphone with Squeak in charge of the operating system, I've found myself needing to decode and encode a number of complex telephony packet formats such as the following, an incoming SMS delivery message containing an SMS-DELIVER TPDU in GSM 03.40 format, containing seven-bit (!) GSM 03.38-encoded text: 02 01 ffff 01 28 07911356131313f3 04 0b911316325476f8 000002909021044480 0ec67219644e83cc6f90b9de0e01 It turns out there are a *plethora* of such binary formats needed to get a working cellphone. I started off hand-rolling them, but it quickly became too much, so borrowing from Erlang, I implemented BitSyntax for Smalltalk: https://squeaksource.com/BitSyntax.html The BitSyntax package includes a `BitSyntaxCompiler` class which interprets `BitSyntaxSpecification` objects, producing reasonably efficient Smalltalk for decoding and encoding binary structures, mapping from bytes to instance variables and back again. Specs are written in an embedded DSL and look like this: (2 bytesLE >> #statusCode), (4 bytesLE storeTemp: #messageLength expr: 'statusMessage size'), (#messageLength bytes ascii >> #statusMessage) I wrote a blog post containing a bit more detail and a bigger example based on the SMS message above: https://eighty-twenty.org/2020/10/07/bit-syntax-for-smalltalk There's also a wiki page, which includes examples of the generated code: https://wiki.squeak.org/squeak/6649 And if you install the code, there's a manual as part of Squeak's Help system: (Installer squeaksource project: 'BitSyntax') install: 'BitSyntax-Core'; "the compiler and EDSL" install: 'BitSyntax-Examples'; "non-trivial examples" install: 'BitSyntax-Help'. "user guide and reference" Enjoy! Cheers, Tony From gettimothy at zoho.com Wed Oct 7 10:47:19 2020 From: gettimothy at zoho.com (gettimothy) Date: Wed, 07 Oct 2020 06:47:19 -0400 Subject: [squeak-dev] Metacello broken again In-Reply-To: <1602025761647-0.post@n4.nabble.com> References: <2c3359358004407498a8d3331c381203@student.hpi.uni-potsdam.de> <53086722e7f443a79e1aa74757004963@student.hpi.uni-potsdam.de> <0b4db772e37c42aa819c1565f6cec34c@student.hpi.uni-potsdam.de> <95264dba9e6340fb9b793a6938a66caa@student.hpi.uni-potsdam.de> <1602025761647-0.post@n4.nabble.com> Message-ID: <17502ac2bc7.edd60f681682.5461272996335529049@zoho.com> WHAT is the SAR?thx ---- On Tue, 06 Oct 2020 19:09:21 -0400 christoph.thiede at student.hpi.uni-potsdam.de wrote ----Alright, it works. You must not try to install the SAR after runningMetacello new once - even the attempt to install Metacello breaks thethings.Best,Christoph--Sent from: http://forum.world.st/Squeak-Dev-f45488.html -------------- next part -------------- An HTML attachment was scrubbed... URL: From christoph.thiede at student.hpi.uni-potsdam.de Wed Oct 7 10:55:10 2020 From: christoph.thiede at student.hpi.uni-potsdam.de (Christoph Thiede) Date: Wed, 7 Oct 2020 05:55:10 -0500 (CDT) Subject: [squeak-dev] Metacello broken again In-Reply-To: <17502ac2bc7.edd60f681682.5461272996335529049@zoho.com> References: <2c3359358004407498a8d3331c381203@student.hpi.uni-potsdam.de> <53086722e7f443a79e1aa74757004963@student.hpi.uni-potsdam.de> <0b4db772e37c42aa819c1565f6cec34c@student.hpi.uni-potsdam.de> <95264dba9e6340fb9b793a6938a66caa@student.hpi.uni-potsdam.de> <1602025761647-0.post@n4.nabble.com> <17502ac2bc7.edd60f681682.5461272996335529049@zoho.com> Message-ID: <1602068110450-0.post@n4.nabble.com> > WHAT is the SAR? See Tom's attachment from this post: http://forum.world.st/template/NamlServlet.jtp?macro=reply&node=5123118 -- Sent from: http://forum.world.st/Squeak-Dev-f45488.html From commits at source.squeak.org Wed Oct 7 11:51:38 2020 From: commits at source.squeak.org (commits at source.squeak.org) Date: Wed, 7 Oct 2020 11:51:38 0000 Subject: [squeak-dev] The Inbox: Morphic-ct.1693.mcz Message-ID: A new version of Morphic was added to project The Inbox: http://source.squeak.org/inbox/Morphic-ct.1693.mcz ==================== Summary ==================== Name: Morphic-ct.1693 Author: ct Time: 7 October 2020, 1:51:31.244742 pm UUID: 44dd03e5-ba2e-0449-bdcc-162507d4bb77 Ancestors: Morphic-eem.1686 Fixes unnecessary layout hickup during repositioning a SystemProgressMorph. Speeds up Collection >> #do:displayingProgress: significantly. See http://forum.world.st/Overhead-of-SystemProgressMorph-do-displayingProgress-is-huge-td5123048.html for more information. Thanks to Marcel for the tip! :-) =============== Diff against Morphic-eem.1686 =============== Item was added: + ----- Method: SystemProgressMorph>>extent: (in category 'as yet unclassified') ----- + extent: foo + + "self haltIf: [self extent ~= foo]." + ^ super extent:foo! Item was changed: ----- Method: SystemProgressMorph>>reposition (in category 'private') ----- reposition "Put ourself in the requested position on the display, but ensure completely within the bounds of the display" | position | self bounds: + ((self bounds - ((self fullBounds align: self fullBounds center with: (self requestedPosition ifNil: [ self fullBounds center ])) translatedToBeWithin: Display boundingBox). "Check to see if labels are wider than progress bars. In that case do a centered instead of the default left aligned layout." position := self width > (Inset x * 2 + (self borderWidth * 2) + BarWidth) ifTrue: [ #topCenter ] ifFalse: [ #leftCenter ]. self cellPositioning: position! From Christoph.Thiede at student.hpi.uni-potsdam.de Wed Oct 7 11:53:51 2020 From: Christoph.Thiede at student.hpi.uni-potsdam.de (Thiede, Christoph) Date: Wed, 7 Oct 2020 11:53:51 +0000 Subject: [squeak-dev] Overhead of SystemProgressMorph/#do:displayingProgress: is huge In-Reply-To: <91238D33-E250-439C-93EB-2298B6F7795B@rowledge.org> References: <88320e6951f147939dd02fb013008db1@student.hpi.uni-potsdam.de> <, > <052f3ca046c444fa99a73a3473871732@student.hpi.uni-potsdam.de> <,> , <91238D33-E250-439C-93EB-2298B6F7795B@rowledge.org> Message-ID: Hi Marcel, thanks for the hint! Please see Morphic-ct.1693 which reduces the #do:displayingProgress: overhead up from 6770 ms to 1000 ms. :-) > Or maybe just drop the drop shadows idiom entirely. It's a tired UI trope. For this particular problem, it should not be relevant any longer. Without a good reason, I'd rather keep useful functionality in place. :-) Best, Christoph ________________________________ Von: Squeak-dev im Auftrag von tim Rowledge Gesendet: Dienstag, 6. Oktober 2020 18:58:36 An: The general-purpose Squeak developers list Betreff: Re: [squeak-dev] Overhead of SystemProgressMorph/#do:displayingProgress: is huge > On 2020-10-06, at 7:39 AM, Marcel Taeumel wrote: > > Hi Christoph, > > try to get rid of that extra send of #extent: with bogus values. > > > Can we move that "self removeProperty: #dropShadow" statement from Morph >> #extent: to some deferred point, maybe #doLayoutIn:? Or add a second property, #dropShadowBounds, and invalidate the cache when looking it up only? > Or maybe just drop the drop shadows idiom entirely. It's a tired UI trope. tim -- tim Rowledge; tim at rowledge.org; http://www.rowledge.org/tim Strange OpCodes: PWB: Put to Waste Basket -------------- next part -------------- An HTML attachment was scrubbed... URL: From Christoph.Thiede at student.hpi.uni-potsdam.de Wed Oct 7 11:56:08 2020 From: Christoph.Thiede at student.hpi.uni-potsdam.de (Thiede, Christoph) Date: Wed, 7 Oct 2020 11:56:08 +0000 Subject: [squeak-dev] The Inbox: Morphic-ct.1691.mcz In-Reply-To: References: , Message-ID: <0b712f6d605b488d96883a419c0dd5b8@student.hpi.uni-potsdam.de> Would you like me to rename it or is this not worth the effort? :-) Best, Christoph ________________________________ Von: Squeak-dev im Auftrag von Taeumel, Marcel Gesendet: Mittwoch, 7. Oktober 2020 09:11:53 An: squeak-dev Betreff: Re: [squeak-dev] The Inbox: Morphic-ct.1691.mcz Hehe. "aMorph" is a good example for unfortunate naming. Took me a while to figure out that the "a" stands for "alpha" after reading the list of inst vars: hsvMorph, aMorph :-D Best, Marcel Am 01.10.2020 02:50:29 schrieb commits at source.squeak.org : Christoph Thiede uploaded a new version of Morphic to project The Inbox: http://source.squeak.org/inbox/Morphic-ct.1691.mcz ==================== Summary ==================== Name: Morphic-ct.1691 Author: ct Time: 1 October 2020, 2:50:08.612807 am UUID: f9f5e618-2e8a-3f4b-a1f8-1c9aca2b5f01 Ancestors: Morphic-eem.1686 Fixes alpha selection strip in HSVA color selector, which has always lived one click back in past. =============== Diff against Morphic-eem.1686 =============== Item was changed: ----- Method: HSVAColorSelectorMorph>>alphaSelected: (in category 'accessing') ----- alphaSelected: aFloat "The alpha has changed." + self aMorph value: aFloat. self triggerSelectedColor! -------------- next part -------------- An HTML attachment was scrubbed... URL: From lewis at mail.msen.com Wed Oct 7 13:14:48 2020 From: lewis at mail.msen.com (David T. Lewis) Date: Wed, 7 Oct 2020 09:14:48 -0400 Subject: [squeak-dev] Metacello broken again In-Reply-To: <1602068110450-0.post@n4.nabble.com> References: <2c3359358004407498a8d3331c381203@student.hpi.uni-potsdam.de> <53086722e7f443a79e1aa74757004963@student.hpi.uni-potsdam.de> <0b4db772e37c42aa819c1565f6cec34c@student.hpi.uni-potsdam.de> <95264dba9e6340fb9b793a6938a66caa@student.hpi.uni-potsdam.de> <1602025761647-0.post@n4.nabble.com> <17502ac2bc7.edd60f681682.5461272996335529049@zoho.com> <1602068110450-0.post@n4.nabble.com> Message-ID: <20201007131448.GA25554@shell.msen.com> On Wed, Oct 07, 2020 at 05:55:10AM -0500, Christoph Thiede wrote: > > WHAT is the SAR? > > See Tom's attachment from this post: > http://forum.world.st/template/NamlServlet.jtp?macro=reply&node=5123118 > See also the class comment of SARInstaller for an explanation of the SAR format. The SARBuilder tool can be loaded from the SqueakMap installer. Dave From Christoph.Thiede at student.hpi.uni-potsdam.de Wed Oct 7 14:01:00 2020 From: Christoph.Thiede at student.hpi.uni-potsdam.de (Thiede, Christoph) Date: Wed, 7 Oct 2020 14:01:00 +0000 Subject: [squeak-dev] Metacello broken again In-Reply-To: <20201007131448.GA25554@shell.msen.com> References: <2c3359358004407498a8d3331c381203@student.hpi.uni-potsdam.de> <53086722e7f443a79e1aa74757004963@student.hpi.uni-potsdam.de> <0b4db772e37c42aa819c1565f6cec34c@student.hpi.uni-potsdam.de> <95264dba9e6340fb9b793a6938a66caa@student.hpi.uni-potsdam.de> <1602025761647-0.post@n4.nabble.com> <17502ac2bc7.edd60f681682.5461272996335529049@zoho.com> <1602068110450-0.post@n4.nabble.com>,<20201007131448.GA25554@shell.msen.com> Message-ID: There is already a SARBuilder? I reinvented the wheel only yesterday ... ^^ Best, Christoph ________________________________ Von: Squeak-dev im Auftrag von David T. Lewis Gesendet: Mittwoch, 7. Oktober 2020 15:14:48 An: The general-purpose Squeak developers list Betreff: Re: [squeak-dev] Metacello broken again On Wed, Oct 07, 2020 at 05:55:10AM -0500, Christoph Thiede wrote: > > WHAT is the SAR? > > See Tom's attachment from this post: > http://forum.world.st/template/NamlServlet.jtp?macro=reply&node=5123118 > See also the class comment of SARInstaller for an explanation of the SAR format. The SARBuilder tool can be loaded from the SqueakMap installer. Dave -------------- next part -------------- An HTML attachment was scrubbed... URL: From kirtai+st at gmail.com Wed Oct 7 14:13:50 2020 From: kirtai+st at gmail.com (Douglas Brebner) Date: Wed, 7 Oct 2020 15:13:50 +0100 Subject: [squeak-dev] BitSyntax for Squeak In-Reply-To: <68bf17b6-91c6-529d-7d23-11cb76aee428@leastfixedpoint.com> References: <68bf17b6-91c6-529d-7d23-11cb76aee428@leastfixedpoint.com> Message-ID: On 07/10/2020 09:30, Tony Garnock-Jones wrote: > I started off hand-rolling them, but it quickly became too much, so > borrowing from Erlang, I implemented BitSyntax for Smalltalk: > > https://squeaksource.com/BitSyntax.html > > The BitSyntax package includes a `BitSyntaxCompiler` class which > interprets `BitSyntaxSpecification` objects, producing reasonably > efficient Smalltalk for decoding and encoding binary structures, mapping > from bytes to instance variables and back again. Weird, I was looking into binary parsing tools only yesterday. Thanks for this :) From tonyg at leastfixedpoint.com Wed Oct 7 14:24:53 2020 From: tonyg at leastfixedpoint.com (Tony Garnock-Jones) Date: Wed, 7 Oct 2020 16:24:53 +0200 Subject: [squeak-dev] BitSyntax for Squeak In-Reply-To: References: <68bf17b6-91c6-529d-7d23-11cb76aee428@leastfixedpoint.com> Message-ID: <34a2e47d-aba4-0e8f-1649-69b9da0bf62f@leastfixedpoint.com> On 10/7/20 4:13 PM, Douglas Brebner wrote: > Weird, I was looking into binary parsing tools only yesterday. > > Thanks for this :) You're welcome! If you try it out and have any feedback I'd be keen to hear it. Cheers, Tony From Christoph.Thiede at student.hpi.uni-potsdam.de Wed Oct 7 14:46:09 2020 From: Christoph.Thiede at student.hpi.uni-potsdam.de (Thiede, Christoph) Date: Wed, 7 Oct 2020 14:46:09 +0000 Subject: [squeak-dev] The Trunk: Tools-mt.990.mcz In-Reply-To: References: <33cfc4d5734a4e60889777cffcee8713@student.hpi.uni-potsdam.de> <,> , Message-ID: Also right. So let's defer this question again until someone has a real use case for stepping in debuggers ... :-) Best, Christoph ________________________________ Von: Squeak-dev im Auftrag von Taeumel, Marcel Gesendet: Mittwoch, 7. Oktober 2020 09:04:52 An: squeak-dev; packages at lists.squeakfoundation.org Betreff: Re: [squeak-dev] The Trunk: Tools-mt.990.mcz Hi Christoph, hi all. Every time you provide an option, you expect the user to make a decision. Easy-to-use interfaces might be found on a different path. ;-) Just my two cents. Best, Marcel Am 06.10.2020 10:40:46 schrieb Thiede, Christoph : Hi Marcel, just an idea - as we are talking about adding possible mode checkboxes to an inspector in [1], we could also add a checkbox for stepping there. We already have such a menu item in the Process Browser ... And then we could add a preference for choosing the default stepping boolean. Hypothetically. :-) Best, Christoph [1] http://forum.world.st/The-Trunk-Tools-eem-994-mcz-td5122902.html ________________________________ Von: Squeak-dev im Auftrag von Taeumel, Marcel Gesendet: Donnerstag, 1. Oktober 2020 13:58:32 An: squeak-dev; packages at lists.squeakfoundation.org Betreff: Re: [squeak-dev] The Trunk: Tools-mt.990.mcz Hi Christoph, it has "always" been that way.. I suppose that its (a) for performance reasonse and (b) you are "stopping time" when debugging anyway. :-) Best, Marcel Am 01.10.2020 13:56:55 schrieb Thiede, Christoph : Hi Marcel, just a basic question - why do we disable stepping in Debuggers? :-) Best, Christoph ________________________________ Von: Squeak-dev im Auftrag von commits at source.squeak.org Gesendet: Dienstag, 29. September 2020 10:20:36 An: squeak-dev at lists.squeakfoundation.org; packages at lists.squeakfoundation.org Betreff: [squeak-dev] The Trunk: Tools-mt.990.mcz Marcel Taeumel uploaded a new version of Tools to project The Trunk: http://source.squeak.org/trunk/Tools-mt.990.mcz ==================== Summary ==================== Name: Tools-mt.990 Author: mt Time: 29 September 2020, 10:20:33.276444 am UUID: e7da396b-a8ec-7a44-8f15-5ba7d0d30b37 Ancestors: Tools-mt.989 In debuggers, forward model-wake-up call to update inspectors. This fixes the bug where a 'nil' receiver had no fields in the receiver inspector. For example, try debug-it on any expression in the workspace to trigger that bug. Note that the underlying challenge is that the inspectors in debuggers are not stepping. Field updates are triggered manually via #updateInspectors. An inspector's initial object is 'nil'. So, "changing" that to 'nil' will not update the field list in inspectors bc. it is considered redundant and will be ignored there. While stepping is not required to produce the initial field list, the model-wake-up call will usually trigger that initial update in a stand-alone inspector. That's why I think that it is not necessary to change anything in the inspector code but only here in the debugger. =============== Diff against Tools-mt.989 =============== Item was added: + ----- Method: Debugger>>modelWakeUpIn: (in category 'user interface') ----- + modelWakeUpIn: aWindow + + super modelWakeUpIn: aWindow. + self updateInspectors.! -------------- next part -------------- An HTML attachment was scrubbed... URL: From commits at source.squeak.org Wed Oct 7 14:51:12 2020 From: commits at source.squeak.org (commits at source.squeak.org) Date: Wed, 7 Oct 2020 14:51:12 0000 Subject: [squeak-dev] The Inbox: Graphics-ct.442.mcz Message-ID: Christoph Thiede uploaded a new version of Graphics to project The Inbox: http://source.squeak.org/inbox/Graphics-ct.442.mcz ==================== Summary ==================== Name: Graphics-ct.442 Author: ct Time: 7 October 2020, 4:51:00.599313 pm UUID: 5e479960-0629-754b-9899-a0e6cc38e979 Ancestors: Graphics-ct.441 Makes color printing more consistent. #printString does not add brackets, #storeString does. =============== Diff against Graphics-ct.441 =============== Item was added: + ----- Method: Color>>basicStoreOn: (in category 'printing') ----- + basicStoreOn: aStream + + aStream + nextPutAll: self species name; + nextPutAll: ' r: '; print: self red maxDecimalPlaces: 3; + nextPutAll: ' g: '; print: self green maxDecimalPlaces: 3; + nextPutAll: ' b: '; print: self blue maxDecimalPlaces: 3.! Item was changed: ----- Method: Color>>printOn: (in category 'printing') ----- printOn: aStream | name | name := self asNontranslucentColor name. + name ifNil: [^ self basicStoreOn: aStream]. - name ifNil: [^ self storeOn: aStream]. aStream nextPutAll: 'Color '; nextPutAll: name. self isTranslucent ifTrue: [ aStream nextPutAll: ' alpha: '; print: self alpha maxDecimalPlaces: 3].! Item was changed: ----- Method: Color>>storeOn: (in category 'printing') ----- storeOn: aStream + aStream nextPut: $(. + self basicStoreOn: aStream. + aStream nextPut: $).! - aStream - nextPutAll: '(' , self species name; - nextPutAll: ' r: '; print: self red maxDecimalPlaces: 3; - nextPutAll: ' g: '; print: self green maxDecimalPlaces: 3; - nextPutAll: ' b: '; print: self blue maxDecimalPlaces: 3; - nextPutAll: ')'. - ! From Christoph.Thiede at student.hpi.uni-potsdam.de Wed Oct 7 14:55:21 2020 From: Christoph.Thiede at student.hpi.uni-potsdam.de (Thiede, Christoph) Date: Wed, 7 Oct 2020 14:55:21 +0000 Subject: [squeak-dev] The Inbox: Morphic-ct.1690.mcz In-Reply-To: References: , Message-ID: Hi Marcel, didn't you handle the same edge case when you edited this method the latest time? I think the screenshot shared in my previous post is a really ugly think, and depending on your image speed, you have to look at it for a quite long time. I do not want to see this again in my image ... However, if you know any more elegant way to fix the problem, I'll be glad to apply your suggestions. I think the changes are quite small because the list variable is a private detail and only accessed in two methods in total. Best, Christoph ________________________________ Von: Squeak-dev im Auftrag von Taeumel, Marcel Gesendet: Mittwoch, 7. Oktober 2020 09:19:05 An: squeak-dev Betreff: Re: [squeak-dev] The Inbox: Morphic-ct.1690.mcz Hi Christoph. > However, in some cases the list morph is redrawn while the #getList operation is being performed ... Not sure whether such cases are worth addressing as they tend to blow up implementations rather quickly. There is *a lot* of code in Squeak/Morphic that is either non re-entrant or non transactional. One solution could be to exclusively draw the system progress bar. But this could lead to other small visual glitches. -1 on this one bc. it complicates the implementation (list can now be #locked, extra inst var) to cure a rare visual glitch Best, Marcel Am 01.10.2020 02:42:35 schrieb commits at source.squeak.org : A new version of Morphic was added to project The Inbox: http://source.squeak.org/inbox/Morphic-ct.1690.mcz ==================== Summary ==================== Name: Morphic-ct.1690 Author: ct Time: 1 October 2020, 2:42:17.443188 am UUID: 58a1128e-5547-4236-bc03-0c1f1366bb7b Ancestors: Morphic-eem.1686 Fixes display invalidation in PluggableListMorph when displayed during updating the list contents. To avoid recursive #getList sends, since Morphic-mt.1576, the list variable has been cleaned up before sending #getFullList/#getFilteredList. However, in some cases the list morph is redrawn while the #getList operation is being performed, for example if the model code shows a system progress bar (e.g. when loading/refreshing code in Monticello). In the past, this led to drawing artifacts during the list update. To avoid these artifacts, this version implements the list update as an atomic operation by storing the previous list contents in the variable previousStableList while recomputing the list. In addition, if #getList is curtailed, the previous list contents are restored (which is especially helpful during debugging). =============== Diff against Morphic-eem.1686 =============== Item was changed: ScrollPane subclass: #PluggableListMorph + instanceVariableNames: 'list fullList modelToView viewToModel getListSelector getListSizeSelector getListElementSelector getIndexSelector setIndexSelector keystrokeActionSelector autoDeselect lastKeystrokeTime lastKeystrokes lastClickTime doubleClickSelector handlesBasicKeys potentialDropRow hoverRow listMorph keystrokePreviewSelector priorSelection getIconSelector getHelpSelector previousStableList' - instanceVariableNames: 'list fullList modelToView viewToModel getListSelector getListSizeSelector getListElementSelector getIndexSelector setIndexSelector keystrokeActionSelector autoDeselect lastKeystrokeTime lastKeystrokes lastClickTime doubleClickSelector handlesBasicKeys potentialDropRow hoverRow listMorph keystrokePreviewSelector priorSelection getIconSelector getHelpSelector' classVariableNames: 'ClearFilterAutomatically ClearFilterDelay FilterableLists FlashOnErrors HighlightHoveredRow HighlightPreSelection MenuRequestUpdatesSelection' poolDictionaries: '' category: 'Morphic-Pluggable Widgets'! !PluggableListMorph commentStamp: 'mt 10/12/2019 11:04' prior: 0! I am a list widget that uses the change/update mechanism to display model data as a vertical arrangement of (maybe formatted) strings and icons in a scroll pane. When I am in keyboard focus, type in a letter (or several letters quickly) to go to the next item that begins with that letter. If you enabled the "filterable lists" preference, I will hide all items that do not match the filter. Special keys (arrow up/down, page up/down, home, end) are also supported.! Item was changed: ----- Method: PluggableListMorph>>getList (in category 'model access - cached') ----- getList + "Answer the (maybe filtered) list to be displayed. Cached result, see #updateList. If the list needs to be updated, do this atomically." + + list = #locked ifTrue: [ + "The list is already being updated at the moment but needs to be accessed again during the update. To avoid recursion, the update is implemented as an atomic operation. This can happen, for example, when the model fetches data that opens the system progress bar which then will redraw periodically." + ^ previousStableList ifNil: #()]. - "Answer the (maybe filtered) list to be displayed. Cached result, see #updateList." - ^ list ifNil: [ + list := #locked. - list := #(). "To make this call safe when re-entering it while fetching the list. This can happen, for example, when the model fetches data that opens the system progress bar which then will redraw periodically." list := self filterableList ifTrue: [self getFilteredList] ifFalse: [self getFullList]. self updateListMorph. list]! Item was changed: ----- Method: PluggableListMorph>>updateListFilter (in category 'updating') ----- updateListFilter | selection | selection := self selectionIndex = 0 "Avoid fetching #getList here." ifTrue: [nil] ifFalse: [self selection]. + previousStableList := list. + [list := nil. - list := nil. modelToView := Dictionary new. viewToModel := Dictionary new. + self getList] ensure: [ + list ifNil: [list := previousStableList]. + previousStableList := nil]. - self getList. "Try to restore the last selection." selection ifNotNil: [self selection: selection].! -------------- next part -------------- An HTML attachment was scrubbed... URL: From eliot.miranda at gmail.com Wed Oct 7 16:35:11 2020 From: eliot.miranda at gmail.com (Eliot Miranda) Date: Wed, 7 Oct 2020 09:35:11 -0700 Subject: [squeak-dev] The Trunk: Tools-mt.990.mcz In-Reply-To: References: Message-ID: <83CF678F-EDF1-46C4-850F-910CF0D5F8DE@gmail.com> > On Oct 7, 2020, at 7:46 AM, Thiede, Christoph wrote: > >  > Also right. So let's defer this question again until someone has a real use case for stepping in debuggers ... :-) > I don’t understand. I step in debuggers every day. It is too slow. That’s a use case,an important enough use case. And I’d rather throw out the emphasis that I’ve done without for years than accept a debugger I can no longer trust to behave controllably. > > Best, > > Christoph > > Von: Squeak-dev im Auftrag von Taeumel, Marcel > Gesendet: Mittwoch, 7. Oktober 2020 09:04:52 > An: squeak-dev; packages at lists.squeakfoundation.org > Betreff: Re: [squeak-dev] The Trunk: Tools-mt.990.mcz > > Hi Christoph, hi all. > > Every time you provide an option, you expect the user to make a decision. Easy-to-use interfaces might be found on a different path. ;-) Just my two cents. > > Best, > Marcel >> Am 06.10.2020 10:40:46 schrieb Thiede, Christoph : >> >> Hi Marcel, >> >> >> >> just an idea - as we are talking about adding possible mode checkboxes to an inspector in [1], we could also add a checkbox for stepping there. We already have such a menu item in the Process Browser ... And then we could add a preference for choosing the default stepping boolean. Hypothetically. :-) >> >> >> >> Best, >> >> Christoph >> >> >> >> [1] http://forum.world.st/The-Trunk-Tools-eem-994-mcz-td5122902.html >> >> Von: Squeak-dev im Auftrag von Taeumel, Marcel >> Gesendet: Donnerstag, 1. Oktober 2020 13:58:32 >> An: squeak-dev; packages at lists.squeakfoundation.org >> Betreff: Re: [squeak-dev] The Trunk: Tools-mt.990.mcz >> >> Hi Christoph, >> >> it has "always" been that way.. I suppose that its (a) for performance reasonse and (b) you are "stopping time" when debugging anyway. :-) >> >> Best, >> Marcel >>> Am 01.10.2020 13:56:55 schrieb Thiede, Christoph : >>> >>> Hi Marcel, >>> >>> >>> >>> just a basic question - why do we disable stepping in Debuggers? :-) >>> >>> >>> >>> Best, >>> >>> Christoph >>> >>> Von: Squeak-dev im Auftrag von commits at source.squeak.org >>> Gesendet: Dienstag, 29. September 2020 10:20:36 >>> An: squeak-dev at lists.squeakfoundation.org; packages at lists.squeakfoundation.org >>> Betreff: [squeak-dev] The Trunk: Tools-mt.990.mcz >>> >>> Marcel Taeumel uploaded a new version of Tools to project The Trunk: >>> http://source.squeak.org/trunk/Tools-mt.990.mcz >>> >>> ==================== Summary ==================== >>> >>> Name: Tools-mt.990 >>> Author: mt >>> Time: 29 September 2020, 10:20:33.276444 am >>> UUID: e7da396b-a8ec-7a44-8f15-5ba7d0d30b37 >>> Ancestors: Tools-mt.989 >>> >>> In debuggers, forward model-wake-up call to update inspectors. This fixes the bug where a 'nil' receiver had no fields in the receiver inspector. For example, try debug-it on any expression in the workspace to trigger that bug. >>> >>> Note that the underlying challenge is that the inspectors in debuggers are not stepping. Field updates are triggered manually via #updateInspectors. An inspector's initial object is 'nil'. So, "changing" that to 'nil' will not update the field list in inspectors bc. it is considered redundant and will be ignored there. While stepping is not required to produce the initial field list, the model-wake-up call will usually trigger that initial update in a stand-alone inspector. >>> >>> That's why I think that it is not necessary to change anything in the inspector code but only here in the debugger. >>> >>> =============== Diff against Tools-mt.989 =============== >>> >>> Item was added: >>> + ----- Method: Debugger>>modelWakeUpIn: (in category 'user interface') ----- >>> + modelWakeUpIn: aWindow >>> + >>> + super modelWakeUpIn: aWindow. >>> + self updateInspectors.! >>> >>> > -------------- next part -------------- An HTML attachment was scrubbed... URL: From Christoph.Thiede at student.hpi.uni-potsdam.de Wed Oct 7 16:38:54 2020 From: Christoph.Thiede at student.hpi.uni-potsdam.de (Thiede, Christoph) Date: Wed, 7 Oct 2020 16:38:54 +0000 Subject: [squeak-dev] The Trunk: Tools-mt.990.mcz In-Reply-To: <83CF678F-EDF1-46C4-850F-910CF0D5F8DE@gmail.com> References: , <83CF678F-EDF1-46C4-850F-910CF0D5F8DE@gmail.com> Message-ID: Hi Eliot, I think this is a misconception - in this thread, I was not referring to the step buttons in the debugger, but the - never implemented - automatic stepping (self-updating) logic of the debugger's inspectors' contents. Debuggers shouldn't be slow, of course, that's what we are discussing and trying to fix in that other thread. :-) Best, Christoph ________________________________ Von: Squeak-dev im Auftrag von Eliot Miranda Gesendet: Mittwoch, 7. Oktober 2020 18:35:11 An: The general-purpose Squeak developers list Betreff: Re: [squeak-dev] The Trunk: Tools-mt.990.mcz On Oct 7, 2020, at 7:46 AM, Thiede, Christoph wrote:  Also right. So let's defer this question again until someone has a real use case for stepping in debuggers ... :-) I don’t understand. I step in debuggers every day. It is too slow. That’s a use case,an important enough use case. And I’d rather throw out the emphasis that I’ve done without for years than accept a debugger I can no longer trust to behave controllably. Best, Christoph ________________________________ Von: Squeak-dev im Auftrag von Taeumel, Marcel Gesendet: Mittwoch, 7. Oktober 2020 09:04:52 An: squeak-dev; packages at lists.squeakfoundation.org Betreff: Re: [squeak-dev] The Trunk: Tools-mt.990.mcz Hi Christoph, hi all. Every time you provide an option, you expect the user to make a decision. Easy-to-use interfaces might be found on a different path. ;-) Just my two cents. Best, Marcel Am 06.10.2020 10:40:46 schrieb Thiede, Christoph : Hi Marcel, just an idea - as we are talking about adding possible mode checkboxes to an inspector in [1], we could also add a checkbox for stepping there. We already have such a menu item in the Process Browser ... And then we could add a preference for choosing the default stepping boolean. Hypothetically. :-) Best, Christoph [1] http://forum.world.st/The-Trunk-Tools-eem-994-mcz-td5122902.html ________________________________ Von: Squeak-dev im Auftrag von Taeumel, Marcel Gesendet: Donnerstag, 1. Oktober 2020 13:58:32 An: squeak-dev; packages at lists.squeakfoundation.org Betreff: Re: [squeak-dev] The Trunk: Tools-mt.990.mcz Hi Christoph, it has "always" been that way.. I suppose that its (a) for performance reasonse and (b) you are "stopping time" when debugging anyway. :-) Best, Marcel Am 01.10.2020 13:56:55 schrieb Thiede, Christoph : Hi Marcel, just a basic question - why do we disable stepping in Debuggers? :-) Best, Christoph ________________________________ Von: Squeak-dev im Auftrag von commits at source.squeak.org Gesendet: Dienstag, 29. September 2020 10:20:36 An: squeak-dev at lists.squeakfoundation.org; packages at lists.squeakfoundation.org Betreff: [squeak-dev] The Trunk: Tools-mt.990.mcz Marcel Taeumel uploaded a new version of Tools to project The Trunk: http://source.squeak.org/trunk/Tools-mt.990.mcz ==================== Summary ==================== Name: Tools-mt.990 Author: mt Time: 29 September 2020, 10:20:33.276444 am UUID: e7da396b-a8ec-7a44-8f15-5ba7d0d30b37 Ancestors: Tools-mt.989 In debuggers, forward model-wake-up call to update inspectors. This fixes the bug where a 'nil' receiver had no fields in the receiver inspector. For example, try debug-it on any expression in the workspace to trigger that bug. Note that the underlying challenge is that the inspectors in debuggers are not stepping. Field updates are triggered manually via #updateInspectors. An inspector's initial object is 'nil'. So, "changing" that to 'nil' will not update the field list in inspectors bc. it is considered redundant and will be ignored there. While stepping is not required to produce the initial field list, the model-wake-up call will usually trigger that initial update in a stand-alone inspector. That's why I think that it is not necessary to change anything in the inspector code but only here in the debugger. =============== Diff against Tools-mt.989 =============== Item was added: + ----- Method: Debugger>>modelWakeUpIn: (in category 'user interface') ----- + modelWakeUpIn: aWindow + + super modelWakeUpIn: aWindow. + self updateInspectors.! -------------- next part -------------- An HTML attachment was scrubbed... URL: From gettimothy at zoho.com Wed Oct 7 18:23:49 2020 From: gettimothy at zoho.com (gettimothy) Date: Wed, 07 Oct 2020 14:23:49 -0400 Subject: [squeak-dev] Metacello broken again In-Reply-To: <20201007131448.GA25554@shell.msen.com> References: <2c3359358004407498a8d3331c381203@student.hpi.uni-potsdam.de> <53086722e7f443a79e1aa74757004963@student.hpi.uni-potsdam.de> <0b4db772e37c42aa819c1565f6cec34c@student.hpi.uni-potsdam.de> <95264dba9e6340fb9b793a6938a66caa@student.hpi.uni-potsdam.de> <1602025761647-0.post@n4.nabble.com> <17502ac2bc7.edd60f681682.5461272996335529049@zoho.com> <1602068110450-0.post@n4.nabble.com> <20201007131448.GA25554@shell.msen.com> Message-ID: <175044e1d6c.c779fd6a11199.606547361940873885@zoho.com> Thank you both. ---- On Wed, 07 Oct 2020 09:14:48 -0400 David T. Lewis wrote ---- On Wed, Oct 07, 2020 at 05:55:10AM -0500, Christoph Thiede wrote: > > WHAT is the SAR? > > See Tom's attachment from this post: > http://forum.world.st/template/NamlServlet.jtp?macro=reply&node=5123118 > See also the class comment of SARInstaller for an explanation of the SAR format. The SARBuilder tool can be loaded from the SqueakMap installer. Dave -------------- next part -------------- An HTML attachment was scrubbed... URL: From commits at source.squeak.org Wed Oct 7 23:12:00 2020 From: commits at source.squeak.org (commits at source.squeak.org) Date: Wed, 7 Oct 2020 23:12:00 0000 Subject: [squeak-dev] The Trunk: EToys-eem.403.mcz Message-ID: Eliot Miranda uploaded a new version of EToys to project The Trunk: http://source.squeak.org/trunk/EToys-eem.403.mcz ==================== Summary ==================== Name: EToys-eem.403 Author: eem Time: 7 October 2020, 4:11:55.903414 pm UUID: 4ebcb883-1cbd-42fa-a1a4-bf2299298c33 Ancestors: EToys-eem.402 Add interrupt-driven frame capture to the CameraInterface (as yet unused in the WebCamMorph). =============== Diff against EToys-eem.402 =============== Item was added: + ----- Method: CameraInterface class>>camera:setSemaphore: (in category 'camera ops') ----- + camera: cameraNum setSemaphore: semaphoreIndex + "Set an external semaphore index through which to signal that a frame is available. + Fail if cameraNum does not reference an open camera, or if the platform does not + support interrupt-driven frame receipt." + + ^self primitiveFailed! Item was added: + ----- Method: CameraInterface class>>interruptDrivenVideoTest: (in category 'test') ----- + interruptDrivenVideoTest: camNum + "A quick test of video input. Displays video on the screen until the mouse is pressed. + Answer nil if the interrupt-driven interface is unavailable." + "self interruptDrivenVideoTest: 1" + "[self interruptDrivenVideoTest: 2" + "[self interruptDrivenVideoTest: 2] fork. + self interruptDrivenVideoTest: 1" + + | semaphore height | + height := 16. + 1 to: camNum - 1 do: + [:camIndex| "N.B. the of an unopened camera is 0 at 0" + height := height + (CameraInterface frameExtent: camIndex) y + 16]. + (CameraInterface cameraIsOpen: camNum) ifFalse: + [(CameraInterface openCamera: camNum width: 320 height: 240) ifNil: + [self inform: 'no camera'. + ^nil]]. + semaphore := Semaphore new. + [CameraInterface camera: camNum setSemaphore: (Smalltalk registerExternalObject: semaphore)] + on: Error + do: [:err| + Smalltalk unregisterExternalObject: semaphore. + self inform: 'interrupt-driven camera interface unavailable: ', err messageText. + ^nil]. + [| f n startTime frameCount msecs fps | + (self frameExtent: camNum) x = 0 ifTrue: [self inform: 'no camera'. ^nil]. + f := Form extent: (CameraInterface frameExtent: camNum) depth: 32. + frameCount := 0. + startTime := nil. + [semaphore wait. + Sensor anyButtonPressed] whileFalse: + [n := CameraInterface getFrameForCamera: camNum into: f bits. + n > 0 ifTrue: + [startTime ifNil: [startTime := Time millisecondClockValue]. + frameCount := frameCount + 1. + f displayAt: 16 @ height]]. + msecs := Time millisecondClockValue - startTime. + fps := (frameCount * 1000) // msecs. + ^frameCount printString, ' frames at ', fps printString, ' frames/sec'] + ensure: + [CameraInterface closeCamera: camNum. + Smalltalk unregisterExternalObject: semaphore. + Sensor waitNoButton]! From commits at source.squeak.org Thu Oct 8 02:59:24 2020 From: commits at source.squeak.org (commits at source.squeak.org) Date: Thu, 8 Oct 2020 02:59:24 0000 Subject: [squeak-dev] The Trunk: EToys-eem.404.mcz Message-ID: Eliot Miranda uploaded a new version of EToys to project The Trunk: http://source.squeak.org/trunk/EToys-eem.404.mcz ==================== Summary ==================== Name: EToys-eem.404 Author: eem Time: 7 October 2020, 7:59:19.175862 pm UUID: 92684a08-f39d-444c-b97e-8f45b7592cd1 Ancestors: EToys-eem.403 CameraInterface: on Windows the frame extent may not be known until the first frame is delivered, so defer initialization until after the semaphore has been signalled in interruptDrivenVideoTest:. =============== Diff against EToys-eem.403 =============== Item was changed: ----- Method: CameraInterface class>>interruptDrivenVideoTest: (in category 'test') ----- interruptDrivenVideoTest: camNum "A quick test of video input. Displays video on the screen until the mouse is pressed. Answer nil if the interrupt-driven interface is unavailable." "self interruptDrivenVideoTest: 1" + "self interruptDrivenVideoTest: 2" - "[self interruptDrivenVideoTest: 2" "[self interruptDrivenVideoTest: 2] fork. self interruptDrivenVideoTest: 1" | semaphore height | height := 16. 1 to: camNum - 1 do: [:camIndex| "N.B. the of an unopened camera is 0 at 0" height := height + (CameraInterface frameExtent: camIndex) y + 16]. (CameraInterface cameraIsOpen: camNum) ifFalse: [(CameraInterface openCamera: camNum width: 320 height: 240) ifNil: [self inform: 'no camera'. ^nil]]. semaphore := Semaphore new. [CameraInterface camera: camNum setSemaphore: (Smalltalk registerExternalObject: semaphore)] on: Error do: [:err| Smalltalk unregisterExternalObject: semaphore. self inform: 'interrupt-driven camera interface unavailable: ', err messageText. ^nil]. [| f n startTime frameCount msecs fps | - (self frameExtent: camNum) x = 0 ifTrue: [self inform: 'no camera'. ^nil]. - f := Form extent: (CameraInterface frameExtent: camNum) depth: 32. - frameCount := 0. - startTime := nil. [semaphore wait. + "N.B. the frame extet may not be known until the delivery of the first frame. + Si we have to delay initialization." + startTime ifNil: + [(self frameExtent: camNum) x = 0 ifTrue: [self inform: 'no camera'. ^nil]. + f := Form extent: (CameraInterface frameExtent: camNum) depth: 32. + frameCount := 0. + startTime := Time millisecondClockValue]. Sensor anyButtonPressed] whileFalse: [n := CameraInterface getFrameForCamera: camNum into: f bits. n > 0 ifTrue: + [frameCount := frameCount + 1. + f displayAt: 16 @ height]]. - [startTime ifNil: [startTime := Time millisecondClockValue]. - frameCount := frameCount + 1. - f displayAt: 16 @ height]]. msecs := Time millisecondClockValue - startTime. fps := (frameCount * 1000) // msecs. ^frameCount printString, ' frames at ', fps printString, ' frames/sec'] ensure: [CameraInterface closeCamera: camNum. Smalltalk unregisterExternalObject: semaphore. Sensor waitNoButton]! From lecteur at zogotounga.net Thu Oct 8 07:57:51 2020 From: lecteur at zogotounga.net (=?UTF-8?Q?St=c3=a9phane_Rollandin?=) Date: Thu, 8 Oct 2020 09:57:51 +0200 Subject: [squeak-dev] Accessing display scaling in Windows OSes Message-ID: <1a831261-2786-9af4-4703-83caa76313fb@zogotounga.net> Hello, Is there a way for the Squeak image to detect the scaling factor applied to screen display by Windows? For example, my daughter's small laptop on Windows 10 has a default 150% scaling applied to all applications. Squeak does not behave too well in that regard, it looks real fuzzy. Also, 'Display extent' when in full-screen returns the actual OS screen resolution, ignoring the display factor. This means that my Saucers game for example thinks it has more real estate than what is really available, and thus does not compose itself correctly. Stef From lecteur at zogotounga.net Thu Oct 8 08:11:03 2020 From: lecteur at zogotounga.net (=?UTF-8?Q?St=c3=a9phane_Rollandin?=) Date: Thu, 8 Oct 2020 10:11:03 +0200 Subject: [squeak-dev] Accessing display scaling in Windows OSes In-Reply-To: <1a831261-2786-9af4-4703-83caa76313fb@zogotounga.net> References: <1a831261-2786-9af4-4703-83caa76313fb@zogotounga.net> Message-ID: > Is there a way for the Squeak image to detect the scaling factor applied > to screen display by Windows? In fact I realize now that what I would like is a way to have Squeak *ignore* that scaling factor at the level of the display itself, and simply be informed of the factor value so that we can, if we wish, change the font sizes accordingly. Stef From Das.Linux at gmx.de Thu Oct 8 08:12:35 2020 From: Das.Linux at gmx.de (Tobias Pape) Date: Thu, 8 Oct 2020 10:12:35 +0200 Subject: [squeak-dev] highdpi testing In-Reply-To: <5770E3E5-3007-4C98-BD0B-2C7AF24E0796@gmail.com> References: <8F19CF2D-979F-483F-927B-768430E0E1DB@gmx.de> <5770E3E5-3007-4C98-BD0B-2C7AF24E0796@gmail.com> Message-ID: <2E81078F-AD0B-4852-805E-9788C8BB8C5D@gmx.de> Hi Sorry, I did not see this mail. > On 01.10.2020, at 14:44, Eliot Miranda wrote: > > Hi Tobias, > > >> On Sep 30, 2020, at 1:11 PM, Tobias Pape wrote: >> >>  >>> On 30.09.2020, at 19:24, Thiede, Christoph wrote: >>> >>> On Windows, it appears to be a democratic thing - the majority of pixels wins in the question of DPI value. But I'm not absolutely sure about this and cannot test this right now. I don't believe it would be a good idea to override this behavior, even if we could ... >> >> Yes. >> Although I made it modifyable on Unix, just out of tradition that unix leaks every screw… >> >> (https://github.com/OpenSmalltalk/opensmalltalk-vm/blob/krono/highdpi-v2/platforms/unix/vm-display-X11/sqUnixX11Scale.c#L182) >> >> So, anyone interested in me putting the VM stuff into the main branch? > > Yes. The only issue is backwards compatibility. If it isn’t backwards compatible it’s time to > a) do a new release of the 5.x vm > b) bump the version number of the highdpi vm to 6.x It's backward compatible in the sense that nothing really breaks, but things are _tiny_ on HighDPI displays and the image might not care. The best way would be a "handshake" between image and VM, akin to: - start - image says: please do high-dpi - vm says: can do, here you are. The problem ist that this handshake comes too late. For OSX, the canvas has to be set up early on and cannot really be changed without grabbing too deep in the guts of the (now three variants of) display handling code. Windows might be similar. so there are these quadrants: x | old VM | new VM -----------+---------+-------- | | old Image | OK | Problem | | -----------+---------+-------- | | new Image | OK* | OK | | *The high-dpi code just works fine with a constant scale factor, no probs. If someone has an Idea except for "roll with it", I'm all ears. > > If it is backwards compatible then what are you waiting for? > > If you already did, and that’s why yesterday my Squeak desktop suddenly looked so crisp, then thank you sooo sooo much, if looks *fantastic*!! Hm, i only have the stuff on the branch, there must be some magic going on ;D Best regards -Tobias From Das.Linux at gmx.de Thu Oct 8 08:14:37 2020 From: Das.Linux at gmx.de (Tobias Pape) Date: Thu, 8 Oct 2020 10:14:37 +0200 Subject: [squeak-dev] Accessing display scaling in Windows OSes In-Reply-To: <1a831261-2786-9af4-4703-83caa76313fb@zogotounga.net> References: <1a831261-2786-9af4-4703-83caa76313fb@zogotounga.net> Message-ID: Hi > On 08.10.2020, at 09:57, Stéphane Rollandin wrote: > > Hello, > > Is there a way for the Squeak image to detect the scaling factor applied to screen display by Windows? > > For example, my daughter's small laptop on Windows 10 has a default 150% scaling applied to all applications. Squeak does not behave too well in that regard, it looks real fuzzy. > > Also, 'Display extent' when in full-screen returns the actual OS screen resolution, ignoring the display factor. This means that my Saucers game for example thinks it has more real estate than what is really available, and thus does not compose itself correctly. There's an experimental vm branch: https://github.com/OpenSmalltalk/opensmalltalk-vm/tree/krono/highdpi-v2 and some changesets that do this: http://forum.world.st/highdpi-testing-tp5122069p5122307.html There's no pre-built vm at the moment, so if you need a VM please ask and someone can send you one :) Note that this is all a bit untested, feel free to experiment around. Best regards -Tobias From marcel.taeumel at hpi.de Thu Oct 8 08:15:42 2020 From: marcel.taeumel at hpi.de (Marcel Taeumel) Date: Thu, 8 Oct 2020 10:15:42 +0200 Subject: [squeak-dev] Accessing display scaling in Windows OSes In-Reply-To: <1a831261-2786-9af4-4703-83caa76313fb@zogotounga.net> References: <1a831261-2786-9af4-4703-83caa76313fb@zogotounga.net> Message-ID: Hi Stéphane. Tobias is working on this: http://forum.world.st/highdpi-testing-tp5122069.html [http://forum.world.st/highdpi-testing-tp5122069.html] The manual way works like this on windows: 1. Disable scaling for the Squeak application via .manifest and/or (?) manual override on squeak.exe. 2. In Squeak click on Extras > Themes & Colors > Set High-DPI Mode Best, Marcel Am 08.10.2020 09:58:02 schrieb Stéphane Rollandin : Hello, Is there a way for the Squeak image to detect the scaling factor applied to screen display by Windows? For example, my daughter's small laptop on Windows 10 has a default 150% scaling applied to all applications. Squeak does not behave too well in that regard, it looks real fuzzy. Also, 'Display extent' when in full-screen returns the actual OS screen resolution, ignoring the display factor. This means that my Saucers game for example thinks it has more real estate than what is really available, and thus does not compose itself correctly. Stef -------------- next part -------------- An HTML attachment was scrubbed... URL: From lecteur at zogotounga.net Thu Oct 8 08:29:29 2020 From: lecteur at zogotounga.net (=?UTF-8?Q?St=c3=a9phane_Rollandin?=) Date: Thu, 8 Oct 2020 10:29:29 +0200 Subject: [squeak-dev] Accessing display scaling in Windows OSes In-Reply-To: References: <1a831261-2786-9af4-4703-83caa76313fb@zogotounga.net> Message-ID: <6fca87a4-74a9-7da2-528c-5b8b6fa02924@zogotounga.net> > There's an experimental vm branch: > https://github.com/OpenSmalltalk/opensmalltalk-vm/tree/krono/highdpi-v2 > and some changesets that do this: > http://forum.world.st/highdpi-testing-tp5122069p5122307.html Ah, ok, thanks. I never groked that this was what High-DPI is about :) > There's no pre-built vm at the moment, so if you need a VM please ask and someone can send you one :) > > Note that this is all a bit untested, feel free to experiment around. Well, then I am hereby formally and kindly asking for such a VM - I'll sure do some experimenting. Best, Stef From commits at source.squeak.org Thu Oct 8 09:05:42 2020 From: commits at source.squeak.org (commits at source.squeak.org) Date: Thu, 8 Oct 2020 09:05:42 0000 Subject: [squeak-dev] The Trunk: Morphic-tonyg.1687.mcz Message-ID: Tony Garnock-Jones uploaded a new version of Morphic to project The Trunk: http://source.squeak.org/trunk/Morphic-tonyg.1687.mcz ==================== Summary ==================== Name: Morphic-tonyg.1687 Author: tonyg Time: 8 October 2020, 11:05:35.50804 am UUID: 5f80a2cc-df45-4cd3-b083-cbe3daff637b Ancestors: Morphic-eem.1686 Repair an error in Halo click handling that manifests with multiple transient hands. Without this fix, you get an infinite recursion if: 1. a Hand ('X') opens a halo on a Morph 2. X disappears from the World 3. a different Hand ('Y') clicks on the Morph associated with the Halo The reason for the infinite recursion is that the code before this change assumes that "event hand halo", Y's halo, is the halo in question, but that is not true because X, the hand "holding" the halo, already left the world. The change here makes Y, "event hand", adopt the halo before considering whether to discard the halo or not, so when it comes time, "event hand removeHalo" will do the right thing. =============== Diff against Morphic-eem.1686 =============== Item was changed: ----- Method: SimpleHaloMorph>>mouseDown: (in category 'events') ----- mouseDown: event "Transfer the halo to the next likely recipient" + event hand obtainHalo: self. + ((self containsPoint: event position) not or: [event blueButtonPressed not]) ifTrue: [ "Close this halo and give another morph the chance to react." event hand removeHalo. event resetHandlerFields. event hand world processEvent: event. ^ self]. + self target ifNil: [ + event hand removeHalo. + ^self]. - self target ifNil: [^self delete]. - event hand obtainHalo: self. self positionOffset: (event position - (self target point: self target position in: self owner)). "wait for drags or transfer" event hand waitForClicksOrDrag: self event: event selectors: { #transferHalo:. nil. nil. #startDragTarget:. } threshold: HandMorph dragThreshold.! From marcel.taeumel at hpi.de Thu Oct 8 11:09:32 2020 From: marcel.taeumel at hpi.de (Marcel Taeumel) Date: Thu, 8 Oct 2020 13:09:32 +0200 Subject: [squeak-dev] The Inbox: Morphic-ct.1691.mcz In-Reply-To: <0b712f6d605b488d96883a419c0dd5b8@student.hpi.uni-potsdam.de> References: <,> <0b712f6d605b488d96883a419c0dd5b8@student.hpi.uni-potsdam.de> Message-ID: Hi Christoph, no worries. This was just an observation. Maybe the next time we touch that class, we can improve the code. Best, Marcel Am 07.10.2020 13:56:17 schrieb Thiede, Christoph : Would you like me to rename it or is this not worth the effort? :-) Best, Christoph [http://www.hpi.de/] Von: Squeak-dev im Auftrag von Taeumel, Marcel Gesendet: Mittwoch, 7. Oktober 2020 09:11:53 An: squeak-dev Betreff: Re: [squeak-dev] The Inbox: Morphic-ct.1691.mcz   Hehe. "aMorph" is a good example for unfortunate naming. Took me a while to figure out that the "a" stands for "alpha" after reading the list of inst vars: hsvMorph, aMorph :-D Best, Marcel Am 01.10.2020 02:50:29 schrieb commits at source.squeak.org : Christoph Thiede uploaded a new version of Morphic to project The Inbox: http://source.squeak.org/inbox/Morphic-ct.1691.mcz ==================== Summary ==================== Name: Morphic-ct.1691 Author: ct Time: 1 October 2020, 2:50:08.612807 am UUID: f9f5e618-2e8a-3f4b-a1f8-1c9aca2b5f01 Ancestors: Morphic-eem.1686 Fixes alpha selection strip in HSVA color selector, which has always lived one click back in past. =============== Diff against Morphic-eem.1686 =============== Item was changed: ----- Method: HSVAColorSelectorMorph>>alphaSelected: (in category 'accessing') ----- alphaSelected: aFloat "The alpha has changed." + self aMorph value: aFloat. self triggerSelectedColor! -------------- next part -------------- An HTML attachment was scrubbed... URL: From marcel.taeumel at hpi.de Thu Oct 8 11:14:11 2020 From: marcel.taeumel at hpi.de (Marcel Taeumel) Date: Thu, 8 Oct 2020 13:14:11 +0200 Subject: [squeak-dev] The Trunk: Morphic-tonyg.1687.mcz In-Reply-To: References: Message-ID: Thanks! Nice catch! :-) Best, Marcel Am 08.10.2020 11:05:53 schrieb commits at source.squeak.org : Tony Garnock-Jones uploaded a new version of Morphic to project The Trunk: http://source.squeak.org/trunk/Morphic-tonyg.1687.mcz ==================== Summary ==================== Name: Morphic-tonyg.1687 Author: tonyg Time: 8 October 2020, 11:05:35.50804 am UUID: 5f80a2cc-df45-4cd3-b083-cbe3daff637b Ancestors: Morphic-eem.1686 Repair an error in Halo click handling that manifests with multiple transient hands. Without this fix, you get an infinite recursion if: 1. a Hand ('X') opens a halo on a Morph 2. X disappears from the World 3. a different Hand ('Y') clicks on the Morph associated with the Halo The reason for the infinite recursion is that the code before this change assumes that "event hand halo", Y's halo, is the halo in question, but that is not true because X, the hand "holding" the halo, already left the world. The change here makes Y, "event hand", adopt the halo before considering whether to discard the halo or not, so when it comes time, "event hand removeHalo" will do the right thing. =============== Diff against Morphic-eem.1686 =============== Item was changed: ----- Method: SimpleHaloMorph>>mouseDown: (in category 'events') ----- mouseDown: event "Transfer the halo to the next likely recipient" + event hand obtainHalo: self. + ((self containsPoint: event position) not or: [event blueButtonPressed not]) ifTrue: [ "Close this halo and give another morph the chance to react." event hand removeHalo. event resetHandlerFields. event hand world processEvent: event. ^ self]. + self target ifNil: [ + event hand removeHalo. + ^self]. - self target ifNil: [^self delete]. - event hand obtainHalo: self. self positionOffset: (event position - (self target point: self target position in: self owner)). "wait for drags or transfer" event hand waitForClicksOrDrag: self event: event selectors: { #transferHalo:. nil. nil. #startDragTarget:. } threshold: HandMorph dragThreshold.! -------------- next part -------------- An HTML attachment was scrubbed... URL: From commits at source.squeak.org Thu Oct 8 11:33:36 2020 From: commits at source.squeak.org (commits at source.squeak.org) Date: Thu, 8 Oct 2020 11:33:36 0000 Subject: [squeak-dev] The Trunk: Morphic-mt.1694.mcz Message-ID: Marcel Taeumel uploaded a new version of Morphic to project The Trunk: http://source.squeak.org/trunk/Morphic-mt.1694.mcz ==================== Summary ==================== Name: Morphic-mt.1694 Author: mt Time: 8 October 2020, 1:33:30.775799 pm UUID: 3a8e59fb-2478-664c-93e8-131f20222cf0 Ancestors: Morphic-tonyg.1687, Morphic-ct.1693 Merges and tweaks Morphic-ct.1693. Note that label positioning now works as implemented in system progress bars: #leftCenter for short labels, #topCenter for labels longer than the bar. Do we want to keep it that way or center always? =============== Diff against Morphic-tonyg.1687 =============== Item was changed: ----- Method: SystemProgressMorph>>reposition (in category 'private') ----- reposition + "Put ourself in the requested position on the display, but ensure completely within the bounds of the display. Compute layout first via #fullBounds to get correct #center." + + self fullBounds. - "Put ourself in the requested position on the display, but ensure completely within the bounds of the display" - | position | self bounds: + ((self bounds + align: self center + with: (self requestedPosition ifNil: [ self center ])) + translatedToBeWithin: self currentWorld bounds). + + "Check to see if labels are wider than progress bars. In that case do a centered instead of the default left aligned layout." + self cellPositioning: + (self layoutExtent x > BarWidth + ifTrue: [ #topCenter ] + ifFalse: [ #leftCenter ]).! - ((self fullBounds - align: self fullBounds center - with: (self requestedPosition ifNil: [ self fullBounds center ])) translatedToBeWithin: Display boundingBox). - "Check to see if labels are wider than progress bars. In that case do - a centered instead of the default left aligned layout." - position := self width > (Inset x * 2 + (self borderWidth * 2) + BarWidth) - ifTrue: [ #topCenter ] - ifFalse: [ #leftCenter ]. - self cellPositioning: position! From commits at source.squeak.org Thu Oct 8 11:34:39 2020 From: commits at source.squeak.org (commits at source.squeak.org) Date: Thu, 8 Oct 2020 11:34:39 0000 Subject: [squeak-dev] The Trunk: Morphic-ct.1693.mcz Message-ID: Marcel Taeumel uploaded a new version of Morphic to project The Trunk: http://source.squeak.org/trunk/Morphic-ct.1693.mcz ==================== Summary ==================== Name: Morphic-ct.1693 Author: ct Time: 7 October 2020, 1:51:31.244742 pm UUID: 44dd03e5-ba2e-0449-bdcc-162507d4bb77 Ancestors: Morphic-eem.1686 Fixes unnecessary layout hickup during repositioning a SystemProgressMorph. Speeds up Collection >> #do:displayingProgress: significantly. See http://forum.world.st/Overhead-of-SystemProgressMorph-do-displayingProgress-is-huge-td5123048.html for more information. Thanks to Marcel for the tip! :-) =============== Diff against Morphic-eem.1686 =============== Item was added: + ----- Method: SystemProgressMorph>>extent: (in category 'as yet unclassified') ----- + extent: foo + + "self haltIf: [self extent ~= foo]." + ^ super extent:foo! Item was changed: ----- Method: SystemProgressMorph>>reposition (in category 'private') ----- reposition "Put ourself in the requested position on the display, but ensure completely within the bounds of the display" | position | self bounds: + ((self bounds - ((self fullBounds align: self fullBounds center with: (self requestedPosition ifNil: [ self fullBounds center ])) translatedToBeWithin: Display boundingBox). "Check to see if labels are wider than progress bars. In that case do a centered instead of the default left aligned layout." position := self width > (Inset x * 2 + (self borderWidth * 2) + BarWidth) ifTrue: [ #topCenter ] ifFalse: [ #leftCenter ]. self cellPositioning: position! From eliot.miranda at gmail.com Thu Oct 8 11:35:26 2020 From: eliot.miranda at gmail.com (Eliot Miranda) Date: Thu, 8 Oct 2020 04:35:26 -0700 Subject: [squeak-dev] highdpi testing Message-ID: <6572971A-A144-4CC4-B89A-93D4187491F4@gmail.com> Hi Tobias, > On Oct 8, 2020, at 1:12 AM, Tobias Pape wrote: > > Hi > > Sorry, I did not see this mail. > >>> On 01.10.2020, at 14:44, Eliot Miranda wrote: >> Hi Tobias, >>>> On Sep 30, 2020, at 1:11 PM, Tobias Pape wrote: >>>  >>>> On 30.09.2020, at 19:24, Thiede, Christoph wrote: >>>> On Windows, it appears to be a democratic thing - the majority of pixels wins in the question of DPI value. But I'm not absolutely sure about this and cannot test this right now. I don't believe it would be a good idea to override this behavior, even if we could ... >>> Yes. >>> Although I made it modifyable on Unix, just out of tradition that unix leaks every screw… >>> (https://github.com/OpenSmalltalk/opensmalltalk-vm/blob/krono/highdpi-v2/platforms/unix/vm-display-X11/sqUnixX11Scale.c#L182) >>> So, anyone interested in me putting the VM stuff into the main branch? >> Yes. The only issue is backwards compatibility. If it isn’t backwards compatible it’s time to >> a) do a new release of the 5.x vm >> b) bump the version number of the highdpi vm to 6.x > > It's backward compatible in the sense that nothing really breaks, but things are _tiny_ on HighDPI displays and the image might not care. > > The best way would be a "handshake" between image and VM, akin to: > > - start > - image says: please do high-dpi > - vm says: can do, here you are. > > The problem ist that this handshake comes too late. > For OSX, the canvas has to be set up early on and cannot really be changed without grabbing too deep in the guts of the (now three variants of) display handling code. > Windows might be similar. > > so there are these quadrants: > > x | old VM | new VM > -----------+---------+-------- > | | > old Image | OK | Problem > | | > -----------+---------+-------- > | | > new Image | OK* | OK > | | > > *The high-dpi code just works fine with a constant scale factor, no probs. > > If someone has an Idea except for "roll with it", I'm all ears. The solution for these kinds of issues is to add a bit to the image header flags that says whether the image is high dpi aware. The vm tests this bit immediately after loading the image. - Old images do not have the bit set so the vm does not enable high dpi. - there is an accessor (Smalltalk vmParameterAt: 48 [put:]) that can be used to set the bit from the image. - we can provide a command-line argument to enable (and maybe even countermand the set bit in the image header) high dpi. It takes me a few minutes to add one of these flags. Here’s the existing set: 48 various properties of the Cog image as an integer encoding an array of bit flags. Bit 0: tells the VM that the image's Process class has threadId as its 5th inst var (after nextLink, suspendedContext, priority & myList) Bit 1: on Cog JIT VMs asks the VM to set the flag bit in interpreted methods Bit 2: if set, preempting a process puts it to the head of its run queue, not the back, i.e. preempting a process by a higher priority one will not cause the preempted process to yield to others at the same priority. Bit 3: in a muilt-threaded VM, if set, the Window system will only be accessed from the first VM thread Bit 4: in a Spur vm, if set, causes weaklings and ephemerons to be queued individually for finalization Bit 5: if set, implies wheel events will be delivered as such and not mapped to arrow key events Bit 6: if set, implies arithmetic primitives will fail if given arguments of different types (float vs int) >> If it is backwards compatible then what are you waiting for? >> If you already did, and that’s why yesterday my Squeak desktop suddenly looked so crisp, then thank you sooo sooo much, if looks *fantastic*!! > > Hm, i only have the stuff on the branch, there must be some magic going on ;D Yes, I think I had a fantasy :-) > Best regards > -Tobias Cheers, _,,,^..^,,,_ (phone) From eliot.miranda at gmail.com Thu Oct 8 11:40:49 2020 From: eliot.miranda at gmail.com (Eliot Miranda) Date: Thu, 8 Oct 2020 04:40:49 -0700 Subject: [squeak-dev] The Inbox: Morphic-ct.1691.mcz In-Reply-To: References: Message-ID: <7CACBEE4-0788-4F6D-813B-2DA19EB7EB28@gmail.com> > On Oct 8, 2020, at 4:09 AM, Marcel Taeumel wrote: > >  > Hi Christoph, > > no worries. This was just an observation. Maybe the next time we touch that class, we can improve the code. > > Best, > Marcel >> Am 07.10.2020 13:56:17 schrieb Thiede, Christoph : >> >> Would you like me to rename it or is this not worth the effort? :-) >> I think it’s worth the effort. The refactoring tools should make this a very quick fix :-) >> >> Best, >> >> Christoph >> >> Von: Squeak-dev im Auftrag von Taeumel, Marcel >> Gesendet: Mittwoch, 7. Oktober 2020 09:11:53 >> An: squeak-dev >> Betreff: Re: [squeak-dev] The Inbox: Morphic-ct.1691.mcz >> >> Hehe. "aMorph" is a good example for unfortunate naming. Took me a while to figure out that the "a" stands for "alpha" after reading the list of inst vars: hsvMorph, aMorph :-D >> >> Best, >> Marcel >>> Am 01.10.2020 02:50:29 schrieb commits at source.squeak.org : >>> >>> Christoph Thiede uploaded a new version of Morphic to project The Inbox: >>> http://source.squeak.org/inbox/Morphic-ct.1691.mcz >>> >>> ==================== Summary ==================== >>> >>> Name: Morphic-ct.1691 >>> Author: ct >>> Time: 1 October 2020, 2:50:08.612807 am >>> UUID: f9f5e618-2e8a-3f4b-a1f8-1c9aca2b5f01 >>> Ancestors: Morphic-eem.1686 >>> >>> Fixes alpha selection strip in HSVA color selector, which has always lived one click back in past. >>> >>> =============== Diff against Morphic-eem.1686 =============== >>> >>> Item was changed: >>> ----- Method: HSVAColorSelectorMorph>>alphaSelected: (in category 'accessing') ----- >>> alphaSelected: aFloat >>> "The alpha has changed." >>> >>> + self aMorph value: aFloat. >>> self triggerSelectedColor! >>> >>> > -------------- next part -------------- An HTML attachment was scrubbed... URL: From marcel.taeumel at hpi.de Thu Oct 8 12:55:28 2020 From: marcel.taeumel at hpi.de (Marcel Taeumel) Date: Thu, 8 Oct 2020 14:55:28 +0200 Subject: [squeak-dev] Shortcuts for Dual Change Sorter Message-ID: Hi all! I would like to have keyboard shortcuts for copy/move changes between change sets. What would work? [cmd]+[m] for "move" and [cmd]+[shift]+[m] for "copy"? Unfortunately, the arrow keys cannot be caught at that point. [cmd]+[left/right] would have been a nice fit. Anyway, thoughts? Far away from [d] and [x], I suppose ... :-) Well, using [m] would mask "Implementors". Hmmm... Goal: Make it easier to author change sets through the dual-change sorter. Best, Marcel -------------- next part -------------- An HTML attachment was scrubbed... URL: -------------- next part -------------- A non-text attachment was scrubbed... Name: image.png Type: image/png Size: 156217 bytes Desc: not available URL: From commits at source.squeak.org Thu Oct 8 14:51:36 2020 From: commits at source.squeak.org (commits at source.squeak.org) Date: Thu, 8 Oct 2020 14:51:36 0000 Subject: [squeak-dev] The Trunk: Morphic-mt.1695.mcz Message-ID: Marcel Taeumel uploaded a new version of Morphic to project The Trunk: http://source.squeak.org/trunk/Morphic-mt.1695.mcz ==================== Summary ==================== Name: Morphic-mt.1695 Author: mt Time: 8 October 2020, 4:51:31.5986 pm UUID: 5d2d4f82-0a28-0b4e-8909-c4b1b1cb0e78 Ancestors: Morphic-mt.1694 In Morphic projects, ensure that [cmd]+[dot] will always continue drawing. =============== Diff against Morphic-mt.1694 =============== Item was changed: ----- Method: MorphicProject>>interruptCleanUpFor: (in category 'scheduling & debugging') ----- interruptCleanUpFor: interruptedProcess "Clean up things in case of a process interrupt." super interruptCleanUpFor: interruptedProcess. self uiProcess == interruptedProcess ifTrue: [ ActiveHand ifNotNil: [ActiveHand interrupted]. ActiveWorld := world. "reinstall active globals" ActiveHand := world primaryHand. ActiveHand interrupted. "make sure this one's interrupted too" ActiveEvent := nil. + world removeProperty: #shouldDisplayWorld. + Preferences eToyFriendly + ifTrue: [world stopRunningAll]].! - ifTrue: [Project current world stopRunningAll]].! From commits at source.squeak.org Thu Oct 8 14:56:32 2020 From: commits at source.squeak.org (commits at source.squeak.org) Date: Thu, 8 Oct 2020 14:56:32 0000 Subject: [squeak-dev] The Trunk: System-mt.1176.mcz Message-ID: Marcel Taeumel uploaded a new version of System to project The Trunk: http://source.squeak.org/trunk/System-mt.1176.mcz ==================== Summary ==================== Name: System-mt.1176 Author: mt Time: 8 October 2020, 4:56:28.487753 pm UUID: 31fb9dbd-8015-fb4c-a900-dc9167c278fe Ancestors: System-topa.1174 Push Morphic-specific code into Morphic project. =============== Diff against System-topa.1174 =============== Item was changed: ----- Method: Project>>makeThumbnail (in category 'menu messages') ----- makeThumbnail "Make a thumbnail image of this project from the Display." + ^ thumbnail := self previewImageForm! - thumbnail := self previewImageForm. - (Smalltalk at: #InternalThreadNavigationMorph) ifNotNil: [:tnMorph | - tnMorph cacheThumbnailFor: self]. - ^thumbnail - ! From commits at source.squeak.org Thu Oct 8 14:57:31 2020 From: commits at source.squeak.org (commits at source.squeak.org) Date: Thu, 8 Oct 2020 14:57:31 0000 Subject: [squeak-dev] The Trunk: Morphic-mt.1696.mcz Message-ID: Marcel Taeumel uploaded a new version of Morphic to project The Trunk: http://source.squeak.org/trunk/Morphic-mt.1696.mcz ==================== Summary ==================== Name: Morphic-mt.1696 Author: mt Time: 8 October 2020, 4:57:26.632753 pm UUID: 224174d5-5e2f-ac4c-a356-8223edc18ebc Ancestors: Morphic-mt.1695 Complements System-mt.1176. =============== Diff against Morphic-mt.1695 =============== Item was changed: ----- Method: MorphicProject>>makeThumbnail (in category 'menu messages') ----- makeThumbnail "Make a thumbnail image of this project from the Display." world displayWorldSafely. "clean pending damage" + super makeThumbnail. + (Smalltalk at: #InternalThreadNavigationMorph) ifNotNil: [:tnMorph | + tnMorph cacheThumbnailFor: self]. + ^ thumbnail! - ^super makeThumbnail.! From commits at source.squeak.org Thu Oct 8 15:12:32 2020 From: commits at source.squeak.org (commits at source.squeak.org) Date: Thu, 8 Oct 2020 15:12:32 0000 Subject: [squeak-dev] The Trunk: Morphic-mt.1697.mcz Message-ID: Marcel Taeumel uploaded a new version of Morphic to project The Trunk: http://source.squeak.org/trunk/Morphic-mt.1697.mcz ==================== Summary ==================== Name: Morphic-mt.1697 Author: mt Time: 8 October 2020, 5:12:27.351452 pm UUID: 09479921-7aa2-5e4b-b9d9-6b07134b2372 Ancestors: Morphic-mt.1696 Refactoring global Active(World|Hand|Event) variables to be actual DynamicVariable's. Step 1 of 2 -- Core refactoring to check whether system stays functional. All remaining references to the Active(World|Hand|Event) globals will be removed in a second step. See: http://forum.world.st/Changeset-Eliminating-global-state-from-Morphic-td5121690.html =============== Diff against Morphic-mt.1696 =============== Item was changed: + (PackageInfo named: 'Morphic') preamble: '"Turn off Morphic drawing because we are refactoring ActiveWorld, ActiveHand, and ActiveEvent." + Project current world setProperty: #shouldDisplayWorld toValue: false.'! - (PackageInfo named: 'Morphic') preamble: 'PluggableListMorph allSubInstancesDo: [:m | - m listMorph cellInset: 3 at 0].'! Item was added: + DynamicVariable subclass: #ActiveEventVariable + instanceVariableNames: '' + classVariableNames: '' + poolDictionaries: '' + category: 'Morphic-Worlds'! Item was added: + ----- Method: ActiveEventVariable class>>default (in category 'accessing') ----- + default + + ^ self currentHand ifNotNil: [:hand | hand lastEvent]! Item was added: + ----- Method: ActiveEventVariable class>>value:during: (in category 'accessing') ----- + value: anObject during: aBlock + "For backword compatibility with 5.3 and earlier, still maintain the original global variable." + + | priorEvent | + priorEvent := self value. + ActiveEvent := anObject. + ^ [super value: anObject during: aBlock] ensure: [ + ActiveEvent == anObject ifTrue: [ActiveEvent := priorEvent]]! Item was added: + DynamicVariable subclass: #ActiveHandVariable + instanceVariableNames: '' + classVariableNames: '' + poolDictionaries: '' + category: 'Morphic-Worlds'! Item was added: + ----- Method: ActiveHandVariable class>>default (in category 'accessing') ----- + default + + ^ self currentWorld primaryHand! Item was added: + ----- Method: ActiveHandVariable class>>value:during: (in category 'accessing') ----- + value: anObject during: aBlock + "For backword compatibility with 5.3 and earlier, still maintain the original global variable." + + | priorHand | + priorHand := self value. + ActiveHand := anObject. + ^ [super value: anObject during: aBlock] ensure: [ + ActiveHand == anObject ifTrue: [ActiveHand := priorHand]]! Item was added: + DynamicVariable subclass: #ActiveWorldVariable + instanceVariableNames: '' + classVariableNames: '' + poolDictionaries: '' + category: 'Morphic-Worlds'! Item was added: + ----- Method: ActiveWorldVariable class>>default (in category 'accessing') ----- + default + + ^ Project current world! Item was added: + ----- Method: ActiveWorldVariable class>>value:during: (in category 'accessing') ----- + value: anObject during: aBlock + "For backword compatibility with 5.3 and earlier, still maintain the original global variable." + + | priorWorld | + priorWorld := self value. + ActiveWorld := anObject. + ^ [super value: anObject during: aBlock] ensure: [ + ActiveWorld == anObject ifTrue: [ActiveWorld := priorWorld]]! Item was changed: ----- Method: HandMorph>>becomeActiveDuring: (in category 'initialization') ----- becomeActiveDuring: aBlock + "Make the receiver the active hand during the evaluation of aBlock." - "Make the receiver the ActiveHand during the evaluation of aBlock." + ^ ActiveHandVariable value: self during: aBlock! - | priorHand | - priorHand := ActiveHand. - ActiveHand := self. - ^ aBlock ensure: [ - "check to support project switching." - ActiveHand == self ifTrue: [ActiveHand := priorHand]].! Item was changed: ----- Method: HandMorph>>processEvents (in category 'event handling') ----- processEvents "Process user input events from the local input devices." | evt evtBuf type hadAny | + self currentEvent ~= lastMouseEvent ifTrue: [ + "Meaning that we were invoked from within an event response. + Make sure z-order is up to date." + self mouseOverHandler processMouseOver: lastMouseEvent]. + - ActiveEvent ifNotNil: - ["Meaning that we were invoked from within an event response. - Make sure z-order is up to date" - - self mouseOverHandler processMouseOver: lastMouseEvent]. hadAny := false. [(evtBuf := Sensor nextEvent) isNil] whileFalse: [evt := nil. "for unknown event types" type := evtBuf first. type = EventTypeMouse ifTrue: [evt := self generateMouseEvent: evtBuf]. type = EventTypeMouseWheel ifTrue: [evt := self generateMouseWheelEvent: evtBuf]. type = EventTypeKeyboard ifTrue: [evt := self generateKeyboardEvent: evtBuf]. type = EventTypeDragDropFiles ifTrue: [evt := self generateDropFilesEvent: evtBuf]. type = EventTypeWindow ifTrue:[evt := self generateWindowEvent: evtBuf]. "All other events are ignored" (type ~= EventTypeDragDropFiles and: [evt isNil]) ifTrue: [^self]. + evt ifNotNil: ["Finally, handle it." - evt isNil - ifFalse: - ["Finally, handle it" - self handleEvent: evt. hadAny := true. + - "For better user feedback, return immediately after a mouse event has been processed." + evt isMouse ifTrue: [^ self]]]. + - evt isMouse ifTrue: [^self]]]. "note: if we come here we didn't have any mouse events" + mouseClickState ifNotNil: [ + "No mouse events during this cycle. Make sure click states time out accordingly" + mouseClickState handleEvent: lastMouseEvent asMouseMove from: self]. + hadAny ifFalse: [ + "No pending events. Make sure z-order is up to date" + self mouseOverHandler processMouseOver: lastMouseEvent].! - mouseClickState notNil - ifTrue: - ["No mouse events during this cycle. Make sure click states time out accordingly" - - mouseClickState handleEvent: lastMouseEvent asMouseMove from: self]. - hadAny - ifFalse: - ["No pending events. Make sure z-order is up to date" - - self mouseOverHandler processMouseOver: lastMouseEvent]! Item was changed: ----- Method: Morph>>activeHand (in category 'structure') ----- activeHand + + self flag: #deprecated. "mt: Use #currentHand instead." + ^ self currentHand! - - ^ ActiveHand ifNil: [ - self isInWorld - ifTrue: [self world activeHand] - ifFalse: [nil]]! Item was changed: ----- Method: Morph>>primaryHand (in category 'structure') ----- primaryHand + ^ self currentWorld primaryHand! - | outer | - outer := self outermostWorldMorph ifNil: [^ nil]. - ^ outer activeHand ifNil: [outer firstHand]! Item was changed: ----- Method: MorphicEvent>>becomeActiveDuring: (in category 'initialize') ----- becomeActiveDuring: aBlock + "Make the receiver the active event during the evaluation of aBlock." - "Make the receiver the ActiveEvent during the evaluation of aBlock." + ^ ActiveEventVariable value: self during: aBlock! - | priorEvent | - priorEvent := ActiveEvent. - ActiveEvent := self. - ^ aBlock ensure: [ - "check to support project switching." - ActiveEvent == self ifTrue: [ActiveEvent := priorEvent]].! Item was changed: ----- Method: MorphicProject>>interruptCleanUpFor: (in category 'scheduling & debugging') ----- interruptCleanUpFor: interruptedProcess "Clean up things in case of a process interrupt." super interruptCleanUpFor: interruptedProcess. self uiProcess == interruptedProcess ifTrue: [ + self currentHand ifNotNil: [:hand | hand interrupted]. - ActiveHand ifNotNil: [ActiveHand interrupted]. - ActiveWorld := world. "reinstall active globals" - ActiveHand := world primaryHand. - ActiveHand interrupted. "make sure this one's interrupted too" - ActiveEvent := nil. - world removeProperty: #shouldDisplayWorld. + Preferences eToyFriendly ifTrue: [world stopRunningAll]].! - - Preferences eToyFriendly - ifTrue: [world stopRunningAll]].! Item was changed: + ----- Method: Object>>currentEvent (in category '*Morphic-Kernel-accessing') ----- - ----- Method: Object>>currentEvent (in category '*Morphic-Kernel') ----- currentEvent + "Answer the current MorphicEvent. Provided that a morphic project is loaded, this method never returns nil." + + ^ ActiveEventVariable value! - "Answer the current Morphic event. This method never returns nil." - ^ActiveEvent ifNil:[self currentHand lastEvent]! Item was changed: + ----- Method: Object>>currentHand (in category '*Morphic-Kernel-accessing') ----- - ----- Method: Object>>currentHand (in category '*Morphic-Kernel') ----- currentHand + "Answer the current HandMorph. Provided that a morphic project is loaded, this method will never return nil." - "Return a usable HandMorph -- the one associated with the object's current environment. This method will always return a hand, even if it has to conjure one up as a last resort. If a particular hand is actually handling events at the moment (such as a remote hand or a ghost hand), it will be returned." + ^ Project current isMorphic + ifTrue: [ActiveHandVariable value] + ifFalse: [Sensor "MVC/ST80 fallback"]! - ^ActiveHand ifNil: [ self currentWorld primaryHand ]! Item was changed: + ----- Method: Object>>currentWorld (in category '*Morphic-Kernel-accessing') ----- - ----- Method: Object>>currentWorld (in category '*Morphic-Kernel') ----- currentWorld + "Answer the current world. This method will never return nil." + + ^ ActiveWorldVariable value! - "Answer a morphic world that is the current UI focus." - ^ActiveWorld ifNil:[Project current world]! Item was removed: - ----- Method: PasteUpMorph>>activeHand (in category 'structure') ----- - activeHand - - ^ worldState - ifNotNil: [:ws | ws activeHand ifNil: [ws hands first]] - ifNil: [super activeHand]! Item was removed: - ----- Method: PasteUpMorph>>activeHand: (in category 'world state') ----- - activeHand: aHandMorph - "temporarily retained for old main event loops" - - worldState activeHand: aHandMorph. - - ! Item was changed: ----- Method: PasteUpMorph>>becomeActiveDuring: (in category 'initialization') ----- becomeActiveDuring: aBlock + "Make the receiver the active world during the evaluation of aBlock." - "Make the receiver the ActiveWorld during the evaluation of aBlock." + ^ ActiveWorldVariable value: self during: aBlock! - | priorWorld | - priorWorld := ActiveWorld. - ActiveWorld := self. - ^ aBlock ensure: [ - "check to support project switching." - ActiveWorld == self ifTrue: [ActiveWorld := priorWorld]].! Item was changed: ----- Method: PasteUpMorph>>install (in category 'world state') ----- install + owner := nil. "since we may have been inside another world previously" + - ActiveWorld := self. - ActiveHand := self hands first. "default" - ActiveEvent := nil. submorphs do: [:ss | ss owner isNil ifTrue: [ss privateOwner: self]]. "Transcript that was in outPointers and then got deleted." self viewBox: Display boundingBox. EventSensor default flushEvents. worldState handsDo: [:h | h initForEvents]. self installFlaps. self borderWidth: 0. "default" (Preferences showSecurityStatus and: [SecurityManager default isInRestrictedMode]) ifTrue: [self borderWidth: 2; borderColor: Color red]. self presenter allExtantPlayers do: [:player | player prepareToBeRunning]. SystemWindow noteTopWindowIn: self.! Item was added: + ----- Method: PasteUpMorph>>primaryHand (in category 'structure') ----- + primaryHand + + ^ self hands at: 1 ifAbsent: [nil]! Item was changed: ----- Method: PasteUpMorph>>processEvent:using: (in category 'events-processing') ----- processEvent: anEvent using: defaultDispatcher + "Reimplemented to install the receiver as the new active world if it is one" + + self isWorldMorph ifFalse: [ + ^ super processEvent: anEvent using: defaultDispatcher]. + + ^ self becomeActiveDuring: [ + super processEvent: anEvent using: defaultDispatcher]! - "Reimplemented to install the receiver as the new ActiveWorld if it is one" - | priorWorld result | - self isWorldMorph ifFalse:[^super processEvent: anEvent using: defaultDispatcher]. - priorWorld := ActiveWorld. - ActiveWorld := self. - [result := super processEvent: anEvent using: defaultDispatcher] - ensure: [ActiveWorld := priorWorld]. - ^result - ! Item was removed: - ----- Method: WorldState>>activeHand (in category 'hands') ----- - activeHand - - ^ ActiveHand! Item was changed: ----- Method: WorldState>>doOneCycleNowFor: (in category 'update cycle') ----- doOneCycleNowFor: aWorld "Immediately do one cycle of the interaction loop. This should not be called directly, but only via doOneCycleFor:" | capturingGesture | DisplayScreen checkForNewScreenSize. capturingGesture := false. "self flag: #bob. " "need to consider remote hands in lower worlds" + - "process user input events" LastCycleTime := Time millisecondClockValue. + self handsDo: [:hand | + hand becomeActiveDuring: [ + hand processEvents. + capturingGesture := capturingGesture or: [hand isCapturingGesturePoints]]]. + - self handsDo: [:h | - ActiveHand := h. - h processEvents. - capturingGesture := capturingGesture or: [ h isCapturingGesturePoints ]. - ActiveHand := nil - ]. - - "the default is the primary hand" - ActiveHand := self hands first. - "The gesture recognizer needs enough points to be accurate. Therefore morph stepping is disabled while capturing points for the recognizer" + capturingGesture ifFalse: [ + aWorld runStepMethods. "there are currently some variations here" + self displayWorldSafely: aWorld].! - capturingGesture ifFalse: - [aWorld runStepMethods. "there are currently some variations here" - self displayWorldSafely: aWorld]. - ! Item was changed: ----- Method: WorldState>>doOneSubCycleFor: (in category 'update cycle') ----- doOneSubCycleFor: aWorld - "Like doOneCycle, but preserves activeHand." + self flag: #deprecate. "ct: Historically, global state was preserved here. Since the introduction of ActiveHandVariable, this is no longer necessary, so this is equivalent to #doOneCycleFor:. However, let's keep this possibly valuable hook for now." + + ^ self doOneCycleFor: aWorld! - | currentHand | - currentHand := ActiveHand. - self doOneCycleFor: aWorld. - ActiveHand := currentHand! Item was added: + ----- Method: WorldState>>primaryHand (in category 'hands') ----- + primaryHand + + self flag: #deprecated. "ct: Send #primaryHand to #currentWorld instead." + ^ self currentWorld primaryHand! Item was changed: ----- Method: WorldState>>removeHand: (in category 'hands') ----- removeHand: aHandMorph "Remove the given hand from the list of hands for this world." + (hands includes: aHandMorph) ifFalse: [^ self]. + self currentHand == aHandMorph ifTrue: [ + self flag: #invalidate. "ct: Should we try to clear ActiveHandVariable here or doesn't this matter? In past, ActiveHand was set to nil at this point."]. + hands := hands copyWithout: aHandMorph.! - (hands includes: aHandMorph) ifFalse: [^self]. - hands := hands copyWithout: aHandMorph. - ActiveHand == aHandMorph ifTrue: [ActiveHand := nil]. - ! Item was changed: ----- Method: WorldState>>runLocalStepMethodsIn: (in category 'stepping') ----- runLocalStepMethodsIn: aWorld "Run morph 'step' methods (LOCAL TO THIS WORLD) whose time has come. Purge any morphs that are no longer in this world. ar 3/13/1999: Remove buggy morphs from the step list so that they don't raise repeated errors." + | now morphToStep stepTime | - | now morphToStep stepTime priorWorld | now := Time millisecondClockValue. + + aWorld becomeActiveDuring: [ + self triggerAlarmsBefore: now. + + stepList ifEmpty: [^ self]. + + (now < lastStepTime or: [now - lastStepTime > 5000]) ifTrue: [ + self adjustWakeupTimes: now]. "clock slipped" + + [stepList notEmpty and: [stepList first scheduledTime < now]] whileTrue: [ + lastStepMessage := stepList removeFirst. - priorWorld := ActiveWorld. - ActiveWorld := aWorld. - self triggerAlarmsBefore: now. - stepList isEmpty - ifTrue: - [ActiveWorld := priorWorld. - ^self]. - (now < lastStepTime or: [now - lastStepTime > 5000]) - ifTrue: [self adjustWakeupTimes: now]. "clock slipped" - [stepList isEmpty not and: [stepList first scheduledTime < now]] - whileTrue: - [lastStepMessage := stepList removeFirst. morphToStep := lastStepMessage receiver. + (morphToStep shouldGetStepsFrom: aWorld) ifTrue: [ + lastStepMessage value: now. + lastStepMessage ifNotNil: [ + stepTime := lastStepMessage stepTime ifNil: [morphToStep stepTime]. + lastStepMessage scheduledTime: now + (stepTime max: 1). + stepList add: lastStepMessage]]. - (morphToStep shouldGetStepsFrom: aWorld) - ifTrue: - [lastStepMessage value: now. - lastStepMessage ifNotNil: - [stepTime := lastStepMessage stepTime ifNil: [morphToStep stepTime]. - lastStepMessage scheduledTime: now + (stepTime max: 1). - stepList add: lastStepMessage]]. lastStepMessage := nil]. + + lastStepTime := now].! - lastStepTime := now. - ActiveWorld := priorWorld! Item was changed: + (PackageInfo named: 'Morphic') postscript: '"Turn on Morphic drawing again." + Project current world removeProperty: #shouldDisplayWorld.'! - (PackageInfo named: 'Morphic') postscript: 'Smalltalk removeFromStartUpList: PasteUpMorph. - Smalltalk removeFromShutDownList: PasteUpMorph.'! From marcel.taeumel at hpi.de Thu Oct 8 15:20:26 2020 From: marcel.taeumel at hpi.de (Marcel Taeumel) Date: Thu, 8 Oct 2020 17:20:26 +0200 Subject: [squeak-dev] Changeset: Eliminating global state from Morphic In-Reply-To: References: <20200912173950.GA35925@shell.msen.com> <18c0e74293834ac6bc4af5be15dad436@student.hpi.uni-potsdam.de> <7B5B2DB1-9A8E-45D1-B566-F4B45A6C9774@rowledge.org> <,20200914154934.GA85344@shell.msen.com> <316eb771b4674076a884bb4caea31175@student.hpi.uni-potsdam.de> <,> <20200930002206.GA34073@shell.msen.com> <,> <,> Message-ID: Hi Christoph, hi all! The first part of this refactoring is in the Trunk. Please try updating your images and report back! http://forum.world.st/The-Trunk-Morphic-mt-1697-mcz-td5123173.html [http://forum.world.st/The-Trunk-Morphic-mt-1697-mcz-td5123173.html] If all went well, I will commit the second part, too, which will remove all remaining references to ActiveWorld etc. Best, Marcel Am 30.09.2020 18:22:43 schrieb Thiede, Christoph : This version includes a test method, #testActiveVariablesObsoletion, that makes sure that no one will try to reference one of the deprecated ActiveVariable bindings again in the future. Thanks to Marcel for the tip! Best, Christoph Von: Squeak-dev im Auftrag von Thiede, Christoph Gesendet: Mittwoch, 30. September 2020 17:50:43 An: The general-purpose Squeak developers list Betreff: Re: [squeak-dev] Changeset: Eliminating global state from Morphic   Here is another version of the changeset that does not even longer raise a debugger when removing the current hand. Best, Christoph Von: Squeak-dev im Auftrag von Thiede, Christoph Gesendet: Mittwoch, 30. September 2020 11:40:05 An: The general-purpose Squeak developers list Betreff: Re: [squeak-dev] Changeset: Eliminating global state from Morphic   Hm, probably we should integrate the "filein without UI updates" option into the FileList menu, too ...? Best, Christoph [http://www.hpi.de/] Von: Squeak-dev im Auftrag von David T. Lewis Gesendet: Mittwoch, 30. September 2020 02:22:06 An: The general-purpose Squeak developers list Betreff: Re: [squeak-dev] Changeset: Eliminating global state from Morphic   On Mon, Sep 28, 2020 at 10:55:45AM +0000, Thiede, Christoph wrote: > Hi all, > > > Dave, I double-checked it. When loading the second changeset, can you confirm that you used the new option in the drop handler dialog? > > > [cid:3848a1c6-d67f-4999-a714-ffafff2b4a22] > No, I did definitely not do that. I opened a FileList and selected the change sets one at a time, and clicked install for each. Installing the second change set locked the image. After reading your email, I did this: 1) Forwarded your email to my dtlewis290 at gmail.com (spam oriented) account so I could view the graphic attachment, which showed that you are using drag and drop when you load the change sets. 2) Opened a GUI file browser on my Ubuntu laptop, and used drag and drop to copy the two change sets to my image. 3) On dropping the second change set into the image, I selected the "... without updating UI" option. That worked. Dave -------------- next part -------------- An HTML attachment was scrubbed... URL: From eliot.miranda at gmail.com Thu Oct 8 17:58:59 2020 From: eliot.miranda at gmail.com (Eliot Miranda) Date: Thu, 8 Oct 2020 10:58:59 -0700 Subject: [squeak-dev] Installing high dpi support and backwards compatibility of the VM Message-ID: Hi All, ideally adding the high dpi support to the VM will not break backwards-compatibility. But that implies that the VM is informed before it creates the display of whether to create a high dpi display or not. Off-list Tobias asked me where the VM sets up the display on Mac and I was surprised by the answer. I thought it would be as part of beDisplay. But it's actually as a side-effect of DisplayScreen class>>actualScreenSize, primitive 106, which calls the ioScreenSize function. It is this functions' responsibility to actually create the display, deriving the size from the savedWindowSize info in the image header (which can or could be overridden on the VM command line, and is when -headless is supplied). So any new primitive added to allow DisplayScreen to inform the VM of whether to use high dpi or not would have to be invoked before primitive 106. So one way to implement this is to modify the chain of invocations leading up to primitive 106. For this route I'd like to propose the following refactoring: DisplayScreen class>>actualScreenSize ^ 640 at 480 becomes DisplayScreen class>>actualScreenSize self primitiveUseHighDPI: self useHighDPI. "where this is a preference" ^self primitiveScreenSize primitiveScreenSize ^ 640 at 480 Another route is to make the useHighDPI flag part of the image header state alongside the saved window size. This would mean it was added to the flags accessed via vmParameterAt: 48. There could be a command-line argument to override. Finally I note that the beDisplay primitive simply stores the display object in the specialObjectsArray and assigns the interpreter variables that track the display, displayBits, displayWidth, displayHeight & displayDepth. It then invokes ioNoteDisplayChangedwidthheightdepth, but *all* the implementations of this function are empty. I propose that we should eliminate 5this call and its implementation. It is confusing to follow it and find it does nothing. The argument could be that a platform might require it. But if that's so we can always put it back. We have an existence proof in all our platforms that this is unlikely. Thoughts? _,,,^..^,,,_ best, Eliot -------------- next part -------------- An HTML attachment was scrubbed... URL: From christoph.thiede at student.hpi.uni-potsdam.de Thu Oct 8 18:01:11 2020 From: christoph.thiede at student.hpi.uni-potsdam.de (Christoph Thiede) Date: Thu, 8 Oct 2020 13:01:11 -0500 (CDT) Subject: [squeak-dev] Exception patterns (The Inbox: Kernel-ct.1292.mcz) In-Reply-To: <61e8f8c484f24e46818eae3b53b0133d@student.hpi.uni-potsdam.de> References: <2f92c32e769a4e29a2c93f655b87638f@student.hpi.uni-potsdam.de> <474A3657-5535-43BB-8B21-4A0EE88D73E7@rowledge.org> <61e8f8c484f24e46818eae3b53b0133d@student.hpi.uni-potsdam.de> Message-ID: <1602180071926-0.post@n4.nabble.com> Hi all, I'd like to push this discussion again because I still do think that an #on:when:do: mechanism or whatever you'd like to call it can be useful in several situations. One of my favorite usages is this: [self downloadFile: aFile on: HttpError "this is from one of my packages" when: [:ex | ex statusCode = 403] do: [self inform: 'Forbidden!']. Do I see it right that we only need to find a better name for this or am I the only one who would like to something like this in the Trunk? And would anyone be so kind and leave some feedback on my other proposal for exception conditions? :-) [self downloadFile: aFile on: HttpError & [:ex | ex statusCode = 403] do: [self inform: 'Forbidden!']. Best, Christoph -- Sent from: http://forum.world.st/Squeak-Dev-f45488.html From commits at source.squeak.org Thu Oct 8 18:14:06 2020 From: commits at source.squeak.org (commits at source.squeak.org) Date: Thu, 8 Oct 2020 18:14:06 0000 Subject: [squeak-dev] The Trunk: SystemReporter-eem.44.mcz Message-ID: Eliot Miranda uploaded a new version of SystemReporter to project The Trunk: http://source.squeak.org/trunk/SystemReporter-eem.44.mcz ==================== Summary ==================== Name: SystemReporter-eem.44 Author: eem Time: 8 October 2020, 11:14:05.212321 am UUID: 842b9b5f-c8de-456a-a871-1fc9725c3ff0 Ancestors: SystemReporter-eem.43 More accurate labelling of vm parameter 48 (the image header flags). =============== Diff against SystemReporter-eem.43 =============== Item was changed: ----- Method: SystemReporter>>reportVMParameters: (in category 'reporting') ----- reportVMParameters: aStream | vmParameters isStack isCog isSpur | self header: 'Virtual Machine Parameters' on: aStream. vmParameters := Smalltalk vm getVMParameters. isStack := (vmParameters at: 42 ifAbsent: [0]) ~= 0. "42 = number of stack pages available" isCog := isStack and: [(vmParameters at: 46) ~= 0]. "46 is machine code zone size" isSpur := isStack and: [(vmParameters at: 41) anyMask: 2r10000]. "41 is imageFormatVersion for the VM; bit 16 is the Spur bit" (isSpur ifFalse: [#( 1 'size of old space' 2 'size of young+old space' 3 'size of memory' 4 'allocationCount' 5 'allocations between GCs' 6 'survivor count tenuring threshold')] ifTrue: [#( 1 'size of old space' 2 'used bytes in new space (used eden + used past space)' 3 'size of heap')]), #( 7 'full GCs since startup' 8 'total milliseconds in full GCs since startup'), (isSpur ifFalse: [#( 9 'incremental GCs since startup' 10 'total milliseconds in incremental GCs since startup' 11 'tenures of surving objects since startup'), {12 to: 19. 'specific to the translating VM'}] ifTrue: [#( 9 'scavenging GCs since startup' 10 'total milliseconds in scavenging GCs since startup' 11 'tenures of surving objects since startup'), {12 to: 15. 'reserved for future use'}, #( 16 'total microseconds in idle since startup' 17 'proportion of code zone available for use (Sista VMs only; read-write)' 18 'total milliseconds in full GC compaction since startup (a portion of parameter 8)' 19 'scavenge threshold; the effective size of eden')]), #( 20 'utc microseconds at startup (if non-zero)' 21 'root/remembered table size (occupancy)' 22 'root/remembered table overflows since startup' 23 'bytes of extra memory to reserve for VM buffers, plugins, etc.' 24 'free memory threshold above which object memory will be shrunk' 25 'memory headroom when growing object memory'), (isStack ifFalse: [#( 26 'interruptChecksEveryNms - force an ioProcessEvents every N milliseconds, in case the image is not calling getNextEvent often')] ifTrue: [#( 26 'heartbeat period (ms; see #58)')]), (isSpur ifFalse: [#( 27 'number of times mark loop iterated for current IGC/FGC includes ALL marking' 28 'number of times sweep loop iterated for current IGC/FGC' 29 'number of times make forward loop iterated for current IGC/FGC' 30 'number of times compact move loop iterated for current IGC/FGC')] ifTrue: [#()]), #( 31 'number of grow memory requests' 32 'number of shrink memory requests'), (isSpur ifFalse: [#( 33 'number of root table entries used for current IGC/FGC' 34 'number of allocations done before current IGC/FGC' 35 'number of survivor objects after current IGC/FGC' 36 'millisecond clock when current IGC/FGC completed' 37 'number of marked objects for Roots of the world, not including Root Table entries for current IGC/FGC' 38 'milliseconds taken by current IGC' 39 'Number of finalization signals for Weak Objects pending when current IGC/FGC completed')] ifTrue: [#( 33 'number of root table entries at last scavenge' 35 'number of survivor objects at last scavenge (if non-zero)' 36 'millisecond clock when current scavenge completed' 38 'milliseconds taken by current scavenge' 39 'Number of finalization signals for Weak Objects pending when current SGC/FGC completed')]), #( 40 'VM word size - 4 or 8'), (isStack ifTrue: [#( 41 'imageFormatVersion for the VM' 42 'number of stack pages available' 43 'desired number of stack pages (stored in image file header, max 65535)' 44 'size of eden, in bytes' 45 'desired size of eden, in bytes (stored in image file header)' 46 'machine code zone size, in bytes (0 in Stack VM)' + 47 'desired machine code zone size (0 => default 1Mb to 2Mb depending on processor)'), + { 48. 'Persistent image header flags\ bit 0: implies Process has threadId as its 4th inst var\ bit 1: if set, methods that are interpreted will have the flag bit set in their header\ bit 2: if set, implies preempting a process does not put it to the back of its run queue\ bit 3: if set, implies the GUI should run on the first thread and event queues should not be accessed from other threads\ bit 4: if set, implies the new finalization scheme where WeakArrays are queued\ bit 5: if set, implies wheel events will be delivered as such and not mapped to arrow key events\ bit 6: if set, implies arithmetic primitives will fail if given arguments of different types (float vs int)' withCRs }, + #( 49 'max size the image promises to grow the external semaphore table to'), - 47 'desired machine code zone size (0 => default 1Mb to 2Mb depending on processor)' - 48 'various persistent image header flags. See getCogVMFlags in the VM source.' - 49 'max size the image promises to grow the external semaphore table to'), (isSpur ifFalse: [{ 50 to: 51. 'reserved for VM parameters that persist in the image (such as size of eden above)'. 52 to: 56. 'specific to Spur' }] ifTrue: [{ 50 to: 51. 'reserved for VM parameters that persist in the image (such as size of eden above)' }, #( 52 'root/remembered table capacity' 53 'number of old space segments' 54 'total free old space' 55 'ratio of growth and image size at or above which a GC will be performed post scavenge')]), #( 56 'number of process switches since startup' 57 'number of ioProcessEvents calls since startup' 58 'number of forceInterruptCheck calls since startup' 59 'number of check event calls since startup' 60 'number of stack page overflows since startup' 61 'number of stack page divorces since startup' 62 'compiled code compactions since startup'), (isCog ifFalse: [#()] ifTrue: [#( 63 'total milliseconds in compiled code compactions since startup' 64 'the number of methods that currently have jitted machine-code')]), { 65. 'Cog feature flags\ bit 0: set if the VM supports MULTIPLE_BYTECODE_SETS.\ bit 1: set if the VM supports read-only objects.\ bit 2: set if the VM has an ITIMER_HEARTBEAT' withCRs. 66. 'the byte size of a stack page'.}, (isSpur ifFalse: [{ 67 to: 69. 'reserved for more Cog-related info' }] ifTrue: [#( 67 'the maximum allowed size of old space (if zero there is no limit)' 68 'the average number of live stack pages when scanned by scavenge/gc/become' 69 'the maximum number of live stack pages when scanned by scavenge/gc/become')]), #( 70 'the vmProxyMajorVersion (the interpreterProxy VM_MAJOR_VERSION)' 71 'the vmProxyMinorVersion (the interpreterProxy VM_MINOR_VERSION)')] ifFalse: [#()]) pairsDo: [:idx :desc | | value values | aStream nextPut: $#. idx isInteger ifTrue: [value := vmParameters at: idx. aStream print: idx; tab: (idx < 10 ifTrue: [2] ifFalse: [1]); nextPutAll: ((value isInteger and: [idx ~= 41]) ifTrue: [value asStringWithCommas] ifFalse: [value printString])] ifFalse: [value := vmParameters at: idx first. aStream print: idx first; next: 2 put: $.; print: idx last; tab. values := idx collect: [:i| vmParameters at: i]. values asSet size = 1 ifTrue: [aStream print: value] ifFalse: [values do: [:v| aStream print: v] separatedBy: [aStream nextPutAll: ', ']]]. aStream tab; nextPutAll: desc; cr]! From commits at source.squeak.org Thu Oct 8 18:16:42 2020 From: commits at source.squeak.org (commits at source.squeak.org) Date: Thu, 8 Oct 2020 18:16:42 0000 Subject: [squeak-dev] The Trunk: System-eem.1177.mcz Message-ID: Eliot Miranda uploaded a new version of System to project The Trunk: http://source.squeak.org/trunk/System-eem.1177.mcz ==================== Summary ==================== Name: System-eem.1177 Author: eem Time: 8 October 2020, 11:16:38.655114 am UUID: b65f0705-bbc0-45b7-8f9c-6cc95281cbd5 Ancestors: System-mt.1176 More accurate description of vm parameter 48 (the image header flags). =============== Diff against System-mt.1176 =============== Item was changed: ----- Method: SmalltalkImage>>vmParameterAt: (in category 'vm parameters') ----- vmParameterAt: parameterIndex "parameterIndex is a positive integer corresponding to one of the VM's internal parameter/metric registers. Answer with the current value of that register. Fail if parameterIndex has no corresponding register. VM parameters are numbered as follows: 1 byte size of old-space (read-only) 2 byte size of young-space (read-only) 3 byte size of object memory (read-only) 4 allocationCount (read-only; nil in Cog VMs) 5 allocations between GCs (read-write; nil in Cog VMs) 6 survivor count tenuring threshold (read-write) 7 full GCs since startup (read-only) 8 total milliseconds in full GCs since startup (read-only) 9 incremental GCs since startup (read-only; scavenging GCs on Spur) 10 total milliseconds in incremental/scavenging GCs since startup (read-only) 11 tenures of surving objects since startup (read-only) 12-15 specific to the translating VM 16 total microseconds in idle since startup 17 proportion of code zone available for use (Sista VMs only; read-write) 18 total milliseconds in full GC compaction since startup (a portion of parameter 8) 19 scavenge threshold; the effective size of eden 20 utc microseconds at VM start-up (actually at time initialization, which precedes image load) (newer Cog VMs only). 21 root (remembered) table size (read-only) 22 root (remembered) table overflows since startup (read-only) 23 bytes of extra memory to reserve for VM buffers, plugins, etc. 24 memory threshold above which to shrink object memory (read-write) 25 ammount to grow by when growing object memory (read-write) 26 interruptChecksEveryNms - force an ioProcessEvents every N milliseconds (read-write) 27 number of times mark loop iterated for current IGC/FGC (read-only) includes ALL marking 28 number of times sweep loop iterated for current IGC/FGC (read-only) 29 number of times make forward loop iterated for current IGC/FGC (read-only) 30 number of times compact move loop iterated for current IGC/FGC (read-only) 31 number of grow memory requests (read-only) 32 number of shrink memory requests (read-only) 33 number of root table entries used for current IGC/FGC (read-only) 34 bytes allocated in total since start-up or reset (read-write) 35 number of survivor objects after current IGC/FGC (read-only) 36 millisecond clock when current IGC/FGC completed (read-only) 37 number of marked objects for Roots of the world, not including Root Table entries for current IGC/FGC (read-only) 38 milliseconds taken by current IGC (read-only) 39 Number of finalization signals for Weak Objects pending when current IGC/FGC completed (read-only) 40 BytesPerWord for this image 41 imageFormatVersion for the VM 42 number of stack pages in use (Cog Stack VM only, otherwise nil) 43 desired number of stack pages (stored in image file header, max 65535; Cog VMs only, otherwise nil) 44 size of eden, in bytes (Cog VMs only, otherwise nil) 45 desired size of eden, in bytes (stored in image file header; Cog VMs only, otherwise nil) 46 size of machine code zone, in bytes (stored in image file header; Cog JIT VM only, otherwise nil) 47 desired size of machine code zone, in bytes (applies at startup only, stored in image file header; Cog JIT VM only) + 48 various properties stored in the image header (that instruct the VM) as an integer encoding an array of bit flags. - 48 various properties of the Cog VM as an integer encoding an array of bit flags. Bit 0: tells the VM that the image's Process class has threadId as its 5th inst var (after nextLink, suspendedContext, priority & myList) Bit 1: on Cog JIT VMs asks the VM to set the flag bit in interpreted methods Bit 2: if set, preempting a process puts it to the head of its run queue, not the back, i.e. preempting a process by a higher priority one will not cause the preempted process to yield to others at the same priority. Bit 3: in a muilt-threaded VM, if set, the Window system will only be accessed from the first VM thread Bit 4: in a Spur vm, if set, causes weaklings and ephemerons to be queued individually for finalization Bit 5: if set, implies wheel events will be delivered as such and not mapped to arrow key events Bit 6: if set, implies arithmetic primitives will fail if given arguments of different types (float vs int) 49 the size of the external semaphore table (read-write; Cog VMs only) 50-51 reserved for VM parameters that persist in the image (such as eden above) 52 root (remembered) table maximum size (read-only) 53 the number of oldSpace segments (Spur only, otherwise nil) 54 total size of free old space (Spur only, otherwise nil) 55 ratio of growth and image size at or above which a GC will be performed post scavenge (Spur only, otherwise nil) 56 number of process switches since startup (read-only) 57 number of ioProcessEvents calls since startup (read-only) 58 number of forceInterruptCheck (Cog VMs) or quickCheckInterruptCalls (non-Cog VMs) calls since startup (read-only) 59 number of check event calls since startup (read-only) 60 number of stack page overflows since startup (read-only; Cog VMs only) 61 number of stack page divorces since startup (read-only; Cog VMs only) 62 number of machine code zone compactions since startup (read-only; Cog VMs only) 63 milliseconds taken by machine code zone compactions since startup (read-only; Cog VMs only) 64 current number of machine code methods (read-only; Cog VMs only) 65 In newer Cog VMs a set of flags describing VM features, if non-zero bit 0 implies multiple bytecode set support; if non-zero bit 1 implies read-only object support; if non-zero bit 2 implies the VM suffers from using an ITIMER heartbeat (if 0 it has a thread that provides the heartbeat) (read-only; Cog VMs only; nil in older Cog VMs, a boolean answering multiple bytecode support in not so old Cog VMs) 66 the byte size of a stack page in the stack zone (read-only; Cog VMs only) 67 the maximum allowed size of old space in bytes, 0 implies no internal limit (Spur VMs only). 68 the average number of live stack pages when scanned by GC (at scavenge/gc/become et al) 69 the maximum number of live stack pages when scanned by GC (at scavenge/gc/become et al) 70 the value of VM_PROXY_MAJOR (the interpreterProxy major version number) 71 the value of VM_PROXY_MINOR (the interpreterProxy minor version number) 72 total milliseconds in full GCs Mark phase since startup (read-only) 73 total milliseconds in full GCs Sweep phase since startup (read-only, can be 0 depending on compactors) 74 maximum pause time due to segment allocation" self primitiveFailed! From commits at source.squeak.org Thu Oct 8 18:21:18 2020 From: commits at source.squeak.org (commits at source.squeak.org) Date: Thu, 8 Oct 2020 18:21:18 0000 Subject: [squeak-dev] The Inbox: Collections-ct.915.mcz Message-ID: Christoph Thiede uploaded a new version of Collections to project The Inbox: http://source.squeak.org/inbox/Collections-ct.915.mcz ==================== Summary ==================== Name: Collections-ct.915 Author: ct Time: 8 October 2020, 8:21:15.67836 pm UUID: 100e2e09-bb92-5840-ba4f-575ce040519e Ancestors: Collections-eem.913 Adds accessor and constructor for TextURL =============== Diff against Collections-eem.913 =============== Item was added: + ----- Method: TextURL class>>url: (in category 'instance creation') ----- + url: anUrl + + ^ self new + url: anUrl; + yourself! Item was added: + ----- Method: TextURL>>url (in category 'accessing') ----- + url + ^ url! From Christoph.Thiede at student.hpi.uni-potsdam.de Thu Oct 8 18:27:07 2020 From: Christoph.Thiede at student.hpi.uni-potsdam.de (Thiede, Christoph) Date: Thu, 8 Oct 2020 18:27:07 +0000 Subject: [squeak-dev] Changeset: MimeDocument>>url Message-ID: Hi all, this changeset is really (!) small, but it fixes an implicit reference from Network on MorphicExtras because WebUtils class >> #encodeMultipartForm:boundary: accesses the URL of every MIMEDocument. I only recategorized this one selector. Could someone with Trunk permissions please merge this into the Trunk? :-) Thanks in advance, Christoph -------------- next part -------------- An HTML attachment was scrubbed... URL: -------------- next part -------------- An embedded and charset-unspecified text was scrubbed... Name: MIMEDocument##url.1.cs URL: From commits at source.squeak.org Thu Oct 8 18:35:44 2020 From: commits at source.squeak.org (commits at source.squeak.org) Date: Thu, 8 Oct 2020 18:35:44 0000 Subject: [squeak-dev] The Trunk: EToys-eem.405.mcz Message-ID: Eliot Miranda uploaded a new version of EToys to project The Trunk: http://source.squeak.org/trunk/EToys-eem.405.mcz ==================== Summary ==================== Name: EToys-eem.405 Author: eem Time: 8 October 2020, 11:35:40.630409 am UUID: c661ab6d-7d37-4723-ab5b-f049ea31b5c2 Ancestors: EToys-eem.404 CameraInterface: surface the little known fact that 352 at 288 is a supported resolution, at least on WIndows and Mac (and that due to downsampling to 320 at 280 352 at 288 may give a cnsiderably higher frame rate, on my ASUS VivoBook S laptop with WIndows 10 Home Ed, 9 fps vs 7 fps). =============== Diff against EToys-eem.404 =============== Item was changed: ----- Method: CameraInterface class>>interruptDrivenVideoTest: (in category 'test') ----- interruptDrivenVideoTest: camNum "A quick test of video input. Displays video on the screen until the mouse is pressed. Answer nil if the interrupt-driven interface is unavailable." "self interruptDrivenVideoTest: 1" "self interruptDrivenVideoTest: 2" "[self interruptDrivenVideoTest: 2] fork. self interruptDrivenVideoTest: 1" | semaphore height | height := 16. 1 to: camNum - 1 do: [:camIndex| "N.B. the of an unopened camera is 0 at 0" height := height + (CameraInterface frameExtent: camIndex) y + 16]. (CameraInterface cameraIsOpen: camNum) ifFalse: + [(CameraInterface openCamera: camNum width: 352 height: 288) ifNil: - [(CameraInterface openCamera: camNum width: 320 height: 240) ifNil: [self inform: 'no camera'. ^nil]]. semaphore := Semaphore new. [CameraInterface camera: camNum setSemaphore: (Smalltalk registerExternalObject: semaphore)] on: Error do: [:err| Smalltalk unregisterExternalObject: semaphore. self inform: 'interrupt-driven camera interface unavailable: ', err messageText. ^nil]. [| f n startTime frameCount msecs fps | [semaphore wait. + "N.B. the frame extent may not be known until the delivery of the first frame. - "N.B. the frame extet may not be known until the delivery of the first frame. Si we have to delay initialization." startTime ifNil: [(self frameExtent: camNum) x = 0 ifTrue: [self inform: 'no camera'. ^nil]. f := Form extent: (CameraInterface frameExtent: camNum) depth: 32. frameCount := 0. startTime := Time millisecondClockValue]. Sensor anyButtonPressed] whileFalse: [n := CameraInterface getFrameForCamera: camNum into: f bits. n > 0 ifTrue: [frameCount := frameCount + 1. f displayAt: 16 @ height]]. msecs := Time millisecondClockValue - startTime. fps := (frameCount * 1000) // msecs. ^frameCount printString, ' frames at ', fps printString, ' frames/sec'] ensure: [CameraInterface closeCamera: camNum. Smalltalk unregisterExternalObject: semaphore. Sensor waitNoButton]! From Christoph.Thiede at student.hpi.uni-potsdam.de Thu Oct 8 18:41:09 2020 From: Christoph.Thiede at student.hpi.uni-potsdam.de (Thiede, Christoph) Date: Thu, 8 Oct 2020 18:41:09 +0000 Subject: [squeak-dev] Changeset: Eliminating global state from Morphic In-Reply-To: References: <20200912173950.GA35925@shell.msen.com> <18c0e74293834ac6bc4af5be15dad436@student.hpi.uni-potsdam.de> <7B5B2DB1-9A8E-45D1-B566-F4B45A6C9774@rowledge.org> <,20200914154934.GA85344@shell.msen.com> <316eb771b4674076a884bb4caea31175@student.hpi.uni-potsdam.de> <,> <20200930002206.GA34073@shell.msen.com> <,> <,> , Message-ID: <4ff55bdbdfa44cc396bcdb61125b8fb9@student.hpi.uni-potsdam.de> Hi Marcel, thanks for reviewing and splitting up the changes! I confirm that two members of my image farm survived the recent patches without any problem. :D Best, Christoph ________________________________ Von: Squeak-dev im Auftrag von Taeumel, Marcel Gesendet: Donnerstag, 8. Oktober 2020 17:20:26 An: squeak-dev Betreff: Re: [squeak-dev] Changeset: Eliminating global state from Morphic Hi Christoph, hi all! The first part of this refactoring is in the Trunk. Please try updating your images and report back! http://forum.world.st/The-Trunk-Morphic-mt-1697-mcz-td5123173.html If all went well, I will commit the second part, too, which will remove all remaining references to ActiveWorld etc. Best, Marcel Am 30.09.2020 18:22:43 schrieb Thiede, Christoph : This version includes a test method, #testActiveVariablesObsoletion, that makes sure that no one will try to reference one of the deprecated ActiveVariable bindings again in the future. Thanks to Marcel for the tip! Best, Christoph ________________________________ Von: Squeak-dev im Auftrag von Thiede, Christoph Gesendet: Mittwoch, 30. September 2020 17:50:43 An: The general-purpose Squeak developers list Betreff: Re: [squeak-dev] Changeset: Eliminating global state from Morphic Here is another version of the changeset that does not even longer raise a debugger when removing the current hand. Best, Christoph ________________________________ Von: Squeak-dev im Auftrag von Thiede, Christoph Gesendet: Mittwoch, 30. September 2020 11:40:05 An: The general-purpose Squeak developers list Betreff: Re: [squeak-dev] Changeset: Eliminating global state from Morphic Hm, probably we should integrate the "filein without UI updates" option into the FileList menu, too ...? Best, Christoph ________________________________ Von: Squeak-dev im Auftrag von David T. Lewis Gesendet: Mittwoch, 30. September 2020 02:22:06 An: The general-purpose Squeak developers list Betreff: Re: [squeak-dev] Changeset: Eliminating global state from Morphic On Mon, Sep 28, 2020 at 10:55:45AM +0000, Thiede, Christoph wrote: > Hi all, > > > Dave, I double-checked it. When loading the second changeset, can you confirm that you used the new option in the drop handler dialog? > > > [cid:3848a1c6-d67f-4999-a714-ffafff2b4a22] > No, I did definitely not do that. I opened a FileList and selected the change sets one at a time, and clicked install for each. Installing the second change set locked the image. After reading your email, I did this: 1) Forwarded your email to my dtlewis290 at gmail.com (spam oriented) account so I could view the graphic attachment, which showed that you are using drag and drop when you load the change sets. 2) Opened a GUI file browser on my Ubuntu laptop, and used drag and drop to copy the two change sets to my image. 3) On dropping the second change set into the image, I selected the "... without updating UI" option. That worked. Dave -------------- next part -------------- An HTML attachment was scrubbed... URL: From Christoph.Thiede at student.hpi.uni-potsdam.de Thu Oct 8 18:52:18 2020 From: Christoph.Thiede at student.hpi.uni-potsdam.de (Thiede, Christoph) Date: Thu, 8 Oct 2020 18:52:18 +0000 Subject: [squeak-dev] Shortcuts for Dual Change Sorter In-Reply-To: References: Message-ID: <8e90219d9ab5424286e4f9f0351418c9@student.hpi.uni-potsdam.de> Hi Marcel, good point, interesting proposal! Personally, I use to do 'mov' and similar sequences, which might be a bit slower than real shortcuts, but more intuitive (at least for me). Consistent shortcuts would be great! :-) What about s (move) and S (copy), derivated from the term "side"? Btw, I would find drag'n'drop support very helpful for the change sorter, too. Ideally, also let's make it possible to move changes from one window into another one ... :D Best, Christoph ________________________________ Von: Squeak-dev im Auftrag von Taeumel, Marcel Gesendet: Donnerstag, 8. Oktober 2020 14:55:28 An: squeak-dev Betreff: [squeak-dev] Shortcuts for Dual Change Sorter Hi all! I would like to have keyboard shortcuts for copy/move changes between change sets. [cid:b5193c12-49bb-4f17-88d4-e1372daf660e] What would work? [cmd]+[m] for "move" and [cmd]+[shift]+[m] for "copy"? Unfortunately, the arrow keys cannot be caught at that point. [cmd]+[left/right] would have been a nice fit. Anyway, thoughts? Far away from [d] and [x], I suppose ... :-) Well, using [m] would mask "Implementors". Hmmm... Goal: Make it easier to author change sets through the dual-change sorter. Best, Marcel -------------- next part -------------- An HTML attachment was scrubbed... URL: -------------- next part -------------- A non-text attachment was scrubbed... Name: image.png Type: image/png Size: 156217 bytes Desc: image.png URL: From asqueaker at gmail.com Thu Oct 8 20:15:12 2020 From: asqueaker at gmail.com (Chris Muller) Date: Thu, 8 Oct 2020 15:15:12 -0500 Subject: [squeak-dev] Notice | On inbox treatment, pleaes use "move to" instead of "copy to" In-Reply-To: References: Message-ID: Hi, On Mon, Oct 5, 2020 at 4:47 AM Marcel Taeumel wrote: > Hi all! > > I notice several, already-merged, versions in the inbox: > > > > When treating inbox versions, please use "move to trunk" or "move to > treated" from the source.squeak.org Web interface. The "copy to" from > within the image does not clean up the inbox. > +1 > ... Can we have that "move" as a button besides "copy" in Monitcello > tools? Is a move operation possible through that interface? > Seems like it should be possible, the method which that button on the web-interface executes is SSVersionView>>#move:to: we would just need to figure out how to integrate that into the non-web API. Unfortunately, I cannot take it on at this time, but the code is in the "SqueakSource" package at source.squeak.org/ss if someone else has time to do it. Best, Chris > > > Best, > Marcel > > -------------- next part -------------- An HTML attachment was scrubbed... URL: -------------- next part -------------- A non-text attachment was scrubbed... Name: image.png Type: image/png Size: 83113 bytes Desc: not available URL: From commits at source.squeak.org Thu Oct 8 21:35:50 2020 From: commits at source.squeak.org (commits at source.squeak.org) Date: Thu, 8 Oct 2020 21:35:50 0000 Subject: [squeak-dev] The Trunk: Kernel-tonyg.1344.mcz Message-ID: Tony Garnock-Jones uploaded a new version of Kernel to project The Trunk: http://source.squeak.org/trunk/Kernel-tonyg.1344.mcz ==================== Summary ==================== Name: Kernel-tonyg.1344 Author: tonyg Time: 8 October 2020, 11:35:47.705963 pm UUID: d68b8946-be04-4e8c-9a2d-76e31736aa4b Ancestors: Kernel-dtl.1343 Avoid explicit mention of Promise in a handful of places, preferring instead some means of specifying "the currently-relevant kind of Promise". Useful for subclasses of Promise. =============== Diff against Kernel-dtl.1343 =============== Item was changed: ----- Method: Promise class>>ifRejected: (in category 'instance creation') ----- ifRejected: aBlock + ^ self basicNew initializeWithIfRejected: aBlock.! - ^ Promise basicNew initializeWithIfRejected: aBlock.! Item was changed: ----- Method: Promise class>>unit: (in category 'instance creation') ----- unit: anObject "Return a resolved Promise. #new is the other half of Promise's unit function; #new returns an unresolved Promise." + ^ self basicNew initializeWithResolvedValue: anObject.! - ^ Promise basicNew initializeWithResolvedValue: anObject.! Item was changed: ----- Method: Promise>>then:ifRejected: (in category 'monad') ----- then: resolvedBlock ifRejected: errBlock "Return a Promise that, if it resolves, runs the resolvedBlock. If resolution throws an Exception, it runs the errBlock." | p | + p := self species new. - p := Promise new. resolvedBlock ifNil: [self whenResolved: [:v | p resolveWith: v]] ifNotNil: [ self whenResolved: [:v | [p resolveWith: (resolvedBlock value: v)] on: Error do: [:e | p rejectWith: e]]]. errBlock ifNil: [self whenRejected: [:e | p rejectWith: e]] ifNotNil: [ self whenRejected: [:e | [p resolveWith: (errBlock value: e)] on: Error do: [:e2 | p rejectWith: e2]]]. ^ p.! From asqueaker at gmail.com Thu Oct 8 23:33:07 2020 From: asqueaker at gmail.com (Chris Muller) Date: Thu, 8 Oct 2020 18:33:07 -0500 Subject: [squeak-dev] Development methodology (was: tedious programming-in-the-debugger error needs fixing) In-Reply-To: <1601860447473-0.post@n4.nabble.com> References: <23476c3e0a68492c8cc917c38ba2c9d4@student.hpi.uni-potsdam.de> <1601475775699-0.post@n4.nabble.com> <1601590406774-0.post@n4.nabble.com> <076817EE-1506-47F9-9AF4-3126C6D3BC76@rowledge.org> <1601860447473-0.post@n4.nabble.com> Message-ID: Hi Jakob, Sorry, I was delayed, getting caught up and finally swung back around to this thread.. I suppose many of us drawn towards Git instead of Monticello find Monticello > lacking in not only minor ways. Like what? Please don't say branches. It supported it well-enough for the few times our small community used them. > The alternative or improvement needs not > necessarily be Git, but given its acceptance in the wider developer > community, it is an obvious choice. > > Chris Muller-3 wrote > > For me, > > it's not really anything about any "feelings" about Git as the > > (im)practicality of integration. It's a beast. To bring a beast into > > _everyone's_ workflow that has 90% more "stuff" than we need [...] > > What exactly do you think is so massive about Git? I wanted to grok git by approaching it via its public API. With my new GraphQL expertise, I figured I could spank out a client prototype in an evening. Then I found the schema: https://docs.github.com/en/free-pro-team at latest/graphql/overview/public-schema and the project was instantly shelved. Why so many types? I think due to the many "social" features that I don't really care about. Monticello does everything I want in only a few pages of code. It's easy to understand and has been relatively easy to extend, so I've stuck with it so far. I'm not against Git, I just haven't been sufficiently interested by it yet. > The basics are really > quite simple. The complexity comes with the vast number of possibilities to > transform a graph of history, and canonical Git supporting many of them, > but > you do not have to do or support all of these. Other idiosyncrasies of Git > can be simply omitted. For example, you will not find anything about the "index" or staging area of Git in the Git Browser tools. Git vocabulary is > different from Monticello vocabulary (that is true for almost all pairs of > version control systems) and Git has some different ideas of how tracking > works and what to put in a single repository. But if you stick to the > Monticello workflows and know the corresponding Git vocabulary, I contend > that Git is not more complicated than Monticello. Fixing a Monticello > ancestry is at least as complicated as doing a rebase ("advanced feature") > in Git; after you have learned either, you can confidently wield either. A lot of extra, ignorable features, basically is the definition of over-engineered. Don't get me wrong, it's a great tool for developers with your level of expertise. I'm more of a "user", though, the extra stuff is harder for me. > In other ways, Monticello just looks simpler because something is in fact > missing. Consider branches: most Git tools have knobs to deal with them in > various ways, while Monticello tools just deny to talk about branches. Monticello ancestry does support branching, yet I think Monticello lacks > first-class objects for branches, with all the implications for repository > handling. The tools might look simpler without branch management, but it is > not a feature but rather the lack of one. Note that you can also avoid > branch management in Git: just stay on the mainline branch forever and > merge > your commits back and forth with the upstream repository's mainline. While > it might appear simpler that way, you might as well call it less organized. > Support for branching was added to Monticello in 2012. See MCVersionNameTest>>#testBranches. Eliot used them during development of cog or spur, but I'm not aware of this feature having been all that critical for Squeak. We tend to like just one master branch with occasional releases. But, it's there and basically achieves the needed functionality. That we were able to even add such functionality highlights one often-overlooked advantage of maintaining control over one's own software destiny. I guess this isn't the case with Github, and yet the demand for more features from the diverse hoards of developers requires it to be all things to all of them. Hence, it's beastly complexity. > Chris Muller-3 wrote > > [...] requires > > them to sign up just to use -- I think it would be a "filter" on the > > community, especially of non-developers (hint: You and Jakob are > > developers). For me, being hosted by a private company is not so > > attractive. > > As Phil pointed out, you seem to confuse Git with GitHub here. But your > arguments are applicable if we take the integrated issue tracker into > account because that needs to be run by someone. In theory Squeak could > host > an own GitLab Community Edition server instead of relying on GitHub. > I thought the social benefits (exposure and growth, I guess) were via exposure to the github user base. If we hosted ourselves, would it be any different than the "deserted island" situation we have now? That's all what I was referring to. I thought the purpose was for the exposure. If you have to host yourself anyway then we're basically down to a tool comparison? > Chris Muller-3 wrote > > For example, you could submit an > > improvement that allows original contributors of Inbox items to move them > > to Treated themself. > > How? Only Trunk committers have access to the Squeaksource treating > backend, > so neither the code nor the tool is available to normal users for > improvement. Guest users cannot even delete versions from the inbox > repository, can they? > It's public read, anyone can access the code and submit improvements to the Inbox. But, I agree, it'd be nice if there were a way for strangers to contribute more obviously. One idea would be for each SqueakSource repository to have it's own internal "Inbox" Repository to support some of these features... > Chris Muller-3 wrote > > You could add a button to filter out all entries in > > the Inbox which have further descendants also in the Inbox. You could > > make > > an, "update from Inbox" which would only download packages for which have > > your loaded versions as ancestors. > > I don't understand how these would help in the tracking of issues, can you > elaborate please? My understanding: The first shows you the tips of all > loose branches in the inbox, but still without a mapping to issues (which > is > not necessarily a 1:1 mapping, with reinforced complexity because of the > drive towards a compact ancestry...). Combined with some client-side > extensions it might allow us to track branches locally, but not share them > explicitly. To find remote branches, you would have to download many of > these versions first because only then you can access their ancestry (you > don't know in advance which versions are the tips, and combined with the > redundancy among versions, this is a Monticello implementation flaw). The > second would allow an update if someone moved some of your own branches > forward. But it rarely happens nowadays. > Yes, these are just loose ideas conjured in 10 seconds. The point is Monticello is relatively small, simple, and malleable, and this makes it feasible to improve, even if getting it implemented requires writing email. Monticello does suffer from some scalability issues that will eventually need to be addressed. But the redundancy among versions is a feature, not a flaw. To this day, planes have poor internet access, this redundancy is about availability. In the Magma-based, there is only one instance of each MCDefinition shared amongst all Versions, but not everyone set that up on their laptop (I made it as easy as I could). > Chris Muller-3 wrote > > We have *decades* of Monticello packages for Squeak across not just our > > own > > repositories, but many other "external" legacy repositories. [...] > > Monticello will continue > > to be used by some. > > In my opinion this is no argument against different tools because nobody > suggested to remove Monticello from Squeak. I agree. It wasn't meant to be an argument against anything. > As we already see in practice, > Git tools and Monticello tools, as well as both kinds of repositories, can > co-exist. > Great! Please don't mistake my lack of interest as "opposition". > Chris Muller-3 wrote > > It seems clear that the only path to Git and other > > tools is a backward-compatible integration with existing tools > > Well, other paths have already been walked. ;-) But in which direction goes > this backwards- compatibility? Do you want be able to use newer tools also > on old repositories? Alright, that would be nice. Do you want to be able to > use newer repositories in old tools? Why, given that it will probably > restrict the newer repositories? > What I had wanted to do start by sucking in their GraphQL schema into my fantastic new GraphQL Engine, and map their types to the Monticello types. Basically appear to BE a Git server, but mapped behind the scenes to legacy MC repos that could be accessed via the legacy way, for users that wanted to. Alas, the schema is longer than *War and Peace*. Chris Muller-3 wrote > > a "stepping > > stone" that doesn't require a major adjustment like losing method-level > > timestamp information. > > This seems to confound the use of Git with the use of the Tonel format with > a Pharo-style implementation. > > Otherwise it affirms what I wrote a few messages before: maybe we do have > to > bite the bullet and write a proper MCGitRepository that molds Git-hosted > projects into the Monticello tools, even though we have already created > other tools. > If you're interested in collaborating on my above idea of hosting our own server based on their v4 GraphQL API, but with an MC+ backend, I believe my GraphQL engine is ready. If you know the essential parts of the Git model well enough to know how to hook it up to a MC backend, I could fully support the GraphQL parsing and processing aspect. Email me if you're interested. - Chris -------------- next part -------------- An HTML attachment was scrubbed... URL: From asqueaker at gmail.com Fri Oct 9 00:43:22 2020 From: asqueaker at gmail.com (Chris Muller) Date: Thu, 8 Oct 2020 19:43:22 -0500 Subject: [squeak-dev] Development methodology (was: tedious programming-in-the-debugger error needs fixing) In-Reply-To: <1601923620443-0.post@n4.nabble.com> References: <23476c3e0a68492c8cc917c38ba2c9d4@student.hpi.uni-potsdam.de> <1601475775699-0.post@n4.nabble.com> <1601590406774-0.post@n4.nabble.com> <076817EE-1506-47F9-9AF4-3126C6D3BC76@rowledge.org> <1601860447473-0.post@n4.nabble.com> <025A3F5C-E26E-44C6-B19B-FBED361CE779@gmail.com> <1601923620443-0.post@n4.nabble.com> Message-ID: Hey! Just for fun, I parsed that schema to see if it would help looking at it in a Squeak ObjectExplorer. Mmmm.. a little, but not really... It's the sheer volume, check out the attached screenshot. I looked for something basic sounding, and came across "User". Look, it has 64 fields! :-o And this is just one of 978 types in total. If you can figure out which of these to map to Monticello's 40 (or whatever it is) types, you could use this parser and Engine in combination with WebServer to host a Git server with MC backend.. MC users could ignore git, while Git users could ignore MC. :-D To me, it looks very intimidating, though... [image: Git-parsed-GraphQL-schema.png] On Mon, Oct 5, 2020 at 1:47 PM Jakob Reschke wrote: > Hi Eliot, > > > Eliot Miranda-2 wrote > >> On Oct 4, 2020, at 6:14 PM, Jakob Reschke < > > > forums.jakob@ > > > > wrote: > >> > >> In other ways, Monticello just looks simpler because something is in > fact > >> missing. Consider branches: most Git tools have knobs to deal with them > >> in > >> various ways, while Monticello tools just deny to talk about branches. > >> Monticello ancestry does support branching, yet I think Monticello lacks > >> first-class objects for branches, with all the implications for > >> repository > >> handling. The tools might look simpler without branch management, but it > >> is > >> not a feature but rather the lack of one. Note that you can also avoid > >> branch management in Git: just stay on the mainline branch forever and > >> merge > >> your commits back and forth with the upstream repository's mainline. > >> While > >> it might appear simpler that way, you might as well call it less > >> organized. > > > > Monticello supports branches. And merging between them is as easy as > > merging any other version of a package. And Monticello does support > > recording histories across branches. > > That is what I wrote: Monticello ancestry does support branching. But there > is no list of branches and there is no object for a branch. Instead one has > to find the loose ends in a sea of versions. Chris's first tool suggestion > would alleviate this, but it may be quite expensive and would still not > give > names to branches. > > Anyway, to have branches was not what Christoph and I were after. Topic > tracking and integrated conversations it is. > > > Eliot Miranda-2 wrote > > The two things that Monticello has over git are > > - that it is used without leaving the image. I’ve yet to see a git > > integration where at some stage one was forced to try and fix things in > > git, or that the image and the git repository got out of sync, or that if > > one tried to use more than one image against a git repository something > > horrible broke > > - that it can be extended using our own tools. Git is written in C and > > controlled by a separate community. One gives up great autonomy when > > allowing ones core VCS to be in a foreign system. When git crashes it > > crashes. It doesn’t raise a friendly debugger in which one can determine > > and fix and proceed from the bug, it segfaults, in optimized code, and > > you’re hosed. > > I can see your point. Although I cannot remember seeing Git crash for me in > the last ten years. And we are in a serious lock-in if we extend this > notion > to everything in the world. I'm glad the other programming languages did > not > all have to implement their own VCS first, otherwise there would be even > more of these around. > > Luckily, we already have a Git implementation in Smalltalk. Thank Tobias > for > urging me to salvage this rather than concentrating on FFI and libgit2 > three > years ago. The Git Browser tools are as Squeak as they can be for dealing > with Smalltalk packages. Except maybe that the Git repository is still > stored outside, but what is a commit worth if it gets trapped in an > unsaved, > unexpectedly broken image. > > Even if we didn't have this Smalltalk implementation, the canonical Git has > lots of plumbing tools that could be controlled via OSProcess to query and > manipulate repositories. It wouldn't crash the VM like errors in libgit2 > might, at the cost of being much slower. > > > Eliot Miranda-2 wrote > > Personally I don’t want to work in that kind of world. The Pharo crowd > > do. I will do everything in my power to prevent Squeak going the same > > way. And if I’m unsuccessful I’ll go somewhere else. > > Understood. I don't wish to see you leave. > > Yet in my opinion Squeak really needs to get along with the outside world > for the mutual benefit; we cannot afford to always reimplement everything > in > Smalltalk just to be able to comfortably debug the issues we wouldn't have > if we had used something mature. > > Originally this thread was about the development process and how it can be > improved. Sorry for drifting into the Squeak vs. the World discussion > again. > Some things just trouble me and make me sad. > > Kind regards, > Jakob > > > > -- > Sent from: http://forum.world.st/Squeak-Dev-f45488.html > > -------------- next part -------------- An HTML attachment was scrubbed... URL: -------------- next part -------------- A non-text attachment was scrubbed... Name: Git-parsed-GraphQL-schema.png Type: image/png Size: 202806 bytes Desc: not available URL: From commits at source.squeak.org Fri Oct 9 00:45:24 2020 From: commits at source.squeak.org (commits at source.squeak.org) Date: Fri, 9 Oct 2020 00:45:24 0000 Subject: [squeak-dev] The Trunk: Tools-eem.995.mcz Message-ID: Eliot Miranda uploaded a new version of Tools to project The Trunk: http://source.squeak.org/trunk/Tools-eem.995.mcz ==================== Summary ==================== Name: Tools-eem.995 Author: eem Time: 8 October 2020, 5:45:21.763017 pm UUID: bb98e3aa-f777-4e88-8891-a0c8e640b0c4 Ancestors: Tools-eem.994 Fix integer bases in the ContextInspector. self object in a ContextInspector is the context itself. So to find out if we should be using a strange base we have to ask the context's receiver class, not Context. And use a Symbol looking up a class to save interning. (One should always use symbols to look up known class names; they show up in references to class queries that way). =============== Diff against Tools-eem.994 =============== Item was added: + ----- Method: ContextInspector>>defaultIntegerBase (in category 'user interface') ----- + defaultIntegerBase + "Answer the default base in which to print integers. + Defer to the class of the instance." + + ^ (self object receiver class respondsTo: #defaultIntegerBaseInDebugger) + ifTrue: [self object receiver class perform: #defaultIntegerBaseInDebugger] + ifFalse: [10]! Item was changed: ----- Method: Inspector>>initialize (in category 'initialization') ----- initialize super initialize. customFields := OrderedCollection new. selectionIndex := 0. + fieldListStyler := (Smalltalk classNamed: #SHTextStylerST80) - fieldListStyler := (Smalltalk classNamed: 'SHTextStylerST80') ifNotNil: [:class | class new].! From asqueaker at gmail.com Fri Oct 9 01:14:56 2020 From: asqueaker at gmail.com (Chris Muller) Date: Thu, 8 Oct 2020 20:14:56 -0500 Subject: [squeak-dev] Exception patterns (The Inbox: Kernel-ct.1292.mcz) In-Reply-To: <0d47e32b25594ae1885da3706447de36@student.hpi.uni-potsdam.de> References: <2f92c32e769a4e29a2c93f655b87638f@student.hpi.uni-potsdam.de> <0d47e32b25594ae1885da3706447de36@student.hpi.uni-potsdam.de> Message-ID: Hi Christoph, Are these equivalent -- On Thu, Jan 2, 2020 at 7:58 PM Thiede, Christoph < Christoph.Thiede at student.hpi.uni-potsdam.de> wrote: > Outlook jumbled my message completely. Here the examples again: > > [self model merge] > on: MCMergeResolutionRequest > & [:request | request merger conflicts notEmpty] > do: [:request | request resume: true]. > equal to: [self model merge] on: MCMergeResolutionRequest do: [:request | request merger conflicts notEmpty ifTrue: [request resume: true] ifFalse: [request pass] ] ? > > [client unusedBytecode] > on: MessageNotUnderstood > & [:ex | ex receiver == client] > & [:ex | ex message selector == #unusedBytecode] > do: [self error: 'unusedBytecode']. > equal to [client unusedBytecode] on: MessageNotUnderstood do: [:ex | (ex receiver == client and: [ ex message selector == #unusedBytecode ]) ifTrue: [ self error: 'unusedBytecode' ] ifFalse: [ ex pass ] ] ? Not sure if I fully understood it, but is it just a reformat of the syntax? Or something more empowering? > > references := [self resolvePackageSpecReferences: packageSpec gofer: gofer] > on: [self class retryPackageResolution] & (Error , > GoferRepositoryError) > do: [:ex | retryCount >= 2 ifFalse: [ > ex return: #() ] > on: [self class retryPackageResolution] & GoferRepositoryError. > Transcript showln: 'gofer repository error: '; show: ex > description printString; show: '...ignoring'. > (repositoryError := ex) resume: #()]. (wait, is that, #on:do:on: ? I'm confused on this one...) - Chris > > sz := 1024*1024*1024*1024. > self > should: [Array new: sz] > raise: OutOfMemory, (Error & [:ex | ex messageText > includesSubstring: 'basicNew: with invalid argument']). > -------------- next part -------------- An HTML attachment was scrubbed... URL: From marcel.taeumel at hpi.de Fri Oct 9 06:49:19 2020 From: marcel.taeumel at hpi.de (Marcel Taeumel) Date: Fri, 9 Oct 2020 08:49:19 +0200 Subject: [squeak-dev] Shortcuts for Dual Change Sorter In-Reply-To: <8e90219d9ab5424286e4f9f0351418c9@student.hpi.uni-potsdam.de> References: <8e90219d9ab5424286e4f9f0351418c9@student.hpi.uni-potsdam.de> Message-ID: Ha! I totally forgot about that [escape] for menu. Thanks! Am 08.10.2020 20:52:29 schrieb Thiede, Christoph : Hi Marcel, good point, interesting proposal! Personally, I use to do 'mov' and similar sequences, which might be a bit slower than real shortcuts, but more intuitive (at least for me). Consistent shortcuts would be great! :-) What about s (move) and S (copy), derivated from the term "side"? Btw, I would find drag'n'drop support very helpful for the change sorter, too. Ideally, also let's make it possible to move changes from one window into another one ... :D Best, Christoph [http://www.hpi.de/] Von: Squeak-dev im Auftrag von Taeumel, Marcel Gesendet: Donnerstag, 8. Oktober 2020 14:55:28 An: squeak-dev Betreff: [squeak-dev] Shortcuts for Dual Change Sorter   Hi all! I would like to have keyboard shortcuts for copy/move changes between change sets. What would work? [cmd]+[m] for "move" and [cmd]+[shift]+[m] for "copy"? Unfortunately, the arrow keys cannot be caught at that point. [cmd]+[left/right] would have been a nice fit. Anyway, thoughts? Far away from [d] and [x], I suppose ... :-) Well, using [m] would mask "Implementors". Hmmm... Goal: Make it easier to author change sets through the dual-change sorter. Best, Marcel -------------- next part -------------- An HTML attachment was scrubbed... URL: -------------- next part -------------- A non-text attachment was scrubbed... Name: image.png Type: image/png Size: 156217 bytes Desc: not available URL: From Das.Linux at gmx.de Fri Oct 9 06:57:05 2020 From: Das.Linux at gmx.de (Tobias Pape) Date: Fri, 9 Oct 2020 08:57:05 +0200 Subject: [squeak-dev] Installing high dpi support and backwards compatibility of the VM In-Reply-To: References: Message-ID: Hi > On 08.10.2020, at 19:58, Eliot Miranda wrote: > > Hi All, > > ideally adding the high dpi support to the VM will not break backwards-compatibility. But that implies that the VM is informed before it creates the display of whether to create a high dpi display or not. Off-list Tobias asked me where the VM sets up the display on Mac and I was surprised by the answer. > > I thought it would be as part of beDisplay. But it's actually as a side-effect of DisplayScreen class>>actualScreenSize, primitive 106, which calls the ioScreenSize function. It is this functions' responsibility to actually create the display, deriving the size from the savedWindowSize info in the image header (which can or could be overridden on the VM command line, and is when -headless is supplied). > > So any new primitive added to allow DisplayScreen to inform the VM of whether to use high dpi or not would have to be invoked before primitive 106. So one way to implement this is to modify the chain of invocations leading up to primitive 106. For this route I'd like to propose the following refactoring: > > DisplayScreen class>>actualScreenSize > > ^ 640 at 480 > > becomes > > DisplayScreen class>>actualScreenSize > self primitiveUseHighDPI: self useHighDPI. "where this is a preference" > ^self primitiveScreenSize > > primitiveScreenSize > > ^ 640 at 480 > Here's another idea: We already have DisplayScreen class>>actualScreenScaleFactor ^ 1.0 And if we change DisplayScreen class>>startUp to DisplayScreen class>>startUp "DisplayScreen startUp" Display setScaleFactor: self actualScreenScaleFactor. Display setExtent: self actualScreenSize depth: Display nativeDepth. Display beDisplay Then the contract could be: "Iff you call primitiveScreenScaleFactor before any call to primitive 106, then you opt in to possibly high dpi" That way, we do not have to change any image at all, cause older images just don't call that primitive. > > Another route is to make the useHighDPI flag part of the image header state alongside the saved window size. This would mean it was added to the flags accessed via vmParameterAt: 48. There could be a command-line argument to override. Maybe a cmd-line parameter in any case… > > > Finally I note that the beDisplay primitive simply stores the display object in the specialObjectsArray and assigns the interpreter variables that track the display, displayBits, displayWidth, displayHeight & displayDepth. It then invokes ioNoteDisplayChangedwidthheightdepth, but *all* the implementations of this function are empty. I propose that we should eliminate 5this call and its implementation. It is confusing to follow it and find it does nothing. The argument could be that a platform might require it. But if that's so we can always put it back. We have an existence proof in all our platforms that this is unlikely. Thoughts? Funny. The mac vm says "/* This is invoked when the GC moves the display bitmap. For now do nothing. */" Does the GC ever do that actually? It's also fairly recent: 78c402ea71ebcc9db12496f81021fdb9b57deb5f (Fri May 12 19:29:45 2017) StackInterpreter: Simplify and make robust display bitmap access for display update. The old code required platforms that needed to redraw at arbitrary times to have to access the display bits through interpreterProxy->displayObject, decoding it each time. There exists a small window during compaction, etc, during whiuch such access will fail and cause a VM crash. The new code provides four variables to reference the display, displayBits, displayWidth, displayHeight and displayDepth, which are assigned appropriately in the primitiveBeDisplay primitive. After a GC the interpreter checks if the displayBits have changed location and if so calls ioNoteDisplayChanged:width:height:depth: (ioNoteDisplayChangedwidthheightdepth) to inform the platform of the change (currently all platforms implement this as a null function). So, old (<2017) code cannot depend on it, new code does not. If the GC issue is moot, we can ditch it. Best regards -Tobias From marcel.taeumel at hpi.de Fri Oct 9 06:57:05 2020 From: marcel.taeumel at hpi.de (Marcel Taeumel) Date: Fri, 9 Oct 2020 08:57:05 +0200 Subject: [squeak-dev] Exception patterns (The Inbox: Kernel-ct.1292.mcz) In-Reply-To: References: <2f92c32e769a4e29a2c93f655b87638f@student.hpi.uni-potsdam.de> <0d47e32b25594ae1885da3706447de36@student.hpi.uni-potsdam.de> Message-ID: Hi Christoph, you are proposing an interface to avoid having to deal with Exception >> #pass and #resume:. I like #on:when:do:, maybe renamed to: #on:satisfying:do:. I do not like your & syntax because it would mix Exception, ExceptionSet, and BlockClosure -- which may be hard to understand and debug. Bset, Marcel Am 09.10.2020 03:15:43 schrieb Chris Muller : Hi Christoph, Are these equivalent -- On Thu, Jan 2, 2020 at 7:58 PM Thiede, Christoph wrote: Outlook jumbled my message completely. Here the examples again: [self model merge]         on: MCMergeResolutionRequest                 & [:request | request merger conflicts notEmpty]         do: [:request | request resume: true]. equal to:   [self model merge]         on: MCMergeResolutionRequest         do:             [:request | request merger conflicts notEmpty                 ifTrue: [request resume: true]                 ifFalse: [request pass] ] ?   [client unusedBytecode]         on: MessageNotUnderstood                 & [:ex | ex receiver == client]                 & [:ex | ex message selector == #unusedBytecode]         do: [self error: 'unusedBytecode']. equal to    [client unusedBytecode]          on: MessageNotUnderstood          do:                [:ex | (ex receiver == client and: [ ex message selector == #unusedBytecode ])                       ifTrue: [ self error: 'unusedBytecode' ]                       ifFalse: [ ex pass ] ] ? Not sure if I fully understood it, but is it just a reformat of the syntax?  Or something more empowering?   references := [self resolvePackageSpecReferences: packageSpec gofer: gofer]         on: [self class retryPackageResolution] & (Error , GoferRepositoryError)         do: [:ex | retryCount >= 2 ifFalse: [                 ex return: #() ]         on: [self class retryPackageResolution] & GoferRepositoryError.                 Transcript showln: 'gofer repository error: '; show: ex description printString; show: '...ignoring'.                 (repositoryError := ex) resume: #()].  (wait, is that, #on:do:on: ?  I'm confused on this one...)   - Chris   sz := 1024*1024*1024*1024. self         should: [Array new: sz]         raise: OutOfMemory, (Error & [:ex | ex messageText includesSubstring: 'basicNew: with invalid argument']). -------------- next part -------------- An HTML attachment was scrubbed... URL: From asqueaker at gmail.com Fri Oct 9 07:00:28 2020 From: asqueaker at gmail.com (Chris Muller) Date: Fri, 9 Oct 2020 02:00:28 -0500 Subject: [squeak-dev] Why it's clear Squeak is never going to be the Dynabook (was: The Trunk: Chronology-Core-eem.61.mcz) Message-ID: I have to get this off my chest. Is anyone proud of this smorgasbord of various clock values available in our, uh, "API". Time class>>#eventMillisecondClock Time class>>#highResClock Time class>>#localMicrosecondClockPrimitive Time class>>#localMicrosecondClockWithOffset Time class>>#millisecondClockValue Time class>>#posixMicrosecondClockWithOffset Time class>>#posixMicrosecondClockWithOffset: Time class>>#primPosixMicrosecondClockWithOffset Time class>>#primPosixMicrosecondClockWithOffset: Time class>>#totalSeconds Time class>>#utcMicrosecondClock DateAndTime class>>#millisecondClockValue (same as Time class>>#millisecondClockValue) DateAndTime class>>#totalSeconds (same as Time class>>#totalSeconds) It's already embarrassing to present to a new Smalltalk-80 user, but it can actually add *injury* [2] to unsuspecting users who were trusting enough to think that Squeak's API is a deliberate, crafted API. For all its technical capability and verbosity, there's still no elegant way for a Smalltalk-80 user to simply, and *efficiently,* access the underlying microsecond precision of the VM for use in the object environment. *Nothing* we have for this is user-friendly in the slightest. Last April I submitted a minor improvement to this situation to the Inbox[1]. A completely beautiful and elegant, Smalltalk-80'ish addition of just two methods, #asMicroseconds and #fromMicroseconds: for users to have as a high-res complement to #asSeconds and #fromSeconds:, with comments that were written to and for the *user* audience, and not the VM-developer audience. Sadly, but not really surprisingly, such user catering was handily rejected. I couldn't even finish addressing the first protester's "alternative suggestions" -- none of which acknowledged my core requirement (above) -- before someone else jumped in with their own "-1" on these grounds: *"There is no need to add to the API. You already have Smalltalk seconds at any level of precision care to use."* He was talking about requiring the user to introduce inefficient Fractions and/or ScaledDecimals into their domain, despite my having already explained the requirement not to create unnecessary garbage or complexity. Mind-bogglingly, this was from the same person who revamped and distilled the whole of Chronology's DateAndTime down to the efficiency of just two scalar values. So, to this day, in spite of its sprawling family methods, Squeak's class library, still, remains inadequate and needlessly stunted. Power available in the VM untapped, efficiency of the design, thwarted. Over the following weeks[3[4] I submitted multiple alternatives based on the feedback (all accommodating degradations that, again, failed to recognize the core requirement (argh!)), such as, *only eliminating the vicious trap*. But, after countless hours having addressed every random concern you could never imagine, my final submission[4] was basically left to die on the doorstep, with nothing more than a rude comment from someone who never really participated in the discussion at all. It was after this episode that I more or less stopped participating in trunk development. ________ Fast-forward to today. Three days have passed since Eliot popped these two new, but duplicate, methods right into the trunk. No discussion. Code so fresh, not even the spell-checker had finished. Two useless methods with comments addressed to a VM developer audience. Already a "+1," (post trunk, lol) from a fellow VM-developer, and none of the former objections leveled against my submissions seem important anymore, I guess. But, users are still out in the cold. Trygve was right. - Chris [1] http://lists.squeakfoundation.org/pipermail/squeak-dev/2020-April/208991.html [2] http://lists.squeakfoundation.org/pipermail/squeak-dev/2020-May/209033.html (DateAndTime utcMicroseconds: Time utcMicrosecondClock offset: 0) "looks reasonable, but it's VERY NOT!" [3] http://lists.squeakfoundation.org/pipermail/squeak-dev/2020-May/209035.html [4] http://lists.squeakfoundation.org/pipermail/squeak-dev/2020-May/209107.html https://www.youtube.com/watch?v=fODt3iBXNv4 On Tue, Oct 6, 2020 at 12:19 AM wrote: > Eliot Miranda uploaded a new version of Chronology-Core to project The > Trunk: > http://source.squeak.org/trunk/Chronology-Core-eem.61.mcz > > ==================== Summary ==================== > > Name: Chronology-Core-eem.61 > Author: eem > Time: 5 October 2020, 10:19:35.996376 pm > UUID: 13de44be-afb9-4f0f-81b1-5f3f8fa821db > Ancestors: Chronology-Core-dtl.60 > > Provide Time class>>millisecondClock and DateAndTime > class>>millisecondClock to indicate that this is now a proiper clock. It > will not roll-over after 45 days like the old 30 bit millisecond clock. > > Nw code should use millisecondClock, not millisecondClockValue, and old > code (senders of millisecondClockValue) should be migrated whenever > convenient. > > =============== Diff against Chronology-Core-dtl.60 =============== > > Item was added: > + ----- Method: DateAndTime class>>millisecondClock (in category > 'smalltalk-80') ----- > + millisecondClock > + > + ^self clock millisecondClock! > > Item was added: > + ----- Method: Time class>>millisecondClock (in category 'general > inquiries') ----- > + millisecondClock > + "Answer the value of the millisecond clock. Unlike older > implementatins, this is a clock; it will never roll-over." > + > + ^self utcMicrosecondClock // 1000! > > > -------------- next part -------------- An HTML attachment was scrubbed... URL: From marcel.taeumel at hpi.de Fri Oct 9 07:01:49 2020 From: marcel.taeumel at hpi.de (Marcel Taeumel) Date: Fri, 9 Oct 2020 09:01:49 +0200 Subject: [squeak-dev] Installing high dpi support and backwards compatibility of the VM In-Reply-To: References: Message-ID: Hi all! DisplayScreen is not in the startup-list anymore. Please focus those efforts on Project class >> startUp:. From there, you can control the order for initializing and using the graphics display without blocking the image. Best, Marcel Am 09.10.2020 08:57:15 schrieb Tobias Pape : Hi > On 08.10.2020, at 19:58, Eliot Miranda wrote: > > Hi All, > > ideally adding the high dpi support to the VM will not break backwards-compatibility. But that implies that the VM is informed before it creates the display of whether to create a high dpi display or not. Off-list Tobias asked me where the VM sets up the display on Mac and I was surprised by the answer. > > I thought it would be as part of beDisplay. But it's actually as a side-effect of DisplayScreen class>>actualScreenSize, primitive 106, which calls the ioScreenSize function. It is this functions' responsibility to actually create the display, deriving the size from the savedWindowSize info in the image header (which can or could be overridden on the VM command line, and is when -headless is supplied). > > So any new primitive added to allow DisplayScreen to inform the VM of whether to use high dpi or not would have to be invoked before primitive 106. So one way to implement this is to modify the chain of invocations leading up to primitive 106. For this route I'd like to propose the following refactoring: > > DisplayScreen class>>actualScreenSize > > ^ 640 at 480 > > becomes > > DisplayScreen class>>actualScreenSize > self primitiveUseHighDPI: self useHighDPI. "where this is a preference" > ^self primitiveScreenSize > > primitiveScreenSize > > ^ 640 at 480 > Here's another idea: We already have DisplayScreen class>>actualScreenScaleFactor ^ 1.0 And if we change DisplayScreen class>>startUp to DisplayScreen class>>startUp "DisplayScreen startUp" Display setScaleFactor: self actualScreenScaleFactor. Display setExtent: self actualScreenSize depth: Display nativeDepth. Display beDisplay Then the contract could be: "Iff you call primitiveScreenScaleFactor before any call to primitive 106, then you opt in to possibly high dpi" That way, we do not have to change any image at all, cause older images just don't call that primitive. > > Another route is to make the useHighDPI flag part of the image header state alongside the saved window size. This would mean it was added to the flags accessed via vmParameterAt: 48. There could be a command-line argument to override. Maybe a cmd-line parameter in any case… > > > Finally I note that the beDisplay primitive simply stores the display object in the specialObjectsArray and assigns the interpreter variables that track the display, displayBits, displayWidth, displayHeight & displayDepth. It then invokes ioNoteDisplayChangedwidthheightdepth, but *all* the implementations of this function are empty. I propose that we should eliminate 5this call and its implementation. It is confusing to follow it and find it does nothing. The argument could be that a platform might require it. But if that's so we can always put it back. We have an existence proof in all our platforms that this is unlikely. Thoughts? Funny. The mac vm says "/* This is invoked when the GC moves the display bitmap. For now do nothing. */" Does the GC ever do that actually? It's also fairly recent: 78c402ea71ebcc9db12496f81021fdb9b57deb5f (Fri May 12 19:29:45 2017) StackInterpreter: Simplify and make robust display bitmap access for display update. The old code required platforms that needed to redraw at arbitrary times to have to access the display bits through interpreterProxy->displayObject, decoding it each time. There exists a small window during compaction, etc, during whiuch such access will fail and cause a VM crash. The new code provides four variables to reference the display, displayBits, displayWidth, displayHeight and displayDepth, which are assigned appropriately in the primitiveBeDisplay primitive. After a GC the interpreter checks if the displayBits have changed location and if so calls ioNoteDisplayChanged:width:height:depth: (ioNoteDisplayChangedwidthheightdepth) to inform the platform of the change (currently all platforms implement this as a null function). So, old (<2017) code cannot depend on it, new code does not. If the GC issue is moot, we can ditch it. Best regards -Tobias -------------- next part -------------- An HTML attachment was scrubbed... URL: From eliot.miranda at gmail.com Fri Oct 9 07:42:31 2020 From: eliot.miranda at gmail.com (Eliot Miranda) Date: Fri, 9 Oct 2020 00:42:31 -0700 Subject: [squeak-dev] something disabled shout in workspaces (?!?!?) Message-ID: Hi All, I have the "Enable shout in workspaces" preference turned on (why on earth did it get turned off?). And now there's no syntax highlighting in workspaces (something I rely upon). What happened? _,,,^..^,,,_ best, Eliot -------------- next part -------------- An HTML attachment was scrubbed... URL: From eliot.miranda at gmail.com Fri Oct 9 07:58:24 2020 From: eliot.miranda at gmail.com (Eliot Miranda) Date: Fri, 9 Oct 2020 00:58:24 -0700 Subject: [squeak-dev] Installing high dpi support and backwards compatibility of the VM In-Reply-To: References: Message-ID: Hi Tobias, On Thu, Oct 8, 2020 at 11:57 PM Tobias Pape wrote: > Hi > > > On 08.10.2020, at 19:58, Eliot Miranda wrote: > > > > Hi All, > > > > ideally adding the high dpi support to the VM will not break > backwards-compatibility. But that implies that the VM is informed before > it creates the display of whether to create a high dpi display or not. > Off-list Tobias asked me where the VM sets up the display on Mac and I was > surprised by the answer. > > > > I thought it would be as part of beDisplay. But it's actually as a > side-effect of DisplayScreen class>>actualScreenSize, primitive 106, which > calls the ioScreenSize function. It is this functions' responsibility to > actually create the display, deriving the size from the savedWindowSize > info in the image header (which can or could be overridden on the VM > command line, and is when -headless is supplied). > > > > So any new primitive added to allow DisplayScreen to inform the VM of > whether to use high dpi or not would have to be invoked before primitive > 106. So one way to implement this is to modify the chain of invocations > leading up to primitive 106. For this route I'd like to propose the > following refactoring: > > > > DisplayScreen class>>actualScreenSize > > > > ^ 640 at 480 > > > > becomes > > > > DisplayScreen class>>actualScreenSize > > self primitiveUseHighDPI: self useHighDPI. "where this is a > preference" > > ^self primitiveScreenSize > > > > primitiveScreenSize > > > > ^ 640 at 480 > > > > > Here's another idea: > We already have > > DisplayScreen class>>actualScreenScaleFactor > > ^ 1.0 > > And if we change DisplayScreen class>>startUp to > > DisplayScreen class>>startUp "DisplayScreen startUp" > Display setScaleFactor: self actualScreenScaleFactor. > Display setExtent: self actualScreenSize depth: Display > nativeDepth. > Display beDisplay > Very nice. Let's go with this. > > Then the contract could be: > > "Iff you call primitiveScreenScaleFactor before any call to primitive 106, > then you opt in to possibly high dpi" > > That way, we do not have to change any image at all, cause older images > just don't call that primitive. > Yep, works for me. > > > > > > Another route is to make the useHighDPI flag part of the image header > state alongside the saved window size. This would mean it was added to the > flags accessed via vmParameterAt: 48. There could be a command-line > argument to override. > > Maybe a cmd-line parameter in any case… > +1 > > > > > > > Finally I note that the beDisplay primitive simply stores the display > object in the specialObjectsArray and assigns the interpreter variables > that track the display, displayBits, displayWidth, displayHeight & > displayDepth. It then invokes ioNoteDisplayChangedwidthheightdepth, but > *all* the implementations of this function are empty. I propose that we > should eliminate 5this call and its implementation. It is confusing to > follow it and find it does nothing. The argument could be that a platform > might require it. But if that's so we can always put it back. We have an > existence proof in all our platforms that this is unlikely. Thoughts? > > > Funny. The mac vm says "/* This is invoked when the GC moves the display > bitmap. For now do nothing. */" Does the GC ever do that actually? > Not now. It used to. One would see the pixels in the display become nonsense noise as the GC moved the display underneath the screen refresh. But now in Spur the beDisplay primitive pins the display bits. > It's also fairly recent: > > 78c402ea71ebcc9db12496f81021fdb9b57deb5f (Fri May 12 19:29:45 2017) > > StackInterpreter: > Simplify and make robust display bitmap access for display update. > The old code > required platforms that needed to redraw at arbitrary times to have to > access > the display bits through interpreterProxy->displayObject, decoding it > each time. > There exists a small window during compaction, etc, during whiuch such > access > will fail and cause a VM crash. The new code provides four variables > to > reference the display, displayBits, displayWidth, displayHeight and > displayDepth, which are assigned appropriately in the > primitiveBeDisplay > primitive. After a GC the interpreter checks if the displayBits have > changed > location and if so calls ioNoteDisplayChanged:width:height:depth: > (ioNoteDisplayChangedwidthheightdepth) to inform the platform of the > change > (currently all platforms implement this as a null function). > > > So, old (<2017) code cannot depend on it, new code does not. If the GC > issue is moot, we can ditch it. > Even if the GC does move the display, ioNoteDisplayChangedwidthheightdepth can't be called until after GC, which means that from the time the GC moves the display to the time the GC finishes, the display image is corrupted. That's fixed in Spur but in V3 you'll see that happen, especially if you resize the display (which allocates a new bitmap). At least on Mac I would see it regularly. > > > Best regards > -Tobias > > > > > > -- _,,,^..^,,,_ best, Eliot -------------- next part -------------- An HTML attachment was scrubbed... URL: From commits at source.squeak.org Fri Oct 9 08:02:39 2020 From: commits at source.squeak.org (commits at source.squeak.org) Date: Fri, 9 Oct 2020 08:02:39 0000 Subject: [squeak-dev] The Trunk: Tools-eem.996.mcz Message-ID: Eliot Miranda uploaded a new version of Tools to project The Trunk: http://source.squeak.org/trunk/Tools-eem.996.mcz ==================== Summary ==================== Name: Tools-eem.996 Author: eem Time: 9 October 2020, 1:02:29.144211 am UUID: 2eb2e1bc-fc68-4a5c-9c91-1db99303db6e Ancestors: Tools-eem.995 Fix the ProcessBrowser's browse function for full blocks. =============== Diff against Tools-eem.995 =============== Item was changed: ----- Method: ProcessBrowser>>browseContext (in category 'stack list') ----- browseContext + ToolSet browseMethod: selectedContext home! - ToolSet browseMethod: selectedContext method! From commits at source.squeak.org Fri Oct 9 08:03:50 2020 From: commits at source.squeak.org (commits at source.squeak.org) Date: Fri, 9 Oct 2020 08:03:50 0000 Subject: [squeak-dev] The Trunk: Tools-eem.997.mcz Message-ID: Eliot Miranda uploaded a new version of Tools to project The Trunk: http://source.squeak.org/trunk/Tools-eem.997.mcz ==================== Summary ==================== Name: Tools-eem.997 Author: eem Time: 9 October 2020, 1:03:40.26529 am UUID: fa6a5f48-cd96-4194-a00a-41ce1cc25bf7 Ancestors: Tools-eem.996 Fix the ProcessBrowser's browse function for full blocks. =============== Diff against Tools-eem.996 =============== Item was changed: ----- Method: ProcessBrowser>>browseContext (in category 'stack list') ----- browseContext + ToolSet browseMethod: selectedContext home method! - ToolSet browseMethod: selectedContext home! From lecteur at zogotounga.net Fri Oct 9 08:06:45 2020 From: lecteur at zogotounga.net (=?UTF-8?Q?St=c3=a9phane_Rollandin?=) Date: Fri, 9 Oct 2020 10:06:45 +0200 Subject: [squeak-dev] something disabled shout in workspaces (?!?!?) In-Reply-To: References: Message-ID: <02357c4c-9903-24ac-503d-3540a5606b5b@zogotounga.net> >  (why on earth did it get turned off?). Dunno but I do have it off, as my use of workspaces is rather free-style, with nothing remotely ressembling syntactically correct code from start to finish, and so in my use case shout makes the code/text a real mess. Stef From commits at source.squeak.org Fri Oct 9 08:10:02 2020 From: commits at source.squeak.org (commits at source.squeak.org) Date: Fri, 9 Oct 2020 08:10:02 0000 Subject: [squeak-dev] The Trunk: SqueakSSL-Tests-eem.25.mcz Message-ID: Eliot Miranda uploaded a new version of SqueakSSL-Tests to project The Trunk: http://source.squeak.org/trunk/SqueakSSL-Tests-eem.25.mcz ==================== Summary ==================== Name: SqueakSSL-Tests-eem.25 Author: eem Time: 9 October 2020, 1:10:01.348372 am UUID: ea83a4ce-1d87-4517-b025-2c015248a433 Ancestors: SqueakSSL-Tests-pre.24 Have the testSSLSockets clean up its droppings. =============== Diff against SqueakSSL-Tests-pre.24 =============== Item was changed: ----- Method: SqueakSSLTest>>testSSLSockets (in category 'tests') ----- testSSLSockets - "Connect client and server" + | client listener server sema connectProcess | - | client listener server sema | [listener := SecureSocket newTCP. listener listenOn: self port backlogSize: 4. client := SecureSocket newTCP. client connectTo: #[127 0 0 1] port: self port. server := listener waitForAcceptFor: 1. "Perform SSL handshake" sema := Semaphore new. + [connectProcess := Processor activeProcess. + client sslConnect. + sema signal] fork. - [client sslConnect. - sema signal] fork. server sslAccept: self certName. sema wait. "Send data" client sendData: 'Hello World'. server waitForDataFor: 1. + self assert: server receiveData = 'Hello World'] + ensure: + [listener ifNotNil:[listener destroy]. + client ifNotNil:[client destroy]. + server ifNotNil:[server destroy]. + connectProcess ifNotNil: [connectProcess terminate]]! - self assert: server receiveData = 'Hello World'. - ] ensure:[ - listener ifNotNil:[listener destroy]. - client ifNotNil:[client destroy]. - server ifNotNil:[server destroy]. - ].! From commits at source.squeak.org Fri Oct 9 08:20:32 2020 From: commits at source.squeak.org (commits at source.squeak.org) Date: Fri, 9 Oct 2020 08:20:32 0000 Subject: [squeak-dev] The Trunk: NetworkTests-eem.60.mcz Message-ID: Eliot Miranda uploaded a new version of NetworkTests to project The Trunk: http://source.squeak.org/trunk/NetworkTests-eem.60.mcz ==================== Summary ==================== Name: NetworkTests-eem.60 Author: eem Time: 9 October 2020, 1:20:30.75953 am UUID: 82de62f4-5a28-47ff-93f6-b712a39d43e9 Ancestors: NetworkTests-eem.59 Add a TCP version of the testSocketReuse test which shows a bad bug in macOS that had to be oatched in the VM. =============== Diff against NetworkTests-eem.59 =============== Item was changed: ----- Method: SocketTest>>testSocketReuse (in category 'tests') ----- testSocketReuse + "Test for SO_REUSEADDR/SO_REUSEPORT. Should probably be called testUDPSocketReuse. + c.f. testTCPSocketReuse" - "Test for SO_REUSEADDR/SO_REUSEPORT" | udp1 udp2 sendProc recvProc | [ | address port opt send1 recv2 received sent | address := #[255 255 255 255]. "broadcast" port := 31259. udp1 := Socket newUDP. udp1 setOption: 'SO_REUSEADDR' value: 1. self assert: 0 equals: udp1 socketError description: 'Error occured while setting SO_REUSEADDR'. opt := udp1 getOption: 'SO_REUSEADDR'. self assert: opt first isZero & opt last isZero not description: 'SO_REUSEADDR couldn''t be set'. udp1 setOption: 'SO_REUSEPORT' value: 1. self assert: 0 equals: udp1 socketError description: 'Error occured while setting SO_REUSEPORT'. opt := udp1 getOption: 'SO_REUSEPORT'. self assert: opt first isZero & opt last isZero not description: 'SO_REUSEPORT couldn''t be set'. udp1 setPort: port. self assert: port equals: udp1 localPort. udp1 setOption: 'SO_BROADCAST' value: 1. send1 := UUID new. udp2 := Socket newUDP. udp2 setOption: 'SO_REUSEADDR' value: 1. self assert: 0 equals: udp2 socketError. udp2 setOption: 'SO_REUSEPORT' value: 1. self assert: 0 equals: udp2 socketError. udp2 setPort: port. self assert: port equals: udp2 localPort. udp2 setOption: 'SO_BROADCAST' value: 1. recv2 := UUID new. received := 0. recvProc := [ [received < 16] whileTrue:[ received := received + (udp2 receiveDataInto: recv2 startingAt: received + 1) "No need to yield here, because #receiveDataInto:startingAt: will either wait on the readSemaphore of the socket or signal an error." ] ] newProcess. sendProc := [ udp1 setPeer: address port: port. sent := (udp1 sendSomeData: send1 startIndex: 1 count: 16 for: 1). ] newProcess. recvProc resume. sendProc resume. (Delay forMilliseconds: 200) wait. self assert: sendProc isTerminated description: 'sendProc hasn''t terminated till the deadline'; assert: recvProc isTerminated description: 'recvProc hasn''t terminated till the deadline'; assert: 16 equals: sent description: ('{1} bytes were sent instead of 16' format: { sent }); assert: send1 equals: recv2 description: 'sent and received bytes differ' ] ensure:[ udp1 ifNotNil: [ udp1 destroy ]. udp2 ifNotNil: [ udp2 destroy ]. sendProc ifNotNil: [ sendProc terminate ]. recvProc ifNotNil: [ recvProc terminate ] ]. ! Item was added: + ----- Method: SocketTest>>testTCPSocketReuse (in category 'tests') ----- + testTCPSocketReuse + "Test for SO_REUSEADDR/SO_REUSEPORT using TCP sockets. c.f. testSocketReuse" + + | tcpSend tcpRecv sendProcess recvProcess | + [ + | address port opt send1 recv2 sent | + address := NetNameResolver addressForName: '127.0.0.1' timeout: 20. + port := 31259. + tcpSend := Socket newTCP. + tcpSend setOption: 'SO_REUSEADDR' value: 1. + self assert: 0 equals: tcpSend socketError description: 'Error occured while setting SO_REUSEADDR'. + opt := tcpSend getOption: 'SO_REUSEADDR'. + self assert: opt first isZero & opt last isZero not description: 'SO_REUSEADDR couldn''t be set'. + tcpSend setOption: 'SO_REUSEPORT' value: 1. + self assert: 0 equals: tcpSend socketError description: 'Error occured while setting SO_REUSEPORT'. + opt := tcpSend getOption: 'SO_REUSEPORT'. + self assert: opt first isZero & opt last isZero not description: 'SO_REUSEPORT couldn''t be set'. + "tcpSend setOption: 'TCP_NODELAY' value: 1." + send1 := UUID new. + + tcpRecv := Socket newTCP. + tcpRecv setOption: 'SO_REUSEADDR' value: 1. + self assert: 0 equals: tcpRecv socketError. + tcpRecv setOption: 'SO_REUSEPORT' value: 1. + self assert: 0 equals: tcpRecv socketError. + tcpRecv setPort: port. + self assert: port equals: tcpRecv localPort. + recv2 := UUID new. + + [| received | + recvProcess := Processor activeProcess. + received := 0. + tcpRecv waitForConnectionFor: 200. + [received < 16] whileTrue: + ["No need to yield here, because #receiveDataInto:startingAt: will either wait on the readSemaphore of the socket or signal an error." + received := received + (tcpRecv receiveDataInto: recv2 startingAt: received + 1)]] fork. + [sendProcess := Processor activeProcess. + tcpSend connectTo: address port: port. + sent := tcpSend sendData: send1] fork. + (Delay forMilliseconds: 200) wait. + self + assert: sendProcess isTerminated description: 'sendProc hasn''t terminated till the deadline'; + assert: recvProcess isTerminated description: 'recvProc hasn''t terminated till the deadline'; + assert: 16 equals: sent description: ('{1} bytes were sent instead of 16' format: { sent }); + assert: send1 equals: recv2 description: 'sent and received bytes differ'] + ensure: + [tcpSend ifNotNil: [ tcpSend destroy ]. + tcpRecv ifNotNil: [ tcpRecv destroy ]. + sendProcess ifNotNil: [ sendProcess terminate ]. + recvProcess ifNotNil: [ recvProcess terminate ]]! From Das.Linux at gmx.de Fri Oct 9 08:24:40 2020 From: Das.Linux at gmx.de (Tobias Pape) Date: Fri, 9 Oct 2020 10:24:40 +0200 Subject: [squeak-dev] Installing high dpi support and backwards compatibility of the VM In-Reply-To: References: Message-ID: Hi > On 09.10.2020, at 09:58, Eliot Miranda wrote: > > Hi Tobias, > > On Thu, Oct 8, 2020 at 11:57 PM Tobias Pape wrote: > Hi > > > On 08.10.2020, at 19:58, Eliot Miranda wrote: > > > > Hi All, > > > > ideally adding the high dpi support to the VM will not break backwards-compatibility. But that implies that the VM is informed before it creates the display of whether to create a high dpi display or not. Off-list Tobias asked me where the VM sets up the display on Mac and I was surprised by the answer. > > > > I thought it would be as part of beDisplay. But it's actually as a side-effect of DisplayScreen class>>actualScreenSize, primitive 106, which calls the ioScreenSize function. It is this functions' responsibility to actually create the display, deriving the size from the savedWindowSize info in the image header (which can or could be overridden on the VM command line, and is when -headless is supplied). > > > > So any new primitive added to allow DisplayScreen to inform the VM of whether to use high dpi or not would have to be invoked before primitive 106. So one way to implement this is to modify the chain of invocations leading up to primitive 106. For this route I'd like to propose the following refactoring: > > > > DisplayScreen class>>actualScreenSize > > > > ^ 640 at 480 > > > > becomes > > > > DisplayScreen class>>actualScreenSize > > self primitiveUseHighDPI: self useHighDPI. "where this is a preference" > > ^self primitiveScreenSize > > > > primitiveScreenSize > > > > ^ 640 at 480 > > > > > Here's another idea: > We already have > > DisplayScreen class>>actualScreenScaleFactor > > ^ 1.0 > > And if we change DisplayScreen class>>startUp to > > DisplayScreen class>>startUp "DisplayScreen startUp" > Display setScaleFactor: self actualScreenScaleFactor. > Display setExtent: self actualScreenSize depth: Display nativeDepth. > Display beDisplay > > Very nice. Let's go with this. > > Then the contract could be: > > "Iff you call primitiveScreenScaleFactor before any call to primitive 106, then you opt in to possibly high dpi" > > That way, we do not have to change any image at all, cause older images just don't call that primitive. > > Yep, works for me. noice. > > > > > > Another route is to make the useHighDPI flag part of the image header state alongside the saved window size. This would mean it was added to the flags accessed via vmParameterAt: 48. There could be a command-line argument to override. > > Maybe a cmd-line parameter in any case… > > +1 > > > > > > > Finally I note that the beDisplay primitive simply stores the display object in the specialObjectsArray and assigns the interpreter variables that track the display, displayBits, displayWidth, displayHeight & displayDepth. It then invokes ioNoteDisplayChangedwidthheightdepth, but *all* the implementations of this function are empty. I propose that we should eliminate 5this call and its implementation. It is confusing to follow it and find it does nothing. The argument could be that a platform might require it. But if that's so we can always put it back. We have an existence proof in all our platforms that this is unlikely. Thoughts? > > > Funny. The mac vm says "/* This is invoked when the GC moves the display bitmap. For now do nothing. */" Does the GC ever do that actually? > > Not now. It used to. One would see the pixels in the display become nonsense noise as the GC moved the display underneath the screen refresh. But now in Spur the beDisplay primitive pins the display bits. > It's also fairly recent: > > 78c402ea71ebcc9db12496f81021fdb9b57deb5f (Fri May 12 19:29:45 2017) > > StackInterpreter: > Simplify and make robust display bitmap access for display update. The old code > required platforms that needed to redraw at arbitrary times to have to access > the display bits through interpreterProxy->displayObject, decoding it each time. > There exists a small window during compaction, etc, during whiuch such access > will fail and cause a VM crash. The new code provides four variables to > reference the display, displayBits, displayWidth, displayHeight and > displayDepth, which are assigned appropriately in the primitiveBeDisplay > primitive. After a GC the interpreter checks if the displayBits have changed > location and if so calls ioNoteDisplayChanged:width:height:depth: > (ioNoteDisplayChangedwidthheightdepth) to inform the platform of the change > (currently all platforms implement this as a null function). > > > So, old (<2017) code cannot depend on it, new code does not. If the GC issue is moot, we can ditch it. > > Even if the GC does move the display, ioNoteDisplayChangedwidthheightdepth can't be called until after GC, which means that from the time the GC moves the display to the time the GC finishes, the display image is corrupted. That's fixed in Spur but in V3 you'll see that happen, especially if you resize the display (which allocates a new bitmap). At least on Mac I would see it regularly. So we never used it. The (non-stack) interpreter vm does not have any of this code, so only the stack interpreter is affected? -t > > > Best regards > -Tobias From eliot.miranda at gmail.com Fri Oct 9 08:24:34 2020 From: eliot.miranda at gmail.com (Eliot Miranda) Date: Fri, 9 Oct 2020 01:24:34 -0700 Subject: [squeak-dev] assert:equals: in Object Message-ID: Hi All, moving code from a test into a workspace and back is painful because Object does not implement assert:equals: or assert:equals:description: even though it implements assert:description:. So one has to edit out the equals: moving to the workspace and edit it back in again on the way back. I'd like to suggest implementing Object>>assert:equals: and Object>>assert:equals:description: but I won't, because someone is bound to criticise it as being too green or ill considered or some other depressing BS. _,,,^..^,,,_ best, Eliot -------------- next part -------------- An HTML attachment was scrubbed... URL: From marcel.taeumel at hpi.de Fri Oct 9 09:41:26 2020 From: marcel.taeumel at hpi.de (Marcel Taeumel) Date: Fri, 9 Oct 2020 11:41:26 +0200 Subject: [squeak-dev] assert:equals: in Object In-Reply-To: References: Message-ID: Hi Eliot, sure, SUnit could put those extensions into Object. I wouldn't want to have those outside SUnit, though. Not sure why. I only consider #assert: a useful tool even outside test cases. Just to document an invariant in a method. Best, Marcel Am 09.10.2020 10:24:58 schrieb Eliot Miranda : Hi All,     moving code from a test into a workspace and back is painful because Object does not implement assert:equals: or assert:equals:description: even though it implements assert:description:.  So one has to edit out the equals: moving to the workspace and edit it back in again on the way back.  I'd like to suggest implementing Object>>assert:equals: and Object>>assert:equals:description: but I won't, because someone is bound to criticise it as being too green or ill considered or some other depressing BS. _,,,^..^,,,_ best, Eliot -------------- next part -------------- An HTML attachment was scrubbed... URL: From marcel.taeumel at hpi.de Fri Oct 9 09:47:16 2020 From: marcel.taeumel at hpi.de (Marcel Taeumel) Date: Fri, 9 Oct 2020 11:47:16 +0200 Subject: [squeak-dev] something disabled shout in workspaces (?!?!?) In-Reply-To: <02357c4c-9903-24ac-503d-3540a5606b5b@zogotounga.net> References: <02357c4c-9903-24ac-503d-3540a5606b5b@zogotounga.net> Message-ID: Hi Eliot, not sure what happened. The preferences change will not update already opened workspaces: Best, Marcel Am 09.10.2020 10:06:50 schrieb Stéphane Rollandin : >  (why on earth did it get turned off?). Dunno but I do have it off, as my use of workspaces is rather free-style, with nothing remotely ressembling syntactically correct code from start to finish, and so in my use case shout makes the code/text a real mess. Stef -------------- next part -------------- An HTML attachment was scrubbed... URL: -------------- next part -------------- A non-text attachment was scrubbed... Name: image.png Type: image/png Size: 64423 bytes Desc: not available URL: From Christoph.Thiede at student.hpi.uni-potsdam.de Fri Oct 9 12:20:15 2020 From: Christoph.Thiede at student.hpi.uni-potsdam.de (Thiede, Christoph) Date: Fri, 9 Oct 2020 12:20:15 +0000 Subject: [squeak-dev] The Trunk: Tools-eem.997.mcz In-Reply-To: References: Message-ID: <169a6894fe884db0925d2388c7344538@student.hpi.uni-potsdam.de> Hi Eliot, related question: Why does the following evaluate to false if I compile it into a method (but evaluates correctly to true if I print it directly)? [thisContext method method == thisContext home method] value More confusingly, the following method returns false (compile it on any class): testBlock2 ^ [thisContext method method isInstalled] value (As a consequence, #browseMethod: in StandardToolSet opens a VersionsBrowser instead of a regular browser if I say [thisContext method] value browse ...) Best, Christoph ________________________________ Von: Squeak-dev im Auftrag von commits at source.squeak.org Gesendet: Freitag, 9. Oktober 2020 10:03:50 An: squeak-dev at lists.squeakfoundation.org; packages at lists.squeakfoundation.org Betreff: [squeak-dev] The Trunk: Tools-eem.997.mcz Eliot Miranda uploaded a new version of Tools to project The Trunk: http://source.squeak.org/trunk/Tools-eem.997.mcz ==================== Summary ==================== Name: Tools-eem.997 Author: eem Time: 9 October 2020, 1:03:40.26529 am UUID: fa6a5f48-cd96-4194-a00a-41ce1cc25bf7 Ancestors: Tools-eem.996 Fix the ProcessBrowser's browse function for full blocks. =============== Diff against Tools-eem.996 =============== Item was changed: ----- Method: ProcessBrowser>>browseContext (in category 'stack list') ----- browseContext + ToolSet browseMethod: selectedContext home method! - ToolSet browseMethod: selectedContext home! -------------- next part -------------- An HTML attachment was scrubbed... URL: From marcel.taeumel at hpi.de Fri Oct 9 12:32:30 2020 From: marcel.taeumel at hpi.de (Marcel Taeumel) Date: Fri, 9 Oct 2020 14:32:30 +0200 Subject: [squeak-dev] The Trunk: Tools-eem.997.mcz In-Reply-To: <169a6894fe884db0925d2388c7344538@student.hpi.uni-potsdam.de> References: <169a6894fe884db0925d2388c7344538@student.hpi.uni-potsdam.de> Message-ID: This is really interesting. There are two "versions"  of the same method: Of course, only one of them is installed at the same time. Best, Marcel Am 09.10.2020 14:20:23 schrieb Thiede, Christoph : Hi Eliot, related question: Why does the following evaluate to false if I compile it into a method (but evaluates correctly to true if I print it directly)? [thisContext method method == thisContext home method] value More confusingly, the following method returns false (compile it on any class): testBlock2 ^ [thisContext method method isInstalled] value (As a consequence, #browseMethod: in StandardToolSet opens a VersionsBrowser instead of a regular browser if I say [thisContext method] value browse ...) Best, Christoph [http://www.hpi.de/] Von: Squeak-dev im Auftrag von commits at source.squeak.org Gesendet: Freitag, 9. Oktober 2020 10:03:50 An: squeak-dev at lists.squeakfoundation.org; packages at lists.squeakfoundation.org Betreff: [squeak-dev] The Trunk: Tools-eem.997.mcz   Eliot Miranda uploaded a new version of Tools to project The Trunk: http://source.squeak.org/trunk/Tools-eem.997.mcz [http://source.squeak.org/trunk/Tools-eem.997.mcz] ==================== Summary ==================== Name: Tools-eem.997 Author: eem Time: 9 October 2020, 1:03:40.26529 am UUID: fa6a5f48-cd96-4194-a00a-41ce1cc25bf7 Ancestors: Tools-eem.996 Fix the ProcessBrowser's browse function for full blocks. =============== Diff against Tools-eem.996 =============== Item was changed:   ----- Method: ProcessBrowser>>browseContext (in category 'stack list') -----   browseContext +        ToolSet browseMethod: selectedContext home method! -        ToolSet browseMethod: selectedContext home! -------------- next part -------------- An HTML attachment was scrubbed... URL: -------------- next part -------------- A non-text attachment was scrubbed... Name: image.png Type: image/png Size: 119833 bytes Desc: not available URL: From Christoph.Thiede at student.hpi.uni-potsdam.de Fri Oct 9 12:34:13 2020 From: Christoph.Thiede at student.hpi.uni-potsdam.de (Thiede, Christoph) Date: Fri, 9 Oct 2020 12:34:13 +0000 Subject: [squeak-dev] assert:equals: in Object In-Reply-To: References: , Message-ID: <79aca96b0f334332a72c84f0db65a307@student.hpi.uni-potsdam.de> Hi Eliot, Hi Marcel, -1 from my side for this change. :-) If we start adding #assert:equals: and #assert:equals:description: on Object, it will be only a question of time until we will also discuss #deny:, #should:raise:, and all the other assertion selectors an object. And because it's not every object's purpose to provide such testing mechanisms, this feels like a step in the wrong direction for me. Object is bloated enough already. Instead of defining new assertion selectors (which happens for the single purpose of improving exception messages as I suppose), we should rather inspect the stack of an AssertionFailure/TestFailure to generate precise error messages. Also, I am against defining these methods as extension methods because I would bet that someone (for example myself) would misinterpret them and assume they are part of the usual Object protocol, and suddenly you have a bunch of new dependencies from production code to SUnit. Instead, we might miss some proper tooling for your use case, Eliot. Why can't we exchange the class of a Workspace's receiver? Or thinking differently, why can't we support dynamic workspace bindings in every inspector (maybe opt-in)? Then you could just inspect TestCase new, maximize the evaluator pane in the inspector, and e voilá you have a TestCase workspace. Here are some references that might be related to this issue in some way: http://forum.world.st/Modifying-a-method-s-bytecodes-is-it-supported-tp5114421p5114435.html (proposal for Workspace variables) http://forum.world.st/The-Inbox-SUnit-ct-127-mcz-td5114709.html (about the addition of new assertion selectors) Best, Christoph Squeak - Dev - The Inbox: SUnit-ct.127.mcz forum.world.st The Inbox: SUnit-ct.127.mcz. Christoph Thiede uploaded a new version of SUnit to project The Inbox: http://source.squeak.org/inbox/SUnit-ct.127.mcz ==================== Summary... ________________________________ Von: Squeak-dev im Auftrag von Taeumel, Marcel Gesendet: Freitag, 9. Oktober 2020 11:41:26 An: squeak-dev Betreff: Re: [squeak-dev] assert:equals: in Object Hi Eliot, sure, SUnit could put those extensions into Object. I wouldn't want to have those outside SUnit, though. Not sure why. I only consider #assert: a useful tool even outside test cases. Just to document an invariant in a method. Best, Marcel Am 09.10.2020 10:24:58 schrieb Eliot Miranda : Hi All, moving code from a test into a workspace and back is painful because Object does not implement assert:equals: or assert:equals:description: even though it implements assert:description:. So one has to edit out the equals: moving to the workspace and edit it back in again on the way back. I'd like to suggest implementing Object>>assert:equals: and Object>>assert:equals:description: but I won't, because someone is bound to criticise it as being too green or ill considered or some other depressing BS. _,,,^..^,,,_ best, Eliot -------------- next part -------------- An HTML attachment was scrubbed... URL: From marcel.taeumel at hpi.de Fri Oct 9 12:40:43 2020 From: marcel.taeumel at hpi.de (Marcel Taeumel) Date: Fri, 9 Oct 2020 14:40:43 +0200 Subject: [squeak-dev] assert:equals: in Object In-Reply-To: <79aca96b0f334332a72c84f0db65a307@student.hpi.uni-potsdam.de> References: <,> <79aca96b0f334332a72c84f0db65a307@student.hpi.uni-potsdam.de> Message-ID: Hi Christoph, still, it would be a shame if we would remove #assert:(description:) from Object, too. Then we couldn't document invariants in code anymore. So many trade-offs! :-O As you suggested, this could be better solved at the tool level. The "self" binding in workspaces has great potential. Bind it to an example test case, and this would work. :-) Best, Marcel Am 09.10.2020 14:34:20 schrieb Thiede, Christoph : Hi Eliot, Hi Marcel, -1 from my side for this change. :-) If we start adding #assert:equals: and #assert:equals:description: on Object, it will be only a question of time until we will also discuss #deny:, #should:raise:, and all the other assertion selectors an object. And because it's not every object's purpose to provide such testing mechanisms, this feels like a step in the wrong direction for me. Object is bloated enough already. Instead of defining new assertion selectors (which happens for the single purpose of improving exception messages as I suppose), we should rather inspect the stack of an AssertionFailure/TestFailure to generate precise error messages. Also, I am against defining these methods as extension methods because I would bet that someone (for example myself) would misinterpret them and assume they are part of the usual Object protocol, and suddenly you have a bunch of new dependencies from production code to SUnit. Instead, we might miss some proper tooling for your use case, Eliot. Why can't we exchange the class of a Workspace's receiver? Or thinking differently, why can't we support dynamic workspace bindings in every inspector (maybe opt-in)? Then you could just inspect TestCase new, maximize the evaluator pane in the inspector, and e voilá you have a TestCase workspace. Here are some references that might be related to this issue in some way: http://forum.world.st/Modifying-a-method-s-bytecodes-is-it-supported-tp5114421p5114435.html [http://forum.world.st/Modifying-a-method-s-bytecodes-is-it-supported-tp5114421p5114435.html] (proposal for Workspace variables) http://forum.world.st/The-Inbox-SUnit-ct-127-mcz-td5114709.html [http://forum.world.st/The-Inbox-SUnit-ct-127-mcz-td5114709.html] (about the addition of new assertion selectors) Best, Christoph Squeak - Dev - The Inbox: SUnit-ct.127.mcz [http://forum.world.st/The-Inbox-SUnit-ct-127-mcz-td5114709.html] forum.world.st The Inbox: SUnit-ct.127.mcz. Christoph Thiede uploaded a new version of SUnit to project The Inbox: http://source.squeak.org/inbox/SUnit-ct.127.mcz ==================== Summary... Von: Squeak-dev im Auftrag von Taeumel, Marcel Gesendet: Freitag, 9. Oktober 2020 11:41:26 An: squeak-dev Betreff: Re: [squeak-dev] assert:equals: in Object   Hi Eliot, sure, SUnit could put those extensions into Object. I wouldn't want to have those outside SUnit, though. Not sure why. I only consider #assert: a useful tool even outside test cases. Just to document an invariant in a method. Best, Marcel Am 09.10.2020 10:24:58 schrieb Eliot Miranda : Hi All,     moving code from a test into a workspace and back is painful because Object does not implement assert:equals: or assert:equals:description: even though it implements assert:description:.  So one has to edit out the equals: moving to the workspace and edit it back in again on the way back.  I'd like to suggest implementing Object>>assert:equals: and Object>>assert:equals:description: but I won't, because someone is bound to criticise it as being too green or ill considered or some other depressing BS. _,,,^..^,,,_ best, Eliot -------------- next part -------------- An HTML attachment was scrubbed... URL: From Christoph.Thiede at student.hpi.uni-potsdam.de Fri Oct 9 13:13:24 2020 From: Christoph.Thiede at student.hpi.uni-potsdam.de (Thiede, Christoph) Date: Fri, 9 Oct 2020 13:13:24 +0000 Subject: [squeak-dev] assert:equals: in Object In-Reply-To: References: <, > <79aca96b0f334332a72c84f0db65a307@student.hpi.uni-potsdam.de>, Message-ID: Hi Marcel, > still, it would be a shame if we would remove #assert:(description:) from Object, too. Then we couldn't document invariants in code anymore. So many trade-offs! :-O Yes, I absolutely agree with that. Production assertions are a useful feature. But compared to SUnit, they are not meant to fail at any time, and if they fail, they should do so during development only, so I don't think we have to optimize the meaningfulness of AssertionFailure messages (as opposed to TestFailures. See https://github.com/hpi-swa/smalltalkCI/issues/478 :-)). > As you suggested, this could be better solved at the tool level. The "self" binding in workspaces has great potential. Bind it to an example test case, and this would work. :-) I do indeed think there is much potential for new ideas (and this would finally show me a reason why variable bindings can be useful as an orthogonal concept to instance variables). But how can we avoid redundancy between inspectors and workspaces at this point? How do you think about supporting dynamic bindings in every inspector's evaluator pane via opt-in? Or maybe add an item into Inspector's window menu, "convert to Workspace"? Best, Christoph ________________________________ Von: Squeak-dev im Auftrag von Taeumel, Marcel Gesendet: Freitag, 9. Oktober 2020 14:40:43 An: squeak-dev Betreff: Re: [squeak-dev] assert:equals: in Object Hi Christoph, still, it would be a shame if we would remove #assert:(description:) from Object, too. Then we couldn't document invariants in code anymore. So many trade-offs! :-O As you suggested, this could be better solved at the tool level. The "self" binding in workspaces has great potential. Bind it to an example test case, and this would work. :-) Best, Marcel Am 09.10.2020 14:34:20 schrieb Thiede, Christoph : Hi Eliot, Hi Marcel, -1 from my side for this change. :-) If we start adding #assert:equals: and #assert:equals:description: on Object, it will be only a question of time until we will also discuss #deny:, #should:raise:, and all the other assertion selectors an object. And because it's not every object's purpose to provide such testing mechanisms, this feels like a step in the wrong direction for me. Object is bloated enough already. Instead of defining new assertion selectors (which happens for the single purpose of improving exception messages as I suppose), we should rather inspect the stack of an AssertionFailure/TestFailure to generate precise error messages. Also, I am against defining these methods as extension methods because I would bet that someone (for example myself) would misinterpret them and assume they are part of the usual Object protocol, and suddenly you have a bunch of new dependencies from production code to SUnit. Instead, we might miss some proper tooling for your use case, Eliot. Why can't we exchange the class of a Workspace's receiver? Or thinking differently, why can't we support dynamic workspace bindings in every inspector (maybe opt-in)? Then you could just inspect TestCase new, maximize the evaluator pane in the inspector, and e voilá you have a TestCase workspace. Here are some references that might be related to this issue in some way: http://forum.world.st/Modifying-a-method-s-bytecodes-is-it-supported-tp5114421p5114435.html (proposal for Workspace variables) http://forum.world.st/The-Inbox-SUnit-ct-127-mcz-td5114709.html (about the addition of new assertion selectors) Best, Christoph Squeak - Dev - The Inbox: SUnit-ct.127.mcz forum.world.st The Inbox: SUnit-ct.127.mcz. Christoph Thiede uploaded a new version of SUnit to project The Inbox: http://source.squeak.org/inbox/SUnit-ct.127.mcz ==================== Summary... ________________________________ Von: Squeak-dev im Auftrag von Taeumel, Marcel Gesendet: Freitag, 9. Oktober 2020 11:41:26 An: squeak-dev Betreff: Re: [squeak-dev] assert:equals: in Object Hi Eliot, sure, SUnit could put those extensions into Object. I wouldn't want to have those outside SUnit, though. Not sure why. I only consider #assert: a useful tool even outside test cases. Just to document an invariant in a method. Best, Marcel Am 09.10.2020 10:24:58 schrieb Eliot Miranda : Hi All, moving code from a test into a workspace and back is painful because Object does not implement assert:equals: or assert:equals:description: even though it implements assert:description:. So one has to edit out the equals: moving to the workspace and edit it back in again on the way back. I'd like to suggest implementing Object>>assert:equals: and Object>>assert:equals:description: but I won't, because someone is bound to criticise it as being too green or ill considered or some other depressing BS. _,,,^..^,,,_ best, Eliot -------------- next part -------------- An HTML attachment was scrubbed... URL: From marcel.taeumel at hpi.de Fri Oct 9 13:17:07 2020 From: marcel.taeumel at hpi.de (Marcel Taeumel) Date: Fri, 9 Oct 2020 15:17:07 +0200 Subject: [squeak-dev] assert:equals: in Object In-Reply-To: References: <,> <79aca96b0f334332a72c84f0db65a307@student.hpi.uni-potsdam.de> <,> Message-ID: For starters, I would stick to the example Eliot just gave us. And not "dream away" too soon. ;-) Best, Marcel Am 09.10.2020 15:13:34 schrieb Thiede, Christoph : Hi Marcel, > still, it would be a shame if we would remove #assert:(description:) from Object, too. Then we couldn't document invariants in code anymore. So many trade-offs! :-O [http://www.hpi.de/] Yes, I absolutely agree with that. Production assertions are a useful feature. But compared to SUnit, they are not meant to fail at any time, and if they fail, they should do so during development only, so I don't think we have to optimize the meaningfulness of AssertionFailure messages (as opposed to TestFailures. See https://github.com/hpi-swa/smalltalkCI/issues/478 [https://github.com/hpi-swa/smalltalkCI/issues/478] :-)). > As you suggested, this could be better solved at the tool level. The "self" binding in workspaces has great potential. Bind it to an example test case, and this would work. :-) I do indeed think there is much potential for new ideas (and this would finally show me a reason why variable bindings can be useful as an orthogonal concept to instance variables). But how can we avoid redundancy between inspectors and workspaces at this point? How do you think about supporting dynamic bindings in every inspector's evaluator pane via opt-in? Or maybe add an item into Inspector's window menu, "convert to Workspace"? Best, Christoph Von: Squeak-dev im Auftrag von Taeumel, Marcel Gesendet: Freitag, 9. Oktober 2020 14:40:43 An: squeak-dev Betreff: Re: [squeak-dev] assert:equals: in Object   Hi Christoph, still, it would be a shame if we would remove #assert:(description:) from Object, too. Then we couldn't document invariants in code anymore. So many trade-offs! :-O As you suggested, this could be better solved at the tool level. The "self" binding in workspaces has great potential. Bind it to an example test case, and this would work. :-) Best, Marcel Am 09.10.2020 14:34:20 schrieb Thiede, Christoph : Hi Eliot, Hi Marcel, -1 from my side for this change. :-) If we start adding #assert:equals: and #assert:equals:description: on Object, it will be only a question of time until we will also discuss #deny:, #should:raise:, and all the other assertion selectors an object. And because it's not every object's purpose to provide such testing mechanisms, this feels like a step in the wrong direction for me. Object is bloated enough already. Instead of defining new assertion selectors (which happens for the single purpose of improving exception messages as I suppose), we should rather inspect the stack of an AssertionFailure/TestFailure to generate precise error messages. Also, I am against defining these methods as extension methods because I would bet that someone (for example myself) would misinterpret them and assume they are part of the usual Object protocol, and suddenly you have a bunch of new dependencies from production code to SUnit. Instead, we might miss some proper tooling for your use case, Eliot. Why can't we exchange the class of a Workspace's receiver? Or thinking differently, why can't we support dynamic workspace bindings in every inspector (maybe opt-in)? Then you could just inspect TestCase new, maximize the evaluator pane in the inspector, and e voilá you have a TestCase workspace. Here are some references that might be related to this issue in some way: http://forum.world.st/Modifying-a-method-s-bytecodes-is-it-supported-tp5114421p5114435.html [http://forum.world.st/Modifying-a-method-s-bytecodes-is-it-supported-tp5114421p5114435.html] (proposal for Workspace variables) http://forum.world.st/The-Inbox-SUnit-ct-127-mcz-td5114709.html [http://forum.world.st/The-Inbox-SUnit-ct-127-mcz-td5114709.html] (about the addition of new assertion selectors) Best, Christoph Squeak - Dev - The Inbox: SUnit-ct.127.mcz [http://forum.world.st/The-Inbox-SUnit-ct-127-mcz-td5114709.html] forum.world.st The Inbox: SUnit-ct.127.mcz. Christoph Thiede uploaded a new version of SUnit to project The Inbox: http://source.squeak.org/inbox/SUnit-ct.127.mcz ==================== Summary... Von: Squeak-dev im Auftrag von Taeumel, Marcel Gesendet: Freitag, 9. Oktober 2020 11:41:26 An: squeak-dev Betreff: Re: [squeak-dev] assert:equals: in Object   Hi Eliot, sure, SUnit could put those extensions into Object. I wouldn't want to have those outside SUnit, though. Not sure why. I only consider #assert: a useful tool even outside test cases. Just to document an invariant in a method. Best, Marcel Am 09.10.2020 10:24:58 schrieb Eliot Miranda : Hi All,     moving code from a test into a workspace and back is painful because Object does not implement assert:equals: or assert:equals:description: even though it implements assert:description:.  So one has to edit out the equals: moving to the workspace and edit it back in again on the way back.  I'd like to suggest implementing Object>>assert:equals: and Object>>assert:equals:description: but I won't, because someone is bound to criticise it as being too green or ill considered or some other depressing BS. _,,,^..^,,,_ best, Eliot -------------- next part -------------- An HTML attachment was scrubbed... URL: From commits at source.squeak.org Fri Oct 9 14:15:27 2020 From: commits at source.squeak.org (commits at source.squeak.org) Date: Fri, 9 Oct 2020 14:15:27 0000 Subject: [squeak-dev] The Inbox: Graphics-ct.443.mcz Message-ID: Christoph Thiede uploaded a new version of Graphics to project The Inbox: http://source.squeak.org/inbox/Graphics-ct.443.mcz ==================== Summary ==================== Name: Graphics-ct.443 Author: ct Time: 9 October 2020, 4:15:09.97236 pm UUID: 897346b7-ceaa-1a43-874f-3571d893309c Ancestors: Graphics-pre.439 Adds basic support for storing an animated GIF file via AnimatedGIFReadWriter. Note that this implementation indeed is very rudimentary only. I found several GIF files on my computer that cannot be saved as a GIF correctly (something is wrong with the encoding of the background/alpha color). But on the other hand, I also met a number of GIF files that cannot be read by the AnimatedGIFReadWriter ("error: improper store") ... For a potentially relevant reference implementtion, I found this one, but I did not yet find the time apply it: https://gist.github.com/JimBobSquarePants/cac72c4e7d9f05f13ac9 Following the idea of "baby steps", I'd like to get this into the Trunk at this early state however. The motivation behind this is that I would like to use this concept from another project so establishing the protocol as soon as possible would be helpful for me to write tests. =============== Diff against Graphics-pre.439 =============== Item was added: + ----- Method: AnimatedGIFReadWriter class>>exampleAnim (in category 'examples') ----- + exampleAnim + "AnimatedGIFReadWriter exampleAnim" + + | extent center frames | + extent := 42 @ 42. + center := extent // 2. + frames := (2 to: center x - 1 by: 2) collect: [:r | + "Make a fancy anim without using Canvas - inefficient as hell" + | image | + image := ColorForm extent: extent depth: 8. + 0.0 to: 359.0 do: [:theta | + image + colorAt: (center + (Point r: r degrees: theta)) rounded + put: Color red]. + image]. + + ^ FileStream newFileNamed: 'anim.gif' do: [:stream | + self + putForms: frames + andDelays: (frames withIndexCollect: [:frame :index | + 10 + (index / frames size * 100)]) "Start fast, end slow" + onStream: stream]! Item was added: + ----- Method: AnimatedGIFReadWriter class>>putForms:andDelays:onStream: (in category 'image reading/writing') ----- + putForms: forms andDelays: delays onStream: aWriteStream + "Store the given form sequence as an animation on the given stream." + + | writer canvas | + self assert: forms size = delays size. + + writer := self on: aWriteStream. + canvas := Form extent: forms first extent depth: 32. + [Cursor write showWhile: [ + writer loopCount: -1. + forms with: delays do: [:form :delay | + writer delay: delay; flag: #todo. "ct: Does not work" + form displayOn: canvas at: 0 @ 0 rule: Form over. + writer nextPutImage: canvas]]] + ensure: [writer close].! Item was added: + ----- Method: AnimatedGIFReadWriter class>>putForms:onFileNamed: (in category 'image reading/writing') ----- + putForms: formSequence onFileNamed: fileName + "Store the given form sequence as an animation on a file of the given name." + + FileStream newFileNamed: fileName do: [:stream | + self putForms: formSequence onStream: stream].! Item was added: + ----- Method: AnimatedGIFReadWriter class>>putForms:onStream: (in category 'image reading/writing') ----- + putForms: forms onStream: aWriteStream + "Store the given form sequence as an animation on the given stream." + + ^ self + putForms: forms + andDelays: ((1 to: forms size) collect: [:i | 20]) + onStream: aWriteStream! Item was changed: ----- Method: BMPReadWriter class>>readAllFrom: (in category 'testing') ----- readAllFrom: fd "MessageTally spyOn:[BMPReadWriter readAllFrom: FileDirectory default]" fd fileNames do:[:fName| (fName endsWith: '.bmp') ifTrue:[ + [Form fromBinaryStream: (fd readOnlyFileNamed: fName)] ifError: []. - [Form fromBinaryStream: (fd readOnlyFileNamed: fName)] on: Error do:[:nix]. ]. ]. fd directoryNames do:[:fdName| self readAllFrom: (fd directoryNamed: fdName) ].! Item was removed: - ----- Method: GIFReadWriter class>>exampleAnim (in category 'examples') ----- - exampleAnim - "GIFReadWriter exampleAnim" - - | writer extent center | - writer := GIFReadWriter on: (FileStream newFileNamed: 'anim.gif'). - writer loopCount: 20. "Repeat 20 times" - writer delay: 10. "Wait 10/100 seconds" - extent := 42 at 42. - center := extent / 2. - Cursor write showWhile: [ - [2 to: center x - 1 by: 2 do: [:r | - "Make a fancy anim without using Canvas - inefficient as hell" - | image | - image := ColorForm extent: extent depth: 8. - 0.0 to: 359.0 do: [:theta | image colorAt: (center + (Point r: r degrees: theta)) rounded put: Color red]. - writer nextPutImage: image] - ] ensure: [writer close]].! From tonyg at leastfixedpoint.com Fri Oct 9 14:33:12 2020 From: tonyg at leastfixedpoint.com (Tony Garnock-Jones) Date: Fri, 9 Oct 2020 16:33:12 +0200 Subject: [squeak-dev] assert:equals: in Object In-Reply-To: <79aca96b0f334332a72c84f0db65a307@student.hpi.uni-potsdam.de> References: <79aca96b0f334332a72c84f0db65a307@student.hpi.uni-potsdam.de> Message-ID: On 10/9/20 2:34 PM, Thiede, Christoph wrote: > Hi Eliot, Hi Marcel, -1 from my side for this change. :-) Me too. I think it's almost a case of Gun>>draw vs Shape>>draw -- assert: in Object is for invariant-specification. > Instead, we might miss some proper tooling for your use case, Eliot. > Why can't we exchange the class of a Workspace's receiver? I really like this line of thinking! I've been mulling over the idea of having an ActorWorkspace that exists within the context of a running Actor so it can react to events, "crash", etc. (It makes sense in context -- Erlangish (and Syndicateish) actors are deeper participants in their ecosystems than vanilla Actors are...) Anyway, having it by default be the case that Workspaces' code environments be TestCases seems very sensible to me. I also wanted to respond to this: > Production assertions are a useful feature. But compared to SUnit, > they are not meant to fail at any time, and if they fail, they > should do so during development only, I wanted to make sure we are all on the same page by suggesting a clarification here. I think, Christoph, that you *should* have meant :-) something like: "Assertions of invariants in production code [as opposed to just in testing code] are useful. But they MUST BE LEFT ACTIVE IN PRODUCTION CODE because otherwise it's like wearing a seatbelt only while you're on your own driveway, and taking it off as soon as you're on the street." Hopefully I'm right! :-) It just alarmed me a bit to see discussion of making the same mistake C makes, namely compiling away assertions in "release" builds, which is where you need them most... Cheers, Tony From commits at source.squeak.org Fri Oct 9 14:41:07 2020 From: commits at source.squeak.org (commits at source.squeak.org) Date: Fri, 9 Oct 2020 14:41:07 0000 Subject: [squeak-dev] The Inbox: Kernel-ct.1303.mcz Message-ID: A new version of Kernel was added to project The Inbox: http://source.squeak.org/inbox/Kernel-ct.1303.mcz ==================== Summary ==================== Name: Kernel-ct.1303 Author: ct Time: 9 October 2020, 4:41:03.08336 pm UUID: be617b3e-de8e-5b4f-a726-593b353db599 Ancestors: Kernel-ct.1292 Kernel-ct.1292/2: Rename selectors, using #satisfying: instead as proposed by Marcel (mt). =============== Diff against Kernel-ct.1292 =============== Item was added: + ----- Method: BlockClosure>>on:satisfying:do: (in category 'exceptions') ----- + on: exceptionOrExceptionSet satisfying: aPredicate do: handlerAction + + ^ self + on: exceptionOrExceptionSet + do: [:exception | + (aPredicate value: exception) + ifTrue: [handlerAction cull: exception] + ifFalse: [exception pass]]! Item was added: + ----- Method: BlockClosure>>on:satisfying:ensure: (in category 'exceptions') ----- + on: exceptionOrExceptionSet satisfying: aPredicate ensure: aBlock + + ^ self + on: exceptionOrExceptionSet + do: [:exception | + (aPredicate value: exception) + ifTrue: [aBlock value]. + exception pass]! Item was removed: - ----- Method: BlockClosure>>on:when:do: (in category 'exceptions') ----- - on: exceptionOrExceptionSet when: aPredicate do: handlerAction - - ^ self - on: exceptionOrExceptionSet - do: [:exception | - (aPredicate value: exception) - ifTrue: [handlerAction cull: exception] - ifFalse: [exception pass]]! Item was removed: - ----- Method: BlockClosure>>on:when:ensure: (in category 'exceptions') ----- - on: exceptionOrExceptionSet when: aPredicate ensure: aBlock - - ^ self - on: exceptionOrExceptionSet - do: [:exception | - (aPredicate value: exception) - ifTrue: [aBlock value]. - exception pass]! From Christoph.Thiede at student.hpi.uni-potsdam.de Fri Oct 9 14:41:09 2020 From: Christoph.Thiede at student.hpi.uni-potsdam.de (Thiede, Christoph) Date: Fri, 9 Oct 2020 14:41:09 +0000 Subject: [squeak-dev] Exception patterns (The Inbox: Kernel-ct.1292.mcz) In-Reply-To: References: <2f92c32e769a4e29a2c93f655b87638f@student.hpi.uni-potsdam.de> <0d47e32b25594ae1885da3706447de36@student.hpi.uni-potsdam.de> , Message-ID: Hi Marcel, Hi Chris, thanks for your feedback. I see your point of complexity, still, I think BlockClosure #& etc. could be a nice concept, but it would rather belong in an own repository (such as Xtreams, for example). See Kernel-ct.1292/2 for the next attempt. :-) @Chris: You're right with your interpretation, I'm aiming to get rid of this low-level #pass sends and all the condition logic inside handlerActions. > (wait, is that, #on:do:on: ? I'm confused on this one...) Oops, this should have been #on:do:on:do: instead. But I fear this would be over-complicated anyway ... Best, Christoph ________________________________ Von: Squeak-dev im Auftrag von Taeumel, Marcel Gesendet: Freitag, 9. Oktober 2020 08:57:05 An: Chris Muller; squeak-dev Betreff: Re: [squeak-dev] Exception patterns (The Inbox: Kernel-ct.1292.mcz) Hi Christoph, you are proposing an interface to avoid having to deal with Exception >> #pass and #resume:. I like #on:when:do:, maybe renamed to: #on:satisfying:do:. I do not like your & syntax because it would mix Exception, ExceptionSet, and BlockClosure -- which may be hard to understand and debug. Bset, Marcel Am 09.10.2020 03:15:43 schrieb Chris Muller : Hi Christoph, Are these equivalent -- On Thu, Jan 2, 2020 at 7:58 PM Thiede, Christoph > wrote: Outlook jumbled my message completely. Here the examples again: [self model merge] on: MCMergeResolutionRequest & [:request | request merger conflicts notEmpty] do: [:request | request resume: true]. equal to: [self model merge] on: MCMergeResolutionRequest do: [:request | request merger conflicts notEmpty ifTrue: [request resume: true] ifFalse: [request pass] ] ? [client unusedBytecode] on: MessageNotUnderstood & [:ex | ex receiver == client] & [:ex | ex message selector == #unusedBytecode] do: [self error: 'unusedBytecode']. equal to [client unusedBytecode] on: MessageNotUnderstood do: [:ex | (ex receiver == client and: [ ex message selector == #unusedBytecode ]) ifTrue: [ self error: 'unusedBytecode' ] ifFalse: [ ex pass ] ] ? Not sure if I fully understood it, but is it just a reformat of the syntax? Or something more empowering? references := [self resolvePackageSpecReferences: packageSpec gofer: gofer] on: [self class retryPackageResolution] & (Error , GoferRepositoryError) do: [:ex | retryCount >= 2 ifFalse: [ ex return: #() ] on: [self class retryPackageResolution] & GoferRepositoryError. Transcript showln: 'gofer repository error: '; show: ex description printString; show: '...ignoring'. (repositoryError := ex) resume: #()]. (wait, is that, #on:do:on: ? I'm confused on this one...) - Chris sz := 1024*1024*1024*1024. self should: [Array new: sz] raise: OutOfMemory, (Error & [:ex | ex messageText includesSubstring: 'basicNew: with invalid argument']). -------------- next part -------------- An HTML attachment was scrubbed... URL: From Christoph.Thiede at student.hpi.uni-potsdam.de Fri Oct 9 14:42:27 2020 From: Christoph.Thiede at student.hpi.uni-potsdam.de (Thiede, Christoph) Date: Fri, 9 Oct 2020 14:42:27 +0000 Subject: [squeak-dev] Exception patterns (The Inbox: Kernel-ct.1292.mcz) In-Reply-To: References: <2f92c32e769a4e29a2c93f655b87638f@student.hpi.uni-potsdam.de> <0d47e32b25594ae1885da3706447de36@student.hpi.uni-potsdam.de> , , Message-ID: > See Kernel-ct.1292/2 for the next attempt. :-) Hm, no, SqueakSource has renamed it into Kernel-ct.1303. Eliot, didn't you mention that one can use slashes to create branches in Monticello? Best, Christoph ________________________________ Von: Thiede, Christoph Gesendet: Freitag, 9. Oktober 2020 16:41:09 An: Chris Muller; squeak-dev Betreff: AW: [squeak-dev] Exception patterns (The Inbox: Kernel-ct.1292.mcz) Hi Marcel, Hi Chris, thanks for your feedback. I see your point of complexity, still, I think BlockClosure #& etc. could be a nice concept, but it would rather belong in an own repository (such as Xtreams, for example). See Kernel-ct.1292/2 for the next attempt. :-) @Chris: You're right with your interpretation, I'm aiming to get rid of this low-level #pass sends and all the condition logic inside handlerActions. > (wait, is that, #on:do:on: ? I'm confused on this one...) Oops, this should have been #on:do:on:do: instead. But I fear this would be over-complicated anyway ... Best, Christoph ________________________________ Von: Squeak-dev im Auftrag von Taeumel, Marcel Gesendet: Freitag, 9. Oktober 2020 08:57:05 An: Chris Muller; squeak-dev Betreff: Re: [squeak-dev] Exception patterns (The Inbox: Kernel-ct.1292.mcz) Hi Christoph, you are proposing an interface to avoid having to deal with Exception >> #pass and #resume:. I like #on:when:do:, maybe renamed to: #on:satisfying:do:. I do not like your & syntax because it would mix Exception, ExceptionSet, and BlockClosure -- which may be hard to understand and debug. Bset, Marcel Am 09.10.2020 03:15:43 schrieb Chris Muller : Hi Christoph, Are these equivalent -- On Thu, Jan 2, 2020 at 7:58 PM Thiede, Christoph > wrote: Outlook jumbled my message completely. Here the examples again: [self model merge] on: MCMergeResolutionRequest & [:request | request merger conflicts notEmpty] do: [:request | request resume: true]. equal to: [self model merge] on: MCMergeResolutionRequest do: [:request | request merger conflicts notEmpty ifTrue: [request resume: true] ifFalse: [request pass] ] ? [client unusedBytecode] on: MessageNotUnderstood & [:ex | ex receiver == client] & [:ex | ex message selector == #unusedBytecode] do: [self error: 'unusedBytecode']. equal to [client unusedBytecode] on: MessageNotUnderstood do: [:ex | (ex receiver == client and: [ ex message selector == #unusedBytecode ]) ifTrue: [ self error: 'unusedBytecode' ] ifFalse: [ ex pass ] ] ? Not sure if I fully understood it, but is it just a reformat of the syntax? Or something more empowering? references := [self resolvePackageSpecReferences: packageSpec gofer: gofer] on: [self class retryPackageResolution] & (Error , GoferRepositoryError) do: [:ex | retryCount >= 2 ifFalse: [ ex return: #() ] on: [self class retryPackageResolution] & GoferRepositoryError. Transcript showln: 'gofer repository error: '; show: ex description printString; show: '...ignoring'. (repositoryError := ex) resume: #()]. (wait, is that, #on:do:on: ? I'm confused on this one...) - Chris sz := 1024*1024*1024*1024. self should: [Array new: sz] raise: OutOfMemory, (Error & [:ex | ex messageText includesSubstring: 'basicNew: with invalid argument']). -------------- next part -------------- An HTML attachment was scrubbed... URL: From Christoph.Thiede at student.hpi.uni-potsdam.de Fri Oct 9 14:53:08 2020 From: Christoph.Thiede at student.hpi.uni-potsdam.de (Thiede, Christoph) Date: Fri, 9 Oct 2020 14:53:08 +0000 Subject: [squeak-dev] assert:equals: in Object In-Reply-To: References: <79aca96b0f334332a72c84f0db65a307@student.hpi.uni-potsdam.de>, Message-ID: Hi Tony, > Anyway, having it by default be the case that Workspaces' code environments be TestCases seems very sensible to me. What do you mean by this? Such a TestCase receiver environment should definitively be not the default, this would be very confusing! > "Assertions of invariants in production code [as opposed to just in testing code] are useful. But they MUST BE LEFT ACTIVE IN PRODUCTION CODE because otherwise it's like wearing a seatbelt only while you're on your own driveway, and taking it off as soon as you're on the street." Absolutely! All I wanted to avoid is that we introduce an SUnit extension on Object and no one notices that it is an extension method and then will misuse #assert:equals: as an assertion in production code - which would break his or her package if it is installed in another environment that misses the SUnit package. Are we on the same page now? :-) Best, Christoph ________________________________ Von: Tony Garnock-Jones Gesendet: Freitag, 9. Oktober 2020 16:33:12 An: The general-purpose Squeak developers list; Thiede, Christoph Betreff: Re: [squeak-dev] assert:equals: in Object On 10/9/20 2:34 PM, Thiede, Christoph wrote: > Hi Eliot, Hi Marcel, -1 from my side for this change. :-) Me too. I think it's almost a case of Gun>>draw vs Shape>>draw -- assert: in Object is for invariant-specification. > Instead, we might miss some proper tooling for your use case, Eliot. > Why can't we exchange the class of a Workspace's receiver? I really like this line of thinking! I've been mulling over the idea of having an ActorWorkspace that exists within the context of a running Actor so it can react to events, "crash", etc. (It makes sense in context -- Erlangish (and Syndicateish) actors are deeper participants in their ecosystems than vanilla Actors are...) Anyway, having it by default be the case that Workspaces' code environments be TestCases seems very sensible to me. I also wanted to respond to this: > Production assertions are a useful feature. But compared to SUnit, > they are not meant to fail at any time, and if they fail, they > should do so during development only, I wanted to make sure we are all on the same page by suggesting a clarification here. I think, Christoph, that you *should* have meant :-) something like: "Assertions of invariants in production code [as opposed to just in testing code] are useful. But they MUST BE LEFT ACTIVE IN PRODUCTION CODE because otherwise it's like wearing a seatbelt only while you're on your own driveway, and taking it off as soon as you're on the street." Hopefully I'm right! :-) It just alarmed me a bit to see discussion of making the same mistake C makes, namely compiling away assertions in "release" builds, which is where you need them most... Cheers, Tony -------------- next part -------------- An HTML attachment was scrubbed... URL: From marcel.taeumel at hpi.de Fri Oct 9 14:53:44 2020 From: marcel.taeumel at hpi.de (Marcel Taeumel) Date: Fri, 9 Oct 2020 16:53:44 +0200 Subject: [squeak-dev] The Inbox: Graphics-ct.443.mcz In-Reply-To: References: Message-ID: Hi Christoph. > For a potentially relevant reference implementtion ... And maybe double-check with the specification: https://www.w3.org/Graphics/GIF/spec-gif89a.txt [https://www.w3.org/Graphics/GIF/spec-gif89a.txt] Best, Marcel Am 09.10.2020 16:15:36 schrieb commits at source.squeak.org : Christoph Thiede uploaded a new version of Graphics to project The Inbox: http://source.squeak.org/inbox/Graphics-ct.443.mcz ==================== Summary ==================== Name: Graphics-ct.443 Author: ct Time: 9 October 2020, 4:15:09.97236 pm UUID: 897346b7-ceaa-1a43-874f-3571d893309c Ancestors: Graphics-pre.439 Adds basic support for storing an animated GIF file via AnimatedGIFReadWriter. Note that this implementation indeed is very rudimentary only. I found several GIF files on my computer that cannot be saved as a GIF correctly (something is wrong with the encoding of the background/alpha color). But on the other hand, I also met a number of GIF files that cannot be read by the AnimatedGIFReadWriter ("error: improper store") ... For a potentially relevant reference implementtion, I found this one, but I did not yet find the time apply it: https://gist.github.com/JimBobSquarePants/cac72c4e7d9f05f13ac9 Following the idea of "baby steps", I'd like to get this into the Trunk at this early state however. The motivation behind this is that I would like to use this concept from another project so establishing the protocol as soon as possible would be helpful for me to write tests. =============== Diff against Graphics-pre.439 =============== Item was added: + ----- Method: AnimatedGIFReadWriter class>>exampleAnim (in category 'examples') ----- + exampleAnim + "AnimatedGIFReadWriter exampleAnim" + + | extent center frames | + extent := 42 @ 42. + center := extent // 2. + frames := (2 to: center x - 1 by: 2) collect: [:r | + "Make a fancy anim without using Canvas - inefficient as hell" + | image | + image := ColorForm extent: extent depth: 8. + 0.0 to: 359.0 do: [:theta | + image + colorAt: (center + (Point r: r degrees: theta)) rounded + put: Color red]. + image]. + + ^ FileStream newFileNamed: 'anim.gif' do: [:stream | + self + putForms: frames + andDelays: (frames withIndexCollect: [:frame :index | + 10 + (index / frames size * 100)]) "Start fast, end slow" + onStream: stream]! Item was added: + ----- Method: AnimatedGIFReadWriter class>>putForms:andDelays:onStream: (in category 'image reading/writing') ----- + putForms: forms andDelays: delays onStream: aWriteStream + "Store the given form sequence as an animation on the given stream." + + | writer canvas | + self assert: forms size = delays size. + + writer := self on: aWriteStream. + canvas := Form extent: forms first extent depth: 32. + [Cursor write showWhile: [ + writer loopCount: -1. + forms with: delays do: [:form :delay | + writer delay: delay; flag: #todo. "ct: Does not work" + form displayOn: canvas at: 0 @ 0 rule: Form over. + writer nextPutImage: canvas]]] + ensure: [writer close].! Item was added: + ----- Method: AnimatedGIFReadWriter class>>putForms:onFileNamed: (in category 'image reading/writing') ----- + putForms: formSequence onFileNamed: fileName + "Store the given form sequence as an animation on a file of the given name." + + FileStream newFileNamed: fileName do: [:stream | + self putForms: formSequence onStream: stream].! Item was added: + ----- Method: AnimatedGIFReadWriter class>>putForms:onStream: (in category 'image reading/writing') ----- + putForms: forms onStream: aWriteStream + "Store the given form sequence as an animation on the given stream." + + ^ self + putForms: forms + andDelays: ((1 to: forms size) collect: [:i | 20]) + onStream: aWriteStream! Item was changed: ----- Method: BMPReadWriter class>>readAllFrom: (in category 'testing') ----- readAllFrom: fd "MessageTally spyOn:[BMPReadWriter readAllFrom: FileDirectory default]" fd fileNames do:[:fName| (fName endsWith: '.bmp') ifTrue:[ + [Form fromBinaryStream: (fd readOnlyFileNamed: fName)] ifError: []. - [Form fromBinaryStream: (fd readOnlyFileNamed: fName)] on: Error do:[:nix]. ]. ]. fd directoryNames do:[:fdName| self readAllFrom: (fd directoryNamed: fdName) ].! Item was removed: - ----- Method: GIFReadWriter class>>exampleAnim (in category 'examples') ----- - exampleAnim - "GIFReadWriter exampleAnim" - - | writer extent center | - writer := GIFReadWriter on: (FileStream newFileNamed: 'anim.gif'). - writer loopCount: 20. "Repeat 20 times" - writer delay: 10. "Wait 10/100 seconds" - extent := 42 at 42. - center := extent / 2. - Cursor write showWhile: [ - [2 to: center x - 1 by: 2 do: [:r | - "Make a fancy anim without using Canvas - inefficient as hell" - | image | - image := ColorForm extent: extent depth: 8. - 0.0 to: 359.0 do: [:theta | image colorAt: (center + (Point r: r degrees: theta)) rounded put: Color red]. - writer nextPutImage: image] - ] ensure: [writer close]].! -------------- next part -------------- An HTML attachment was scrubbed... URL: From Christoph.Thiede at student.hpi.uni-potsdam.de Fri Oct 9 15:00:12 2020 From: Christoph.Thiede at student.hpi.uni-potsdam.de (Thiede, Christoph) Date: Fri, 9 Oct 2020 15:00:12 +0000 Subject: [squeak-dev] The Inbox: Graphics-ct.443.mcz In-Reply-To: References: , Message-ID: <827fe31de4364ad7aaf330840add49d0@student.hpi.uni-potsdam.de> > And maybe double-check with the specification: https://www.w3.org/Graphics/GIF/spec-gif89a.txt This looks less funny to me, but you are right of course. :-) Best, Christoph ________________________________ Von: Squeak-dev im Auftrag von Taeumel, Marcel Gesendet: Freitag, 9. Oktober 2020 16:53:44 An: squeak-dev Betreff: Re: [squeak-dev] The Inbox: Graphics-ct.443.mcz Hi Christoph. > For a potentially relevant reference implementtion ... And maybe double-check with the specification: https://www.w3.org/Graphics/GIF/spec-gif89a.txt Best, Marcel Am 09.10.2020 16:15:36 schrieb commits at source.squeak.org : Christoph Thiede uploaded a new version of Graphics to project The Inbox: http://source.squeak.org/inbox/Graphics-ct.443.mcz ==================== Summary ==================== Name: Graphics-ct.443 Author: ct Time: 9 October 2020, 4:15:09.97236 pm UUID: 897346b7-ceaa-1a43-874f-3571d893309c Ancestors: Graphics-pre.439 Adds basic support for storing an animated GIF file via AnimatedGIFReadWriter. Note that this implementation indeed is very rudimentary only. I found several GIF files on my computer that cannot be saved as a GIF correctly (something is wrong with the encoding of the background/alpha color). But on the other hand, I also met a number of GIF files that cannot be read by the AnimatedGIFReadWriter ("error: improper store") ... For a potentially relevant reference implementtion, I found this one, but I did not yet find the time apply it: https://gist.github.com/JimBobSquarePants/cac72c4e7d9f05f13ac9 Following the idea of "baby steps", I'd like to get this into the Trunk at this early state however. The motivation behind this is that I would like to use this concept from another project so establishing the protocol as soon as possible would be helpful for me to write tests. =============== Diff against Graphics-pre.439 =============== Item was added: + ----- Method: AnimatedGIFReadWriter class>>exampleAnim (in category 'examples') ----- + exampleAnim + "AnimatedGIFReadWriter exampleAnim" + + | extent center frames | + extent := 42 @ 42. + center := extent // 2. + frames := (2 to: center x - 1 by: 2) collect: [:r | + "Make a fancy anim without using Canvas - inefficient as hell" + | image | + image := ColorForm extent: extent depth: 8. + 0.0 to: 359.0 do: [:theta | + image + colorAt: (center + (Point r: r degrees: theta)) rounded + put: Color red]. + image]. + + ^ FileStream newFileNamed: 'anim.gif' do: [:stream | + self + putForms: frames + andDelays: (frames withIndexCollect: [:frame :index | + 10 + (index / frames size * 100)]) "Start fast, end slow" + onStream: stream]! Item was added: + ----- Method: AnimatedGIFReadWriter class>>putForms:andDelays:onStream: (in category 'image reading/writing') ----- + putForms: forms andDelays: delays onStream: aWriteStream + "Store the given form sequence as an animation on the given stream." + + | writer canvas | + self assert: forms size = delays size. + + writer := self on: aWriteStream. + canvas := Form extent: forms first extent depth: 32. + [Cursor write showWhile: [ + writer loopCount: -1. + forms with: delays do: [:form :delay | + writer delay: delay; flag: #todo. "ct: Does not work" + form displayOn: canvas at: 0 @ 0 rule: Form over. + writer nextPutImage: canvas]]] + ensure: [writer close].! Item was added: + ----- Method: AnimatedGIFReadWriter class>>putForms:onFileNamed: (in category 'image reading/writing') ----- + putForms: formSequence onFileNamed: fileName + "Store the given form sequence as an animation on a file of the given name." + + FileStream newFileNamed: fileName do: [:stream | + self putForms: formSequence onStream: stream].! Item was added: + ----- Method: AnimatedGIFReadWriter class>>putForms:onStream: (in category 'image reading/writing') ----- + putForms: forms onStream: aWriteStream + "Store the given form sequence as an animation on the given stream." + + ^ self + putForms: forms + andDelays: ((1 to: forms size) collect: [:i | 20]) + onStream: aWriteStream! Item was changed: ----- Method: BMPReadWriter class>>readAllFrom: (in category 'testing') ----- readAllFrom: fd "MessageTally spyOn:[BMPReadWriter readAllFrom: FileDirectory default]" fd fileNames do:[:fName| (fName endsWith: '.bmp') ifTrue:[ + [Form fromBinaryStream: (fd readOnlyFileNamed: fName)] ifError: []. - [Form fromBinaryStream: (fd readOnlyFileNamed: fName)] on: Error do:[:nix]. ]. ]. fd directoryNames do:[:fdName| self readAllFrom: (fd directoryNamed: fdName) ].! Item was removed: - ----- Method: GIFReadWriter class>>exampleAnim (in category 'examples') ----- - exampleAnim - "GIFReadWriter exampleAnim" - - | writer extent center | - writer := GIFReadWriter on: (FileStream newFileNamed: 'anim.gif'). - writer loopCount: 20. "Repeat 20 times" - writer delay: 10. "Wait 10/100 seconds" - extent := 42 at 42. - center := extent / 2. - Cursor write showWhile: [ - [2 to: center x - 1 by: 2 do: [:r | - "Make a fancy anim without using Canvas - inefficient as hell" - | image | - image := ColorForm extent: extent depth: 8. - 0.0 to: 359.0 do: [:theta | image colorAt: (center + (Point r: r degrees: theta)) rounded put: Color red]. - writer nextPutImage: image] - ] ensure: [writer close]].! -------------- next part -------------- An HTML attachment was scrubbed... URL: From eric.gade at gmail.com Fri Oct 9 15:16:49 2020 From: eric.gade at gmail.com (Eric Gade) Date: Fri, 9 Oct 2020 11:16:49 -0400 Subject: [squeak-dev] The Inbox: Graphics-ct.443.mcz In-Reply-To: <827fe31de4364ad7aaf330840add49d0@student.hpi.uni-potsdam.de> References: <827fe31de4364ad7aaf330840add49d0@student.hpi.uni-potsdam.de> Message-ID: Hi Christoph, I am responsible for the version of GIFReadWriter that was altered in Pharo 7 and up. A couple of years ago I also found that many (most?) of the animated GIFs I was coming across in the wild were not displaying correctly inside of Squeak or Pharo. No one was working on the issue so I had to learn everything as I went. My own strategy was to "pull out" the LZW compression / decompression components into their own classes. That helped me wrap my head around what's going on, since the original code is fairly complicated. It was not easy! Additionally, the frames of the GIF images were not being composited correctly in the original implementation in either Squeak or Pharo. I took a very amateurish approach to that problem, I think, by creating a new class called AnimatedImageFrame that contains information about compositing disposal types, frame delay, the underlying Form, etc. I then implemented my own AnimatedImageMorph which is quite different from the Squeak version, designed to perform the correct compositions. I sort of regret this decision now, and feel like the compositing should happen with the GIF is decoded and that full Forms should be made and passed to any AnimatedImageMorph. The disadvantage with that tactic, however, is that you lose the clever framing that went into the creation of the GIF -- large animated GIFs, when read in and written back, might balloon in size, since we would be saving all bits for each frame now rather than the original differences between frames. The need for composited frames also led me to ditch the AnimatedGIFReadWriter entirely, and to fold in all functionality to GIFReadWriter . The GIF spec does not make any distinction between a still or an animated image, other than the presence of multiple frames. This of course does not play nice with the ImageReadWriter pattern of #formFromStream: etc, so I made those older methods simply return a Form of the first frame. There are other methods for decoding the animated versions. There is, even in my implementation, no way for the system to determine if a GIF should be presented as an animated one or a still image of just the first or only frame. I tried several times to port some of my changes partially to Squeak but kept running into roadblocks. The last one had to do with differences in how Squeak and Pharo deal with color bits and transparency. You can find that thread here . Also check out the class comments in the Pharo version of GIFReadWriter and the two LZW classes, since I think there are links to good information about the GIF format and some tutorials, too. I can't remember the reasoning for every choice I made here but definitely hit me with any questions if you have them. On Fri, Oct 9, 2020 at 11:00 AM Thiede, Christoph < Christoph.Thiede at student.hpi.uni-potsdam.de> wrote: > > And maybe double-check with the specification: > https://www.w3.org/Graphics/GIF/spec-gif89a.txt > > This looks less funny to me, but you are right of course. :-) > > Best, > Christoph > ------------------------------ > *Von:* Squeak-dev im > Auftrag von Taeumel, Marcel > *Gesendet:* Freitag, 9. Oktober 2020 16:53:44 > *An:* squeak-dev > *Betreff:* Re: [squeak-dev] The Inbox: Graphics-ct.443.mcz > > Hi Christoph. > > > For a potentially relevant reference implementtion ... > And maybe double-check with the specification: > https://www.w3.org/Graphics/GIF/spec-gif89a.txt > > Best, > Marcel > > Am 09.10.2020 16:15:36 schrieb commits at source.squeak.org < > commits at source.squeak.org>: > Christoph Thiede uploaded a new version of Graphics to project The Inbox: > http://source.squeak.org/inbox/Graphics-ct.443.mcz > > ==================== Summary ==================== > > Name: Graphics-ct.443 > Author: ct > Time: 9 October 2020, 4:15:09.97236 pm > UUID: 897346b7-ceaa-1a43-874f-3571d893309c > Ancestors: Graphics-pre.439 > > Adds basic support for storing an animated GIF file via > AnimatedGIFReadWriter. > > Note that this implementation indeed is very rudimentary only. I found > several GIF files on my computer that cannot be saved as a GIF correctly > (something is wrong with the encoding of the background/alpha color). But > on the other hand, I also met a number of GIF files that cannot be read by > the AnimatedGIFReadWriter ("error: improper store") ... > For a potentially relevant reference implementtion, I found this one, but > I did not yet find the time apply it: > https://gist.github.com/JimBobSquarePants/cac72c4e7d9f05f13ac9 > > Following the idea of "baby steps", I'd like to get this into the Trunk at > this early state however. The motivation behind this is that I would like > to use this concept from another project so establishing the protocol as > soon as possible would be helpful for me to write tests. > > =============== Diff against Graphics-pre.439 =============== > > Item was added: > + ----- Method: AnimatedGIFReadWriter class>>exampleAnim (in category > 'examples') ----- > + exampleAnim > + "AnimatedGIFReadWriter exampleAnim" > + > + | extent center frames | > + extent := 42 @ 42. > + center := extent // 2. > + frames := (2 to: center x - 1 by: 2) collect: [:r | > + "Make a fancy anim without using Canvas - inefficient as hell" > + | image | > + image := ColorForm extent: extent depth: 8. > + 0.0 to: 359.0 do: [:theta | > + image > + colorAt: (center + (Point r: r degrees: theta)) rounded > + put: Color red]. > + image]. > + > + ^ FileStream newFileNamed: 'anim.gif' do: [:stream | > + self > + putForms: frames > + andDelays: (frames withIndexCollect: [:frame :index | > + 10 + (index / frames size * 100)]) "Start fast, end slow" > + onStream: stream]! > > Item was added: > + ----- Method: AnimatedGIFReadWriter class>>putForms:andDelays:onStream: > (in category 'image reading/writing') ----- > + putForms: forms andDelays: delays onStream: aWriteStream > + "Store the given form sequence as an animation on the given stream." > + > + | writer canvas | > + self assert: forms size = delays size. > + > + writer := self on: aWriteStream. > + canvas := Form extent: forms first extent depth: 32. > + [Cursor write showWhile: [ > + writer loopCount: -1. > + forms with: delays do: [:form :delay | > + writer delay: delay; flag: #todo. "ct: Does not work" > + form displayOn: canvas at: 0 @ 0 rule: Form over. > + writer nextPutImage: canvas]]] > + ensure: [writer close].! > > Item was added: > + ----- Method: AnimatedGIFReadWriter class>>putForms:onFileNamed: (in > category 'image reading/writing') ----- > + putForms: formSequence onFileNamed: fileName > + "Store the given form sequence as an animation on a file of the given > name." > + > + FileStream newFileNamed: fileName do: [:stream | > + self putForms: formSequence onStream: stream].! > > Item was added: > + ----- Method: AnimatedGIFReadWriter class>>putForms:onStream: (in > category 'image reading/writing') ----- > + putForms: forms onStream: aWriteStream > + "Store the given form sequence as an animation on the given stream." > + > + ^ self > + putForms: forms > + andDelays: ((1 to: forms size) collect: [:i | 20]) > + onStream: aWriteStream! > > Item was changed: > ----- Method: BMPReadWriter class>>readAllFrom: (in category 'testing') > ----- > readAllFrom: fd > "MessageTally spyOn:[BMPReadWriter readAllFrom: FileDirectory default]" > fd fileNames do:[:fName| > (fName endsWith: '.bmp') ifTrue:[ > + [Form fromBinaryStream: (fd readOnlyFileNamed: fName)] ifError: []. > - [Form fromBinaryStream: (fd readOnlyFileNamed: fName)] on: Error > do:[:nix]. > ]. > ]. > fd directoryNames do:[:fdName| > self readAllFrom: (fd directoryNamed: fdName) > ].! > > Item was removed: > - ----- Method: GIFReadWriter class>>exampleAnim (in category 'examples') > ----- > - exampleAnim > - "GIFReadWriter exampleAnim" > - > - | writer extent center | > - writer := GIFReadWriter on: (FileStream newFileNamed: 'anim.gif'). > - writer loopCount: 20. "Repeat 20 times" > - writer delay: 10. "Wait 10/100 seconds" > - extent := 42 at 42. > - center := extent / 2. > - Cursor write showWhile: [ > - [2 to: center x - 1 by: 2 do: [:r | > - "Make a fancy anim without using Canvas - inefficient as hell" > - | image | > - image := ColorForm extent: extent depth: 8. > - 0.0 to: 359.0 do: [:theta | image colorAt: (center + (Point r: r > degrees: theta)) rounded put: Color red]. > - writer nextPutImage: image] > - ] ensure: [writer close]].! > > > > -- Eric -------------- next part -------------- An HTML attachment was scrubbed... URL: From tonyg at leastfixedpoint.com Fri Oct 9 15:29:22 2020 From: tonyg at leastfixedpoint.com (Tony Garnock-Jones) Date: Fri, 9 Oct 2020 17:29:22 +0200 Subject: [squeak-dev] assert:equals: in Object In-Reply-To: References: <79aca96b0f334332a72c84f0db65a307@student.hpi.uni-potsdam.de> Message-ID: Hi Christoph, On 10/9/20 4:53 PM, Thiede, Christoph wrote: >> Anyway, having it by default be the case that Workspaces' > code environments be TestCases seems very sensible to me. > > What do you mean by this? Such a TestCase receiver environment should > definitively be not the default, this would be very confusing! Oh interesting! What kind of confusion do you foresee? I had just imagined that the only visible-ish change would be availability of TestCase instance-side methods on the "self" in the Workspace. >> "Assertions [...] MUST BE LEFT ACTIVE IN >> PRODUCTION CODE > > Are we on the same page now? :-) Yes, I think we are! :-) Thanks. Tony From Christoph.Thiede at student.hpi.uni-potsdam.de Fri Oct 9 16:19:35 2020 From: Christoph.Thiede at student.hpi.uni-potsdam.de (Thiede, Christoph) Date: Fri, 9 Oct 2020 16:19:35 +0000 Subject: [squeak-dev] Question about SoundGenerationPlugin/mixSampleCount Message-ID: <936dcefa487949d3aa4e5a89c6a46f0e@student.hpi.uni-potsdam.de> Hi all, for a test, I am storing sounds into a ByteArray and read them again. This works well for PluckedSounds, for example, but I found some strange behavior when doing the same with SampledSounds: sound := SampledSound new setSamples: SampledSound coffeeCupClink samplingRate: 12000. bytes := ByteArray streamContents: [:stream | sound storeWAVSamplesOn: stream]. outputSound := SampledSound fromWaveStream: bytes readStream binary. After running this script, I would expect outputSound to have the same samples as sound. But actually, every byte in the SoundBuffer appears twice! Still, playing the sound does not sound differently in my ears. I traced the issue down and found out that #mixSampleCount:into:startingAt:leftVol:rightVol: is writing every byte four times on the stream - two would be okay for left and right channel, but I do not understand the four. I reproduced the issue both on Windows and Ubuntu (WSL). Disabling the primitive did not help either. So I am wondering: Is this a bug or totally fine (because you cannot hear a difference anyway)? If the latter is the case, how can I compare the sounds else in a reliable way? If I store outputSound again, the number of bytes is doubled again, so if you do certain operations, your image will blow up exponentially ... For the context of this question, see also: http://forum.world.st/Overriding-in-Graphics-and-Sounds-td5122783.html Best, Christoph -------------- next part -------------- An HTML attachment was scrubbed... URL: From christoph.thiede at student.hpi.uni-potsdam.de Fri Oct 9 16:22:35 2020 From: christoph.thiede at student.hpi.uni-potsdam.de (Christoph Thiede) Date: Fri, 9 Oct 2020 11:22:35 -0500 (CDT) Subject: [squeak-dev] Question about SoundGenerationPlugin/mixSampleCount In-Reply-To: <936dcefa487949d3aa4e5a89c6a46f0e@student.hpi.uni-potsdam.de> References: <936dcefa487949d3aa4e5a89c6a46f0e@student.hpi.uni-potsdam.de> Message-ID: <1602260555395-0.post@n4.nabble.com> As a workaround, in my test I compare the ByteArray representations of my sounds rather than their samples, so there is no urgency from my side. Still, this behavior looks suspicious to me ... -- Sent from: http://forum.world.st/Squeak-Dev-f45488.html From eliot.miranda at gmail.com Fri Oct 9 17:25:07 2020 From: eliot.miranda at gmail.com (Eliot Miranda) Date: Fri, 9 Oct 2020 10:25:07 -0700 Subject: [squeak-dev] how to raise a menu in the selector pane of the browser on windows (kinda urgent) Message-ID: Hi, I have an ASUS laptop with a "two button" track pad running Windows 10 Home Ed. I have default preferences in the ini file: 3ButtonMouse=0 1ButtonMouse=0 I have the "Swap mouse buttons" preference enabled (which AFAIA is appropriate for a two button mouse). I cannot find a magic key combination that raises the selector pane yellow/middle button menu, and hence cannot easily explore the method so I can investigate Chrustoph & Marcel's report of weirdness with thisContext method method in a block. _,,,^..^,,,_ best, Eliot -------------- next part -------------- An HTML attachment was scrubbed... URL: From eliot.miranda at gmail.com Fri Oct 9 17:28:05 2020 From: eliot.miranda at gmail.com (Eliot Miranda) Date: Fri, 9 Oct 2020 10:28:05 -0700 Subject: [squeak-dev] how to raise a menu in the selector pane of the browser on windows (kinda urgent) In-Reply-To: References: Message-ID: Ignore me. Swap mouse buttons does not make sense on WIndows. It does make sense on Mac. This inconsistency is, um, unfortunate. I routinely use the same image on WIndows and Mac and having to change preferences to be able to use the image is broken. Cross platform implies UI usability as much as platform API abstraction. On Fri, Oct 9, 2020 at 10:25 AM Eliot Miranda wrote: > Hi, > > I have an ASUS laptop with a "two button" track pad running Windows 10 > Home Ed. > > I have default preferences in the ini file: > > 3ButtonMouse=0 > 1ButtonMouse=0 > > I have the "Swap mouse buttons" preference enabled (which AFAIA is > appropriate for a two button mouse). > > I cannot find a magic key combination that raises the selector pane > yellow/middle button menu, and hence cannot easily explore the method so I > can investigate Chrustoph & Marcel's report of weirdness with thisContext > method method in a block. > > _,,,^..^,,,_ > best, Eliot > -- _,,,^..^,,,_ best, Eliot -------------- next part -------------- An HTML attachment was scrubbed... URL: From eliot.miranda at gmail.com Fri Oct 9 17:30:37 2020 From: eliot.miranda at gmail.com (Eliot Miranda) Date: Fri, 9 Oct 2020 10:30:37 -0700 Subject: [squeak-dev] The Trunk: Tools-eem.997.mcz In-Reply-To: References: <169a6894fe884db0925d2388c7344538@student.hpi.uni-potsdam.de> Message-ID: Hi Marcel, Christoph, that's a compiler bug. There is a chicken-and-egg problem in setting up the graph of CompiledBlocks and Compiledmethod, but I had implemented that at some point. I'm looking at the isse now. On Fri, Oct 9, 2020 at 5:32 AM Marcel Taeumel wrote: > This is really interesting. There are two "versions" of the same method: > > > > Of course, only one of them is installed at the same time. > > Best, > Marcel > > Am 09.10.2020 14:20:23 schrieb Thiede, Christoph < > christoph.thiede at student.hpi.uni-potsdam.de>: > > Hi Eliot, > > > related question: Why does the following evaluate to false if I compile it > into a method (but evaluates correctly to true if I print it directly)? > > > [thisContext method method == thisContext home method] value > > > More confusingly, the following method returns false (compile it on any > class): > > > testBlock2 > > ^ [thisContext method method isInstalled] value > > (As a consequence, #browseMethod: in StandardToolSet opens a > VersionsBrowser instead of a regular browser if I say [thisContext method] > value browse ...) > > > Best, > > Christoph > > ------------------------------ > *Von:* Squeak-dev im > Auftrag von commits at source.squeak.org > *Gesendet:* Freitag, 9. Oktober 2020 10:03:50 > *An:* squeak-dev at lists.squeakfoundation.org; > packages at lists.squeakfoundation.org > *Betreff:* [squeak-dev] The Trunk: Tools-eem.997.mcz > > Eliot Miranda uploaded a new version of Tools to project The Trunk: > http://source.squeak.org/trunk/Tools-eem.997.mcz > > ==================== Summary ==================== > > Name: Tools-eem.997 > Author: eem > Time: 9 October 2020, 1:03:40.26529 am > UUID: fa6a5f48-cd96-4194-a00a-41ce1cc25bf7 > Ancestors: Tools-eem.996 > > Fix the ProcessBrowser's browse function for full blocks. > > =============== Diff against Tools-eem.996 =============== > > Item was changed: > ----- Method: ProcessBrowser>>browseContext (in category 'stack list') > ----- > browseContext > + ToolSet browseMethod: selectedContext home method! > - ToolSet browseMethod: selectedContext home! > > > > -- _,,,^..^,,,_ best, Eliot -------------- next part -------------- An HTML attachment was scrubbed... URL: -------------- next part -------------- A non-text attachment was scrubbed... Name: image.png Type: image/png Size: 119833 bytes Desc: not available URL: From commits at source.squeak.org Fri Oct 9 17:59:41 2020 From: commits at source.squeak.org (commits at source.squeak.org) Date: Fri, 9 Oct 2020 17:59:41 0000 Subject: [squeak-dev] The Trunk: Compiler-eem.444.mcz Message-ID: Eliot Miranda uploaded a new version of Compiler to project The Trunk: http://source.squeak.org/trunk/Compiler-eem.444.mcz ==================== Summary ==================== Name: Compiler-eem.444 Author: eem Time: 9 October 2020, 10:59:39.150557 am UUID: 52facf73-6ea8-4abc-8053-242eacfbb0ec Ancestors: Compiler-eem.443 Stage one of refactoring of CompilationCue so that compile:environment:classified:withStamp:notifying:logSource: can be refactored into compileCue:environment:classified:withStamp:notifying:logSource: to allow easy installation of methods with different encoder classes (for tests of full vs embedded blocks). =============== Diff against Compiler-eem.443 =============== Item was changed: Object subclass: #CompilationCue + instanceVariableNames: 'source sourceStream context receiver class environment requestor encoderClass' - instanceVariableNames: 'source context receiver class environment requestor' classVariableNames: '' poolDictionaries: '' category: 'Compiler-Kernel'! !CompilationCue commentStamp: 'eem 3/30/2017 17:32' prior: 0! A CompilationCue is a helper class holding enough context for evaluating/compiling Smalltalk code. That is mainly the source code, and the source code editor to interact with if the Compiler is used interactively. But that is also any additional information necessary to resolve variable names. When compiling a method, the Compiler typically need to know the target class in which to install the method. When evaluating an expression, the Compiler also needs a receiver (for accessing the value of its instance variables), its class (for resolving instance/class variable names), and optionnally a context of execution when debugging a method (for accessing values of temporaries and parameters). Instance Variables class: context: environment: receiver: requestor: source: class - the target class in which to install the compiled method; this enables to resolve the instance variable names, class variable names and shared pool variable names. When evaluating, this should be the receiver class context - the context introspected when evaluating the code: this is typically for accessing parameters and temporary variables when debugging environment - the environment in which to resolve global variable names receiver - the receiver into which to evaluate the code: this is typically for accessing instance variables in an inspector requestor - typically the text editor containing the source code being compiled/evaluated. This enables the Compiler to interact in case of syntax error. source - a ReadStream on the source code to be compiled ! Item was changed: ----- Method: CompilationCue>>initializeWithSource:context:receiver:class:environment:requestor: (in category 'initialization') ----- initializeWithSource: aTextOrString context: aContext receiver: recObject class: aClass environment: anEnvironment requestor: reqObject self initialize. + source := aTextOrString isStream + ifTrue: [aTextOrString] + ifFalse: [ReadStream on: aTextOrString asString]. + sourceStream := aTextOrString isStream + ifTrue: [aTextOrString] + ifFalse: [ReadStream on: aTextOrString asString]. - source := (aTextOrString isKindOf: PositionableStream) - ifTrue: [ aTextOrString ] - ifFalse: [ ReadStream on: aTextOrString asString ]. context := aContext. receiver := recObject. class := aClass. environment := anEnvironment. requestor := reqObject! From commits at source.squeak.org Fri Oct 9 18:24:32 2020 From: commits at source.squeak.org (commits at source.squeak.org) Date: Fri, 9 Oct 2020 18:24:32 0000 Subject: [squeak-dev] The Trunk: Kernel-eem.1345.mcz Message-ID: Eliot Miranda uploaded a new version of Kernel to project The Trunk: http://source.squeak.org/trunk/Kernel-eem.1345.mcz ==================== Summary ==================== Name: Kernel-eem.1345 Author: eem Time: 9 October 2020, 11:24:29.39536 am UUID: a2fbce4f-7c3e-4945-ae44-2f7cb7d40cc7 Ancestors: Kernel-tonyg.1344 Refactor ClassDescription>>#compile:environment:classified:withStamp:notifying:logSource: into compileCue:environment:classified:withStamp:notifying:logSource: to allow clients to more easily install methods with dfferent btecode sets (for tests). Provide accessors for CompiledCode's primary and secondary bytecodeSetEncoderClasses. Correct a slip; integers should be compared using #=, not #==. =============== Diff against Kernel-tonyg.1344 =============== Item was changed: ----- Method: ClassDescription>>compile:environment:classified:withStamp:notifying:logSource: (in category 'compiling') ----- compile: text environment: anEnvironment classified: category withStamp: changeStamp notifying: requestor logSource: logSource + ^self + compileCue: (CompilationCue + source: text + class: self + environment: anEnvironment + requestor: requestor) - | methodAndNode context methodNode selector | - context := CompilationCue - source: text - class: self environment: anEnvironment + classified: category + withStamp: changeStamp + notifying: requestor + logSource: logSource! - requestor: requestor. - methodNode := self newCompiler compile: context ifFail: [^ nil]. - methodAndNode := CompiledMethodWithNode - generateMethodFromNode: methodNode - trailer: (self defaultMethodTrailerIfLogSource: logSource). - selector := methodAndNode selector. - logSource ifTrue: [ - self - logMethodSource: text - forMethodWithNode: methodAndNode - inCategory: category - withStamp: changeStamp - notifying: requestor. - RecentMessages default - recordSelector: selector - forClass: methodAndNode method methodClass - inEnvironment: anEnvironment ]. - self - addAndClassifySelector: selector - withMethod: methodAndNode method - inProtocol: category - notifying: requestor. - self instanceSide - noteCompilationOf: selector - meta: self isClassSide. - ^selector! Item was added: + ----- Method: ClassDescription>>compileCue:environment:classified:withStamp:notifying:logSource: (in category 'compiling') ----- + compileCue: compilationCue environment: anEnvironment classified: category withStamp: changeStamp notifying: requestor logSource: logSource + + | methodAndNode methodNode selector | + methodNode := self newCompiler compile: compilationCue ifFail: [^nil]. + methodAndNode := CompiledMethodWithNode + generateMethodFromNode: methodNode + trailer: (self defaultMethodTrailerIfLogSource: logSource). + selector := methodAndNode selector. + logSource ifTrue: + [self + logMethodSource: compilationCue source + forMethodWithNode: methodAndNode + inCategory: category + withStamp: changeStamp + notifying: requestor. + RecentMessages default + recordSelector: selector + forClass: methodAndNode method methodClass + inEnvironment: anEnvironment]. + self + addAndClassifySelector: selector + withMethod: methodAndNode method + inProtocol: category + notifying: requestor. + self instanceSide + noteCompilationOf: selector + meta: self isClassSide. + ^selector! Item was added: + ----- Method: CompiledCode class>>primaryBytecodeSetEncoderClass (in category 'method encoding') ----- + primaryBytecodeSetEncoderClass + ^PrimaryBytecodeSetEncoderClass! Item was added: + ----- Method: CompiledCode class>>secondaryBytecodeSetEncoderClass (in category 'method encoding') ----- + secondaryBytecodeSetEncoderClass + ^SecondaryBytecodeSetEncoderClass! Item was changed: ----- Method: CompiledMethod>>isNamedPrimitive (in category 'testing') ----- isNamedPrimitive "Answer if the receiver invokes a named primitive." + ^self primitive = 117 - ^self primitive == 117 "self systemNavigation browseAllSelect: [:m| m isNamedPrimitive]"! From commits at source.squeak.org Fri Oct 9 18:49:46 2020 From: commits at source.squeak.org (commits at source.squeak.org) Date: Fri, 9 Oct 2020 18:49:46 0000 Subject: [squeak-dev] The Trunk: Compiler-eem.445.mcz Message-ID: Eliot Miranda uploaded a new version of Compiler to project The Trunk: http://source.squeak.org/trunk/Compiler-eem.445.mcz ==================== Summary ==================== Name: Compiler-eem.445 Author: eem Time: 9 October 2020, 11:49:44.532447 am UUID: f890a5ec-6748-4c88-bbaa-fe311e572c51 Ancestors: Compiler-eem.444 Allow CompilationCue to carry encoderClass and methodTrailer to more fully control code generation. =============== Diff against Compiler-eem.444 =============== Item was changed: Object subclass: #CompilationCue + instanceVariableNames: 'source sourceStream context receiver class environment requestor encoderClass methodTrailer' - instanceVariableNames: 'source sourceStream context receiver class environment requestor encoderClass' classVariableNames: '' poolDictionaries: '' category: 'Compiler-Kernel'! !CompilationCue commentStamp: 'eem 3/30/2017 17:32' prior: 0! A CompilationCue is a helper class holding enough context for evaluating/compiling Smalltalk code. That is mainly the source code, and the source code editor to interact with if the Compiler is used interactively. But that is also any additional information necessary to resolve variable names. When compiling a method, the Compiler typically need to know the target class in which to install the method. When evaluating an expression, the Compiler also needs a receiver (for accessing the value of its instance variables), its class (for resolving instance/class variable names), and optionnally a context of execution when debugging a method (for accessing values of temporaries and parameters). Instance Variables class: context: environment: receiver: requestor: source: class - the target class in which to install the compiled method; this enables to resolve the instance variable names, class variable names and shared pool variable names. When evaluating, this should be the receiver class context - the context introspected when evaluating the code: this is typically for accessing parameters and temporary variables when debugging environment - the environment in which to resolve global variable names receiver - the receiver into which to evaluate the code: this is typically for accessing instance variables in an inspector requestor - typically the text editor containing the source code being compiled/evaluated. This enables the Compiler to interact in case of syntax error. source - a ReadStream on the source code to be compiled ! Item was added: + ----- Method: CompilationCue>>encoderClass (in category 'accessing') ----- + encoderClass + ^encoderClass! Item was added: + ----- Method: CompilationCue>>encoderClass: (in category 'accessing') ----- + encoderClass: aBytecodeEncoderClass + encoderClass := aBytecodeEncoderClass! Item was changed: ----- Method: CompilationCue>>initializeWithSource:context:receiver:class:environment:requestor: (in category 'initialization') ----- initializeWithSource: aTextOrString context: aContext receiver: recObject class: aClass environment: anEnvironment requestor: reqObject self initialize. + source := aTextOrString. - source := aTextOrString isStream - ifTrue: [aTextOrString] - ifFalse: [ReadStream on: aTextOrString asString]. sourceStream := aTextOrString isStream ifTrue: [aTextOrString] ifFalse: [ReadStream on: aTextOrString asString]. context := aContext. receiver := recObject. class := aClass. environment := anEnvironment. requestor := reqObject! Item was added: + ----- Method: CompilationCue>>methodTrailer (in category 'accessing') ----- + methodTrailer + ^methodTrailer! Item was added: + ----- Method: CompilationCue>>methodTrailer: (in category 'accessing') ----- + methodTrailer: aCompiledMethodTrailer + methodTrailer := aCompiledMethodTrailer! Item was added: + ----- Method: CompilationCue>>source (in category 'accessing') ----- + source + ^source! Item was changed: ----- Method: CompilationCue>>sourceStream (in category 'accessing') ----- sourceStream + ^sourceStream! - ^source! From commits at source.squeak.org Fri Oct 9 18:54:53 2020 From: commits at source.squeak.org (commits at source.squeak.org) Date: Fri, 9 Oct 2020 18:54:53 0000 Subject: [squeak-dev] The Trunk: Compiler-eem.446.mcz Message-ID: Eliot Miranda uploaded a new version of Compiler to project The Trunk: http://source.squeak.org/trunk/Compiler-eem.446.mcz ==================== Summary ==================== Name: Compiler-eem.446 Author: eem Time: 9 October 2020, 11:54:51.071572 am UUID: 6f9f349c-5461-45b5-a707-6150decce9ef Ancestors: Compiler-eem.445 Have Parser pay attention to encoderClass if stored in a cue. =============== Diff against Compiler-eem.445 =============== Item was changed: + ----- Method: Parser>>encoder (in category 'private') ----- - ----- Method: Parser>>encoder (in category 'public access') ----- encoder ^encoder ifNil: [encoder := CompiledMethod preferredBytecodeSetEncoderClass new]! Item was added: + ----- Method: Parser>>encoderFromCue: (in category 'private') ----- + encoderFromCue: aCompilationCue + ^encoder ifNil: + [encoder := (aCompilationCue encoderClass ifNil: [CompiledMethod preferredBytecodeSetEncoderClass]) new]! Item was changed: ----- Method: Parser>>parseCue:noPattern:ifFail: (in category 'public access') ----- parseCue: aCue noPattern: noPattern ifFail: aBlock + "Answer a MethodNode for the argument, sourceStream, that is the root + of a parse tree. Parsing is done with respect to the CompilationCue to + resolve variables, etc. Errors in parsing are reported to the cue's requestor; - "Answer a MethodNode for the argument, sourceStream, that is the root of - a parse tree. Parsing is done with respect to the CompilationCue to - resolve variables. Errors in parsing are reported to the cue's requestor; otherwise aBlock is evaluated. The argument noPattern is a Boolean that is true if the the sourceStream does not contain a method header (i.e., for DoIts)." | methNode repeatNeeded myStream s p subSelection | myStream := aCue sourceStream. [repeatNeeded := false. p := myStream position. s := myStream upToEnd. myStream position: p. + - doitFlag := noPattern. + [(self encoderFromCue: aCue) init: aCue notifying: self. + self init: myStream cue: aCue failBlock: [^aBlock value]. + - [self encoder init: aCue notifying: self. - self init: myStream cue: aCue failBlock: [^ aBlock value]. - subSelection := self interactive and: [cue requestor selectionInterval = (p + 1 to: p + s size)]. failBlock:= aBlock. methNode := self method: noPattern context: cue context] on: ReparseAfterSourceEditing do: [ :ex | repeatNeeded := true. properties := nil. "Avoid accumulating pragmas and primitives Number" myStream := ex newSource ifNil: [subSelection ifTrue: [ReadStream on: cue requestor text string from: cue requestor selectionInterval first to: cue requestor selectionInterval last] ifFalse: [ReadStream on: cue requestor text string]] ifNotNil: [:src | myStream := src readStream]]. repeatNeeded] whileTrue: [encoder := self encoder class new]. methNode sourceText: s. + ^methNode! - ^methNode - ! From commits at source.squeak.org Fri Oct 9 18:55:48 2020 From: commits at source.squeak.org (commits at source.squeak.org) Date: Fri, 9 Oct 2020 18:55:48 0000 Subject: [squeak-dev] The Trunk: Kernel-eem.1346.mcz Message-ID: Eliot Miranda uploaded a new version of Kernel to project The Trunk: http://source.squeak.org/trunk/Kernel-eem.1346.mcz ==================== Summary ==================== Name: Kernel-eem.1346 Author: eem Time: 9 October 2020, 11:55:45.364947 am UUID: 99f2d20b-c9bf-4bec-a8f3-c681d619ec12 Ancestors: Kernel-eem.1345 Have compileCue:environment:classified:withStamp:notifying:logSource: pay attention to methodTrailer if stored in a CompilationCue. =============== Diff against Kernel-eem.1345 =============== Item was changed: ----- Method: ClassDescription>>compileCue:environment:classified:withStamp:notifying:logSource: (in category 'compiling') ----- compileCue: compilationCue environment: anEnvironment classified: category withStamp: changeStamp notifying: requestor logSource: logSource | methodAndNode methodNode selector | methodNode := self newCompiler compile: compilationCue ifFail: [^nil]. methodAndNode := CompiledMethodWithNode generateMethodFromNode: methodNode + trailer: (compilationCue methodTrailer ifNil: + [self defaultMethodTrailerIfLogSource: logSource]). - trailer: (self defaultMethodTrailerIfLogSource: logSource). selector := methodAndNode selector. logSource ifTrue: [self logMethodSource: compilationCue source forMethodWithNode: methodAndNode inCategory: category withStamp: changeStamp notifying: requestor. RecentMessages default recordSelector: selector forClass: methodAndNode method methodClass inEnvironment: anEnvironment]. self addAndClassifySelector: selector withMethod: methodAndNode method inProtocol: category notifying: requestor. self instanceSide noteCompilationOf: selector meta: self isClassSide. ^selector! From commits at source.squeak.org Fri Oct 9 18:57:21 2020 From: commits at source.squeak.org (commits at source.squeak.org) Date: Fri, 9 Oct 2020 18:57:21 0000 Subject: [squeak-dev] The Trunk: Tests-eem.439.mcz Message-ID: Eliot Miranda uploaded a new version of Tests to project The Trunk: http://source.squeak.org/trunk/Tests-eem.439.mcz ==================== Summary ==================== Name: Tests-eem.439 Author: eem Time: 9 October 2020, 11:57:19.079562 am UUID: 4adcc427-4201-414c-8d97-596fb182c656 Ancestors: Tests-eem.438 Add a test for the compiler bug surfaced by foo ^[{thisContext method method. thisContext home method}] value =============== Diff against Tests-eem.438 =============== Item was added: + ----- Method: CompilerTest class>>compileMethodToUseFullBlocks: (in category 'private - test support') ----- + compileMethodToUseFullBlocks: selector + | method encoderClass | + method := self >> selector. + encoderClass := {CompiledCode primaryBytecodeSetEncoderClass. CompiledCode secondaryBytecodeSetEncoderClass} select: + [:class| class supportsFullBlocks]. + self compileCue: ((CompilationCue + source: method getSource + class: self + environment: self environment + requestor: nil) + encoderClass: EncoderForSistaV1; + methodTrailer: method trailer; + yourself) + environment: self environment + classified: (self whichCategoryIncludesSelector: selector) + withStamp: method timeStamp + notifying: nil + logSource: false + + "self compileMethodToUseFullBlocks: #foo"! Item was added: + ----- Method: CompilerTest>>foo (in category 'private') ----- + foo + ^[{thisContext method method. thisContext home method}] value! Item was changed: + ----- Method: CompilerTest>>testEvaluationOfInlinedToDo (in category 'tests - code generation') ----- - ----- Method: CompilerTest>>testEvaluationOfInlinedToDo (in category 'tests') ----- testEvaluationOfInlinedToDo "Whether inlined or not, #to:do: should return the same value" | inlinedResult notInlinedResult | inlinedResult := Compiler new evaluate: '1+1 to: 0 do: [:i | ]' in: nil to: nil notifying: nil ifFail: [^ #failedDoit]. notInlinedResult := Compiler new evaluate: '| aBlock | aBlock := [:i | ]. 1+1 to: 0 do: aBlock' in: nil to: nil notifying: nil ifFail: [^ #failedDoit]. self assert: inlinedResult = notInlinedResult. inlinedResult := Compiler new evaluate: '| stream results | stream := ReadStream on: #(2 1). results := OrderedCollection new. stream next to: stream next do: [ :i | results add: i ]. results' in: nil to: nil notifying: nil ifFail: [^ #failedDoit]. self assert: inlinedResult isEmpty. inlinedResult := Compiler new evaluate: '| stream results | stream := ReadStream on: #(1 2). results := OrderedCollection new. stream next to: stream next do: [ :i | results add: i ]. results' in: nil to: nil notifying: nil ifFail: [^ #failedDoit]. self assert: inlinedResult asArray = #(1 2)! Item was changed: + ----- Method: CompilerTest>>testToDoModifiesTheLimit (in category 'tests - code generation') ----- - ----- Method: CompilerTest>>testToDoModifiesTheLimit (in category 'tests') ----- testToDoModifiesTheLimit "This is a non regression test for http://bugs.squeak.org/view.php?id=7093. When blocks writes into to:do: loop limit, optimization shall be carried with care." self assert: 4 equals: [ | n | n := 2. 1 to: n do: [:i | (n := n+1)>10 ifTrue: [self error: 'Should not get here']]. n] value. self assert: 4 equals: [ | n | n := 2. 1 to: n by: 1 do: [:i | (n := n+1)>10 ifTrue: [self error: 'Should not get here']]. n] value. self assert: 4 equals: [ | n inc | n := 2. inc := 1. 1 to: n by: inc do: [:i | (n := n+1)>10 ifTrue: [self error: 'Should not get here']]. n] value.! Item was added: + ----- Method: CompilerTest>>testValidFullBlockMethod (in category 'tests - code generation') ----- + testValidFullBlockMethod + | fooMethod | + fooMethod := self class >> #foo. + fooMethod encoderClass supportsFullBlocks ifFalse: + [self class compileMethodToUseFullBlocks: #foo. + fooMethod := self class >> #foo]. + self assert: fooMethod encoderClass supportsFullBlocks. + self assert: ((fooMethod literalAt: 1) isCompiledCode and: [(fooMethod literalAt: 1) isCompiledBlock]). + self assert: (fooMethod literalAt: 1) method == fooMethod. + "And if it looks safe to do so, actually run foo and check its result" + (CompiledCode primaryBytecodeSetEncoderClass supportsFullBlocks + or: [CompiledCode secondaryBytecodeSetEncoderClass supportsFullBlocks]) ifTrue: + [self assert: {fooMethod. fooMethod } equals: self foo]! From commits at source.squeak.org Fri Oct 9 19:11:09 2020 From: commits at source.squeak.org (commits at source.squeak.org) Date: Fri, 9 Oct 2020 19:11:09 0000 Subject: [squeak-dev] The Trunk: Compiler-eem.447.mcz Message-ID: Eliot Miranda uploaded a new version of Compiler to project The Trunk: http://source.squeak.org/trunk/Compiler-eem.447.mcz ==================== Summary ==================== Name: Compiler-eem.447 Author: eem Time: 9 October 2020, 12:11:07.767302 pm UUID: aee4bc8a-7732-41ee-a2e8-d793572b08a4 Ancestors: Compiler-eem.446 Initialize source correctly in CompilationCue and answer it if available in stringToLog. =============== Diff against Compiler-eem.446 =============== Item was changed: ----- Method: CompilationCue>>initializeWithSource:context:receiver:class:environment:requestor: (in category 'initialization') ----- + initializeWithSource: aTextOrStringOrStream context: aContext receiver: recObject class: aClass environment: anEnvironment requestor: reqObject - initializeWithSource: aTextOrString context: aContext receiver: recObject class: aClass environment: anEnvironment requestor: reqObject self initialize. + aTextOrStringOrStream isStream + ifTrue: [sourceStream := aTextOrStringOrStream] + ifFalse: + [source := aTextOrStringOrStream. + sourceStream := ReadStream on: aTextOrStringOrStream asString]. - source := aTextOrString. - sourceStream := aTextOrString isStream - ifTrue: [aTextOrString] - ifFalse: [ReadStream on: aTextOrString asString]. context := aContext. receiver := recObject. class := aClass. environment := anEnvironment. requestor := reqObject! Item was changed: ----- Method: CompilationCue>>stringToLog (in category 'accessing') ----- stringToLog "Answer a string to be logged in a change log. Implementation note: If the requestor is a TextEditor, preferably take its selection. This convoluted code is presumably crafted to avoid broken contents (ReadStream on: '123456' from: 3 to: 4) contents -> '1234' As long as selectionAsStream is using such construct this might be required." | itsSelection itsSelectionString | + source ifNotNil: + [^source]. + ((requestor respondsTo: #selection) + and:[(itsSelection := requestor selection) notNil + and:[(itsSelectionString := itsSelection asString) isEmptyOrNil not]]) ifTrue: + [^itsSelectionString]. + ^sourceStream contents! - ^((requestor respondsTo: #selection) - and:[(itsSelection := requestor selection) notNil - and:[(itsSelectionString := itsSelection asString) isEmptyOrNil not]]) - ifTrue:[itsSelectionString] - ifFalse:[self sourceStream contents]! From commits at source.squeak.org Fri Oct 9 19:12:38 2020 From: commits at source.squeak.org (commits at source.squeak.org) Date: Fri, 9 Oct 2020 19:12:38 0000 Subject: [squeak-dev] The Trunk: Kernel-eem.1347.mcz Message-ID: Eliot Miranda uploaded a new version of Kernel to project The Trunk: http://source.squeak.org/trunk/Kernel-eem.1347.mcz ==================== Summary ==================== Name: Kernel-eem.1347 Author: eem Time: 9 October 2020, 12:12:35.47215 pm UUID: a8ab437c-2eac-4257-a403-12d21ea16588 Ancestors: Kernel-eem.1346 Reduce compileCue:environment:classified:withStamp:notifying:logSource: to compileCue:classified:withStamp:logSource: by deriving parameteras from the cue, as intended. =============== Diff against Kernel-eem.1346 =============== Item was changed: ----- Method: ClassDescription>>compile:environment:classified:withStamp:notifying:logSource: (in category 'compiling') ----- compile: text environment: anEnvironment classified: category withStamp: changeStamp notifying: requestor logSource: logSource ^self compileCue: (CompilationCue + source: text + class: self + environment: anEnvironment + requestor: requestor) - source: text - class: self - environment: anEnvironment - requestor: requestor) - environment: anEnvironment classified: category withStamp: changeStamp - notifying: requestor logSource: logSource! Item was added: + ----- Method: ClassDescription>>compileCue:classified:withStamp:logSource: (in category 'compiling') ----- + compileCue: compilationCue classified: category withStamp: changeStamp logSource: logSource + + | methodAndNode methodNode selector | + methodNode := self newCompiler compile: compilationCue ifFail: [^nil]. + methodAndNode := CompiledMethodWithNode + generateMethodFromNode: methodNode + trailer: (compilationCue methodTrailer ifNil: + [self defaultMethodTrailerIfLogSource: logSource]). + selector := methodAndNode selector. + logSource ifTrue: + [self + logMethodSource: compilationCue source + forMethodWithNode: methodAndNode + inCategory: category + withStamp: changeStamp + notifying: compilationCue requestor. + RecentMessages default + recordSelector: selector + forClass: methodAndNode method methodClass + inEnvironment: compilationCue environment]. + self + addAndClassifySelector: selector + withMethod: methodAndNode method + inProtocol: category + notifying: compilationCue requestor. + self instanceSide + noteCompilationOf: selector + meta: self isClassSide. + ^selector! Item was removed: - ----- Method: ClassDescription>>compileCue:environment:classified:withStamp:notifying:logSource: (in category 'compiling') ----- - compileCue: compilationCue environment: anEnvironment classified: category withStamp: changeStamp notifying: requestor logSource: logSource - - | methodAndNode methodNode selector | - methodNode := self newCompiler compile: compilationCue ifFail: [^nil]. - methodAndNode := CompiledMethodWithNode - generateMethodFromNode: methodNode - trailer: (compilationCue methodTrailer ifNil: - [self defaultMethodTrailerIfLogSource: logSource]). - selector := methodAndNode selector. - logSource ifTrue: - [self - logMethodSource: compilationCue source - forMethodWithNode: methodAndNode - inCategory: category - withStamp: changeStamp - notifying: requestor. - RecentMessages default - recordSelector: selector - forClass: methodAndNode method methodClass - inEnvironment: anEnvironment]. - self - addAndClassifySelector: selector - withMethod: methodAndNode method - inProtocol: category - notifying: requestor. - self instanceSide - noteCompilationOf: selector - meta: self isClassSide. - ^selector! From Marcel.Taeumel at hpi.de Fri Oct 9 19:22:36 2020 From: Marcel.Taeumel at hpi.de (Taeumel, Marcel) Date: Fri, 9 Oct 2020 19:22:36 +0000 Subject: [squeak-dev] how to raise a menu in the selector pane of the browser on windows (kinda urgent) In-Reply-To: References: , Message-ID: 3ButtonMouse should bei 1 by default on Windows machines. Then that preference works as expected. ________________________________ From: Squeak-dev on behalf of Eliot Miranda Sent: Friday, October 9, 2020 7:28:05 PM To: The general-purpose Squeak developers list Subject: Re: [squeak-dev] how to raise a menu in the selector pane of the browser on windows (kinda urgent) Ignore me. Swap mouse buttons does not make sense on WIndows. It does make sense on Mac. This inconsistency is, um, unfortunate. I routinely use the same image on WIndows and Mac and having to change preferences to be able to use the image is broken. Cross platform implies UI usability as much as platform API abstraction. On Fri, Oct 9, 2020 at 10:25 AM Eliot Miranda > wrote: Hi, I have an ASUS laptop with a "two button" track pad running Windows 10 Home Ed. I have default preferences in the ini file: 3ButtonMouse=0 1ButtonMouse=0 I have the "Swap mouse buttons" preference enabled (which AFAIA is appropriate for a two button mouse). I cannot find a magic key combination that raises the selector pane yellow/middle button menu, and hence cannot easily explore the method so I can investigate Chrustoph & Marcel's report of weirdness with thisContext method method in a block. _,,,^..^,,,_ best, Eliot -- _,,,^..^,,,_ best, Eliot -------------- next part -------------- An HTML attachment was scrubbed... URL: From herbertkoenig at gmx.net Fri Oct 9 19:33:46 2020 From: herbertkoenig at gmx.net (=?UTF-8?Q?Herbert_K=c3=b6nig?=) Date: Fri, 9 Oct 2020 21:33:46 +0200 Subject: [squeak-dev] Question about SoundGenerationPlugin/mixSampleCount In-Reply-To: <936dcefa487949d3aa4e5a89c6a46f0e@student.hpi.uni-potsdam.de> References: <936dcefa487949d3aa4e5a89c6a46f0e@student.hpi.uni-potsdam.de> Message-ID: <281d7ddb-fa87-0467-fc1b-3fedbf63a9ab@gmx.net> Hi Christoph, maybe you hit upon a stereo representation with interleaved channels? But then it should be 16 bit words, so not sure. Cheers, Herbert storeWAVSamplesOn: aBinaryStream     "Store this sound as a 16-bit Windows WAV file at the current SoundPlayer sampling rate. Store both channels if self isStereo is true; otherwise, store the left channel only as a mono sound." Am 09.10.2020 um 18:19 schrieb Thiede, Christoph: > > Hi all, > > > for a test, I am storing sounds into a ByteArray and read them again. > This works well for PluckedSounds, for example, but I found some > strange behavior when doing the same with SampledSounds: > > > sound := SampledSound new > setSamples: SampledSound coffeeCupClink > samplingRate: 12000. > > bytes := ByteArray streamContents: [:stream | > sound storeWAVSamplesOn: stream]. > > outputSound := SampledSound fromWaveStream: bytes readStream binary. > > > After running this script, I would expect outputSound to have the same > samples as sound. But actually, every byte in the SoundBuffer appears > twice! Still, playing the sound does not sound differently in my ears. > I traced the issue down and found out that > #mixSampleCount:into:startingAt:leftVol:rightVol: is writing every > byte four times on the stream - two would be okay for left and right > channel, but I do not understand the four. I reproduced the issue both > on Windows and Ubuntu (WSL). Disabling the primitive did not help either. > > > So I am wondering: Is this a bug or totally fine (because you cannot > hear a difference anyway)? If the latter is the case, how can I > compare the sounds else in a reliable way? If I store outputSound > again, the number of bytes is doubled again, so if you do certain > operations, your image will blow up exponentially ... > > > > For the context of this question, see also: > http://forum.world.st/Overriding-in-Graphics-and-Sounds-td5122783.html > > Best, > Christoph > -------------- next part -------------- An HTML attachment was scrubbed... URL: From eliot.miranda at gmail.com Fri Oct 9 19:50:34 2020 From: eliot.miranda at gmail.com (Eliot Miranda) Date: Fri, 9 Oct 2020 12:50:34 -0700 Subject: [squeak-dev] The Trunk: Tools-eem.997.mcz In-Reply-To: References: <169a6894fe884db0925d2388c7344538@student.hpi.uni-potsdam.de> Message-ID: Hi Marcel, Hi Christoph, Hi All, the bug is in CompiledMethod copying routines which do a deep copy in things like copyWithTrailerBytes:, used to set the source pointer, which is hard encoded in the method's trailer bytes and so may involve a becomeForward: to set a greater source pointer. It'll take me a little time to fix (a day or two) as I want to fully understand tis, and eliminate unnecessary copying and becomes. But at least we have a failing test for it now :-) On Fri, Oct 9, 2020 at 5:32 AM Marcel Taeumel wrote: > This is really interesting. There are two "versions" of the same method: > > > > Of course, only one of them is installed at the same time. > > Best, > Marcel > > Am 09.10.2020 14:20:23 schrieb Thiede, Christoph < > christoph.thiede at student.hpi.uni-potsdam.de>: > > Hi Eliot, > > > related question: Why does the following evaluate to false if I compile it > into a method (but evaluates correctly to true if I print it directly)? > > > [thisContext method method == thisContext home method] value > > > More confusingly, the following method returns false (compile it on any > class): > > > testBlock2 > > ^ [thisContext method method isInstalled] value > > (As a consequence, #browseMethod: in StandardToolSet opens a > VersionsBrowser instead of a regular browser if I say [thisContext method] > value browse ...) > > > Best, > > Christoph > > ------------------------------ > *Von:* Squeak-dev im > Auftrag von commits at source.squeak.org > *Gesendet:* Freitag, 9. Oktober 2020 10:03:50 > *An:* squeak-dev at lists.squeakfoundation.org; > packages at lists.squeakfoundation.org > *Betreff:* [squeak-dev] The Trunk: Tools-eem.997.mcz > > Eliot Miranda uploaded a new version of Tools to project The Trunk: > http://source.squeak.org/trunk/Tools-eem.997.mcz > > ==================== Summary ==================== > > Name: Tools-eem.997 > Author: eem > Time: 9 October 2020, 1:03:40.26529 am > UUID: fa6a5f48-cd96-4194-a00a-41ce1cc25bf7 > Ancestors: Tools-eem.996 > > Fix the ProcessBrowser's browse function for full blocks. > > =============== Diff against Tools-eem.996 =============== > > Item was changed: > ----- Method: ProcessBrowser>>browseContext (in category 'stack list') > ----- > browseContext > + ToolSet browseMethod: selectedContext home method! > - ToolSet browseMethod: selectedContext home! > > > > -- _,,,^..^,,,_ best, Eliot -------------- next part -------------- An HTML attachment was scrubbed... URL: -------------- next part -------------- A non-text attachment was scrubbed... Name: image.png Type: image/png Size: 119833 bytes Desc: not available URL: From commits at source.squeak.org Fri Oct 9 19:51:37 2020 From: commits at source.squeak.org (commits at source.squeak.org) Date: Fri, 9 Oct 2020 19:51:37 0000 Subject: [squeak-dev] The Trunk: Tests-eem.440.mcz Message-ID: Eliot Miranda uploaded a new version of Tests to project The Trunk: http://source.squeak.org/trunk/Tests-eem.440.mcz ==================== Summary ==================== Name: Tests-eem.440 Author: eem Time: 9 October 2020, 12:51:35.424652 pm UUID: 0ef6e6e7-af79-4a08-9a66-734fb771f2c2 Ancestors: Tests-eem.439 Provide a less superficial test for the full block method copying bug. test both the most superficial form of the bug and a deeper form. =============== Diff against Tests-eem.439 =============== Item was changed: ----- Method: CompilerTest>>foo (in category 'private') ----- foo + ^[{thisContext method method. thisContext home method}] value + + "CompilerTest compile: (CompilerTest sourceCodeAt: #foo) classified: #private" + "self new foo first == self new foo second"! - ^[{thisContext method method. thisContext home method}] value! Item was added: + ----- Method: CompilerTest>>fubar (in category 'private') ----- + fubar + ^[[[[{thisContext method method. thisContext home method}] value ] value ] value ] value + + "CompilerTest compile: (CompilerTest sourceCodeAt: #fubar) classified: #private" + "self new fubar first == self new fubar second"! Item was changed: ----- Method: CompilerTest>>testValidFullBlockMethod (in category 'tests - code generation') ----- testValidFullBlockMethod + "Check that the full block system creates properly connected methods + whose constituent blocks refer back to the correct method." + #(foo fubar) do: + [:selector| | fooMethod | + fooMethod := self class >> selector. + fooMethod encoderClass supportsFullBlocks ifFalse: + [self class compileMethodToUseFullBlocks: selector. + fooMethod := self class >> selector]. + self assert: fooMethod encoderClass supportsFullBlocks. + self assert: ((fooMethod literalAt: 1) isCompiledCode and: [(fooMethod literalAt: 1) isCompiledBlock]). + self assert: (fooMethod literalAt: 1) method == fooMethod. + "And if it looks safe to do so, actually run foo and check its result" + (CompiledCode primaryBytecodeSetEncoderClass supportsFullBlocks + or: [CompiledCode secondaryBytecodeSetEncoderClass supportsFullBlocks]) ifTrue: + [self assert: {fooMethod. fooMethod } equals: (self perform: selector)]]! - | fooMethod | - fooMethod := self class >> #foo. - fooMethod encoderClass supportsFullBlocks ifFalse: - [self class compileMethodToUseFullBlocks: #foo. - fooMethod := self class >> #foo]. - self assert: fooMethod encoderClass supportsFullBlocks. - self assert: ((fooMethod literalAt: 1) isCompiledCode and: [(fooMethod literalAt: 1) isCompiledBlock]). - self assert: (fooMethod literalAt: 1) method == fooMethod. - "And if it looks safe to do so, actually run foo and check its result" - (CompiledCode primaryBytecodeSetEncoderClass supportsFullBlocks - or: [CompiledCode secondaryBytecodeSetEncoderClass supportsFullBlocks]) ifTrue: - [self assert: {fooMethod. fooMethod } equals: self foo]! From forums.jakob at resfarm.de Fri Oct 9 19:54:37 2020 From: forums.jakob at resfarm.de (Jakob Reschke) Date: Fri, 9 Oct 2020 21:54:37 +0200 Subject: [squeak-dev] Development methodology (was: tedious programming-in-the-debugger error needs fixing) In-Reply-To: References: <23476c3e0a68492c8cc917c38ba2c9d4@student.hpi.uni-potsdam.de> <1601475775699-0.post@n4.nabble.com> <1601590406774-0.post@n4.nabble.com> <076817EE-1506-47F9-9AF4-3126C6D3BC76@rowledge.org> <1601860447473-0.post@n4.nabble.com> Message-ID: Hi Chris, Thanks for still participating! Am Fr., 9. Okt. 2020 um 01:33 Uhr schrieb Chris Muller : >> >> What exactly do you think is so massive about Git? > > > I wanted to grok git by approaching it via its public API. With my new GraphQL expertise, I figured I could spank out a client prototype in an evening. Then I found the schema: > > https://docs.github.com/en/free-pro-team at latest/graphql/overview/public-schema > Oh, the GitHub GraphQL API is definitely not Git! Git has nothing to say about GraphQL, nor does it say anything about issues, apps, gists, reactions, pull requests, ... just to name a few. > > A lot of extra, ignorable features, basically is the definition of over-engineered. Don't get me wrong, it's a great tool for developers with your level of expertise. I'm more of a "user", though, the extra stuff is harder for me. > Git was built with some technical goals in mind and a sane user interface appeared only gradually over its first years. That supports your impression. Alternative user interfaces have been suggested on top of the data model. https://gitless.com/ for example. The Git Browser uses some of its concepts, such as not having a staging area and selecting what's in and out of a commit while creating the new version, just like Monticello. Gitless is just a different command line UI, everything that is going on in the repository is just the same. Like TortoiseGit and the Git Browser are just different graphical user interfaces, the former for files, the latter for objects. Conclusion: the "extraneous" features of the tools serve a purpose in their specific context. Since we have a different context, we will build different tools of course. That does not remove any of the advantages of using Git as a repository, or versions database if you will. A database with advanced tool support out in the world for various needs, such as collaboration supported by platforms like GitHub. That is an option, but it can be a useful one. I would like to make a pun of the "ignorable" features: the Git index or staging area, for example, is a means to achieve the partial commit feature that Eliot mentioned Vanessa has added to Monticello (i. e. the "ignore" feature). But the Git command line user interface lives in a world of bytes, text, and files (instead of specialized objects) and command lines (instead of graphical tools). You could say that this ignore variable of the MCSaveDialog is the negated equivalent of the index. > > Support for branching was added to Monticello in 2012. See MCVersionNameTest>>#testBranches. Eliot used them during development of cog or spur, but I'm not aware of this feature having been all that critical for Squeak. We tend to like just one master branch with occasional releases. But, it's there and basically achieves the needed functionality. > But it is a hidden feature because nothing in the UI indicates its existence, right? This makes it harder to use. Also it is piggy-backed on a different concept (version names), that's why I consider this a workaround about the limitations of the data model. Also your statement does not address the problems of branching in a multi-package project that I wrote about in the earlier long message. > > I thought the social benefits (exposure and growth, I guess) were via exposure to the github user base. If we hosted ourselves, would it be any different than the "deserted island" situation we have now? That's all what I was referring to. I thought the purpose was for the exposure. If you have to host yourself anyway then we're basically down to a tool comparison? > You do not *have to* host yourself. :-) But you could if you don't trust the corporate (yet very open-source-supporting) GitHub. The social benefits of exposure do also exist, but it was not in the focus of this thread. That was an improved development process with regards to the easier tracking of contributions. For example, if you re-work your inbox submission and create another version, it will open another thread on the mailing list, with no traceable connection to the previous conversation. Not so with pull requests on GitHub (or whatever they are called on the alternatives to GitHub), if you update your submission on the same branch (even if you replace the commits that you sent before), the old conversation is still attached to the pull request. By the way, that is something you could trace via that exhaustive GitHub GraphQL API if you wanted to build a Squeak interface to GitHub pull requests. ;-) Sure it seems overwhelming, but who says that you have to consume and support it all? It just offers a lot of options, at your service... I don't think this is a bad thing. >> >> Chris Muller-3 wrote >> >> > For example, you could submit an >> > improvement that allows original contributors of Inbox items to move them >> > to Treated themself. >> >> How? Only Trunk committers have access to the Squeaksource treating backend, >> so neither the code nor the tool is available to normal users for >> improvement. Guest users cannot even delete versions from the inbox >> repository, can they? > > > It's public read, anyone can access the code and submit improvements to the Inbox. But, I agree, it'd be nice if there were a way for strangers to contribute more obviously. One idea would be for each SqueakSource repository to have it's own internal "Inbox" Repository to support some of these features... > That would be a nice first step towards something like pull requests for projects other than Trunk. But you didn't address that submitters cannot move their own contributions to Treated, even if they wanted to. > > The point is Monticello is relatively small, simple, and malleable, and this makes it feasible to improve, even if getting it implemented requires writing email. > Tools on top of the Git data model would also be malleable. Writing email is not the primary issue here (except for the generational favoring of platforms over mailing lists maybe). Integrating the conversation with the code contributions is. As we said, if we were to use GitHub, we should make sure to tie in the conversations there into the mailing lists, just like it has been done for OpenSmalltalk-VM. > Monticello does suffer from some scalability issues that will eventually need to be addressed. When is the eventual time? Git is one possible solution to the scalability problem. One solution where you don't have to reinvent the hosting software. One solution that already has a pure-Smalltalk implementation. > > But the redundancy among versions is a feature, not a flaw. To this day, planes have poor internet access, this redundancy is about availability. In the Magma-based, there is only one instance of each MCDefinition shared amongst all Versions, but not everyone set that up on their laptop (I made it as easy as I could). > Git uses similar value object sharing in its data model. :-) And if you clone a Git repository, you have it right on your laptop. If you download a single Monticello version and go offline, you just have one snapshot and an ancestry where you cannot look at the past snapshots. With a Git repository, you typically have everything at your hands. Of course you shouldn't clone the repository just to install some package (as opposed to develop it). The download-to-install use case is typically satisfied by explicit releases where you put an archive or installer somewhere. Monticello also fills this role currently, next to SqueakMap. In the Git world, there are typically web interfaces that allow you to download just one particular snapshot. Metacello uses the particular HTTP interface of GitHub to download a zip, for example. > > What I had wanted to do start by sucking in their GraphQL schema into my fantastic new GraphQL Engine, and map their types to the Monticello types. Basically appear to BE a Git server, but mapped behind the scenes to legacy MC repos that could be accessed via the legacy way, for users that wanted to. > Hmm this breaks down because that schema is not just about Git, it is also about all of GitHub as indicated above. So your server that implements the whole schema would really be another GitHub server, not another Git server. The basic objects of Git are just blobs, trees, commits, tags, and refs. But this is not the abstraction level of an MCDefinition. There is no point to have an MCTreeDefinition. Instead you would map your MCSomethingDefinition into a tree of blobs and store that in the Git repository. Blobs, trees, and commits would be handled by the MCRepository subclass and something like the MCWriters and MCReaders instead. Does this make sense to you? To be a Git server, you need to be able to manipulate repositories and to provide the fetch and push interface. For repositories, the Smalltalk code is already there. For the interface, only the client side of the protocols is implemented in Smalltalk yet. Kind regards, Jakob From leves at caesar.elte.hu Fri Oct 9 23:03:59 2020 From: leves at caesar.elte.hu (Levente Uzonyi) Date: Sat, 10 Oct 2020 01:03:59 +0200 (CEST) Subject: [squeak-dev] assert:equals: in Object In-Reply-To: References: Message-ID: Hi Eliot, On Fri, 9 Oct 2020, Eliot Miranda wrote: > Hi All, > >     moving code from a test into a workspace and back is painful because Object does not implement assert:equals: or assert:equals:description: even though it implements assert:description:.  So one has to edit out the > equals: moving to the workspace and edit it back in again on the way back.  I'd like to suggest implementing Object>>assert:equals: and Object>>assert:equals:description: but I won't, because someone is bound to criticise it > as being too green or ill considered or some other depressing BS. In my opinion, it would be better to get rid of #assert:equals: and #assert:equals:description:. Many find the order of its arguments confusing, and they are only good to help tracking down what failed. If #assert: could give information about it's argument: the source code and probably the values of the variables in it, then #assert:equals: would simply become unnecessary. For example | x y | x := 'foo'. y := 1. self assert: x = y. would signal an exception with the message 'Assertion failed: x = y (x = ''foo'', y = 1)' instead of just 'Assertion failed'. Levente > _,,,^..^,,,_ > best, Eliot > > From lecteur at zogotounga.net Fri Oct 9 23:58:09 2020 From: lecteur at zogotounga.net (=?UTF-8?Q?St=c3=a9phane_Rollandin?=) Date: Sat, 10 Oct 2020 01:58:09 +0200 Subject: [squeak-dev] [ANN] New update on my current work Message-ID: <1a3d8dec-45d6-36e2-c859-fa02849ebe50@zogotounga.net> Hello all, I just uploaded a new image introducing my current work, with notably the development snapshot of a 2.5D game engine. It is all explained here: http://www.zogotounga.net/comp/squeak/rogue.htm Stef From commits at source.squeak.org Sat Oct 10 02:18:27 2020 From: commits at source.squeak.org (commits at source.squeak.org) Date: Sat, 10 Oct 2020 02:18:27 0000 Subject: [squeak-dev] The Trunk: Kernel-eem.1348.mcz Message-ID: Eliot Miranda uploaded a new version of Kernel to project The Trunk: http://source.squeak.org/trunk/Kernel-eem.1348.mcz ==================== Summary ==================== Name: Kernel-eem.1348 Author: eem Time: 9 October 2020, 7:18:24.987162 pm UUID: 006721f7-6f3b-44fa-86f3-8c661d950fa4 Ancestors: Kernel-eem.1347 Fix the wrong outer code bug (see CompilerTest>>testValidFullBlockMethod) and recompile all offending methods. =============== Diff against Kernel-eem.1347 =============== Item was added: + ----- Method: CompiledBlock>>copyWithOuterCode: (in category 'private-copying') ----- + copyWithOuterCode: aCompiledCode + "Private; answer a shallow copy of the receiver updated with deep copies of + embedded block methods and a reference to aCompiledCode as the outer code." + | numLiterals copy | + copy := self shallowCopy. + 1 to: (numLiterals := self numLiterals) - 1 do: + [:i| | lit | + (lit := copy literalAt: i) isCompiledCode ifTrue: + [copy literalAt: i put: (lit copyWithOuterCode: copy)]]. + copy literalAt: numLiterals put: aCompiledCode. + ^copy! Item was removed: - ----- Method: CompiledCode>>copyWithTrailerBytes: (in category 'copying') ----- - copyWithTrailerBytes: trailer - "Testing: - (CompiledMethod compiledMethodAt: #copyWithTrailerBytes:) - tempNamesPut: 'copy end ' - " - | copy end start | - start := self initialPC. - end := self endPC. - copy := trailer createMethod: end - start + 1 class: self class header: self header. - 1 to: self numLiterals do: [:i | copy literalAt: i put: (self literalAt: i)]. - start to: end do: [:i | copy at: i put: (self at: i)]. - copy postCopy. - ^copy! Item was added: + ----- Method: CompiledMethod>>copyWithTrailerBytes: (in category 'copying') ----- + copyWithTrailerBytes: trailer + "Testing: + CompiledMethod >> #copyWithTrailerBytes: + copyWithTempsFromMethodNode: (CompiledMethod >> #copyWithTrailerBytes:) methodNode" + | copy end start | + start := self initialPC. + end := self endPC. + copy := trailer createMethod: end - start + 1 class: self class header: self header. + 1 to: self numLiterals do: + [:i | | lit | + lit := self literalAt: i. + copy literalAt: i put: ((lit isCompiledCode and: [lit isCompiledBlock]) + ifTrue: [lit copyWithOuterCode: copy] + ifFalse: [lit])]. + start to: end do: [:i | copy at: i put: (self at: i)]. + copy postCopy. + ^copy! Item was changed: + (PackageInfo named: 'Kernel') postscript: '"recompile all methods containing blocks with the wrong outerCode" + (self systemNavigation allMethodsSelect: [:m| m literals anySatisfy: [:l| l isCompiledCode and: [l isCompiledBlock and: [l outerCode ~~ m]]]]) do: + [:mr| mr actualClass recompile: mr selector]'! - (PackageInfo named: 'Kernel') postscript: 'EventSensor default installInterruptWatcher.'! From commits at source.squeak.org Sat Oct 10 02:49:53 2020 From: commits at source.squeak.org (commits at source.squeak.org) Date: Sat, 10 Oct 2020 02:49:53 0000 Subject: [squeak-dev] The Trunk: Kernel-eem.1349.mcz Message-ID: Eliot Miranda uploaded a new version of Kernel to project The Trunk: http://source.squeak.org/trunk/Kernel-eem.1349.mcz ==================== Summary ==================== Name: Kernel-eem.1349 Author: eem Time: 9 October 2020, 7:49:50.4607 pm UUID: 6db35c96-122e-414f-bf75-c74d07149f49 Ancestors: Kernel-eem.1348 Neaten CompiledMethod>>#setSourcePointer:, avoiding unnecessary copies and becomes, bu=y refactoring CompiledMethodTrailer>>#createMethod:class:header: into copyToMethod:. Nuke the unsent method dropSourcePointer which is a duplicate of the much older (but also un sent) method zapSourcePointer. =============== Diff against Kernel-eem.1348 =============== Item was removed: - ----- Method: CompiledMethod>>dropSourcePointer (in category 'source code management') ----- - dropSourcePointer - self trailer hasSourcePointer ifTrue: [ - self becomeForward: - (self copyWithTrailerBytes: - (CompiledMethodTrailer new sourceCode: self getSource))] - ! Item was changed: ----- Method: CompiledMethod>>setSourcePointer: (in category 'source code management') ----- setSourcePointer: srcPointer + "We can't necessarily change the trailer of existing method, since + it could have a completely different format. If so, generate a copy + with a new trailer, containing a srcPointer, and then become it." + | newTrailer myTrailer | + myTrailer := self trailer. + srcPointer = 0 + ifTrue: "catch the common case of setting the source pointer to 0 when already 0" + [myTrailer sourcePointer = 0 ifTrue: + [^self]. + newTrailer := CompiledMethodTrailer empty] - "We can't change the trailer of existing method, since it could have a - completely different format. Therefore we need to generate a copy - with new trailer, containing a srcPointer, and then #become it." - | trailer copy start | - trailer := srcPointer = 0 - ifTrue: "catch the common case of setting the source pointer to 0 when already 0" - [self sourcePointer = 0 ifTrue: - [^self]. - CompiledMethodTrailer empty] - ifFalse: - [CompiledMethodTrailer new sourcePointer: srcPointer]. - copy := self copyWithTrailerBytes: trailer. - - "ar 3/31/2010: Be a bit more clever since #become: is slow. - If the old and the new trailer have the same size, just replace it." - (self trailer class == trailer class and:[self size = copy size]) - ifTrue: - [start := self endPC + 1. - self replaceFrom: start to: self size with: copy startingAt: start] ifFalse: + [newTrailer := CompiledMethodTrailer new sourcePointer: srcPointer]. + (myTrailer size = newTrailer size + and: [myTrailer kind = newTrailer kind]) ifTrue: + [^newTrailer copyToMethod: self]. - [self becomeForward: copy]. + ^self becomeForward: (self copyWithTrailerBytes: newTrailer)! - ^self "will be copy if #become was needed" - ! Item was added: + ----- Method: CompiledMethodTrailer>>copyToMethod: (in category 'creating a method') ----- + copyToMethod: aCompiledMethod + "Copy the encoded trailer data to aCompiledMethod. Answer aCompiledMethod." + | delta | + delta := aCompiledMethod size - self size. + 1 to: size do: + [:i | aCompiledMethod at: delta + i put: (encodedData at: i)]. + ^aCompiledMethod! Item was changed: ----- Method: CompiledMethodTrailer>>createMethod:class:header: (in category 'creating a method') ----- + createMethod: numberOfBytesForAllButTrailer class: aCompiledMethodClass header: headerWord + "Answer a new compiled method of the given class, headerWord (which defines the number of literals) + and with the receiver asd its encoded trailer." + ^self copyToMethod: (aCompiledMethodClass newMethod: numberOfBytesForAllButTrailer + self size header: headerWord)! - createMethod: numberOfBytesForAllButTrailer class: aCompiledMethodClass header: headerWord - | meth delta | - encodedData ifNil: [self encode]. - - meth := aCompiledMethodClass newMethod: numberOfBytesForAllButTrailer + size header: headerWord. - "copy the encoded trailer data" - delta := meth size - size. - 1 to: size do: - [:i | meth at: delta + i put: (encodedData at: i)]. - - ^meth! Item was changed: ----- Method: CompiledMethodTrailer>>size (in category 'accessing') ----- size "Answer the size of method's trailer , in bytes" + encodedData ifNil: [self encode]. + ^size! - ^ size! From edgardec2005 at gmail.com Sat Oct 10 08:56:09 2020 From: edgardec2005 at gmail.com (Edgar J. De Cleene) Date: Sat, 10 Oct 2020 05:56:09 -0300 Subject: [squeak-dev] [ANN] New update on my current work In-Reply-To: <1a3d8dec-45d6-36e2-c859-fa02849ebe50@zogotounga.net> Message-ID: Thanks for your work. And could you make a 64 bit version ? Mac users of Big Sur need all was 64 bits. On 10/9/20, 8:58 PM, "Stéphane Rollandin" wrote: > Hello all, I just uploaded a new image introducing my current work, with > notably the development snapshot of a 2.5D game engine. It is all explained > here: http://www.zogotounga.net/comp/squeak/rogue.htm Stef From gettimothy at zoho.com Sat Oct 10 09:52:12 2020 From: gettimothy at zoho.com (gettimothy) Date: Sat, 10 Oct 2020 05:52:12 -0400 Subject: [squeak-dev] The XML libraries run fine on Squeak 6 alpha In-Reply-To: References: Message-ID: <17511ecccc8.d3d8582b50536.4393324238923497400@zoho.com> Hi Levente, thanks for doing that analysis. The work on decoupling XTreams from the XML makes little sense then. "Just accept" the conflict on a per-project basis and devote time to more important projects. let me know if you disagree. cheers.   ---- On Mon, 05 Oct 2020 15:51:13 -0400 Levente Uzonyi wrote ---- -1 After a bit of analysis, I came to the conclusion that it would be a bad idea to include those packages in the Trunk. Why? 1. There are more important things than XML 2. These packages are huge 3. The code is not backwards compatible 4. It would introduce parallel collection hierarchies which would cause confusion 5. Some undeclared variables Details: 1. There are more important things than XML I think there's not much to say here. Among the serialization formats, JSON, YAML are far more popular than XML nowadays. Yet, we have neither supported in the Trunk (apart from a minimal hence incomplete JSON implementation in WebClient. It's really amazing how small it is though.) 2. These packages are huge The current version of the XML-Parser in Trunk has the following stats: classes: 26 methods: 379 linesOfCode: 2069 It's obviously incomplete though. The proposed packages have the following stats: classes: 758 (21.5% of all classes in the Trunk including the XML packages) methods: 10129 (14%) linesOfCode: 73897 (13.7%) That's 25x-35x more than the current implementation. When the packages are loaded in the current Trunk image, they take up 21.5%, 14%, 13.7% of all classes, methods, linesOfCode, respectively. One could say that the extensive tests are responsible for the bloat, but no, it's probably related to the complexity of XML. Without tests, the numbers are: classes: 512 (15.6%) methods: 6744 (9.8%) linesOfCode: 32886 (6.6%) I don't think XML is important enough in general to justify those numbers. 3. The code is not backwards compatible The code is not a drop-in replacement. The interface is different. Code using the current package would have to be migrated. 4. It would introduce parallel collection hierarchies which would cause confusion The code uses various collections similar to those in the Trunk but not compatible with them and not in the same class hierarchy: BitmapCharcterSet - An independent character set implementation. Not a subclass of CharacterSet. StandardOrderedDictioanry (and its 5 subclasses) - An alternative to OrderedDictionary implementation. A subclass of Collection, so not part of the HashedCollection hierarchy (for good reasons). If these were part of the Trunk, one could be wondering which one to use: OrderedDictionary or OrderPreservingDictionary? What's the difference? Maybe StandardOrderedDictionary? 5. Some undeclared variables The code is written with compatibility in mind, so it supports Pharo and Squeak. Even if you use Squeak, code related to Zinc, Pharo's HTTP library will still be loaded directly referencing Zinc's classes. Without going any deeper, I think the best would be to not include these packages in the Trunk. I'd go even further: I would remove the current XML-Parser as well but provide an easy way to load either version. That way the image would be smaller, simpler. If we had the CI infrastructure (we probably have, but I'm not sure), we could even test whether these packages work as expected, and treat them as official external packages. There's currently one method that depends on the XML-Parser package in Trunk: SugarLauncher >> #gconfPropertiesAt:. It uses the current XML-Parser API, so even if we decide to include the more complete XML implementation in Trunk, we will still have to change it to make it work. Levente On Mon, 5 Oct 2020, Eliot Miranda wrote: > Hi All, > > votes for & against inclusion of Monty’s XML in trunk/6 beta? > > +1 > > _,,,^..^,,,_ (phone) > >> On Oct 4, 2020, at 12:44 PM, monty wrote: >> >> Installing the (head)s of: >> XMLParser (which loads "XMLWriter" too) >> XMLParser-XPath (be careful not to install the old, unfinished "XPath" project) >> XMLParser-StAX >> XMLParser-HTML >> from the SqueakMap works fine; all the tests still pass. XMLParser installation still pops up a warning you have to click through b/c of a conflict with the old XMLParser in the image, but it's fine other than that. >> >> Supposedly there are conflicts with XStreams, but I have nothing to do with that. >> >> An aside: some tests are skipped by default because they rely on external resources, like the file system or HTTP, which makes it easier to distinguish real regressions from something like a network outage. The skipping is more obvious on Pharo because their TestCase has a #skip message that the TestRunner UI supports. On Squeak these tests just silently pass. To run them, send XMLSkippableTest #stopSkippingAll. Unfortunately b/c of the W3C rate limiting, the tests using xhtml DTDs timeout if you run them more than once. You could say they should be cached (the default resolver does just that), but the purpose of these tests is to test real HTTP retrieval, so that defeats the purpose. >> ___ >> montyos.wordpress.com >> >> -------------- next part -------------- An HTML attachment was scrubbed... URL: From lecteur at zogotounga.net Sat Oct 10 10:08:28 2020 From: lecteur at zogotounga.net (=?UTF-8?Q?St=c3=a9phane_Rollandin?=) Date: Sat, 10 Oct 2020 12:08:28 +0200 Subject: [squeak-dev] [ANN] New update on my current work In-Reply-To: References: Message-ID: Le 10/10/2020 à 10:56, Edgar J. De Cleene a écrit : > Thanks for your work. > And could you make a 64 bit version ? Mac users of Big Sur need all was 64 > bits. Ah, ok, I'll do so. Best, Stef From hilaire at drgeo.eu Sat Oct 10 13:12:51 2020 From: hilaire at drgeo.eu (Hilaire) Date: Sat, 10 Oct 2020 15:12:51 +0200 Subject: [squeak-dev] Why it's clear Squeak is never going to be the Dynabook (was: The Trunk: Chronology-Core-eem.61.mcz) In-Reply-To: References: Message-ID: Hi Chris! The Cuis-Smalltalk API seems to be simpler, although I can't tell about its quality. https://cuis-smalltalk.github.io/#/Kernel-Chronology I will be curious to read your opinion about it. Hilaire Le 09/10/2020 à 09:00, Chris Muller a écrit : > I have to get this off my chest.  Is anyone proud of this smorgasbord > of various clock values available in our, uh, "API". > -- Dr. Geo http://drgeo.eu https://pouet.chapril.org/@hilaire From eliot.miranda at gmail.com Sat Oct 10 13:29:07 2020 From: eliot.miranda at gmail.com (Eliot Miranda) Date: Sat, 10 Oct 2020 06:29:07 -0700 Subject: [squeak-dev] The XML libraries run fine on Squeak 6 alpha In-Reply-To: References: Message-ID: Hi All, > On Oct 5, 2020, at 5:01 PM, monty wrote: > > I believe I suggested the same thing you did (just removing the old parser from the image, which would remove the warning during SM installation). Cool, there seems to be consensus fir removing. Thinking about implementing this I thought off the top of my head that having a postscript in a suitable package, Installer UpdateStream etc, that asked the used dud they want the package unloaded, would work. Am I right to think that if and when we remove the package from the update map nothing will happen other than the package will no longer be subject to automatic updates? > > The undeclared global var refs to Zinc classes were mistakenly left in during development (done on Pharo), and will be made indirect like other Zn class refs. (The offending methods are in classes that aren't used unless Zinc is installed, which is why they don't cause any Squeak test failures.) > ___ > montyos.wordpress.com > > From gettimothy at zoho.com Sat Oct 10 14:03:08 2020 From: gettimothy at zoho.com (gettimothy) Date: Sat, 10 Oct 2020 10:03:08 -0400 Subject: [squeak-dev] Getting from GitBrowser to the System Browser . + Woot! In-Reply-To: References: <174f39b350f.b3bca56534674.418444634630814984@zoho.com> <174f3d67e8e.fe39606835178.775127364609810974@zoho.com> Message-ID: <17512d28834.f5ee994d51958.1307952083023632237@zoho.com> Hi folks I have been hunting down why my  Transcript clear. Metacello new     repository: 'github://tom95/Roassal3';     baseline: 'Roassal3';     load. is erroring out. Here is the initial process which I have done: pristine image Preference Wizard last page install git, refactor etc. Installer ensureRecentMetacello SquitAddRemote >>remoteName ^ remoteName ifNil: [String empty] ifNotNil: [remoteName asString] Manually unload all three tonel packages using the Monticello Browser MonticelloTonel-Core MonticelloTonel-FileSystem MonticelloTonel-Tests and then running: Metacello new      repository: 'github://squeak-smalltalk/squeak-tonel:squeak';      baseline: 'Tonel';      load. A couple of things. TonelFileUtils install is not being automatically run . this populates the Current class instance variable needed or the TonelFilueUtils > current class side call. Then, in  TonelRepository >> directoryFromFileName: aString "Answer the reference to the directory represented by the 'file name'." ^ self fileUtils directoryFromPath: (self class directoryNameFromFileName: aString) relativeTo: self directory is throwing an SubclassResponsibility signal because  TonelFileUtils class >> directoryFromPath: directoryPath relativeTo: aDirectory    self subclassResponsibility What I presume we want is a TonelFileSystemUtils... so....in  TonelFileUtils class >> install    Current := self make it: TonelFileUtils class >>install    Current := TonelFileSystemUtils Install proceeds as previously described and RSChartExample new example01Markers open. works. Woot! -------------- next part -------------- An HTML attachment was scrubbed... URL: From gettimothy at zoho.com Sat Oct 10 14:09:48 2020 From: gettimothy at zoho.com (gettimothy) Date: Sat, 10 Oct 2020 10:09:48 -0400 Subject: [squeak-dev] Roassal next steps. Message-ID: <17512d8a134.bc18650752020.4064004373768089549@zoho.com> Hi folks. First, thank you for your help. Very cool to see a Roassal3 thing in Squeak RSChartExample new example01Markers open. WOOT! Next up. How do you recommend I proceed to contribute to this project? As a first step, I tried Roassal3-Global-Tests-Core   and all fail on Announcer(Object) DNU Do we need Announcments? Or AXAnnouncements in squeak? What then? Work from the inside out of the Metacello install specs? cheers. t -------------- next part -------------- An HTML attachment was scrubbed... URL: From lecteur at zogotounga.net Sat Oct 10 14:16:35 2020 From: lecteur at zogotounga.net (=?UTF-8?Q?St=c3=a9phane_Rollandin?=) Date: Sat, 10 Oct 2020 16:16:35 +0200 Subject: [squeak-dev] [ANN] New update on my current work In-Reply-To: References: Message-ID: <1e1a4123-85c8-75c4-c2d4-1490384f3da4@zogotounga.net> The image is now 64 bit: http://www.zogotounga.net/comp/squeak/rogue.htm Stef From gettimothy at zoho.com Sat Oct 10 14:40:50 2020 From: gettimothy at zoho.com (gettimothy) Date: Sat, 10 Oct 2020 10:40:50 -0400 Subject: [squeak-dev] [ANN] New update on my current work In-Reply-To: <1e1a4123-85c8-75c4-c2d4-1490384f3da4@zogotounga.net> References: <1e1a4123-85c8-75c4-c2d4-1490384f3da4@zogotounga.net> Message-ID: <17512f50cf0.db264a4d52239.4925269396691324057@zoho.com> cool stuff! thx ---- On Sat, 10 Oct 2020 10:16:35 -0400 Stéphane Rollandin wrote ---- The image is now 64 bit: http://www.zogotounga.net/comp/squeak/rogue.htm Stef -------------- next part -------------- An HTML attachment was scrubbed... URL: From karlramberg at gmail.com Sat Oct 10 15:06:51 2020 From: karlramberg at gmail.com (karl ramberg) Date: Sat, 10 Oct 2020 17:06:51 +0200 Subject: [squeak-dev] Question about SoundGenerationPlugin/mixSampleCount In-Reply-To: <936dcefa487949d3aa4e5a89c6a46f0e@student.hpi.uni-potsdam.de> References: <936dcefa487949d3aa4e5a89c6a46f0e@student.hpi.uni-potsdam.de> Message-ID: Eliot did some rework on the sound plugin a few months back. How new is your VM ? Best, Karl On Fri, Oct 9, 2020 at 6:19 PM Thiede, Christoph < Christoph.Thiede at student.hpi.uni-potsdam.de> wrote: > Hi all, > > > for a test, I am storing sounds into a ByteArray and read them again. This > works well for PluckedSounds, for example, but I found some strange > behavior when doing the same with SampledSounds: > > > sound := SampledSound new > > setSamples: SampledSound coffeeCupClink > > samplingRate: 12000. > > > bytes := ByteArray streamContents: [:stream | > > sound storeWAVSamplesOn: stream]. > > > outputSound := SampledSound fromWaveStream: bytes readStream binary. > > > After running this script, I would expect outputSound to have the same > samples as sound. But actually, every byte in the SoundBuffer appears > twice! Still, playing the sound does not sound differently in my ears. I > traced the issue down and found out that #mixSampleCount:into:startingAt:leftVol:rightVol: > is writing every byte four times on the stream - two would be okay for left > and right channel, but I do not understand the four. I reproduced the issue > both on Windows and Ubuntu (WSL). Disabling the primitive did not help > either. > > > So I am wondering: Is this a bug or totally fine (because you cannot hear > a difference anyway)? If the latter is the case, how can I compare the > sounds else in a reliable way? If I store outputSound again, the number > of bytes is doubled again, so if you do certain operations, your image will > blow up exponentially ... > > > For the context of this question, see also: > http://forum.world.st/Overriding-in-Graphics-and-Sounds-td5122783.html > > Best, > Christoph > > -------------- next part -------------- An HTML attachment was scrubbed... URL: From tim at rowledge.org Sat Oct 10 17:13:48 2020 From: tim at rowledge.org (tim Rowledge) Date: Sat, 10 Oct 2020 10:13:48 -0700 Subject: [squeak-dev] [ANN] New update on my current work In-Reply-To: <1e1a4123-85c8-75c4-c2d4-1490384f3da4@zogotounga.net> References: <1e1a4123-85c8-75c4-c2d4-1490384f3da4@zogotounga.net> Message-ID: <9D6A3E7C-84E9-4653-A00D-6C835E22DE61@rowledge.org> > On 2020-10-10, at 7:16 AM, Stéphane Rollandin wrote: > > The image is now 64 bit: > > http://www.zogotounga.net/comp/squeak/rogue.htm Works just fine on my iMac. That's interesting stuff. tim -- tim Rowledge; tim at rowledge.org; http://www.rowledge.org/tim Strange OpCodes: PWB: Put to Waste Basket From eliot.miranda at gmail.com Sat Oct 10 19:01:14 2020 From: eliot.miranda at gmail.com (Eliot Miranda) Date: Sat, 10 Oct 2020 12:01:14 -0700 Subject: [squeak-dev] Question about SoundGenerationPlugin/mixSampleCount In-Reply-To: <281d7ddb-fa87-0467-fc1b-3fedbf63a9ab@gmx.net> References: <281d7ddb-fa87-0467-fc1b-3fedbf63a9ab@gmx.net> Message-ID: Hi Herbert, Hi Christoph, > On Oct 9, 2020, at 12:33 PM, Herbert König wrote: > >  Hi Christoph, > > maybe you hit upon a stereo representation with interleaved channels? But then it should be 16 bit words, so not sure. That’s right. The sound output primitive takes interleaved (alternating left/right, signed) 16-bit samples. So the mix down methods mix from whatever the representation into this stereo representation. > > Cheers, > > Herbert > > storeWAVSamplesOn: aBinaryStream > "Store this sound as a 16-bit Windows WAV file at the current SoundPlayer sampling rate. Store both channels if self isStereo is true; otherwise, store the left channel only as a mono sound." > > Am 09.10.2020 um 18:19 schrieb Thiede, Christoph: >> Hi all, >> >> >> >> for a test, I am storing sounds into a ByteArray and read them again. This works well for PluckedSounds, for example, but I found some strange behavior when doing the same with SampledSounds: >> >> >> >> sound := SampledSound new >> setSamples: SampledSound coffeeCupClink >> samplingRate: 12000. >> >> bytes := ByteArray streamContents: [:stream | >> sound storeWAVSamplesOn: stream]. >> >> outputSound := SampledSound fromWaveStream: bytes readStream binary. >> >> >> After running this script, I would expect outputSound to have the same samples as sound. But actually, every byte in the SoundBuffer appears twice! Still, playing the sound does not sound differently in my ears. I traced the issue down and found out that #mixSampleCount:into:startingAt:leftVol:rightVol: is writing every byte four times on the stream - two would be okay for left and right channel, but I do not understand the four. I reproduced the issue both on Windows and Ubuntu (WSL). Disabling the primitive did not help either. >> >> >> >> So I am wondering: Is this a bug or totally fine (because you cannot hear a difference anyway)? If the latter is the case, how can I compare the sounds else in a reliable way? If I store outputSound again, the number of bytes is doubled again, so if you do certain operations, your image will blow up exponentially ... >> >> >> For the context of this question, see also: http://forum.world.st/Overriding-in-Graphics-and-Sounds-td5122783.html >> >> Best, >> Christoph >> >> > > -------------- next part -------------- An HTML attachment was scrubbed... URL: From gettimothy at zoho.com Sun Oct 11 07:40:32 2020 From: gettimothy at zoho.com (gettimothy) Date: Sun, 11 Oct 2020 03:40:32 -0400 Subject: [squeak-dev] TonelFileSystemutils initialize not being run automatically? In-Reply-To: <17512d28834.f5ee994d51958.1307952083023632237@zoho.com> References: <174f39b350f.b3bca56534674.418444634630814984@zoho.com> <174f3d67e8e.fe39606835178.775127364609810974@zoho.com> <17512d28834.f5ee994d51958.1307952083023632237@zoho.com> Message-ID: <175169a9cea.cf7fcd4857521.3988147331764906838@zoho.com> Hi folks, Yesterday, I wrote: A couple of things. TonelFileUtils install is not being automatically run . this populates the Current class instance variable needed or the TonelFilueUtils > current class side call. Then, in  TonelRepository >> directoryFromFileName: aString "Answer the reference to the directory represented by the 'file name'." ^ self fileUtils directoryFromPath: (self class directoryNameFromFileName: aString) relativeTo: self directory is throwing an SubclassResponsibility signal because  TonelFileUtils class >> directoryFromPath: directoryPath relativeTo: aDirectory    self subclassResponsibility What I presume we want is a TonelFileSystemUtils... so....in  TonelFileUtils class >> install    Current := self make it: TonelFileUtils class >>install    Current := TonelFileSystemUtils Well, this morning I took a look at TonelFileSystemUtils and it has a class side initialize method. Run that and the 'self' referred to by Current is correct. That tells me that the "initialize" method of TonelFileSystemUtils is not being run upon installation. cheers, t -------------- next part -------------- An HTML attachment was scrubbed... URL: From edgardec2005 at gmail.com Sun Oct 11 09:50:06 2020 From: edgardec2005 at gmail.com (Edgar J. De Cleene) Date: Sun, 11 Oct 2020 06:50:06 -0300 Subject: [squeak-dev] [ANN] New update on my current work In-Reply-To: <1e1a4123-85c8-75c4-c2d4-1490384f3da4@zogotounga.net> Message-ID: Very thanks. Runs smoothly and give a lot of things to learn. This .image should be on Squeak.org page as example of what people can do with Squeak. And lots of talent :=) Edgar @morplenauta From gettimothy at zoho.com Sun Oct 11 09:52:19 2020 From: gettimothy at zoho.com (gettimothy) Date: Sun, 11 Oct 2020 05:52:19 -0400 Subject: [squeak-dev] [ANN] New update on my current work In-Reply-To: References: Message-ID: <175171342b4.b23a75da58092.7269660584235877469@zoho.com> ---- On Sun, 11 Oct 2020 05:50:06 -0400 Edgar J. De Cleene wrote ---- Very thanks. Runs smoothly and give a lot of things to learn. This .image should be on Squeak.org page as example of what people can do with Squeak. And lots of talent :=) Edgar @morplenauta +1 -------------- next part -------------- An HTML attachment was scrubbed... URL: From marcel.taeumel at hpi.de Sun Oct 11 10:51:04 2020 From: marcel.taeumel at hpi.de (Marcel Taeumel) Date: Sun, 11 Oct 2020 12:51:04 +0200 Subject: [squeak-dev] TonelFileSystemutils initialize not being run automatically? In-Reply-To: <175169a9cea.cf7fcd4857521.3988147331764906838@zoho.com> References: <174f39b350f.b3bca56534674.418444634630814984@zoho.com> <174f3d67e8e.fe39606835178.775127364609810974@zoho.com> <17512d28834.f5ee994d51958.1307952083023632237@zoho.com> <175169a9cea.cf7fcd4857521.3988147331764906838@zoho.com> Message-ID: Hi all -- > That tells me that the "initialize" method of TonelFileSystemUtils is not being run upon installation. A class-side #initialize is run only if (a) added to the system or (b) changed. I suppose that that "Current" will be overwritten somewhere during the initial set up? I mean, *after* it was evaluated once. Best, Marcel Am 11.10.2020 09:40:45 schrieb gettimothy via Squeak-dev : Hi folks, Yesterday, I wrote: A couple of things. TonelFileUtils install is not being automatically run . this populates the Current class instance variable needed or the TonelFilueUtils > current class side call. Then, in  TonelRepository >> directoryFromFileName: aString "Answer the reference to the directory represented by the 'file name'." ^ self fileUtils directoryFromPath: (self class directoryNameFromFileName: aString) relativeTo: self directory is throwing an SubclassResponsibility signal because  TonelFileUtils class >> directoryFromPath: directoryPath relativeTo: aDirectory    self subclassResponsibility What I presume we want is a TonelFileSystemUtils... so....in  TonelFileUtils class >> install    Current := self make it: TonelFileUtils class >>install    Current := TonelFileSystemUtils Well, this morning I took a look at TonelFileSystemUtils and it has a class side initialize method. Run that and the 'self' referred to by Current is correct. That tells me that the "initialize" method of TonelFileSystemUtils is not being run upon installation. cheers, t -------------- next part -------------- An HTML attachment was scrubbed... URL: From commits at source.squeak.org Sun Oct 11 11:35:53 2020 From: commits at source.squeak.org (commits at source.squeak.org) Date: Sun, 11 Oct 2020 11:35:53 0000 Subject: [squeak-dev] The Trunk: Morphic-mt.1698.mcz Message-ID: Marcel Taeumel uploaded a new version of Morphic to project The Trunk: http://source.squeak.org/trunk/Morphic-mt.1698.mcz ==================== Summary ==================== Name: Morphic-mt.1698 Author: mt Time: 11 October 2020, 1:35:46.971652 pm UUID: 8a6f5c18-06a4-6748-a873-31147aae9578 Ancestors: Morphic-mt.1697 Refactoring 'Active' variables -- Step 2 of 2. Removes all uses of Active(World|Hand|Event) by replacing those with "self current(World|Hand|Event)" or "Project current world" when required to not add/cement Morphic dependency. See http://forum.world.st/Changeset-Eliminating-global-state-from-Morphic-td5121690.html =============== Diff against Morphic-mt.1697 =============== Item was changed: ----- Method: CollapsedMorph>>uncollapseToHand (in category 'collapse/expand') ----- uncollapseToHand "Hand the uncollapsedMorph to the user, placing it in her hand, after remembering appropriate state for possible future use" | nakedMorph | nakedMorph := uncollapsedMorph. uncollapsedMorph := nil. nakedMorph setProperty: #collapsedPosition toValue: self position. mustNotClose := false. "so the delete will succeed" self delete. + self currentHand attachMorph: nakedMorph.! - ActiveHand attachMorph: nakedMorph! Item was changed: ----- Method: DialogWindow>>initialize (in category 'initialization') ----- initialize super initialize. self changeTableLayout; listDirection: #topToBottom; hResizing: #shrinkWrap; vResizing: #shrinkWrap; rubberBandCells: true; setProperty: #indicateKeyboardFocus toValue: #never. self createTitle: 'Dialog'. self createBody. self setDefaultParameters. keyMap := Dictionary new. exclusive := true. autoCancel := false. + preferredPosition := self currentWorld center.! - preferredPosition := ActiveWorld center.! Item was changed: ----- Method: DockingBarMorph>>delete (in category 'submorphs-add/remove') ----- delete + self currentHand removeKeyboardListener: self. + activeSubMenu ifNotNil: [ + activeSubMenu delete]. - ActiveHand removeKeyboardListener: self. - activeSubMenu - ifNotNil: [activeSubMenu delete]. ^ super delete! Item was changed: ----- Method: FillInTheBlankMorph class>>request: (in category 'instance creation') ----- request: queryString "Create an instance of me whose question is queryString. Invoke it centered at the cursor, and answer the string the user accepts. Answer the empty string if the user cancels." "FillInTheBlankMorph request: 'What is your favorite color?'" ^ self request: queryString initialAnswer: '' + centerAt: (self currentHand ifNil: [Sensor]) cursorPoint! - centerAt: (ActiveHand ifNil:[Sensor]) cursorPoint! Item was changed: ----- Method: FillInTheBlankMorph class>>request:initialAnswer: (in category 'instance creation') ----- request: queryString initialAnswer: defaultAnswer "Create an instance of me whose question is queryString with the given initial answer. Invoke it centered at the given point, and answer the string the user accepts. Answer the empty string if the user cancels." "FillInTheBlankMorph request: 'What is your favorite color?' initialAnswer: 'red, no blue. Ahhh!!'" ^ self request: queryString initialAnswer: defaultAnswer + centerAt: (self currentHand ifNil: [Sensor]) cursorPoint! - centerAt: ActiveHand cursorPoint! Item was changed: ----- Method: FillInTheBlankMorph class>>request:initialAnswer:centerAt: (in category 'instance creation') ----- request: queryString initialAnswer: defaultAnswer centerAt: aPoint "Create an instance of me whose question is queryString with the given initial answer. Invoke it centered at the given point, and answer the string the user accepts. Answer the empty string if the user cancels. This variant is only for calling from within a Morphic project." "FillInTheBlankMorph request: 'Type something, then type CR.' initialAnswer: 'yo ho ho!!' centerAt: Display center" ^ self request: queryString initialAnswer: defaultAnswer centerAt: aPoint + inWorld: self currentWorld! - inWorld: ActiveWorld - ! Item was changed: ----- Method: Form class>>exampleColorSees (in category '*Morphic-examples') ----- exampleColorSees "Form exampleColorSees" "First column as above shows the sneaky red/yellow pirate sneaking up on the blue/peach galleon. Second column shows the 1bpp made from the red/yellow/transparent - white -> ignore this, black -> test this Third shows the hit area - where red touches blue - superimposed on the original scene. Fourth column is the tally of hits via the old algorithm Last column shows the tally of hits via the new prim" + | formA formB maskA offset tally map intersection left top dCanvas sensitiveColor soughtColor index | - |formA formB maskA offset tally map intersection left top dCanvas sensitiveColor soughtColor index| formA := formB := maskA := offset := tally := map := intersection := nil. "just to shut up the compiler when testing" + Project current world restoreMorphicDisplay; doOneCycle. + - ActiveWorld restoreMorphicDisplay; doOneCycle. - sensitiveColor := Color red. soughtColor := Color blue. top := 50. dCanvas := FormCanvas on: Display. -50 to: 80 by: 10 do:[:p| offset:= p at 0. "vary this to check different states" left := 10. formA := (Form extent: 100 at 50 depth: 32) asFormOfDepth: 16 "so we can try original forms of other depths". formB := Form extent: 100 at 50 depth: 32. "make a red square in the middle of the form" (FormCanvas on: formA) fillRectangle: (25 at 25 extent: 50 at 5) fillStyle: sensitiveColor. (FormCanvas on: formA) fillRectangle: (25 at 30 extent: 50 at 5) fillStyle: Color transparent. (FormCanvas on: formA) fillRectangle: (25 at 35 extent: 50 at 50) fillStyle: Color yellow. "formA displayOn: Display at: left at top rule: Form paint. dCanvas frameRectangle: (left at top extent: formA extent) width:2 color: Color green. left := left + 150." "make a blue block on the right half of the form" (FormCanvas on: formB) fillRectangle: (50 at 0 extent: 50 at 100) fillStyle: soughtColor. (FormCanvas on: formB) fillRectangle: (60 at 0 extent: 10 at 100) fillStyle: Color palePeach. "formB displayOn: Display at: left at top rule: Form paint. dCanvas frameRectangle: (left at top extent: formA extent) width:2 color: Color green. left := left + 150." intersection := (formA boundingBox translateBy: offset) intersect: (formB boundingBox). formB displayOn: Display at: left at top rule: Form paint. formA displayOn: Display at: (left at top) + offset rule: Form paint. dCanvas frameRectangle: (intersection translateBy: left at top) width:2 color: Color green. left := left + 150. maskA := Form extent: intersection extent depth: 1. map := Bitmap new: (1 bitShift: (formA depth min: 15)). map at: (index := sensitiveColor indexInMap: map) put: 1. maskA copyBits: (intersection translateBy: offset negated) from: formA at: 0 at 0 colorMap: map. formB displayOn: Display at: left at top rule: Form paint. formA displayOn: Display at: (left at top) + offset rule: Form paint. maskA displayOn: Display at: (left at top) + intersection origin rule: Form paint. dCanvas frameRectangle: (intersection translateBy: left at top) width:2 color: Color green. left := left + 150. "intersect world pixels of the color we're looking for with sensitive pixels mask" map at: index put: 0. "clear map and reuse it" map at: (soughtColor indexInMap: map) put: 1. maskA copyBits: intersection from: formB at: 0 at 0 clippingBox: formB boundingBox rule: Form and fillColor: nil map: map. formB displayOn: Display at: left at top rule: Form paint. formA displayOn: Display at: (left at top) + offset rule: Form paint. maskA displayOn: Display at: (left at top) + intersection origin rule: Form paint. dCanvas frameRectangle: (intersection translateBy: left at top) width:2 color: Color green. left := left + 170. (maskA tallyPixelValues at: 2) asString asDisplayText displayOn: Display at: left@(top +20). left := left + 70. "now try using the new primitive" tally := (BitBlt destForm: formB sourceForm: formA fillColor: nil combinationRule: 3 "really ought to work with nil but prim code checks" destOrigin: intersection origin sourceOrigin: (offset negated max: 0 at 0) extent: intersection extent clipRect: intersection) primCompareColor: ((sensitiveColor pixelValueForDepth: formA depth) ) to: ((soughtColor pixelValueForDepth: formB depth) ) test: (Form compareMatchColor bitOr: Form compareTallyFlag). tally asString asDisplayText displayOn: Display at: left@(top +20). + top:= top + 60]! - top:= top + 60] - - ! Item was changed: ----- Method: Form class>>exampleTouchTest (in category '*Morphic-examples') ----- exampleTouchTest "Form exampleTouchTest" "Demonstrate the algorithm used in Scratch code to determine if a sprite's non-transparent pixels touch a non-transparent pixel of the background upon which it is displayed. First column shows a form with a red block in the midst of transparent area sneaking up on a form with a transparent LHS and blue RHS. The green frame shows the intersection area. Second column shows in grey the part of the red that is within the intersection. Third column shows in black the blue that is within the intersection. Fourth column shows just the A touching B area. Fifth column is the tally of hits via the old algorithm Last column shows the tally of hits via the new prim" |formA formB maskA maskB offset tally map intersection left top dCanvas| formA := formB := maskA := maskB := offset := tally := map := intersection := nil. "just to shut up the compiler when testing" + Project current world restoreMorphicDisplay; doOneCycle. - ActiveWorld restoreMorphicDisplay; doOneCycle. top := 50. dCanvas := FormCanvas on: Display. -50 to: 80 by: 10 do:[:p| offset:= p at 0. "vary this to check different states" left := 10. formA := Form extent: 100 at 50 depth: 32. formB := Form extent: 100 at 50 depth: 16. "make a red square in the middle of the form" (FormCanvas on: formA) fillRectangle: (25 at 25 extent: 50 at 5) fillStyle: Color yellow. (FormCanvas on: formA) fillRectangle: (25 at 30 extent: 50 at 5) fillStyle: Color transparent. (FormCanvas on: formA) fillRectangle: (25 at 35 extent: 50 at 50) fillStyle: Color red. "formA displayOn: Display at: left at top rule: Form paint. dCanvas frameRectangle: (left at top extent: formA extent) width:2 color: Color green. left := left + 150." "make a blue block on the right half of the form" (FormCanvas on: formB) fillRectangle: (50 at 0 extent: 50 at 100) fillStyle: Color blue. (FormCanvas on: formB) fillRectangle: (60 at 0 extent: 10 at 100) fillStyle: Color palePeach. "formB displayOn: Display at: left at top rule: Form paint. dCanvas frameRectangle: (left at top extent: formA extent) width:2 color: Color green. left := left + 150." intersection := (formA boundingBox translateBy: offset) intersect: (formB boundingBox). formB displayOn: Display at: left at top rule: Form paint. formA displayOn: Display at: (left at top) + offset rule: Form paint. dCanvas frameRectangle: (intersection translateBy: left at top) width:2 color: Color green. left := left + 150. maskA := Form extent: intersection extent depth: 2. formA displayOn: maskA at: offset - intersection origin rule: Form paint. formB displayOn: Display at: left at top rule: Form paint. formA displayOn: Display at: (left at top) + offset rule: Form paint. maskA displayOn: Display at: (left at top) + intersection origin rule: Form paint. dCanvas frameRectangle: (intersection translateBy: left at top) width:2 color: Color green. left := left + 150. maskB := Form extent: intersection extent depth: 2. formB displayOn: maskB at: intersection origin negated rule: Form paint. formB displayOn: Display at: left at top rule: Form paint. formA displayOn: Display at: (left at top) + offset rule: Form paint. maskB displayOn: Display at: (left at top) + intersection origin rule: Form paint. dCanvas frameRectangle: (intersection translateBy: left at top) width:2 color: Color green. left := left + 150. map := Bitmap new: 4 withAll: 1. map at: 1 put: 0. "transparent" maskA copyBits: maskA boundingBox from: maskA at: 0 at 0 colorMap: map. "maskA displayOn: Display at: (left at top) + intersection origin rule: Form paint. dCanvas frameRectangle: (intersection translateBy: left at top) width:2 color: Color green. left := left + 150." maskB copyBits: maskB boundingBox from: maskB at: 0 at 0 colorMap: map. "maskB displayOn: Display at: (left at top) + intersection origin rule: Form paint. dCanvas frameRectangle: (intersection translateBy: left at top) width:2 color: Color green. left := left + 150." maskB displayOn: maskA at: 0 at 0 rule: Form and. maskA displayOn: Display at: (left at top) + intersection origin rule: Form paint. dCanvas frameRectangle: (intersection translateBy: left at top) width:2 color: Color green. left := left + 170. (maskA boundingBox area -( maskA tallyPixelValues at: 1)) asString asDisplayText displayOn: Display at: left@(top +20). left := left + 70. "now try using the new primitive" tally := (BitBlt destForm: formB sourceForm: formA fillColor: nil combinationRule: 3 "really ought to work with nil but prim code checks" destOrigin: intersection origin sourceOrigin: (offset negated max: 0 at 0) extent: intersection extent clipRect: intersection) primCompareColor: ((Color transparent pixelValueForDepth: formA depth) bitAnd: 16rFFFFFF) to: ((Color transparent pixelValueForDepth: formB depth) bitAnd: 16rFFFFFF) test: (Form compareNotColorANotColorB bitOr: Form compareTallyFlag). tally asString asDisplayText displayOn: Display at: left@(top +20). + top:= top + 60]! - top:= top + 60] - - - ! Item was changed: ----- Method: Form class>>exampleTouchingColor (in category '*Morphic-examples') ----- exampleTouchingColor "Form exampleTouchingColor" "Demonstrate the algorithm used in Scratch code to determine if a sprite's non-transparent pixels touch a particular color pixel of the background upon which it is displayed. First column as above shows the sneaky red/yellow pirate sneaking up on the blue/peach galleon. Second column shows the 1bpp made from the red/yellow/transparent - white -> ignore this, black -> test this Third shows the hit area (black) superimposed on the original scene Fourth column is the tally of hits via the old algorithm Last column shows the tally of hits via the new prim" |formA formB maskA offset tally map intersection left top dCanvas ignoreColor soughtColor| formA := formB := maskA := offset := tally := map := intersection := nil. "just to shut up the compiler when testing" + Project current world restoreMorphicDisplay; doOneCycle. - ActiveWorld restoreMorphicDisplay; doOneCycle. ignoreColor := Color transparent. soughtColor := Color blue. top := 50. dCanvas := FormCanvas on: Display. -50 to: 80 by: 10 do:[:p| offset:= p at 0. "vary this to check different states" left := 10. formA := (Form extent: 100 at 50 depth: 32) asFormOfDepth: 16 "so we can try original forms of other depths". formB := Form extent: 100 at 50 depth: 32. "make a red square in the middle of the form" (FormCanvas on: formA) fillRectangle: (25 at 25 extent: 50 at 5) fillStyle: Color red. (FormCanvas on: formA) fillRectangle: (25 at 30 extent: 50 at 5) fillStyle: Color transparent. (FormCanvas on: formA) fillRectangle: (25 at 35 extent: 50 at 50) fillStyle: Color yellow. "formA displayOn: Display at: left at top rule: Form paint. dCanvas frameRectangle: (left at top extent: formA extent) width:2 color: Color green. left := left + 150." "make a blue block on the right half of the form" (FormCanvas on: formB) fillRectangle: (50 at 0 extent: 50 at 100) fillStyle: soughtColor. (FormCanvas on: formB) fillRectangle: (60 at 0 extent: 10 at 100) fillStyle: Color palePeach. "formB displayOn: Display at: left at top rule: Form paint. dCanvas frameRectangle: (left at top extent: formA extent) width:2 color: Color green. left := left + 150." intersection := (formA boundingBox translateBy: offset) intersect: (formB boundingBox). formB displayOn: Display at: left at top rule: Form paint. formA displayOn: Display at: (left at top) + offset rule: Form paint. dCanvas frameRectangle: (intersection translateBy: left at top) width:2 color: Color green. left := left + 150. maskA := Form extent: intersection extent depth: 1. map := Bitmap new: (1 bitShift: (formA depth min: 15)). map atAllPut: 1. map at: ( ignoreColor indexInMap: map) put: 0. maskA copyBits: (intersection translateBy: offset negated) from: formA at: 0 at 0 colorMap: map. formB displayOn: Display at: left at top rule: Form paint. formA displayOn: Display at: (left at top) + offset rule: Form paint. maskA displayOn: Display at: (left at top) + intersection origin rule: Form paint. dCanvas frameRectangle: (intersection translateBy: left at top) width:2 color: Color green. left := left + 150. "intersect world pixels of the color we're looking for with sensitive pixels mask" map atAllPut: 0. "clear map and reuse it" map at: (soughtColor indexInMap: map) put: 1. maskA copyBits: intersection from: formB at: 0 at 0 clippingBox: formB boundingBox rule: Form and fillColor: nil map: map. formB displayOn: Display at: left at top rule: Form paint. formA displayOn: Display at: (left at top) + offset rule: Form paint. maskA displayOn: Display at: (left at top) + intersection origin rule: Form paint. dCanvas frameRectangle: (intersection translateBy: left at top) width:2 color: Color green. left := left + 170. (maskA tallyPixelValues at: 2) asString asDisplayText displayOn: Display at: left@(top +20). left := left + 70. "now try using the new primitive" tally := (BitBlt destForm: formB sourceForm: formA fillColor: nil combinationRule: 3 "really ought to work with nil but prim code checks" destOrigin: intersection origin sourceOrigin: (offset negated max: 0 at 0) extent: intersection extent clipRect: intersection) primCompareColor: ((ignoreColor pixelValueForDepth: formA depth) bitAnd: 16rFFFFFF) to: ((soughtColor pixelValueForDepth: formB depth) bitAnd: 16rFFFFFF) test: (Form compareNotColorAMatchColorB bitOr: Form compareTallyFlag). tally asString asDisplayText displayOn: Display at: left@(top +20). + top:= top + 60]! - top:= top + 60] - ! Item was changed: ----- Method: HaloMorph>>doDirection:with: (in category 'private') ----- doDirection: anEvent with: directionHandle "The mouse went down on the forward-direction halo handle; respond appropriately." anEvent hand obtainHalo: self. anEvent shiftPressed ifTrue: [directionArrowAnchor := (target point: target referencePosition in: self world) rounded. self positionDirectionShaft: directionHandle. self removeAllHandlesBut: directionHandle. directionHandle setProperty: #trackDirectionArrow toValue: true] ifFalse: + [self currentHand spawnBalloonFor: directionHandle]! - [ActiveHand spawnBalloonFor: directionHandle]! Item was changed: ----- Method: HaloMorph>>maybeDismiss:with: (in category 'private') ----- maybeDismiss: evt with: dismissHandle "Ask hand to dismiss my target if mouse comes up in it." evt hand obtainHalo: self. (dismissHandle containsPoint: evt cursorPoint) + ifFalse: [ + self delete. - ifFalse: - [self delete. target addHalo: evt] + ifTrue: [ + target resistsRemoval ifTrue: - ifTrue: - [target resistsRemoval ifTrue: [(UIManager default chooseFrom: { 'Yes' translated. 'Um, no, let me reconsider' translated. + } title: 'Really throw this away?' translated) = 1 ifFalse: [^ self]]. - } title: 'Really throw this away' translated) = 1 ifFalse: [^ self]]. evt hand removeHalo. self delete. target dismissViaHalo. + self currentWorld presenter flushPlayerListCache].! - ActiveWorld presenter flushPlayerListCache]! Item was changed: ----- Method: HaloMorph>>prepareToTrackCenterOfRotation:with: (in category 'private') ----- prepareToTrackCenterOfRotation: evt with: rotationHandle "The mouse went down on the center of rotation." evt hand obtainHalo: self. evt shiftPressed ifTrue: [self removeAllHandlesBut: rotationHandle. rotationHandle setProperty: #trackCenterOfRotation toValue: true. evt hand showTemporaryCursor: Cursor blank] ifFalse: + [self currentHand spawnBalloonFor: rotationHandle]! - [ActiveHand spawnBalloonFor: rotationHandle]! Item was changed: ----- Method: HandMorph class>>showEvents: (in category 'utilities') ----- showEvents: aBool "HandMorph showEvents: true" "HandMorph showEvents: false" + ShowEvents := aBool. + aBool ifFalse: [ + Project current world invalidRect: (0 at 0 extent: 250 at 120)].! - aBool ifFalse: [ ActiveWorld invalidRect: (0 at 0 extent: 250 at 120) ].! Item was changed: ----- Method: HandMorph>>cursorPoint (in category 'event handling') ----- cursorPoint "Implemented for allowing embedded worlds in an event cycle to query a hand's position and get it in its coordinates. The same can be achieved by #point:from: but this is simply much more convenient since it will look as if the hand is in the lower world." + ^ self currentWorld point: self position from: owner! - | pos | - pos := self position. - (ActiveWorld isNil or: [ActiveWorld == owner]) ifTrue: [^pos]. - ^ActiveWorld point: pos from: owner! Item was changed: ----- Method: MVCMenuMorph>>displayAt:during: (in category 'invoking') ----- displayAt: aPoint during: aBlock "Add this menu to the Morphic world during the execution of the given block." Smalltalk isMorphic ifFalse: [^ self]. + [self currentWorld addMorph: self centeredNear: aPoint. - [ActiveWorld addMorph: self centeredNear: aPoint. self world displayWorld. "show myself" aBlock value] ensure: [self delete]! Item was changed: ----- Method: MVCMenuMorph>>informUserAt:during: (in category 'invoking') ----- informUserAt: aPoint during: aBlock "Add this menu to the Morphic world during the execution of the given block." | title w | Smalltalk isMorphic ifFalse: [^ self]. + + title := self allMorphs detect: [:ea | ea hasProperty: #titleString]. - - title := self allMorphs detect: [ :ea | ea hasProperty: #titleString ]. title := title submorphs first. self visible: false. + w := self currentWorld. + aBlock value: [:string| + self visible ifFalse: [ - w := ActiveWorld. - aBlock value:[:string| - self visible ifFalse:[ w addMorph: self centeredNear: aPoint. self visible: true]. title contents: string. self setConstrainedPosition: Sensor cursorPoint hangOut: false. self changed. w displayWorld "show myself" ]. self delete. + w displayWorld.! - w displayWorld! Item was changed: ----- Method: MenuMorph class>>chooseFrom:lines:title: (in category 'utilities') ----- chooseFrom: aList lines: linesArray title: queryString "Choose an item from the given list. Answer the index of the selected item." + | menu aBlock result | + aBlock := [:v | result := v]. - aBlock := [:v| result := v]. menu := self new. menu addTitle: queryString. + 1 to: aList size do: [:i| - 1 to: aList size do:[:i| menu add: (aList at: i) asString target: aBlock selector: #value: argument: i. (linesArray includes: i) ifTrue:[menu addLine]]. MenuIcons decorateMenu: menu. result := 0. + menu + invokeAt: self currentHand position + in: self currentWorld + allowKeyboard: true. + ^ result! - menu invokeAt: ActiveHand position in: ActiveWorld allowKeyboard: true. - ^result! Item was changed: ----- Method: MenuMorph class>>confirm:trueChoice:falseChoice: (in category 'utilities') ----- confirm: queryString trueChoice: trueChoice falseChoice: falseChoice "Put up a yes/no menu with caption queryString. The actual wording for the two choices will be as provided in the trueChoice and falseChoice parameters. Answer true if the response is the true-choice, false if it's the false-choice. This is a modal question -- the user must respond one way or the other." "MenuMorph confirm: 'Are you hungry?' trueChoice: 'yes, I''m famished' falseChoice: 'no, I just ate'" + | menu aBlock result | + aBlock := [:v | result := v]. - aBlock := [:v| result := v]. menu := self new. menu addTitle: queryString icon: MenuIcons confirmIcon. menu add: trueChoice target: aBlock selector: #value: argument: true. menu add: falseChoice target: aBlock selector: #value: argument: false. MenuIcons decorateMenu: menu. + [menu + invokeAt: self currentHand position + in: self currentWorld + allowKeyboard: true. - [menu invokeAt: ActiveHand position in: ActiveWorld allowKeyboard: true. result == nil] whileTrue. + ^ result! - ^result! Item was changed: ----- Method: MenuMorph class>>inform: (in category 'utilities') ----- inform: queryString "MenuMorph inform: 'I like Squeak'" + | menu | menu := self new. menu addTitle: queryString icon: MenuIcons confirmIcon. + menu add: 'OK' translated target: self selector: #yourself. - menu add: 'OK' target: self selector: #yourself. MenuIcons decorateMenu: menu. + menu + invokeAt: self currentHand position + in: self currentWorld + allowKeyboard: true.! - menu invokeAt: ActiveHand position in: ActiveWorld allowKeyboard: true.! Item was changed: ----- Method: MenuMorph>>informUserAt:during: (in category 'modal control') ----- informUserAt: aPoint during: aBlock "Add this menu to the Morphic world during the execution of the given block." + + | title world | - | title w | title := self allMorphs detect: [ :ea | ea hasProperty: #titleString ]. title := title submorphs first. self visible: false. + world := self currentWorld. + aBlock value: [:string| - w := ActiveWorld. - aBlock value:[:string| self visible ifFalse:[ + world addMorph: self centeredNear: aPoint. - w addMorph: self centeredNear: aPoint. self visible: true]. title contents: string. + self setConstrainedPosition: self currentHand cursorPoint hangOut: false. - self setConstrainedPosition: Sensor cursorPoint hangOut: false. self changed. + world displayWorld "show myself"]. - w displayWorld "show myself" - ]. self delete. + world displayWorld.! - w displayWorld! Item was changed: ----- Method: MenuMorph>>invokeModal: (in category 'modal control') ----- invokeModal: allowKeyboardControl "Invoke this menu and don't return until the user has chosen a value. If the allowKeyboarControl boolean is true, permit keyboard control of the menu" + ^ self + invokeModalAt: self currentHand position + in: self currentWorld + allowKeyboard: allowKeyboardControl! - ^ self invokeModalAt: ActiveHand position in: ActiveWorld allowKeyboard: allowKeyboardControl! Item was changed: ----- Method: MenuMorph>>popUpEvent:in: (in category 'control') ----- popUpEvent: evt in: aWorld "Present this menu in response to the given event." | aHand aPosition | + aHand := evt ifNotNil: [evt hand] ifNil: [self currentHand]. - aHand := evt ifNotNil: [evt hand] ifNil: [ActiveHand]. aPosition := aHand position truncated. + ^ self popUpAt: aPosition forHand: aHand in: aWorld! - ^ self popUpAt: aPosition forHand: aHand in: aWorld - ! Item was changed: ----- Method: MenuMorph>>popUpNoKeyboard (in category 'control') ----- popUpNoKeyboard "Present this menu in the current World, *not* allowing keyboard input into the menu" + ^ self + popUpAt: self currentHand position + forHand: self currentHand + in: self currentWorld + allowKeyboard: false! - ^ self popUpAt: ActiveHand position forHand: ActiveHand in: ActiveWorld allowKeyboard: false! Item was changed: ----- Method: MenuMorph>>positionAt:relativeTo:inWorld: (in category 'private') ----- positionAt: aPoint relativeTo: aMenuItem inWorld: aWorld "Note: items may not be laid out yet (I found them all to be at 0 at 0), so we have to add up heights of items above the selected item." | i yOffset sub delta | self fullBounds. "force layout" i := 0. yOffset := 0. [(sub := self submorphs at: (i := i + 1)) == aMenuItem] whileFalse: [yOffset := yOffset + sub height]. self position: aPoint - (2 @ (yOffset + 8)). "If it doesn't fit, show it to the left, not to the right of the hand." self right > aWorld worldBounds right ifTrue: [self right: aPoint x + 1]. "Make sure that the menu fits in the world." delta := self bounds amountToTranslateWithin: + (aWorld worldBounds withHeight: ((aWorld worldBounds height - 18) max: (self currentHand position y) + 1)). + delta isZero ifFalse: [self position: self position + delta].! - (aWorld worldBounds withHeight: ((aWorld worldBounds height - 18) max: (ActiveHand position y) + 1)). - delta = (0 @ 0) ifFalse: [self position: self position + delta]! Item was changed: ----- Method: Morph class>>fromFileName: (in category 'fileIn/Out') ----- fromFileName: fullName "Reconstitute a Morph from the file, presumed to be represent a Morph saved via the SmartRefStream mechanism, and open it in an appropriate Morphic world" | aFileStream morphOrList | aFileStream := (MultiByteBinaryOrTextStream with: ((FileStream readOnlyFileNamed: fullName) binary contentsOfEntireFile)) binary reset. morphOrList := aFileStream fileInObjectAndCode. (morphOrList isKindOf: SqueakPage) ifTrue: [morphOrList := morphOrList contentsMorph]. Smalltalk isMorphic + ifTrue: [Project current world addMorphsAndModel: morphOrList] - ifTrue: [ActiveWorld addMorphsAndModel: morphOrList] ifFalse: [morphOrList isMorph ifFalse: [self inform: 'Can only load a single morph + into an mvc project via this mechanism.' translated]. - into an mvc project via this mechanism.']. morphOrList openInWorld]! Item was changed: ----- Method: Morph>>addMiscExtrasTo: (in category 'menus') ----- addMiscExtrasTo: aMenu "Add a submenu of miscellaneous extra items to the menu." | realOwner realMorph subMenu | subMenu := MenuMorph new defaultTarget: self. (self isWorldMorph not and: [(self renderedMorph isSystemWindow) not]) ifTrue: [subMenu add: 'put in a window' translated action: #embedInWindow]. + - self isWorldMorph ifFalse: [subMenu add: 'adhere to edge...' translated action: #adhereToEdge. subMenu addLine]. + - realOwner := (realMorph := self topRendererOrSelf) owner. (realOwner isKindOf: TextPlusPasteUpMorph) ifTrue: [subMenu add: 'GeeMail stuff...' translated subMenu: (realOwner textPlusMenuFor: realMorph)]. + - subMenu add: 'add mouse up action' translated action: #addMouseUpAction; add: 'remove mouse up action' translated action: #removeMouseUpAction; add: 'hand me tiles to fire this button' translated action: #handMeTilesToFire. subMenu addLine. subMenu add: 'arrowheads on pen trails...' translated action: #setArrowheads. subMenu addLine. + - subMenu defaultTarget: self topRendererOrSelf. subMenu add: 'draw new path' translated action: #definePath. subMenu add: 'follow existing path' translated action: #followPath. subMenu add: 'delete existing path' translated action: #deletePath. subMenu addLine. + + self addGestureMenuItems: subMenu hand: self currentHand. + - - self addGestureMenuItems: subMenu hand: ActiveHand. - aMenu add: 'extras...' translated subMenu: subMenu! Item was changed: ----- Method: Morph>>buildYellowButtonMenu: (in category 'menu') ----- buildYellowButtonMenu: aHand + "Build the morph menu for the yellow button." + - "build the morph menu for the yellow button" | menu | menu := MenuMorph new defaultTarget: self. + self addNestedYellowButtonItemsTo: menu event: self currentEvent. - self addNestedYellowButtonItemsTo: menu event: ActiveEvent. MenuIcons decorateMenu: menu. ^ menu! Item was changed: ----- Method: Morph>>chooseNewGraphicCoexisting: (in category 'menus') ----- chooseNewGraphicCoexisting: aBoolean "Allow the user to choose a different form for her form-based morph" | replacee aGraphicalMenu | self isInWorld ifFalse: "menu must have persisted for a not-in-world object." + [aGraphicalMenu := Project current world submorphThat: - [aGraphicalMenu := ActiveWorld submorphThat: [:m | (m isKindOf: GraphicalMenu) and: [m target == self]] ifNone: [^ self]. ^ aGraphicalMenu show; flashBounds]. aGraphicalMenu := GraphicalMenu new initializeFor: self withForms: self reasonableForms coexist: aBoolean. aBoolean ifTrue: [self primaryHand attachMorph: aGraphicalMenu] ifFalse: [replacee := self topRendererOrSelf. replacee owner replaceSubmorph: replacee by: aGraphicalMenu]! Item was changed: ----- Method: Morph>>deleteUnlessHasFocus (in category 'submorphs-add/remove') ----- deleteUnlessHasFocus "Runs on a step timer because we cannot be guaranteed to get focus change events." + (self currentHand keyboardFocus ~= self and: [ self isInWorld ]) ifTrue: - (ActiveHand keyboardFocus ~= self and: [ self isInWorld ]) ifTrue: [ self stopSteppingSelector: #deleteUnlessHasFocus ; delete ]! Item was changed: ----- Method: Morph>>dismissViaHalo (in category 'submorphs-add/remove') ----- dismissViaHalo "The user has clicked in the delete halo-handle. This provides a hook in case some concomitant action should be taken, or if the particular morph is not one which should be put in the trash can, for example." | cmd | self setProperty: #lastPosition toValue: self positionInWorld. self dismissMorph. TrashCanMorph preserveTrash ifTrue: [ TrashCanMorph slideDismissalsToTrash ifTrue:[self slideToTrash: nil] ifFalse:[TrashCanMorph moveToTrash: self]. ]. cmd := Command new cmdWording: 'dismiss ' translated, self externalName. + cmd undoTarget: Project current world selector: #reintroduceIntoWorld: argument: self. + cmd redoTarget: Project current world selector: #onceAgainDismiss: argument: self. + Project current world rememberCommand: cmd.! - cmd undoTarget: ActiveWorld selector: #reintroduceIntoWorld: argument: self. - cmd redoTarget: ActiveWorld selector: #onceAgainDismiss: argument: self. - ActiveWorld rememberCommand: cmd! Item was changed: ----- Method: Morph>>duplicate (in category 'copying') ----- duplicate "Make and return a duplicate of the receiver" | newMorph aName w aPlayer topRend | ((topRend := self topRendererOrSelf) ~~ self) ifTrue: [^ topRend duplicate]. self okayToDuplicate ifFalse: [^ self]. aName := (w := self world) ifNotNil: [w nameForCopyIfAlreadyNamed: self]. newMorph := self veryDeepCopy. aName ifNotNil: [newMorph setNameTo: aName]. newMorph arrangeToStartStepping. newMorph privateOwner: nil. "no longer in world" newMorph isPartsDonor: false. "no longer parts donor" (aPlayer := newMorph player) belongsToUniClass ifTrue: [aPlayer class bringScriptsUpToDate]. + aPlayer ifNotNil: [self currentWorld presenter flushPlayerListCache]. - aPlayer ifNotNil: [ActiveWorld presenter flushPlayerListCache]. ^ newMorph! Item was changed: ----- Method: Morph>>indicateAllSiblings (in category 'meta-actions') ----- indicateAllSiblings "Indicate all the receiver and all its siblings by flashing momentarily." | aPlayer allBoxes | (aPlayer := self topRendererOrSelf player) belongsToUniClass ifFalse: [^ self "error: 'not uniclass'"]. allBoxes := aPlayer class allInstances + select: [:m | m costume world == self currentWorld] - select: [:m | m costume world == ActiveWorld] thenCollect: [:m | m costume boundsInWorld]. 5 timesRepeat: + [Display flashAll: allBoxes andWait: 120].! - [Display flashAll: allBoxes andWait: 120]! Item was changed: ----- Method: Morph>>justDroppedInto:event: (in category 'dropping/grabbing') ----- justDroppedInto: aMorph event: anEvent "This message is sent to a dropped morph after it has been dropped on -- and been accepted by -- a drop-sensitive morph" | partsBinCase cmd | (self formerOwner notNil and: [self formerOwner ~~ aMorph]) ifTrue: [self removeHalo]. self formerOwner: nil. self formerPosition: nil. cmd := self valueOfProperty: #undoGrabCommand. cmd ifNotNil:[aMorph rememberCommand: cmd. self removeProperty: #undoGrabCommand]. (partsBinCase := aMorph isPartsBin) ifFalse: [self isPartsDonor: false]. (self isInWorld and: [partsBinCase not]) ifTrue: [self world startSteppingSubmorphsOf: self]. "Note an unhappy inefficiency here: the startStepping... call will often have already been called in the sequence leading up to entry to this method, but unfortunately the isPartsDonor: call often will not have already happened, with the result that the startStepping... call will not have resulted in the startage of the steppage." "An object launched by certain parts-launcher mechanisms should end up fully visible..." (self hasProperty: #beFullyVisibleAfterDrop) ifTrue: + [aMorph == self currentWorld ifTrue: - [aMorph == ActiveWorld ifTrue: [self goHome]. + self removeProperty: #beFullyVisibleAfterDrop].! - self removeProperty: #beFullyVisibleAfterDrop]. - ! Item was changed: ----- Method: Morph>>referencePlayfield (in category 'e-toy support') ----- referencePlayfield "Answer the PasteUpMorph to be used for cartesian-coordinate reference" | former | owner ifNotNil: [(self topRendererOrSelf owner isHandMorph and: [(former := self formerOwner) notNil]) ifTrue: [former := former renderedMorph. ^ former isPlayfieldLike ifTrue: [former] ifFalse: [former referencePlayfield]]]. self allOwnersDo: [:o | o isPlayfieldLike ifTrue: [^ o]]. + ^ Project current world! - ^ ActiveWorld! Item was changed: ----- Method: Morph>>resizeFromMenu (in category 'meta-actions') ----- resizeFromMenu "Commence an interaction that will resize the receiver" + ^ self resizeMorph: self currentEvent! - self resizeMorph: ActiveEvent! Item was changed: ----- Method: Morph>>slideToTrash: (in category 'dropping/grabbing') ----- slideToTrash: evt "Perhaps slide the receiver across the screen to a trash can and make it disappear into it. In any case, remove the receiver from the screen." | aForm trash startPoint endPoint morphToSlide | ((self renderedMorph == ScrapBook default scrapBook) or: [self renderedMorph isKindOf: TrashCanMorph]) ifTrue: [self dismissMorph. ^ self]. TrashCanMorph slideDismissalsToTrash ifTrue: [morphToSlide := self representativeNoTallerThan: 200 norWiderThan: 200 thumbnailHeight: 100. aForm := morphToSlide imageForm offset: (0 at 0). + trash := self currentWorld - trash := ActiveWorld findDeepSubmorphThat: [:aMorph | (aMorph isKindOf: TrashCanMorph) and: + [aMorph topRendererOrSelf owner == self currentWorld]] - [aMorph topRendererOrSelf owner == ActiveWorld]] ifAbsent: [trash := TrashCanMorph new. + trash position: self currentWorld bottomLeft - (0 @ (trash extent y + 26)). - trash position: ActiveWorld bottomLeft - (0 @ (trash extent y + 26)). trash openInWorld. trash]. endPoint := trash fullBoundsInWorld center. startPoint := self topRendererOrSelf fullBoundsInWorld center - (aForm extent // 2)]. self dismissMorph. + self currentWorld displayWorld. - ActiveWorld displayWorld. TrashCanMorph slideDismissalsToTrash ifTrue: [aForm slideFrom: startPoint to: endPoint nSteps: 12 delay: 15]. ScrapBook default addToTrash: self! Item was changed: ----- Method: Morph>>yellowButtonActivity: (in category 'event handling') ----- yellowButtonActivity: shiftState "Find me or my outermost owner that has items to add to a yellow button menu. shiftState is true if the shift was pressed. Otherwise, build a menu that contains the contributions from myself and my interested submorphs, and present it to the user." | menu | self isWorldMorph ifFalse: [| outerOwner | outerOwner := self outermostOwnerWithYellowButtonMenu. outerOwner ifNil: [^ self]. outerOwner == self ifFalse: [^ outerOwner yellowButtonActivity: shiftState]]. + menu := self buildYellowButtonMenu: self currentHand. - menu := self buildYellowButtonMenu: ActiveHand. menu addTitle: self externalName icon: (self iconOrThumbnailOfSize: (Preferences tinyDisplay ifTrue: [16] ifFalse: [28])). menu popUpInWorld: self currentWorld! Item was changed: ----- Method: MorphHierarchy class>>openOrDelete (in category 'opening') ----- openOrDelete | oldMorph | oldMorph := Project current world submorphs detect: [:each | each hasProperty: #morphHierarchy] ifNone: [| newMorph | newMorph := self new asMorph. + newMorph bottomLeft: self currentHand position. - newMorph bottomLeft: ActiveHand position. newMorph openInWorld. newMorph isFullOnScreen ifFalse: [newMorph goHome]. ^ self]. "" oldMorph delete! Item was changed: ----- Method: MorphicProject>>clearGlobalState (in category 'enter') ----- clearGlobalState + "Clean up global state. This method may be removed if the use of global state variables is eliminated." - "Clean up global state. The global variables World, ActiveWorld, ActiveHand - and ActiveEvent provide convenient access to the state of the active project - in Morphic. Clear their prior values when leaving an active project. This - method may be removed if the use of global state variables is eliminated." + "If global World is defined, clear it now. The value is expected to be set again as a new project is entered." + Smalltalk globals at: #World ifPresent: [:w | + Smalltalk globals at: #World put: nil].! - "If global World is defined, clear it now. The value is expected to be set - again as a new project is entered." - Smalltalk globals at: #World - ifPresent: [ :w | Smalltalk globals at: #World put: nil ]. - ActiveWorld := ActiveHand := ActiveEvent := nil. - ! Item was changed: ----- Method: MorphicProject>>createViewIfAppropriate (in category 'utilities') ----- createViewIfAppropriate "Create a project view for the receiver and place it appropriately on the screen." | aMorph requiredWidth existing proposedV proposedH despair | ProjectViewOpenNotification signal ifTrue: [Preferences projectViewsInWindows ifTrue: [(ProjectViewMorph newProjectViewInAWindowFor: self) openInWorld] ifFalse: [aMorph := ProjectViewMorph on: self. requiredWidth := aMorph width + 10. + existing := self currentWorld submorphs - existing := ActiveWorld submorphs select: [:m | m isKindOf: ProjectViewMorph] thenCollect: [:m | m fullBoundsInWorld]. proposedV := 85. proposedH := 10. despair := false. [despair not and: [((proposedH @ proposedV) extent: requiredWidth) intersectsAny: existing]] whileTrue: [proposedH := proposedH + requiredWidth. + proposedH + requiredWidth > self currentWorld right ifTrue: - proposedH + requiredWidth > ActiveWorld right ifTrue: [proposedH := 10. proposedV := proposedV + 90. + proposedV > (self currentWorld bottom - 90) - proposedV > (ActiveWorld bottom - 90) ifTrue: + [proposedH := self currentWorld center x - 45. + proposedV := self currentWorld center y - 30. - [proposedH := ActiveWorld center x - 45. - proposedV := ActiveWorld center y - 30. despair := true]]]. aMorph position: (proposedH @ proposedV). aMorph openInWorld]]! Item was changed: ----- Method: MorphicProject>>currentVocabulary (in category 'protocols') ----- currentVocabulary + ^ self world currentVocabulary! - ^ActiveWorld currentVocabulary! Item was changed: ----- Method: MorphicProject>>setFlaps (in category 'flaps support') ----- setFlaps | flapTabs flapIDs sharedFlapTabs navigationMorph | self flag: #toRemove. "check if this method still used by Etoys" + flapTabs := self world flapTabs. - flapTabs := ActiveWorld flapTabs. flapIDs := flapTabs collect: [:tab | tab knownName]. flapTabs do: [:tab | (tab isMemberOf: ViewerFlapTab) ifFalse: [tab isGlobalFlap ifTrue: [Flaps removeFlapTab: tab keepInList: false. tab currentWorld reformulateUpdatingMenus] ifFalse: [| referent | referent := tab referent. referent isInWorld ifTrue: [referent delete]. tab delete]]]. sharedFlapTabs := Flaps classPool at: #SharedFlapTabs. flapIDs do: [:id | id = 'Navigator' translated ifTrue: [sharedFlapTabs add: Flaps newNavigatorFlap]. id = 'Widgets' translated ifTrue: [sharedFlapTabs add: Flaps newWidgetsFlap]. id = 'Tools' translated ifTrue: [sharedFlapTabs add: Flaps newToolsFlap]. id = 'Squeak' translated ifTrue: [sharedFlapTabs add: Flaps newSqueakFlap]. id = 'Supplies' translated ifTrue: [sharedFlapTabs add: Flaps newSuppliesFlap]. id = 'Stack Tools' translated ifTrue: [sharedFlapTabs add: Flaps newStackToolsFlap]. id = 'Painting' translated ifTrue: [sharedFlapTabs add: Flaps newPaintingFlap]. id = 'Objects' translated ifTrue: [sharedFlapTabs add: Flaps newObjectsFlap ]]. 2 timesRepeat: [flapIDs do: [:id | Flaps enableDisableGlobalFlapWithID: id]]. + self world flapTabs - ActiveWorld flapTabs do: [:flapTab | flapTab isCurrentlyTextual ifTrue: [flapTab changeTabText: flapTab knownName]]. Flaps positionNavigatorAndOtherFlapsAccordingToPreference. + navigationMorph := self currentWorld findDeeplyA: ProjectNavigationMorph preferredNavigator. - navigationMorph := ActiveWorld findDeeplyA: ProjectNavigationMorph preferredNavigator. navigationMorph isNil ifTrue: [^ self]. navigationMorph allMorphs do: [:morph | morph class == SimpleButtonDelayedMenuMorph ifTrue: [(morph findA: ImageMorph) isNil ifTrue: [| label | label := morph label. label isNil ifFalse: [| name | name := morph knownName. name isNil ifTrue: [morph name: label. name := label]. morph label: name translated]]]]! Item was changed: ----- Method: MorphicProject>>updateLocaleDependents (in category 'language') ----- updateLocaleDependents "Set the project's natural language as indicated" + (self world respondsTo: #isTileScriptingElement) ifTrue: "Etoys present" [ + self world allTileScriptingElements do: [:viewerOrScriptor | - (self world respondsTo: #isTileScriptingElement) ifTrue: "Etoys present" [ - ActiveWorld allTileScriptingElements do: [:viewerOrScriptor | viewerOrScriptor localeChanged]]. + - Flaps disableGlobalFlaps: false. (Preferences eToyFriendly or: [ + (Smalltalk classNamed: #SugarNavigatorBar) ifNotNil: [:c | c showSugarNavigator] ifNil: [false]]) - (Smalltalk classNamed: 'SugarNavigatorBar') ifNotNil: [:c | c showSugarNavigator] ifNil: [false]]) ifTrue: [ Flaps addAndEnableEToyFlaps. + self world addGlobalFlaps] - ActiveWorld addGlobalFlaps] ifFalse: [Flaps enableGlobalFlaps]. + (self isFlapIDEnabled: 'Navigator' translated) - (Project current isFlapIDEnabled: 'Navigator' translated) ifFalse: [Flaps enableDisableGlobalFlapWithID: 'Navigator' translated]. + - ScrapBook default emptyScrapBook. MenuIcons initializeTranslations. super updateLocaleDependents. + - "self setFlaps. + self setPaletteFor: aLanguageSymbol."! - self setPaletteFor: aLanguageSymbol." - ! Item was changed: ----- Method: MorphicProject>>wakeUpTopWindow (in category 'enter') ----- wakeUpTopWindow "Image has been restarted, and the startUp list has been processed. Perform any additional actions needed to restart the user interface." SystemWindow wakeUpTopWindowUponStartup. Preferences mouseOverForKeyboardFocus ifTrue: [ "Allow global command keys to work upon re-entry without having to cause a focus change first." + self currentHand releaseKeyboardFocus ]! - ActiveHand releaseKeyboardFocus ]! Item was changed: ----- Method: MultiWindowLabelButtonMorph>>performAction (in category 'accessing') ----- performAction "Override to interpret the actionSelector as a menu accessor and to activate that menu." + + actionSelector ifNil: [^ self]- + (model perform: actionSelector) ifNotNil: [:menu | + menu + invokeModalAt: self position - (0 at 5) + in: self currentWorld + allowKeyboard: Preferences menuKeyboardControl].! - actionSelector ifNotNil: - [(model perform: actionSelector) ifNotNil: - [:menu| - menu - invokeModalAt: self position - (0 at 5) - in: ActiveWorld - allowKeyboard: Preferences menuKeyboardControl]]! Item was changed: ----- Method: PasteUpMorph>>correspondingFlapTab (in category 'flaps') ----- correspondingFlapTab "If there is a flap tab whose referent is me, return it, else return nil. Will also work for flaps on the edge of embedded subareas such as within scripting-areas, but more slowly." self currentWorld flapTabs do: [:aTab | aTab referent == self ifTrue: [^ aTab]]. "Catch guys in embedded worldlets" + self currentWorld allMorphs do: - ActiveWorld allMorphs do: [:aTab | ((aTab isKindOf: FlapTab) and: [aTab referent == self]) ifTrue: [^ aTab]]. ^ nil! Item was changed: ----- Method: PasteUpMorph>>extractScreenRegion:andPutSketchInHand: (in category 'world menu') ----- extractScreenRegion: poly andPutSketchInHand: hand "The user has specified a polygonal area of the Display. Now capture the pixels from that region, and put in the hand as a Sketch." | screenForm outline topLeft innerForm exterior | outline := poly shadowForm. topLeft := outline offset. exterior := (outline offset: 0 at 0) anyShapeFill reverse. screenForm := Form fromDisplay: (topLeft extent: outline extent). screenForm eraseShape: exterior. innerForm := screenForm trimBordersOfColor: Color transparent. + self currentHand showTemporaryCursor: nil. - ActiveHand showTemporaryCursor: nil. innerForm isAllWhite ifFalse: [hand attachMorph: (self drawingClass withForm: innerForm)]! Item was changed: ----- Method: PasteUpMorph>>flapTab (in category 'accessing') ----- flapTab "Answer the tab affilitated with the receiver. Normally every flap tab is expected to have a PasteUpMorph which serves as its 'referent.'" | ww | + self isFlap ifFalse: [^ nil]. + ww := self presenter associatedMorph ifNil: [self]. + ^ ww flapTabs + detect: [:any| any referent == self] + ifNone: [nil]! - self isFlap ifFalse:[^nil]. - ww := self presenter associatedMorph ifNil: [ActiveWorld]. - ^ ww ifNotNil: [ww flapTabs detect:[:any| any referent == self] ifNone: [nil]]! Item was changed: ----- Method: PasteUpMorph>>initializeDesktopCommandKeySelectors (in category 'world menu') ----- initializeDesktopCommandKeySelectors "Provide the starting settings for desktop command key selectors. Answer the dictionary." "ActiveWorld initializeDesktopCommandKeySelectors" | dict | dict := IdentityDictionary new. + self defaultDesktopCommandKeyTriplets do: [:trip | + | messageSend | + messageSend := MessageSend receiver: trip second selector: trip third. + dict at: trip first put: messageSend]. - self defaultDesktopCommandKeyTriplets do: - [:trip | | messageSend | - messageSend := MessageSend receiver: trip second selector: trip third. - dict at: trip first put: messageSend]. self setProperty: #commandKeySelectors toValue: dict. + ^ dict! - ^ dict - - ! Item was changed: ----- Method: PasteUpMorph>>putUpPenTrailsSubmenu (in category 'menu & halo') ----- putUpPenTrailsSubmenu "Put up the pen trails menu" | aMenu | aMenu := MenuMorph new defaultTarget: self. aMenu title: 'pen trails' translated. aMenu addStayUpItem. self addPenTrailsMenuItemsTo: aMenu. + ^ aMenu popUpInWorld: self! - aMenu popUpInWorld: ActiveWorld! Item was changed: ----- Method: PasteUpMorph>>putUpWorldMenuFromEscapeKey (in category 'world menu') ----- putUpWorldMenuFromEscapeKey Preferences noviceMode + ifFalse: [self putUpWorldMenu: self currentEvent]! - ifFalse: [self putUpWorldMenu: ActiveEvent]! Item was changed: ----- Method: PasteUpMorph>>repositionFlapsAfterScreenSizeChange (in category 'world state') ----- repositionFlapsAfterScreenSizeChange "Reposition flaps after screen size change" + (Flaps globalFlapTabsIfAny, self localFlapTabs) do: - (Flaps globalFlapTabsIfAny, ActiveWorld localFlapTabs) do: [:aFlapTab | aFlapTab applyEdgeFractionWithin: self bounds]. Flaps doAutomaticLayoutOfFlapsIfAppropriate! Item was changed: ----- Method: PluggableListMorph>>specialKeyPressed: (in category 'model access - keystroke') ----- specialKeyPressed: asciiValue "A special key with the given ascii-value was pressed; dispatch it" | oldSelection nextSelection max howManyItemsShowing | (#(8 13) includes: asciiValue) ifTrue: [ "backspace key - clear the filter, restore the list with the selection" model okToChange ifFalse: [^ self]. self removeFilter. priorSelection ifNotNil: [ | prior | prior := priorSelection. priorSelection := self getCurrentSelectionIndex. asciiValue = 8 ifTrue: [ self changeModelSelection: prior ] ]. ^ self ]. asciiValue = 27 ifTrue: [" escape key" + ^ self currentEvent shiftPressed - ^ ActiveEvent shiftPressed ifTrue: + [self currentWorld putUpWorldMenuFromEscapeKey] - [ActiveWorld putUpWorldMenuFromEscapeKey] ifFalse: [self yellowButtonActivity: false]]. max := self maximumSelection. max > 0 ifFalse: [^ self]. nextSelection := oldSelection := self selectionIndex. asciiValue = 31 ifTrue: [" down arrow" nextSelection := oldSelection + 1. nextSelection > max ifTrue: [nextSelection := 1]]. asciiValue = 30 ifTrue: [" up arrow" nextSelection := oldSelection - 1. nextSelection < 1 ifTrue: [nextSelection := max]]. asciiValue = 1 ifTrue: [" home" nextSelection := 1]. asciiValue = 4 ifTrue: [" end" nextSelection := max]. howManyItemsShowing := self numSelectionsInView. asciiValue = 11 ifTrue: [" page up" nextSelection := 1 max: oldSelection - howManyItemsShowing]. asciiValue = 12 ifTrue: [" page down" nextSelection := oldSelection + howManyItemsShowing min: max]. model okToChange ifFalse: [^ self]. "No change if model is locked" oldSelection = nextSelection ifTrue: [^ self flash]. ^ self changeModelSelection: (self modelIndexFor: nextSelection)! Item was changed: ----- Method: PopUpMenu>>morphicStartUpWithCaption:icon:at:allowKeyboard: (in category '*Morphic-Menus') ----- morphicStartUpWithCaption: captionOrNil icon: aForm at: location allowKeyboard: aBoolean "Display the menu, with caption if supplied. Wait for the mouse button to go down, then track the selection as long as the button is pressed. When the button is released, Answer the index of the current selection, or zero if the mouse is not released over any menu item. Location specifies the desired topLeft of the menu body rectangle. The final argument indicates whether the menu should seize the keyboard focus in order to allow the user to navigate it via the keyboard." selection := Cursor normal showWhile: [| menuMorph | menuMorph := MVCMenuMorph from: self title: nil. (captionOrNil notNil or: [aForm notNil]) ifTrue: [menuMorph addTitle: captionOrNil icon: aForm]. MenuIcons decorateMenu: menuMorph. menuMorph invokeAt: location + in: self currentWorld - in: ActiveWorld allowKeyboard: aBoolean]. ^ selection! Item was changed: ----- Method: SelectionMorph>>duplicate (in category 'halo commands') ----- duplicate "Make a duplicate of the receiver and havbe the hand grab it" selectedItems := self duplicateMorphCollection: selectedItems. + selectedItems reverseDo: [:m | (owner ifNil: [self currentWorld]) addMorph: m]. - selectedItems reverseDo: [:m | (owner ifNil: [ActiveWorld]) addMorph: m]. dupLoc := self position. + self currentHand grabMorph: self. + self currentWorld presenter flushPlayerListCache.! - ActiveHand grabMorph: self. - ActiveWorld presenter flushPlayerListCache! Item was changed: ----- Method: SimpleHierarchicalListMorph>>specialKeyPressed: (in category 'event handling') ----- specialKeyPressed: asciiValue (self arrowKey: asciiValue) ifTrue: [^ true]. asciiValue = 27 "escape" ifTrue: [ + self currentEvent shiftPressed + ifTrue: [self currentWorld putUpWorldMenuFromEscapeKey] - ActiveEvent shiftPressed - ifTrue: [ActiveWorld putUpWorldMenuFromEscapeKey] ifFalse: [self yellowButtonActivity: false]. ^ true]. ^ false! Item was changed: ----- Method: SketchMorph>>collapse (in category 'menus') ----- collapse "Replace the receiver with a collapsed rendition of itself." + | w collapsedVersion a ht | + + (w := self world) ifNil: [^ self]. - | w collapsedVersion a ht tab | - - (w := self world) ifNil: [^self]. collapsedVersion := (self imageForm scaledToSize: 50 at 50) asMorph. collapsedVersion setProperty: #uncollapsedMorph toValue: self. collapsedVersion on: #mouseUp send: #uncollapseSketch to: collapsedVersion. collapsedVersion setBalloonText: ('A collapsed version of {1}. Click to open it back up.' translated format: {self externalName}). + - self delete. w addMorphFront: ( a := AlignmentMorph newRow hResizing: #shrinkWrap; vResizing: #shrinkWrap; borderWidth: 4; borderColor: Color white; addMorph: collapsedVersion; yourself). a setNameTo: self externalName. + ht := (Smalltalk at: #SugarNavTab ifPresent: [:c | Project current world findA: c]) + ifNotNil: [:tab | tab height] + ifNil: [80]. - ht := (tab := Smalltalk at: #SugarNavTab ifPresent: [:c | ActiveWorld findA: c]) - ifNotNil: - [tab height] - ifNil: - [80]. a position: 0 at ht. collapsedVersion setProperty: #collapsedMorphCarrier toValue: a. + (self valueOfProperty: #collapsedPosition) ifNotNil: [:priorPosition | + a position: priorPosition].! - (self valueOfProperty: #collapsedPosition) ifNotNil: - [:priorPosition | - a position: priorPosition]! Item was changed: ----- Method: SystemWindow>>doFastFrameDrag: (in category 'events') ----- doFastFrameDrag: grabPoint "Do fast frame dragging from the given point" | offset newBounds outerWorldBounds clearArea | outerWorldBounds := self boundsIn: nil. offset := outerWorldBounds origin - grabPoint. + clearArea := self currentWorld clearArea. - clearArea := ActiveWorld clearArea. newBounds := outerWorldBounds newRectFrom: [:f | | p selector | p := Sensor cursorPoint. (self class dragToEdges and: [(selector := self dragToEdgesSelectorFor: p in: clearArea) notNil]) ifTrue: [clearArea perform: selector] ifFalse: [p + offset extent: outerWorldBounds extent]]. self bounds: newBounds; comeToFront! Item was changed: ----- Method: TextEditor>>offerMenuFromEsc: (in category 'menu commands') ----- offerMenuFromEsc: aKeyboardEvent + "The escape key was hit while the receiver has the keyboard focus; take action." - "The escape key was hit while the receiver has the keyboard focus; take action" + aKeyboardEvent shiftPressed ifFalse: [ + self raiseContextMenu: aKeyboardEvent]. + ^ true! - ActiveEvent shiftPressed ifFalse: [ - self raiseContextMenu: aKeyboardEvent ]. - ^true! Item was changed: ----- Method: ThreePhaseButtonMorph>>doButtonAction (in category 'button') ----- doButtonAction "Perform the action of this button. Subclasses may override this method. The default behavior is to send the button's actionSelector to its target object with its arguments." | args | + (target notNil and: [actionSelector notNil]) ifTrue: [ + args := actionSelector numArgs > arguments size + ifTrue: [arguments copyWith: self currentEvent] + ifFalse: [arguments]. + Cursor normal showWhile: [ + target perform: actionSelector withArguments: args]. + target isMorph ifTrue: [target changed]].! - (target notNil and: [actionSelector notNil]) - ifTrue: - [args := actionSelector numArgs > arguments size - ifTrue: - [arguments copyWith: ActiveEvent] - ifFalse: - [arguments]. - Cursor normal - showWhile: [target perform: actionSelector withArguments: args]. - target isMorph ifTrue: [target changed]]! Item was changed: ----- Method: UserDialogBoxMorph class>>confirm:title:trueChoice:falseChoice:at: (in category 'utilities') ----- confirm: aString title: titleString trueChoice: trueChoice falseChoice: falseChoice at: aPointOrNil "UserDialogBoxMorph confirm: 'Make your choice carefully' withCRs title: 'Do you like chocolate?' trueChoice: 'Oh yessir!!' falseChoice: 'Not so much...'" ^self new title: titleString; message: aString; createButton: trueChoice translated value: true; createButton: falseChoice translated value: false; createCancelButton: 'Cancel' translated translated value: nil; selectedButtonIndex: 1; registerKeyboardShortcuts; + preferredPosition: (aPointOrNil ifNil: [Project current world center]); - preferredPosition: (aPointOrNil ifNil: [ActiveWorld center]); getUserResponse! Item was changed: ----- Method: UserDialogBoxMorph class>>confirm:title:trueChoice:falseChoice:default:triggerAfter:at: (in category 'utilities') ----- confirm: aString title: titleString trueChoice: trueChoice falseChoice: falseChoice default: default triggerAfter: seconds at: aPointOrNil "UserDialogBoxMorph confirm: 'I like hot java' title: 'What do you say?' trueChoice: 'You bet!!' falseChoice: 'Nope' default: false triggerAfter: 12 at: 121 at 212" ^self new title: titleString; message: aString; createButton: trueChoice translated value: true; createButton: falseChoice translated value: false; createCancelButton: 'Cancel' translated translated value: nil; selectedButtonIndex: (default ifTrue: [1] ifFalse: [2]); registerKeyboardShortcuts; + preferredPosition: (aPointOrNil ifNil: [Project current world center]); - preferredPosition: (aPointOrNil ifNil: [ActiveWorld center]); getUserResponseAfter: seconds! From commits at source.squeak.org Sun Oct 11 11:36:30 2020 From: commits at source.squeak.org (commits at source.squeak.org) Date: Sun, 11 Oct 2020 11:36:30 0000 Subject: [squeak-dev] The Trunk: System-mt.1178.mcz Message-ID: Marcel Taeumel uploaded a new version of System to project The Trunk: http://source.squeak.org/trunk/System-mt.1178.mcz ==================== Summary ==================== Name: System-mt.1178 Author: mt Time: 11 October 2020, 1:36:25.615652 pm UUID: fd8d0758-0935-c34c-8cb9-64d908b75f70 Ancestors: System-eem.1177 Refactoring 'Active' variables -- Step 2 of 2. Removes all uses of Active(World|Hand|Event) by replacing those with "self current(World|Hand|Event)" or "Project current world" when required to not add/cement Morphic dependency. See http://forum.world.st/Changeset-Eliminating-global-state-from-Morphic-td5121690.html =============== Diff against System-eem.1177 =============== Item was changed: ----- Method: NativeImageSegment>>smartFillRoots: (in category 'read/write segment') ----- smartFillRoots: dummy | refs known ours ww blockers | "Put all traced objects into my arrayOfRoots. Remove some that want to be in outPointers. Return blockers, an IdentityDictionary of objects to replace in outPointers." blockers := dummy blockers. known := (refs := dummy references) size. refs keys do: [:obj | "copy keys to be OK with removing items" (obj isSymbol) ifTrue: [refs removeKey: obj. known := known-1]. (obj class == PasteUpMorph) ifTrue: [ obj isWorldMorph & (obj owner == nil) ifTrue: [ (dummy project ~~ nil and: [obj == dummy project world]) ifFalse: [ refs removeKey: obj. known := known-1. blockers at: obj put: (StringMorph contents: 'The worldMorph of a different world')]]]. "Make a ProjectViewMorph here" "obj class == Project ifTrue: [Transcript show: obj; cr]." (blockers includesKey: obj) ifTrue: [ refs removeKey: obj ifAbsent: [known := known+1]. known := known-1]. ]. + ours := (dummy project ifNil: [Project current]) world. - ours := dummy project ifNotNil: [dummy project world] ifNil: [ActiveWorld]. refs keysDo: [:obj | obj isMorph ifTrue: [ ww := obj world. (ww == ours) | (ww == nil) ifFalse: [ refs removeKey: obj. known := known-1. blockers at: obj put: (StringMorph contents: obj printString, ' from another world')]]]. "keep original roots on the front of the list" dummy rootObject do: [:rr | refs removeKey: rr ifAbsent: []]. (self respondsTo: #classOrganizersBeRoots:) ifTrue: "an EToys extension" [self classOrganizersBeRoots: dummy]. ^dummy rootObject, refs keys asArray! Item was changed: ----- Method: Preferences class>>roundedWindowCornersChanged (in category 'updating - system') ----- roundedWindowCornersChanged "The user changed the value of the roundedWindowCorners preference. React" + Project current world fullRepaintNeeded.! - ActiveWorld fullRepaintNeeded! Item was changed: ----- Method: Preferences class>>vectorVocabularySettingChanged (in category 'updating - system') ----- vectorVocabularySettingChanged "The current value of the useVectorVocabulary flag has changed; now react. No senders, but invoked by the Preference object associated with the #useVectorVocabulary preference." + Smalltalk isMorphic ifFalse: [^ self]. + Project current world makeVectorUseConformToPreference.! - Smalltalk isMorphic ifTrue: - [ActiveWorld makeVectorUseConformToPreference]! Item was changed: ----- Method: RealEstateAgent class>>maximumUsableArea (in category 'accessing') ----- maximumUsableArea + + ^ self maximumUsableAreaInWorld: Project current world! - ^self maximumUsableAreaInWorld: ActiveWorld! Item was changed: ----- Method: RealEstateAgent class>>maximumUsableAreaInWorld: (in category 'accessing') ----- maximumUsableAreaInWorld: aWorldOrNil | allowedArea | allowedArea := Display usableArea. aWorldOrNil ifNotNil: [ - allowedArea := allowedArea intersect: aWorldOrNil visibleClearArea. Smalltalk isMorphic ifTrue: [ + allowedArea := allowedArea intersect: aWorldOrNil visibleClearArea. (((Smalltalk classNamed: 'Flaps') ifNil: [false] ifNotNil: [:cls | cls anyFlapsVisibleIn: aWorldOrNil]) and: [self respondsTo: #reduceByFlaps:]) ifTrue: [allowedArea := self reduceByFlaps: allowedArea]]]. ^allowedArea! Item was changed: ----- Method: SARInstaller>>fileInMorphsNamed:addToWorld: (in category 'client services') ----- fileInMorphsNamed: memberName addToWorld: aBoolean "This will load the Morph (or Morphs) from the given member. Answers a Morph, or a list of Morphs, or nil if no such member or error. If aBoolean is true, also adds them and their models to the World." | member morphOrList | member := self memberNamed: memberName. + member ifNil: [^ self errorNoSuchMember: memberName]. - member ifNil: [ ^self errorNoSuchMember: memberName ]. self installed: member. + - morphOrList := member contentStream fileInObjectAndCode. + morphOrList ifNil: [^ nil]. + aBoolean ifTrue: [Project current world addMorphsAndModel: morphOrList]. + + ^ morphOrList! - morphOrList ifNil: [ ^nil ]. - aBoolean ifTrue: [ ActiveWorld addMorphsAndModel: morphOrList ]. - - ^morphOrList - ! From commits at source.squeak.org Sun Oct 11 11:37:01 2020 From: commits at source.squeak.org (commits at source.squeak.org) Date: Sun, 11 Oct 2020 11:37:01 0000 Subject: [squeak-dev] The Trunk: Kernel-mt.1350.mcz Message-ID: Marcel Taeumel uploaded a new version of Kernel to project The Trunk: http://source.squeak.org/trunk/Kernel-mt.1350.mcz ==================== Summary ==================== Name: Kernel-mt.1350 Author: mt Time: 11 October 2020, 1:36:58.093652 pm UUID: bf00c27b-c143-6747-b06a-0a16460949be Ancestors: Kernel-eem.1349 Refactoring 'Active' variables -- Step 2 of 2. Removes all uses of Active(World|Hand|Event) by replacing those with "self current(World|Hand|Event)" or "Project current world" when required to not add/cement Morphic dependency. See http://forum.world.st/Changeset-Eliminating-global-state-from-Morphic-td5121690.html =============== Diff against Kernel-eem.1349 =============== Item was changed: ----- Method: Object>>launchPartVia:label: (in category 'user interface') ----- launchPartVia: aSelector label: aString "Obtain a morph by sending aSelector to self, and attach it to the morphic hand. This provides a general protocol for parts bins" | aMorph | aMorph := self perform: aSelector. + aMorph setNameTo: (Project current world unusedMorphNameLike: aString). - aMorph setNameTo: (ActiveWorld unusedMorphNameLike: aString). aMorph setProperty: #beFullyVisibleAfterDrop toValue: true. + aMorph openInHand.! - aMorph openInHand! From commits at source.squeak.org Sun Oct 11 11:38:54 2020 From: commits at source.squeak.org (commits at source.squeak.org) Date: Sun, 11 Oct 2020 11:38:54 0000 Subject: [squeak-dev] The Trunk: Tools-mt.998.mcz Message-ID: Marcel Taeumel uploaded a new version of Tools to project The Trunk: http://source.squeak.org/trunk/Tools-mt.998.mcz ==================== Summary ==================== Name: Tools-mt.998 Author: mt Time: 11 October 2020, 1:38:51.865652 pm UUID: d8edf299-848e-494f-9ef9-fa7c89d1725d Ancestors: Tools-eem.997 Refactoring 'Active' variables -- Step 2 of 2. Removes all uses of Active(World|Hand|Event) by replacing those with "self current(World|Hand|Event)" or "Project current world" when required to not add/cement Morphic dependency. See http://forum.world.st/Changeset-Eliminating-global-state-from-Morphic-td5121690.html =============== Diff against Tools-eem.997 =============== Item was changed: ----- Method: ObjectExplorer>>step (in category 'monitoring') ----- step "Let all views know that some of my objects need to be updated." self monitorList do: [ :object | object ifNotNil: [self changed: #objectChanged with: object]]. self monitorList ifEmpty: [ + self world stopStepping: self selector: #step ].! - ActiveWorld stopStepping: self selector: #step ].! Item was changed: ----- Method: ObjectExplorer>>views (in category 'accessing - view') ----- views + ^ self findDeepSubmorphsIn: self world that: [:morph | - ^ self findDeepSubmorphsIn: ActiveWorld that: [:morph | morph modelOrNil = self]! Item was changed: ----- Method: ObjectExplorer>>world (in category 'monitoring') ----- world + + ^ Project current world! - ^ActiveWorld! Item was changed: ----- Method: PasteUpMorph>>defaultDesktopCommandKeyTriplets (in category '*Tools') ----- defaultDesktopCommandKeyTriplets "Answer a list of triplets of the form [+ optional fourth element, a for use in desktop-command-key-help] that will provide the default desktop command key handlers. If the selector takes an argument, that argument will be the command-key event" "World initializeDesktopCommandKeySelectors" | noviceKeys expertKeys | noviceKeys := { + {$o. self. #activateObjectsTool. 'Activate the "Objects Tool"' translated}. + {$r. self. #restoreMorphicDisplay. 'Redraw the screen' translated}. + {$z. self. #undoOrRedoCommand. 'Undo or redo the last undoable command' translated}. + {$F. Project current. #toggleFlapsSuppressed. 'Toggle the display of flaps' translated}. + {$N. self. #toggleClassicNavigatorIfAppropriate. 'Show/Hide the classic Navigator, if appropriate' translated}. + {$M. self. #toggleShowWorldMainDockingBar. 'Show/Hide the Main Docking Bar' translated}. + {$]. Smalltalk. #saveSession. 'Save the image.' translated}. - { $o. ActiveWorld. #activateObjectsTool. 'Activate the "Objects Tool"'}. - { $r. ActiveWorld. #restoreMorphicDisplay. 'Redraw the screen'}. - { $z. self. #undoOrRedoCommand. 'Undo or redo the last undoable command'}. - { $F. Project current. #toggleFlapsSuppressed. 'Toggle the display of flaps'}. - { $N. self. #toggleClassicNavigatorIfAppropriate. 'Show/Hide the classic Navigator, if appropriate'}. - { $M. self. #toggleShowWorldMainDockingBar. 'Show/Hide the Main Docking Bar'}. - { $]. Smalltalk. #saveSession. 'Save the image.'}. }. + + Preferences noviceMode ifTrue: [^ noviceKeys]. + - - Preferences noviceMode ifTrue:[^ noviceKeys]. - expertKeys := { + {$b. SystemBrowser. #defaultOpenBrowser. 'Open a new System Browser' translated}. + {$k. Workspace. #open. 'Open a new Workspace' translated}. + {$m. self. #putUpNewMorphMenu. 'Put up the "New Morph" menu' translated}. + {$O. self. #findAMonticelloBrowser. 'Bring a Monticello window into focus.' translated}. + {$t. self. #findATranscript:. 'Make a System Transcript visible' translated}. + {$w. SystemWindow. #closeTopWindow. 'Close the topmost window' translated}. + {Character escape. SystemWindow. #closeTopWindow. 'Close the topmost window' translated}. + + {$C. self. #findAChangeSorter:. 'Make a Change Sorter visible' translated}. + + {$L. self. #findAFileList:. 'Make a File List visible' translated}. + {$P. self. #findAPreferencesPanel:. 'Activate the Preferences tool' translated}. + {$R. Utilities. #browseRecentSubmissions. 'Make a Recent Submissions browser visible' translated}. + + {$W. self. #findAMessageNamesWindow:. 'Make a MessageNames tool visible' translated}. + {$Z. ChangeList. #browseRecentLog. 'Browse recently-logged changes' translated}. + + {$\. SystemWindow. #sendTopWindowToBack. 'Send the top window to the back' translated}. + {$_. Smalltalk. #quitPrimitive. 'Quit the image immediately.' translated}. + + {$-. Preferences. #decreaseFontSize. 'Decrease all font sizes' translated}. + {$+. Preferences. #increaseFontSize. 'Increase all font sizes' translated}. - { $b. SystemBrowser. #defaultOpenBrowser. 'Open a new System Browser'}. - { $k. StringHolder. #open. 'Open a new, blank Workspace'}. - { $m. self. #putUpNewMorphMenu. 'Put up the "New Morph" menu'}. - { $O. self. #findAMonticelloBrowser. 'Bring a Monticello window into focus.'}. - { $t. self. #findATranscript:. 'Make a System Transcript visible'}. - { $w. SystemWindow. #closeTopWindow. 'Close the topmost window'}. - { Character escape. SystemWindow. #closeTopWindow. 'Close the topmost window'}. - - { $C. self. #findAChangeSorter:. 'Make a Change Sorter visible'}. - - { $L. self. #findAFileList:. 'Make a File List visible'}. - { $P. self. #findAPreferencesPanel:. 'Activate the Preferences tool'}. - { $R. Utilities. #browseRecentSubmissions. 'Make a Recent Submissions browser visible'}. - - { $W. self. #findAMessageNamesWindow:. 'Make a MessageNames tool visible'}. - { $Z. ChangeList. #browseRecentLog. 'Browse recently-logged changes'}. - - { $\. SystemWindow. #sendTopWindowToBack. 'Send the top window to the back'}. - { $_. Smalltalk. #quitPrimitive. 'Quit the image immediately.'}. - - { $-. Preferences. #decreaseFontSize. 'Decrease all font sizes'}. - { $+. Preferences. #increaseFontSize. 'Increase all font sizes'}. }. + + ^ noviceKeys, expertKeys! - - ^ noviceKeys, expertKeys - ! Item was changed: ----- Method: PluggableFileList>>startUpWithCaption: (in category 'StandardFileMenu') ----- startUpWithCaption: captionOrNil + "Display the menu, slightly offset from the cursor, so that a slight tweak is required to confirm any action." + + ^ self + startUpWithCaption: captionOrNil + at: (self currentHand ifNil: [Sensor]) cursorPoint! - "Display the menu, slightly offset from the cursor, - so that a slight tweak is required to confirm any action." - ^ self startUpWithCaption: captionOrNil at: (ActiveHand ifNil:[Sensor cursorPoint]).! Item was changed: ----- Method: PopUpMenu>>startUpCenteredWithCaption: (in category 'basic control sequence') ----- startUpCenteredWithCaption: captionOrNil + "Differs from startUpWithCaption: by appearing with cursor in the menu, and thus ready to act on mouseUp, without requiring user tweak to confirm" + + ^ self + startUpWithCaption: captionOrNil + at: (self currentHand ifNil: [Sensor]) cursorPoint - (20 @ 0)! - "Differs from startUpWithCaption: by appearing with cursor in the menu, - and thus ready to act on mouseUp, without requiring user tweak to confirm" - ^ self startUpWithCaption: captionOrNil at: (ActiveHand ifNil:[Sensor]) cursorPoint - (20 at 0)! Item was changed: ----- Method: PopUpMenu>>startUpWithCaption: (in category 'basic control sequence') ----- startUpWithCaption: captionOrNil "Display the menu, slightly offset from the cursor, so that a slight tweak is required to confirm any action." + self flag: #fix. "mt: Could we manage to open pop-up menus in Morphic without accessing self currentHand?" + + ^ self + startUpWithCaption: captionOrNil + at: (self currentHand ifNil: [Sensor]) cursorPoint! - self flag: #fix. "mt: Could we manage to open pop-up menus in Morphic without accessing ActiveHand?" - ^ self startUpWithCaption: captionOrNil at: (ActiveHand ifNil:[Sensor]) cursorPoint! Item was changed: ----- Method: PopUpMenu>>startUpWithCaption:icon: (in category 'basic control sequence') ----- startUpWithCaption: captionOrNil icon: aForm + "Display the menu, slightly offset from the cursor, so that a slight tweak is required to confirm any action." + - "Display the menu, slightly offset from the cursor, - so that a slight tweak is required to confirm any action." ^ self startUpWithCaption: captionOrNil icon: aForm + at: (self currentHand ifNil: [Sensor]) cursorPoint! - at: (ActiveHand ifNil:[Sensor]) cursorPoint - ! Item was changed: ----- Method: PopUpMenu>>startUpWithoutKeyboard (in category 'basic control sequence') ----- startUpWithoutKeyboard "Display and make a selection from the receiver as long as the button is pressed. Answer the current selection. Do not allow keyboard input into the menu" + ^ self + startUpWithCaption: nil + at: ((self currentHand ifNil: [Sensor]) cursorPoint) + allowKeyboard: false! - ^ self startUpWithCaption: nil at: ((ActiveHand ifNil:[Sensor]) cursorPoint) allowKeyboard: false! From commits at source.squeak.org Sun Oct 11 11:39:30 2020 From: commits at source.squeak.org (commits at source.squeak.org) Date: Sun, 11 Oct 2020 11:39:30 0000 Subject: [squeak-dev] The Trunk: ST80-mt.261.mcz Message-ID: Marcel Taeumel uploaded a new version of ST80 to project The Trunk: http://source.squeak.org/trunk/ST80-mt.261.mcz ==================== Summary ==================== Name: ST80-mt.261 Author: mt Time: 11 October 2020, 1:39:28.392652 pm UUID: f6cd6d00-8e76-6d46-86b0-aba6ab9b6db4 Ancestors: ST80-eem.260 Refactoring 'Active' variables -- Step 2 of 2. Removes all uses of Active(World|Hand|Event) by replacing those with "self current(World|Hand|Event)" or "Project current world" when required to not add/cement Morphic dependency. See http://forum.world.st/Changeset-Eliminating-global-state-from-Morphic-td5121690.html =============== Diff against ST80-eem.260 =============== Item was changed: ----- Method: FillInTheBlank class>>request: (in category 'instance creation') ----- request: queryString "Create an instance of me whose question is queryString. Invoke it centered at the cursor, and answer the string the user accepts. Answer the empty string if the user cancels." "UIManager default request: 'Your name?'" ^ self request: queryString initialAnswer: '' + centerAt: (self currentHand ifNil: [Sensor]) cursorPoint! - centerAt: (ActiveHand ifNil:[Sensor]) cursorPoint! Item was changed: ----- Method: FillInTheBlank class>>request:initialAnswer: (in category 'instance creation') ----- request: queryString initialAnswer: defaultAnswer "Create an instance of me whose question is queryString with the given initial answer. Invoke it centered at the given point, and answer the string the user accepts. Answer the empty string if the user cancels." "UIManager default request: 'What is your favorite color?' initialAnswer: 'red, no blue. Ahhh!!'" ^ self request: queryString initialAnswer: defaultAnswer + centerAt: (self currentHand ifNil: [Sensor]) cursorPoint! - centerAt: (ActiveHand ifNil:[Sensor]) cursorPoint! Item was changed: ----- Method: FillInTheBlank class>>request:initialAnswer:onCancelReturn: (in category 'instance creation') ----- request: queryString initialAnswer: defaultAnswer onCancelReturn: cancelResponse ^ self request: queryString initialAnswer: defaultAnswer + centerAt: (self currentHand ifNil: [Sensor]) cursorPoint - centerAt: (ActiveHand ifNil:[Sensor]) cursorPoint onCancelReturn: cancelResponse! Item was changed: ----- Method: ParagraphEditor>>escapeToDesktop: (in category 'nonediting/nontyping keys') ----- escapeToDesktop: characterStream "Pop up a morph to field keyboard input in the context of the desktop" + Smalltalk isMorphic ifTrue: [ + Project current world putUpWorldMenuFromEscapeKey]. - Smalltalk isMorphic ifTrue: [ActiveWorld putUpWorldMenuFromEscapeKey]. ^ true! From commits at source.squeak.org Sun Oct 11 11:40:56 2020 From: commits at source.squeak.org (commits at source.squeak.org) Date: Sun, 11 Oct 2020 11:40:56 0000 Subject: [squeak-dev] The Trunk: HelpSystem-Core-mt.120.mcz Message-ID: Marcel Taeumel uploaded a new version of HelpSystem-Core to project The Trunk: http://source.squeak.org/trunk/HelpSystem-Core-mt.120.mcz ==================== Summary ==================== Name: HelpSystem-Core-mt.120 Author: mt Time: 11 October 2020, 1:40:55.555652 pm UUID: ad2163d8-cd30-1249-9456-6cb2ff709fe0 Ancestors: HelpSystem-Core-mt.119 Refactoring 'Active' variables -- Step 2 of 2. Removes all uses of Active(World|Hand|Event) by replacing those with "self current(World|Hand|Event)" or "Project current world" when required to not add/cement Morphic dependency. See http://forum.world.st/Changeset-Eliminating-global-state-from-Morphic-td5121690.html =============== Diff against HelpSystem-Core-mt.119 =============== Item was changed: ----- Method: SearchTopic>>triggerUpdateContents (in category 'private') ----- triggerUpdateContents self mutex critical: [ updatePending == true ifFalse: [ updatePending := true. + Project current addDeferredUIMessage: [Project current world - Project current addDeferredUIMessage: [ActiveWorld addAlarm: #updateContents withArguments: #() + for: self + at: Time millisecondClockValue + 250]]].! - for: self at: Time millisecondClockValue + 250] ] ]. - ! From commits at source.squeak.org Sun Oct 11 11:41:26 2020 From: commits at source.squeak.org (commits at source.squeak.org) Date: Sun, 11 Oct 2020 11:41:26 0000 Subject: [squeak-dev] The Trunk: Monticello-mt.730.mcz Message-ID: Marcel Taeumel uploaded a new version of Monticello to project The Trunk: http://source.squeak.org/trunk/Monticello-mt.730.mcz ==================== Summary ==================== Name: Monticello-mt.730 Author: mt Time: 11 October 2020, 1:41:24.302652 pm UUID: fd9bc152-dab5-f241-9807-5a83b2d4a239 Ancestors: Monticello-ul.729 Refactoring 'Active' variables -- Step 2 of 2. Removes all uses of Active(World|Hand|Event) by replacing those with "self current(World|Hand|Event)" or "Project current world" when required to not add/cement Morphic dependency. See http://forum.world.st/Changeset-Eliminating-global-state-from-Morphic-td5121690.html =============== Diff against Monticello-ul.729 =============== Item was changed: ----- Method: MCCodeTool>>browseFullProtocol (in category 'menus') ----- browseFullProtocol "Open up a protocol-category browser on the value of the receiver's current selection. If in mvc, an old-style protocol browser is opened instead. Someone who still uses mvc might wish to make the protocol-category-browser work there too, thanks." - | aClass | - (Smalltalk isMorphic and: [Smalltalk hasClassNamed: #Lexicon]) ifFalse: [^ self spawnFullProtocol]. + self selectedClassOrMetaClass ifNotNil: [:class | + ^ (Smalltalk at: #Lexicon) new + openOnClass: class + inWorld: self currentWorld + showingSelector: self selectedMessageName]. + ^ nil! - (aClass := self selectedClassOrMetaClass) ifNotNil: - [(Smalltalk at: #Lexicon) new openOnClass: aClass inWorld: ActiveWorld showingSelector: self selectedMessageName]! From commits at source.squeak.org Sun Oct 11 11:42:06 2020 From: commits at source.squeak.org (commits at source.squeak.org) Date: Sun, 11 Oct 2020 11:42:06 0000 Subject: [squeak-dev] The Trunk: MorphicExtras-mt.277.mcz Message-ID: Marcel Taeumel uploaded a new version of MorphicExtras to project The Trunk: http://source.squeak.org/trunk/MorphicExtras-mt.277.mcz ==================== Summary ==================== Name: MorphicExtras-mt.277 Author: mt Time: 11 October 2020, 1:42:03.313652 pm UUID: e6043696-c235-7545-8b29-fdf608dbed76 Ancestors: MorphicExtras-kfr.276 Refactoring 'Active' variables -- Step 2 of 2. Removes all uses of Active(World|Hand|Event) by replacing those with "self current(World|Hand|Event)" or "Project current world" when required to not add/cement Morphic dependency. See http://forum.world.st/Changeset-Eliminating-global-state-from-Morphic-td5121690.html =============== Diff against MorphicExtras-kfr.276 =============== Item was changed: ----- Method: BookMorph class>>openFromFile: (in category 'fileIn/Out') ----- openFromFile: fullName "Reconstitute a Morph from the selected file, presumed to be represent a Morph saved via the SmartRefStream mechanism, and open it in an appropriate Morphic world" | book aFileStream | Smalltalk verifyMorphicAvailability ifFalse: [^ self]. aFileStream := FileStream readOnlyFileNamed: fullName. book := BookMorph new. book setProperty: #url toValue: aFileStream url. book fromRemoteStream: aFileStream. aFileStream close. Smalltalk isMorphic + ifTrue: [self currentWorld addMorphsAndModel: book] + ifFalse: [book isMorph ifFalse: [^self inform: 'Can only load a single morph\into an mvc project via this mechanism.' withCRs translated]. - ifTrue: [ActiveWorld addMorphsAndModel: book] - ifFalse: - [book isMorph ifFalse: [^self inform: 'Can only load a single morph - into an mvc project via this mechanism.' translated]. book openInWorld]. book goToPage: 1! Item was changed: ----- Method: BookMorph>>findText:inStrings:startAt:container:pageNum: (in category 'menu') ----- findText: keys inStrings: rawStrings startAt: startIndex container: oldContainer pageNum: pageNum "Call once to search a page of the book. Return true if found and highlight the text. oldContainer should be NIL. (oldContainer is only non-nil when (1) doing a 'search again' and (2) the page is in memory and (3) keys has just one element. oldContainer is a TextMorph.)" | container wasIn strings old good insideOf place start | good := true. start := startIndex. strings := oldContainer ifNil: ["normal case" rawStrings] ifNotNil: [(pages at: pageNum) isInMemory ifFalse: [rawStrings] ifTrue: [(pages at: pageNum) allStringsAfter: oldContainer]]. keys do: [:searchString | | thisWord | "each key" good ifTrue: [thisWord := false. strings do: [:longString | | index | (index := longString findString: searchString startingAt: start caseSensitive: false) > 0 ifTrue: [thisWord not & (searchString == keys first) ifTrue: [insideOf := longString. place := index]. thisWord := true]. start := 1]. "only first key on first container" good := thisWord]]. good ifTrue: ["all are on this page" wasIn := (pages at: pageNum) isInMemory. self goToPage: pageNum. wasIn ifFalse: ["search again, on the real current text. Know page is in." ^self findText: keys inStrings: ((pages at: pageNum) allStringsAfter: nil) startAt: startIndex container: oldContainer pageNum: pageNum "recompute"]]. (old := self valueOfProperty: #searchContainer) ifNotNil: [(old respondsTo: #editor) ifTrue: [old editor selectFrom: 1 to: 0. "trying to remove the previous selection!!" old changed]]. good ifTrue: ["have the exact string object" (container := oldContainer) ifNil: [container := self highlightText: keys first at: place in: insideOf] ifNotNil: [container userString == insideOf ifFalse: [container := self highlightText: keys first at: place in: insideOf] ifTrue: [(container isTextMorph) ifTrue: [container editor selectFrom: place to: keys first size - 1 + place. container changed]]]. self setProperty: #searchContainer toValue: container. self setProperty: #searchOffset toValue: place. self setProperty: #searchKey toValue: keys. "override later" + self currentHand newKeyboardFocus: container. - ActiveHand newKeyboardFocus: container. ^true]. ^false! Item was changed: ----- Method: BookMorph>>goToPageMorph:transitionSpec: (in category 'navigation') ----- goToPageMorph: newPage transitionSpec: transitionSpec "Go to a page, which is assumed to be an element of my pages array (if it is not, this method returns quickly. Apply the transitionSpec provided." | pageIndex aWorld oldPageIndex ascending tSpec readIn | pages isEmpty ifTrue: [^self]. self setProperty: #searchContainer toValue: nil. "forget previous search" self setProperty: #searchOffset toValue: nil. self setProperty: #searchKey toValue: nil. pageIndex := pages identityIndexOf: newPage ifAbsent: [^self "abort"]. readIn := newPage isInMemory not. oldPageIndex := pages identityIndexOf: currentPage ifAbsent: [nil]. ascending := (oldPageIndex isNil or: [newPage == currentPage]) ifTrue: [nil] ifFalse: [oldPageIndex < pageIndex]. tSpec := transitionSpec ifNil: ["If transition not specified by requestor..." newPage valueOfProperty: #transitionSpec ifAbsent: [" ... then consult new page" self transitionSpecFor: self " ... otherwise this is the default"]]. self flag: #arNote. "Probably unnecessary" (aWorld := self world) ifNotNil: [self primaryHand releaseKeyboardFocus]. currentPage ifNotNil: [currentPage updateCachedThumbnail]. self currentPage notNil ifTrue: [(((pages at: pageIndex) owner isKindOf: TransitionMorph) and: [(pages at: pageIndex) isInWorld]) ifTrue: [^self "In the process of a prior pageTurn"]. self currentPlayerDo: [:aPlayer | aPlayer runAllClosingScripts]. + self removeViewersOnSubsIn: self currentWorld presenter. - self removeViewersOnSubsIn: ActiveWorld presenter. ascending ifNotNil: ["Show appropriate page transition and start new page when done" currentPage stopStepping. (pages at: pageIndex) position: currentPage position. ^(TransitionMorph effect: tSpec second direction: tSpec third inverse: (ascending or: [transitionSpec notNil]) not) showTransitionFrom: currentPage to: (pages at: pageIndex) in: self whenStart: [self playPageFlipSound: tSpec first] whenDone: [currentPage delete; fullReleaseCachedState. self insertPageMorphInCorrectSpot: (pages at: pageIndex). self adjustCurrentPageForFullScreen. self snapToEdgeIfAppropriate. aWorld ifNotNil: [self world startSteppingSubmorphsOf: currentPage]. self currentPlayerDo: [:aPlayer | aPlayer runAllOpeningScripts]. (aWorld := self world) ifNotNil: ["WHY??" aWorld displayWorld]. readIn ifTrue: [currentPage updateThumbnailUrlInBook: self url. currentPage sqkPage computeThumbnail "just store it"]]]. "No transition, but at least decommission current page" currentPage delete; fullReleaseCachedState]. self insertPageMorphInCorrectSpot: (pages at: pageIndex). "sets currentPage" self adjustCurrentPageForFullScreen. self snapToEdgeIfAppropriate. aWorld ifNotNil: [self world startSteppingSubmorphsOf: currentPage]. self currentPlayerDo: [:aPlayer | aPlayer runAllOpeningScripts]. (aWorld := self world) ifNotNil: ["WHY??" aWorld displayWorld]. readIn ifTrue: [currentPage updateThumbnailUrl. currentPage sqkPage computeThumbnail "just store it"]. + self currentWorld presenter flushPlayerListCache.! - ActiveWorld ifNotNil: [ActiveWorld presenter flushPlayerListCache]! Item was changed: ----- Method: FlapTab>>toggleIsGlobalFlap (in category 'globalness') ----- toggleIsGlobalFlap "Toggle whether the receiver is currently a global flap or not" | oldWorld | self hideFlap. oldWorld := self currentWorld. self isGlobalFlap ifTrue: [Flaps removeFromGlobalFlapTabList: self. oldWorld addMorphFront: self] ifFalse: [self delete. Flaps addGlobalFlap: self. self currentWorld addGlobalFlaps]. + self currentWorld reformulateUpdatingMenus.! - ActiveWorld reformulateUpdatingMenus - ! Item was changed: ----- Method: Flaps class>>addLocalFlap (in category 'new flap') ----- addLocalFlap - "Menu command -- let the user add a new project-local flap. Once the new flap is born, the user can tell it to become a shared flap. Obtain an initial name and edge for the flap, launch the flap, and also launch a menu governing the flap, so that the user can get started right away with customizing it." + ^ self addLocalFlap: self currentEvent! - | aMenu reply aFlapTab aWorld edge | - edge := self askForEdgeOfNewFlap. - - edge ifNotNil: - [reply := UIManager default request: 'Wording for this flap: ' translated initialAnswer: 'Flap' translated. - reply isEmptyOrNil ifFalse: - [aFlapTab := self newFlapTitled: reply onEdge: edge. - (aWorld := self currentWorld) addMorphFront: aFlapTab. - aFlapTab adaptToWorld: aWorld. - aMenu := aFlapTab buildHandleMenu: ActiveHand. - aFlapTab addTitleForHaloMenu: aMenu. - aFlapTab computeEdgeFraction. - aMenu popUpEvent: ActiveEvent in: ActiveWorld]] - - ! Item was added: + ----- Method: Flaps class>>addLocalFlap: (in category 'new flap') ----- + addLocalFlap: anEvent + "Menu command -- let the user add a new project-local flap. Once the new flap is born, the user can tell it to become a shared flap. Obtain an initial name and edge for the flap, launch the flap, and also launch a menu governing the flap, so that the user can get started right away with customizing it." + + | title edge | + edge := self askForEdgeOfNewFlap. + edge ifNil: [^ self]. + + title := UIManager default request: 'Wording for this flap:' translated initialAnswer: 'Flap' translated. + title isEmptyOrNil ifTrue: [^ self]. + + ^ self addLocalFlap: anEvent titled: title onEdge: edge! Item was added: + ----- Method: Flaps class>>addLocalFlap:titled:onEdge: (in category 'new flap') ----- + addLocalFlap: anEvent titled: title onEdge: edge + + | flapTab menu world | + flapTab := self newFlapTitled: title onEdge: edge. + (world := anEvent hand world) addMorphFront: flapTab. + flapTab adaptToWorld: world. + menu := flapTab buildHandleMenu: anEvent hand. + flapTab addTitleForHaloMenu: menu. + flapTab computeEdgeFraction. + menu popUpEvent: anEvent in: world.! Item was changed: ----- Method: Flaps class>>disableGlobalFlaps: (in category 'menu commands') ----- disableGlobalFlaps: interactive "Clobber all the shared flaps structures. First read the user her Miranda rights." interactive ifTrue: [(self confirm: 'CAUTION!! This will destroy all the shared flaps, so that they will not be present in *any* project. If, later, you want them back, you will have to reenable them, from this same menu, whereupon the standard default set of shared flaps will be created. Do you really want to go ahead and clobber all shared flaps at this time?' translated) ifFalse: [^ self]]. self globalFlapTabsIfAny do: [:aFlapTab | self removeFlapTab: aFlapTab keepInList: false. aFlapTab isInWorld ifTrue: [self error: 'Flap problem' translated]]. self clobberFlapTabList. self initializeFlapsQuads. SharedFlapsAllowed := false. + Smalltalk isMorphic ifTrue: [ + Project current world + restoreMorphicDisplay; + reformulateUpdatingMenus]. + - Smalltalk isMorphic ifTrue: - [ActiveWorld restoreMorphicDisplay. - ActiveWorld reformulateUpdatingMenus]. - "The following reduces the risk that flaps will be created with variant IDs such as 'Stack Tools2', potentially causing some shared flap logic to fail." + "Smalltalk garbageCollect." "-- see if we are OK without this"! - "Smalltalk garbageCollect." "-- see if we are OK without this" - ! Item was changed: ----- Method: Flaps class>>enableClassicNavigatorChanged (in category 'miscellaneous') ----- enableClassicNavigatorChanged "The #classicNavigatorEnabled preference has changed. No senders in easily traceable in the image, but this is really sent by a Preference object!!" Preferences classicNavigatorEnabled ifTrue: [Flaps disableGlobalFlapWithID: 'Navigator' translated. Preferences enable: #showProjectNavigator. self disableGlobalFlapWithID: 'Navigator' translated.] ifFalse: [self enableGlobalFlapWithID: 'Navigator' translated. + Project current world addGlobalFlaps]. - ActiveWorld addGlobalFlaps]. self doAutomaticLayoutOfFlapsIfAppropriate. Project current assureNavigatorPresenceMatchesPreference. + Project current world reformulateUpdatingMenus.! - ActiveWorld reformulateUpdatingMenus! Item was changed: ----- Method: Flaps class>>enableGlobalFlaps (in category 'menu support') ----- enableGlobalFlaps "Start using global flaps, given that they were not present." + Cursor wait showWhile: [ + SharedFlapsAllowed := true. - Cursor wait showWhile: - [SharedFlapsAllowed := true. self globalFlapTabs. "This will create them" + Smalltalk isMorphic ifTrue: [ + Project current world addGlobalFlaps. - Smalltalk isMorphic ifTrue: - [ActiveWorld addGlobalFlaps. self doAutomaticLayoutOfFlapsIfAppropriate. + FlapTab allInstancesDo: [:tab | tab computeEdgeFraction]. + Project current world reformulateUpdatingMenus]]! - FlapTab allInstancesDo: - [:aTab | aTab computeEdgeFraction]. - ActiveWorld reformulateUpdatingMenus]]! Item was changed: ----- Method: Flaps class>>enableOnlyGlobalFlapsWithIDs: (in category 'shared flaps') ----- enableOnlyGlobalFlapsWithIDs: survivorList "In the current project, suppress all global flaps other than those with ids in the survivorList" + self globalFlapTabsIfAny do: [:flapTab | + (survivorList includes: flapTab flapID) + ifTrue: [self enableGlobalFlapWithID: flapTab flapID] + ifFalse: [self disableGlobalFlapWithID: flapTab flapID]]. + Project current world addGlobalFlaps - self globalFlapTabsIfAny do: [:aFlapTab | - (survivorList includes: aFlapTab flapID) - ifTrue: - [self enableGlobalFlapWithID: aFlapTab flapID] - ifFalse: - [self disableGlobalFlapWithID: aFlapTab flapID]]. - ActiveWorld addGlobalFlaps "Flaps enableOnlyGlobalFlapsWithIDs: #('Supplies')"! Item was changed: ----- Method: Flaps class>>makeNavigatorFlapResembleGoldenBar (in category 'miscellaneous') ----- makeNavigatorFlapResembleGoldenBar "At explicit request, make the flap-based navigator resemble the golden bar. No senders in the image, but sendable from a doit" "Flaps makeNavigatorFlapResembleGoldenBar" Preferences setPreference: #classicNavigatorEnabled toValue: false. Preferences setPreference: #showProjectNavigator toValue: false. (self globalFlapTabWithID: 'Navigator' translated) ifNil: [SharedFlapTabs add: self newNavigatorFlap delete]. self enableGlobalFlapWithID: 'Navigator' translated. Preferences setPreference: #navigatorOnLeftEdge toValue: true. (self globalFlapTabWithID: 'Navigator' translated) arrangeToPopOutOnMouseOver: true. + Project current world addGlobalFlaps. - ActiveWorld addGlobalFlaps. self doAutomaticLayoutOfFlapsIfAppropriate. + Project current assureNavigatorPresenceMatchesPreference. ! - Project current assureNavigatorPresenceMatchesPreference. - ! Item was changed: ----- Method: Flaps class>>positionVisibleFlapsRightToLeftOnEdge:butPlaceAtLeftFlapsWithIDs: (in category 'shared flaps') ----- positionVisibleFlapsRightToLeftOnEdge: edgeSymbol butPlaceAtLeftFlapsWithIDs: idList "Lay out flaps along the designated edge right-to-left, while laying left-to-right any flaps found in the exception list Flaps positionVisibleFlapsRightToLeftOnEdge: #bottom butPlaceAtLeftFlapWithIDs: {'Navigator' translated. 'Supplies' translated} Flaps sharedFlapsAlongBottom" | leftX flapList flapsOnRight flapsOnLeft | flapList := self globalFlapTabsIfAny select: [:aFlapTab | aFlapTab isInWorld and: [aFlapTab edgeToAdhereTo == edgeSymbol]]. flapsOnLeft := OrderedCollection new. flapsOnRight := OrderedCollection new. flapList do: [:fl | (idList includes: fl flapID) ifTrue: [ flapsOnLeft addLast: fl ] ifFalse: [ flapsOnRight addLast: fl ] ]. + leftX := Project current world width - 15. - leftX := ActiveWorld width - 15. flapsOnRight sort: [:f1 :f2 | f1 left > f2 left]; do: [:aFlapTab | aFlapTab right: leftX - 3. leftX := aFlapTab left]. + leftX := Project current world left. - leftX := ActiveWorld left. flapsOnLeft sort: [:f1 :f2 | f1 left > f2 left]; do: [:aFlapTab | aFlapTab left: leftX + 3. leftX := aFlapTab right]. flapList do: [:ft | ft computeEdgeFraction. ft flapID = 'Navigator' translated ifTrue: [ft referent left: (ft center x - (ft referent width//2) max: 0)]]! Item was changed: ----- Method: Flaps class>>possiblyReplaceEToyFlaps (in category 'construction support') ----- possiblyReplaceEToyFlaps "If in eToyFriendly mode, and if it's ok to reinitialize flaps, replace the existing flaps with up-too-date etoy flaps. Caution: this is destructive of existing flaps. If preserving the contents of existing flaps is important, set the preference 'okToReinitializeFlaps' to true" PartsBin thumbnailForPartsDescription: StickyPadMorph descriptionForPartsBin. "Puts StickyPadMorph's custom icon back in the cache which typically will have been called" (Preferences eToyFriendly and: [Preferences okToReinitializeFlaps]) ifTrue: [Flaps disableGlobalFlaps: false. Flaps addAndEnableEToyFlaps. + Smalltalk isMorphic ifTrue: [Project current world enableGlobalFlaps]]. - Smalltalk isMorphic ifTrue: [ActiveWorld enableGlobalFlaps]]. "PartsBin clearThumbnailCache" "Flaps possiblyReplaceEToyFlaps"! Item was changed: ----- Method: Flaps class>>setUpSuppliesFlapOnly (in category 'menu support') ----- setUpSuppliesFlapOnly "Set up the Supplies flap as the only shared flap. A special version formulated for this stand-alone use is used, defined in #newLoneSuppliesFlap" | supplies | SharedFlapTabs isEmptyOrNil ifFalse: "get rid of pre-existing guys if any" [SharedFlapTabs do: [:t | t referent delete. t delete]]. SharedFlapsAllowed := true. SharedFlapTabs := OrderedCollection new. SharedFlapTabs add: (supplies := self newLoneSuppliesFlap). self enableGlobalFlapWithID: 'Supplies' translated. supplies setToPopOutOnMouseOver: false. + Smalltalk isMorphic ifTrue: [ + Project current world + addGlobalFlaps; + reformulateUpdatingMenus].! - Smalltalk isMorphic ifTrue: - [ActiveWorld addGlobalFlaps. - ActiveWorld reformulateUpdatingMenus]! Item was changed: ----- Method: HandMorphForReplay>>processEvents (in category 'event handling') ----- processEvents "Play back the next event" | evt hadMouse hadAny tracker | suspended == true ifTrue: [^ self]. hadMouse := hadAny := false. tracker := recorder objectTrackingEvents. [(evt := recorder nextEventToPlay) isNil] whileFalse: [ ((evt isMemberOf: MouseMoveEvent) and: [evt trail isNil]) ifTrue: [^ self]. tracker ifNotNil: [tracker currentEventTimeStamp: evt timeStamp]. evt type == #EOF ifTrue: + [recorder pauseIn: self currentWorld. - [recorder pauseIn: ActiveWorld. ^ self]. evt type == #startSound ifTrue: [recorder perhapsPlaySound: evt argument. recorder synchronize. ^ self]. evt type == #startEventPlayback ifTrue: [evt argument launchPlayback. recorder synchronize. ^ self]. evt type == #noteTheatreBounds ifTrue: ["The argument holds the content rect --for now we don't make any use of that info in this form." ^ self]. evt isMouse ifTrue: [hadMouse := true]. (evt isMouse or: [evt isKeyboard]) ifTrue: [self handleEvent: (evt setHand: self) resetHandlerFields. hadAny := true]]. (mouseClickState notNil and: [hadMouse not]) ifTrue: ["No mouse events during this cycle. Make sure click states time out accordingly" mouseClickState handleEvent: lastMouseEvent asMouseMove from: self]. hadAny ifFalse: ["No pending events. Make sure z-order is up to date" self mouseOverHandler processMouseOver: lastMouseEvent]! Item was changed: ----- Method: InternalThreadNavigationMorph class>>openThreadNamed:atIndex:beKeyboardHandler: (in category 'known threads') ----- openThreadNamed: nameOfThread atIndex: anInteger beKeyboardHandler: aBoolean "Activate the thread of the given name, from the given index; set it up to be navigated via desktop keys if indicated" | coll nav | coll := self knownThreads at: nameOfThread ifAbsent: [^self]. nav := Project current world submorphThat: [ :each | (each isKindOf: self) and: [each threadName = nameOfThread]] ifNone: [nav := self basicNew. nav listOfPages: coll; threadName: nameOfThread index: anInteger; initialize; openInWorld; positionAppropriately. + aBoolean ifTrue: [Project current world keyboardNavigationHandler: nav]. - aBoolean ifTrue: [ActiveWorld keyboardNavigationHandler: nav]. ^ self]. nav listOfPages: coll; threadName: nameOfThread index: anInteger; removeAllMorphs; addButtons. + aBoolean ifTrue: [Project current world keyboardNavigationHandler: nav].! - aBoolean ifTrue: [ActiveWorld keyboardNavigationHandler: nav] - - ! Item was changed: ----- Method: InternalThreadNavigationMorph>>destroyThread (in category 'navigation') ----- destroyThread "Manually destroy the thread" (self confirm: ('Destroy thread <{1}> ?' translated format:{threadName})) ifFalse: [^ self]. self class knownThreads removeKey: threadName ifAbsent: []. self setProperty: #moribund toValue: true. "In case pointed to in some other project" + self currentWorld keyboardNavigationHandler == self ifTrue: - ActiveWorld keyboardNavigationHandler == self ifTrue: [self stopKeyboardNavigation]. + self delete.! - self delete! Item was changed: ----- Method: InternalThreadNavigationMorph>>loadPageWithProgress (in category 'private') ----- loadPageWithProgress "Load the desired page, showing a progress indicator as we go" | projectInfo projectName beSpaceHandler | projectInfo := listOfPages at: currentIndex. projectName := projectInfo first. loadedProject := Project named: projectName. self class know: listOfPages as: threadName. + beSpaceHandler := (Project current world keyboardNavigationHandler == self). + self currentWorld addDeferredUIMessage: - beSpaceHandler := (ActiveWorld keyboardNavigationHandler == self). - WorldState addDeferredUIMessage: [InternalThreadNavigationMorph openThreadNamed: threadName atIndex: currentIndex beKeyboardHandler: beSpaceHandler]. loadedProject ifNil: [ ComplexProgressIndicator new targetMorph: self; historyCategory: 'project loading' translated; withProgressDo: [ [ loadedProject := Project current fromMyServerLoad: projectName ] on: ProjectViewOpenNotification do: [ :ex | ex resume: false] "we probably don't want a project view morph in this case" ]. ]. loadedProject ifNil: [ ^self inform: 'I cannot find that project' translated ]. self delete. + loadedProject enter.! - loadedProject enter. - ! Item was changed: ----- Method: InternalThreadNavigationMorph>>moreCommands (in category 'navigation') ----- moreCommands "Put up a menu of options" | allThreads aMenu others target | allThreads := self class knownThreads. aMenu := MenuMorph new defaultTarget: self. aMenu addTitle: 'navigation' translated. Preferences noviceMode ifFalse:[ self flag: #deferred. "Probably don't want that stay-up item, not least because the navigation-keystroke stuff is not dynamically handled" aMenu addStayUpItem ]. others := (allThreads keys reject: [ :each | each = threadName]) asArray sort. others do: [ :each | aMenu add: ('switch to <{1}>' translated format:{each}) selector: #switchToThread: argument: each ]. aMenu addList: { {'switch to recent projects' translated. #getRecentThread}. #-. {'create a new thread' translated. #threadOfNoProjects}. {'edit this thread' translated. #editThisThread}. {'create thread of all projects' translated. #threadOfAllProjects}. #-. {'First project in thread' translated. #firstPage}. {'Last project in thread' translated. #lastPage} }. (target := self currentIndex + 2) > listOfPages size ifFalse: [ aMenu add: ('skip over next project ({1})' translated format:{(listOfPages at: target - 1) first}) action: #skipOverNext ]. aMenu addList: { {'jump within this thread' translated. #jumpWithinThread}. {'insert new project' translated. #insertNewProject}. #-. {'simply close this navigator' translated. #delete}. {'destroy this thread' translated. #destroyThread}. #- }. + (self currentWorld keyboardNavigationHandler == self) ifFalse:[ - (ActiveWorld keyboardNavigationHandler == self) ifFalse:[ aMenu add: 'start keyboard navigation with this thread' translated action: #startKeyboardNavigation ] ifTrue: [ aMenu add: 'stop keyboard navigation with this thread' translated action: #stopKeyboardNavigation ]. + aMenu popUpInWorld.! - aMenu popUpInWorld. - ! Item was changed: ----- Method: InternalThreadNavigationMorph>>positionAppropriately (in category 'navigation') ----- positionAppropriately + | others world otherRects overlaps bottomRight | - | others otherRects overlaps bottomRight | (self ownerThatIsA: HandMorph) ifNotNil: [^self]. + others := (world := Project currentWorld) submorphs select: [ :each | each ~~ self and: [each isKindOf: self class]]. - others := ActiveWorld submorphs select: [ :each | each ~~ self and: [each isKindOf: self class]]. otherRects := others collect: [ :each | each bounds]. + bottomRight := (world hasProperty: #threadNavigatorPosition) + ifTrue: [world valueOfProperty: #threadNavigatorPosition] + ifFalse: [world bottomRight]. - bottomRight := (ActiveWorld hasProperty: #threadNavigatorPosition) ifTrue: [ - ActiveWorld valueOfProperty: #threadNavigatorPosition. - ] ifFalse: [ - ActiveWorld bottomRight. - ]. self align: self fullBounds bottomRight with: bottomRight. self setProperty: #previousWorldBounds toValue: self world bounds. [ overlaps := false. otherRects do: [ :r | (r intersects: bounds) ifTrue: [overlaps := true. self bottom: r top]. ]. self top < self world top ifTrue: [ self bottom: bottomRight y. self right: self left - 1. ]. overlaps ] whileTrue.! Item was changed: ----- Method: InternalThreadNavigationMorph>>startKeyboardNavigation (in category 'navigation') ----- startKeyboardNavigation "Tell the active world to starting navigating via desktop keyboard navigation via me" + self currentWorld keyboardNavigationHandler: self! - ActiveWorld keyboardNavigationHandler: self! Item was changed: ----- Method: InternalThreadNavigationMorph>>stopKeyboardNavigation (in category 'navigation') ----- stopKeyboardNavigation "Cease navigating via the receiver in response to desktop keystrokes" + self currentWorld removeProperty: #keyboardNavigationHandler! - ActiveWorld removeProperty: #keyboardNavigationHandler! Item was changed: ----- Method: ObjectsTool>>showSearchPane (in category 'search') ----- showSearchPane "Set the receiver up so that it shows the search pane" | tabsPane aPane | modeSymbol == #search ifTrue: [ ^self ]. self partsBin removeAllMorphs. tabsPane := self tabsPane. aPane := self newSearchPane. self replaceSubmorph: tabsPane by: aPane. self modeSymbol: #search. self showMorphsMatchingSearchString. + self currentHand newKeyboardFocus: aPane! - ActiveHand newKeyboardFocus: aPane! Item was changed: ----- Method: ProjectNavigationMorph>>undoButtonWording (in category 'stepping and presenter') ----- undoButtonWording "Answer the wording for the Undo button." | wdng | + wdng := Project current world commandHistory undoOrRedoMenuWording. + (wdng endsWith: ' (z)') ifTrue: [ + wdng := wdng copyFrom: 1to: wdng size - 4]. - wdng := ActiveWorld commandHistory undoOrRedoMenuWording. - (wdng endsWith: ' (z)') ifTrue: - [wdng := wdng copyFrom: 1to: wdng size - 4]. ^ wdng! Item was changed: ----- Method: ProjectNavigationMorph>>undoOrRedoLastCommand (in category 'the actions') ----- undoOrRedoLastCommand "Undo or redo the last command, as approrpiate." + ^ Project current world commandHistory undoOrRedoCommand! - ActiveWorld commandHistory undoOrRedoCommand! Item was changed: ----- Method: SketchEditorMorph>>cancelOutOfPainting (in category 'start & finish') ----- cancelOutOfPainting "The user requested to back out of a painting session without saving" self deleteSelfAndSubordinates. emptyPicBlock ifNotNil: [emptyPicBlock value]. "note no args to block!!" hostView ifNotNil: [hostView changed]. + Project current world resumeScriptsPausedByPainting. - ActiveWorld resumeScriptsPausedByPainting. ^ nil! Item was changed: ----- Method: SketchEditorMorph>>deliverPainting:evt: (in category 'start & finish') ----- deliverPainting: result evt: evt "Done painting. May come from resume, or from original call. Execute user's post painting instructions in the block. Always use this standard one. 4/21/97 tk" | newBox newForm ans | palette ifNotNil: "nil happens" [palette setAction: #paint: evt: evt]. "Get out of odd modes" "rot := palette getRotations." "rotate with heading, or turn to and fro" "palette setRotation: #normal." result == #cancel ifTrue: [ ans := UIManager default chooseFrom: { 'throw it away' translated. 'keep painting it' translated. } title: 'Do you really want to throw away what you just painted?' translated. ^ ans = 1 ifTrue: [self cancelOutOfPainting] ifFalse: [nil]]. "cancelled out of cancelling." "hostView rotationStyle: rot." "rotate with heading, or turn to and fro" newBox := paintingForm rectangleEnclosingPixelsNotOfColor: Color transparent. registrationPoint ifNotNil: [registrationPoint := registrationPoint - newBox origin]. "relative to newForm origin" newForm := Form extent: newBox extent depth: paintingForm depth. newForm copyBits: newBox from: paintingForm at: 0 at 0 clippingBox: newForm boundingBox rule: Form over fillColor: nil. newForm isAllWhite ifTrue: [ (self valueOfProperty: #background) == true ifFalse: [^ self cancelOutOfPainting]]. newForm fixAlpha. "so alpha channel stays intact for 32bpp" self delete. "so won't find me again" dimForm ifNotNil: [dimForm delete]. newPicBlock value: newForm value: (newBox copy translateBy: bounds origin). + Project current world resumeScriptsPausedByPainting.! - ActiveWorld resumeScriptsPausedByPainting - - ! Item was removed: - ----- Method: WorldState>>activeHand: (in category '*MorphicExtras-hands') ----- - activeHand: aHandMorph - "still needed until event loop with old code goes away" - ActiveHand := aHandMorph.! Item was changed: ----- Method: WorldState>>doOneCycleInBackground (in category '*MorphicExtras-update cycle') ----- doOneCycleInBackground "Do one cycle of the interactive loop. This method is called repeatedly when this world is not the active window but is running in the background." + self halt. "not ready for prime time" + - self halt. "not ready for prime time" - "process user input events, but only for remote hands" + self handsDo: [:hand | + (hand isKindOf: RemoteHandMorph) ifTrue: [ + hand becomeActiveDuring: [ + hand processEvents]]]. + - self handsDo: [:h | - (h isKindOf: RemoteHandMorph) ifTrue: [ - ActiveHand := h. - h processEvents. - ActiveHand := nil]]. - self runStepMethods. + self displayWorldSafely.! - self displayWorldSafely. - ! Item was changed: ----- Method: ZASMCameraMarkMorph>>setTransition (in category 'menu') ----- setTransition "Set the transition" + ^ self setTransition: self currentEvent! - ^ self setTransition: ActiveEvent! From commits at source.squeak.org Sun Oct 11 11:43:11 2020 From: commits at source.squeak.org (commits at source.squeak.org) Date: Sun, 11 Oct 2020 11:43:11 0000 Subject: [squeak-dev] The Trunk: MorphicTests-mt.67.mcz Message-ID: Marcel Taeumel uploaded a new version of MorphicTests to project The Trunk: http://source.squeak.org/trunk/MorphicTests-mt.67.mcz ==================== Summary ==================== Name: MorphicTests-mt.67 Author: mt Time: 11 October 2020, 1:43:10.847652 pm UUID: c53bd4c8-984d-1748-ae1a-d9fee789872f Ancestors: MorphicTests-pre.66 Refactoring 'Active' variables -- Step 2 of 2. Adds tests to harden this refactoring for the future. :-) See http://forum.world.st/Changeset-Eliminating-global-state-from-Morphic-td5121690.html =============== Diff against MorphicTests-pre.66 =============== Item was added: + ----- Method: WorldStateTest>>testActiveVariablesObsoletion (in category 'tests') ----- + testActiveVariablesObsoletion + "Only the code for backwards compatibility may access the bindings for Active(World|Hand|Event)." + + #(ActiveWorld ActiveHand ActiveEvent) do: [:literal | + self + assert: 1 "Active(World|Hand|Event)Variable class >> #value:during:" + equals: (self systemNavigation allCallsOnClass: (self environment bindingOf: literal)) size].! Item was added: + ----- Method: WorldStateTest>>testActiveVariablesRenamed (in category 'tests') ----- + testActiveVariablesRenamed + "Document the desire to rename Active(World|Hand|Event)Variable to Active(World|Hand|Event) after the Squeak 6.0 release." + + #(ActiveWorld ActiveHand ActiveEvent) do: [:className | + (SystemVersion current majorVersionNumber >= 6 + and: [SystemVersion current minorVersionNumber >= 1]) + ifTrue: [self assert: ((Smalltalk classNamed: className) includesBehavior: DynamicVariable)] + ifFalse: [self deny: (Smalltalk at: className) isBehavior] ].! From commits at source.squeak.org Sun Oct 11 11:43:49 2020 From: commits at source.squeak.org (commits at source.squeak.org) Date: Sun, 11 Oct 2020 11:43:49 0000 Subject: [squeak-dev] The Trunk: Nebraska-mt.58.mcz Message-ID: Marcel Taeumel uploaded a new version of Nebraska to project The Trunk: http://source.squeak.org/trunk/Nebraska-mt.58.mcz ==================== Summary ==================== Name: Nebraska-mt.58 Author: mt Time: 11 October 2020, 1:43:47.913652 pm UUID: faf5d233-ca17-b440-8060-e59416e00f69 Ancestors: Nebraska-tpr.57 Refactoring 'Active' variables -- Step 2 of 2. Removes all uses of Active(World|Hand|Event) by replacing those with "self current(World|Hand|Event)" or "Project current world" when required to not add/cement Morphic dependency. See http://forum.world.st/Changeset-Eliminating-global-state-from-Morphic-td5121690.html =============== Diff against Nebraska-tpr.57 =============== Item was changed: ----- Method: NebraskaSenderMorph>>initializeToStandAlone (in category 'parts bin') ----- initializeToStandAlone super initializeToStandAlone. + self installModelIn: Project current world.! - self installModelIn: ActiveWorld. - ! Item was changed: ----- Method: NebraskaServerMorph class>>serveWorld (in category 'as yet unclassified') ----- serveWorld + ^ self serveWorld: self currentWorld - ^ self serveWorld: ActiveWorld. ! From commits at source.squeak.org Sun Oct 11 11:44:29 2020 From: commits at source.squeak.org (commits at source.squeak.org) Date: Sun, 11 Oct 2020 11:44:29 0000 Subject: [squeak-dev] The Trunk: PreferenceBrowser-mt.107.mcz Message-ID: Marcel Taeumel uploaded a new version of PreferenceBrowser to project The Trunk: http://source.squeak.org/trunk/PreferenceBrowser-mt.107.mcz ==================== Summary ==================== Name: PreferenceBrowser-mt.107 Author: mt Time: 11 October 2020, 1:44:28.154652 pm UUID: bc1ccf63-9978-b446-aca4-cf62ab263e26 Ancestors: PreferenceBrowser-mt.106 Refactoring 'Active' variables -- Step 2 of 2. Removes all uses of Active(World|Hand|Event) by replacing those with "self current(World|Hand|Event)" or "Project current world" when required to not add/cement Morphic dependency. See http://forum.world.st/Changeset-Eliminating-global-state-from-Morphic-td5121690.html =============== Diff against PreferenceBrowser-mt.106 =============== Item was changed: ----- Method: PreferenceWizardMorph>>adjustSettingsForLowPerformance (in category 'support') ----- adjustSettingsForLowPerformance self updateLowPerformanceLabel: 'Please wait, optimizing performance...' translated. self refreshWorld. self stateGradients "flat look" ifFalse: [self toggleGradients]. self stateBlinkingCursor ifTrue: [self toggleBlinkingCursor]. self stateFastDrag ifFalse: [self toggleFastDrag]. self stateSoftShadows ifTrue: [self toggleSoftShadows]. self stateHardShadows ifTrue: [self toggleHardShadows]. self stateRoundedWindowLook ifTrue: [self toggleRoundedWindowLook]. self stateRoundedButtonLook ifTrue: [self toggleRoundedButtonLook]. self stateAttachToolsToMouse ifTrue: [self toggleAttachToolsToMouse]. self stateToolAndMenuIcons ifTrue: [self toggleToolAndMenuIcons]. self stateSmartHorizontalSplitters ifTrue: [self toggleSmartHorizontalSplitters]. self stateSmartVerticalSplitters ifTrue: [self toggleSmartVerticalSplitters]. PluggableListMorph highlightHoveredRow: false; filterableLists: false; highlightPreSelection: true; "Feedback is important!!" flashOnErrors: false. TheWorldMainDockingBar showSecondsInClock: false. Preferences disable: #balloonHelpInMessageLists. "Set simple background." + Project current world setAsBackground: MorphicProject defaultFill. + previewWorld fillStyle: Project current world fillStyle. - ActiveWorld setAsBackground: MorphicProject defaultFill. - previewWorld fillStyle: ActiveWorld fillStyle. "Done." + self updateLowPerformanceLabel: 'Settings were adjusted for optimal performance.' translated.! - self updateLowPerformanceLabel: 'Settings were adjusted for optimal performance.' translated. - ! Item was changed: ----- Method: PreferenceWizardMorph>>initializePreviewWorld (in category 'initialization') ----- initializePreviewWorld | w1 w2 w3 | previewWorld := PasteUpMorph new hResizing: #spaceFill; vResizing: #spaceFill; viewBox: (0 at 0 corner: 500 at 500); layoutFrame: (LayoutFrame fractions: (0.3 @ 0 corner: 1.0 @ 1.0) offsets: (0@ titleMorph height corner: 0 @ buttonRowMorph height negated)); + fillStyle: Project current world fillStyle; - fillStyle: ActiveWorld fillStyle; borderWidth: 2; borderColor: Color white; cornerStyle: (self hasLowPerformance ifTrue: [#square] ifFalse: [#rounded]); yourself. + - w1 := (ToolSet browse: Morph selector: #drawOn:) dependents detect: [:ea | ea isSystemWindow]. w2 := ToolSet browseMessageSet: (SystemNavigation default allCallsOn: #negated) name: 'Senders' translated autoSelect: 'negated'. w3 := (Workspace new contents: '3+4 "Select and hit [CMD]+[P]."') openLabel: 'Workspace'. + - {w1. w2. w3} do: [:ea | ea makeUnclosable. previewWorld addMorph: ea]. self updateWindowBounds.! From commits at source.squeak.org Sun Oct 11 11:44:57 2020 From: commits at source.squeak.org (commits at source.squeak.org) Date: Sun, 11 Oct 2020 11:44:57 0000 Subject: [squeak-dev] The Trunk: Protocols-mt.74.mcz Message-ID: Marcel Taeumel uploaded a new version of Protocols to project The Trunk: http://source.squeak.org/trunk/Protocols-mt.74.mcz ==================== Summary ==================== Name: Protocols-mt.74 Author: mt Time: 11 October 2020, 1:44:56.309652 pm UUID: 4334a75d-71a3-9540-a840-545153508848 Ancestors: Protocols-mt.73 Refactoring 'Active' variables -- Step 2 of 2. Removes all uses of Active(World|Hand|Event) by replacing those with "self current(World|Hand|Event)" or "Project current world" when required to not add/cement Morphic dependency. See http://forum.world.st/Changeset-Eliminating-global-state-from-Morphic-td5121690.html =============== Diff against Protocols-mt.73 =============== Item was changed: ----- Method: InstanceBrowser>>offerMenu (in category 'menu commands') ----- offerMenu "Offer a menu to the user, in response to the hitting of the menu button on the tool pane" | aMenu | aMenu := MenuMorph new defaultTarget: self. + aMenu title: ('Messages of {1}' translated format: {objectViewed nameForViewer}). - aMenu title: 'Messages of ', objectViewed nameForViewer. aMenu addStayUpItem. + aMenu addTranslatedList: #( - aMenu addList: #( ('vocabulary...' chooseVocabulary) ('what to show...' offerWhatToShowMenu) - ('inst var refs (here)' setLocalInstVarRefs) ('inst var defs (here)' setLocalInstVarDefs) ('class var refs (here)' setLocalClassVarRefs) - ('navigate to a sender...' navigateToASender) ('recent...' navigateToRecentMethod) ('show methods in current change set' showMethodsInCurrentChangeSet) ('show methods with initials...' showMethodsWithInitials) - "('toggle search pane' toggleSearch)" - - ('browse full (b)' browseMethodFull) ('browse hierarchy (h)' browseClassHierarchy) ('browse protocol (p)' browseFullProtocol) - ('fileOut' fileOutMessage) ('printOut' printOutMessage) - ('senders of... (n)' browseSendersOfMessages) ('implementors of... (m)' browseMessages) ('versions (v)' browseVersions) ('inheritance (i)' methodHierarchy) - ('references... (r)' browseVariableReferences) ('assignments... (a)' browseVariableAssignments) - ('viewer on me' viewViewee) ('inspector on me' inspectViewee) - ('more...' shiftedYellowButtonActivity)). + + ^ aMenu popUpInWorld: self currentWorld! - - aMenu popUpInWorld: ActiveWorld! Item was changed: ----- Method: Lexicon>>offerMenu (in category 'menu commands') ----- offerMenu "Offer a menu to the user, in response to the hitting of the menu button on the tool pane" | aMenu | aMenu := MenuMorph new defaultTarget: self. + aMenu addTitle: 'Lexicon' translated. - aMenu addTitle: 'Lexicon'. aMenu addStayUpItem. + aMenu addTranslatedList: #( - aMenu addList: #( - ('vocabulary...' chooseVocabulary) ('what to show...' offerWhatToShowMenu) - ('inst var refs (here)' setLocalInstVarRefs) ('inst var assignments (here)' setLocalInstVarDefs) ('class var refs (here)' setLocalClassVarRefs) - - ('navigate to a sender...' navigateToASender) ('recent...' navigateToRecentMethod) + ('show methods in current change set' showMethodsInCurrentChangeSet) + ('show methods with initials...' showMethodsWithInitials) - ('show methods in current change set' - showMethodsInCurrentChangeSet) - ('show methods with initials...' - showMethodsWithInitials) - "('toggle search pane' toggleSearch)" - - ('browse full (b)' browseMethodFull) ('browse hierarchy (h)' browseClassHierarchy) ('browse protocol (p)' browseFullProtocol) - ('fileOut' fileOutMessage) ('printOut' printOutMessage) - ('senders of... (n)' browseSendersOfMessages) ('implementors of... (m)' browseMessages) ('versions (v)' browseVersions) ('inheritance (i)' methodHierarchy) - ('references... (r)' browseVariableReferences) ('assignments... (a)' browseVariableAssignments) - ('more...' shiftedYellowButtonActivity)). + + ^ aMenu popUpInWorld: self currentWorld! - - aMenu popUpInWorld: ActiveWorld! Item was changed: ----- Method: Object>>haveFullProtocolBrowsedShowingSelector: (in category '*Protocols') ----- haveFullProtocolBrowsedShowingSelector: aSelector "Open up a Lexicon on the receiver, having it open up showing aSelector, which may be nil" + "(2 at 3) haveFullProtocolBrowsed" | aBrowser | + aBrowser := (Smalltalk at: #InstanceBrowser ifAbsent: [^ nil]) new + useVocabulary: Vocabulary fullVocabulary. + aBrowser + openOnObject: self + inWorld: Project current world + showingSelector: aSelector! - aBrowser := (Smalltalk at: #InstanceBrowser ifAbsent:[^nil]) new useVocabulary: Vocabulary fullVocabulary. - aBrowser openOnObject: self inWorld: ActiveWorld showingSelector: aSelector - - "(2 at 3) haveFullProtocolBrowsed"! From commits at source.squeak.org Sun Oct 11 11:45:22 2020 From: commits at source.squeak.org (commits at source.squeak.org) Date: Sun, 11 Oct 2020 11:45:22 0000 Subject: [squeak-dev] The Trunk: ReleaseBuilder-mt.211.mcz Message-ID: Marcel Taeumel uploaded a new version of ReleaseBuilder to project The Trunk: http://source.squeak.org/trunk/ReleaseBuilder-mt.211.mcz ==================== Summary ==================== Name: ReleaseBuilder-mt.211 Author: mt Time: 11 October 2020, 1:45:21.843652 pm UUID: f248d73d-600e-114c-8a9e-543407e761fd Ancestors: ReleaseBuilder-mt.210 Refactoring 'Active' variables -- Step 2 of 2. Removes all uses of Active(World|Hand|Event) by replacing those with "self current(World|Hand|Event)" or "Project current world" when required to not add/cement Morphic dependency. See http://forum.world.st/Changeset-Eliminating-global-state-from-Morphic-td5121690.html =============== Diff against ReleaseBuilder-mt.210 =============== Item was changed: ----- Method: ReleaseBuilder class>>setProjectBackground: (in category 'scripts - support') ----- setProjectBackground: aFormOrColorOrFillStyle + | world | + world := Project current world. + world fillStyle: aFormOrColorOrFillStyle. + MorphicProject defaultFill: world fillStyle. + world removeProperty: #hasCustomBackground.! - ActiveWorld fillStyle: aFormOrColorOrFillStyle. - MorphicProject defaultFill: ActiveWorld fillStyle. - ActiveWorld removeProperty: #hasCustomBackground.! From commits at source.squeak.org Sun Oct 11 11:45:56 2020 From: commits at source.squeak.org (commits at source.squeak.org) Date: Sun, 11 Oct 2020 11:45:56 0000 Subject: [squeak-dev] The Trunk: ToolBuilder-Morphic-mt.266.mcz Message-ID: Marcel Taeumel uploaded a new version of ToolBuilder-Morphic to project The Trunk: http://source.squeak.org/trunk/ToolBuilder-Morphic-mt.266.mcz ==================== Summary ==================== Name: ToolBuilder-Morphic-mt.266 Author: mt Time: 11 October 2020, 1:45:54.939652 pm UUID: f7d11905-3600-e241-a125-d4355a90ecde Ancestors: ToolBuilder-Morphic-mt.265 Refactoring 'Active' variables -- Step 2 of 2. Removes all uses of Active(World|Hand|Event) by replacing those with "self current(World|Hand|Event)" or "Project current world" when required to not add/cement Morphic dependency. See http://forum.world.st/Changeset-Eliminating-global-state-from-Morphic-td5121690.html =============== Diff against ToolBuilder-Morphic-mt.265 =============== Item was changed: ----- Method: ListChooser>>accept (in category 'actions') ----- accept "if the user submits with no valid entry, make them start over" | choice | self canAccept ifFalse: [ self canAdd ifTrue: [^ self add]. ^ self changed: #textSelection]. choice := self selectedItem. self canAdd ifTrue: [ "Ask the user whether to add the new item or choose the list selection." (UserDialogBoxMorph confirm: 'You can either choose an existing item or add a new one.\What do you want?' translated withCRs title: 'Choose or Add' translated trueChoice: choice asString + falseChoice: self searchText asString at: self currentHand position) - falseChoice: self searchText asString at: ActiveHand position) ifNil: ["Cancelled" self result: nil. ^ self] ifNotNil: [:answer | answer ifTrue: [self result: choice] ifFalse: [self result: self searchText asString]] ] ifFalse: [self result: choice]. - self changed: #close.! From commits at source.squeak.org Sun Oct 11 11:46:18 2020 From: commits at source.squeak.org (commits at source.squeak.org) Date: Sun, 11 Oct 2020 11:46:18 0000 Subject: [squeak-dev] The Trunk: Tests-mt.441.mcz Message-ID: Marcel Taeumel uploaded a new version of Tests to project The Trunk: http://source.squeak.org/trunk/Tests-mt.441.mcz ==================== Summary ==================== Name: Tests-mt.441 Author: mt Time: 11 October 2020, 1:46:15.182652 pm UUID: a7f0172b-8d24-0142-9577-e6a8eab4fc38 Ancestors: Tests-eem.440 Refactoring 'Active' variables -- Step 2 of 2. Removes all uses of Active(World|Hand|Event) by replacing those with "self current(World|Hand|Event)" or "Project current world" when required to not add/cement Morphic dependency. See http://forum.world.st/Changeset-Eliminating-global-state-from-Morphic-td5121690.html =============== Diff against Tests-eem.440 =============== Item was changed: ----- Method: HandBugs>>testTargetPoint (in category 'tests') ----- testTargetPoint "self new testTargetPoint" "self run: #testTargetPoint" "This should not throw an exception." + self currentHand targetPoint - ActiveHand targetPoint ! Item was changed: ----- Method: LocaleTest>>setUp (in category 'running') ----- setUp previousID := Locale current localeID. + previousKeyboardInterpreter := self currentHand instVarNamed: 'keyboardInterpreter'. - previousKeyboardInterpreter := ActiveHand instVarNamed: 'keyboardInterpreter'. previousClipboardInterpreter := Clipboard default instVarNamed: 'interpreter'. + self currentHand clearKeyboardInterpreter. + Clipboard default clearInterpreter.! - ActiveHand clearKeyboardInterpreter. - Clipboard default clearInterpreter. - ! Item was changed: ----- Method: LocaleTest>>tearDown (in category 'running') ----- tearDown + self currentHand instVarNamed: 'keyboardInterpreter' put: previousKeyboardInterpreter. - ActiveHand instVarNamed: 'keyboardInterpreter' put: previousKeyboardInterpreter. Clipboard default instVarNamed: 'interpreter' put: previousClipboardInterpreter. Locale switchToID: (LocaleID isoLanguage: previousID).! Item was changed: ----- Method: LocaleTest>>testLocaleChanged (in category 'tests') ----- testLocaleChanged "self debug: #testLocaleChanged" "LanguageEnvironment >> startUp is called from Prject >> localeChanged" "takes quite a while" Project current updateLocaleDependents. + self assert: (self currentHand instVarNamed: 'keyboardInterpreter') isNil description: 'non-nil keyboardInterpreter'. - self assert: (ActiveHand instVarNamed: 'keyboardInterpreter') isNil description: 'non-nil keyboardInterpreter'. self assert: (Clipboard default instVarNamed: 'interpreter') isNil description: 'non-nil interpreter'. Locale switchToID: (LocaleID isoLanguage: 'ja'). self assert: 'ja' equals: Locale current localeID isoLanguage. Locale switchToID: (LocaleID isoLanguage: 'en'). self assert: 'en' equals: Locale current localeID isoLanguage.! From commits at source.squeak.org Sun Oct 11 11:46:47 2020 From: commits at source.squeak.org (commits at source.squeak.org) Date: Sun, 11 Oct 2020 11:46:47 0000 Subject: [squeak-dev] The Trunk: ToolsTests-mt.99.mcz Message-ID: Marcel Taeumel uploaded a new version of ToolsTests to project The Trunk: http://source.squeak.org/trunk/ToolsTests-mt.99.mcz ==================== Summary ==================== Name: ToolsTests-mt.99 Author: mt Time: 11 October 2020, 1:46:46.156652 pm UUID: d4be1f1c-0832-3b40-89df-dd3287e34184 Ancestors: ToolsTests-mt.98 Refactoring 'Active' variables -- Step 2 of 2. Removes all uses of Active(World|Hand|Event) by replacing those with "self current(World|Hand|Event)" or "Project current world" when required to not add/cement Morphic dependency. See http://forum.world.st/Changeset-Eliminating-global-state-from-Morphic-td5121690.html =============== Diff against ToolsTests-mt.98 =============== Item was changed: ----- Method: BrowseTest>>currentBrowsers (in category 'private') ----- currentBrowsers + + ^ (Project current world submorphsSatisfying: [:each | + (each isKindOf: SystemWindow) + and: [each model isKindOf: Browser]]) asSet! - ^ (ActiveWorld submorphs - select: [:each | (each isKindOf: SystemWindow) - and: [each model isKindOf: Browser]]) asSet! Item was changed: ----- Method: BrowseTest>>currentHierarchyBrowsers (in category 'private') ----- currentHierarchyBrowsers + + ^ (Project current world submorphsSatisfying: [:each | + (each isKindOf: SystemWindow) + and: [each model isKindOf: HierarchyBrowser]]) asSet! - ^ (ActiveWorld submorphs - select: [:each | (each isKindOf: SystemWindow) - and: [each model isKindOf: HierarchyBrowser]]) asSet! From Marcel.Taeumel at hpi.de Sun Oct 11 11:54:23 2020 From: Marcel.Taeumel at hpi.de (marcel.taeumel) Date: Sun, 11 Oct 2020 06:54:23 -0500 (CDT) Subject: [squeak-dev] Changeset: Eliminating global state from Morphic In-Reply-To: <4ff55bdbdfa44cc396bcdb61125b8fb9@student.hpi.uni-potsdam.de> References: <20200914154934.GA85344@shell.msen.com> <316eb771b4674076a884bb4caea31175@student.hpi.uni-potsdam.de> <20200930002206.GA34073@shell.msen.com> <4ff55bdbdfa44cc396bcdb61125b8fb9@student.hpi.uni-potsdam.de> Message-ID: <1602417263970-0.post@n4.nabble.com> Hi Christoph. It's all in Trunk now. ;-) Here are possible next steps: 1. "Project current world" vs. "self currentWorld" In all packages that should not be dependent from Morphic, use "Project current world". Otherwise, use "self currentWorld". 2. "self currentWorld" vs. "self world" In morphs, try to use "self world" whenever possible. Only class-side methods should use "self currentWorld". Well, if you have code that should work with morphs not being installed in any world, use "self currentWorld" because it will fall back to "Project current world". 3. "self currentHand" in non-Morphic packages (ST80, Tools, etc.) Well, there are some cases where the use of "self currentHand" adds a dependency to the Morphic package. Not sure whether we can fix this now or whether we want to extract object-oriented event handling out of Morphic first to be used in other graphics frameworks such as ST80, SqueakShell, etc. :-) Best, Marcel Christoph Thiede wrote > Hi Marcel, > > > thanks for reviewing and splitting up the changes! I confirm that two > members of my image farm survived the recent patches without any problem. > :D > > > Best, > > Christoph > > <http://www.hpi.de/> > ________________________________ > Von: Squeak-dev < > squeak-dev-bounces at .squeakfoundation > > im Auftrag von Taeumel, Marcel > Gesendet: Donnerstag, 8. Oktober 2020 17:20:26 > An: squeak-dev > Betreff: Re: [squeak-dev] Changeset: Eliminating global state from Morphic > > Hi Christoph, hi all! > > The first part of this refactoring is in the Trunk. Please try updating > your images and report back! > http://forum.world.st/The-Trunk-Morphic-mt-1697-mcz-td5123173.html > > If all went well, I will commit the second part, too, which will remove > all remaining references to ActiveWorld etc. > > Best, > Marcel > > Am 30.09.2020 18:22:43 schrieb Thiede, Christoph < > christoph.thiede at .uni-potsdam > >: > > This version includes a test method, #testActiveVariablesObsoletion, that > makes sure that no one will try to reference one of the deprecated > ActiveVariable bindings again in the future. Thanks to Marcel for the tip! > > > Best, > > Christoph > > ________________________________ > Von: Squeak-dev < > squeak-dev-bounces at .squeakfoundation > > im Auftrag von Thiede, Christoph > Gesendet: Mittwoch, 30. September 2020 17:50:43 > An: The general-purpose Squeak developers list > Betreff: Re: [squeak-dev] Changeset: Eliminating global state from Morphic > > > Here is another version of the changeset that does not even longer raise a > debugger when removing the current hand. > > > Best, > > Christoph > > ________________________________ > Von: Squeak-dev < > squeak-dev-bounces at .squeakfoundation > > im Auftrag von Thiede, Christoph > Gesendet: Mittwoch, 30. September 2020 11:40:05 > An: The general-purpose Squeak developers list > Betreff: Re: [squeak-dev] Changeset: Eliminating global state from Morphic > > > Hm, probably we should integrate the "filein without UI updates" option > into the FileList menu, too ...? > > > Best, > > Christoph > > <http://www.hpi.de/> > ________________________________ > Von: Squeak-dev < > squeak-dev-bounces at .squeakfoundation > > im Auftrag von David T. Lewis < > lewis at .msen > > > Gesendet: Mittwoch, 30. September 2020 02:22:06 > An: The general-purpose Squeak developers list > Betreff: Re: [squeak-dev] Changeset: Eliminating global state from Morphic > > On Mon, Sep 28, 2020 at 10:55:45AM +0000, Thiede, Christoph wrote: >> Hi all, >> >> >> Dave, I double-checked it. When loading the second changeset, can you >> confirm that you used the new option in the drop handler dialog? >> >> >> [cid:3848a1c6-d67f-4999-a714-ffafff2b4a22] >> > > No, I did definitely not do that. I opened a FileList and selected the > change sets one at a time, and clicked install for each. Installing the > second change set locked the image. > > After reading your email, I did this: > > 1) Forwarded your email to my > dtlewis290@ > (spam oriented) account > so I could view the graphic attachment, which showed that you are using > drag and drop when you load the change sets. > > 2) Opened a GUI file browser on my Ubuntu laptop, and used drag and drop > to copy the two change sets to my image. > > 3) On dropping the second change set into the image, I selected the > "... without updating UI" option. > > That worked. > > Dave -- Sent from: http://forum.world.st/Squeak-Dev-f45488.html From eliot.miranda at gmail.com Sun Oct 11 18:15:09 2020 From: eliot.miranda at gmail.com (Eliot Miranda) Date: Sun, 11 Oct 2020 11:15:09 -0700 Subject: [squeak-dev] Pool for sysconf constants? Message-ID: Hi All, I want to implement a number of processors query on MacOS & other unices to complement the info provided by GetSystemInfo on Windows. The natural way to do this on unices is to use sysconf (3), and of course this points to the issue for which FFI pools are needed, the constant names for sysconf such as _SC_NPROCESSORS_ONLN are defined, but their values are implementation dependent. But before I go amd implement an FFI pool for this I thought I'd ask a) anyone already done this? Is it published anywhere? b) how are we going to organize such pools so that people don't have to reinvent the wheel? c) should there be a pool to cover sysconf or to cover unistd.h? (the point here is that while the pool might start off small, it could grow and grow and maybe unistd.h is too much surface to cover) thoughts, suggestions? _,,,^..^,,,_ best, Eliot -------------- next part -------------- An HTML attachment was scrubbed... URL: From forums.jakob at resfarm.de Sun Oct 11 19:58:22 2020 From: forums.jakob at resfarm.de (Jakob Reschke) Date: Sun, 11 Oct 2020 14:58:22 -0500 (CDT) Subject: [squeak-dev] Roassal next steps. In-Reply-To: <17512d8a134.bc18650752020.4064004373768089549@zoho.com> References: <17512d8a134.bc18650752020.4064004373768089549@zoho.com> Message-ID: <1602446302480-0.post@n4.nabble.com> "We" might not need Announcements, but Roassal uses them, so "it" needs them. :-) Is AXAnnouncements still API-compatible with the Pharo Announcements (or should I phrase this the other way around)? Either way, it would be nice to have a working Pharo-Announcements-API implementation for Squeak, at least for compatibility's sake. It doesn't have to be in the Trunk, but once you have an implementation or shim, one would extend the BaselineOfRoassal to include this dependency for Squeak only. -- Sent from: http://forum.world.st/Squeak-Dev-f45488.html From forums.jakob at resfarm.de Sun Oct 11 20:15:54 2020 From: forums.jakob at resfarm.de (Jakob Reschke) Date: Sun, 11 Oct 2020 15:15:54 -0500 (CDT) Subject: [squeak-dev] Exception patterns (The Inbox: Kernel-ct.1292.mcz) In-Reply-To: References: <2f92c32e769a4e29a2c93f655b87638f@student.hpi.uni-potsdam.de> <0d47e32b25594ae1885da3706447de36@student.hpi.uni-potsdam.de> Message-ID: <1602447354711-0.post@n4.nabble.com> Christoph Thiede wrote >> See Kernel-ct.1292/2 for the next attempt. :-) > > Hm, no, SqueakSource has renamed it into Kernel-ct.1303. Eliot, didn't you > mention that one can use slashes to create branches in Monticello? Eliot's example, though, VMMaker.oscog-<author>.<nnn>, uses a dot to separate the branch name and puts the branch name behind the package name. -- Sent from: http://forum.world.st/Squeak-Dev-f45488.html From forums.jakob at resfarm.de Sun Oct 11 20:23:52 2020 From: forums.jakob at resfarm.de (Jakob Reschke) Date: Sun, 11 Oct 2020 15:23:52 -0500 (CDT) Subject: [squeak-dev] Shortcuts for Dual Change Sorter In-Reply-To: <8e90219d9ab5424286e4f9f0351418c9@student.hpi.uni-potsdam.de> References: <8e90219d9ab5424286e4f9f0351418c9@student.hpi.uni-potsdam.de> Message-ID: <1602447832722-0.post@n4.nabble.com> Christoph Thiede wrote > Btw, I would find drag'n'drop support very helpful for the change sorter, > too. Ideally, also let's make it possible to move changes from one window > into another one ... :D +1, another option besides drag-n-drop would be cmd-c and cmd-v to copy and paste items in either direction. Christoph Thiede wrote > What about > > s (move) and > > S (copy), derivated from the term "side"? Cmd-s is usually accept or save, neither of which relates well to move or copy. -- Sent from: http://forum.world.st/Squeak-Dev-f45488.html From tim at rowledge.org Sun Oct 11 20:39:24 2020 From: tim at rowledge.org (tim Rowledge) Date: Sun, 11 Oct 2020 13:39:24 -0700 Subject: [squeak-dev] Shortcuts for Dual Change Sorter In-Reply-To: <1602447832722-0.post@n4.nabble.com> References: <8e90219d9ab5424286e4f9f0351418c9@student.hpi.uni-potsdam.de> <1602447832722-0.post@n4.nabble.com> Message-ID: > On 2020-10-11, at 1:23 PM, Jakob Reschke wrote: > > Christoph Thiede wrote >> Btw, I would find drag'n'drop support very helpful for the change sorter, >> too. Ideally, also let's make it possible to move changes from one window >> into another one ... :D > > +1, another option besides drag-n-drop would be cmd-c and cmd-v to copy and > paste items in either direction. If I could work out how to use drag and drop for theVMMakerTool lists 20 years ago I'm sure somebody should be able to do it for the dual change sorter lists. Definitely bonus points for supporting multiple selection and dragging the group, as well as for copy instead of move (or similar). tim -- tim Rowledge; tim at rowledge.org; http://www.rowledge.org/tim Strange OpCodes: WFL: Wave FLag From tomjonabc at gmail.com Mon Oct 12 06:25:20 2020 From: tomjonabc at gmail.com (Tom Beckmann) Date: Mon, 12 Oct 2020 08:25:20 +0200 Subject: [squeak-dev] Roassal next steps. In-Reply-To: <1602446302480-0.post@n4.nabble.com> References: <17512d8a134.bc18650752020.4064004373768089549@zoho.com> <1602446302480-0.post@n4.nabble.com> Message-ID: Hi, @timothy, happy to hear that Roassal now loads for you! :) Concerning Announcements: when I initially tried to load Roassal, I included AXAnnouncements from Squeaksource. However, there are some extension methods from Roassal on Announcements that assume a different data layout. In the version on Github I just made sure the extensions compiled at all. Looking at the failing tests now, here are the two hopefully correct implementations for the extension methods (code is mostly copied from the Pharo version, you may want to consider having these make better use of our stdlib if we want to keep those :)): SubscriptionRegistry>>getInteractionsForClass: eventClass "Return the list of subscription for a given Event class" | answer | answer := OrderedCollection new. subscriptionsByAnnouncementClasses values do: [ :collection | collection do: [:subscription | (subscription action receiver class includesBehavior: eventClass) ifTrue: [answer add: subscription subscriber]]]. ^ answer SubscriptionRegistry>>handleSubscriberClass: eventClass "Return true if the receiver has a callback subscripbed for the event class" ^ subscriptionsByAnnouncementClasses values anySatisfy: [ :subCollection | subCollection anySatisfy: [:subscriber | subscriber action receiver class includesBehavior: eventClass ]] With these two, the two RSRoassal3Test methods pass for me. I think the most helpful next step would be to go through each package, make sure the package can be loaded without stumbling over stray pharo-only symbols and getting all the tests to pass. Best, Tom On Sun, Oct 11, 2020 at 9:58 PM Jakob Reschke wrote: > "We" might not need Announcements, but Roassal uses them, so "it" needs > them. > :-) > > Is AXAnnouncements still API-compatible with the Pharo Announcements (or > should I phrase this the other way around)? Either way, it would be nice to > have a working Pharo-Announcements-API implementation for Squeak, at least > for compatibility's sake. It doesn't have to be in the Trunk, but once you > have an implementation or shim, one would extend the BaselineOfRoassal to > include this dependency for Squeak only. > > > > -- > Sent from: http://forum.world.st/Squeak-Dev-f45488.html > > -------------- next part -------------- An HTML attachment was scrubbed... URL: From commits at source.squeak.org Mon Oct 12 11:22:56 2020 From: commits at source.squeak.org (commits at source.squeak.org) Date: Mon, 12 Oct 2020 11:22:56 0000 Subject: [squeak-dev] The Inbox: Monticello-ct.731.mcz Message-ID: A new version of Monticello was added to project The Inbox: http://source.squeak.org/inbox/Monticello-ct.731.mcz ==================== Summary ==================== Name: Monticello-ct.731 Author: ct Time: 12 October 2020, 1:22:55.228864 pm UUID: 29858029-e65e-ef4a-897b-3c420786d60e Ancestors: Monticello-mt.730 Make sure to reset the modified flag for working copies that have become empty after merging a version. =============== Diff against Monticello-mt.730 =============== Item was changed: ----- Method: MCWorkingCopy>>merged: (in category 'operations') ----- merged: aVersion ancestry addAncestor: aVersion info. + self changed. + self checkModified.! - self changed! From Christoph.Thiede at student.hpi.uni-potsdam.de Mon Oct 12 11:34:04 2020 From: Christoph.Thiede at student.hpi.uni-potsdam.de (Thiede, Christoph) Date: Mon, 12 Oct 2020 11:34:04 +0000 Subject: [squeak-dev] Bug in SqueakSource mailer service? Message-ID: <7c769e9531cf4f6ba068508d047e3823@student.hpi.uni-potsdam.de> Hi all, that's funny. I uploaded EToys-ct.409, whiches removes some invalid encoding characters from a method comment, half an hour ago and it did not appear in the mailing list. However, Monticello-ct.731 which I uploaded some minutes later appeared on the list as usual. Do we have some bug in the mailer service code that stumbled upon the special characters in the method comment? Here is the (manually created) diff: assureContentAreaStaysAt: aPoint - "selbst-verst‚Äö√†√∂¬¨√ündlich" self currentWorld doOneCycleNow. self topLeft: ((self topLeft - contentArea topLeft ) + aPoint) Best, Christoph -------------- next part -------------- An HTML attachment was scrubbed... URL: From commits at source.squeak.org Mon Oct 12 11:41:07 2020 From: commits at source.squeak.org (commits at source.squeak.org) Date: Mon, 12 Oct 2020 11:41:07 0000 Subject: [squeak-dev] The Inbox: MorphicTests-ct.68.mcz Message-ID: A new version of MorphicTests was added to project The Inbox: http://source.squeak.org/inbox/MorphicTests-ct.68.mcz ==================== Summary ==================== Name: MorphicTests-ct.68 Author: ct Time: 12 October 2020, 1:41:06.479349 pm UUID: 5f5ba7dc-d8a6-cb4c-a18c-260f0bade656 Ancestors: MorphicTests-mt.67 Adds tests to ensure that the deprecated World global will be not referenced again. Complements Morphic-dtl.1370. See http://forum.world.st/Changeset-Eliminating-global-state-from-Morphic-td5121690.html =============== Diff against MorphicTests-mt.67 =============== Item was added: + ----- Method: WorldStateTest>>testWorldVariableObsoletion (in category 'tests') ----- + testWorldVariableObsoletion + "Only the code for backwards compatibility may access the global World binding." + + self + assert: 0 + equals: (self systemNavigation allCallsOnClass: (self environment bindingOf: #World)) size.! From christoph.thiede at student.hpi.uni-potsdam.de Mon Oct 12 11:59:37 2020 From: christoph.thiede at student.hpi.uni-potsdam.de (Christoph Thiede) Date: Mon, 12 Oct 2020 06:59:37 -0500 (CDT) Subject: [squeak-dev] ColorForm with transparency not working properly In-Reply-To: References: <618f98fce9dd44cbb9b603a6eca2e463@student.hpi.uni-potsdam.de> <25297d17b4f2447ea1cc43bb71e6eb84@student.hpi.uni-potsdam.de> Message-ID: <1602503977469-0.post@n4.nabble.com> Thanks, Karl. Still, I do not see what the combination rules are good for. For example, my image does not implement #alphaBlend:with:. Here is another request for some documentation of the combination rules: https://github.com/MrModder/Autocompletion/issues/36 Best, Christoph -- Sent from: http://forum.world.st/Squeak-Dev-f45488.html From gettimothy at zoho.com Mon Oct 12 12:06:19 2020 From: gettimothy at zoho.com (gettimothy) Date: Mon, 12 Oct 2020 08:06:19 -0400 Subject: [squeak-dev] Roassal next steps. In-Reply-To: References: <17512d8a134.bc18650752020.4064004373768089549@zoho.com> <1602446302480-0.post@n4.nabble.com> Message-ID: <1751cb44b0a.e67be63d201225.4223843948453025262@zoho.com> Hi Tom and Jakob I look forward to returning to work on Roassal this weekend. Thank you for your help. Cheers t ---- On Mon, 12 Oct 2020 02:25:20 -0400 tomjonabc at gmail.com wrote ---- Hi, @timothy, happy to hear that Roassal now loads for you! :) Concerning Announcements: when I initially tried to load Roassal, I included AXAnnouncements from Squeaksource. However, there are some extension methods from Roassal on Announcements that assume a different data layout. In the version on Github I just made sure the extensions compiled at all. Looking at the failing tests now, here are the two hopefully correct implementations for the extension methods (code is mostly copied from the Pharo version, you may want to consider having these make better use of our stdlib if we want to keep those :)): SubscriptionRegistry>>getInteractionsForClass: eventClass "Return the list of subscription for a given Event class" | answer | answer := OrderedCollection new. subscriptionsByAnnouncementClasses values do: [ :collection | collection do: [:subscription | (subscription action receiver class includesBehavior: eventClass) ifTrue: [answer add: subscription subscriber]]]. ^ answer SubscriptionRegistry>>handleSubscriberClass: eventClass "Return true if the receiver has a callback subscripbed for the event class" ^ subscriptionsByAnnouncementClasses values anySatisfy: [ :subCollection | subCollection anySatisfy: [:subscriber | subscriber action receiver class includesBehavior: eventClass ]] With these two, the two RSRoassal3Test methods pass for me. I think the most helpful next step would be to go through each package, make sure the package can be loaded without stumbling over stray pharo-only symbols and getting all the tests to pass. Best, Tom On Sun, Oct 11, 2020 at 9:58 PM Jakob Reschke wrote: "We" might not need Announcements, but Roassal uses them, so "it" needs them. :-) Is AXAnnouncements still API-compatible with the Pharo Announcements (or should I phrase this the other way around)? Either way, it would be nice to have a working Pharo-Announcements-API implementation for Squeak, at least for compatibility's sake. It doesn't have to be in the Trunk, but once you have an implementation or shim, one would extend the BaselineOfRoassal to include this dependency for Squeak only. -- Sent from: http://forum.world.st/Squeak-Dev-f45488.html -------------- next part -------------- An HTML attachment was scrubbed... URL: From edgardec2005 at gmail.com Mon Oct 12 12:13:59 2020 From: edgardec2005 at gmail.com (Edgar J. De Cleene) Date: Mon, 12 Oct 2020 09:13:59 -0300 Subject: [squeak-dev] [ANN] Squeak converted to Tonel fomat Message-ID: Steps I do Download Squeak6.0alpha-19958-64bit.image from http://ftp.squeak.org/6.0alpha/Squeak6.0alpha-19958-64bit. Load TonelWriter.2.cs into and do Object new createSources in a Workspace Open Terminal and do tar -czvf SqueakTonel.tar.gz SqueakTonel for have a compressed file of 683 kb https://github.com/edgardec/SqueakTonel Edgar @morplenauta From kirtai+st at gmail.com Mon Oct 12 16:16:37 2020 From: kirtai+st at gmail.com (Douglas Brebner) Date: Mon, 12 Oct 2020 17:16:37 +0100 Subject: [squeak-dev] (Somewhat off-topic) Xerox Interlisp-D Medley open sourced Message-ID: Hi, The Medley release of Xerox Interlisp-D has been open sourced under the MIT licence. Medley is/was an Interlisp/Common Lisp system that, like Smalltalk, ran on the Xerox D* machines and, also like Smalltalk, has a very interactive, image-based development style. I'm given to understand that it's very much like a Smalltalk environment using Lisp as it's language. Sorry that this is kinda off topic but I thought it would be interesting to Squeakers to know that a sort of sibling of the original Smalltalks had escaped from the propriety world like Squeak did :) More info here https://interlisp.org/ https://github.com/Interlisp From commits at source.squeak.org Mon Oct 12 17:05:34 2020 From: commits at source.squeak.org (commits at source.squeak.org) Date: Mon, 12 Oct 2020 17:05:34 0000 Subject: [squeak-dev] The Inbox: WebClient-Core-ct.126.mcz Message-ID: A new version of WebClient-Core was added to project The Inbox: http://source.squeak.org/inbox/WebClient-Core-ct.126.mcz ==================== Summary ==================== Name: WebClient-Core-ct.126 Author: ct Time: 12 October 2020, 7:05:32.190311 pm UUID: a64ca560-814a-f940-8f64-e66a25cedc61 Ancestors: WebClient-Core-ul.123 Proposal to implement pre-authentication on WebClient. MOTIVATION. Until now, the authentication flow in Squeak's WebClient looks like this: First, a request is made without trying to authenticate the user. If the request fails with an error 401 (Unauthorized) or an error 407 (Proxy Authentication Required), the authentication headers are added to the request, and the request is retried. However, this does not work properly in some situations. For example, many modern REST APIs use to return an error 404 if an attempt is made to access a private resource without authenticating before [1] which currrently makes it impossible to authenticate to these APIs using the WebClient. Another issue I encountered today lies in some particular servers not requesting a specific authentication method via the WWW-Authenticate header along a 401 response as specified by the protocol [2]. Concretely, I encountered this problem with the quite popular GitHub API so I think our client should be robust enough to handle this contract violation. APPROACH. This patch adds a new property for the #preAuthenticationMethod to the WebClient class. It can be set to a symbol indicating any authentication method that is supported by the WebClient, e.g. #basic or #bearer. (Digest access authentication, however, cannot be used at this place because it depends on a realm specified by the server.) If this property is set, the relevant authentication headers will be added to the request already before the first attempt is made to request the resource. In addition, the patch refactors and reformatst the methods #authenticate:from: and #sendRequest:contentBlock:. The TESTS work as well as always (a number of them failing sporadically, but after some trials, I get a green bar again). WHAT REMAINS TO BE DONE. I deleted the fixme "Pre-authenticate the request if we have valid auth credentials" comment which I think was exactly what I implemented in this patch. I hope this assumption was correct? Also, another fixme comment requests to preserve the authState after following a redirect. Instead, with this patch, any specified pre-authentication method will be reused after every redirect. I did not fix this because I do not have a use-case scenario for it. Can we leave this as-is, and in a future version, could we simply delete this send to #flushAuthState? Also, I'm not sure about whether pre-authentication maybe should be the default for every request containing a username/password specification. This would speed up every web request that uses credentials by up to the factor 2 because we could save one futile query. Also, it appears to be the state-of-the-art solution, popular tools such as curl specify the credentials in the first run already. On the contrary, it would be a breaking change, and looking at the comment in #preAuthenticationMethod, pre-authentication as an opt-out feature might break or at least slow down NTLM/Negotiate use cases. However, I never heard of this before. Are these protocols still relevant at all? Please give this patch a careful review because still, all knowledge I have about this domain is collected from StackOverflow and Wikipedia a few hours ago. REFERENCES. [1] https://stackoverflow.com/a/17688080/13994294 [2] https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/401 =============== Diff against WebClient-Core-ul.123 =============== Item was changed: Object subclass: #WebClient + instanceVariableNames: 'flags server scheme timeout stream cookies proxyServer lastScheme lastServer lastPort maxRedirect redirections userAgent authParams proxyParams accessLog debugLog preAuthenticationMethod' - instanceVariableNames: 'flags server scheme timeout stream cookies proxyServer lastScheme lastServer lastPort maxRedirect redirections userAgent authParams proxyParams accessLog debugLog' classVariableNames: 'DebugLog FlagAcceptCookies FlagAllowAuth FlagAllowRedirect ProxyHandler' poolDictionaries: '' category: 'WebClient-Core'! !WebClient commentStamp: 'ar 5/4/2010 13:17' prior: 0! WebClient provides a simple yet complete HTTP client implementation. To view the documentation evaluate: HelpBrowser openOn: WebClientHelp. ! Item was added: + ----- Method: WebClient>>authProcess:from:header:params: (in category 'authentication') ----- + authProcess: request from: response header: authHeader params: params + "Process an authentication header. + Answer true if an authentication response could be generated; otherwise, false." + + self + authDispatch: request + from: response + header: authHeader + params: params. + + params at: #authResponse ifAbsent: [^ false]. + + "If we generated an authentication response for the header use it" + request + headerAt: ((response ifNotNil: [response code = 401] ifNil: [true]) + ifTrue: ['Authorization'] + ifFalse: ['Proxy-Authorization']) + put: (params at: #authMethod), ' ', (params at: #authResponse). + + ^ true! Item was changed: ----- Method: WebClient>>authenticate:from: (in category 'sending') ----- authenticate: request from: response "Authenticate after having received a 401/407 response. Returns true if we should retry, false if we fail here." + | headers params | + - "NOTE: The first time through we do NOT ask for credentials right away. - Some authentication mechanisms (NTLM/Negotiate) can use the credentials - of the currently logged on user. Consequently we only ask for credentials - if we're unable to do so without asking. Methods that require credentials - (basic, digest) test for their existence explicitly." - - | headers authHeader params | - "Pick the right set of parameters" + response code = 401 + ifTrue: [ + params := authParams. + headers := response headersAt: 'WWW-Authenticate'. + "If the connection was closed, we need to flush the + proxy params or we won't pick up prior credentials." + self isConnected + ifFalse: [self flushAuthState: proxyParams]] + ifFalse: [ + params := proxyParams. + headers := response headersAt: 'Proxy-Authenticate']. + - response code = 401 ifTrue:[ - params := authParams. - headers := response headersAt: 'WWW-Authenticate'. - "If the connection was closed, we need to flush the - proxy params or we won't pick up prior credentials." - self isConnected - ifFalse:[self flushAuthState: proxyParams]. - ] ifFalse:[ - params := proxyParams. - headers := response headersAt: 'Proxy-Authenticate'. - ]. - "Remove any old response" + params removeKey: #authResponse ifAbsent: []. + - params removeKey: #authResponse ifAbsent:[]. - "Process the authentication header(s)" + headers + detect: [:authHeader | + self + authProcess: request + from: response + header: authHeader + params: params] + ifFound: [:authHeader | ^ true]. + + "If we fall through here this can have two reasons: One is that we don't have a suitable authentication method. Check for that first." + params at: #authMethod ifAbsent: [^ false]. + + "The other possibility is that the credentials are wrong. Clean out the previous auth state and go ask for credentials." - 1 to: headers size do:[:i| - authHeader := headers at: i. - self authDispatch: request from: response header: authHeader params: params. - "If we generated an authentication response for the header use it" - params at: #authResponse ifPresent:[:resp| - request headerAt: (response code = 401 - ifTrue:['Authorization'] - ifFalse:['Proxy-Authorization']) - put: (params at: #authMethod), ' ', resp. - ^true]. - ]. - - "If we fall through here this can have two reasons: One is that we don't have - a suitable authentication method. Check for that first." - params at: #authMethod ifAbsent:[^false]. - - "The other possibility is that the credentials are wrong. - Clean out the previous auth state and go ask for credentials." self flushAuthState: params. + - "Clean out old authentication headers" response code = 401 + ifTrue: [request removeHeader: 'Authorization']. - ifTrue:[request removeHeader: 'Authorization']. "Always clean out the proxy auth header since we don't support pre-authentication" request removeHeader: 'Proxy-Authorization'. + - "Signal WebAuthRequired" (WebAuthRequired client: self request: request response: response) + signal == true ifFalse: [^ false]. + - signal == true ifFalse:[^false]. - "And retry with the new credentials" + ^ self authenticate: request from: response! - ^self authenticate: request from: response! Item was added: + ----- Method: WebClient>>preAuthenticationMethod (in category 'accessing') ----- + preAuthenticationMethod + "The authentication method to be used for initial requests. Symbol, e.g. #basic or #bearer. If nil, no authentication will be used until the server requests an authentication. + + NOTE: Some authentication mechanisms (NTLM/Negotiate) can use the credentials of the currently logged on user. Consequently, by default we only ask for credentials if we're unable to do so without asking." + + ^ preAuthenticationMethod! Item was added: + ----- Method: WebClient>>preAuthenticationMethod: (in category 'accessing') ----- + preAuthenticationMethod: aSymbol + "The authentication method to be used for initial requests. See #preAuthenticationMethod." + + preAuthenticationMethod := aSymbol! Item was changed: ----- Method: WebClient>>sendRequest:contentBlock: (in category 'sending') ----- sendRequest: request contentBlock: contentBlock "Send an http request" | response repeatRedirect repeatAuth | - - "XXXX: Fixme. Pre-authenticate the request if we have valid auth credentials" - redirections := Dictionary new. ["The outer loop handles redirections" + repeatRedirect := false. + + "Always update the host header due to redirect" + request headerAt: 'Host' put: server. + + self preAuthenticationMethod ifNotNil: [:authMethod | + self + authProcess: request + from: nil + header: authMethod asString capitalized + params: authParams]. + - repeatRedirect := false. - - "Always update the host header due to redirect" - request headerAt: 'Host' put: server. - ["The inner loop handles authentication" + repeatAuth := false. + + "Connect can fail if SSL proxy CONNECT is involved" + self connect ifNotNil: [:resp| ^ resp]. + + "Write the request to the debugLog if present" + debugLog ifNotNil: [self writeRequest: request on: debugLog]. + + "Send the request itself" + self writeRequest: request on: stream. + contentBlock value: stream. + + response := request newResponse readFrom: stream. + response url: scheme, '://', server, request rawUrl. + + debugLog ifNotNil: [ + response writeOn: debugLog. + debugLog flush]. + response setCookiesDo: [:cookie| + self acceptCookie: cookie host: self serverUrlName path: request url]. + accessLog ifNotNil: [ + WebUtils logRequest: request response: response on: accessLog]. + "Handle authentication if needed" + (self allowAuth and: [response code = 401 or: [response code = 407]]) ifTrue: [ + "Eat up the content of the previous response" + response content. + repeatAuth := self authenticate: request from: response]. + + repeatAuth + ] whileTrue. - repeatAuth := false. - - "Connect can fail if SSL proxy CONNECT is involved" - self connect ifNotNil:[:resp| ^resp]. + "Flush previous authState. + XXXX: Fixme. authState must be preserved for pre-authentication of requests." + self flushAuthState. + + "Handle redirect if needed" + (self allowRedirect and: [response isRedirect]) ifTrue:[ - "Write the request to the debugLog if present" - debugLog ifNotNil:[self writeRequest: request on: debugLog]. - - "Send the request itself" - self writeRequest: request on: stream. - contentBlock value: stream. - - response := request newResponse readFrom: stream. - response url: (scheme, '://', server, request rawUrl). - - debugLog ifNotNil:[ - response writeOn: debugLog. - debugLog flush. - ]. - response setCookiesDo:[:cookie| - self acceptCookie: cookie host: self serverUrlName path: request url. - ]. - accessLog ifNotNil:[ - WebUtils logRequest: request response: response on: accessLog - ]. - "Handle authentication if needed" - (self allowAuth and:[response code = 401 or:[response code = 407]]) ifTrue:[ "Eat up the content of the previous response" response content. + repeatRedirect := self redirect: request from: response]. + repeatRedirect + ] whileTrue: [ - repeatAuth := self authenticate: request from: response. - ]. - - repeatAuth] whileTrue. - - "Flush previous authState. - XXXX: Fixme. authState must be preserved for pre-authentication of requests." - self flushAuthState. - - "Handle redirect if needed" - (self allowRedirect and:[response isRedirect]) ifTrue:[ - "Eat up the content of the previous response" - response content. - repeatRedirect := self redirect: request from: response. - ]. - repeatRedirect] whileTrue:[ "When redirecting, remove authentication headers" request removeHeader: 'Authorization'. request removeHeader: 'Proxy-Authorization'. ]. + - "If the response is not a success, eat up its content" + (response isSuccess or: [response isInformational]) ifFalse: [ + response content]. + + ^ response! - (response isSuccess or:[response isInformational]) ifFalse:[response content]. - - ^response! From pbpublist at gmail.com Mon Oct 12 17:12:59 2020 From: pbpublist at gmail.com (Phil B) Date: Mon, 12 Oct 2020 13:12:59 -0400 Subject: [squeak-dev] (Somewhat off-topic) Xerox Interlisp-D Medley open sourced In-Reply-To: References: Message-ID: Douglas, It's always good to see historically significant software preserved rather than bit rotting in darkness. It's probably not going to have nearly the impact Squeak did in the open source world since the Lisp world already has an embarrassment of good implementations (distinct implementations rather than dialects. See CCL, which is a direct descendant of MCL, for example) where Squeak basically had to introduce/resurrect Smalltalk in the open source world. With SLIME they've already kinda, sorta stolen some of the key concepts of the Lisp workstation UIs. Though this source drop may inspire some deeper copying on the UI front... we'll see. Thanks, Phil On Mon, Oct 12, 2020 at 12:16 PM Douglas Brebner wrote: > Hi, > > The Medley release of Xerox Interlisp-D has been open sourced under the > MIT licence. Medley is/was an Interlisp/Common Lisp system that, like > Smalltalk, ran on the Xerox D* machines and, also like Smalltalk, has a > very interactive, image-based development style. I'm given to understand > that it's very much like a Smalltalk environment using Lisp as it's > language. > > Sorry that this is kinda off topic but I thought it would be interesting > to Squeakers to know that a sort of sibling of the original Smalltalks > had escaped from the propriety world like Squeak did :) > > More info here > https://interlisp.org/ > https://github.com/Interlisp > > > -------------- next part -------------- An HTML attachment was scrubbed... URL: From eliot.miranda at gmail.com Mon Oct 12 17:59:16 2020 From: eliot.miranda at gmail.com (Eliot Miranda) Date: Mon, 12 Oct 2020 10:59:16 -0700 Subject: [squeak-dev] assert:equals: in Object In-Reply-To: References: Message-ID: Hi Levente, On Fri, Oct 9, 2020 at 4:04 PM Levente Uzonyi wrote: > Hi Eliot, > > On Fri, 9 Oct 2020, Eliot Miranda wrote: > > > Hi All, > > > > moving code from a test into a workspace and back is painful because > Object does not implement assert:equals: or assert:equals:description: even > though it implements assert:description:. So one has to edit out the > > equals: moving to the workspace and edit it back in again on the way > back. I'd like to suggest implementing Object>>assert:equals: > and Object>>assert:equals:description: but I won't, because someone is > bound to criticise it > > as being too green or ill considered or some other depressing BS. > > In my opinion, it would be better to get rid of #assert:equals: and > #assert:equals:description:. Many find the order of its arguments > confusing, and they are only good to help tracking down what failed. > If #assert: could give information about it's argument: the source code > and probably the values of the variables in it, then #assert:equals: would > simply become unnecessary. > I couldn't agree more. I *hate* assert:equals: being, for me, the wrong way round. We would need to provide an abstraction around extracting the parse tree for an argument, which shouldn't be too hard. Let me take a look at this and see if I can provide something simple and robust. > > For example > > | x y | > x := 'foo'. > y := 1. > self assert: x = y. > > would signal an exception with the message 'Assertion failed: x = y (x = > ''foo'', y = 1)' instead of just 'Assertion failed'. > > > Levente > _,,,^..^,,,_ best, Eliot -------------- next part -------------- An HTML attachment was scrubbed... URL: From commits at source.squeak.org Mon Oct 12 18:00:19 2020 From: commits at source.squeak.org (commits at source.squeak.org) Date: Mon, 12 Oct 2020 18:00:19 0000 Subject: [squeak-dev] The Trunk: Tools-eem.999.mcz Message-ID: Eliot Miranda uploaded a new version of Tools to project The Trunk: http://source.squeak.org/trunk/Tools-eem.999.mcz ==================== Summary ==================== Name: Tools-eem.999 Author: eem Time: 12 October 2020, 11:00:17.202907 am UUID: 53fd9116-3cf5-43db-ad0d-150e7f41efd3 Ancestors: Tools-mt.998 Add a preference for automatic variable declaration in a Workspace (true by default). Many people love this feature; I hate it :-) =============== Diff against Tools-mt.998 =============== Item was changed: StringHolder subclass: #Workspace instanceVariableNames: 'bindings acceptDroppedMorphs acceptAction mustDeclareVariables shouldStyle environment' + classVariableNames: 'DeclareVariablesAutomatically LookupPools ShouldStyle' - classVariableNames: 'LookupPools ShouldStyle' poolDictionaries: '' category: 'Tools-Base'! !Workspace commentStamp: 'fbs 6/2/2012 20:46' prior: 0! A Workspace is a text area plus a lot of support for executable code. It is a great place to execute top-level commands to compute something useful, and it is a great place to develop bits of a program before those bits get put into class methods. To open a new workspace, execute: Workspace open A workspace can have its own variables, called "workspace variables", to hold intermediate results. For example, if you type into a workspace "x := 5" and do-it, then later you could type in "y := x * 2" and y would become 10. Additionally, in Morphic, a workspace can gain access to morphs that are on the screen. If acceptDroppedMorphs is turned on, then whenever a morph is dropped on the workspace, a variable will be created which references that morph. This functionality is toggled with the window-wide menu of a workspace. The instance variables of this class are: bindings - holds the workspace variables for this workspace acceptDroppedMorphs - whether dropped morphs should create new variables! Item was added: + ----- Method: Workspace class>>declareVariablesAutomatically (in category 'preferences') ----- + declareVariablesAutomatically + + ^DeclareVariablesAutomatically ifNil: [true]! Item was added: + ----- Method: Workspace class>>declareVariablesAutomatically: (in category 'preferences') ----- + declareVariablesAutomatically: aBoolean + DeclareVariablesAutomatically := aBoolean! Item was changed: ----- Method: Workspace>>initialize (in category 'initialize-release') ----- initialize super initialize. self initializeBindings. acceptDroppedMorphs := false. + mustDeclareVariables := self class declareVariablesAutomatically not. + environment := Environment current! - mustDeclareVariables := false. - environment := Environment current.! Item was changed: ----- Method: Workspace>>mustDeclareVariableWording (in category 'variable declarations') ----- mustDeclareVariableWording + ^(mustDeclareVariables + ifFalse: [' automatically create variable declaration'] + ifTrue: [' automatically create variable declaration']) translated! - ^ mustDeclareVariables not - ifTrue: [' automatically create variable declaration' translated] - ifFalse: [' automatically create variable declaration' translated]! From commits at source.squeak.org Mon Oct 12 18:14:03 2020 From: commits at source.squeak.org (commits at source.squeak.org) Date: Mon, 12 Oct 2020 18:14:03 0000 Subject: [squeak-dev] The Trunk: Morphic-eem.1699.mcz Message-ID: Eliot Miranda uploaded a new version of Morphic to project The Trunk: http://source.squeak.org/trunk/Morphic-eem.1699.mcz ==================== Summary ==================== Name: Morphic-eem.1699 Author: eem Time: 12 October 2020, 11:13:57.837314 am UUID: 948439b8-2352-47f3-bb90-7203900d15b2 Ancestors: Morphic-mt.1698 Fix a slip. =============== Diff against Morphic-mt.1698 =============== Item was changed: ----- Method: MultiWindowLabelButtonMorph>>performAction (in category 'accessing') ----- performAction "Override to interpret the actionSelector as a menu accessor and to activate that menu." + actionSelector ifNil: [^ self]. - actionSelector ifNil: [^ self]- (model perform: actionSelector) ifNotNil: [:menu | menu invokeModalAt: self position - (0 at 5) in: self currentWorld + allowKeyboard: Preferences menuKeyboardControl]! - allowKeyboard: Preferences menuKeyboardControl].! From eliot.miranda at gmail.com Mon Oct 12 18:41:44 2020 From: eliot.miranda at gmail.com (Eliot Miranda) Date: Mon, 12 Oct 2020 11:41:44 -0700 Subject: [squeak-dev] assert:equals: in Object In-Reply-To: References: Message-ID: Hi Levente, On Mon, Oct 12, 2020 at 10:59 AM Eliot Miranda wrote: > Hi Levente, > > On Fri, Oct 9, 2020 at 4:04 PM Levente Uzonyi > wrote: > >> Hi Eliot, >> >> On Fri, 9 Oct 2020, Eliot Miranda wrote: >> >> > Hi All, >> > >> > moving code from a test into a workspace and back is painful >> because Object does not implement assert:equals: or >> assert:equals:description: even though it implements assert:description:. >> So one has to edit out the >> > equals: moving to the workspace and edit it back in again on the way >> back. I'd like to suggest implementing Object>>assert:equals: >> and Object>>assert:equals:description: but I won't, because someone is >> bound to criticise it >> > as being too green or ill considered or some other depressing BS. >> >> In my opinion, it would be better to get rid of #assert:equals: and >> #assert:equals:description:. Many find the order of its arguments >> confusing, and they are only good to help tracking down what failed. >> If #assert: could give information about it's argument: the source code >> and probably the values of the variables in it, then #assert:equals: >> would >> simply become unnecessary. >> > > I couldn't agree more. I *hate* assert:equals: being, for me, the wrong > way round. We would need to provide an abstraction around extracting the > parse tree for an argument, which shouldn't be too hard. Let me take a > look at this and see if I can provide something simple and robust. > >> >> For example >> >> | x y | >> x := 'foo'. >> y := 1. >> self assert: x = y. >> >> would signal an exception with the message 'Assertion failed: x = y (x = >> ''foo'', y = 1)' instead of just 'Assertion failed'. >> > Having thought about it a bit the problem is more difficult than it appears. If the form of an assert is self assert: exprA = exprB then in general only the result of exprA = exprB is available. exprA and exprB may have only been evaluated on the stack and not bound to variables. So no matter tha introspection makes it trivial to derive the parse node and present the text for the expression: 'exprA = exprB' there is no way to retrieve the values of either exprA or exprB because they have been consumed and replaced by the result of their comparison. This is what assert:equals: does; it binds both the actual and expected values to the arguments of assert:equals: and then performs the comparison. So, absent time reversal debugging machinery (which has costs and is unlikely to be attractive for general use in running test suites which are > 99% correct most of the time) we're stuck with assert:equals:. So things to think about are perhaps - a sibling of assert:equals: which takes its arguments in the opposite order - appealing to the SUnit community to reverse the order of arguments to assert:equals:, plus a rewrite rule that reversed the obvious cases where the first argument is a literal constant. - seeing if assert:equals: could infer the order of its arguments; this would require some analysis. For how many assert:equals: cases can it easily be determined if one or other of the arguments is the expected? How many cases are ambiguous? Are any undecidable? etc... - implementing "backwards in time" debugging for the Test Runner when one selects a failing or erroring case. This might be no more than instrumenting the method to place breakpoints before comparisons whose results are consumed by assert: variants and running up until the break. This could be somewhat analogous to toggle break on entry in that adding/removing the pre comparison breakpoints would be automatic. And one might be able to do it by mapping comparisons to comparisons for asserts. e.g. consider: self assert: a = b (along with >, <, >= et al) transformed into self assert: (a compareEqualForAssert: b) where compareEqualForAssert: answers a structured object (AssertResult?) holding onto a, b, and the result of the comparison. AssertResult would answer its result in response to value. So assert methods (that already send value to coerce blocks and booleans to booleans) could send value to the argument, and then if that was false, query to see if the argument was an AssertResult and xtract a more informative error message if so. All this is fun, and could function in the context of SUnit. It does nothing to answer my problem of running asserts in Workspaces. However, that was thoughtless on my part. All I have to remember to do is inspect an instance of a TestCase class and evaluate my doit in that inspector. So for the SocketTesxts if I had had my wits about me I would have simply inspected SocketTest new and then could use ll of SUnit's assert machinery in a doit in the inspector. Levente >> > > _,,,^..^,,,_ > best, Eliot > _,,,^..^,,,_ best, Eliot -------------- next part -------------- An HTML attachment was scrubbed... URL: From Christoph.Thiede at student.hpi.uni-potsdam.de Mon Oct 12 18:47:25 2020 From: Christoph.Thiede at student.hpi.uni-potsdam.de (Thiede, Christoph) Date: Mon, 12 Oct 2020 18:47:25 +0000 Subject: [squeak-dev] The Inbox: WebClient-Core-ct.126.mcz In-Reply-To: References: Message-ID: <2532b37139184eb6b0ecf3f288081b61@student.hpi.uni-potsdam.de> For the case we want to make pre-authentication the default behavior, the attached changeset activates this. What about tests? Do you see the need to add some for this patch? :-) Best, Christoph ________________________________ Von: Squeak-dev im Auftrag von commits at source.squeak.org Gesendet: Montag, 12. Oktober 2020 19:05:34 An: squeak-dev at lists.squeakfoundation.org Betreff: [squeak-dev] The Inbox: WebClient-Core-ct.126.mcz A new version of WebClient-Core was added to project The Inbox: http://source.squeak.org/inbox/WebClient-Core-ct.126.mcz ==================== Summary ==================== Name: WebClient-Core-ct.126 Author: ct Time: 12 October 2020, 7:05:32.190311 pm UUID: a64ca560-814a-f940-8f64-e66a25cedc61 Ancestors: WebClient-Core-ul.123 Proposal to implement pre-authentication on WebClient. MOTIVATION. Until now, the authentication flow in Squeak's WebClient looks like this: First, a request is made without trying to authenticate the user. If the request fails with an error 401 (Unauthorized) or an error 407 (Proxy Authentication Required), the authentication headers are added to the request, and the request is retried. However, this does not work properly in some situations. For example, many modern REST APIs use to return an error 404 if an attempt is made to access a private resource without authenticating before [1] which currrently makes it impossible to authenticate to these APIs using the WebClient. Another issue I encountered today lies in some particular servers not requesting a specific authentication method via the WWW-Authenticate header along a 401 response as specified by the protocol [2]. Concretely, I encountered this problem with the quite popular GitHub API so I think our client should be robust enough to handle this contract violation. APPROACH. This patch adds a new property for the #preAuthenticationMethod to the WebClient class. It can be set to a symbol indicating any authentication method that is supported by the WebClient, e.g. #basic or #bearer. (Digest access authentication, however, cannot be used at this place because it depends on a realm specified by the server.) If this property is set, the relevant authentication headers will be added to the request already before the first attempt is made to request the resource. In addition, the patch refactors and reformatst the methods #authenticate:from: and #sendRequest:contentBlock:. The TESTS work as well as always (a number of them failing sporadically, but after some trials, I get a green bar again). WHAT REMAINS TO BE DONE. I deleted the fixme "Pre-authenticate the request if we have valid auth credentials" comment which I think was exactly what I implemented in this patch. I hope this assumption was correct? Also, another fixme comment requests to preserve the authState after following a redirect. Instead, with this patch, any specified pre-authentication method will be reused after every redirect. I did not fix this because I do not have a use-case scenario for it. Can we leave this as-is, and in a future version, could we simply delete this send to #flushAuthState? Also, I'm not sure about whether pre-authentication maybe should be the default for every request containing a username/password specification. This would speed up every web request that uses credentials by up to the factor 2 because we could save one futile query. Also, it appears to be the state-of-the-art solution, popular tools such as curl specify the credentials in the first run already. On the contrary, it would be a breaking change, and looking at the comment in #preAuthenticationMethod, pre-authentication as an opt-out feature might break or at least slow down NTLM/Negotiate use cases. However, I never heard of this before. Are these protocols still relevant at all? Please give this patch a careful review because still, all knowledge I have about this domain is collected from StackOverflow and Wikipedia a few hours ago. REFERENCES. [1] https://stackoverflow.com/a/17688080/13994294 [2] https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/401 =============== Diff against WebClient-Core-ul.123 =============== Item was changed: Object subclass: #WebClient + instanceVariableNames: 'flags server scheme timeout stream cookies proxyServer lastScheme lastServer lastPort maxRedirect redirections userAgent authParams proxyParams accessLog debugLog preAuthenticationMethod' - instanceVariableNames: 'flags server scheme timeout stream cookies proxyServer lastScheme lastServer lastPort maxRedirect redirections userAgent authParams proxyParams accessLog debugLog' classVariableNames: 'DebugLog FlagAcceptCookies FlagAllowAuth FlagAllowRedirect ProxyHandler' poolDictionaries: '' category: 'WebClient-Core'! !WebClient commentStamp: 'ar 5/4/2010 13:17' prior: 0! WebClient provides a simple yet complete HTTP client implementation. To view the documentation evaluate: HelpBrowser openOn: WebClientHelp. ! Item was added: + ----- Method: WebClient>>authProcess:from:header:params: (in category 'authentication') ----- + authProcess: request from: response header: authHeader params: params + "Process an authentication header. + Answer true if an authentication response could be generated; otherwise, false." + + self + authDispatch: request + from: response + header: authHeader + params: params. + + params at: #authResponse ifAbsent: [^ false]. + + "If we generated an authentication response for the header use it" + request + headerAt: ((response ifNotNil: [response code = 401] ifNil: [true]) + ifTrue: ['Authorization'] + ifFalse: ['Proxy-Authorization']) + put: (params at: #authMethod), ' ', (params at: #authResponse). + + ^ true! Item was changed: ----- Method: WebClient>>authenticate:from: (in category 'sending') ----- authenticate: request from: response "Authenticate after having received a 401/407 response. Returns true if we should retry, false if we fail here." + | headers params | + - "NOTE: The first time through we do NOT ask for credentials right away. - Some authentication mechanisms (NTLM/Negotiate) can use the credentials - of the currently logged on user. Consequently we only ask for credentials - if we're unable to do so without asking. Methods that require credentials - (basic, digest) test for their existence explicitly." - - | headers authHeader params | - "Pick the right set of parameters" + response code = 401 + ifTrue: [ + params := authParams. + headers := response headersAt: 'WWW-Authenticate'. + "If the connection was closed, we need to flush the + proxy params or we won't pick up prior credentials." + self isConnected + ifFalse: [self flushAuthState: proxyParams]] + ifFalse: [ + params := proxyParams. + headers := response headersAt: 'Proxy-Authenticate']. + - response code = 401 ifTrue:[ - params := authParams. - headers := response headersAt: 'WWW-Authenticate'. - "If the connection was closed, we need to flush the - proxy params or we won't pick up prior credentials." - self isConnected - ifFalse:[self flushAuthState: proxyParams]. - ] ifFalse:[ - params := proxyParams. - headers := response headersAt: 'Proxy-Authenticate'. - ]. - "Remove any old response" + params removeKey: #authResponse ifAbsent: []. + - params removeKey: #authResponse ifAbsent:[]. - "Process the authentication header(s)" + headers + detect: [:authHeader | + self + authProcess: request + from: response + header: authHeader + params: params] + ifFound: [:authHeader | ^ true]. + + "If we fall through here this can have two reasons: One is that we don't have a suitable authentication method. Check for that first." + params at: #authMethod ifAbsent: [^ false]. + + "The other possibility is that the credentials are wrong. Clean out the previous auth state and go ask for credentials." - 1 to: headers size do:[:i| - authHeader := headers at: i. - self authDispatch: request from: response header: authHeader params: params. - "If we generated an authentication response for the header use it" - params at: #authResponse ifPresent:[:resp| - request headerAt: (response code = 401 - ifTrue:['Authorization'] - ifFalse:['Proxy-Authorization']) - put: (params at: #authMethod), ' ', resp. - ^true]. - ]. - - "If we fall through here this can have two reasons: One is that we don't have - a suitable authentication method. Check for that first." - params at: #authMethod ifAbsent:[^false]. - - "The other possibility is that the credentials are wrong. - Clean out the previous auth state and go ask for credentials." self flushAuthState: params. + - "Clean out old authentication headers" response code = 401 + ifTrue: [request removeHeader: 'Authorization']. - ifTrue:[request removeHeader: 'Authorization']. "Always clean out the proxy auth header since we don't support pre-authentication" request removeHeader: 'Proxy-Authorization'. + - "Signal WebAuthRequired" (WebAuthRequired client: self request: request response: response) + signal == true ifFalse: [^ false]. + - signal == true ifFalse:[^false]. - "And retry with the new credentials" + ^ self authenticate: request from: response! - ^self authenticate: request from: response! Item was added: + ----- Method: WebClient>>preAuthenticationMethod (in category 'accessing') ----- + preAuthenticationMethod + "The authentication method to be used for initial requests. Symbol, e.g. #basic or #bearer. If nil, no authentication will be used until the server requests an authentication. + + NOTE: Some authentication mechanisms (NTLM/Negotiate) can use the credentials of the currently logged on user. Consequently, by default we only ask for credentials if we're unable to do so without asking." + + ^ preAuthenticationMethod! Item was added: + ----- Method: WebClient>>preAuthenticationMethod: (in category 'accessing') ----- + preAuthenticationMethod: aSymbol + "The authentication method to be used for initial requests. See #preAuthenticationMethod." + + preAuthenticationMethod := aSymbol! Item was changed: ----- Method: WebClient>>sendRequest:contentBlock: (in category 'sending') ----- sendRequest: request contentBlock: contentBlock "Send an http request" | response repeatRedirect repeatAuth | - - "XXXX: Fixme. Pre-authenticate the request if we have valid auth credentials" - redirections := Dictionary new. ["The outer loop handles redirections" + repeatRedirect := false. + + "Always update the host header due to redirect" + request headerAt: 'Host' put: server. + + self preAuthenticationMethod ifNotNil: [:authMethod | + self + authProcess: request + from: nil + header: authMethod asString capitalized + params: authParams]. + - repeatRedirect := false. - - "Always update the host header due to redirect" - request headerAt: 'Host' put: server. - ["The inner loop handles authentication" + repeatAuth := false. + + "Connect can fail if SSL proxy CONNECT is involved" + self connect ifNotNil: [:resp| ^ resp]. + + "Write the request to the debugLog if present" + debugLog ifNotNil: [self writeRequest: request on: debugLog]. + + "Send the request itself" + self writeRequest: request on: stream. + contentBlock value: stream. + + response := request newResponse readFrom: stream. + response url: scheme, '://', server, request rawUrl. + + debugLog ifNotNil: [ + response writeOn: debugLog. + debugLog flush]. + response setCookiesDo: [:cookie| + self acceptCookie: cookie host: self serverUrlName path: request url]. + accessLog ifNotNil: [ + WebUtils logRequest: request response: response on: accessLog]. + "Handle authentication if needed" + (self allowAuth and: [response code = 401 or: [response code = 407]]) ifTrue: [ + "Eat up the content of the previous response" + response content. + repeatAuth := self authenticate: request from: response]. + + repeatAuth + ] whileTrue. - repeatAuth := false. - - "Connect can fail if SSL proxy CONNECT is involved" - self connect ifNotNil:[:resp| ^resp]. + "Flush previous authState. + XXXX: Fixme. authState must be preserved for pre-authentication of requests." + self flushAuthState. + + "Handle redirect if needed" + (self allowRedirect and: [response isRedirect]) ifTrue:[ - "Write the request to the debugLog if present" - debugLog ifNotNil:[self writeRequest: request on: debugLog]. - - "Send the request itself" - self writeRequest: request on: stream. - contentBlock value: stream. - - response := request newResponse readFrom: stream. - response url: (scheme, '://', server, request rawUrl). - - debugLog ifNotNil:[ - response writeOn: debugLog. - debugLog flush. - ]. - response setCookiesDo:[:cookie| - self acceptCookie: cookie host: self serverUrlName path: request url. - ]. - accessLog ifNotNil:[ - WebUtils logRequest: request response: response on: accessLog - ]. - "Handle authentication if needed" - (self allowAuth and:[response code = 401 or:[response code = 407]]) ifTrue:[ "Eat up the content of the previous response" response content. + repeatRedirect := self redirect: request from: response]. + repeatRedirect + ] whileTrue: [ - repeatAuth := self authenticate: request from: response. - ]. - - repeatAuth] whileTrue. - - "Flush previous authState. - XXXX: Fixme. authState must be preserved for pre-authentication of requests." - self flushAuthState. - - "Handle redirect if needed" - (self allowRedirect and:[response isRedirect]) ifTrue:[ - "Eat up the content of the previous response" - response content. - repeatRedirect := self redirect: request from: response. - ]. - repeatRedirect] whileTrue:[ "When redirecting, remove authentication headers" request removeHeader: 'Authorization'. request removeHeader: 'Proxy-Authorization'. ]. + - "If the response is not a success, eat up its content" + (response isSuccess or: [response isInformational]) ifFalse: [ + response content]. + + ^ response! - (response isSuccess or:[response isInformational]) ifFalse:[response content]. - - ^response! -------------- next part -------------- An HTML attachment was scrubbed... URL: -------------- next part -------------- An embedded and charset-unspecified text was scrubbed... Name: WebClient-preauth-default.1.cs URL: From gettimothy at zoho.com Mon Oct 12 18:50:27 2020 From: gettimothy at zoho.com (gettimothy) Date: Mon, 12 Oct 2020 14:50:27 -0400 Subject: [squeak-dev] Roassal next steps. In-Reply-To: References: <17512d8a134.bc18650752020.4064004373768089549@zoho.com> <1602446302480-0.post@n4.nabble.com> Message-ID: <1751e264b51.12370a66173566.8119509517278135856@zoho.com> Hi Tom , Jakob Concerning Announcements: when I initially tried to load Roassal, I included AXAnnouncements from Squeaksource. However, there are some extension methods from Roassal on Announcements that assume a different data layout. In the version on Github I just made sure the extensions compiled at all. Looking at the failing tests now, here are the two hopefully correct implementations for the extension methods (code is mostly copied from the Pharo version, you may want to consider having these make better use of our stdlib if we want to keep those :)): SubscriptionRegistry>>getInteractionsForClass: eventClass "Return the list of subscription for a given Event class" | answer | answer := OrderedCollection new. subscriptionsByAnnouncementClasses values do: [ :collection | collection do: [:subscription | (subscription action receiver class includesBehavior: eventClass) ifTrue: [answer add: subscription subscriber]]]. ^ answer SubscriptionRegistry>>handleSubscriberClass: eventClass "Return true if the receiver has a callback subscripbed for the event class" ^ subscriptionsByAnnouncementClasses values anySatisfy: [ :subCollection | subCollection anySatisfy: [:subscriber | subscriber action receiver class includesBehavior: eventClass ]] With these two, the two RSRoassal3Test methods pass for me. I will use yours as I have no idea how to "make better use of our stlib"  (: I did some quick checking and found, as you did, that Pharo has rolled their own: https://github.com/pharo-project/pharo-core/tree/6.0/Announcements-Core.package Is AXAnnouncements still API-compatible with the Pharo Announcements (or should I phrase this the other way around)? Either way, it would be nice to have a working Pharo-Announcements-API implementation for Squeak, at least for compatibility's sake. It doesn't have to be in the Trunk, but once you have an implementation or shim, one would extend the BaselineOfRoassal to include this dependency for Squeak only. I remember reading years ago that Announcements and AXAnnouncements where API compatible, I have no idea on Pharo. So, to compare the API, just make sure each implements the messages and returns the same stuff? Check that tests implemented in AXA work in Pharo and tests in Pharo Announcments work in AXA Squeak? I think the most helpful next step would be to go through each package, make sure the package can be loaded without stumbling over stray pharo-only symbols and getting all the tests to pass. I will do that this weekend!  cheers, t -------------- next part -------------- An HTML attachment was scrubbed... URL: From Das.Linux at gmx.de Mon Oct 12 19:06:21 2020 From: Das.Linux at gmx.de (Tobias Pape) Date: Mon, 12 Oct 2020 21:06:21 +0200 Subject: [squeak-dev] The Inbox: WebClient-Core-ct.126.mcz In-Reply-To: <2532b37139184eb6b0ecf3f288081b61@student.hpi.uni-potsdam.de> References: <2532b37139184eb6b0ecf3f288081b61@student.hpi.uni-potsdam.de> Message-ID: <0B67EEA2-2AC1-4156-A8D8-56C192B48EF6@gmx.de> Hi > On 12.10.2020, at 20:47, Thiede, Christoph wrote: > > For example, many modern REST APIs use to return an error 404 if an attempt is made to access a private resource without authenticating before [1] which currrently makes it impossible to authenticate to these APIs using the WebClient. No, thats not what the link says: Q: "1. How to deal with unauthorized requests? I'm intending to respond to requests with the following codes: • Is the resource open and found? 200 OK • Do you need to be authenticated to access the resources? 401 Unauthorized • Don't you have access to a category of resources? 403 Forbidden • Do you have access to a category of resources, but not to this specific resource? 404 Not Found to prevent people from getting to know the existance of a resource they do not have access to. • Doesn't the resource exist? 404 Not Found " A: "How to deal with unauthorized requests? The way you described it is pretty much the recommended way for a RESTful service. As far as I can see there is absolutely nothing wrong with that." That means: "Do you need to be authenticated to access the resources? 401 Unauthorized" I do not support preemtive authentication, especially in non-SSL circumstances. =-=-=-= It is also hard to see the differences because you reformatted them method :/ Best regards -Tobias From gettimothy at zoho.com Mon Oct 12 19:07:04 2020 From: gettimothy at zoho.com (gettimothy) Date: Mon, 12 Oct 2020 15:07:04 -0400 Subject: [squeak-dev] [ANN] Squeak converted to Tonel fomat In-Reply-To: References: Message-ID: <1751e3581a3.103617ef473842.1956619238675936444@zoho.com> Cool  Works as advertised on 19941 Alpha too. A word to the wary,  Beware of the "Tonel Bomb" in your image directory (: Cool stuff, though. ---- On Mon, 12 Oct 2020 08:13:59 -0400 Edgar J. De Cleene wrote ---- Steps I do Download Squeak6.0alpha-19958-64bit.image from http://ftp.squeak.org/6.0alpha/Squeak6.0alpha-19958-64bit. Load TonelWriter.2.cs into and do Object new createSources in a Workspace Open Terminal and do tar -czvf SqueakTonel.tar.gz SqueakTonel for have a compressed file of 683 kb https://github.com/edgardec/SqueakTonel Edgar @morplenauta -------------- next part -------------- An HTML attachment was scrubbed... URL: From forums.jakob at resfarm.de Mon Oct 12 19:19:20 2020 From: forums.jakob at resfarm.de (Jakob Reschke) Date: Mon, 12 Oct 2020 14:19:20 -0500 (CDT) Subject: [squeak-dev] [ANN] Squeak converted to Tonel fomat In-Reply-To: References: Message-ID: <1602530360272-0.post@n4.nabble.com> Hi, Am I blind or does the export only contain the class definitions, but not the methods? Could you commit the files without archiving them, please? Then one could have a look at them on GitHub directly. Kind regards, Jakob -- Sent from: http://forum.world.st/Squeak-Dev-f45488.html From forums.jakob at resfarm.de Mon Oct 12 19:22:04 2020 From: forums.jakob at resfarm.de (Jakob Reschke) Date: Mon, 12 Oct 2020 14:22:04 -0500 (CDT) Subject: [squeak-dev] Roassal next steps. In-Reply-To: <1751e264b51.12370a66173566.8119509517278135856@zoho.com> References: <17512d8a134.bc18650752020.4064004373768089549@zoho.com> <1602446302480-0.post@n4.nabble.com> <1751e264b51.12370a66173566.8119509517278135856@zoho.com> Message-ID: <1602530524942-0.post@n4.nabble.com> -- Sent from: http://forum.world.st/Squeak-Dev-f45488.html From forums.jakob at resfarm.de Mon Oct 12 19:24:47 2020 From: forums.jakob at resfarm.de (Jakob Reschke) Date: Mon, 12 Oct 2020 14:24:47 -0500 (CDT) Subject: [squeak-dev] Roassal next steps. In-Reply-To: <1751e264b51.12370a66173566.8119509517278135856@zoho.com> References: <17512d8a134.bc18650752020.4064004373768089549@zoho.com> <1602446302480-0.post@n4.nabble.com> <1751e264b51.12370a66173566.8119509517278135856@zoho.com> Message-ID: <1602530687972-0.post@n4.nabble.com> Squeak - Dev mailing list wrote > So, to compare the API, just make sure each implements the messages and > returns the same stuff? Check that tests implemented in AXA work in Pharo > and tests in Pharo Announcments work in AXA Squeak? Only for those classes and messages for public use (by libraries and applications). Also I think the "AXA tests in Pharo" direction does not provide us a benefit at the moment. -- Sent from: http://forum.world.st/Squeak-Dev-f45488.html From Christoph.Thiede at student.hpi.uni-potsdam.de Mon Oct 12 19:25:02 2020 From: Christoph.Thiede at student.hpi.uni-potsdam.de (Thiede, Christoph) Date: Mon, 12 Oct 2020 19:25:02 +0000 Subject: [squeak-dev] The Inbox: WebClient-Core-ct.126.mcz In-Reply-To: <0B67EEA2-2AC1-4156-A8D8-56C192B48EF6@gmx.de> References: <2532b37139184eb6b0ecf3f288081b61@student.hpi.uni-potsdam.de>, <0B67EEA2-2AC1-4156-A8D8-56C192B48EF6@gmx.de> Message-ID: <80f7baf3a0eb4d3685d8aea6f12aef5c@student.hpi.uni-potsdam.de> Hi Tobias! I don't understand your objection. As the link says, some REST APIs will return a 404 Not Found error rather than a 401 Unauthorized error to make sure that unauthorized users cannot know the list of private objects that exist for the owning user. For example, the GitHub API will respond with a 404 error if you try to access the following URL without authorization: https://api.github.com/repos/LinqLover/openHAB-configuration/zipball/master However, I sweat that this repository actually exists, and I will get a 202 OK response if I authenticate before! It's the same pattern as not telling you whether your email or your password is wrong on any web service to protect the knowledge about registered users from possible attackers. > I do not support preemtive authentication, especially in non-SSL circumstances. Why not? However, I would not dislike a warning being raised every time you try to authenticate if the scheme is not https. > It is also hard to see the differences because you reformatted them method :/ That's truly a problem ... I found the original method version suboptimal to read. Is the prettyDiffs an option for you? Otherwise, I can split up this inbox version. Best, Christoph ________________________________ Von: Squeak-dev im Auftrag von Tobias Pape Gesendet: Montag, 12. Oktober 2020 21:06:21 An: The general-purpose Squeak developers list Betreff: Re: [squeak-dev] The Inbox: WebClient-Core-ct.126.mcz Hi > On 12.10.2020, at 20:47, Thiede, Christoph wrote: > > For example, many modern REST APIs use to return an error 404 if an attempt is made to access a private resource without authenticating before [1] which currrently makes it impossible to authenticate to these APIs using the WebClient. No, thats not what the link says: Q: "1. How to deal with unauthorized requests? I'm intending to respond to requests with the following codes: • Is the resource open and found? 200 OK • Do you need to be authenticated to access the resources? 401 Unauthorized • Don't you have access to a category of resources? 403 Forbidden • Do you have access to a category of resources, but not to this specific resource? 404 Not Found to prevent people from getting to know the existance of a resource they do not have access to. • Doesn't the resource exist? 404 Not Found " A: "How to deal with unauthorized requests? The way you described it is pretty much the recommended way for a RESTful service. As far as I can see there is absolutely nothing wrong with that." That means: "Do you need to be authenticated to access the resources? 401 Unauthorized" I do not support preemtive authentication, especially in non-SSL circumstances. =-=-=-= It is also hard to see the differences because you reformatted them method :/ Best regards -Tobias -------------- next part -------------- An HTML attachment was scrubbed... URL: From forums.jakob at resfarm.de Mon Oct 12 19:27:48 2020 From: forums.jakob at resfarm.de (Jakob Reschke) Date: Mon, 12 Oct 2020 14:27:48 -0500 (CDT) Subject: [squeak-dev] assert:equals: in Object In-Reply-To: References: Message-ID: <1602530868859-0.post@n4.nabble.com> Eliot Miranda-2 wrote > - appealing to the SUnit community to reverse the order of arguments to > assert:equals:, plus a rewrite rule that reversed the obvious cases where > the first argument is a literal constant. For what it is worth, Pharo has just swapped the parameters... which makes all "portable" test cases awkward. -- Sent from: http://forum.world.st/Squeak-Dev-f45488.html From Das.Linux at gmx.de Mon Oct 12 19:55:39 2020 From: Das.Linux at gmx.de (Tobias Pape) Date: Mon, 12 Oct 2020 21:55:39 +0200 Subject: [squeak-dev] The Inbox: WebClient-Core-ct.126.mcz In-Reply-To: <80f7baf3a0eb4d3685d8aea6f12aef5c@student.hpi.uni-potsdam.de> References: <2532b37139184eb6b0ecf3f288081b61@student.hpi.uni-potsdam.de> <0B67EEA2-2AC1-4156-A8D8-56C192B48EF6@gmx.de> <80f7baf3a0eb4d3685d8aea6f12aef5c@student.hpi.uni-potsdam.de> Message-ID: Hey Christoph > On 12.10.2020, at 21:25, Thiede, Christoph wrote: > > Hi Tobias! > > I don't understand your objection. As the link says, some REST APIs will return a 404 Not Found error rather than a 401 Unauthorized error to make sure that unauthorized users cannot know the list of private objects that exist for the owning user. You're conflating authentication and authorization. (That said, I think the header name is a misnomer in HTTP…, but I might be wrong) > For example, the GitHub API will respond with a 404 error if you try to access the following URL without authorization: https://api.github.com/repos/LinqLover/openHAB-configuration/zipball/master > However, I sweat that this repository actually exists, and I will get a 202 OK response if I authenticate before! > It's the same pattern as not telling you whether your email or your password is wrong on any web service to protect the knowledge about registered users from possible attackers. No its different. Look: if you go to https://api.github.com/ One of the json entries is: authorizations_url: "https://api.github.com/authorizations" If you go to "https://api.github.com/authorizations" You'll get the 401. From then on, all HTTP Clients will continue with authorization headers. No preauth required. If I'm authenticated that way, I as krono will get the 404 on your url, but you as LinqLover will get 200. And yes, Github essentially says "F$#^#$ Standards": https://docs.github.com/en/free-pro-team at latest/rest/overview/other-authentication-methods The API supports Basic Authentication as defined in RFC2617 with a few slight differences. The main difference is that the RFC requires unauthenticated requests to be answered with 401 Unauthorized responses. In many places, this would disclose the existence of user data. Instead, the GitHub API responds with 404 Not Found. This may cause problems for HTTP libraries that assume a 401 Unauthorized response. The solution is to manually craft the Authorization header. And I hate it. They're trading privacy for security. That's a dick move. NB: For 2FA, you need the https://api.github.com/authorizations endpoint anyways: https://docs.github.com/en/free-pro-team at latest/rest/overview/other-authentication-methods#working-with-two-factor-authentication So maybe, first going to "https://api.github.com/authorizations" is a good idea in the first place? :D It's not your fault, I understand you just want to get things going. GitHub is a too big player and we have to scratch standards for that, sigh… > > I do not support preemtive authentication, especially in non-SSL circumstances. > > Why not? It leaks credentials unnecessarily. > However, I would not dislike a warning being raised every time you try to authenticate if the scheme is not https. WebClient is pretty lean for a HTTP client, I'd rather have it continue that way. That said, you can simply do WebClient httpGet: 'https://api.github.com/repos/LinqLover/openHAB-configuration/zipball/master' do: [:req | req headerAt: 'Authorization' put: 'WHATEVER-NECESSARY'] And you have your pre-auth. > > > It is also hard to see the differences because you reformatted them method :/ > > That's truly a problem ... I found the original method version suboptimal to read. Is the prettyDiffs an option for you? Otherwise, I can split up this inbox version. I understand that the method is maybe not the most common style, but I think that functional changes should in such cases not be mixed with style changes. Best regards -Tobias > > Best, > Christoph > Von: Squeak-dev im Auftrag von Tobias Pape > Gesendet: Montag, 12. Oktober 2020 21:06:21 > An: The general-purpose Squeak developers list > Betreff: Re: [squeak-dev] The Inbox: WebClient-Core-ct.126.mcz > > Hi > > > On 12.10.2020, at 20:47, Thiede, Christoph wrote: > > > > For example, many modern REST APIs use to return an error 404 if an attempt is made to access a private resource without authenticating before [1] which currrently makes it impossible to authenticate to these APIs using the WebClient. > > > No, thats not what the link says: > > Q: "1. How to deal with unauthorized requests? > > I'm intending to respond to requests with the following codes: > > • Is the resource open and found? 200 OK > • Do you need to be authenticated to access the resources? 401 Unauthorized > • Don't you have access to a category of resources? 403 Forbidden > • Do you have access to a category of resources, but not to this specific resource? 404 Not Found to prevent people from getting to know the existance of a resource they do not have access to. > • Doesn't the resource exist? 404 Not Found > > " > A: "How to deal with unauthorized requests? > > The way you described it is pretty much the recommended way for a RESTful service. As far as I can see there is absolutely nothing wrong with that." > > > That means: "Do you need to be authenticated to access the resources? 401 Unauthorized" > > I do not support preemtive authentication, especially in non-SSL circumstances. > > > =-=-=-= > > > It is also hard to see the differences because you reformatted them method :/ > > Best regards > -Tobias From lewis at mail.msen.com Mon Oct 12 21:30:04 2020 From: lewis at mail.msen.com (David T. Lewis) Date: Mon, 12 Oct 2020 17:30:04 -0400 Subject: [squeak-dev] Bug in SqueakSource mailer service? In-Reply-To: <7c769e9531cf4f6ba068508d047e3823@student.hpi.uni-potsdam.de> References: <7c769e9531cf4f6ba068508d047e3823@student.hpi.uni-potsdam.de> Message-ID: <20201012213004.GA8520@shell.msen.com> Hi Christoph, On Mon, Oct 12, 2020 at 11:34:04AM +0000, Thiede, Christoph wrote: > Hi all, > > > that's funny. I uploaded EToys-ct.409, whiches removes some invalid encoding characters from a method comment, half an hour ago and it did not appear in the mailing list. However, Monticello-ct.731 which I uploaded some minutes later appeared on the list as usual. Do we have some bug in the mailer service code that stumbled upon the special characters in the method comment? > > > Here is the (manually created) diff: > > > assureContentAreaStaysAt: aPoint > - "selbst-verst????????????????????????????ndlich" > > self currentWorld doOneCycleNow. > self topLeft: ((self topLeft - contentArea topLeft ) + aPoint) > I do not know the answer to your question, but based on my experience supporting the old squeaksource.com server (which has until recently been running on an older image and squeaksource code base), I would not be surprised to find bugs like this related to improper handling of WideString in squeaksource. In earlier years, squeaksource.com was being used heavily by students for Pharo-based classroom assignments. User names that (quite properly) used WideString for the user name would cause failures in the squeaksource application, and I would have to "fix" these problems by converting the usernames to plausible 8-bit strings in the squeaksource.com image. These failures happened quite frequently for a number of years after the Pharo community moved to smalltalkhub.com, because squeaksource.com was still being used to support classroom projects. On source.squeak.org we did not ever have these issues, possibly because it was running on a newer Squeak image with better support for WideString, or possibly simply because the active developers on source.squeak.org have been in the habit of avoiding the use of international character sets in their commits. My guess is that you have uncovered a bug in SqueakSqueak that simply has not been noticed until now. Dave From commits at source.squeak.org Mon Oct 12 21:39:12 2020 From: commits at source.squeak.org (commits at source.squeak.org) Date: Mon, 12 Oct 2020 21:39:12 0000 Subject: [squeak-dev] The Inbox: WebClient-Core-ct.128.mcz Message-ID: A new version of WebClient-Core was added to project The Inbox: http://source.squeak.org/inbox/WebClient-Core-ct.128.mcz ==================== Summary ==================== Name: WebClient-Core-ct.128 Author: ct Time: 12 October 2020, 11:39:11.062253 pm UUID: 4766db7d-349a-8643-b64a-c843f49ef71c Ancestors: WebClient-Core-mt.126 Reupload #2 of WebClient-Core-ct.126. Reverted reformatting, which will go into another version later. =============== Diff against WebClient-Core-mt.126 =============== Item was changed: Object subclass: #WebClient + instanceVariableNames: 'flags server scheme timeout stream cookies proxyServer lastScheme lastServer lastPort maxRedirect redirections userAgent authParams proxyParams accessLog debugLog preAuthenticationMethod' - instanceVariableNames: 'flags server scheme timeout stream cookies proxyServer lastScheme lastServer lastPort maxRedirect redirections userAgent authParams proxyParams accessLog debugLog' classVariableNames: 'DebugLog FlagAcceptCookies FlagAllowAuth FlagAllowRedirect ProxyHandler' poolDictionaries: '' category: 'WebClient-Core'! !WebClient commentStamp: 'ar 5/4/2010 13:17' prior: 0! WebClient provides a simple yet complete HTTP client implementation. To view the documentation evaluate: HelpBrowser openOn: WebClientHelp. ! Item was added: + ----- Method: WebClient>>authProcess:from:header:params: (in category 'authentication') ----- + authProcess: request from: response header: authHeader params: params + "Process an authentication header. + Answer true if an authentication response could be generated; otherwise, false." + + self + authDispatch: request + from: response + header: authHeader + params: params. + + params at: #authResponse ifAbsent: [^ false]. + + "If we generated an authentication response for the header use it" + request + headerAt: ((response ifNotNil: [response code = 401] ifNil: [true]) + ifTrue: ['Authorization'] + ifFalse: ['Proxy-Authorization']) + put: (params at: #authMethod), ' ', (params at: #authResponse). + + ^ true! Item was changed: ----- Method: WebClient>>authenticate:from: (in category 'sending') ----- authenticate: request from: response "Authenticate after having received a 401/407 response. Returns true if we should retry, false if we fail here." + | headers params | + - "NOTE: The first time through we do NOT ask for credentials right away. - Some authentication mechanisms (NTLM/Negotiate) can use the credentials - of the currently logged on user. Consequently we only ask for credentials - if we're unable to do so without asking. Methods that require credentials - (basic, digest) test for their existence explicitly." - - | headers authHeader params | - "Pick the right set of parameters" response code = 401 ifTrue:[ params := authParams. headers := response headersAt: 'WWW-Authenticate'. "If the connection was closed, we need to flush the proxy params or we won't pick up prior credentials." + self isConnected + ifFalse: [self flushAuthState: proxyParams] - self isConnected - ifFalse:[self flushAuthState: proxyParams]. ] ifFalse:[ params := proxyParams. + headers := response headersAt: 'Proxy-Authenticate' - headers := response headersAt: 'Proxy-Authenticate'. ]. + - "Remove any old response" params removeKey: #authResponse ifAbsent:[]. + - "Process the authentication header(s)" + headers + detect: [:authHeader | + self + authProcess: request + from: response + header: authHeader + params: params] + ifFound: [:authHeader | ^ true]. + - 1 to: headers size do:[:i| - authHeader := headers at: i. - self authDispatch: request from: response header: authHeader params: params. - "If we generated an authentication response for the header use it" - params at: #authResponse ifPresent:[:resp| - request headerAt: (response code = 401 - ifTrue:['Authorization'] - ifFalse:['Proxy-Authorization']) - put: (params at: #authMethod), ' ', resp. - ^true]. - ]. - "If we fall through here this can have two reasons: One is that we don't have a suitable authentication method. Check for that first." params at: #authMethod ifAbsent:[^false]. + - "The other possibility is that the credentials are wrong. Clean out the previous auth state and go ask for credentials." self flushAuthState: params. + - "Clean out old authentication headers" response code = 401 ifTrue:[request removeHeader: 'Authorization']. "Always clean out the proxy auth header since we don't support pre-authentication" request removeHeader: 'Proxy-Authorization'. + - "Signal WebAuthRequired" (WebAuthRequired client: self request: request response: response) signal == true ifFalse:[^false]. + - "And retry with the new credentials" ^self authenticate: request from: response! Item was added: + ----- Method: WebClient>>preAuthenticationMethod (in category 'accessing') ----- + preAuthenticationMethod + "The authentication method to be used for initial requests. Symbol, e.g. #basic or #bearer. If nil, no authentication will be used until the server requests an authentication. + + NOTE: Some authentication mechanisms (NTLM/Negotiate) can use the credentials of the currently logged on user. Consequently, by default we only ask for credentials if we're unable to do so without asking." + + ^ preAuthenticationMethod! Item was added: + ----- Method: WebClient>>preAuthenticationMethod: (in category 'accessing') ----- + preAuthenticationMethod: aSymbol + "The authentication method to be used for initial requests. See #preAuthenticationMethod." + + preAuthenticationMethod := aSymbol! Item was changed: ----- Method: WebClient>>sendRequest:contentBlock: (in category 'sending') ----- sendRequest: request contentBlock: contentBlock "Send an http request" | response repeatRedirect repeatAuth | - - "XXXX: Fixme. Pre-authenticate the request if we have valid auth credentials" - redirections := Dictionary new. ["The outer loop handles redirections" repeatRedirect := false. "Always update the host header due to redirect" request headerAt: 'Host' put: server. + + self preAuthenticationMethod ifNotNil: [:authMethod | + self + authProcess: request + from: nil + header: authMethod asString capitalized + params: authParams]. + - ["The inner loop handles authentication" repeatAuth := false. + - "Connect can fail if SSL proxy CONNECT is involved" self connect ifNotNil:[:resp| ^resp]. "Write the request to the debugLog if present" debugLog ifNotNil:[self writeRequest: request on: debugLog]. + - "Send the request itself" self writeRequest: request on: stream. contentBlock value: stream. + - response := request newResponse readFrom: stream. response url: (scheme, '://', server, request rawUrl). + - debugLog ifNotNil:[ response writeOn: debugLog. debugLog flush. ]. response setCookiesDo:[:cookie| self acceptCookie: cookie host: self serverUrlName path: request url. ]. accessLog ifNotNil:[ WebUtils logRequest: request response: response on: accessLog ]. "Handle authentication if needed" (self allowAuth and:[response code = 401 or:[response code = 407]]) ifTrue:[ "Eat up the content of the previous response" response content. repeatAuth := self authenticate: request from: response. ]. repeatAuth] whileTrue. + - "Flush previous authState. XXXX: Fixme. authState must be preserved for pre-authentication of requests." self flushAuthState. + - "Handle redirect if needed" (self allowRedirect and:[response isRedirect]) ifTrue:[ "Eat up the content of the previous response" response content. repeatRedirect := self redirect: request from: response. ]. repeatRedirect] whileTrue:[ "When redirecting, remove authentication headers" request removeHeader: 'Authorization'. request removeHeader: 'Proxy-Authorization'. ]. + - "If the response is not a success, eat up its content" (response isSuccess or:[response isInformational]) ifFalse:[response content]. + - ^response! From Christoph.Thiede at student.hpi.uni-potsdam.de Mon Oct 12 21:42:22 2020 From: Christoph.Thiede at student.hpi.uni-potsdam.de (Thiede, Christoph) Date: Mon, 12 Oct 2020 21:42:22 +0000 Subject: [squeak-dev] The Inbox: WebClient-Core-ct.126.mcz In-Reply-To: References: <2532b37139184eb6b0ecf3f288081b61@student.hpi.uni-potsdam.de> <0B67EEA2-2AC1-4156-A8D8-56C192B48EF6@gmx.de> <80f7baf3a0eb4d3685d8aea6f12aef5c@student.hpi.uni-potsdam.de>, Message-ID: <11383fd575bc4eaeb8d2dec513a190bc@student.hpi.uni-potsdam.de> Hi Tobias, okay, I see this authorization pattern now, so you mentioned two ways to work around the current limitations: First, by GETting https://api.github.com/authorizations before, or second, by passing the Authorization header manually. Is this correct? However, both of these approaches lack of the RESTful-typical simplicity of "making a single HTTP request without dealing with complex call protocols or low-level connectivity code". To give an illustration of my use case, please see this PR on Metacello: https://github.com/Metacello/metacello/pull/534 IMHO it would be a shame if you could not access a popular REST API like api.github.com in Squeak using a single message send to the WebClient/WebSocket class. > > Why not? > > It leaks credentials unnecessarily. Ah, good point! But this pattern (EAFP for web connections) is not really state of the art, is it? As mentioned, curl, for example, sends the authentication data in the very first request, which is a tool I would tend to *call* state of the art. And speed is another point, given the fact that internet connections in Squeak are really slow ... Why do you call this behavior a leak? The application developer will not pass authentication data to the web client unless they expect the server to consume these data anyway. If you deem it necessary, we could turn off the pre-authentication as soon as the client was redirected to another server ... > I understand that the method is maybe not the most common style, but I think that functional changes should in such cases not be mixed with style changes. Alright, please see WebClient-Core-ct.128. But maybe we should consider to use prettyDiff for the mailing list notifications as a default? Just an idea. Best, Christoph ________________________________ Von: Squeak-dev im Auftrag von Tobias Pape Gesendet: Montag, 12. Oktober 2020 21:55:39 An: The general-purpose Squeak developers list Betreff: Re: [squeak-dev] The Inbox: WebClient-Core-ct.126.mcz Hey Christoph > On 12.10.2020, at 21:25, Thiede, Christoph wrote: > > Hi Tobias! > > I don't understand your objection. As the link says, some REST APIs will return a 404 Not Found error rather than a 401 Unauthorized error to make sure that unauthorized users cannot know the list of private objects that exist for the owning user. You're conflating authentication and authorization. (That said, I think the header name is a misnomer in HTTP…, but I might be wrong) > For example, the GitHub API will respond with a 404 error if you try to access the following URL without authorization: https://api.github.com/repos/LinqLover/openHAB-configuration/zipball/master > However, I sweat that this repository actually exists, and I will get a 202 OK response if I authenticate before! > It's the same pattern as not telling you whether your email or your password is wrong on any web service to protect the knowledge about registered users from possible attackers. No its different. Look: if you go to https://api.github.com/ One of the json entries is: authorizations_url: "https://api.github.com/authorizations" If you go to "https://api.github.com/authorizations" You'll get the 401. >From then on, all HTTP Clients will continue with authorization headers. No preauth required. If I'm authenticated that way, I as krono will get the 404 on your url, but you as LinqLover will get 200. And yes, Github essentially says "F$#^#$ Standards": https://docs.github.com/en/free-pro-team at latest/rest/overview/other-authentication-methods The API supports Basic Authentication as defined in RFC2617 with a few slight differences. The main difference is that the RFC requires unauthenticated requests to be answered with 401 Unauthorized responses. In many places, this would disclose the existence of user data. Instead, the GitHub API responds with 404 Not Found. This may cause problems for HTTP libraries that assume a 401 Unauthorized response. The solution is to manually craft the Authorization header. And I hate it. They're trading privacy for security. That's a dick move. NB: For 2FA, you need the https://api.github.com/authorizations endpoint anyways: https://docs.github.com/en/free-pro-team at latest/rest/overview/other-authentication-methods#working-with-two-factor-authentication So maybe, first going to "https://api.github.com/authorizations" is a good idea in the first place? :D It's not your fault, I understand you just want to get things going. GitHub is a too big player and we have to scratch standards for that, sigh… > > I do not support preemtive authentication, especially in non-SSL circumstances. > > Why not? It leaks credentials unnecessarily. > However, I would not dislike a warning being raised every time you try to authenticate if the scheme is not https. WebClient is pretty lean for a HTTP client, I'd rather have it continue that way. That said, you can simply do WebClient httpGet: 'https://api.github.com/repos/LinqLover/openHAB-configuration/zipball/master' do: [:req | req headerAt: 'Authorization' put: 'WHATEVER-NECESSARY'] And you have your pre-auth. > > > It is also hard to see the differences because you reformatted them method :/ > > That's truly a problem ... I found the original method version suboptimal to read. Is the prettyDiffs an option for you? Otherwise, I can split up this inbox version. I understand that the method is maybe not the most common style, but I think that functional changes should in such cases not be mixed with style changes. Best regards -Tobias > > Best, > Christoph > Von: Squeak-dev im Auftrag von Tobias Pape > Gesendet: Montag, 12. Oktober 2020 21:06:21 > An: The general-purpose Squeak developers list > Betreff: Re: [squeak-dev] The Inbox: WebClient-Core-ct.126.mcz > > Hi > > > On 12.10.2020, at 20:47, Thiede, Christoph wrote: > > > > For example, many modern REST APIs use to return an error 404 if an attempt is made to access a private resource without authenticating before [1] which currrently makes it impossible to authenticate to these APIs using the WebClient. > > > No, thats not what the link says: > > Q: "1. How to deal with unauthorized requests? > > I'm intending to respond to requests with the following codes: > > • Is the resource open and found? 200 OK > • Do you need to be authenticated to access the resources? 401 Unauthorized > • Don't you have access to a category of resources? 403 Forbidden > • Do you have access to a category of resources, but not to this specific resource? 404 Not Found to prevent people from getting to know the existance of a resource they do not have access to. > • Doesn't the resource exist? 404 Not Found > > " > A: "How to deal with unauthorized requests? > > The way you described it is pretty much the recommended way for a RESTful service. As far as I can see there is absolutely nothing wrong with that." > > > That means: "Do you need to be authenticated to access the resources? 401 Unauthorized" > > I do not support preemtive authentication, especially in non-SSL circumstances. > > > =-=-=-= > > > It is also hard to see the differences because you reformatted them method :/ > > Best regards > -Tobias -------------- next part -------------- An HTML attachment was scrubbed... URL: From Christoph.Thiede at student.hpi.uni-potsdam.de Mon Oct 12 21:45:31 2020 From: Christoph.Thiede at student.hpi.uni-potsdam.de (Thiede, Christoph) Date: Mon, 12 Oct 2020 21:45:31 +0000 Subject: [squeak-dev] Bug in SqueakSource mailer service? In-Reply-To: <20201012213004.GA8520@shell.msen.com> References: <7c769e9531cf4f6ba068508d047e3823@student.hpi.uni-potsdam.de>, <20201012213004.GA8520@shell.msen.com> Message-ID: Hi Dave, a naive question: Why isn't SqueakSource running on an automatically updated Trunk image, maybe only pulling updates that were approved by a CI process? Wasn't it worth the effort? :-) Best, Christoph ________________________________ Von: Squeak-dev im Auftrag von David T. Lewis Gesendet: Montag, 12. Oktober 2020 23:30:04 An: The general-purpose Squeak developers list Betreff: Re: [squeak-dev] Bug in SqueakSource mailer service? Hi Christoph, On Mon, Oct 12, 2020 at 11:34:04AM +0000, Thiede, Christoph wrote: > Hi all, > > > that's funny. I uploaded EToys-ct.409, whiches removes some invalid encoding characters from a method comment, half an hour ago and it did not appear in the mailing list. However, Monticello-ct.731 which I uploaded some minutes later appeared on the list as usual. Do we have some bug in the mailer service code that stumbled upon the special characters in the method comment? > > > Here is the (manually created) diff: > > > assureContentAreaStaysAt: aPoint > - "selbst-verst????????????????????????????ndlich" > > self currentWorld doOneCycleNow. > self topLeft: ((self topLeft - contentArea topLeft ) + aPoint) > I do not know the answer to your question, but based on my experience supporting the old squeaksource.com server (which has until recently been running on an older image and squeaksource code base), I would not be surprised to find bugs like this related to improper handling of WideString in squeaksource. In earlier years, squeaksource.com was being used heavily by students for Pharo-based classroom assignments. User names that (quite properly) used WideString for the user name would cause failures in the squeaksource application, and I would have to "fix" these problems by converting the usernames to plausible 8-bit strings in the squeaksource.com image. These failures happened quite frequently for a number of years after the Pharo community moved to smalltalkhub.com, because squeaksource.com was still being used to support classroom projects. On source.squeak.org we did not ever have these issues, possibly because it was running on a newer Squeak image with better support for WideString, or possibly simply because the active developers on source.squeak.org have been in the habit of avoiding the use of international character sets in their commits. My guess is that you have uncovered a bug in SqueakSqueak that simply has not been noticed until now. Dave -------------- next part -------------- An HTML attachment was scrubbed... URL: From kirtai+st at gmail.com Mon Oct 12 22:21:45 2020 From: kirtai+st at gmail.com (Douglas Brebner) Date: Mon, 12 Oct 2020 23:21:45 +0100 Subject: [squeak-dev] (Somewhat off-topic) Xerox Interlisp-D Medley open sourced In-Reply-To: References: Message-ID: <715b37a6-8476-4629-8e02-23dde385635f@gmail.com> On 12/10/2020 18:12, Phil B wrote: > Douglas, > > It's always good to see historically significant software preserved > rather than bit rotting in darkness.  It's probably not going to have > nearly the impact Squeak did in the open source world since the Lisp > world already has an embarrassment of good implementations (distinct > implementations rather than dialects.  See CCL, which is a direct > descendant of MCL, for example) where Squeak basically had to > introduce/resurrect Smalltalk in the open source world.  With SLIME > they've already kinda, sorta stolen some of the key concepts of the > Lisp workstation UIs.  Though this source drop may inspire some deeper > copying on the UI front... we'll see. Agreed. However, I think Medley is particularly interesting; it has some features and attributes that even Genera didn't have and isn't subject to the limitations of Emacs. It's also not an emulation like LambdaDelta, rather using a bytecode VM similar to Squeak. It may not make a big impact but I expect it will get a bunch of extremely dedicated fans. And, of course, it has a Smalltalk feel which is appealing :) From edgardec2005 at gmail.com Mon Oct 12 22:42:39 2020 From: edgardec2005 at gmail.com (Edgar De Cleene) Date: Mon, 12 Oct 2020 19:42:39 -0300 Subject: [squeak-dev] [ANN] Squeak converted to Tonel fomat In-Reply-To: <1602530360272-0.post@n4.nabble.com> References: <1602530360272-0.post@n4.nabble.com> Message-ID: You are right. Here the updated for Squeak -------------- next part -------------- A non-text attachment was scrubbed... Name: TonelWriter.3.cs Type: application/octet-stream Size: 136391 bytes Desc: not available URL: -------------- next part -------------- Test in Workspace with |f | f := FileStream newFileNamed: 'Object.st'. f nextPutAll: (TonelWriter sourceCodeOf: Object). f close > On 12 Oct 2020, at 16:19, Jakob Reschke wrote: > > Hi, > > Am I blind or does the export only contain the class definitions, but not > the methods? > > Could you commit the files without archiving them, please? Then one could > have a look at them on GitHub directly. > > Kind regards, > Jakob > > > > -- > Sent from: http://forum.world.st/Squeak-Dev-f45488.html > From Christoph.Thiede at student.hpi.uni-potsdam.de Mon Oct 12 23:13:20 2020 From: Christoph.Thiede at student.hpi.uni-potsdam.de (Thiede, Christoph) Date: Mon, 12 Oct 2020 23:13:20 +0000 Subject: [squeak-dev] assert:equals: in Object In-Reply-To: <1602530868859-0.post@n4.nabble.com> References: , <1602530868859-0.post@n4.nabble.com> Message-ID: <52c70316905846fb9ee68287a938c1c6@student.hpi.uni-potsdam.de> Hi all, hi Eliot, > > What do you mean by this? Such a TestCase receiver environment should definitively be not the default, this would be very confusing! > > Oh interesting! What kind of confusion do you foresee? I had just imagined that the only visible-ish change would be availability of TestCase instance-side methods on the "self" in the Workspace. SUnit is just one of so many domains. Someone else might want to evaluate things in the context of Transcript (self showln: 'foo') or any other console host (name := self input: 'Your name?'. self output: 'Hello ' , name) etc. pp.... @AssertResults via reflection: Highly interesting topic! I already had some thoughts about this last summer and I have an image containing some stubs for it. My basic idea was to pass only blocks to the #assert: method that can more easily be decompiled, reevaluated, and whatever you wish. One then could identify the receiver "X" of the last message from the assertion block "X y: Z" and transform this message send into "X assert: #y: with: {Z}", where #assert:with: would be implemented on Object and could dispatch the assertion selector to several extension methods. This would allow us, for example, to write self assert: [myList noneSatisfy: [:ea | ea hasPlung]] and TestCase >> #assert:, under the hood, would this transform into self assert: [myList assert: #noneSatisfy: with: [:ea | ea even]] and then, an extension method á la #assertNoneSatisfy: could be called from #assert:with: and instead of only signaling a generic AssertionFailure, we could see something like: "No object in myList should satisfy [:ea | ea even], but 4 (at index 2) does satisfy." As a plus, every package/framework developer could simply add support for customized AssertionFailures by overriding that #assert:with: and handling custom test selectors. If we wanted to go one step further, we could even try to detect nested calls, e.g.: self assert: [(myList anySatisfy: [:ea | ea hasPlung]]) and: [myList size even]] "myList should satisfy myList size even but did not" "myList should satisfy myList size even but size is 5" Ha, what a dream! And it shouldn't be terribly complicated, too ... For more inspiration, take a look at FluentAssertions for C#. :-) (If anyone asks: I never realized this projects because I did not know what to do if one of these parameters has side effects, e.g. when a block is called. Any ideas?) Best, Christoph ________________________________ Von: Squeak-dev im Auftrag von Jakob Reschke Gesendet: Montag, 12. Oktober 2020 21:27:48 An: squeak-dev at lists.squeakfoundation.org Betreff: Re: [squeak-dev] assert:equals: in Object Eliot Miranda-2 wrote > - appealing to the SUnit community to reverse the order of arguments to > assert:equals:, plus a rewrite rule that reversed the obvious cases where > the first argument is a literal constant. For what it is worth, Pharo has just swapped the parameters... which makes all "portable" test cases awkward. -- Sent from: http://forum.world.st/Squeak-Dev-f45488.html -------------- next part -------------- An HTML attachment was scrubbed... URL: From lewis at mail.msen.com Tue Oct 13 00:34:55 2020 From: lewis at mail.msen.com (David T. Lewis) Date: Mon, 12 Oct 2020 20:34:55 -0400 Subject: [squeak-dev] Bug in SqueakSource mailer service? In-Reply-To: References: <20201012213004.GA8520@shell.msen.com> Message-ID: <20201013003455.GA37618@shell.msen.com> Hi Christoph, On Mon, Oct 12, 2020 at 09:45:31PM +0000, Thiede, Christoph wrote: > Hi Dave, > > > a naive question: Why isn't SqueakSource running on an automatically > updated Trunk image, maybe only pulling updates that were approved by > a CI process? Wasn't it worth the effort? :-) > That is a good and fair question. I will try to answer it from the point of view of my historical role in adopting and maintaining the old squeaksource.com service, with CC to Chris who has been maintaining source.squeak.org, and who is more involved in championing a disciplined release process for our main source.squeak.org server. Answering from my own point of view in maintaining the ancient squeaksource.com service, my answer is no, it would not have been worth the effort to maintain a CI process. I know and understand the value of CI and have used it for VM development (earlier years, not now), and I use it today for non-Squeak work (outside the scope of this discussion). CI is hugely beneficial, and for many projects, I could not live without it. But is is also a lot of work. Like anything else, CI needs to be maintained. The squeaksource.com service is an interesting case. It is radically different from the typical Java-style deployment environment, because *eveything* lives in the Squeak image that provides the service. If something goes wrong, it will have gone wrong in the image, not in the many layers of services and infrastructure that support it. For that reason, I was able to keep it running for many years with very little effort. I made periodic updates and bug fixes, and I updated the underlying image a couple of times over the years, but overall I was able to keep it reasonaably healthy with a very modest amount of time and effort. Moving forward, it might make sense to put services like this onto a more CI basis, with more frequent updates and testing. But you (or others) should do this if and only if you are prepared to invest the time and effort to maintain the CI infrastructure on an ongoing basis. That can be a lot of work. Aside from that word of caution, I would also say that it would now possible and practical of maintain the (formerly ancient) squeaksource.com image with continuous integration and testing. Unlike the situation in earlier years, it is now running on a Squeak 5.3 image, so keeping it up to date with trunk is now a feasible thing. If someone wants to step forward and volunteer to set up and maintain the CI infrastructure, I will be happy to support the effort. But to be clear, I do not want to be the person doing that work, especially not on a long term basis. Dave From eliot.miranda at gmail.com Tue Oct 13 02:02:48 2020 From: eliot.miranda at gmail.com (Eliot Miranda) Date: Mon, 12 Oct 2020 19:02:48 -0700 Subject: [squeak-dev] assert:equals: in Object In-Reply-To: <1602530868859-0.post@n4.nabble.com> References: <1602530868859-0.post@n4.nabble.com> Message-ID: On Mon, Oct 12, 2020 at 12:27 PM Jakob Reschke wrote: > Eliot Miranda-2 wrote > > - appealing to the SUnit community to reverse the order of arguments to > > assert:equals:, plus a rewrite rule that reversed the obvious cases where > > the first argument is a literal constant. > > For what it is worth, Pharo has just swapped the parameters... which makes > all "portable" test cases awkward. > Then IMO we should follow suit. For once I agree with them ;-) > -- > Sent from: http://forum.world.st/Squeak-Dev-f45488.html > > -- _,,,^..^,,,_ best, Eliot -------------- next part -------------- An HTML attachment was scrubbed... URL: From lewis at mail.msen.com Tue Oct 13 03:28:17 2020 From: lewis at mail.msen.com (David T. Lewis) Date: Mon, 12 Oct 2020 23:28:17 -0400 Subject: [squeak-dev] Pool for sysconf constants? In-Reply-To: References: Message-ID: <20201013032817.GA78602@shell.msen.com> On Sun, Oct 11, 2020 at 11:15:09AM -0700, Eliot Miranda wrote: > Hi All, > > I want to implement a number of processors query on MacOS & other > unices to complement the info provided by GetSystemInfo on Windows. The > natural way to do this on unices is to use sysconf (3), and of course this > points to the issue for which FFI pools are needed, the constant names for > sysconf such as _SC_NPROCESSORS_ONLN are defined, but their values are > implementation dependent. > > But before I go amd implement an FFI pool for this I thought I'd ask > a) anyone already done this? Is it published anywhere? > b) how are we going to organize such pools so that people don't have to > reinvent the wheel? > c) should there be a pool to cover sysconf or to cover unistd.h? (the > point here is that while the pool might start off small, it could grow and > grow and maybe unistd.h is too much surface to cover) > > thoughts, suggestions? Hi Eliot, At first glance, it looks to me like the hard part of the problem is to know what sysconf names are available to be queried on any given platform at runtime. If you know that, or if you are only interested in a limited number of well-known parameters (which seems likely), then it might be simplest to just implement the sysconf(3) call either as an FFI call or a call through the OSProcess plugin. But I suspect that I am not answering the right question here. If I am off base, can you give an example of some of the parameters that you would want to be able to query? Thanks, Dave From commits at source.squeak.org Tue Oct 13 05:01:09 2020 From: commits at source.squeak.org (commits at source.squeak.org) Date: Tue, 13 Oct 2020 05:01:09 0000 Subject: [squeak-dev] The Trunk: Kernel-eem.1351.mcz Message-ID: Eliot Miranda uploaded a new version of Kernel to project The Trunk: http://source.squeak.org/trunk/Kernel-eem.1351.mcz ==================== Summary ==================== Name: Kernel-eem.1351 Author: eem Time: 12 October 2020, 10:01:07.200133 pm UUID: 16ddb529-e8ff-4c75-87cc-9b05ea9a23f2 Ancestors: Kernel-mt.1350 Rename EventSensorConstants WindowEventStinks to WindowEventScreenChange. (Why is EventSensorConstants still in Kernel?). =============== Diff against Kernel-mt.1350 =============== Item was changed: SharedPool subclass: #EventSensorConstants instanceVariableNames: '' + classVariableNames: 'BlueButtonBit CommandKeyBit CtrlKeyBit EventKeyChar EventKeyDown EventKeyUp EventTouchCancelled EventTouchDown EventTouchMoved EventTouchStationary EventTouchUp EventTypeComplex EventTypeDragDropFiles EventTypeKeyboard EventTypeMenu EventTypeMouse EventTypeMouseWheel EventTypeNone EventTypeWindow OptionKeyBit RedButtonBit ShiftKeyBit TouchPhaseBegan TouchPhaseCancelled TouchPhaseEnded TouchPhaseMoved TouchPhaseStationary WindowEventActivated WindowEventClose WindowEventIconise WindowEventMetricChange WindowEventPaint WindowEventScreenChange YellowButtonBit' - classVariableNames: 'BlueButtonBit CommandKeyBit CtrlKeyBit EventKeyChar EventKeyDown EventKeyUp EventTouchCancelled EventTouchDown EventTouchMoved EventTouchStationary EventTouchUp EventTypeComplex EventTypeDragDropFiles EventTypeKeyboard EventTypeMenu EventTypeMouse EventTypeMouseWheel EventTypeNone EventTypeWindow OptionKeyBit RedButtonBit ShiftKeyBit TouchPhaseBegan TouchPhaseCancelled TouchPhaseEnded TouchPhaseMoved TouchPhaseStationary WindowEventActivated WindowEventClose WindowEventIconise WindowEventMetricChange WindowEventPaint WindowEventStinks YellowButtonBit' poolDictionaries: '' category: 'Kernel-Processes'! Item was changed: ----- Method: EventSensorConstants class>>initialize (in category 'pool initialization') ----- initialize "EventSensorConstants initialize" RedButtonBit := 4. BlueButtonBit := 2. YellowButtonBit := 1. ShiftKeyBit := 1. CtrlKeyBit := 2. OptionKeyBit := 4. CommandKeyBit := 8. "Types of events" EventTypeNone := 0. EventTypeMouse := 1. EventTypeKeyboard := 2. EventTypeDragDropFiles := 3. EventTypeMenu := 4. EventTypeWindow := 5. EventTypeComplex := 6. EventTypeMouseWheel := 7. "Press codes for keyboard events" EventKeyChar := 0. EventKeyDown := 1. EventKeyUp := 2. "Host window events" WindowEventMetricChange := 1. WindowEventClose := 2. WindowEventIconise := 3. WindowEventActivated := 4. WindowEventPaint := 5. + WindowEventScreenChange := 6. - WindowEventStinks := 6. "types for touch events" EventTouchDown := 1. EventTouchUp := 2. EventTouchMoved := 3. EventTouchStationary := 4. EventTouchCancelled := 5. "iOS touch phase constants" TouchPhaseBegan := 0. TouchPhaseMoved := 1. TouchPhaseStationary := 2. TouchPhaseEnded := 3. TouchPhaseCancelled := 4. ! From Das.Linux at gmx.de Tue Oct 13 08:04:23 2020 From: Das.Linux at gmx.de (Tobias Pape) Date: Tue, 13 Oct 2020 10:04:23 +0200 Subject: [squeak-dev] The Inbox: WebClient-Core-ct.126.mcz In-Reply-To: <11383fd575bc4eaeb8d2dec513a190bc@student.hpi.uni-potsdam.de> References: <2532b37139184eb6b0ecf3f288081b61@student.hpi.uni-potsdam.de> <0B67EEA2-2AC1-4156-A8D8-56C192B48EF6@gmx.de> <80f7baf3a0eb4d3685d8aea6f12aef5c@student.hpi.uni-potsdam.de> <11383fd575bc4eaeb8d2dec513a190bc@student.hpi.uni-potsdam.de> Message-ID: Hi > On 12.10.2020, at 23:42, Thiede, Christoph wrote: > > Hi Tobias, > > okay, I see this authorization pattern now, so you mentioned two ways to work around the current limitations: > First, by GETting https://api.github.com/authorizations before, or second, by passing the Authorization header manually. > Is this correct? Yes. However, the second one is the one GitHub "recommends" > > However, both of these approaches lack of the RESTful-typical simplicity of "making a single HTTP request without dealing with complex call protocols or low-level connectivity code". To give an illustration of my use case, please see this PR on Metacello: https://github.com/Metacello/metacello/pull/534 > IMHO it would be a shame if you could not access a popular REST API like api.github.com in Squeak using a single message send to the WebClient/WebSocket class. There is no such thing as simplicity when a REST-Based resource-provider supports both authenticated and unauthenticated access. If you cannot know beforehand, no single-request stuff is gonna help. No dice. > > > > Why not? > > > > It leaks credentials unnecessarily. > > Ah, good point! But this pattern (EAFP for web connections) is not really state of the art, is it? As mentioned, curl, for example, sends the authentication data in the very first request, which is a tool I would tend to *call* state of the art. No thats wrong. Curl will only send auth data if you provide it. Doing "curl -u user:pw" is the same as using WebClient httpGet:do: and adding the Authorization header manually The sequence is split manually: ``` $ curl https://api.github.com/repos/krono/debug/zipball/master { "message": "Not Found", "documentation_url": "https://docs.github.com/rest/reference/repos#download-a-repository-archive" } # Well, I'm left to guess. Maybe exists, maybe not. $ curl -u krono https://api.github.com/repos/krono/debug/zipball/master ``` (In this case, I can't even show what's going on as I use 2FA, which makes single-request REST to _never_ work on private repos.) The point is, you instruct Curl to _provide credentials unconditionally_. The "heavy lifting" of finding out when to do that is not done by curl but by users of curl. Look: ``` $ curl http://www.hpi.uni-potsdam.de/hirschfeld/squeaksource/xpaware/ $ # Well, no response? $ curl -v http://www.hpi.uni-potsdam.de/hirschfeld/squeaksource/xpaware/ * Trying 2001:638:807:204::8d59:e178... * TCP_NODELAY set * Connected to www.hpi.uni-potsdam.de (2001:638:807:204::8d59:e178) port 80 (#0) > GET /hirschfeld/squeaksource/xpaware/ HTTP/1.1 > Host: www.hpi.uni-potsdam.de > User-Agent: curl/7.54.0 > Accept: */* > < HTTP/1.1 401 < Date: Tue, 13 Oct 2020 07:43:04 GMT < Server: nginx/1.14.2 < Content-Length: 0 < WWW-Authenticate: Basic realm="SwaSource - XP aware" < * Connection #0 to host www.hpi.uni-potsdam.de left intact ``` Thats the 401 we're looking for. We have found that the resource needs authentication. Sidenote: Curl can do the roundtrip (man curl, search anyauth): ``` $ curl -u topa --anyauth -v http://www.hpi.uni-potsdam.de/hirschfeld/squeaksource/xpaware/ Enter host password for user 'topa': * Trying 2001:638:807:204::8d59:e178... * TCP_NODELAY set * Connected to www.hpi.uni-potsdam.de (2001:638:807:204::8d59:e178) port 80 (#0) > GET /hirschfeld/squeaksource/xpaware/ HTTP/1.1 > Host: www.hpi.uni-potsdam.de > User-Agent: curl/7.54.0 > Accept: */* > < HTTP/1.1 401 < Date: Tue, 13 Oct 2020 07:46:05 GMT < Server: nginx/1.14.2 < Content-Length: 0 < WWW-Authenticate: Basic realm="SwaSource - XP aware" < * Connection #0 to host www.hpi.uni-potsdam.de left intact * Issue another request to this URL: 'http://www.hpi.uni-potsdam.de/hirschfeld/squeaksource/xpaware/' * Found bundle for host www.hpi.uni-potsdam.de: 0x7fb8c8c0b1b0 [can pipeline] * Re-using existing connection! (#0) with host www.hpi.uni-potsdam.de * Connected to www.hpi.uni-potsdam.de (2001:638:807:204::8d59:e178) port 80 (#0) * Server auth using Basic with user 'topa' > GET /hirschfeld/squeaksource/xpaware/ HTTP/1.1 > Host: www.hpi.uni-potsdam.de > Authorization: Basic ******************* > User-Agent: curl/7.54.0 > Accept: */* > < HTTP/1.1 200 < Date: Tue, 13 Oct 2020 07:46:05 GMT < Server: nginx/1.14.2 < Content-Type: text/html < Content-Length: 15131 < Vary: Accept-Encoding ``` And in this case it does _not_ send auth in the first request but only in the second. Sidenote2: If the first request comes back 200, no second one is issued, no credentials leak: ``` $ curl -u topa --anyauth -v http://www.hpi.uni-potsdam.de/hirschfeld/squeaksource/xpforums/ Enter host password for user 'topa': * Trying 2001:638:807:204::8d59:e178... * TCP_NODELAY set * Connected to www.hpi.uni-potsdam.de (2001:638:807:204::8d59:e178) port 80 (#0) > GET /hirschfeld/squeaksource/xpforums/ HTTP/1.1 > Host: www.hpi.uni-potsdam.de > User-Agent: curl/7.54.0 > Accept: */* > < HTTP/1.1 200 < Date: Tue, 13 Oct 2020 07:46:56 GMT < Server: nginx/1.14.2 < Content-Type: text/html < Content-Length: 75860 < Vary: Accept-Encoding ``` > And speed is another point, given the fact that internet connections in Squeak are really slow ... > Why do you call this behavior a leak? The application developer will not pass authentication data to the web client unless they expect the server to consume these data anyway. So you always know beforehand which resources need authentication? Neat, I dont :D > If you deem it necessary, we could turn off the pre-authentication as soon as the client was redirected to another server ... What happens here is that we're bending over backwards because github decided to be a bad player. I mean, on most sited you visit in browsers, no auth data is sent _unless_ you are asked to (redirect to a login) or you _explicitely_ click on a login link. If you want preemtive auth, do it with WebClient httpGet:do:. > > > I understand that the method is maybe not the most common style, but I think that functional changes should in such cases not be mixed with style changes. > > Alright, please see WebClient-Core-ct.128. But maybe we should consider to use prettyDiff for the mailing list notifications as a default? Just an idea. I personally find prettydiffs useless, but that's just me. Best regards -Tobias From trygver at ifi.uio.no Tue Oct 13 08:37:38 2020 From: trygver at ifi.uio.no (Trygve Reenskaug) Date: Tue, 13 Oct 2020 10:37:38 +0200 Subject: [squeak-dev] (Somewhat off-topic) Xerox Interlisp-D Medley open sourced In-Reply-To: <715b37a6-8476-4629-8e02-23dde385635f@gmail.com> References: <715b37a6-8476-4629-8e02-23dde385635f@gmail.com> Message-ID: On 2020-10-13 00:21, Douglas Brebner wrote: > > On 12/10/2020 18:12, Phil B wrote: >> Douglas, >> >> It's always good to see historically significant software preserved >> rather than bit rotting in darkness.  It's probably not going to have >> nearly the impact Squeak did in the open source world *since the Lisp >> world already has an embarrassment of good implementations (distinct >> implementations rather than dialects.  See CCL, which is a direct >> descendant of MCL, for example)* where Squeak basically had to >> introduce/resurrect Smalltalk in the open source world.  With SLIME >> they've already kinda, sorta stolen some of the key concepts of the >> Lisp workstation UIs.  Though this source drop may inspire some >> deeper copying on the UI front... we'll see. (My emphasis added) How I wish that the Smalltalk world had at least one good implementation (distinct implementation rather than dialect.) of ST80. Squeak is, of course, a moving target that leaves a trail of bit rotting software in darkness behind it. (sigh) Trygve -- /The essence of object orientation is that objects collaborateto achieve a goal. / Trygve Reenskaug mailto: trygver at ifi.uio.no Morgedalsvn. 5A http://folk.uio.no/trygver/ N-0378 Oslo http://fullOO.info Norway                     Tel: (+47) 468 58 625 -------------- next part -------------- An HTML attachment was scrubbed... URL: From edgardec2005 at gmail.com Tue Oct 13 10:02:22 2020 From: edgardec2005 at gmail.com (Edgar J. De Cleene) Date: Tue, 13 Oct 2020 07:02:22 -0300 Subject: [squeak-dev] [ANN] Squeak converted to Tonel fomat In-Reply-To: <1602530360272-0.post@n4.nabble.com> Message-ID: I updated https://github.com/edgardec/SqueakTonel Seems right now. Remove the .tar for no bombs But in ancient times Dan have some class of compressed sources .... Next step is figure how to use WebClient for retrieving and https://github.com/ErikOnBike/CP-Bootstrap for see if I could create a SqueakKernel Edgar @morplenauta On 10/12/20, 4:19 PM, "Jakob Reschke" wrote: > Hi, Am I blind or does the export only contain the class definitions, but > not the methods? Could you commit the files without archiving them, please? > Then one could have a look at them on GitHub directly. Kind regards, Jakob From Christoph.Thiede at student.hpi.uni-potsdam.de Tue Oct 13 13:02:35 2020 From: Christoph.Thiede at student.hpi.uni-potsdam.de (Thiede, Christoph) Date: Tue, 13 Oct 2020 13:02:35 +0000 Subject: [squeak-dev] assert:equals: in Object In-Reply-To: References: <1602530868859-0.post@n4.nabble.com>, Message-ID: <5687a836624d4cd582b6a2db30e18e12@student.hpi.uni-potsdam.de> > Then IMO we should follow suit. For once I agree with them ;-) Nooo ... :( I don't know their reasons, but inverting a long-existing convention from one day to another seems like a true nightmare to me. This would invalidate the semantics of every existing test case that was ever written for Squeak/Smalltalk. Plus, IMHO it is often useful to order parameters by their complexity ascending (e.g., put blocks last) to provide a good writeability/readability of a message's senders. While the expected argument often is a constant, the actual argument mainly is the result of a possibly complex operation, e.g.: self assert: 42 equals: (myComputer doComplexComputationWith: 6 and: 7 mode: #multiplyInt). How would the opposite read like? self assert: (myComputer doComplexComputationWith: 6 and: 7 mode: #multiplyInt) equals: 42. IMO, much less comprehensible. Best, Christoph ________________________________ Von: Squeak-dev im Auftrag von Eliot Miranda Gesendet: Dienstag, 13. Oktober 2020 04:02:48 An: The general-purpose Squeak developers list Betreff: Re: [squeak-dev] assert:equals: in Object On Mon, Oct 12, 2020 at 12:27 PM Jakob Reschke > wrote: Eliot Miranda-2 wrote > - appealing to the SUnit community to reverse the order of arguments to > assert:equals:, plus a rewrite rule that reversed the obvious cases where > the first argument is a literal constant. For what it is worth, Pharo has just swapped the parameters... which makes all "portable" test cases awkward. Then IMO we should follow suit. For once I agree with them ;-) -- Sent from: http://forum.world.st/Squeak-Dev-f45488.html -- _,,,^..^,,,_ best, Eliot -------------- next part -------------- An HTML attachment was scrubbed... URL: From marcel.taeumel at hpi.de Tue Oct 13 13:22:48 2020 From: marcel.taeumel at hpi.de (Marcel Taeumel) Date: Tue, 13 Oct 2020 15:22:48 +0200 Subject: [squeak-dev] The Trunk: Tools-eem.999.mcz In-Reply-To: References: Message-ID: Huh? Why should anybody want to turn this off? It should always be possible to evaluate "x := 5" and then use "x" in a Workspace. It would be really cumbersome if one always had to evaluate the entire workspace and also write those || declarations on the top. Please ... :-( Please elaborate. Why does this feature hinders your working habits? You can always evaluate the entire workspace. This just seems like a preference that would annoy people if not set correctly. Why do you want to prevent "x := 5" evaluation. I don't understand. Why can that be dangerous? -1 for such a preference. But I could live with it. ;-) Best, Marcel Am 12.10.2020 20:00:28 schrieb commits at source.squeak.org : Eliot Miranda uploaded a new version of Tools to project The Trunk: http://source.squeak.org/trunk/Tools-eem.999.mcz ==================== Summary ==================== Name: Tools-eem.999 Author: eem Time: 12 October 2020, 11:00:17.202907 am UUID: 53fd9116-3cf5-43db-ad0d-150e7f41efd3 Ancestors: Tools-mt.998 Add a preference for automatic variable declaration in a Workspace (true by default). Many people love this feature; I hate it :-) =============== Diff against Tools-mt.998 =============== Item was changed: StringHolder subclass: #Workspace instanceVariableNames: 'bindings acceptDroppedMorphs acceptAction mustDeclareVariables shouldStyle environment' + classVariableNames: 'DeclareVariablesAutomatically LookupPools ShouldStyle' - classVariableNames: 'LookupPools ShouldStyle' poolDictionaries: '' category: 'Tools-Base'! !Workspace commentStamp: 'fbs 6/2/2012 20:46' prior: 0! A Workspace is a text area plus a lot of support for executable code. It is a great place to execute top-level commands to compute something useful, and it is a great place to develop bits of a program before those bits get put into class methods. To open a new workspace, execute: Workspace open A workspace can have its own variables, called "workspace variables", to hold intermediate results. For example, if you type into a workspace "x := 5" and do-it, then later you could type in "y := x * 2" and y would become 10. Additionally, in Morphic, a workspace can gain access to morphs that are on the screen. If acceptDroppedMorphs is turned on, then whenever a morph is dropped on the workspace, a variable will be created which references that morph. This functionality is toggled with the window-wide menu of a workspace. The instance variables of this class are: bindings - holds the workspace variables for this workspace acceptDroppedMorphs - whether dropped morphs should create new variables! Item was added: + ----- Method: Workspace class>>declareVariablesAutomatically (in category 'preferences') ----- + declareVariablesAutomatically + + category: 'browsing' + description: 'If true, workspaces automatically create variables.' + type: #Boolean> + ^DeclareVariablesAutomatically ifNil: [true]! Item was added: + ----- Method: Workspace class>>declareVariablesAutomatically: (in category 'preferences') ----- + declareVariablesAutomatically: aBoolean + DeclareVariablesAutomatically := aBoolean! Item was changed: ----- Method: Workspace>>initialize (in category 'initialize-release') ----- initialize super initialize. self initializeBindings. acceptDroppedMorphs := false. + mustDeclareVariables := self class declareVariablesAutomatically not. + environment := Environment current! - mustDeclareVariables := false. - environment := Environment current.! Item was changed: ----- Method: Workspace>>mustDeclareVariableWording (in category 'variable declarations') ----- mustDeclareVariableWording + ^(mustDeclareVariables + ifFalse: [' automatically create variable declaration'] + ifTrue: [' automatically create variable declaration']) translated! - ^ mustDeclareVariables not - ifTrue: [' automatically create variable declaration' translated] - ifFalse: [' automatically create variable declaration' translated]! -------------- next part -------------- An HTML attachment was scrubbed... URL: From gettimothy at zoho.com Tue Oct 13 13:34:24 2020 From: gettimothy at zoho.com (gettimothy) Date: Tue, 13 Oct 2020 09:34:24 -0400 Subject: [squeak-dev] [ANN] Squeak converted to Tonel fomat In-Reply-To: References: Message-ID: <175222b4ed2.f2eb027d255810.4451249563664561187@zoho.com> Hi Edgar First, thanks for this work; my comments on the bomb are a trifle. Your .tar is not the issue. Please do not waste time on what follows if you would rather focus on other things. That said, here goes... When we save a Workspace' conten to a file via the menu option/command, the file ends up in the 'root' directory of our image. Similarly, when we run your Tonel message from a workspace, the output goes ther too. Compare with Monticello, which puts its 'bombs' in pacjage-cache. Again, do not waste time on this trifle, it is just a friendly FYI. cordially ---- On Tue, 13 Oct 2020 06:02:22 -0400 edgardec2005 at gmail.com wrote ---- I updated https://github.com/edgardec/SqueakTonel Seems right now. Remove the .tar for no bombs But in ancient times Dan have some class of compressed sources .... Next step is figure how to use WebClient for retrieving and https://github.com/ErikOnBike/CP-Bootstrap for see if I could create a SqueakKernel Edgar @morplenauta On 10/12/20, 4:19 PM, "Jakob Reschke" wrote: > Hi, Am I blind or does the export only contain the class definitions, but > not the methods? Could you commit the files without archiving them, please? > Then one could have a look at them on GitHub directly. Kind regards, Jakob -------------- next part -------------- An HTML attachment was scrubbed... URL: From Christoph.Thiede at student.hpi.uni-potsdam.de Tue Oct 13 14:30:10 2020 From: Christoph.Thiede at student.hpi.uni-potsdam.de (Thiede, Christoph) Date: Tue, 13 Oct 2020 14:30:10 +0000 Subject: [squeak-dev] The Trunk: Tools-eem.999.mcz In-Reply-To: References: , Message-ID: <7d0cf2956e4b4917a28aeb03fb1ce6d9@student.hpi.uni-potsdam.de> Personally, I neither need nor dislike such a preference, but actually, I turned mustDeclareVariables off a small number of times for a single workspace in past. The reason was that if you use a workspace to prepare some "production" code, it beguiles you into missing some variable declarations, in particular inside of blocks, making you overlooking any unintended closure/process interconnections that do not work in actual production. I often fill a workspace with several snippets that I plan to compile into different methods. The workspace bindings add a global namespace between these snippets that does not always exist when compiling the methods at different places. Also, one might consider it as inconvenient that every mistyped doit creates a new binding but you cannot remove this binding again without opening the window menu which interrupts the usual scripting workflow ... However, I don't see the harm of such a preference, and I welcome adding a reasonable number of preferences whenever this can help anyone of the community to make Squeak even more convenient for yourself. We don't need to integrate every preference into the wizard, though :-) Best, Christoph ________________________________ Von: Squeak-dev im Auftrag von Taeumel, Marcel Gesendet: Dienstag, 13. Oktober 2020 15:22:48 An: squeak-dev Betreff: Re: [squeak-dev] The Trunk: Tools-eem.999.mcz Huh? Why should anybody want to turn this off? It should always be possible to evaluate "x := 5" and then use "x" in a Workspace. It would be really cumbersome if one always had to evaluate the entire workspace and also write those || declarations on the top. Please ... :-( Please elaborate. Why does this feature hinders your working habits? You can always evaluate the entire workspace. This just seems like a preference that would annoy people if not set correctly. Why do you want to prevent "x := 5" evaluation. I don't understand. Why can that be dangerous? -1 for such a preference. But I could live with it. ;-) Best, Marcel Am 12.10.2020 20:00:28 schrieb commits at source.squeak.org : Eliot Miranda uploaded a new version of Tools to project The Trunk: http://source.squeak.org/trunk/Tools-eem.999.mcz ==================== Summary ==================== Name: Tools-eem.999 Author: eem Time: 12 October 2020, 11:00:17.202907 am UUID: 53fd9116-3cf5-43db-ad0d-150e7f41efd3 Ancestors: Tools-mt.998 Add a preference for automatic variable declaration in a Workspace (true by default). Many people love this feature; I hate it :-) =============== Diff against Tools-mt.998 =============== Item was changed: StringHolder subclass: #Workspace instanceVariableNames: 'bindings acceptDroppedMorphs acceptAction mustDeclareVariables shouldStyle environment' + classVariableNames: 'DeclareVariablesAutomatically LookupPools ShouldStyle' - classVariableNames: 'LookupPools ShouldStyle' poolDictionaries: '' category: 'Tools-Base'! !Workspace commentStamp: 'fbs 6/2/2012 20:46' prior: 0! A Workspace is a text area plus a lot of support for executable code. It is a great place to execute top-level commands to compute something useful, and it is a great place to develop bits of a program before those bits get put into class methods. To open a new workspace, execute: Workspace open A workspace can have its own variables, called "workspace variables", to hold intermediate results. For example, if you type into a workspace "x := 5" and do-it, then later you could type in "y := x * 2" and y would become 10. Additionally, in Morphic, a workspace can gain access to morphs that are on the screen. If acceptDroppedMorphs is turned on, then whenever a morph is dropped on the workspace, a variable will be created which references that morph. This functionality is toggled with the window-wide menu of a workspace. The instance variables of this class are: bindings - holds the workspace variables for this workspace acceptDroppedMorphs - whether dropped morphs should create new variables! Item was added: + ----- Method: Workspace class>>declareVariablesAutomatically (in category 'preferences') ----- + declareVariablesAutomatically + + category: 'browsing' + description: 'If true, workspaces automatically create variables.' + type: #Boolean> + ^DeclareVariablesAutomatically ifNil: [true]! Item was added: + ----- Method: Workspace class>>declareVariablesAutomatically: (in category 'preferences') ----- + declareVariablesAutomatically: aBoolean + DeclareVariablesAutomatically := aBoolean! Item was changed: ----- Method: Workspace>>initialize (in category 'initialize-release') ----- initialize super initialize. self initializeBindings. acceptDroppedMorphs := false. + mustDeclareVariables := self class declareVariablesAutomatically not. + environment := Environment current! - mustDeclareVariables := false. - environment := Environment current.! Item was changed: ----- Method: Workspace>>mustDeclareVariableWording (in category 'variable declarations') ----- mustDeclareVariableWording + ^(mustDeclareVariables + ifFalse: [' automatically create variable declaration'] + ifTrue: [' automatically create variable declaration']) translated! - ^ mustDeclareVariables not - ifTrue: [' automatically create variable declaration' translated] - ifFalse: [' automatically create variable declaration' translated]! -------------- next part -------------- An HTML attachment was scrubbed... URL: From eliot.miranda at gmail.com Tue Oct 13 14:58:33 2020 From: eliot.miranda at gmail.com (Eliot Miranda) Date: Tue, 13 Oct 2020 07:58:33 -0700 Subject: [squeak-dev] The Trunk: Tools-eem.999.mcz In-Reply-To: <7d0cf2956e4b4917a28aeb03fb1ce6d9@student.hpi.uni-potsdam.de> References: <7d0cf2956e4b4917a28aeb03fb1ce6d9@student.hpi.uni-potsdam.de> Message-ID: > On Oct 13, 2020, at 7:30 AM, Thiede, Christoph wrote: > >  > Personally, I neither need nor dislike such a preference, but actually, I turned mustDeclareVariables off a small number of times for a single workspace in past. The reason was that if you use a workspace to prepare some "production" code, it beguiles you into missing some variable declarations, in particular inside of blocks, making you overlooking any unintended closure/process interconnections that do not work in actual production. I often fill a workspace with several snippets that I plan to compile into different methods. The workspace bindings add a global namespace between these snippets that does not always exist when compiling the methods at different places. > > > > Also, one might consider it as inconvenient that every mistyped doit creates a new binding but you cannot remove this binding again without opening the window menu which interrupts the usual scripting workflow ... > > > > However, I don't see the harm of such a preference, and I welcome adding a reasonable number of preferences whenever this can help anyone of the community to make Squeak even more convenient for yourself. We don't need to integrate every preference into the wizard, though :-) > +3 :-). > Best, > > Christoph > > Von: Squeak-dev im Auftrag von Taeumel, Marcel > Gesendet: Dienstag, 13. Oktober 2020 15:22:48 > An: squeak-dev > Betreff: Re: [squeak-dev] The Trunk: Tools-eem.999.mcz > > Huh? Why should anybody want to turn this off? It should always be possible to evaluate "x := 5" and then use "x" in a Workspace. It would be really cumbersome if one always had to evaluate the entire workspace and also write those || declarations on the top. Please ... :-( > > Please elaborate. Why does this feature hinders your working habits? You can always evaluate the entire workspace. This just seems like a preference that would annoy people if not set correctly. Why do you want to prevent "x := 5" evaluation. I don't understand. Why can that be dangerous? > > -1 for such a preference. But I could live with it. ;-) > > Best, > Marcel >> Am 12.10.2020 20:00:28 schrieb commits at source.squeak.org : >> >> Eliot Miranda uploaded a new version of Tools to project The Trunk: >> http://source.squeak.org/trunk/Tools-eem.999.mcz >> >> ==================== Summary ==================== >> >> Name: Tools-eem.999 >> Author: eem >> Time: 12 October 2020, 11:00:17.202907 am >> UUID: 53fd9116-3cf5-43db-ad0d-150e7f41efd3 >> Ancestors: Tools-mt.998 >> >> Add a preference for automatic variable declaration in a Workspace (true by default). Many people love this feature; I hate it :-) >> >> =============== Diff against Tools-mt.998 =============== >> >> Item was changed: >> StringHolder subclass: #Workspace >> instanceVariableNames: 'bindings acceptDroppedMorphs acceptAction mustDeclareVariables shouldStyle environment' >> + classVariableNames: 'DeclareVariablesAutomatically LookupPools ShouldStyle' >> - classVariableNames: 'LookupPools ShouldStyle' >> poolDictionaries: '' >> category: 'Tools-Base'! >> >> !Workspace commentStamp: 'fbs 6/2/2012 20:46' prior: 0! >> A Workspace is a text area plus a lot of support for executable code. It is a great place to execute top-level commands to compute something useful, and it is a great place to develop bits of a program before those bits get put into class methods. >> >> To open a new workspace, execute: >> >> Workspace open >> >> >> A workspace can have its own variables, called "workspace variables", to hold intermediate results. For example, if you type into a workspace "x := 5" and do-it, then later you could type in "y := x * 2" and y would become 10. >> >> Additionally, in Morphic, a workspace can gain access to morphs that are on the screen. If acceptDroppedMorphs is turned on, then whenever a morph is dropped on the workspace, a variable will be created which references that morph. This functionality is toggled with the window-wide menu of a workspace. >> >> >> The instance variables of this class are: >> >> bindings - holds the workspace variables for this workspace >> >> acceptDroppedMorphs - whether dropped morphs should create new variables! >> >> Item was added: >> + ----- Method: Workspace class>>declareVariablesAutomatically (in category 'preferences') ----- >> + declareVariablesAutomatically >> + >> + category: 'browsing' >> + description: 'If true, workspaces automatically create variables.' >> + type: #Boolean> >> + ^DeclareVariablesAutomatically ifNil: [true]! >> >> Item was added: >> + ----- Method: Workspace class>>declareVariablesAutomatically: (in category 'preferences') ----- >> + declareVariablesAutomatically: aBoolean >> + DeclareVariablesAutomatically := aBoolean! >> >> Item was changed: >> ----- Method: Workspace>>initialize (in category 'initialize-release') ----- >> initialize >> >> super initialize. >> self initializeBindings. >> acceptDroppedMorphs := false. >> + mustDeclareVariables := self class declareVariablesAutomatically not. >> + environment := Environment current! >> - mustDeclareVariables := false. >> - environment := Environment current.! >> >> Item was changed: >> ----- Method: Workspace>>mustDeclareVariableWording (in category 'variable declarations') ----- >> mustDeclareVariableWording >> >> + ^(mustDeclareVariables >> + ifFalse: [' automatically create variable declaration'] >> + ifTrue: [' automatically create variable declaration']) translated! >> - ^ mustDeclareVariables not >> - ifTrue: [' automatically create variable declaration' translated] >> - ifFalse: [' automatically create variable declaration' translated]! >> >> > -------------- next part -------------- An HTML attachment was scrubbed... URL: From marcel.taeumel at hpi.de Tue Oct 13 15:00:37 2020 From: marcel.taeumel at hpi.de (Marcel Taeumel) Date: Tue, 13 Oct 2020 17:00:37 +0200 Subject: [squeak-dev] The Trunk: Tools-eem.999.mcz In-Reply-To: References: <7d0cf2956e4b4917a28aeb03fb1ce6d9@student.hpi.uni-potsdam.de> Message-ID: Don't forget to set the default value in ReleaseBuilder class >> #setPreferences. Best, Marcel Am 13.10.2020 16:58:48 schrieb Eliot Miranda : On Oct 13, 2020, at 7:30 AM, Thiede, Christoph wrote:  Personally, I neither need nor dislike such a preference, but actually, I turned mustDeclareVariables off a small number of times for a single workspace in past. The reason was that if you use a workspace to prepare some "production" code, it beguiles you into missing some variable declarations, in particular inside of blocks, making you overlooking any unintended closure/process interconnections that do not work in actual production. I often fill a workspace with several snippets that I plan to compile into different methods. The workspace bindings add a global namespace between these snippets that does not always exist when compiling the methods at different places. Also, one might consider it as inconvenient that every mistyped doit creates a new binding but you cannot remove this binding again without opening the window menu which interrupts the usual scripting workflow ... However, I don't see the harm of such a preference, and I welcome adding a reasonable number of preferences whenever this can help anyone of the community to make Squeak even more convenient for yourself. We don't need to integrate every preference into the wizard, though :-) +3 :-). Best, Christoph Von: Squeak-dev im Auftrag von Taeumel, Marcel Gesendet: Dienstag, 13. Oktober 2020 15:22:48 An: squeak-dev Betreff: Re: [squeak-dev] The Trunk: Tools-eem.999.mcz   Huh? Why should anybody want to turn this off? It should always be possible to evaluate "x := 5" and then use "x" in a Workspace. It would be really cumbersome if one always had to evaluate the entire workspace and also write those || declarations on the top. Please ... :-( Please elaborate. Why does this feature hinders your working habits? You can always evaluate the entire workspace. This just seems like a preference that would annoy people if not set correctly. Why do you want to prevent "x := 5" evaluation. I don't understand. Why can that be dangerous? -1 for such a preference. But I could live with it. ;-) Best, Marcel Am 12.10.2020 20:00:28 schrieb commits at source.squeak.org : Eliot Miranda uploaded a new version of Tools to project The Trunk: http://source.squeak.org/trunk/Tools-eem.999.mcz ==================== Summary ==================== Name: Tools-eem.999 Author: eem Time: 12 October 2020, 11:00:17.202907 am UUID: 53fd9116-3cf5-43db-ad0d-150e7f41efd3 Ancestors: Tools-mt.998 Add a preference for automatic variable declaration in a Workspace (true by default). Many people love this feature; I hate it :-) =============== Diff against Tools-mt.998 =============== Item was changed: StringHolder subclass: #Workspace instanceVariableNames: 'bindings acceptDroppedMorphs acceptAction mustDeclareVariables shouldStyle environment' + classVariableNames: 'DeclareVariablesAutomatically LookupPools ShouldStyle' - classVariableNames: 'LookupPools ShouldStyle' poolDictionaries: '' category: 'Tools-Base'! !Workspace commentStamp: 'fbs 6/2/2012 20:46' prior: 0! A Workspace is a text area plus a lot of support for executable code. It is a great place to execute top-level commands to compute something useful, and it is a great place to develop bits of a program before those bits get put into class methods. To open a new workspace, execute: Workspace open A workspace can have its own variables, called "workspace variables", to hold intermediate results. For example, if you type into a workspace "x := 5" and do-it, then later you could type in "y := x * 2" and y would become 10. Additionally, in Morphic, a workspace can gain access to morphs that are on the screen. If acceptDroppedMorphs is turned on, then whenever a morph is dropped on the workspace, a variable will be created which references that morph. This functionality is toggled with the window-wide menu of a workspace. The instance variables of this class are: bindings - holds the workspace variables for this workspace acceptDroppedMorphs - whether dropped morphs should create new variables! Item was added: + ----- Method: Workspace class>>declareVariablesAutomatically (in category 'preferences') ----- + declareVariablesAutomatically + + category: 'browsing' + description: 'If true, workspaces automatically create variables.' + type: #Boolean> + ^DeclareVariablesAutomatically ifNil: [true]! Item was added: + ----- Method: Workspace class>>declareVariablesAutomatically: (in category 'preferences') ----- + declareVariablesAutomatically: aBoolean + DeclareVariablesAutomatically := aBoolean! Item was changed: ----- Method: Workspace>>initialize (in category 'initialize-release') ----- initialize super initialize. self initializeBindings. acceptDroppedMorphs := false. + mustDeclareVariables := self class declareVariablesAutomatically not. + environment := Environment current! - mustDeclareVariables := false. - environment := Environment current.! Item was changed: ----- Method: Workspace>>mustDeclareVariableWording (in category 'variable declarations') ----- mustDeclareVariableWording + ^(mustDeclareVariables + ifFalse: [' automatically create variable declaration'] + ifTrue: [' automatically create variable declaration']) translated! - ^ mustDeclareVariables not - ifTrue: [' automatically create variable declaration' translated] - ifFalse: [' automatically create variable declaration' translated]! -------------- next part -------------- An HTML attachment was scrubbed... URL: From lecteur at zogotounga.net Tue Oct 13 15:23:51 2020 From: lecteur at zogotounga.net (=?UTF-8?Q?St=c3=a9phane_Rollandin?=) Date: Tue, 13 Oct 2020 17:23:51 +0200 Subject: [squeak-dev] The Trunk: Tools-eem.999.mcz In-Reply-To: References: <7d0cf2956e4b4917a28aeb03fb1ce6d9@student.hpi.uni-potsdam.de> Message-ID: <13a5467d-059b-2a9d-95b5-a81a78604c57@zogotounga.net> I guess each of us has his own way to use a workspace. After all, it is where one "works", and everybody works differently. So, that several (even many) preferences may be needed is not a problem here IMO. Stef From patrick.rein at hpi.uni-potsdam.de Tue Oct 13 15:18:33 2020 From: patrick.rein at hpi.uni-potsdam.de (patrick.rein at hpi.uni-potsdam.de) Date: Tue, 13 Oct 2020 17:18:33 +0200 Subject: [squeak-dev] Methods with hidden deprecation Message-ID: ll1ntvkpbaibqbq4bg6gppqt@hpi.de Hi everyone, recently I stumbled upon a method with a method comment stating that the method was actually deprecated, while the method was not marked as such in any way. Based on that I looked further into that and found a few other instances. Below is a list of the candidates for deprecation. My suggestion would be to mark them as deprecated and put them into the current deprecation package. As some of these have been around for quite a while without being denoted as deprecated, someone might rely on them heavily, so: Does anyone feel strongly about any of these in either way (reinstatiate, deprecate for sure)? (I have given the number of senders of the selector in the Trunk image in braces after the selector) Bests Patrick # Rather obvious candidates - Collection: - #copyLast: (1) - #copyWithoutFirst (9) - NewParagraph - #lineIndexForCharacter: (0) - Morph - #fullCopy (0) - PostscriptCanvas - #text:at:font:color:justified:parwidth: (0) - Object - #backwardCompatibilityOnly: (0) "welp :)" - Canvas - #imageWithOpaqueWhite:at: (0) - #image:at: (0) - #image:at:rule (0) - FancyMailComposition - #breakLinesInMessage (0) - Preferences class - #parameterAt:default: (0) - SMPackage - maintainer (0) - SocketStream - #receiveDataIfAvailable (0) - SugarLauncher - #welcomeProjectName (0) - TransformMorph - #localVisibleSubmorphBounds # Somewhat disputable candidates - MIMEDocument - #type (?) - UIManager - #openPluggableFileList:label:in: (1 deprecated) - MVUIManager - #openPluggableFileList:label:in: (1 deprecated) - MorphicUIManager - #openPluggableFileList:label:in: (1 deprecated) - SMPackage - #modulePath:moduleVersion:moduleTag:versionComment: (1) From tim at rowledge.org Tue Oct 13 17:10:31 2020 From: tim at rowledge.org (tim Rowledge) Date: Tue, 13 Oct 2020 10:10:31 -0700 Subject: [squeak-dev] The Trunk: Kernel-eem.1351.mcz In-Reply-To: References: Message-ID: <1DA107F2-08F7-40D6-AE23-D7B2197DCB57@rowledge.org> > On 2020-10-12, at 10:01 PM, commits at source.squeak.org wrote: > > Rename EventSensorConstants WindowEventStinks to WindowEventScreenChange Dude! No fair! That is a crucial aspect of the system design that hasn't been altered since '04. tim -- tim Rowledge; tim at rowledge.org; http://www.rowledge.org/tim Strange OpCodes: BLI: Branch and Loop Infinite From tim at rowledge.org Tue Oct 13 17:46:12 2020 From: tim at rowledge.org (tim Rowledge) Date: Tue, 13 Oct 2020 10:46:12 -0700 Subject: [squeak-dev] The Trunk: Tools-eem.999.mcz In-Reply-To: <13a5467d-059b-2a9d-95b5-a81a78604c57@zogotounga.net> References: <7d0cf2956e4b4917a28aeb03fb1ce6d9@student.hpi.uni-potsdam.de> <13a5467d-059b-2a9d-95b5-a81a78604c57@zogotounga.net> Message-ID: <077A8864-8B29-4A60-BD38-7B9B76A123C9@rowledge.org> > On 2020-10-13, at 8:23 AM, Stéphane Rollandin wrote: > > I guess each of us has his own way to use a workspace. After all, it is where one "works", and everybody works differently. So, that several (even many) preferences may be needed is not a problem here IMO. Yah. I hate having syntax colouring in workspaces (I'm not a huge fan of it anywhere). Workspaces are not only chunks of code; they're note taking spaces. My rambling English notes do not get handled all that well. {Now I'll admit that the idea of extending Shout to do spell/grammar checking for plain text might be interesting for non-code stuff. We did some very simple spellcheck stuff for the Sophie Project around '05 that was quite helpful - the biggest issue was getting a source of the spellcheck library. Mac's have it built in, unix has a gazillion competing and confusing systems, Windwos required you to buy Office.} I don't like workspaces remembering variable names because it leaves values attached to names in a way that confuses. Imagine a workspace with " |foo| foo := 4. {more stuff} foo := somethingElse. foo wibble " Depending on whether you select the |foo| you may get very different results if you repeat evaluate various lines. I find that annoying. tim -- tim Rowledge; tim at rowledge.org; http://www.rowledge.org/tim Useful Latin Phrases:- Canis meus id comedit = My dog ate it. From eliot.miranda at gmail.com Tue Oct 13 20:20:31 2020 From: eliot.miranda at gmail.com (Eliot Miranda) Date: Tue, 13 Oct 2020 13:20:31 -0700 Subject: [squeak-dev] The Trunk: Tools-eem.999.mcz In-Reply-To: <077A8864-8B29-4A60-BD38-7B9B76A123C9@rowledge.org> References: <7d0cf2956e4b4917a28aeb03fb1ce6d9@student.hpi.uni-potsdam.de> <13a5467d-059b-2a9d-95b5-a81a78604c57@zogotounga.net> <077A8864-8B29-4A60-BD38-7B9B76A123C9@rowledge.org> Message-ID: Hi Tim, On Tue, Oct 13, 2020 at 10:46 AM tim Rowledge wrote: > > > > On 2020-10-13, at 8:23 AM, Stéphane Rollandin > wrote: > > > > I guess each of us has his own way to use a workspace. After all, it is > where one "works", and everybody works differently. So, that several (even > many) preferences may be needed is not a problem here IMO. > Yah. > > I hate having syntax colouring in workspaces (I'm not a huge fan of it > anywhere). Workspaces are not only chunks of code; they're note taking > spaces. My rambling English notes do not get handled all that well. > > {Now I'll admit that the idea of extending Shout to do spell/grammar > checking for plain text might be interesting for non-code stuff. We did > some very simple spellcheck stuff for the Sophie Project around '05 that > was quite helpful - the biggest issue was getting a source of the > spellcheck library. Mac's have it built in, unix has a gazillion competing > and confusing systems, Windwos required you to buy Office.} > > I don't like workspaces remembering variable names because it leaves > values attached to names in a way that confuses. > > Imagine a workspace with > " > |foo| > foo := 4. > {more stuff} > > > foo := somethingElse. > > > foo wibble > " > Depending on whether you select the |foo| you may get very different > results if you repeat evaluate various lines. I find that annoying. > My hack for handling more than one doit in a workspace is to include each one in a block. So I have, e.g. [| cos | cos := CogVMSimulator newWithOptions: #(Cogit StackToRegisterMappingCogit "SimpleStackBasedCogit" ObjectMemory Spur32BitCoMemoryManager MULTIPLEBYTECODESETS true), {#ISA. Cogit choose32BitISA}. cos openOn: 'spurreader.image'. cos openAsMorph; halt; run]. [| sis | sis := StackInterpreterSimulator newWithOptions: #(ObjectMemory Spur32BitMemoryManager). sis openOn: 'spurreader.image'. sis openAsMorph; run]. Of course this doesn't solve the issue of having a syntax error in an earlier doit turn everything following red, but it does allow one to have as many "sub doits" with their own temps as one wants. > > tim > -- > tim Rowledge; tim at rowledge.org; http://www.rowledge.org/tim > Useful Latin Phrases:- Canis meus id comedit = My dog ate it. > > > > -- _,,,^..^,,,_ best, Eliot -------------- next part -------------- An HTML attachment was scrubbed... URL: From eliot.miranda at gmail.com Tue Oct 13 20:23:07 2020 From: eliot.miranda at gmail.com (Eliot Miranda) Date: Tue, 13 Oct 2020 13:23:07 -0700 Subject: [squeak-dev] The Trunk: Tools-eem.999.mcz In-Reply-To: References: <7d0cf2956e4b4917a28aeb03fb1ce6d9@student.hpi.uni-potsdam.de> Message-ID: Hi Marcel, On Tue, Oct 13, 2020 at 8:00 AM Marcel Taeumel wrote: > Don't forget to set the default value in ReleaseBuilder class >> > #setPreferences. > If the default is unchanged, and the default value is nil, why do we have to make the setting explicit in ReleaseBuilder? isn't there a case for having ReleaseBuilder e.g. examine all preferences stored in class vars, and simply set these class vars to nil? > > Best, > Marcel > > Am 13.10.2020 16:58:48 schrieb Eliot Miranda : > > > On Oct 13, 2020, at 7:30 AM, Thiede, Christoph < > Christoph.Thiede at student.hpi.uni-potsdam.de> wrote: > >  > > Personally, I neither need nor dislike such a preference, but actually, I > turned mustDeclareVariables off a small number of times for a > single workspace in past. The reason was that if you use a workspace to > prepare some "production" code, it beguiles you into missing some variable > declarations, in particular inside of blocks, making you overlooking any > unintended closure/process interconnections that do not work in actual > production. I often fill a workspace with several snippets that I plan to > compile into different methods. The workspace bindings add a global > namespace between these snippets that does not always exist when compiling > the methods at different places. > > > Also, one might consider it as inconvenient that every mistyped doit > creates a new binding but you cannot remove this binding again without > opening the window menu which interrupts the usual scripting workflow ... > > > However, I don't see the harm of such a preference, and I welcome adding a > reasonable number of preferences whenever this can help anyone of the > community to make Squeak even more convenient for yourself. We don't need > to integrate every preference into the wizard, though :-) > > > +3 :-). > > Best, > > Christoph > ------------------------------ > *Von:* Squeak-dev im > Auftrag von Taeumel, Marcel > *Gesendet:* Dienstag, 13. Oktober 2020 15:22:48 > *An:* squeak-dev > *Betreff:* Re: [squeak-dev] The Trunk: Tools-eem.999.mcz > > Huh? Why should anybody want to turn this off? It should always be > possible to evaluate "x := 5" and then use "x" in a Workspace. It would be > really cumbersome if one always had to evaluate the entire workspace and > also write those || declarations on the top. Please ... :-( > > Please elaborate. Why does this feature hinders your working habits? You > can always evaluate the entire workspace. This just seems like a preference > that would annoy people if not set correctly. Why do you want to prevent "x > := 5" evaluation. I don't understand. Why can that be dangerous? > > -1 for such a preference. But I could live with it. ;-) > > Best, > Marcel > > Am 12.10.2020 20:00:28 schrieb commits at source.squeak.org < > commits at source.squeak.org>: > Eliot Miranda uploaded a new version of Tools to project The Trunk: > http://source.squeak.org/trunk/Tools-eem.999.mcz > > ==================== Summary ==================== > > Name: Tools-eem.999 > Author: eem > Time: 12 October 2020, 11:00:17.202907 am > UUID: 53fd9116-3cf5-43db-ad0d-150e7f41efd3 > Ancestors: Tools-mt.998 > > Add a preference for automatic variable declaration in a Workspace (true > by default). Many people love this feature; I hate it :-) > > =============== Diff against Tools-mt.998 =============== > > Item was changed: > StringHolder subclass: #Workspace > instanceVariableNames: 'bindings acceptDroppedMorphs acceptAction > mustDeclareVariables shouldStyle environment' > + classVariableNames: 'DeclareVariablesAutomatically LookupPools > ShouldStyle' > - classVariableNames: 'LookupPools ShouldStyle' > poolDictionaries: '' > category: 'Tools-Base'! > > !Workspace commentStamp: 'fbs 6/2/2012 20:46' prior: 0! > A Workspace is a text area plus a lot of support for executable code. It > is a great place to execute top-level commands to compute something useful, > and it is a great place to develop bits of a program before those bits get > put into class methods. > > To open a new workspace, execute: > > Workspace open > > > A workspace can have its own variables, called "workspace variables", to > hold intermediate results. For example, if you type into a workspace "x := > 5" and do-it, then later you could type in "y := x * 2" and y would become > 10. > > Additionally, in Morphic, a workspace can gain access to morphs that are > on the screen. If acceptDroppedMorphs is turned on, then whenever a morph > is dropped on the workspace, a variable will be created which references > that morph. This functionality is toggled with the window-wide menu of a > workspace. > > > The instance variables of this class are: > > bindings - holds the workspace variables for this workspace > > acceptDroppedMorphs - whether dropped morphs should create new variables! > > Item was added: > + ----- Method: Workspace class>>declareVariablesAutomatically (in > category 'preferences') ----- > + declareVariablesAutomatically > + > + category: 'browsing' > + description: 'If true, workspaces automatically create variables.' > + type: #Boolean> > + ^DeclareVariablesAutomatically ifNil: [true]! > > Item was added: > + ----- Method: Workspace class>>declareVariablesAutomatically: (in > category 'preferences') ----- > + declareVariablesAutomatically: aBoolean > + DeclareVariablesAutomatically := aBoolean! > > Item was changed: > ----- Method: Workspace>>initialize (in category 'initialize-release') > ----- > initialize > > super initialize. > self initializeBindings. > acceptDroppedMorphs := false. > + mustDeclareVariables := self class declareVariablesAutomatically not. > + environment := Environment current! > - mustDeclareVariables := false. > - environment := Environment current.! > > Item was changed: > ----- Method: Workspace>>mustDeclareVariableWording (in category 'variable > declarations') ----- > mustDeclareVariableWording > > + ^(mustDeclareVariables > + ifFalse: [' automatically create variable declaration'] > + ifTrue: [' automatically create variable declaration']) translated! > - ^ mustDeclareVariables not > - ifTrue: [' automatically create variable declaration' translated] > - ifFalse: [' automatically create variable declaration' translated]! > > > > > -- _,,,^..^,,,_ best, Eliot -------------- next part -------------- An HTML attachment was scrubbed... URL: From eliot.miranda at gmail.com Tue Oct 13 20:28:00 2020 From: eliot.miranda at gmail.com (Eliot Miranda) Date: Tue, 13 Oct 2020 13:28:00 -0700 Subject: [squeak-dev] The Trunk: Kernel-eem.1351.mcz In-Reply-To: <1DA107F2-08F7-40D6-AE23-D7B2197DCB57@rowledge.org> References: <1DA107F2-08F7-40D6-AE23-D7B2197DCB57@rowledge.org> Message-ID: On Tue, Oct 13, 2020 at 10:10 AM tim Rowledge wrote: > > > > On 2020-10-12, at 10:01 PM, commits at source.squeak.org wrote: > > > > Rename EventSensorConstants WindowEventStinks to WindowEventScreenChange > > Dude! No fair! That is a crucial aspect of the system design that hasn't > been altered since '04. > :) :) :) :) I wuz just proving that peeps do read that shit... > tim > -- > tim Rowledge; tim at rowledge.org; http://www.rowledge.org/tim > Strange OpCodes: BLI: Branch and Loop Infinite > _,,,^..^,,,_ best, Eliot -------------- next part -------------- An HTML attachment was scrubbed... URL: From eliot.miranda at gmail.com Tue Oct 13 20:49:00 2020 From: eliot.miranda at gmail.com (Eliot Miranda) Date: Tue, 13 Oct 2020 13:49:00 -0700 Subject: [squeak-dev] Pool for sysconf constants? In-Reply-To: <20201013032817.GA78602@shell.msen.com> References: <20201013032817.GA78602@shell.msen.com> Message-ID: Hi David, On Mon, Oct 12, 2020 at 8:28 PM David T. Lewis wrote: > On Sun, Oct 11, 2020 at 11:15:09AM -0700, Eliot Miranda wrote: > > Hi All, > > > > I want to implement a number of processors query on MacOS & other > > unices to complement the info provided by GetSystemInfo on Windows. The > > natural way to do this on unices is to use sysconf (3), and of course > this > > points to the issue for which FFI pools are needed, the constant names > for > > sysconf such as _SC_NPROCESSORS_ONLN are defined, but their values are > > implementation dependent. > > > > But before I go amd implement an FFI pool for this I thought I'd ask > > a) anyone already done this? Is it published anywhere? > > b) how are we going to organize such pools so that people don't have to > > reinvent the wheel? > > c) should there be a pool to cover sysconf or to cover unistd.h? (the > > point here is that while the pool might start off small, it could grow > and > > grow and maybe unistd.h is too much surface to cover) > > > > thoughts, suggestions? > > Hi Eliot, > > At first glance, it looks to me like the hard part of the problem is to > know what sysconf names are available to be queried on any given platform > at runtime. If you know that, or if you are only interested in a limited > number of well-known parameters (which seems likely), then it might be > simplest to just implement the sysconf(3) call either as an FFI call or > a call through the OSProcess plugin. > Well, I *am* implementing it as an FFI call in Terf. The issue is deriving the right integer values for the particular symbolic names, because these vary across implementations. And that's what FFIPools are designed to manage. Right now I don't have the FFIPool so I've hard-wired the constant: !CMacOSXPlatform methodsFor: 'accessing' stamp: 'eem 10/11/2020 17:53' prior: 47990341! numberOfCPUs "Warning, warning, Will Robertson!!!! The sysconf method bakes in a decidedly implementation-specific name for the support library *and* bakes in a value for a symbolic constant. Both of these are implementation dependent and subject to change. That said..." ^self sysconf: 58 "CPlatform current numberOfCPUs"! ! !CMacOSXPlatform methodsFor: 'private' stamp: 'eem 10/11/2020 17:51'! sysconf: systemInfo "Answer a value from sysconf(3)." ^self externalCallFailed " | scnprocsonline | scnprocsonline := 58. self current sysconf: scnprocsonline"! ! There's much to be unhappy about in this code: libSystem.dylib is the abstract name, but one can't use it because the search facilities can't chain through the libraries that libSystem.B.dylib (ibSystem.dylib is a symbolic link) refers to. So this could break in some future MacOS, whereas if libSystem.dylib did work, or if there was a symbolic name we could use that meant "the C library goddamnit", then it could be relied upon. 58 is meaningful only on MacOS, and presumably only since a particular version. That's why we need an FFIPool to manage the cross-platform variations. The type is longlong, which means we're not using a syntax that matches the declaration, and this will work only on 64-bits. We can fix the FFI to interpret C names accoding to the playtform, but we have a serious backwards-compatibility problem in that all of the FFI definitions up til now have been written under this assumption. But I suspect that I am not answering the right question here. If I am > off base, can you give an example of some of the parameters that you > would want to be able to query? > First off Terf needs _SC_NUM_PROCESSORS_ONLN, which is notionally the number of processors online, but now answers the number of cores, which shows you how fast these ideas go stale (_SC_NUM_PROCESSORS_CONF is the number of processors configured ;-) ). Other ones that could be meaningful for applications include _SC_ARG_MAX (The maximum bytes of argument to execve(2)) _SC_CHILD_MAX (The maximum number of simultaneous processes per user id), _SC_OPEN_MAX (The maximum number of open files per user id), _SC_STREAM_MAX (The minimum maximum number of streams that a process may have open at any one time), _SC_PHYS_PAGES (The number of pages of physical memory). There are many others, quite a few I can't imagine ever being compelling. Now yes, one can imagine implementing a cross-platform abstraction for these but it's a lot of effort for little gain. It;s easier just to suck it up and implement the FFI call. But I'm imagining these things will get used by the community and I don't want people to have to reinvent the wheel. This kind of stuff doesn't belong in trunk, but it does belong somewhere where we can share and coevolve the facilities. > Thanks, > Dave > > > -- _,,,^..^,,,_ best, Eliot -------------- next part -------------- An HTML attachment was scrubbed... URL: From giovanni at corriga.net Wed Oct 14 10:49:01 2020 From: giovanni at corriga.net (Giovanni Corriga) Date: Wed, 14 Oct 2020 11:49:01 +0100 Subject: [squeak-dev] UK Smalltalk User Group Meeting - Wednesday, October 28th Message-ID: The next meeting of the UK Smalltalk User Group will be on Wednesday, October 28th. Alexandre Bergel will talk about Agile Visualization with Roassal3. Visualizing data is probably the easiest part in the field of data visualization. Numerous books and sophisticated libraries exist for that very purpose. One of challenges of data visualization is to identify the right abstractions that make a visualization reusable, composable, extensible, navigable, and produced at a very low cost. Roassal ( https://github.com/ObjectProfile/Roassal3 ) is a visualization engine for Smalltalk that leverage the experience of crafting and using data visualization. This talk will demo Roassal and presents non-trivial visualizations within the field of software visualization. Alexandre Bergel ( http://bergel.eu/ ) is Associate Professor and researcher at the University of Chile. Alexandre Bergel and his collaborators carry out research in software engineering. His focus is on designing tools and methodologies to improve the overall performance and internal quality of software systems, by employing profiling, visualization, and artificial intelligence techniques. Alexandre Bergel has authored over 140 articles, published in international and peer reviewed scientific forums, including the most competitive conferences and journals in the field of software engineering. Alexandre has participated to over 140 program committees of international events. Alexandre has also a strong interest in applying his research results to industry. Several of his research prototypes have been turned into products and adopted by major companies in the semi-conductor industry and certification of critical software systems. Alexandre is member of the editorial board of Empirical Software Engineering. Alexandre authored the book Agile Artificial Intelligence in Pharo, Agile Visualization ( http://agilevisualization.com/ ), and co-authored the book Deep Into Pharo. Given the current COVID-19 restrictions, this will be an online meeting from home. If you'd like to join us, please sign up in advance on the meeting's Meetup page ( https://www.meetup.com/UKSTUG/events/cbklbrybcnblc/ ) to receive the meeting details. Don’t forget to bring your laptop and drinks! -------------- next part -------------- An HTML attachment was scrubbed... URL: From commits at source.squeak.org Wed Oct 14 11:01:22 2020 From: commits at source.squeak.org (commits at source.squeak.org) Date: Wed, 14 Oct 2020 11:01:22 0000 Subject: [squeak-dev] The Trunk: Collections-mt.916.mcz Message-ID: Marcel Taeumel uploaded a new version of Collections to project The Trunk: http://source.squeak.org/trunk/Collections-mt.916.mcz ==================== Summary ==================== Name: Collections-mt.916 Author: mt Time: 14 October 2020, 1:01:18.401265 pm UUID: 49aef966-6542-d34b-881e-a19161e040d4 Ancestors: Collections-ul.915 Prepare refactoring "(do|collect)WithIndex -> withIndex(Do|Collect)". See http://forum.world.st/The-Inbox-60Deprecated-ct-80-mcz-td5120706.html =============== Diff against Collections-ul.915 =============== Item was changed: ----- Method: HashedCollection>>doWithIndex: (in category 'enumerating') ----- + doWithIndex: elementAndIndexBlock + "Use the new version with consistent naming" + ^ self withIndexDo: elementAndIndexBlock! - doWithIndex: aBlock2 - "Support Set enumeration with a counter, even though not ordered" - | index | - index := 0. - self do: [:item | aBlock2 value: item value: (index := index+1)]! Item was added: + ----- Method: HashedCollection>>withIndexDo: (in category 'enumerating') ----- + withIndexDo: aBlock2 + "Support Set enumeration with a counter, even though not ordered" + | index | + index := 0. + self do: [:item | aBlock2 value: item value: (index := index+1)]! From commits at source.squeak.org Wed Oct 14 11:49:48 2020 From: commits at source.squeak.org (commits at source.squeak.org) Date: Wed, 14 Oct 2020 11:49:48 0000 Subject: [squeak-dev] The Trunk: EToys-mt.407.mcz Message-ID: Marcel Taeumel uploaded a new version of EToys to project The Trunk: http://source.squeak.org/trunk/EToys-mt.407.mcz ==================== Summary ==================== Name: EToys-mt.407 Author: mt Time: 14 October 2020, 1:49:41.242569 pm UUID: fe2c38c3-b540-6c4e-a9a2-e41990752ba3 Ancestors: EToys-mt.406 Rename #collectWithIndex: to #withIndexCollect:. See http://forum.world.st/The-Inbox-60Deprecated-ct-80-mcz-td5120706.html =============== Diff against EToys-mt.406 =============== Item was changed: ----- Method: CipherPanel>>encodedQuote: (in category 'initialization') ----- encodedQuote: aString "World addMorph: CipherPanel new" | morph prev | aString isEmpty ifTrue: [^ self]. (letterMorphs isNil or: [self isClean]) ifFalse: [(self confirm: 'Are you sure you want to discard all typing?' translated) ifFalse: [^ self]]. haveTypedHere := false. quote := aString asUppercase. prev := nil. originalMorphs := quote asArray + withIndexCollect: [:c :i | WordGameLetterMorph new plain indexInQuote: i id1: nil; - collectWithIndex: [:c :i | WordGameLetterMorph new plain indexInQuote: i id1: nil; setLetter: (quote at: i)]. letterMorphs := OrderedCollection new. decodingMorphs := quote asArray + withIndexCollect: [:c :i | (quote at: i) isLetter - collectWithIndex: [:c :i | (quote at: i) isLetter ifTrue: [morph := WordGameLetterMorph new underlined indexInQuote: i id1: nil. morph on: #mouseDown send: #mouseDownEvent:letterMorph: to: self. morph on: #keyStroke send: #keyStrokeEvent:letterMorph: to: self. letterMorphs addLast: morph. morph predecessor: prev. prev ifNotNil: [prev successor: morph]. prev := morph] ifFalse: [WordGameLetterMorph new plain indexInQuote: i id1: nil; setLetter: (quote at: i)]]. self color: originalMorphs first color. self extent: 500 @ 500! Item was changed: ----- Method: SmalltalkImage>>macVmMajorMinorBuildVersion (in category '*Etoys-Squeakland-system attribute') ----- macVmMajorMinorBuildVersion "SmalltalkImage current macVmMajorMinorBuildVersion" | aString rawTokens versionPart versionTokens versionArray | aString := self vmVersion. aString ifNil: [^ #(0 0 0)]. rawTokens := ((aString copyAfterLast: $]) findTokens: $ ). versionPart := rawTokens detect: [:each | each includes: $.] ifNone: [^#(0 0 0)]. versionTokens := versionPart findTokens: $.. + versionArray := #(0 0 0) withIndexCollect: [:each :index | - versionArray := #(0 0 0) collectWithIndex: [:each :index | (versionTokens at: index ifAbsent:['']) initialIntegerOrNil ifNil: [each]]. ^versionArray! From commits at source.squeak.org Wed Oct 14 11:50:23 2020 From: commits at source.squeak.org (commits at source.squeak.org) Date: Wed, 14 Oct 2020 11:50:23 0000 Subject: [squeak-dev] The Trunk: Morphic-mt.1700.mcz Message-ID: Marcel Taeumel uploaded a new version of Morphic to project The Trunk: http://source.squeak.org/trunk/Morphic-mt.1700.mcz ==================== Summary ==================== Name: Morphic-mt.1700 Author: mt Time: 14 October 2020, 1:50:17.463569 pm UUID: a72563b1-c6ff-f943-8d4d-e25020cbb89c Ancestors: Morphic-eem.1699 Rename #collectWithIndex: to #withIndexCollect:. See http://forum.world.st/The-Inbox-60Deprecated-ct-80-mcz-td5120706.html =============== Diff against Morphic-eem.1699 =============== Item was changed: ----- Method: SequenceableCollection>>segmentedSlopes (in category '*Morphic-NewCurves-cubic support') ----- segmentedSlopes "For a collection of floats. Returns the slopes for straight segments between vertices." "last slope closes the polygon. Always return same size as self. " ^ self + withIndexCollect: [:x :i | (self atWrap: i + 1) - collectWithIndex: [:x :i | (self atWrap: i + 1) - x]! Item was changed: ----- Method: TextEditor>>changeEmphasisOrAlignment (in category 'attributes') ----- changeEmphasisOrAlignment | aList reply code align menuList startIndex | startIndex := self startIndex. aList := #(normal bold italic narrow underlined struckOut leftFlush centered rightFlush justified). align := paragraph text alignmentAt: startIndex ifAbsent: [ paragraph textStyle alignment ]. code := paragraph text emphasisAt: startIndex. menuList := WriteStream on: Array new. menuList nextPut: (code isZero ifTrue:[''] ifFalse:['']), 'normal' translated. menuList nextPutAll: (#(bold italic underlined struckOut) collect:[:emph| (code anyMask: (TextEmphasis perform: emph) emphasisCode) ifTrue: [ '', emph asString translated ] ifFalse: [ '',emph asString translated ]]). ((paragraph text attributesAt: startIndex) anySatisfy: [ :attr | attr isKern and: [attr kern < 0 ]]) ifTrue: [ menuList nextPut:'', 'narrow' translated ] ifFalse: [ menuList nextPut:'', 'narrow' translated ]. + menuList nextPutAll: (#(leftFlush centered rightFlush justified) withIndexCollect: [ :type :i | - menuList nextPutAll: (#(leftFlush centered rightFlush justified) collectWithIndex: [ :type :i | align = (i-1) ifTrue: [ '',type asString translated ] ifFalse: [ '',type asString translated ]]). aList := #(normal bold italic underlined struckOut narrow leftFlush centered rightFlush justified). reply := UIManager default chooseFrom: menuList contents values: aList lines: #(1 6). reply notNil ifTrue: [ (#(leftFlush centered rightFlush justified) includes: reply) ifTrue: [ self setAlignment: reply. paragraph composeAll. self recomputeSelection] ifFalse: [ self setEmphasis: reply. paragraph composeAll. self recomputeSelection]]. ^ true! From commits at source.squeak.org Wed Oct 14 11:51:40 2020 From: commits at source.squeak.org (commits at source.squeak.org) Date: Wed, 14 Oct 2020 11:51:40 0000 Subject: [squeak-dev] The Trunk: Protocols-mt.75.mcz Message-ID: Marcel Taeumel uploaded a new version of Protocols to project The Trunk: http://source.squeak.org/trunk/Protocols-mt.75.mcz ==================== Summary ==================== Name: Protocols-mt.75 Author: mt Time: 14 October 2020, 1:51:39.700569 pm UUID: 2d468faa-7d01-8e4f-8a30-27ea000a63e6 Ancestors: Protocols-mt.74 Rename #collectWithIndex: to #withIndexCollect:. See http://forum.world.st/The-Inbox-60Deprecated-ct-80-mcz-td5120706.html =============== Diff against Protocols-mt.74 =============== Item was changed: ----- Method: StringType>>initialize (in category 'initialization') ----- initialize "Initialize the receiver (automatically called when instances are created via 'new')" super initialize. self vocabularyName: #String. #((accessing 'The basic info' (at: at:put: size endsWithDigit findString: findTokens: includesSubstring: indexOf: indexOf:startingAt: indexOf:startingAt:ifAbsent: lineCorrespondingToIndex: lineCount lineNumber: startsWithDigit numArgs)) (#'more accessing' 'More basic info' (allButFirst allButFirst: allButLast allButLast: at:ifAbsent: atAllPut: atPin: atRandom: atWrap: atWrap:put: fifth first first: fourth from:to:put: last last: lastIndexOf: lastIndexOf:ifAbsent: middle replaceAll:with: replaceFrom:to:with: replaceFrom:to:with:startingAt: second sixth third)) (comparing 'Determining which comes first alphabeticly' (< <= = > >= beginsWith: endsWith: endsWithAnyOf: howManyMatch: match:)) (testing 'Testing' (includes: isEmpty ifNil: ifNotNil: isAllDigits isAllSeparators isString lastSpacePosition)) (converting 'Converting it to another form' (asCharacter asDate asInteger asLowercase asNumber asString asStringOrText asSymbol asText asTime asUppercase asUrl capitalized keywords numericSuffix romanNumber reversed splitInteger surroundedBySingleQuotes withBlanksTrimmed withSeparatorsCompacted withoutTrailingBlanks withoutTrailingDigits asSortedCollection)) (copying 'Make another one like me' (copy copyFrom:to: copyUpTo: copyUpToLast: shuffled)) (enumerating 'Passing over the letters' + (collect: withIndexCollect: do: from:to:do: reverseDo: select: withIndexDo: detect: detect:ifNone:)) - (collect: collectWithIndex: do: from:to:do: reverseDo: select: withIndexDo: detect: detect:ifNone:)) ) do: [:item | | aMethodCategory | aMethodCategory := ElementCategory new categoryName: item first. aMethodCategory documentation: item second. item third do: [:aSelector | | aMethodInterface | aMethodInterface := MethodInterface new initializeFor: aSelector. self atKey: aSelector putMethodInterface: aMethodInterface. aMethodCategory elementAt: aSelector put: aMethodInterface]. self addCategory: aMethodCategory]. ! From commits at source.squeak.org Wed Oct 14 11:52:04 2020 From: commits at source.squeak.org (commits at source.squeak.org) Date: Wed, 14 Oct 2020 11:52:04 0000 Subject: [squeak-dev] The Trunk: ToolBuilder-Morphic-mt.267.mcz Message-ID: Marcel Taeumel uploaded a new version of ToolBuilder-Morphic to project The Trunk: http://source.squeak.org/trunk/ToolBuilder-Morphic-mt.267.mcz ==================== Summary ==================== Name: ToolBuilder-Morphic-mt.267 Author: mt Time: 14 October 2020, 1:52:03.144569 pm UUID: f8079b45-af97-5f4c-a80d-13f110caec22 Ancestors: ToolBuilder-Morphic-mt.266 Rename #collectWithIndex: to #withIndexCollect:. See http://forum.world.st/The-Inbox-60Deprecated-ct-80-mcz-td5120706.html =============== Diff against ToolBuilder-Morphic-mt.266 =============== Item was changed: ----- Method: PluggableTreeMorph>>nodesForChildren:inNode: (in category 'node access') ----- nodesForChildren: aCollection inNode: anObject ^ aCollection isSequenceable + ifTrue: [aCollection withIndexCollect: - ifTrue: [aCollection collectWithIndex: [:item :index | self instantiateNodeWithContents: item index: index parent: anObject]] ifFalse: [ | count | count := 0. "artificial index." aCollection collect: [:item | count := count + 1. self instantiateNodeWithContents: item index: count parent: anObject]]! From commits at source.squeak.org Wed Oct 14 11:52:34 2020 From: commits at source.squeak.org (commits at source.squeak.org) Date: Wed, 14 Oct 2020 11:52:34 0000 Subject: [squeak-dev] The Trunk: Tools-mt.1000.mcz Message-ID: Marcel Taeumel uploaded a new version of Tools to project The Trunk: http://source.squeak.org/trunk/Tools-mt.1000.mcz ==================== Summary ==================== Name: Tools-mt.1000 Author: mt Time: 14 October 2020, 1:52:30.421569 pm UUID: 8dff5fe6-2a56-1340-95ad-22e58cbd8dfe Ancestors: Tools-eem.999 Rename #collectWithIndex: to #withIndexCollect:. See http://forum.world.st/The-Inbox-60Deprecated-ct-80-mcz-td5120706.html =============== Diff against Tools-eem.999 =============== Item was changed: ----- Method: MethodFinder>>initialize (in category 'initialize') ----- (excessive size, no diff calculated) Item was changed: ----- Method: MethodFinder>>initialize2 (in category 'initialize') ----- (excessive size, no diff calculated) From commits at source.squeak.org Wed Oct 14 11:53:53 2020 From: commits at source.squeak.org (commits at source.squeak.org) Date: Wed, 14 Oct 2020 11:53:53 0000 Subject: [squeak-dev] The Trunk: 60Deprecated-mt.80.mcz Message-ID: Marcel Taeumel uploaded a new version of 60Deprecated to project The Trunk: http://source.squeak.org/trunk/60Deprecated-mt.80.mcz ==================== Summary ==================== Name: 60Deprecated-mt.80 Author: mt Time: 14 October 2020, 1:53:52.872569 pm UUID: ec4c9dcf-95bf-ac4c-adcf-161cd0d576f6 Ancestors: 60Deprecated-mt.79 Rename #doWithIndex: to #withIndexDo:. See http://forum.world.st/The-Inbox-60Deprecated-ct-80-mcz-td5120706.html =============== Diff against 60Deprecated-mt.79 =============== Item was changed: ----- Method: StandardFileMenu>>menuSelectionsArray: (in category 'menu building') ----- menuSelectionsArray: aDirectory "Answer a menu selections object corresponding to aDirectory. The object is an array corresponding to each item, each element itself constituting a two-element array, the first element of which contains a selector to operate on and the second element of which contains the parameters for that selector." |dirSize| dirSize := aDirectory pathParts size. ^Array streamContents: [:s | canTypeFileName ifTrue: [s nextPut: (StandardFileMenuResult directory: aDirectory name: nil)]. s nextPut: (StandardFileMenuResult directory: (FileDirectory root) name: ''). + aDirectory pathParts withIndexDo: - aDirectory pathParts doWithIndex: [:d :i | s nextPut: (StandardFileMenuResult directory: (self advance: dirSize - i containingDirectoriesFrom: aDirectory) name: '')]. aDirectory directoryNames do: [:dn | s nextPut: (StandardFileMenuResult directory: (FileDirectory on: (aDirectory fullNameFor: dn)) name: '')]. aDirectory fileNames do: [:fn | pattern do: [:pat | (pat match: fn) ifTrue: [ s nextPut: (StandardFileMenuResult directory: aDirectory name: fn)]]]]! Item was changed: ----- Method: StandardFileMenu>>pathPartsString: (in category 'menu building') ----- pathPartsString: aDirectory "Answer a string concatenating the path parts strings in aDirectory, each string followed by a cr." ^String streamContents: [:s | s nextPutAll: '[]'; cr. + aDirectory pathParts asArray withIndexDo: - aDirectory pathParts asArray doWithIndex: [:part :i | s next: i put: $ . s nextPutAll: part withBlanksTrimmed; cr]]! From commits at source.squeak.org Wed Oct 14 11:54:27 2020 From: commits at source.squeak.org (commits at source.squeak.org) Date: Wed, 14 Oct 2020 11:54:27 0000 Subject: [squeak-dev] The Trunk: Balloon-mt.34.mcz Message-ID: Marcel Taeumel uploaded a new version of Balloon to project The Trunk: http://source.squeak.org/trunk/Balloon-mt.34.mcz ==================== Summary ==================== Name: Balloon-mt.34 Author: mt Time: 14 October 2020, 1:54:26.358569 pm UUID: 20b2f591-e848-9540-b64b-525dbaedae9c Ancestors: Balloon-nice.33 Rename #doWithIndex: to #withIndexDo:. See http://forum.world.st/The-Inbox-60Deprecated-ct-80-mcz-td5120706.html =============== Diff against Balloon-nice.33 =============== Item was changed: ----- Method: BalloonEngineConstants class>>initializeInstVarNames:prefixedBy: (in category 'pool definition') ----- initializeInstVarNames: aClass prefixedBy: aString | token | + aClass instVarNames withIndexDo:[:instVarName :index| | value | - aClass instVarNames doWithIndex:[:instVarName :index| | value | token := (aString, instVarName first asUppercase asString, (instVarName copyFrom: 2 to: instVarName size),'Index') asSymbol. value := index - 1. (self bindingOf: token) ifNil:[self addClassVarName: token]. (self bindingOf: token) value: value. ]. token := (aString, aClass name,'Size') asSymbol. (self bindingOf: token) ifNil:[self addClassVarName: token]. (self bindingOf: token) value: aClass instSize.! From commits at source.squeak.org Wed Oct 14 11:55:13 2020 From: commits at source.squeak.org (commits at source.squeak.org) Date: Wed, 14 Oct 2020 11:55:13 0000 Subject: [squeak-dev] The Trunk: Collections-mt.917.mcz Message-ID: Marcel Taeumel uploaded a new version of Collections to project The Trunk: http://source.squeak.org/trunk/Collections-mt.917.mcz ==================== Summary ==================== Name: Collections-mt.917 Author: mt Time: 14 October 2020, 1:55:10.898569 pm UUID: 46e13bee-89c0-4d4e-8e9c-8c54ec54ff2b Ancestors: Collections-mt.916 Rename #doWithIndex: to #withIndexDo:. See http://forum.world.st/The-Inbox-60Deprecated-ct-80-mcz-td5120706.html =============== Diff against Collections-mt.916 =============== Item was changed: ----- Method: String>>compressWithTable: (in category 'converting') ----- compressWithTable: tokens "Return a string with all substrings that occur in tokens replaced by a character with ascii code = 127 + token index. This will work best if tokens are sorted by size. Assumes this string contains no characters > 127, or that they are intentionally there and will not interfere with this process." | str null finalSize result ri c | null := Character null. str := self copyFrom: 1 to: self size. "Working string will get altered" finalSize := str size. + tokens withIndexDo: - tokens doWithIndex: [:token :tIndex | | start ts | start := 1. [(start := str findString: token startingAt: start) > 0] whileTrue: [ts := token size. ((start + ts) <= str size and: [(str at: start + ts) = $ and: [tIndex*2 <= 128]]) ifTrue: [ts := token size + 1. "include training blank" str at: start put: (Character value: tIndex*2 + 127)] ifFalse: [str at: start put: (Character value: tIndex + 127)]. str at: start put: (Character value: tIndex + 127). 1 to: ts-1 do: [:i | str at: start+i put: null]. finalSize := finalSize - (ts - 1). start := start + ts]]. result := String new: finalSize. ri := 0. 1 to: str size do: [:i | (c := str at: i) = null ifFalse: [result at: (ri := ri+1) put: c]]. ^ result! From commits at source.squeak.org Wed Oct 14 11:55:56 2020 From: commits at source.squeak.org (commits at source.squeak.org) Date: Wed, 14 Oct 2020 11:55:56 0000 Subject: [squeak-dev] The Trunk: CollectionsTests-mt.345.mcz Message-ID: Marcel Taeumel uploaded a new version of CollectionsTests to project The Trunk: http://source.squeak.org/trunk/CollectionsTests-mt.345.mcz ==================== Summary ==================== Name: CollectionsTests-mt.345 Author: mt Time: 14 October 2020, 1:55:54.742569 pm UUID: fad74e61-f144-a340-a901-f8a702d7c08b Ancestors: CollectionsTests-ul.344 Rename #doWithIndex: to #withIndexDo:. See http://forum.world.st/The-Inbox-60Deprecated-ct-80-mcz-td5120706.html =============== Diff against CollectionsTests-ul.344 =============== Item was changed: ----- Method: DictionaryTest>>testIntegrityOfDictionaries (in category 'tests - integrity') ----- testIntegrityOfDictionaries #( Dictionary IdentityDictionary SystemDictionary LiteralDictionary PluggableDictionary WeakValueDictionary) do: [ :dictionaryClassName | Smalltalk at: dictionaryClassName ifPresent: [ :dictionaryClass | dictionaryClass allInstancesDo: [ :dictionary | dictionary keysAndValuesDo: [ :key :value | self assert: (dictionary at: key) == value ]. + dictionary array withIndexDo: [ :association :index | - dictionary array doWithIndex: [ :association :index | association ifNotNil: [ self assert: (dictionary scanFor: association key) = index ] ] ] ] ]! From commits at source.squeak.org Wed Oct 14 11:56:55 2020 From: commits at source.squeak.org (commits at source.squeak.org) Date: Wed, 14 Oct 2020 11:56:55 0000 Subject: [squeak-dev] The Trunk: EToys-mt.408.mcz Message-ID: Marcel Taeumel uploaded a new version of EToys to project The Trunk: http://source.squeak.org/trunk/EToys-mt.408.mcz ==================== Summary ==================== Name: EToys-mt.408 Author: mt Time: 14 October 2020, 1:56:48.041569 pm UUID: a59513ae-ebfd-c64a-ab48-b907afb30fb1 Ancestors: EToys-mt.407 Rename #doWithIndex: to #withIndexDo:. See http://forum.world.st/The-Inbox-60Deprecated-ct-80-mcz-td5120706.html =============== Diff against EToys-mt.407 =============== Item was changed: ----- Method: BookMorph>>saveBookForRevert (in category '*Etoys-Squeakland-master pages') ----- saveBookForRevert "Consider this the master version of the book, with regard to which pages are in it, what their order is, and what their content is" | forRevert | forRevert := OrderedCollection new. + pages withIndexDo: - pages doWithIndex: [: pg :index | pg setProperty: #revertKey toValue: index. forRevert add: (index -> pg copy)]. self setProperty:# pagesForRevert toValue: forRevert! Item was changed: ----- Method: Chess960Morph>>reinstallPieces (in category 'resizing') ----- reinstallPieces + board whitePlayer pieces withIndexDo: [:pc :n | - board whitePlayer pieces doWithIndex: [:pc :n | pc isZero ifFalse: [ self addedPiece: pc at: n white: true]]. + board blackPlayer pieces withIndexDo: [:pc :n | - board blackPlayer pieces doWithIndex: [:pc :n | pc isZero ifFalse: [ self addedPiece: pc at: n white: false]].! Item was changed: ----- Method: Chess960Player>>addBlackPieces: (in category 'adding/removing') ----- addBlackPieces: aChess960Configuration self configuration: aChess960Configuration. + configuration positions withIndexDo: [:p :n | self addPiece: p at: 56+n]. - configuration positions doWithIndex: [:p :n | self addPiece: p at: 56+n]. 49 to: 56 do:[:i| self addPiece: Pawn at: i].! Item was changed: ----- Method: Chess960Player>>addWhitePieces: (in category 'adding/removing') ----- addWhitePieces: aChess960Configuration self configuration: aChess960Configuration. + configuration positions withIndexDo: [:p :n | self addPiece: p at: n]. - configuration positions doWithIndex: [:p :n | self addPiece: p at: n]. 9 to: 16 do:[:i| self addPiece: Pawn at: i]. ! Item was changed: ----- Method: ChineseCheckers>>drawOn: (in category 'drawing') ----- drawOn: aCanvas | row1 row2 offset dotExtent | super drawOn: aCanvas. "Draw square board" "Only draw rows in the clipping region" dotExtent := (self width//25) asPoint. offset := self pieceSize - dotExtent + 1 // 2. "Offset of smaller dots rel to larger" row1 := (self boardLocAt: aCanvas clipRect topLeft) x max: 1. row2 := (self boardLocAt: aCanvas clipRect bottomRight) x min: board size. row1 to: row2 do: + [:row | (board at: row) withIndexDo: - [:row | (board at: row) doWithIndex: [:cell :i | cell ifNotNil: [aCanvas fillOval: ((self cellPointAt: (row at i)) + offset extent: dotExtent) color: (colors at: cell+1)]]]! Item was changed: ----- Method: DocLibrary>>saveDocCheck: (in category 'doc pane') ----- saveDocCheck: aMorph "Make sure the document gets attached to the version of the code that the user was looking at. Is there a version of this method in a changeSet beyond the updates we know about? Works even when the user has internal update numbers and the documentation is for external updates (It always is)." | classAndMethod parts selector class lastUp beyond ours docFor unNum ok key verList ext response | classAndMethod := aMorph valueOfProperty: #classAndMethod. classAndMethod ifNil: [ ^ self error: 'need to know the class and method']. "later let user set it" parts := classAndMethod findTokens: ' .'. selector := parts last asSymbol. class := Smalltalk at: (parts first asSymbol) ifAbsent: [^ self saveDoc: aMorph]. parts size = 3 ifTrue: [class := class class]. "Four indexes we are looking for: docFor = highest numbered below lastUpdate that has method. unNum = a higher unnumbered set that has method. lastUp = lastUpdate we know about in methodVersions beyond = any set about lastUp that has the method." + ChangeSet allChangeSets withIndexDo: [:cs :ind | "youngest first" - ChangeSet allChangeSets doWithIndex: [:cs :ind | "youngest first" (cs name includesSubstring: lastUpdateName) ifTrue: [lastUp := ind]. (cs atSelector: selector class: class) ~~ #none ifTrue: [ lastUp ifNotNil: [beyond := ind. ours := cs name] ifNil: [cs name first isDigit ifTrue: [docFor := ind] ifFalse: [unNum := ind. ours := cs name]]]]. "See if version the user sees is the version he is documenting" ok := beyond == nil. unNum ifNotNil: [docFor ifNotNil: [ok := docFor > unNum] ifNil: [ok := false]]. "old changeSets gone" ok ifTrue: [^ self saveDoc: aMorph]. key := DocLibrary properStemFor: classAndMethod. verList := (methodVersions at: key ifAbsent: [#()]), #(0 0). ext := verList first. "external update number we will write to" response := (PopUpMenu labels: 'Cancel\Broadcast Page' withCRs) startUpWithCaption: 'You are documenting a method in External Update ', ext asString, '.\There is a more recent version of that method in ' withCRs, ours, '.\If you are explaining the newer version, please Cancel.\Wait until that version appears in an External Update.' withCRs. response = 2 ifTrue: [self saveDoc: aMorph]. ! Item was changed: ----- Method: EventRollMorph>>setMediaEventMorphs (in category 'display') ----- setMediaEventMorphs "Place morphs representing the media track on the roll." | aMorph aWheel | mediaTrack ifEmpty: [^ self]. aWheel := Color wheel: mediaTrack size. + mediaTrack withIndexDo: - mediaTrack doWithIndex: [:evt :index | aMorph := MediaEventMorph new. aMorph hResizing: #shrinkWrap. aMorph vResizing: #shrinkWrap. aMorph color: ((aWheel at: index) alpha: 0.5). aMorph event: evt. aMorph extent: ((evt durationInMilliseconds / millisecondsPerPixel) @ 32). aMorph left: ((evt timeStamp - startTime)/ millisecondsPerPixel). aMorph top: 84. actualRoll addMorphBack: aMorph]! Item was changed: ----- Method: MentoringEventRecorder>>mergeMediaEvent: (in category 'event handling') ----- mergeMediaEvent: anEvent "Merge the event, presently time-stamped with a relative time-stamp., with my existing tape. Answer the merged tape. It is the responsibility of the sender to notify other objects that may be interested in the change, such as an event roll." | itsTimeStamp eventFollowingIt newTape anIndex itsCopy copysTimeStamp | itsTimeStamp := anEvent timeStamp. itsCopy := anEvent copy. itsCopy timeStamp: (copysTimeStamp := itsTimeStamp + tape first timeStamp). eventFollowingIt := tape detect: [:evt | evt timeStamp > copysTimeStamp] ifNone: [nil]. anIndex := eventFollowingIt ifNil: [tape size + 1] ifNotNil: [tape indexOf: eventFollowingIt]. newTape := Array streamContents: [:aStream | + tape withIndexDo: - tape doWithIndex: [:evt :index | index = anIndex ifTrue: [aStream nextPut: itsCopy]. aStream nextPut: evt]. anIndex > tape size ifTrue: [aStream nextPut: itsCopy]]. tape := newTape! Item was changed: ----- Method: MouseEventEditor>>initializeFor:forEventRoll: (in category 'initialization') ----- initializeFor: aMouseEventSequenceMorph forEventRoll: aRoll "Initialize the receiver as an editor for the given mouse-event-sequence and event-roll." | aTheatre aMorph | self color: (Color green muchLighter alpha: 0.7). aTheatre := aRoll eventTheatre. mouseEventSequenceMorph := aMouseEventSequenceMorph. self extent: aTheatre initialContentArea extent. self setNameTo: 'mouse event editor'. + mouseEventSequenceMorph events withIndexDo: - mouseEventSequenceMorph events doWithIndex: [:evt :index | aMorph := self discRepresentingEvent: evt index: index. aMorph center: evt position - aTheatre initialContentArea topLeft. self addMorphFront: aMorph]! Item was changed: ----- Method: Player>>absorbBackgroundDataFrom:forInstanceVariables: (in category 'slots-kernel') ----- absorbBackgroundDataFrom: aLine forInstanceVariables: slotNames "Fill my background fields from the substrings in a tab-delimited line of data. At the moment this only really cateres to string-valued items" + slotNames withIndexDo: - slotNames doWithIndex: [:aSlotName :anIndex | aLine do: [:aValue | self instVarNamed: aSlotName put: aValue] toFieldNumber: anIndex]! Item was changed: ----- Method: Player>>universalTilesForInterface: (in category 'scripts-kernel') ----- universalTilesForInterface: aMethodInterface "Return universal tiles for the given method interface. Record who self is." | ms itsSelector argList makeSelfGlobal phrase aType | itsSelector := aMethodInterface selector. argList := OrderedCollection new. + aMethodInterface argumentVariables withIndexDo: - aMethodInterface argumentVariables doWithIndex: [:anArgumentVariable :anIndex | | argTile | argTile := ScriptingSystem tileForArgType: (aType := aMethodInterface typeForArgumentNumber: anIndex). argList add: (aType == #Player ifTrue: [argTile actualObject] ifFalse: [argTile literal]). "default value for each type"]. ms := MessageSend receiver: self selector: itsSelector arguments: argList asArray. "For CardPlayers, use 'self'. For others, name me, and use my global name." makeSelfGlobal := self class officialClass ~~ CardPlayer. phrase := ms asTilesIn: self class globalNames: makeSelfGlobal. makeSelfGlobal ifFalse: [phrase setProperty: #scriptedPlayer toValue: self]. ^ phrase ! Item was changed: ----- Method: QuickGuideMorph class>>getWordyName:forCategory: (in category 'initialization') ----- getWordyName: guideName forCategory: guideCategory "With guideName and category already filled in, make a name in words. Remove the cat name, and trailing digits. Separate words at capital letters. NavBarHowToUse3 -> 'How To Use' " | gn mm tt | gn := guideName allButFirst: guideCategory size. gn := gn withoutTrailingDigits. mm := gn size. + gn reversed withIndexDo: [:cc :ind | - gn reversed doWithIndex: [:cc :ind | ind < mm ifTrue: [ cc isUppercase ifTrue: [ tt := mm + 1 - ind. gn := (gn copyFrom: 1 to: tt-1), ' ', (gn copyFrom: tt to: gn size)]. cc == $- ifTrue: [ tt := mm + 1 - ind. gn at: tt put: $ ]. "convert dash to space" ]]. ^ gn! Item was changed: ----- Method: ScriptEditorMorph>>indexOfMorphAbove: (in category 'dropping/grabbing') ----- indexOfMorphAbove: aPoint "Return index of lowest morph whose bottom is above aPoint. Will return 0 if the first morph is not above aPoint" + submorphs withIndexDo: - submorphs doWithIndex: [:m :i | m fullBounds bottom >= aPoint y ifTrue: [^ (i max: firstTileRow) - 1]]. ^ submorphs size! Item was changed: ----- Method: ScriptEditorMorph>>reinsertSavedTiles: (in category 'other') ----- reinsertSavedTiles: savedTiles "Revert the scriptor to show the saved tiles" + self submorphs withIndexDo: [:m :i | i > 1 ifTrue: [m delete]]. - self submorphs doWithIndex: [:m :i | i > 1 ifTrue: [m delete]]. self addAllMorphs: savedTiles. self allMorphsDo: [:m | m isTileScriptingElement ifTrue: [m bringUpToDate]]. self install. self showingMethodPane: false! Item was changed: ----- Method: StackMorph>>getAllText (in category 'menu') ----- getAllText "Collect the text for each card. Just point at strings so don't have to recopy them. (Parallel array of urls for ID of cards. Remote cards not working yet.) allText = Array (cards size) of arrays (fields in it) of strings of text. allTextUrls = Array (cards size) of urls or card numbers." | oldUrls oldStringLists allText allTextUrls | self writeSingletonData. oldUrls := self valueOfProperty: #allTextUrls ifAbsent: [#()]. oldStringLists := self valueOfProperty: #allText ifAbsent: [#()]. allText := self privateCards collect: [:pg | OrderedCollection new]. allTextUrls := Array new: self privateCards size. + self privateCards withIndexDo: [:aCard :ind | | aUrl which | - self privateCards doWithIndex: [:aCard :ind | | aUrl which | aUrl := aCard url. aCard isInMemory ifTrue: [(allText at: ind) addAll: (aCard allStringsAfter: nil). aUrl ifNil: [aUrl := ind]. allTextUrls at: ind put: aUrl] ifFalse: ["Order of cards on server may be different. (later keep up to date?)" "*** bug in this algorithm if delete a page?" which := oldUrls indexOf: aUrl. allTextUrls at: ind put: aUrl. which = 0 ifFalse: [allText at: ind put: (oldStringLists at: which)]]]. self setProperty: #allText toValue: allText. self setProperty: #allTextUrls toValue: allTextUrls. ^ allText! From commits at source.squeak.org Wed Oct 14 11:58:01 2020 From: commits at source.squeak.org (commits at source.squeak.org) Date: Wed, 14 Oct 2020 11:58:01 0000 Subject: [squeak-dev] The Trunk: Graphics-mt.440.mcz Message-ID: Marcel Taeumel uploaded a new version of Graphics to project The Trunk: http://source.squeak.org/trunk/Graphics-mt.440.mcz ==================== Summary ==================== Name: Graphics-mt.440 Author: mt Time: 14 October 2020, 1:57:54.772569 pm UUID: 1e0ca5ca-9744-a341-8ec3-dd0079a9bb53 Ancestors: Graphics-pre.439 Rename #doWithIndex: to #withIndexDo:. See http://forum.world.st/The-Inbox-60Deprecated-ct-80-mcz-td5120706.html =============== Diff against Graphics-pre.439 =============== Item was changed: ----- Method: Color class>>colorFrom: (in category 'instance creation') ----- colorFrom: parm "Return an instantiated color from parm. If parm is already a color, return it, else return the result of my performing it if it's a symbol or, if it is a list, it can either be an array of three numbers, which will be interpreted as RGB values, or a list of symbols, the first of which is sent to me and then the others of which are in turn sent to the prior result, thus allowing entries of the form #(blue darker). Else just return the thing" | aColor firstParm | (parm isKindOf: Color) ifTrue: [^ parm]. (parm isSymbol) ifTrue: [^ self perform: parm]. (parm isString) ifTrue: [^ self fromString: parm]. ((parm isKindOf: SequenceableCollection) and: [parm size > 0]) ifTrue: [firstParm := parm first. (firstParm isKindOf: Number) ifTrue: [^ self fromRgbTriplet: parm]. aColor := self colorFrom: firstParm. + parm withIndexDo: - parm doWithIndex: [:sym :ind | ind > 1 ifTrue: [aColor := aColor perform: sym]]. ^ aColor]. ^ parm " Color colorFrom: #(blue darker) Color colorFrom: Color blue darker Color colorFrom: #blue Color colorFrom: #(0.0 0.0 1.0) "! Item was changed: ----- Method: ColorForm>>colorsUsed (in category 'color manipulation') ----- colorsUsed "Return a list of the colors actually used by this ColorForm." | myColor list | myColor := self colors. list := OrderedCollection new. + self tallyPixelValues withIndexDo: [:count :i | - self tallyPixelValues doWithIndex: [:count :i | count > 0 ifTrue: [list add: (myColor at: i)]]. ^ list asArray ! Item was changed: ----- Method: Form>>cgForPixelValue:orNot: (in category 'analyzing') ----- cgForPixelValue: pv orNot: not "Return the center of gravity for all pixels of value pv. Note: If orNot is true, then produce the center of gravity for all pixels that are DIFFERENT from the supplied (background) value" | xAndY | xAndY := (Array with: (self xTallyPixelValue: pv orNot: not) with: (self yTallyPixelValue: pv orNot: not)) collect: [:profile | | pixCount weighted | "For both x and y profiles..." pixCount := 0. weighted := 0. + profile withIndexDo: - profile doWithIndex: [:t :i | pixCount := pixCount + t. weighted := weighted + (t*i)]. pixCount = 0 "Produce average of nPixels weighted by coordinate" ifTrue: [0.0] ifFalse: [weighted asFloat / pixCount asFloat - 1.0]]. ^ xAndY first @ xAndY last " | f cg | [Sensor anyButtonPressed] whileFalse: [f := Form fromDisplay: (Sensor cursorPoint extent: 50 at 50). cg := f cgForPixelValue: (Color black pixelValueForDepth: f depth) orNot: false. f displayAt: 0 at 0. Display fill: (cg extent: 2 at 2) fillColor: Color red]. ScheduledControllers restore "! Item was changed: ----- Method: Form>>colorsUsed (in category 'analyzing') ----- colorsUsed "Return a list of the Colors this form uses." | tallies tallyDepth usedColors | tallies := self tallyPixelValues. tallyDepth := (tallies size log: 2) asInteger. usedColors := OrderedCollection new. + tallies withIndexDo: [:count :i | - tallies doWithIndex: [:count :i | count > 0 ifTrue: [ usedColors add: (Color colorFromPixelValue: i - 1 depth: tallyDepth)]]. ^ usedColors asArray ! Item was changed: ----- Method: FormSetFont>>fromFormArray:asciiStart:ascent: (in category 'initialize-release') ----- fromFormArray: formArray asciiStart: asciiStart ascent: ascentVal | height width x badChar | type := 2. name := 'aFormFont'. minAscii := asciiStart. maxAscii := minAscii + formArray size - 1. ascent := ascentVal. subscript := superscript := emphasis := 0. height := width := 0. maxWidth := 0. formArray do: [:f | width := width + f width. maxWidth := maxWidth max: f width. height := height max: f height + f offset y]. badChar := (Form extent: 7 at height) borderWidth: 1. width := width + badChar width. descent := height - ascent. pointSize := height. glyphs := Form extent: width @ height depth: formArray first depth. xTable := Array new: maxAscii + 3 withAll: 0. x := 0. + formArray withIndexDo: - formArray doWithIndex: [:f :i | f displayOn: glyphs at: x at 0. xTable at: minAscii + i+1 put: (x := x + f width)]. badChar displayOn: glyphs at: x at 0. xTable at: maxAscii + 3 put: x + badChar width. characterToGlyphMap := nil.! From commits at source.squeak.org Wed Oct 14 11:58:46 2020 From: commits at source.squeak.org (commits at source.squeak.org) Date: Wed, 14 Oct 2020 11:58:46 0000 Subject: [squeak-dev] The Trunk: Kernel-mt.1352.mcz Message-ID: Marcel Taeumel uploaded a new version of Kernel to project The Trunk: http://source.squeak.org/trunk/Kernel-mt.1352.mcz ==================== Summary ==================== Name: Kernel-mt.1352 Author: mt Time: 14 October 2020, 1:58:43.251569 pm UUID: 72187ee9-c851-894c-b496-d910ac5c5865 Ancestors: Kernel-eem.1351 Rename #doWithIndex: to #withIndexDo:. See http://forum.world.st/The-Inbox-60Deprecated-ct-80-mcz-td5120706.html =============== Diff against Kernel-eem.1351 =============== Item was changed: ----- Method: ClassDescription>>forceNewFrom: (in category 'instance variables') ----- forceNewFrom: anArray "Create a new instance of the class and fill its instance variables up with the array." | object max | object := self new. max := self instSize. + anArray withIndexDo: [:each :index | - anArray doWithIndex: [:each :index | index > max ifFalse: [object instVarAt: index put: each]]. ^ object! Item was changed: ----- Method: Object>>copySameFrom: (in category 'copying') ----- copySameFrom: otherObject "Copy to myself all instance variables named the same in otherObject. This ignores otherObject's control over its own inst vars." | myInstVars otherInstVars | myInstVars := self class allInstVarNames. otherInstVars := otherObject class allInstVarNames. + myInstVars withIndexDo: [:each :index | - myInstVars doWithIndex: [:each :index | | match | (match := otherInstVars indexOf: each) > 0 ifTrue: [self instVarAt: index put: (otherObject instVarAt: match)]]. 1 to: (self basicSize min: otherObject basicSize) do: [:i | self basicAt: i put: (otherObject basicAt: i)]. ! Item was changed: ----- Method: Object>>longPrintOn: (in category 'printing') ----- longPrintOn: aStream "Append to the argument, aStream, the names and values of all of the receiver's instance variables." + self class allInstVarNames withIndexDo: - self class allInstVarNames doWithIndex: [:title :index | aStream nextPutAll: title; nextPut: $:; space; tab; print: (self instVarAt: index); cr]! Item was changed: ----- Method: Object>>longPrintOn:limitedTo:indent: (in category 'printing') ----- longPrintOn: aStream limitedTo: sizeLimit indent: indent "Append to the argument, aStream, the names and values of all of the receiver's instance variables. Limit is the length limit for each inst var." + self class allInstVarNames withIndexDo: - self class allInstVarNames doWithIndex: [:title :index | indent timesRepeat: [aStream tab]. aStream nextPutAll: title; nextPut: $:; space; tab; nextPutAll: ((self instVarAt: index) printStringLimitedTo: (sizeLimit -3 -title size max: 1)); cr]! From commits at source.squeak.org Wed Oct 14 12:03:22 2020 From: commits at source.squeak.org (commits at source.squeak.org) Date: Wed, 14 Oct 2020 12:03:22 0000 Subject: [squeak-dev] The Trunk: Morphic-mt.1701.mcz Message-ID: Marcel Taeumel uploaded a new version of Morphic to project The Trunk: http://source.squeak.org/trunk/Morphic-mt.1701.mcz ==================== Summary ==================== Name: Morphic-mt.1701 Author: mt Time: 14 October 2020, 2:03:16.450569 pm UUID: 64fc03e9-6c0b-fc48-885c-61f038e93dff Ancestors: Morphic-mt.1700 Rename #doWithIndex: to #withIndexDo:. See http://forum.world.st/The-Inbox-60Deprecated-ct-80-mcz-td5120706.html =============== Diff against Morphic-mt.1700 =============== Item was changed: ----- Method: MorphicModel>>use:orMakeModelSelectorFor:in: (in category 'compilation') ----- use: cachedSelector orMakeModelSelectorFor: selectorBody in: selectorBlock | selector | model ifNil: [^ nil]. cachedSelector ifNil: ["Make up selector from slotname if any" selector := (slotName ifNil: [selectorBody] ifNotNil: [slotName , selectorBody]) asSymbol. (model class canUnderstand: selector) ifFalse: [(self confirm: 'Shall I compile a null response for' , Character cr asString , model class name , '>>' , selector) ifFalse: [self halt]. model class compile: (String streamContents: + [:s | selector keywords withIndexDo: - [:s | selector keywords doWithIndex: [:k :i | s nextPutAll: k , ' arg' , i printString]. s cr; nextPutAll: '"Automatically generated null response."'. s cr; nextPutAll: '"Add code below for appropriate behavior..."'.]) classified: 'input events' notifying: nil]] ifNotNil: [selector := cachedSelector]. ^ selectorBlock value: selector! Item was changed: ----- Method: PluggableListMorph>>filterList:matching: (in category 'filtering') ----- filterList: someItems matching: aPattern "Filter someStrings according to aPattern. Prepend best matches in the result. Update the model-to-view map." | frontMatching substringMatching tmp | aPattern ifEmpty: [ ^ someItems ]. someItems ifEmpty: [ ^ someItems ]. frontMatching := OrderedCollection new. substringMatching := OrderedCollection new. self assert: modelToView isEmpty. self assert: viewToModel isEmpty. tmp := OrderedCollection new. + someItems withIndexDo: - someItems doWithIndex: [ :each :n | | foundPos | foundPos := self filterListItem: each matching: aPattern. foundPos = 1 ifTrue: [ frontMatching add: each. modelToView at: n put: frontMatching size. viewToModel at: frontMatching size put: n ] ifFalse: [ foundPos > 1 ifTrue: [ substringMatching add: each. tmp add: n; add: substringMatching size ] ] ]. tmp pairsDo: [:modelIndex :viewIndex | modelToView at: modelIndex put: viewIndex + frontMatching size. viewToModel at: viewIndex + frontMatching size put: modelIndex]. ^ frontMatching, substringMatching! Item was changed: ----- Method: PluggableMultiColumnListMorph>>getFullList (in category 'model access - cached') ----- getFullList "The full list arranges all items column-first." fullList ifNotNil: [^ fullList]. fullList := getListSelector ifNotNil: [:selector | "A) Fetch the list column-first from the model." model perform: selector] ifNil: [ (getListSizeSelector notNil and: [getListElementSelector notNil]) ifFalse: ["X) We cannot fetch the list from the model. Make it empty." #()] ifTrue: [ "B) Fetch the list row-first from the model:" | listSize | listSize := self getListSize. listSize = 0 ifTrue: [#() "Empty list"] ifFalse: [ | firstRow columns | firstRow := self getListItem: 1. columns := Array new: firstRow size. 1 to: columns size do: [:columnIndex | "Initialize all columns." columns at: columnIndex put: (Array new: listSize). "Put the first row in." (columns at: columnIndex) at: 1 put: (firstRow at: columnIndex)]. "Put all other rows in." 2 to: listSize do: [:rowIndex | (self getListItem: rowIndex) + withIndexDo: [:item :columnIndex | - doWithIndex: [:item :columnIndex | (columns at: columnIndex) at: rowIndex put: item]]. columns]]]. self updateColumns. ^ fullList! Item was changed: ----- Method: PluggableMultiColumnListMorph>>selection: (in category 'selection') ----- selection: someObjects | found | someObjects size ~= self columnCount ifTrue: [^ self]. 1 to: self listSize do: [:row | found := true. + self getList withIndexDo: [:items :column | - self getList doWithIndex: [:items :column | found := found and: [(items at: row) = (someObjects at: column)]]. found ifTrue: [^ self selectionIndex: row]].! Item was changed: ----- Method: PluggableMultiColumnListMorph>>updateColumns (in category 'updating') ----- updateColumns "The number of columns must match the number of list morphs." | columnsChanged | columnsChanged := self columnCount ~= listMorphs size. [self columnCount < listMorphs size] whileTrue: [ listMorphs removeLast delete]. [self columnCount > listMorphs size] whileTrue: [ listMorphs addLast: self createListMorph. self scroller addMorphBack: listMorphs last]. + listMorphs withIndexDo: [:listMorph :columnIndex | - listMorphs doWithIndex: [:listMorph :columnIndex | listMorph columnIndex: columnIndex; color: self textColor; cellPositioning: (self cellPositioningAtColumn: columnIndex); cellInset: (self cellInsetAtColumn: columnIndex); hResizing: (self hResizingAtColumn: columnIndex); spaceFillWeight: (self spaceFillWeightAtColumn: columnIndex)]. columnsChanged ifTrue: [self setListParameters].! Item was changed: ----- Method: PluggableMultiColumnListMorph>>verifyContents (in category 'updating') ----- verifyContents "Verify the contents of the receiver, reconstituting if necessary. Called whenever window is reactivated, to react to possible structural changes. Also called periodically in morphic if the smartUpdating preference is true" | changed currentList modelList modelIndex | self flag: #performance. "mt: We do have changed/update. Why can't the tools communicate through an appropriate notifier such as the SystemChangeNotifier?" "1) Is the list still up to date?" currentList := fullList. fullList := nil. modelList := self getFullList. changed := false. + modelList withIndexDo: [:column :index | - modelList doWithIndex: [:column :index | changed := changed or: [(currentList at: index) ~= column]]. changed ifFalse: [^ self]. self updateList: modelList. "2) Is the selection still up to date?" modelIndex := self getCurrentSelectionIndex. (self modelIndexFor: self selectionIndex) = modelIndex ifTrue: [^ self]. self updateListSelection: modelIndex.! Item was changed: ----- Method: PluggableMultiColumnListMorphByItem>>getCurrentSelectionIndex (in category 'model access') ----- getCurrentSelectionIndex "Answer the index of the current selection. Similar to #selection: but with the full list instead of the (maybe) filtered list." getIndexSelector ifNil: [^ 0]. (model perform: getIndexSelector) in: [:row | row ifNil: [^ 0]. row ifEmpty: [^ 0]. 1 to: self fullListSize do: [:rowIndex | | match | match := true. + self getFullList withIndexDo: [:column :columnIndex | - self getFullList doWithIndex: [:column :columnIndex | match := match and: [(column at: rowIndex) = (row at: columnIndex)]]. match ifTrue: [^ rowIndex]]]. ^ 0! Item was changed: ----- Method: PolygonMorph>>nextDuplicateVertexIndex (in category 'geometry') ----- nextDuplicateVertexIndex vertices + withIndexDo: [:vert :index | ((index between: 2 and: vertices size - 1) - doWithIndex: [:vert :index | ((index between: 2 and: vertices size - 1) and: [| epsilon v1 v2 | v1 := vertices at: index - 1. v2 := vertices at: index + 1. epsilon := ((v1 x - v2 x) abs max: (v1 y - v2 y) abs) // 32 max: 1. vert onLineFrom: v1 to: v2 within: epsilon]) ifTrue: [^ index]]. ^ 0! From commits at source.squeak.org Wed Oct 14 12:04:20 2020 From: commits at source.squeak.org (commits at source.squeak.org) Date: Wed, 14 Oct 2020 12:04:20 0000 Subject: [squeak-dev] The Trunk: MorphicExtras-mt.278.mcz Message-ID: Marcel Taeumel uploaded a new version of MorphicExtras to project The Trunk: http://source.squeak.org/trunk/MorphicExtras-mt.278.mcz ==================== Summary ==================== Name: MorphicExtras-mt.278 Author: mt Time: 14 October 2020, 2:04:17.592569 pm UUID: 0cffdb2f-a95d-164b-8c55-7f22312685dc Ancestors: MorphicExtras-mt.277 Rename #doWithIndex: to #withIndexDo:. See http://forum.world.st/The-Inbox-60Deprecated-ct-80-mcz-td5120706.html =============== Diff against MorphicExtras-mt.277 =============== Item was changed: ----- Method: BookMorph>>acceptSortedContentsFrom: (in category 'sorting') ----- acceptSortedContentsFrom: aHolder "Update my page list from the given page sorter." | goodPages rejects | goodPages := OrderedCollection new. rejects := OrderedCollection new. + aHolder submorphs withIndexDo: - aHolder submorphs doWithIndex: [:m :i | | toAdd sqPage | toAdd := nil. (m isKindOf: PasteUpMorph) ifTrue: [toAdd := m]. (m isKindOf: BookPageThumbnailMorph) ifTrue: [toAdd := m page. m bookMorph == self ifFalse: ["borrowed from another book. preserve the original" toAdd := toAdd veryDeepCopy. "since we came from elsewhere, cached strings are wrong" self removeProperty: #allTextUrls. self removeProperty: #allText]]. toAdd isString ifTrue: ["a url" toAdd := pages detect: [:aPage | aPage url = toAdd] ifNone: [toAdd]]. toAdd isString ifTrue: [sqPage := SqueakPageCache atURL: toAdd. toAdd := sqPage contentsMorph ifNil: [sqPage copyForSaving "a MorphObjectOut"] ifNotNil: [sqPage contentsMorph]]. toAdd ifNil: [rejects add: m] ifNotNil: [goodPages add: toAdd]]. self newPages: goodPages. goodPages isEmpty ifTrue: [self insertPage]. rejects notEmpty ifTrue: [self inform: rejects size printString , ' objects vanished in this process.']! Item was changed: ----- Method: BookMorph>>getAllText (in category 'menu') ----- getAllText "Collect the text for each page. Just point at strings so don't have to recopy them. Parallel array of urls for ID of pages. allText = Array (pages size) of arrays (fields in it) of strings of text. allTextUrls = Array (pages size) of urls or page numbers. For any page that is out, text data came from .bo file on server. Is rewritten when one or all pages are stored." | oldUrls oldStringLists allText allTextUrls | oldUrls := self valueOfProperty: #allTextUrls ifAbsent: [#()]. oldStringLists := self valueOfProperty: #allText ifAbsent: [#()]. allText := pages collect: [:pg | OrderedCollection new]. allTextUrls := Array new: pages size. + pages withIndexDo: [:aPage :ind | | which aUrl | - pages doWithIndex: [:aPage :ind | | which aUrl | aUrl := aPage url. aPage isInMemory ifTrue: [(allText at: ind) addAll: (aPage allStringsAfter: nil). aUrl ifNil: [aUrl := ind]. allTextUrls at: ind put: aUrl] ifFalse: ["Order of pages on server may be different. (later keep up to date?)" which := oldUrls indexOf: aUrl. allTextUrls at: ind put: aUrl. which = 0 ifFalse: [allText at: ind put: (oldStringLists at: which)]]]. self setProperty: #allText toValue: allText. self setProperty: #allTextUrls toValue: allTextUrls. ^ allText! Item was changed: ----- Method: BookMorph>>getStemUrl (in category 'menu') ----- getStemUrl "Try to find the old place where this book was stored. Confirm with the user. Else ask for new place." | initial pg url knownURL | knownURL := false. initial := ''. (pg := currentPage valueOfProperty: #SqueakPage) ifNotNil: [pg contentsMorph == currentPage ifTrue: [initial := pg url. knownURL := true]]. "If this page has a url" pages + withIndexDo: [:aPage :ind | initial isEmpty - doWithIndex: [:aPage :ind | initial isEmpty ifTrue: [aPage isInMemory ifTrue: [(pg := aPage valueOfProperty: #SqueakPage) ifNotNil: [initial := pg url]]]]. "any page with a url" initial isEmpty ifTrue: [initial := ServerDirectory defaultStemUrl , '1.sp']. "A new legal place" url := knownURL ifTrue: [initial] ifFalse: [UIManager default request: 'url of the place to store a typical page in this book. Must begin with file:// or ftp://' translated initialAnswer: initial]. ^ SqueakPage stemUrl: url! Item was changed: ----- Method: BookMorph>>reserveUrls (in category 'menu') ----- reserveUrls "Save a dummy version of the book first, assign all pages URLs, write dummy files to reserve the url, and write the index. Good when I have pages with interpointing bookmarks." | stem | (stem := self getStemUrl) isEmpty ifTrue: [^self]. + pages withIndexDo: - pages doWithIndex: [:pg :ind | "does write the current page too" pg url ifNil: [pg reserveUrl: stem , ind printString , '.sp']] "self saveIndexOnURL."! Item was changed: ----- Method: BookMorph>>saveAsNumberedURLs (in category 'menu') ----- saveAsNumberedURLs "Write out all pages in this book that are not showing, onto a server. The local disk could be the server. For any page that does not have a SqueakPage and a url already, name that page file by its page number. Any pages that are already totally out will stay that way." | stem list firstTime | firstTime := (self valueOfProperty: #url) isNil. stem := self getStemUrl. "user must approve" stem isEmpty ifTrue: [^self]. firstTime ifTrue: [self setProperty: #futureUrl toValue: stem , '.bo']. self reserveUrlsIfNeeded. + pages withIndexDo: - pages doWithIndex: [:aPage :ind | "does write the current page too" aPage isInMemory ifTrue: ["not out now" aPage presenter ifNotNil: [aPage presenter flushPlayerListCache]. aPage saveOnURL: stem , ind printString , '.sp']]. list := pages collect: [:aPage | aPage sqkPage prePurge]. "knows not to purge the current page" list := (list select: [:each | each notNil]) asArray. "do bulk become:" (list collect: [:each | each contentsMorph]) elementsExchangeIdentityWith: (list collect: [:spg | MorphObjectOut new xxxSetUrl: spg url page: spg]). self saveIndexOnURL. self presenter ifNotNil: [self presenter flushPlayerListCache]. firstTime ifTrue: ["Put a thumbnail into the hand" URLMorph grabForBook: self. self setProperty: #futureUrl toValue: nil "clean up"]! Item was changed: ----- Method: BookMorph>>saveIndexOnURL (in category 'menu') ----- saveIndexOnURL "Make up an index to the pages of this book, with thumbnails, and store it on the server. (aDictionary, aMorphObjectOut, aMorphObjectOut, aMorphObjectOut). The last part corresponds exactly to what pages looks like when they are all out. Each holds onto a SqueakPage, which holds a url and a thumbnail." | dict mine sf urlList list | pages isEmpty ifTrue: [^self]. dict := Dictionary new. dict at: #modTime put: Time totalSeconds. "self getAllText MUST have been called at start of this operation." dict at: #allText put: (self valueOfProperty: #allText). #(#color #borderWidth #borderColor #pageSize) do: [:sel | dict at: sel put: (self perform: sel)]. self reserveUrlsIfNeeded. "should already be done" list := pages copy. "paste dict on front below" "Fix up the entries, should already be done" + list withIndexDo: - list doWithIndex: [:out :ind | out isInMemory ifTrue: [(out valueOfProperty: #SqueakPage) ifNil: [out saveOnURLbasic]. list at: ind put: out sqkPage copyForSaving]]. urlList := list collect: [:ppg | ppg url]. self setProperty: #allTextUrls toValue: urlList. dict at: #allTextUrls put: urlList. list := (Array with: dict) , list. mine := self valueOfProperty: #url. mine ifNil: [mine := self getStemUrl , '.bo'. self setProperty: #url toValue: mine]. sf := ServerDirectory new fullPath: mine. Cursor wait showWhile: [ | remoteFile | remoteFile := sf fileNamed: mine. remoteFile dataIsValid. remoteFile fileOutClass: nil andObject: list "remoteFile close"]! Item was changed: ----- Method: InternalThreadNavigationMorph>>acceptSortedContentsFrom: (in category 'sorting') ----- acceptSortedContentsFrom: aHolder "Update my page list from the given page sorter." threadName isEmpty ifTrue: [threadName := 'I need a name' translated]. threadName := UIManager default request: 'Name this thread.' translated initialAnswer: threadName. threadName isEmptyOrNil ifTrue: [^self]. listOfPages := OrderedCollection new. + aHolder submorphs withIndexDo: [:m :i | | cachedData proj nameOfThisProject | - aHolder submorphs doWithIndex: [:m :i | | cachedData proj nameOfThisProject | (nameOfThisProject := m valueOfProperty: #nameOfThisProject) ifNotNil: [ cachedData := {nameOfThisProject}. proj := Project named: nameOfThisProject. (proj isNil or: [proj thumbnail isNil]) ifFalse: [ cachedData := cachedData, {proj thumbnail scaledToSize: self myThumbnailSize}. ]. listOfPages add: cachedData. ]. ]. self class know: listOfPages as: threadName. self removeAllMorphs; addButtons. self world ifNil: [ self openInWorld; positionAppropriately. ]. ! Item was changed: ----- Method: TabSorterMorph>>acceptSort (in category 'buttons') ----- acceptSort "Reconstitute the palette based on what is found in the sorter" | rejects oldOwner tabsToUse oldTop | tabsToUse := OrderedCollection new. rejects := OrderedCollection new. + pageHolder submorphs withIndexDo: - pageHolder submorphs doWithIndex: [:m :i | | appearanceMorph toAdd aMenu | toAdd := nil. (m isKindOf: BookMorph) ifTrue: [toAdd := SorterTokenMorph forMorph: m]. (m isKindOf: SorterTokenMorph) ifTrue: [toAdd := m morphRepresented. (toAdd referent isKindOf: MenuMorph) ifTrue: [(aMenu := toAdd referent) setProperty: #paletteMenu toValue: true. (aMenu submorphs size > 1 and: [(aMenu submorphs second isKindOf: MenuItemMorph) and: [aMenu submorphs second contents = 'dismiss this menu']]) ifTrue: [aMenu submorphs first delete. "delete title" aMenu submorphs first delete. "delete stay-up item" (aMenu submorphs first knownName = #line) ifTrue: [aMenu submorphs first delete]]]. toAdd removeAllMorphs. toAdd addMorph: (appearanceMorph := m submorphs first). appearanceMorph position: toAdd position. appearanceMorph lock. toAdd fitContents]. toAdd ifNil: [rejects add: m] ifNotNil: [tabsToUse add: toAdd]]. tabsToUse isEmpty ifTrue: [^self inform: 'Sorry, must have at least one tab']. book newTabs: tabsToUse. book tabsMorph color: pageHolder color. oldTop := self topRendererOrSelf. "in case some maniac has flexed the sorter" oldOwner := oldTop owner. oldTop delete. oldOwner addMorphFront: book! From commits at source.squeak.org Wed Oct 14 12:05:03 2020 From: commits at source.squeak.org (commits at source.squeak.org) Date: Wed, 14 Oct 2020 12:05:03 0000 Subject: [squeak-dev] The Trunk: Nebraska-mt.59.mcz Message-ID: Marcel Taeumel uploaded a new version of Nebraska to project The Trunk: http://source.squeak.org/trunk/Nebraska-mt.59.mcz ==================== Summary ==================== Name: Nebraska-mt.59 Author: mt Time: 14 October 2020, 2:05:01.937569 pm UUID: b038a014-2599-1f46-a713-c3650ab58fa6 Ancestors: Nebraska-mt.58 Rename #doWithIndex: to #withIndexDo:. See http://forum.world.st/The-Inbox-60Deprecated-ct-80-mcz-td5120706.html =============== Diff against Nebraska-mt.58 =============== Item was changed: ----- Method: MatrixTransform2x3 class>>fromRemoteCanvasEncoding: (in category '*nebraska-instance creation') ----- fromRemoteCanvasEncoding: encoded "DisplayTransform fromRemoteCanvasEncoding: 'Matrix,1065353216,0,1137541120,0,1065353216,1131610112,'" | nums transform encodedNums | "split the numbers up" encodedNums := encoded findTokens: ','. "remove the initial 'Matrix' specification" encodedNums := encodedNums asOrderedCollection. encodedNums removeFirst. "parse the numbers" nums := encodedNums collect: [ :enum | Integer readFromString: enum ]. "create an instance" transform := self new. "plug in the numbers" + nums withIndexDo: [ :num :i | - nums doWithIndex: [ :num :i | transform basicAt: i put: num ]. ^transform! From commits at source.squeak.org Wed Oct 14 12:05:42 2020 From: commits at source.squeak.org (commits at source.squeak.org) Date: Wed, 14 Oct 2020 12:05:42 0000 Subject: [squeak-dev] The Trunk: Protocols-mt.76.mcz Message-ID: Marcel Taeumel uploaded a new version of Protocols to project The Trunk: http://source.squeak.org/trunk/Protocols-mt.76.mcz ==================== Summary ==================== Name: Protocols-mt.76 Author: mt Time: 14 October 2020, 2:05:41.702569 pm UUID: 7a5022c3-e515-344b-a533-fa5ae555aed7 Ancestors: Protocols-mt.75 Rename #doWithIndex: to #withIndexDo:. See http://forum.world.st/The-Inbox-60Deprecated-ct-80-mcz-td5120706.html =============== Diff against Protocols-mt.75 =============== Item was changed: ----- Method: MethodInterface>>printOn: (in category 'printing') ----- printOn: aStream "print the receiver on a stream. Overridden to provide details about wording, selector, result type, and companion setter." super printOn: aStream. aStream nextPutAll: ' - wording: '; print: self wording; nextPutAll: ' selector: '; print: selector. self argumentVariables size > 0 ifTrue: [aStream nextPutAll: ' Arguments: '. + argumentVariables withIndexDo: - argumentVariables doWithIndex: [:aVariable :anIndex | aStream nextPutAll: 'argument #', anIndex printString, ' name = ', aVariable variableName asString, ', type = ', aVariable variableType]]. resultSpecification ifNotNil: [aStream nextPutAll: ' result type = ', resultSpecification resultType asString. resultSpecification companionSetterSelector ifNotNil: [aStream nextPutAll: ' setter = ', resultSpecification companionSetterSelector asString]] ! From commits at source.squeak.org Wed Oct 14 12:06:14 2020 From: commits at source.squeak.org (commits at source.squeak.org) Date: Wed, 14 Oct 2020 12:06:14 0000 Subject: [squeak-dev] The Trunk: ST80-mt.262.mcz Message-ID: Marcel Taeumel uploaded a new version of ST80 to project The Trunk: http://source.squeak.org/trunk/ST80-mt.262.mcz ==================== Summary ==================== Name: ST80-mt.262 Author: mt Time: 14 October 2020, 2:06:13.409569 pm UUID: 06f67fe3-d639-fe4a-a44e-41733bf3b7fd Ancestors: ST80-mt.261 Rename #doWithIndex: to #withIndexDo:. See http://forum.world.st/The-Inbox-60Deprecated-ct-80-mcz-td5120706.html =============== Diff against ST80-mt.261 =============== Item was changed: ----- Method: PluggableTest>>artistKeystroke: (in category 'artist pane') ----- artistKeystroke: aCharacter + self artistList withIndexDo: [:artist :i | - self artistList doWithIndex: [:artist :i | (artist first asLowercase = aCharacter asLowercase) ifTrue: [ self artist: i]]. ! Item was changed: ----- Method: PluggableTest>>musicTypeKeystroke: (in category 'music type pane') ----- musicTypeKeystroke: aCharacter + musicTypeList withIndexDo: [:type :i | - musicTypeList doWithIndex: [:type :i | (type first asLowercase = aCharacter asLowercase) ifTrue: [self musicType: i]]. ! From commits at source.squeak.org Wed Oct 14 12:06:42 2020 From: commits at source.squeak.org (commits at source.squeak.org) Date: Wed, 14 Oct 2020 12:06:42 0000 Subject: [squeak-dev] The Trunk: Services-Base-mt.69.mcz Message-ID: Marcel Taeumel uploaded a new version of Services-Base to project The Trunk: http://source.squeak.org/trunk/Services-Base-mt.69.mcz ==================== Summary ==================== Name: Services-Base-mt.69 Author: mt Time: 14 October 2020, 2:06:41.584569 pm UUID: 887b87be-071f-3349-ad16-9cf58979f76b Ancestors: Services-Base-jr.68 Rename #doWithIndex: to #withIndexDo:. See http://forum.world.st/The-Inbox-60Deprecated-ct-80-mcz-td5120706.html =============== Diff against Services-Base-jr.68 =============== Item was changed: ----- Method: ServiceGui>>subMenuFor: (in category 'servicecategory') ----- subMenuFor: aServiceCategory self pushMenu. aServiceCategory enabledServices ifEmpty: [self menuItemFor: ServiceAction new]. aServiceCategory enabledServices + withIndexDo: [:each :i | self n: i. self menuItemFor: each]. - doWithIndex: [:each :i | self n: i. self menuItemFor: each]. ^ self popMenu! Item was changed: ----- Method: ServiceProvider>>savePreferencesFor: (in category 'persistence') ----- savePreferencesFor: aService "pref := ServicePreferences preferenceAt: aService shortcutPreference. strm := WriteStream with: ''. strm nextPutAll: aService id; nextPutAll: 'shortcut'; cr; tab; nextPutAll: '^ '; nextPutAll: {pref name. pref preferenceValue. 1000} storeString. self class compileSilently: strm contents classified: 'saved preferences'." aService isCategory ifTrue: [aService externalPreferences + withIndexDo: [:e :i | | strm | - doWithIndex: [:e :i | | strm | strm := WriteStream with: aService id asString. strm nextPutAll: e id asString; cr; tab; nextPutAll: '^ '; nextPutAll: {aService childrenPreferences. e id. i} storeString. e provider class compileSilently: strm contents classified: 'saved preferences']]! From commits at source.squeak.org Wed Oct 14 12:07:44 2020 From: commits at source.squeak.org (commits at source.squeak.org) Date: Wed, 14 Oct 2020 12:07:44 0000 Subject: [squeak-dev] The Trunk: System-mt.1179.mcz Message-ID: Marcel Taeumel uploaded a new version of System to project The Trunk: http://source.squeak.org/trunk/System-mt.1179.mcz ==================== Summary ==================== Name: System-mt.1179 Author: mt Time: 14 October 2020, 2:07:40.555569 pm UUID: 8a7e511d-87d7-6042-8478-87417dd33e12 Ancestors: System-mt.1178 Rename #doWithIndex: to #withIndexDo:. See http://forum.world.st/The-Inbox-60Deprecated-ct-80-mcz-td5120706.html =============== Diff against System-mt.1178 =============== Item was changed: ----- Method: NativeImageSegment class>>swapOutProjects (in category 'testing') ----- swapOutProjects "NativeImageSegment swapOutProjects" "Swap out segments for all projects other than the current one." | spaceLeft | spaceLeft := Smalltalk garbageCollect. + Project allProjects withIndexDo: - Project allProjects doWithIndex: [:p :i | | newSpaceLeft | p couldBeSwappedOut ifTrue: [Transcript cr; cr; nextPutAll: p name. (NativeImageSegment new copyFromRoots: (Array with: p) sizeHint: 0) extract; writeToFile: 'project' , i printString. newSpaceLeft := Smalltalk garbageCollect. Transcript cr; print: newSpaceLeft - spaceLeft; endEntry. spaceLeft := newSpaceLeft]].! Item was changed: ----- Method: SmartRefStream>>storeInstVarsIn:from: (in category 'class changed shape') ----- storeInstVarsIn: anObject from: dict "For instance variables with the same names, store them in the new instance. Values in variable-length part also. This is NOT the normal inst var transfer!! See Object.readDataFrom:size:. This is for when inst var names have changed and some additional conversion is needed. Here we handle the unchanged vars. " + (anObject class allInstVarNames) withIndexDo: [:varName :index | - (anObject class allInstVarNames) doWithIndex: [:varName :index | (dict includesKey: varName) ifTrue: [ anObject instVarAt: index put: (dict at: varName)]]. "variable part" (dict includesKey: #SizeOfVariablePart) ifFalse: [^ anObject]. 1 to: (dict at: #SizeOfVariablePart) do: [:index | anObject basicAt: index put: (dict at: index)]. ^ anObject! From commits at source.squeak.org Wed Oct 14 12:08:21 2020 From: commits at source.squeak.org (commits at source.squeak.org) Date: Wed, 14 Oct 2020 12:08:21 0000 Subject: [squeak-dev] The Trunk: ToolBuilder-Morphic-mt.268.mcz Message-ID: Marcel Taeumel uploaded a new version of ToolBuilder-Morphic to project The Trunk: http://source.squeak.org/trunk/ToolBuilder-Morphic-mt.268.mcz ==================== Summary ==================== Name: ToolBuilder-Morphic-mt.268 Author: mt Time: 14 October 2020, 2:08:19.881569 pm UUID: 512035a4-7ed9-4149-adce-ec5c6bb12d4b Ancestors: ToolBuilder-Morphic-mt.267 Rename #doWithIndex: to #withIndexDo:. See http://forum.world.st/The-Inbox-60Deprecated-ct-80-mcz-td5120706.html =============== Diff against ToolBuilder-Morphic-mt.267 =============== Item was changed: ----- Method: MorphicUIManager>>chooseFrom:lines:title: (in category 'ui requests') ----- chooseFrom: aList lines: linesArray title: aString "Choose an item from the given list. Answer the index of the selected item. Cancel value is 0. There are several (historical) reasons for building a button dialog instead of a list chooser for small lists: 1) Unfortunately, there is existing code that uses this call to create simple confirmation dialogs with a list of #(yes no cancel). 2) Unfortunately, there is existing code that uses this call to mimick a drop-down menu with a (compact) pop-up menu." self askForProvidedAnswerTo: aString ifSupplied: [:answer | (answer = #cancel or: [answer isNil]) ifTrue: [^ 0]. ^ aList indexOf: answer]. aList ifEmpty: [^ 0]. aList size <= 7 ifTrue: [ | dialog | dialog := DialogWindow new title: 'Please Choose'; message: aString; filterEnabled: true; autoCancel: true; "Like a pop-up menu, click anywhere to dismiss." yourself. + aList withIndexDo: [:ea :index | - aList doWithIndex: [:ea :index | dialog createButton: ea value: index]. dialog selectedButtonIndex: 1. ^ dialog getUserResponseAtHand ifNil: [0]]. ^ ListChooser chooseFrom: aList title: aString! From commits at source.squeak.org Wed Oct 14 12:10:44 2020 From: commits at source.squeak.org (commits at source.squeak.org) Date: Wed, 14 Oct 2020 12:10:44 0000 Subject: [squeak-dev] The Trunk: Tools-mt.1001.mcz Message-ID: Marcel Taeumel uploaded a new version of Tools to project The Trunk: http://source.squeak.org/trunk/Tools-mt.1001.mcz ==================== Summary ==================== Name: Tools-mt.1001 Author: mt Time: 14 October 2020, 2:10:41.330569 pm UUID: e912063d-b963-cf40-b8aa-66e99da3cd31 Ancestors: Tools-mt.1000 Rename #doWithIndex: to #withIndexDo:. See http://forum.world.st/The-Inbox-60Deprecated-ct-80-mcz-td5120706.html =============== Diff against Tools-mt.1000 =============== Item was changed: ----- Method: BasicInspector>>streamInstanceVariablesOn: (in category 'fields - streaming') ----- streamInstanceVariablesOn: aStream + (thisContext objectClass: self object) allInstVarNames withIndexDo: [:name :index | - (thisContext objectClass: self object) allInstVarNames doWithIndex: [:name :index | aStream nextPut: ((self newFieldForType: #instVar key: name) name: name asString; shouldStyleName: true; valueGetter: [:object | thisContext object: object instVarAt: index]; valueGetterExpression: ('thisContext object: {1} instVarAt: {2}' format: { 'self'. index }); valueSetter: [:object :value | thisContext object: object instVarAt: index put: value]; yourself)].! Item was changed: ----- Method: ChangedMessageSet>>contents:notifying: (in category 'acceptance') ----- contents: aString notifying: aController "Accept the string as new source for the current method, and make certain the annotation pane gets invalidated" | existingSelector existingClass superResult newSelector | existingSelector := self selectedMessageName. existingClass := self selectedClassOrMetaClass. superResult := super contents: aString notifying: aController. superResult ifTrue: "succeeded" [newSelector := existingClass newParser parseSelector: aString. newSelector ~= existingSelector ifTrue: "Selector changed -- maybe an addition" [self reformulateList. self changed: #messageList. + self messageList withIndexDo: - self messageList doWithIndex: [:aMethodReference :anIndex | (aMethodReference actualClass == existingClass and: [aMethodReference methodSymbol == newSelector]) ifTrue: [self messageListIndex: anIndex]]]]. ^ superResult! Item was changed: ----- Method: ClassInspector>>streamSharedPoolsOn: (in category 'fields - streaming') ----- streamSharedPoolsOn: aStream + self object sharedPools withIndexDo: [:pool :index | - self object sharedPools doWithIndex: [:pool :index | aStream nextPut: ((self newFieldForType: #poolDictionary key: (self environment keyAtIdentityValue: pool)) shouldStyleName: true; valueGetter: [:object | object sharedPools at: index]; valueSetter: [:object :value | object sharedPools at: index put: value]; yourself)].! Item was changed: ----- Method: CodeHolder>>messageHelpTruncated: (in category 'message list') ----- messageHelpTruncated: aText "Show only the first n lines of the text." | formatted lineCount | formatted := aText. lineCount := 0. + aText withIndexDo: [:char :index | - aText doWithIndex: [:char :index | char = Character cr ifTrue: [lineCount := lineCount + 1]. lineCount > 10 ifTrue: [ formatted := formatted copyFrom: 1 to: index-1. formatted append: ' [...]'. ^ formatted]]. ^ formatted! Item was changed: ----- Method: Context>>tempsAndValuesLimitedTo:indent: (in category '*Tools-debugger access') ----- tempsAndValuesLimitedTo: sizeLimit indent: indent "Return a string of the temporary variabls and their current values" | aStream | aStream := WriteStream on: (String new: 100). self tempNames + withIndexDo: [:title :index | - doWithIndex: [:title :index | indent timesRepeat: [aStream tab]. aStream nextPutAll: title; nextPut: $:; space; tab. aStream nextPutAll: ((self tempAt: index) printStringLimitedTo: (sizeLimit -3 -title size max: 1)). aStream cr]. ^aStream contents! Item was changed: ----- Method: ContextInspector>>streamTemporaryVariablesOn: (in category 'fields - streaming') ----- streamTemporaryVariablesOn: aStream | tempNames | tempNames := [self object tempNames] ifError: [ ^ self streamError: 'Invalid temporaries' translated on: aStream]. + tempNames withIndexDo: [:name :index | - tempNames doWithIndex: [:name :index | aStream nextPut: ((self newFieldForType: #tempVar key: name) name: ('[{1}]' format: {name}); valueGetter: [:context | context namedTempAt: index]; valueSetter: [:context :value | context namedTempAt: index put: value]; yourself)]! Item was changed: ----- Method: ContextVariablesInspector>>streamTemporaryVariablesOn: (in category 'fields - streaming') ----- streamTemporaryVariablesOn: aStream "Overwritten to change the visuals of temps in debuggers." | tempNames | tempNames := [self object tempNames] ifError: [ ^ self streamError: 'Invalid temporaries' translated on: aStream]. + tempNames withIndexDo: [:name :index | - tempNames doWithIndex: [:name :index | aStream nextPut: ((self newFieldForType: #tempVar key: name) shouldStyleName: true; valueGetter: [:context | context namedTempAt: index]; valueSetter: [:context :value | context namedTempAt: index put: value]; yourself)].! Item was changed: ----- Method: DebuggerMethodMap>>tempsAndValuesForContext: (in category 'accessing') ----- tempsAndValuesForContext: aContext "Return a string of the temporary variables and their current values" | aStream | aStream := WriteStream on: (String new: 100). + (self tempNamesForContext: aContext) withIndexDo: - (self tempNamesForContext: aContext) doWithIndex: [:title :index | aStream nextPutAll: title; nextPut: $:; space; tab. aContext print: (self namedTempAt: index in: aContext) on: aStream. aStream cr]. ^aStream contents! Item was changed: ----- Method: Inspector>>streamInstanceVariablesOn: (in category 'fields - streaming') ----- streamInstanceVariablesOn: aStream + (self object perform: #class "do not inline send of #class, receiver could be a proxy") allInstVarNames withIndexDo: [:name :index | - (self object perform: #class "do not inline send of #class, receiver could be a proxy") allInstVarNames doWithIndex: [:name :index | aStream nextPut: ((self newFieldForType: #instVar key: name) shouldStyleName: true; valueGetter: [:object | object instVarNamed: name]; valueSetter: [:object :value | object instVarNamed: name put: value]; yourself)].! Item was changed: ----- Method: Message>>createStubMethod (in category '*Tools-Debugger') ----- createStubMethod | argNames | argNames := Set new. ^ String streamContents: [ :s | + self selector keywords withIndexDo: [ :key :i | - self selector keywords doWithIndex: [ :key :i | | aOrAn argName arg argClassName | s nextPutAll: key. ((key last = $:) or: [self selector isInfix]) ifTrue: [ arg := self arguments at: i. argClassName := arg canonicalArgumentName. aOrAn := argClassName first isVowel ifTrue: ['an'] ifFalse: ['a']. argName := aOrAn, argClassName. [argNames includes: argName] whileTrue: [argName := argName, i asString]. argNames add: argName. s nextPutAll: ' '; nextPutAll: argName; space ]. ]. s cr; tab. s nextPutAll: 'self shouldBeImplemented' ].! Item was changed: ----- Method: MethodFinder>>exceptions (in category 'search') ----- exceptions "Handle some very slippery selectors. asSymbol -- want to be able to produce it, but do not want to make every string submitted into a Symbol!!" | aSel | answers first isSymbol ifFalse: [^ self]. thisData first first isString ifFalse: [^ self]. aSel := #asSymbol. (self testPerfect: aSel) ifTrue: [ selector add: aSel. expressions add: (String streamContents: [:strm | strm nextPutAll: 'data', argMap first printString. + aSel keywords withIndexDo: [:key :ind | - aSel keywords doWithIndex: [:key :ind | strm nextPutAll: ' ',key. (key last == $:) | (key first isLetter not) ifTrue: [strm nextPutAll: ' data', (argMap at: ind+1) printString]]])]. ! Item was changed: ----- Method: MethodFinder>>noteDangerous (in category 'initialize') ----- noteDangerous "Remember the methods with really bad side effects." Dangerous := Set new. "Object accessing, testing, copying, dependent access, macpal, flagging" #(addInstanceVarNamed:withValue: haltIfNil copyAddedStateFrom: veryDeepCopy veryDeepCopyWith: veryDeepFixupWith: veryDeepInner: addDependent: evaluate:wheneverChangeIn: codeStrippedOut: playSoundNamed: isThisEverCalled isThisEverCalled: logEntry logExecution logExit) do: [:sel | Dangerous add: sel]. "Object error handling" #(cannotInterpret: caseError confirm: confirm:orCancel: doesNotUnderstand: error: halt halt: notify: notify:at: primitiveFailed shouldNotImplement subclassResponsibility) do: [:sel | Dangerous add: sel]. "Object user interface" #(basicInspect beep inform: inspect inspectWithLabel: notYetImplemented inspectElement ) do: [:sel | Dangerous add: sel]. "Object system primitives" #(become: becomeForward: instVarAt:put: instVarNamed:put: nextInstance nextObject rootStubInImageSegment: someObject tryPrimitive:withArgs:) do: [:sel | Dangerous add: sel]. "Object private" #(errorImproperStore errorNonIntegerIndex errorNotIndexable errorSubscriptBounds: mustBeBoolean primitiveError: species storeAt:inTempFrame:) do: [:sel | Dangerous add: sel]. "Object, translation support" #(cCode: cCode:inSmalltalk: cCoerce:to: export: inline: returnTypeC: sharedCodeNamed:inCase: var:declareC:) do: [:sel | Dangerous add: sel]. "Object, objects from disk, finalization. And UndefinedObject" #(comeFullyUpOnReload: objectForDataStream: readDataFrom:size: rehash saveOnFile storeDataOn: actAsExecutor executor finalize retryWithGC:until: suspend) do: [:sel | Dangerous add: sel]. "No Restrictions: Boolean, False, True, " "Morph" #() do: [:sel | Dangerous add: sel]. "Behavior" #(obsolete confirmRemovalOf: copyOfMethodDictionary storeLiteral:on: addSubclass: removeSubclass: superclass: "creating method dictionary" addSelector:withMethod: compile: compile:notifying: compileAll compileAllFrom: compress decompile: defaultSelectorForMethod: methodDictionary: recompile:from: recompileChanges removeSelector: compressedSourceCodeAt: selectorAtMethod:setClass: allInstances allSubInstances inspectAllInstances inspectSubInstances thoroughWhichSelectorsReferTo:special:byte: "enumerating" allInstancesDo: allSubInstancesDo: allSubclassesDo: allSuperclassesDo: selectSubclasses: selectSuperclasses: subclassesDo: withAllSubclassesDo: "too slow->" crossReference removeUninstantiatedSubclassesSilently "too slow->" unreferencedInstanceVariables "private" flushCache format:variable:words:pointers: format:variable:words:pointers:weak: format:variable:bitsUnitSize:pointers:weak: printSubclassesOn:level: basicRemoveSelector: addSelector:withMethod:notifying: addSelectorSilently:withMethod:) do: [:sel | Dangerous add: sel]. "CompiledMethod" #(defaultSelector) do: [:sel | Dangerous add: sel]. "Others " #("no tangible result" do: associationsDo: + "private" adaptToCollection:andSend: adaptToNumber:andSend: adaptToPoint:andSend: adaptToString:andSend: instVarAt:put: asDigitsToPower:do: combinations:atATimeDo: pairsDo: permutationsDo: reverseDo: reverseWith:do: with:do: withIndexDo: asDigitsAt:in:do: combinationsAt:in:after:do: errorOutOfBounds permutationsStartingAt:do: fromUser) - "private" adaptToCollection:andSend: adaptToNumber:andSend: adaptToPoint:andSend: adaptToString:andSend: instVarAt:put: asDigitsToPower:do: combinations:atATimeDo: doWithIndex: pairsDo: permutationsDo: reverseDo: reverseWith:do: with:do: withIndexDo: asDigitsAt:in:do: combinationsAt:in:after:do: errorOutOfBounds permutationsStartingAt:do: fromUser) do: [:sel | Dangerous add: sel]. #( fileOutPrototype addSpareFields makeFileOutFile ) do: [:sel | Dangerous add: sel]. #(recompile:from: recompileAllFrom: recompileChanges asPrototypeWithFields: asPrototype addInstanceVarNamed:withValue: addInstanceVariable addClassVarName: removeClassVarName: findOrAddClassVarName: instanceVariableNames: ) do: [:sel | Dangerous add: sel]. ! Item was changed: ----- Method: MethodFinder>>simpleSearch (in category 'search') ----- simpleSearch "Run through first arg's class' selectors, looking for one that works." | class supers listOfLists | self exceptions. class := thisData first first class. "Cache the selectors for the receiver class" (class == cachedClass and: [cachedArgNum = ((argMap size) - 1)]) ifTrue: [listOfLists := cachedSelectorLists] ifFalse: [supers := class withAllSuperclasses. listOfLists := OrderedCollection new. supers do: [:cls | listOfLists add: (cls selectorsWithArgs: (argMap size) - 1)]. cachedClass := class. cachedArgNum := (argMap size) - 1. cachedSelectorLists := listOfLists]. listOfLists do: [:selectorList | selectorList do: [:aSel | (selector includes: aSel) ifFalse: [ ((Approved includes: aSel) or: [AddAndRemove includes: aSel]) ifTrue: [ (self testPerfect: aSel) ifTrue: [ selector add: aSel. expressions add: (String streamContents: [:strm | strm nextPutAll: 'data', argMap first printString. + aSel keywords withIndexDo: [:key :ind | - aSel keywords doWithIndex: [:key :ind | strm nextPutAll: ' ',key. (key last == $:) | (key first isLetter not) ifTrue: [strm nextPutAll: ' data', (argMap at: ind+1) printString]]]) ]]]]]. ! Item was changed: ----- Method: SetInspector>>elementIndices (in category 'private') ----- elementIndices "In the set's internal array, extract the indices that point to actual elements." | numIndices | (numIndices := self objectSize) = 0 ifTrue: [^#()]. ^ Array new: numIndices streamContents: [:stream | + self object array withIndexDo: [:element :index | - self object array doWithIndex: [:element :index | (self isElementValid: element) ifTrue: [stream nextPut: index]]]! From commits at source.squeak.org Wed Oct 14 12:11:10 2020 From: commits at source.squeak.org (commits at source.squeak.org) Date: Wed, 14 Oct 2020 12:11:10 0000 Subject: [squeak-dev] The Trunk: ToolsTests-mt.100.mcz Message-ID: Marcel Taeumel uploaded a new version of ToolsTests to project The Trunk: http://source.squeak.org/trunk/ToolsTests-mt.100.mcz ==================== Summary ==================== Name: ToolsTests-mt.100 Author: mt Time: 14 October 2020, 2:11:09.641569 pm UUID: 524dc727-12cc-8f48-88c1-850b45942bd1 Ancestors: ToolsTests-mt.99 Rename #doWithIndex: to #withIndexDo:. See http://forum.world.st/The-Inbox-60Deprecated-ct-80-mcz-td5120706.html =============== Diff against ToolsTests-mt.99 =============== Item was changed: ----- Method: ContextInspectorTest>>testValuePaneModify (in category 'tests') ----- testValuePaneModify "Try to change the values of all arguments and temporary variables. Check if the object-under-inspection receives those changes." | testObjectFound | testObjectFound := false. + self object tempNames withIndexDo: [:temp :index | - self object tempNames doWithIndex: [:temp :index | | prior current input | self inspector selectFieldSuchThat: [:field | field type = #tempVar and: [field key = temp]]. self assertFieldSelected: '*', temp, '*'. "allow bells and whistles" prior := self object namedTempAt: index. self assert: (prior isNumber or: [prior == InnerTestObject]). testObjectFound := testObjectFound or: [prior == InnerTestObject]. current := (prior isNumber ifTrue: [prior + 1] ifFalse: [#smith]). input := prior isNumber ifTrue: [self inspector contents, ' +1'] ifFalse: ['#smith']. self deny: current equals: (self object namedTempAt: index). self inValuePaneTypeAndAccept: input. self assert: current equals: (self object namedTempAt: index)]. self assert: testObjectFound.! From commits at source.squeak.org Wed Oct 14 12:11:42 2020 From: commits at source.squeak.org (commits at source.squeak.org) Date: Wed, 14 Oct 2020 12:11:42 0000 Subject: [squeak-dev] The Trunk: UpdateStream-mt.16.mcz Message-ID: Marcel Taeumel uploaded a new version of UpdateStream to project The Trunk: http://source.squeak.org/trunk/UpdateStream-mt.16.mcz ==================== Summary ==================== Name: UpdateStream-mt.16 Author: mt Time: 14 October 2020, 2:11:41.953569 pm UUID: 3dc17eeb-2350-6b4d-b994-1a500fd6f76b Ancestors: UpdateStream-mt.15 Rename #doWithIndex: to #withIndexDo:. See http://forum.world.st/The-Inbox-60Deprecated-ct-80-mcz-td5120706.html =============== Diff against UpdateStream-mt.15 =============== Item was changed: ----- Method: ServerDirectory>>putUpdateMulti:fromDirectory: (in category '*UpdateStream-updating') ----- putUpdateMulti: list fromDirectory: updateDirectory "Put these files out as an Update on the servers of my group. List is an array of local file names with or without number prefixes. Each version of the system has its own set of update files. 'updates.list' holds the master list. Each update is a fileIn whose name begins with a number. See Utilities class absorbUpdatesFromServer." | myServers updateStrm lastNum response newNames numStr indexPrefix version versIndex listContents | (self checkNames: (list collect: "Check the names without their numbers" [:each | each copyFrom: (each findFirst: [:c | c isDigit not]) to: each size])) ifFalse: [^ nil]. response := UIManager default chooseFrom: #('Install update' 'Cancel update') title: 'Do you really want to broadcast ', list size printString, ' updates', '\to every Squeak user who updates from ' withCRs, self groupName, '?'. response = 1 ifFalse: [^ nil]. "abort" self openGroup. indexPrefix := (self groupName includes: $*) ifTrue: [(self groupName findTokens: ' ') first] "special for internal updates" ifFalse: ['']. "normal" myServers := self checkServersWithPrefix: indexPrefix andParseListInto: [:x | listContents := x]. myServers size = 0 ifTrue: [self closeGroup. ^ self]. version := SystemVersion current version. versIndex := (listContents collect: [:pair | pair first]) indexOf: version. versIndex = 0 ifTrue: [self inform: 'There is no section in updates.list for your version'. self closeGroup. ^ nil]. "abort" lastNum := (listContents at: versIndex) last last initialIntegerOrNil. versIndex < listContents size ifTrue: [response := UIManager default chooseFrom: #('Make update for an older version' 'Cancel update') title: 'This system, ', SystemVersion current version, ' is not the latest version'. response = 1 ifFalse: [self closeGroup. ^ nil]. numStr := UIManager default request: 'Please confirm or change the starting update number' initialAnswer: (lastNum+1) printString. lastNum := numStr asNumber - 1]. "abort" "Save old copy of updates.list on local disk" FileDirectory default deleteFileNamed: indexPrefix , 'updates.list.bk'. UpdateStreamDownloader default writeList: listContents toStream: (FileStream fileNamed: indexPrefix , 'updates.list.bk'). "Append names to updates with new sequence numbers" newNames := list with: (lastNum+1 to: lastNum+list size) collect: [:each :num | | stripped seq | seq := num printString padded: #left to: 4 with: $0. "strip off any old seq number" stripped := each copyFrom: (each findFirst: [:c | c isDigit not]) to: each size. seq , stripped]. listContents at: versIndex put: {version. (listContents at: versIndex) second , newNames}. "Write a new copy on all servers..." updateStrm := ReadStream on: (String streamContents: [:s | UpdateStreamDownloader default writeList: listContents toStream: s]). myServers do: [:aServer | + list withIndexDo: [:local :ind | | file | - list doWithIndex: [:local :ind | | file | file := updateDirectory oldFileNamed: local. aServer putFile: file named: (newNames at: ind) retry: true. file close]. updateStrm reset. aServer putFile: updateStrm named: indexPrefix , 'updates.list' retry: true. Transcript show: 'Update succeeded on server ', aServer moniker; cr]. self closeGroup. Transcript cr; show: 'Be sure to test your new update!!'; cr. "rename the file locally" list with: newNames do: [:local :newName | updateDirectory rename: local toBe: newName]. ! From commits at source.squeak.org Wed Oct 14 12:21:36 2020 From: commits at source.squeak.org (commits at source.squeak.org) Date: Wed, 14 Oct 2020 12:21:36 0000 Subject: [squeak-dev] The Trunk: Collections-mt.918.mcz Message-ID: Marcel Taeumel uploaded a new version of Collections to project The Trunk: http://source.squeak.org/trunk/Collections-mt.918.mcz ==================== Summary ==================== Name: Collections-mt.918 Author: mt Time: 14 October 2020, 2:21:33.964569 pm UUID: 10f6e12c-527a-6242-8ce7-0a5c2476483d Ancestors: Collections-mt.917 (Softly) deprecate #doWithIndex: and #collectWithIndex:. =============== Diff against Collections-mt.917 =============== Item was removed: - ----- Method: HashedCollection>>doWithIndex: (in category 'enumerating') ----- - doWithIndex: elementAndIndexBlock - "Use the new version with consistent naming" - ^ self withIndexDo: elementAndIndexBlock! Item was removed: - ----- Method: SequenceableCollection>>collectWithIndex: (in category 'enumerating') ----- - collectWithIndex: elementAndIndexBlock - "Use the new version with consistent naming" - ^ self withIndexCollect: elementAndIndexBlock! Item was removed: - ----- Method: SequenceableCollection>>doWithIndex: (in category 'enumerating') ----- - doWithIndex: elementAndIndexBlock - "Use the new version with consistent naming" - ^ self withIndexDo: elementAndIndexBlock! From commits at source.squeak.org Wed Oct 14 12:22:02 2020 From: commits at source.squeak.org (commits at source.squeak.org) Date: Wed, 14 Oct 2020 12:22:02 0000 Subject: [squeak-dev] The Trunk: 60Deprecated-mt.81.mcz Message-ID: Marcel Taeumel uploaded a new version of 60Deprecated to project The Trunk: http://source.squeak.org/trunk/60Deprecated-mt.81.mcz ==================== Summary ==================== Name: 60Deprecated-mt.81 Author: mt Time: 14 October 2020, 2:22:01.292569 pm UUID: a2fefed6-c5dc-564a-9091-6e4d1d8ca3f8 Ancestors: 60Deprecated-mt.80 Complements Collections-mt.918 =============== Diff against 60Deprecated-mt.80 =============== Item was added: + ----- Method: HashedCollection>>doWithIndex: (in category '*60Deprecated-enumerating') ----- + doWithIndex: elementAndIndexBlock + + self flag: #deprecated. "Use the new version with consistent naming." + ^ self withIndexDo: elementAndIndexBlock! Item was added: + ----- Method: SequenceableCollection>>collectWithIndex: (in category '*60Deprecated-enumerating') ----- + collectWithIndex: elementAndIndexBlock + + self flag: #deprecated. "Use the new version with consistent naming." + ^ self withIndexCollect: elementAndIndexBlock! Item was added: + ----- Method: SequenceableCollection>>doWithIndex: (in category '*60Deprecated-enumerating') ----- + doWithIndex: elementAndIndexBlock + + self flag: #deprecated. "Use the new version with consistent naming." + ^ self withIndexDo: elementAndIndexBlock! From commits at source.squeak.org Wed Oct 14 12:22:35 2020 From: commits at source.squeak.org (commits at source.squeak.org) Date: Wed, 14 Oct 2020 12:22:35 0000 Subject: [squeak-dev] The Trunk: CollectionsTests-mt.346.mcz Message-ID: Marcel Taeumel uploaded a new version of CollectionsTests to project The Trunk: http://source.squeak.org/trunk/CollectionsTests-mt.346.mcz ==================== Summary ==================== Name: CollectionsTests-mt.346 Author: mt Time: 14 October 2020, 2:22:33.878569 pm UUID: 4272e57f-18b8-2946-9034-cec8b9a87451 Ancestors: CollectionsTests-mt.345 Complements Collections-mt.918 =============== Diff against CollectionsTests-mt.345 =============== Item was added: + ----- Method: SequenceableCollectionTest>>testCollectWithIndexDeprecation (in category 'tests - deprecation') ----- + testCollectWithIndexDeprecation + + self assert: 1 equals: (self systemNavigation allCallsOn: #collectWithIndex:) size.! Item was added: + ----- Method: SequenceableCollectionTest>>testDoWithIndexDeprecation (in category 'tests - deprecation') ----- + testDoWithIndexDeprecation + + self assert: 1 equals: (self systemNavigation allCallsOn: #doWithIndex:) size.! From marcel.taeumel at hpi.de Wed Oct 14 13:03:43 2020 From: marcel.taeumel at hpi.de (Marcel Taeumel) Date: Wed, 14 Oct 2020 15:03:43 +0200 Subject: [squeak-dev] The Trunk: Kernel-eem.1351.mcz In-Reply-To: References: <1DA107F2-08F7-40D6-AE23-D7B2197DCB57@rowledge.org> Message-ID: Hmm... fresh paint stinks, right? So WindowEventPaint and WindowEventStinks were related then. :-D Best, Marcel Am 13.10.2020 22:28:28 schrieb Eliot Miranda : On Tue, Oct 13, 2020 at 10:10 AM tim Rowledge wrote: > On 2020-10-12, at 10:01 PM, commits at source.squeak.org [mailto:commits at source.squeak.org] wrote: > > Rename EventSensorConstants WindowEventStinks to WindowEventScreenChange Dude! No fair! That is a crucial aspect of the system design that hasn't been altered since '04. :) :) :) :)  I wuz just proving that peeps do read that shit... tim -- tim Rowledge; tim at rowledge.org [mailto:tim at rowledge.org]; http://www.rowledge.org/tim [http://www.rowledge.org/tim] Strange OpCodes: BLI: Branch and Loop Infinite _,,,^..^,,,_ best, Eliot -------------- next part -------------- An HTML attachment was scrubbed... URL: From marcel.taeumel at hpi.de Wed Oct 14 13:06:28 2020 From: marcel.taeumel at hpi.de (Marcel Taeumel) Date: Wed, 14 Oct 2020 15:06:28 +0200 Subject: [squeak-dev] The Trunk: Tools-eem.999.mcz In-Reply-To: References: <7d0cf2956e4b4917a28aeb03fb1ce6d9@student.hpi.uni-potsdam.de> Message-ID: Hi Eliot. > why do we have to make the setting explicit in ReleaseBuilder The alternative would be to implement #cleanUp(:) and clear out that variable. Sure. Your call :-) Best, Marcel Am 13.10.2020 22:23:36 schrieb Eliot Miranda : Hi Marcel, On Tue, Oct 13, 2020 at 8:00 AM Marcel Taeumel wrote: Don't forget to set the default value in ReleaseBuilder class >> #setPreferences. If the default is unchanged, and the default value is nil, why do we have to make the setting explicit in ReleaseBuilder?  isn't there a case for having ReleaseBuilder e.g. examine all preferences stored in class vars, and simply set these class vars to nil? Best, Marcel Am 13.10.2020 16:58:48 schrieb Eliot Miranda : On Oct 13, 2020, at 7:30 AM, Thiede, Christoph wrote:  Personally, I neither need nor dislike such a preference, but actually, I turned mustDeclareVariables off a small number of times for a single workspace in past. The reason was that if you use a workspace to prepare some "production" code, it beguiles you into missing some variable declarations, in particular inside of blocks, making you overlooking any unintended closure/process interconnections that do not work in actual production. I often fill a workspace with several snippets that I plan to compile into different methods. The workspace bindings add a global namespace between these snippets that does not always exist when compiling the methods at different places. Also, one might consider it as inconvenient that every mistyped doit creates a new binding but you cannot remove this binding again without opening the window menu which interrupts the usual scripting workflow ... However, I don't see the harm of such a preference, and I welcome adding a reasonable number of preferences whenever this can help anyone of the community to make Squeak even more convenient for yourself. We don't need to integrate every preference into the wizard, though :-) +3 :-). Best, Christoph Von: Squeak-dev im Auftrag von Taeumel, Marcel Gesendet: Dienstag, 13. Oktober 2020 15:22:48 An: squeak-dev Betreff: Re: [squeak-dev] The Trunk: Tools-eem.999.mcz   Huh? Why should anybody want to turn this off? It should always be possible to evaluate "x := 5" and then use "x" in a Workspace. It would be really cumbersome if one always had to evaluate the entire workspace and also write those || declarations on the top. Please ... :-( Please elaborate. Why does this feature hinders your working habits? You can always evaluate the entire workspace. This just seems like a preference that would annoy people if not set correctly. Why do you want to prevent "x := 5" evaluation. I don't understand. Why can that be dangerous? -1 for such a preference. But I could live with it. ;-) Best, Marcel Am 12.10.2020 20:00:28 schrieb commits at source.squeak.org [mailto:commits at source.squeak.org] : Eliot Miranda uploaded a new version of Tools to project The Trunk: http://source.squeak.org/trunk/Tools-eem.999.mcz [http://source.squeak.org/trunk/Tools-eem.999.mcz] ==================== Summary ==================== Name: Tools-eem.999 Author: eem Time: 12 October 2020, 11:00:17.202907 am UUID: 53fd9116-3cf5-43db-ad0d-150e7f41efd3 Ancestors: Tools-mt.998 Add a preference for automatic variable declaration in a Workspace (true by default). Many people love this feature; I hate it :-) =============== Diff against Tools-mt.998 =============== Item was changed: StringHolder subclass: #Workspace instanceVariableNames: 'bindings acceptDroppedMorphs acceptAction mustDeclareVariables shouldStyle environment' + classVariableNames: 'DeclareVariablesAutomatically LookupPools ShouldStyle' - classVariableNames: 'LookupPools ShouldStyle' poolDictionaries: '' category: 'Tools-Base'! !Workspace commentStamp: 'fbs 6/2/2012 20:46' prior: 0! A Workspace is a text area plus a lot of support for executable code. It is a great place to execute top-level commands to compute something useful, and it is a great place to develop bits of a program before those bits get put into class methods. To open a new workspace, execute: Workspace open A workspace can have its own variables, called "workspace variables", to hold intermediate results. For example, if you type into a workspace "x := 5" and do-it, then later you could type in "y := x * 2" and y would become 10. Additionally, in Morphic, a workspace can gain access to morphs that are on the screen. If acceptDroppedMorphs is turned on, then whenever a morph is dropped on the workspace, a variable will be created which references that morph. This functionality is toggled with the window-wide menu of a workspace. The instance variables of this class are: bindings - holds the workspace variables for this workspace acceptDroppedMorphs - whether dropped morphs should create new variables! Item was added: + ----- Method: Workspace class>>declareVariablesAutomatically (in category 'preferences') ----- + declareVariablesAutomatically + + category: 'browsing' + description: 'If true, workspaces automatically create variables.' + type: #Boolean> + ^DeclareVariablesAutomatically ifNil: [true]! Item was added: + ----- Method: Workspace class>>declareVariablesAutomatically: (in category 'preferences') ----- + declareVariablesAutomatically: aBoolean + DeclareVariablesAutomatically := aBoolean! Item was changed: ----- Method: Workspace>>initialize (in category 'initialize-release') ----- initialize super initialize. self initializeBindings. acceptDroppedMorphs := false. + mustDeclareVariables := self class declareVariablesAutomatically not. + environment := Environment current! - mustDeclareVariables := false. - environment := Environment current.! Item was changed: ----- Method: Workspace>>mustDeclareVariableWording (in category 'variable declarations') ----- mustDeclareVariableWording + ^(mustDeclareVariables + ifFalse: [' automatically create variable declaration'] + ifTrue: [' automatically create variable declaration']) translated! - ^ mustDeclareVariables not - ifTrue: [' automatically create variable declaration' translated] - ifFalse: [' automatically create variable declaration' translated]! -- _,,,^..^,,,_ best, Eliot -------------- next part -------------- An HTML attachment was scrubbed... URL: From marcel.taeumel at hpi.de Wed Oct 14 13:07:45 2020 From: marcel.taeumel at hpi.de (Marcel Taeumel) Date: Wed, 14 Oct 2020 15:07:45 +0200 Subject: [squeak-dev] The Trunk: Tools-eem.999.mcz In-Reply-To: References: <7d0cf2956e4b4917a28aeb03fb1ce6d9@student.hpi.uni-potsdam.de> Message-ID: HI Eliot. > isn't there a case for having ReleaseBuilder e.g. examine all preferences stored in class vars, and simply set these class vars to nil? Sorry, I hit "send" to soon. Yes, your proposal sounds better. I will add that to the ReleaseBuilder. Best, Marcel Am 14.10.2020 15:06:28 schrieb Marcel Taeumel : Hi Eliot. > why do we have to make the setting explicit in ReleaseBuilder The alternative would be to implement #cleanUp(:) and clear out that variable. Sure. Your call :-) Best, Marcel Am 13.10.2020 22:23:36 schrieb Eliot Miranda : Hi Marcel, On Tue, Oct 13, 2020 at 8:00 AM Marcel Taeumel wrote: Don't forget to set the default value in ReleaseBuilder class >> #setPreferences. If the default is unchanged, and the default value is nil, why do we have to make the setting explicit in ReleaseBuilder?  isn't there a case for having ReleaseBuilder e.g. examine all preferences stored in class vars, and simply set these class vars to nil? Best, Marcel Am 13.10.2020 16:58:48 schrieb Eliot Miranda : On Oct 13, 2020, at 7:30 AM, Thiede, Christoph wrote:  Personally, I neither need nor dislike such a preference, but actually, I turned mustDeclareVariables off a small number of times for a single workspace in past. The reason was that if you use a workspace to prepare some "production" code, it beguiles you into missing some variable declarations, in particular inside of blocks, making you overlooking any unintended closure/process interconnections that do not work in actual production. I often fill a workspace with several snippets that I plan to compile into different methods. The workspace bindings add a global namespace between these snippets that does not always exist when compiling the methods at different places. Also, one might consider it as inconvenient that every mistyped doit creates a new binding but you cannot remove this binding again without opening the window menu which interrupts the usual scripting workflow ... However, I don't see the harm of such a preference, and I welcome adding a reasonable number of preferences whenever this can help anyone of the community to make Squeak even more convenient for yourself. We don't need to integrate every preference into the wizard, though :-) +3 :-). Best, Christoph Von: Squeak-dev im Auftrag von Taeumel, Marcel Gesendet: Dienstag, 13. Oktober 2020 15:22:48 An: squeak-dev Betreff: Re: [squeak-dev] The Trunk: Tools-eem.999.mcz   Huh? Why should anybody want to turn this off? It should always be possible to evaluate "x := 5" and then use "x" in a Workspace. It would be really cumbersome if one always had to evaluate the entire workspace and also write those || declarations on the top. Please ... :-( Please elaborate. Why does this feature hinders your working habits? You can always evaluate the entire workspace. This just seems like a preference that would annoy people if not set correctly. Why do you want to prevent "x := 5" evaluation. I don't understand. Why can that be dangerous? -1 for such a preference. But I could live with it. ;-) Best, Marcel Am 12.10.2020 20:00:28 schrieb commits at source.squeak.org [mailto:commits at source.squeak.org] : Eliot Miranda uploaded a new version of Tools to project The Trunk: http://source.squeak.org/trunk/Tools-eem.999.mcz [http://source.squeak.org/trunk/Tools-eem.999.mcz] ==================== Summary ==================== Name: Tools-eem.999 Author: eem Time: 12 October 2020, 11:00:17.202907 am UUID: 53fd9116-3cf5-43db-ad0d-150e7f41efd3 Ancestors: Tools-mt.998 Add a preference for automatic variable declaration in a Workspace (true by default). Many people love this feature; I hate it :-) =============== Diff against Tools-mt.998 =============== Item was changed: StringHolder subclass: #Workspace instanceVariableNames: 'bindings acceptDroppedMorphs acceptAction mustDeclareVariables shouldStyle environment' + classVariableNames: 'DeclareVariablesAutomatically LookupPools ShouldStyle' - classVariableNames: 'LookupPools ShouldStyle' poolDictionaries: '' category: 'Tools-Base'! !Workspace commentStamp: 'fbs 6/2/2012 20:46' prior: 0! A Workspace is a text area plus a lot of support for executable code. It is a great place to execute top-level commands to compute something useful, and it is a great place to develop bits of a program before those bits get put into class methods. To open a new workspace, execute: Workspace open A workspace can have its own variables, called "workspace variables", to hold intermediate results. For example, if you type into a workspace "x := 5" and do-it, then later you could type in "y := x * 2" and y would become 10. Additionally, in Morphic, a workspace can gain access to morphs that are on the screen. If acceptDroppedMorphs is turned on, then whenever a morph is dropped on the workspace, a variable will be created which references that morph. This functionality is toggled with the window-wide menu of a workspace. The instance variables of this class are: bindings - holds the workspace variables for this workspace acceptDroppedMorphs - whether dropped morphs should create new variables! Item was added: + ----- Method: Workspace class>>declareVariablesAutomatically (in category 'preferences') ----- + declareVariablesAutomatically + + category: 'browsing' + description: 'If true, workspaces automatically create variables.' + type: #Boolean> + ^DeclareVariablesAutomatically ifNil: [true]! Item was added: + ----- Method: Workspace class>>declareVariablesAutomatically: (in category 'preferences') ----- + declareVariablesAutomatically: aBoolean + DeclareVariablesAutomatically := aBoolean! Item was changed: ----- Method: Workspace>>initialize (in category 'initialize-release') ----- initialize super initialize. self initializeBindings. acceptDroppedMorphs := false. + mustDeclareVariables := self class declareVariablesAutomatically not. + environment := Environment current! - mustDeclareVariables := false. - environment := Environment current.! Item was changed: ----- Method: Workspace>>mustDeclareVariableWording (in category 'variable declarations') ----- mustDeclareVariableWording + ^(mustDeclareVariables + ifFalse: [' automatically create variable declaration'] + ifTrue: [' automatically create variable declaration']) translated! - ^ mustDeclareVariables not - ifTrue: [' automatically create variable declaration' translated] - ifFalse: [' automatically create variable declaration' translated]! -- _,,,^..^,,,_ best, Eliot -------------- next part -------------- An HTML attachment was scrubbed... URL: From Christoph.Thiede at student.hpi.uni-potsdam.de Wed Oct 14 13:30:41 2020 From: Christoph.Thiede at student.hpi.uni-potsdam.de (Thiede, Christoph) Date: Wed, 14 Oct 2020 13:30:41 +0000 Subject: [squeak-dev] The Trunk: 60Deprecated-mt.81.mcz In-Reply-To: References: Message-ID: <14a3d844987c473089b59e2a188cb4ba@student.hpi.uni-potsdam.de> Why can't we "hard deprecate" this instead of using a flag only? :-) Best, Christoph ________________________________ Von: Squeak-dev im Auftrag von commits at source.squeak.org Gesendet: Mittwoch, 14. Oktober 2020 14:22:02 An: squeak-dev at lists.squeakfoundation.org; packages at lists.squeakfoundation.org Betreff: [squeak-dev] The Trunk: 60Deprecated-mt.81.mcz Marcel Taeumel uploaded a new version of 60Deprecated to project The Trunk: http://source.squeak.org/trunk/60Deprecated-mt.81.mcz ==================== Summary ==================== Name: 60Deprecated-mt.81 Author: mt Time: 14 October 2020, 2:22:01.292569 pm UUID: a2fefed6-c5dc-564a-9091-6e4d1d8ca3f8 Ancestors: 60Deprecated-mt.80 Complements Collections-mt.918 =============== Diff against 60Deprecated-mt.80 =============== Item was added: + ----- Method: HashedCollection>>doWithIndex: (in category '*60Deprecated-enumerating') ----- + doWithIndex: elementAndIndexBlock + + self flag: #deprecated. "Use the new version with consistent naming." + ^ self withIndexDo: elementAndIndexBlock! Item was added: + ----- Method: SequenceableCollection>>collectWithIndex: (in category '*60Deprecated-enumerating') ----- + collectWithIndex: elementAndIndexBlock + + self flag: #deprecated. "Use the new version with consistent naming." + ^ self withIndexCollect: elementAndIndexBlock! Item was added: + ----- Method: SequenceableCollection>>doWithIndex: (in category '*60Deprecated-enumerating') ----- + doWithIndex: elementAndIndexBlock + + self flag: #deprecated. "Use the new version with consistent naming." + ^ self withIndexDo: elementAndIndexBlock! -------------- next part -------------- An HTML attachment was scrubbed... URL: From commits at source.squeak.org Wed Oct 14 13:41:15 2020 From: commits at source.squeak.org (commits at source.squeak.org) Date: Wed, 14 Oct 2020 13:41:15 0000 Subject: [squeak-dev] The Trunk: Tests-mt.442.mcz Message-ID: Marcel Taeumel uploaded a new version of Tests to project The Trunk: http://source.squeak.org/trunk/Tests-mt.442.mcz ==================== Summary ==================== Name: Tests-mt.442 Author: mt Time: 14 October 2020, 3:41:13.254983 pm UUID: 305f76ef-bf52-6d46-b99b-fa02f0bd8ed5 Ancestors: Tests-mt.441 Update test example of a pragma preference to follow the usual guidelines. =============== Diff against Tests-mt.441 =============== Item was changed: ----- Method: PreferencesTestExample class>>booleanPref (in category 'preferences') ----- booleanPref >booleanPref)' type: #Boolean> + ^BooleanPref ifNil: [true]! - ^BooleanPref! Item was changed: ----- Method: PreferencesTestExample class>>colorPref (in category 'preferences') ----- colorPref >colorPref)' type: #Color> + ^ColorPref ifNil: [Color green]! - ^ColorPref! Item was removed: - ----- Method: PreferencesTestExample class>>initialize (in category 'preferences') ----- - initialize "PreferenceExample initialize" - "Initialize the default values and register preferences" - TextPref := 'Hello World'. - NumericPref := 1234. - BooleanPref := true. - ColorPref := Color green.! Item was changed: ----- Method: PreferencesTestExample class>>numericPref (in category 'preferences') ----- numericPref >numericPref)' type: #Number> + ^NumericPref ifNil: [1234]! - ^NumericPref! Item was changed: ----- Method: PreferencesTestExample class>>textPref (in category 'preferences') ----- textPref >textPref)' type: #String> + ^TextPref ifNil: ['Hello world']! - ^TextPref! From Das.Linux at gmx.de Wed Oct 14 13:44:45 2020 From: Das.Linux at gmx.de (Tobias Pape) Date: Wed, 14 Oct 2020 15:44:45 +0200 Subject: [squeak-dev] The Trunk: 60Deprecated-mt.81.mcz In-Reply-To: <14a3d844987c473089b59e2a188cb4ba@student.hpi.uni-potsdam.de> References: <14a3d844987c473089b59e2a188cb4ba@student.hpi.uni-potsdam.de> Message-ID: > On 14.10.2020, at 15:30, Thiede, Christoph wrote: > > Why can't we "hard deprecate" this instead of using a flag only? :-) cause old code will bail. Best regards -Tobias > > Best, > Christoph > Von: Squeak-dev im Auftrag von commits at source.squeak.org > Gesendet: Mittwoch, 14. Oktober 2020 14:22:02 > An: squeak-dev at lists.squeakfoundation.org; packages at lists.squeakfoundation.org > Betreff: [squeak-dev] The Trunk: 60Deprecated-mt.81.mcz > > Marcel Taeumel uploaded a new version of 60Deprecated to project The Trunk: > http://source.squeak.org/trunk/60Deprecated-mt.81.mcz > > ==================== Summary ==================== > > Name: 60Deprecated-mt.81 > Author: mt > Time: 14 October 2020, 2:22:01.292569 pm > UUID: a2fefed6-c5dc-564a-9091-6e4d1d8ca3f8 > Ancestors: 60Deprecated-mt.80 > > Complements Collections-mt.918 > > =============== Diff against 60Deprecated-mt.80 =============== > > Item was added: > + ----- Method: HashedCollection>>doWithIndex: (in category '*60Deprecated-enumerating') ----- > + doWithIndex: elementAndIndexBlock > + > + self flag: #deprecated. "Use the new version with consistent naming." > + ^ self withIndexDo: elementAndIndexBlock! > > Item was added: > + ----- Method: SequenceableCollection>>collectWithIndex: (in category '*60Deprecated-enumerating') ----- > + collectWithIndex: elementAndIndexBlock > + > + self flag: #deprecated. "Use the new version with consistent naming." > + ^ self withIndexCollect: elementAndIndexBlock! > > Item was added: > + ----- Method: SequenceableCollection>>doWithIndex: (in category '*60Deprecated-enumerating') ----- > + doWithIndex: elementAndIndexBlock > + > + self flag: #deprecated. "Use the new version with consistent naming." > + ^ self withIndexDo: elementAndIndexBlock! From marcel.taeumel at hpi.de Wed Oct 14 15:03:06 2020 From: marcel.taeumel at hpi.de (Marcel Taeumel) Date: Wed, 14 Oct 2020 17:03:06 +0200 Subject: [squeak-dev] Proposal | Resetting pragma preferences via 'nil' or #reset... message Message-ID: Hi all! Please find attached a change set that will implement #restoreDefaultValue on PragmaPreference looking for an optional #reset... message or just setting the preference to 'nil' and hoping for the best. I added #reset... methods for all pragma preferences that do either (a) not support 'nil' or (b) do costly update stuff. In the ReleaseBuilder, I opted for resetting all preferences as early as possible. Can I put this in the Trunk? :-) Best, Marcel -------------- next part -------------- An HTML attachment was scrubbed... URL: -------------- next part -------------- An embedded and charset-unspecified text was scrubbed... Name: pragma-cleanup.1.cs URL: From craig at blackpagedigital.com Wed Oct 14 17:26:10 2020 From: craig at blackpagedigital.com (Craig Latta) Date: Wed, 14 Oct 2020 10:26:10 -0700 Subject: [squeak-dev] The Trunk: Kernel-eem.1351.mcz In-Reply-To: References: <1DA107F2-08F7-40D6-AE23-D7B2197DCB57@rowledge.org> Message-ID: <7a750a53-1311-6c88-ee98-3f61b3780fbf@blackpagedigital.com> https://2.bp.blogspot.com/-nrM5BrNbi3Q/UVMSCv5cGrI/AAAAAAAADF4/CdbDEL43f2k/s1600/PeepsReading.jpg -C *** On 13/10/20 13:28, Eliot Miranda wrote: > On Tue, Oct 13, 2020 at 10:10 AM tim Rowledge > wrote: > > > > > On 2020-10-12, at 10:01 PM, commits at source.squeak.org > wrote: > > > > Rename EventSensorConstants WindowEventStinks to > WindowEventScreenChange > > Dude! No fair! That is a crucial aspect of the system design that > hasn't been altered since '04. > > > :) :) :) :) I wuz just proving that peeps do read that shit... > > tim > -- > tim Rowledge; tim at rowledge.org ; > http://www.rowledge.org/tim > Strange OpCodes: BLI: Branch and Loop Infinite > > > _,,,^..^,,,_ > best, Eliot -- Craig Latta :: research computer scientist Black Page Digital :: Berkeley, California 663137D7940BF5C0AFC 1349FB2ADA32C4D5314CE From tim at rowledge.org Wed Oct 14 18:27:51 2020 From: tim at rowledge.org (tim Rowledge) Date: Wed, 14 Oct 2020 11:27:51 -0700 Subject: [squeak-dev] The Trunk: Kernel-eem.1351.mcz In-Reply-To: References: <1DA107F2-08F7-40D6-AE23-D7B2197DCB57@rowledge.org> Message-ID: <36721984-F1E3-4F7F-A674-CD4DE41DC943@rowledge.org> > On 2020-10-14, at 6:03 AM, Marcel Taeumel wrote: > > Hmm... fresh paint stinks, right? So WindowEventPaint and WindowEventStinks were related then. :-D Exactly. It really was a little easter egg to see if anyone would ever read the code; when John & I originally wrote it we suspected that despite all the claims of "we must have host windows!" nobody would ever use it. In the slightly more serious end of this conversation, I would like to think that we can completely dump the 'main window' concept from the core VM code and only open a window when the image wants one. I can't see why we would want to save window dimensions in the image header rather than just having the image work it out at window-opening time. tim -- tim Rowledge; tim at rowledge.org; http://www.rowledge.org/tim Useful random insult:- His shared libraries aren't installed. From eliot.miranda at gmail.com Wed Oct 14 18:32:25 2020 From: eliot.miranda at gmail.com (Eliot Miranda) Date: Wed, 14 Oct 2020 11:32:25 -0700 Subject: [squeak-dev] Proposal | Resetting pragma preferences via 'nil' or #reset... message In-Reply-To: References: Message-ID: On Wed, Oct 14, 2020 at 8:03 AM Marcel Taeumel wrote: > Hi all! > > Please find attached a change set that will implement #restoreDefaultValue > on PragmaPreference looking for an optional #reset... message or just > setting the preference to 'nil' and hoping for the best. > > I added #reset... methods for all pragma preferences that do either (a) > not support 'nil' or (b) do costly update stuff. > > In the ReleaseBuilder, I opted for resetting all preferences as early as > possible. > > Can I put this in the Trunk? :-) > Yes, but only if you remove all those stylings ;-) I don't want y changes file filling up with junk that will be auto-styled over :-) _,,,^..^,,,_ best, Eliot -------------- next part -------------- An HTML attachment was scrubbed... URL: From eliot.miranda at gmail.com Wed Oct 14 18:41:59 2020 From: eliot.miranda at gmail.com (Eliot Miranda) Date: Wed, 14 Oct 2020 11:41:59 -0700 Subject: [squeak-dev] The Trunk: Kernel-eem.1351.mcz In-Reply-To: <36721984-F1E3-4F7F-A674-CD4DE41DC943@rowledge.org> References: <1DA107F2-08F7-40D6-AE23-D7B2197DCB57@rowledge.org> <36721984-F1E3-4F7F-A674-CD4DE41DC943@rowledge.org> Message-ID: Hi Tim, On Wed, Oct 14, 2020 at 11:28 AM tim Rowledge wrote: > > > > On 2020-10-14, at 6:03 AM, Marcel Taeumel wrote: > > > > Hmm... fresh paint stinks, right? So WindowEventPaint and > WindowEventStinks were related then. :-D > > Exactly. > > It really was a little easter egg to see if anyone would ever read the > code; when John & I originally wrote it we suspected that despite all the > claims of "we must have host windows!" nobody would ever use it. > > In the slightly more serious end of this conversation, I would like to > think that we can completely dump the 'main window' concept from the core > VM code and only open a window when the image wants one. I can't see why we > would want to save window dimensions in the image header rather than just > having the image work it out at window-opening time. > Wouldn't we all. But it ain't that trivial given the desire to maintain backward compatibility in the VM. See this thread: http://forum.world.st/Installing-high-dpi-support-and-backwards-compatibility-of-the-VM-tc5123176.html _,,,^..^,,,_ best, Eliot -------------- next part -------------- An HTML attachment was scrubbed... URL: From tim at rowledge.org Thu Oct 15 03:50:48 2020 From: tim at rowledge.org (tim Rowledge) Date: Wed, 14 Oct 2020 20:50:48 -0700 Subject: [squeak-dev] The Trunk: Kernel-eem.1351.mcz In-Reply-To: References: <1DA107F2-08F7-40D6-AE23-D7B2197DCB57@rowledge.org> <36721984-F1E3-4F7F-A674-CD4DE41DC943@rowledge.org> Message-ID: <8F149770-27A4-4EE9-BC17-76504E9121A7@rowledge.org> > On 2020-10-14, at 11:41 AM, Eliot Miranda wrote: > But it ain't that trivial given the desire to maintain backward compatibility in the VM. See this thread: http://forum.world.st/Installing-high-dpi-support-and-backwards-compatibility-of-the-VM-tc5123176.html Yeah, it's a mess and has been a mess since 1996. For RISC OS right from the beginning I only created a window when something actually wrote to the display, a sequence that appears to be rooted in ioShowDisplay(). Creating the window in the ioSizeOfWindow() seems a bit premature but I do vaguely recall we had a lot of 'fun' with the strictures of the various platforms of those ancient days - at one era Windows had to have an actual window in order to be able to get any events at all, I think. I know that it is/was possible to make a unix vm that acted the same as RISC OS because that's what I did when I spent some time at DEC WRL working for Alan and built the 'Itsy' VM for Disney. Or... something like that; complicated. I imagine we could leave most of the old behaviour alone for a while in the VM (maybe with a bit of simplifying?) and start having the image take more responsibility for finding the desired and required screen metrics with appropriate platform calls and then use the HostWindowPlugin to make the window if an when required. Would that satisfy enough backwards compatibility for everyone? We could include the actual desired window origin as well as size, something that has always annoyed me to have lacking. Finding the full display metrics in one go instead of a scattered bunch of prims might be nice; we could even return an array of metrics to handle multiple displays. tim -- tim Rowledge; tim at rowledge.org; http://www.rowledge.org/tim Useful random insult:- If what you don't know can't hurt you, she's practically invulnerable. From marcel.taeumel at hpi.de Thu Oct 15 10:59:57 2020 From: marcel.taeumel at hpi.de (Marcel Taeumel) Date: Thu, 15 Oct 2020 12:59:57 +0200 Subject: [squeak-dev] Proposal | Resetting pragma preferences via 'nil' or #reset... message In-Reply-To: References: Message-ID: Hmm... not sure how that happened. Maybe because I did that from a Vivide image. Well, no worries. I will use a fresh Trunk image as catalyst. :-) Best, Marcel Am 14.10.2020 20:32:49 schrieb Eliot Miranda : On Wed, Oct 14, 2020 at 8:03 AM Marcel Taeumel wrote: Hi all! Please find attached a change set that will implement #restoreDefaultValue on PragmaPreference looking for an optional #reset... message or just setting the preference to 'nil' and hoping for the best. I added #reset... methods for all pragma preferences that do either (a) not support 'nil' or (b) do costly update stuff. In the ReleaseBuilder, I opted for resetting all preferences as early as possible. Can I put this in the Trunk? :-) Yes, but only if you remove all those stylings ;-)  I don't want y changes file filling up with junk that will be auto-styled over :-) _,,,^..^,,,_ best, Eliot -------------- next part -------------- An HTML attachment was scrubbed... URL: From marcel.taeumel at hpi.de Thu Oct 15 11:27:00 2020 From: marcel.taeumel at hpi.de (Marcel Taeumel) Date: Thu, 15 Oct 2020 13:27:00 +0200 Subject: [squeak-dev] Proposal | Resetting pragma preferences via 'nil' or #reset... message In-Reply-To: References: Message-ID: New day, new thoughts on this matter. I don't think that having extra #reset... messages for pragma preferences is necessary. The getter as "ifNil" and so should the setter support a 'nil' argument to reset. I will update those remaining 20% of setters to support 'nil' as argument. Best, Marcel Am 15.10.2020 12:59:57 schrieb Marcel Taeumel : Hmm... not sure how that happened. Maybe because I did that from a Vivide image. Well, no worries. I will use a fresh Trunk image as catalyst. :-) Best, Marcel Am 14.10.2020 20:32:49 schrieb Eliot Miranda : On Wed, Oct 14, 2020 at 8:03 AM Marcel Taeumel wrote: Hi all! Please find attached a change set that will implement #restoreDefaultValue on PragmaPreference looking for an optional #reset... message or just setting the preference to 'nil' and hoping for the best. I added #reset... methods for all pragma preferences that do either (a) not support 'nil' or (b) do costly update stuff. In the ReleaseBuilder, I opted for resetting all preferences as early as possible. Can I put this in the Trunk? :-) Yes, but only if you remove all those stylings ;-)  I don't want y changes file filling up with junk that will be auto-styled over :-) _,,,^..^,,,_ best, Eliot -------------- next part -------------- An HTML attachment was scrubbed... URL: From commits at source.squeak.org Thu Oct 15 12:23:36 2020 From: commits at source.squeak.org (commits at source.squeak.org) Date: Thu, 15 Oct 2020 12:23:36 0000 Subject: [squeak-dev] The Trunk: System-mt.1180.mcz Message-ID: Marcel Taeumel uploaded a new version of System to project The Trunk: http://source.squeak.org/trunk/System-mt.1180.mcz ==================== Summary ==================== Name: System-mt.1180 Author: mt Time: 15 October 2020, 2:23:31.928368 pm UUID: 25a53f29-0b97-c54a-a1f9-e19fed013518 Ancestors: System-mt.1179 Enables restoring of default values for pragma preferences. Fixes pref-setters that do not support 'nil' argument. Note that now both pref-getter and pref-setter have this 'nil' contract. =============== Diff against System-mt.1179 =============== Item was changed: ----- Method: PragmaPreference>>restoreDefaultValue (in category 'initialization') ----- restoreDefaultValue + "Try to send a reset request to the preference provider by setting the preference value to 'nil' to exploit the usual ifNil-pattern in the pragma-preference's getter. + + Note that this reset is silent-by-design to be as fast as possible. If you want to send out notifications, try this: + self rawValue: self preferenceValue; notifyInformeeOfChange." + + [[self rawValue: nil] valueSupplyingAnswer: true] + ifError: [:msg | + Transcript + showln: 'Failed to reset pragma preference: ', provider printString, ' >> ', getter printString; + showln: msg].! - "Pragma preferences preserve their current value"! Item was changed: ----- Method: RecentMessages class>>numberOfRecentSubmissionsToStore: (in category 'preferences') ----- + numberOfRecentSubmissionsToStore: anIntegerOrNil + self default maximumSubmissionCount: (anIntegerOrNil ifNil: [30])! - numberOfRecentSubmissionsToStore: anInteger - self default maximumSubmissionCount: anInteger! From commits at source.squeak.org Thu Oct 15 12:24:30 2020 From: commits at source.squeak.org (commits at source.squeak.org) Date: Thu, 15 Oct 2020 12:24:30 0000 Subject: [squeak-dev] The Trunk: ReleaseBuilder-mt.212.mcz Message-ID: Marcel Taeumel uploaded a new version of ReleaseBuilder to project The Trunk: http://source.squeak.org/trunk/ReleaseBuilder-mt.212.mcz ==================== Summary ==================== Name: ReleaseBuilder-mt.212 Author: mt Time: 15 October 2020, 2:24:29.226368 pm UUID: fc86eeb0-8a62-e04d-ae69-f8d7753835f7 Ancestors: ReleaseBuilder-mt.211 Complements System-mt.1180. See http://forum.world.st/Proposal-Resetting-pragma-preferences-via-nil-or-reset-message-td5123490.html =============== Diff against ReleaseBuilder-mt.211 =============== Item was changed: ----- Method: ReleaseBuilder class>>clearCaches (in category 'scripts') ----- clearCaches "Clear caches, discard unused references, free space." "1) Explicit clean-up of FONT-related stuff." self cleanUpBitstreamVeraSans. StrikeFont initialize. "2) FIRST PHASE of explicit clean-up of CODE-related stuff." self discardUserObjects. MCFileBasedRepository flushAllCaches. "3) Now clean-up all STATE-related stuff." + Preferences chooseInitialSettings. Smalltalk cleanUp: true. "4) SECOND PHASE of explicit clean-up of CODE-related stuff. As late as possible to get rid of all references before running this." Smalltalk garbageCollect. Environment allInstancesDo: [:environment | environment purgeUndeclared ]. Undeclared removeUnreferencedKeys. ! From commits at source.squeak.org Thu Oct 15 12:25:50 2020 From: commits at source.squeak.org (commits at source.squeak.org) Date: Thu, 15 Oct 2020 12:25:50 0000 Subject: [squeak-dev] The Trunk: Chronology-Core-mt.62.mcz Message-ID: Marcel Taeumel uploaded a new version of Chronology-Core to project The Trunk: http://source.squeak.org/trunk/Chronology-Core-mt.62.mcz ==================== Summary ==================== Name: Chronology-Core-mt.62 Author: mt Time: 15 October 2020, 2:25:49.333368 pm UUID: c9779820-dc98-e54d-81b9-b8a19c29ce59 Ancestors: Chronology-Core-eem.61 Complements System-mt.1180. See http://forum.world.st/Proposal-Resetting-pragma-preferences-via-nil-or-reset-message-td5123490.html =============== Diff against Chronology-Core-eem.61 =============== Item was changed: ----- Method: DateAndTime class>>automaticTimezone: (in category 'preferences') ----- + automaticTimezone: aBooleanOrNil - automaticTimezone: aBoolean "Accessor for the system-wide preference. Note this gets disabled in localTimeZone: to make that override stick" + AutomaticTimezone := aBooleanOrNil. + self automaticTimezone ifTrue: [self now]. "fetch timezone immediately"! - AutomaticTimezone := aBoolean. - aBoolean ifTrue: [self now]. "fetch timezone immediately"! From commits at source.squeak.org Thu Oct 15 12:27:17 2020 From: commits at source.squeak.org (commits at source.squeak.org) Date: Thu, 15 Oct 2020 12:27:17 0000 Subject: [squeak-dev] The Trunk: Collections-mt.919.mcz Message-ID: Marcel Taeumel uploaded a new version of Collections to project The Trunk: http://source.squeak.org/trunk/Collections-mt.919.mcz ==================== Summary ==================== Name: Collections-mt.919 Author: mt Time: 15 October 2020, 2:27:14.853368 pm UUID: 13747fbe-9c7e-2341-9a7a-36420923d5f3 Ancestors: Collections-mt.918 Complements System-mt.1180. See http://forum.world.st/Proposal-Resetting-pragma-preferences-via-nil-or-reset-message-td5123490.html =============== Diff against Collections-mt.918 =============== Item was changed: ----- Method: TranscriptStream class>>redirectToStdOut: (in category 'preferences') ----- + redirectToStdOut: aBooleanOrNil - redirectToStdOut: aBoolean "In setting up redirection, first remove all dependents that are stdout, which may include stale files from the last session. Then add a dependency only if asked to redirect to stdout. Blithely doing Transcript removeDependent: FileStream stdout raises an error if stdout is unavailable." Transcript dependents do: [:dep| (dep isStream and: [dep name = #stdout]) ifTrue: [Transcript removeDependent: dep]]. + RedirectToStdOut := aBooleanOrNil. + self redirectToStdOut ifTrue: - (RedirectToStdOut := aBoolean) ifTrue: [Transcript addDependent: FileStream stdout]! From commits at source.squeak.org Thu Oct 15 12:28:09 2020 From: commits at source.squeak.org (commits at source.squeak.org) Date: Thu, 15 Oct 2020 12:28:09 0000 Subject: [squeak-dev] The Trunk: EToys-mt.409.mcz Message-ID: Marcel Taeumel uploaded a new version of EToys to project The Trunk: http://source.squeak.org/trunk/EToys-mt.409.mcz ==================== Summary ==================== Name: EToys-mt.409 Author: mt Time: 15 October 2020, 2:28:01.506368 pm UUID: 58099368-adbf-1843-a063-89749e36e463 Ancestors: EToys-mt.408 Complements System-mt.1180. See http://forum.world.st/Proposal-Resetting-pragma-preferences-via-nil-or-reset-message-td5123490.html =============== Diff against EToys-mt.408 =============== Item was changed: ----- Method: SugarNavigatorBar class>>showSugarNavigator: (in category 'preferences') ----- + showSugarNavigator: aBooleanOrNil - showSugarNavigator: aBoolean + ShowSugarNavigator := aBooleanOrNil. + Smalltalk + at: #TheWorldMainDockingBar + ifPresent: [:class | class showWorldMainDockingBar: self showSugarNavigator not]. - ShowSugarNavigator := aBoolean. - Smalltalk at: #TheWorldMainDockingBar ifPresent: [:class | class showWorldMainDockingBar: aBoolean not]. Project current updateLocaleDependents.! From commits at source.squeak.org Thu Oct 15 12:29:04 2020 From: commits at source.squeak.org (commits at source.squeak.org) Date: Thu, 15 Oct 2020 12:29:04 0000 Subject: [squeak-dev] The Trunk: Kernel-mt.1353.mcz Message-ID: Marcel Taeumel uploaded a new version of Kernel to project The Trunk: http://source.squeak.org/trunk/Kernel-mt.1353.mcz ==================== Summary ==================== Name: Kernel-mt.1353 Author: mt Time: 15 October 2020, 2:29:01.197368 pm UUID: e4947d59-b541-7441-9662-67bb4052fbdb Ancestors: Kernel-mt.1352 Complements System-mt.1180. See http://forum.world.st/Proposal-Resetting-pragma-preferences-via-nil-or-reset-message-td5123490.html =============== Diff against Kernel-mt.1352 =============== Item was changed: ----- Method: CompiledCode class>>preferredBytecodeSetEncoderClass: (in category 'preferences') ----- preferredBytecodeSetEncoderClass: aBytecodeEncoderSubclass "Set the class that determines the bytecode set used to compile methods with. [| nPrimary nSecondary | nPrimary := nSecondary := 0. self allSubInstancesDo: [:cm| cm header >= 0 ifTrue: [nPrimary := nPrimary + 1] ifFalse: [nSecondary := nSecondary + 1]]. {nPrimary. nSecondary}]" | nPrimary nSecondary | + aBytecodeEncoderSubclass ifNil: [ "Use default value." + PreferredBytecodeSetEncoderClass := nil. + ^ self preferredBytecodeSetEncoderClass: self preferredBytecodeSetEncoderClass]. self assert: (aBytecodeEncoderSubclass includesBehavior: BytecodeEncoder). (aBytecodeEncoderSubclass == PrimaryBytecodeSetEncoderClass or: [aBytecodeEncoderSubclass == SecondaryBytecodeSetEncoderClass]) ifTrue: [PreferredBytecodeSetEncoderClass := aBytecodeEncoderSubclass. ^self]. nPrimary := nSecondary := 0. self allSubInstancesDo: [:cm| cm header >= 0 ifTrue: [nPrimary := nPrimary + 1] ifFalse: [nSecondary := nSecondary + 1]]. nPrimary = 0 ifTrue: [self installPrimaryBytecodeSet: aBytecodeEncoderSubclass. ^self preferredBytecodeSetEncoderClass: aBytecodeEncoderSubclass]. nSecondary = 0 ifTrue: [self installSecondaryBytecodeSet: aBytecodeEncoderSubclass. ^self preferredBytecodeSetEncoderClass: aBytecodeEncoderSubclass]. self error: 'Cannot set preferred bytecode set. Both of the current sets appear to be in use.'! From commits at source.squeak.org Thu Oct 15 12:30:43 2020 From: commits at source.squeak.org (commits at source.squeak.org) Date: Thu, 15 Oct 2020 12:30:43 0000 Subject: [squeak-dev] The Trunk: Morphic-mt.1702.mcz Message-ID: Marcel Taeumel uploaded a new version of Morphic to project The Trunk: http://source.squeak.org/trunk/Morphic-mt.1702.mcz ==================== Summary ==================== Name: Morphic-mt.1702 Author: mt Time: 15 October 2020, 2:30:38.301368 pm UUID: 4eb3e7e3-9fda-af4a-9e7d-4ae1187fb179 Ancestors: Morphic-mt.1701 Complements System-mt.1180. See http://forum.world.st/Proposal-Resetting-pragma-preferences-via-nil-or-reset-message-td5123490.html =============== Diff against Morphic-mt.1701 =============== Item was changed: ----- Method: MorphicProject>>showWorldMainDockingBar (in category 'docking bars support') ----- showWorldMainDockingBar ^ self projectPreferenceFlagDictionary at: #showWorldMainDockingBar + ifAbsent: [ true ]! - ifAbsent: [ false ]! Item was changed: ----- Method: MorphicProject>>showWorldMainDockingBar: (in category 'docking bars support') ----- + showWorldMainDockingBar: aBooleanOrNil - showWorldMainDockingBar: aBoolean "Change the receiver to show the main docking bar" + aBooleanOrNil + ifNil: [self projectPreferenceFlagDictionary removeKey: #showWorldMainDockingBar ifAbsent: []] + ifNotNil: [self projectPreferenceFlagDictionary at: #showWorldMainDockingBar put: aBooleanOrNil]. - self projectPreferenceFlagDictionary at: #showWorldMainDockingBar put: aBoolean. self assureMainDockingBarPresenceMatchesPreference! Item was changed: ----- Method: PasteUpMorph class>>globalCommandKeysEnabled: (in category 'preferences') ----- globalCommandKeysEnabled: aBoolean GlobalCommandKeysEnabled = aBoolean ifTrue: [^ self]. GlobalCommandKeysEnabled := aBoolean. SystemWindow allSubInstancesDo: [:ea | + self globalCommandKeysEnabled - aBoolean ifTrue: [ea addKeyboardShortcuts] ifFalse: [ea removeKeyboardShortcuts]]. PasteUpMorph allSubInstancesDo: [:ea | + self globalCommandKeysEnabled - aBoolean ifTrue: [ea addKeyboardShortcuts] ifFalse: [ea removeKeyboardShortcuts]].! Item was changed: ----- Method: PluggableTextMorph class>>softLineWrap: (in category 'preferences') ----- + softLineWrap: aBooleanOrNil - softLineWrap: aBoolean + aBooleanOrNil == SoftLineWrap ifTrue: [^ self]. + SoftLineWrap := aBooleanOrNil. - aBoolean == SoftLineWrap ifTrue: [^ self]. - SoftLineWrap := aBoolean. PluggableTextMorph allSubInstancesDo: [:m | + m text lineCount > 1 ifTrue: [m wrapFlag: self softLineWrap]].! - m text lineCount > 1 ifTrue: [m wrapFlag: aBoolean]].! Item was changed: ----- Method: ProportionalSplitterMorph class>>smartHorizontalSplitters: (in category 'preferences') ----- + smartHorizontalSplitters: aBooleanOrNil + SmartHorizontalSplitters := aBooleanOrNil. + self preferenceChanged: self smartHorizontalSplitters.! - smartHorizontalSplitters: aBoolean - SmartHorizontalSplitters := aBoolean. - self preferenceChanged: aBoolean! Item was changed: ----- Method: ProportionalSplitterMorph class>>smartVerticalSplitters: (in category 'preferences') ----- + smartVerticalSplitters: aBooleanOrNil + SmartVerticalSplitters := aBooleanOrNil. + self preferenceChanged: self smartHorizontalSplitters.! - smartVerticalSplitters: aBoolean - SmartVerticalSplitters := aBoolean. - self preferenceChanged: aBoolean! Item was changed: ----- Method: ScrollPane class>>useRetractableScrollBars: (in category 'preferences') ----- + useRetractableScrollBars: aBooleanOrNil - useRetractableScrollBars: aBoolean + UseRetractableScrollBars = aBooleanOrNil ifTrue: [^ self]. + UseRetractableScrollBars := aBooleanOrNil. - UseRetractableScrollBars = aBoolean ifTrue: [^ self]. - UseRetractableScrollBars := aBoolean. ScrollPane allSubInstances do: [:pane | + pane retractable: self useRetractableScrollBars].! - pane retractable: aBoolean].! Item was changed: ----- Method: SystemWindow class>>moveMenuButtonRight: (in category 'preferences') ----- + moveMenuButtonRight: aBooleanOrNil - moveMenuButtonRight: aBoolean + | absLeftOffset moveToRight | + moveToRight := aBooleanOrNil ifNil: [true "default value"]. + absLeftOffset := ((self hideExpandButton and: [moveToRight]) - | absLeftOffset | - absLeftOffset := ((self hideExpandButton and: [aBoolean]) ifTrue: [absLeftOffset := self boxExtent x * 2] ifFalse: [absLeftOffset := self boxExtent x]) + 3. + self menuBoxFrame leftOffset: (moveToRight - self menuBoxFrame leftOffset: (aBoolean ifTrue: [absLeftOffset negated] ifFalse: [absLeftOffset]). self refreshAllWindows.! Item was changed: ----- Method: TextMorphForEditView class>>draggableTextSelection: (in category 'preferences') ----- + draggableTextSelection: aBooleanOrNil - draggableTextSelection: aBoolean + DraggableTextSelection := aBooleanOrNil. - DraggableTextSelection := aBoolean. + self draggableTextSelection in: [:aBoolean | + TextMorphForEditView allInstancesDo: [:tm | + tm dragEnabled: aBoolean; dropEnabled: aBoolean]].! - TextMorphForEditView allInstancesDo: [:tm | - tm dragEnabled: aBoolean; dropEnabled: aBoolean].! Item was changed: ----- Method: TheWorldMainDockingBar class>>setMenuPreference:to: (in category 'preferences') ----- + setMenuPreference: aPreferenceSymbol to: aBooleanOrNil - setMenuPreference: aPreferenceSymbol to: aBoolean | project | (project := Project current) isMorphic ifTrue: [ + aBooleanOrNil + ifNil: ["Reset to default value." + (Preferences preferenceAt: aPreferenceSymbol) ifNotNil: [:pref | pref restoreDefaultValue]] + ifNotNil: [ + project projectPreferenceFlagDictionary at: aPreferenceSymbol put: aBooleanOrNil]. + (aBooleanOrNil ~= (Preferences preferenceAt: aPreferenceSymbol)) + ifTrue: [Preferences setPreference: aPreferenceSymbol toValue: aBooleanOrNil]]. - project projectPreferenceFlagDictionary at: aPreferenceSymbol put: aBoolean. - (aBoolean ~= (Preferences preferenceAt: aPreferenceSymbol)) - ifTrue: [Preferences setPreference: aPreferenceSymbol toValue: aBoolean]]. self updateInstances.! From commits at source.squeak.org Thu Oct 15 12:31:25 2020 From: commits at source.squeak.org (commits at source.squeak.org) Date: Thu, 15 Oct 2020 12:31:25 0000 Subject: [squeak-dev] The Trunk: Network-mt.243.mcz Message-ID: Marcel Taeumel uploaded a new version of Network to project The Trunk: http://source.squeak.org/trunk/Network-mt.243.mcz ==================== Summary ==================== Name: Network-mt.243 Author: mt Time: 15 October 2020, 2:31:23.615368 pm UUID: caf6db32-ddbc-4a49-a23c-d2a84e435701 Ancestors: Network-eem.242 Complements System-mt.1180. See http://forum.world.st/Proposal-Resetting-pragma-preferences-via-nil-or-reset-message-td5123490.html =============== Diff against Network-eem.242 =============== Item was changed: ----- Method: NetNameResolver class>>enableIPv6 (in category 'system startup') ----- enableIPv6 + ^EnableIPv6 ifNil: [true]! - ^EnableIPv6! From commits at source.squeak.org Thu Oct 15 12:33:16 2020 From: commits at source.squeak.org (commits at source.squeak.org) Date: Thu, 15 Oct 2020 12:33:16 0000 Subject: [squeak-dev] The Trunk: Tools-mt.1002.mcz Message-ID: Marcel Taeumel uploaded a new version of Tools to project The Trunk: http://source.squeak.org/trunk/Tools-mt.1002.mcz ==================== Summary ==================== Name: Tools-mt.1002 Author: mt Time: 15 October 2020, 2:33:13.584368 pm UUID: c291f710-7d15-2142-b4b6-9ef69e488adf Ancestors: Tools-mt.1001 Complements System-mt.1180. See http://forum.world.st/Proposal-Resetting-pragma-preferences-via-nil-or-reset-message-td5123490.html =============== Diff against Tools-mt.1001 =============== Item was changed: ----- Method: Debugger class>>fullStackSize: (in category 'preferences') ----- + fullStackSize: aNumberOrNil - fullStackSize: aNumber + FullStackSize := aNumberOrNil ifNotNil: [:num | num max: self notifierStackSize].! - FullStackSize := aNumber max: self notifierStackSize.! Item was changed: ----- Method: SystemBrowser class>>browserShowsPackagePane: (in category 'preferences') ----- + browserShowsPackagePane: aBooleanOrNil - browserShowsPackagePane: aBoolean | theOtherOne | self registeredClasses size = 2 ifTrue: [theOtherOne := (self registeredClasses copyWithout: PackagePaneBrowser) first] ifFalse: [theOtherOne := nil]. + aBooleanOrNil == true - aBoolean ifTrue: [self default: PackagePaneBrowser] ifFalse: [self default: theOtherOne]. SystemNavigation default browserClass: self default.! From commits at source.squeak.org Thu Oct 15 12:38:00 2020 From: commits at source.squeak.org (commits at source.squeak.org) Date: Thu, 15 Oct 2020 12:38:00 0000 Subject: [squeak-dev] The Trunk: Morphic-mt.1703.mcz Message-ID: Marcel Taeumel uploaded a new version of Morphic to project The Trunk: http://source.squeak.org/trunk/Morphic-mt.1703.mcz ==================== Summary ==================== Name: Morphic-mt.1703 Author: mt Time: 15 October 2020, 2:37:53.810368 pm UUID: eb57dc13-e48d-4748-902e-8407ec0634a9 Ancestors: Morphic-mt.1702, Morphic-stlu.1682 Merges fix for canvas transformation from Morphic-stlu.1682. =============== Diff against Morphic-mt.1702 =============== Item was changed: ----- Method: FormCanvas>>transformBy:clippingTo:during:smoothing: (in category 'drawing-support') ----- + transformBy: aDisplayTransform clippingTo: aClipRect during: aBlock smoothing: cellSize - transformBy: aDisplayTransform clippingTo: aClipRect during: aBlock smoothing: cellSize "Note: This method has been originally copied from TransformationMorph." | innerRect patchRect sourceQuad warp start subCanvas | + aDisplayTransform isPureTranslation ifTrue: [ + ^ self + translateBy: (aDisplayTransform localPointToGlobal: 0 at 0) truncated + clippingTo: aClipRect + during: aBlock]. - (aDisplayTransform isPureTranslation) ifTrue:[ - ^aBlock value: (self copyOffset: aDisplayTransform offset negated truncated - clipRect: aClipRect) - ]. "Prepare an appropriate warp from patch to innerRect" innerRect := aClipRect. patchRect := (aDisplayTransform globalBoundsToLocal: innerRect) truncated. sourceQuad := (aDisplayTransform sourceQuadFor: innerRect) collect: [:p | p - patchRect topLeft]. warp := self warpFrom: sourceQuad toRect: innerRect. warp cellSize: cellSize. "Render the submorphs visible in the clipping rectangle, as patchForm" start := (self depth = 1 and: [self isShadowDrawing not]) "If this is true B&W, then we need a first pass for erasure." ifTrue: [1] ifFalse: [2]. start to: 2 do: [:i | "If i=1 we first make a shadow and erase it for opaque whites in B&W" subCanvas := self class extent: patchRect extent depth: self depth. i=1 ifTrue: [subCanvas shadowColor: Color black. warp combinationRule: Form erase] ifFalse: [self isShadowDrawing ifTrue: [subCanvas shadowColor: self shadowColor]. warp combinationRule: (self depth = 32 ifTrue: [Form blendAlphaScaled] ifFalse: [Form paint])]. subCanvas translateBy: patchRect topLeft negated during: aBlock. warp sourceForm: subCanvas form; warpBits. warp sourceForm: nil. subCanvas := nil "release space for next loop"] ! From commits at source.squeak.org Thu Oct 15 12:38:24 2020 From: commits at source.squeak.org (commits at source.squeak.org) Date: Thu, 15 Oct 2020 12:38:24 0000 Subject: [squeak-dev] The Trunk: Morphic-stlu.1682.mcz Message-ID: Marcel Taeumel uploaded a new version of Morphic to project The Trunk: http://source.squeak.org/trunk/Morphic-stlu.1682.mcz ==================== Summary ==================== Name: Morphic-stlu.1682 Author: stlu Time: 10 September 2020, 1:34:13.030274 pm UUID: c81abdd7-0400-4fe2-bc43-61704bff7fe7 Ancestors: Morphic-mt.1679 Fixes FormCanvas's fast path for pure translations when using MatrixTransform2x3. --- FormCanvas's current fast path for DisplayTransforms that are pure translations calls #offset, a method that is not (formally) part of the DisplayTransform protocol. While all transform types currently in trunk implement it, these implementations differ in their meaning: A) MatrixTransform2x3 >> #offset describes the translation applied to objects transformed by it on the grid B) MorphicTransform >> #offset describes the translation applied to the grid which objects transformed by it are placed on All this ultimately amounts to is a simple negation. However, FormCanvas >> #transformBy:clippingTo:during:smoothing: assumes all display transforms to behave like MorphicTransform, causing MatrixTransform2x3 to translate in the exact opposite direction. Here an example: | formCanvas transform | transform := MatrixTransform2x3 withOffset: -100@ -100. "uncomment line below for not pure translation which should look (almost) identical" "transform := transform composedWithLocal: (MatrixTransform2x3 withScale: 0.99)." formCanvas := FormCanvas extent: 400 at 400. formCanvas fillColor: Color white. formCanvas translateBy: 200 at 200 during: [:canvas | canvas transformBy: transform clippingTo: (-1000@ -1000 corner: 1000 at 1000) during: [:c | c fillRectangle: (0 at 0 extent: 100 at 100) color: Color red]]. formCanvas form asMorph openInHand. BUT since #offset has an entirely different meaning for the two transform types, it is IMO not a good idea to adapt either of its implementations to the other. I would not expect widely accepted matrix terminology to have a different meaning in Squeak. As a result, I currently only see 2 options: 1. Introduce a new selector (e.g. #canvasOffset or #canvasTranslation) 2. Use #localPointToGlobal: I decided to go with the second option, since it reuses the existing interface and is hence automatically compatible with all existing display transforms. Also, while my imagination is failing to think of an example, assuming all transforms can answer to #offset might not be desirable? As for performance impact, the previous implementation is obviously faster, since it only required a quick method accessor. On my machine I benched the following: | transform | transform := MorphicTransform offset: 123@ -456. [transform offset] bench. " '152,000,000 per second. 6.59 nanoseconds per run. 0 % GC time.'" [transform localPointToGlobal: 0 at 0] bench. " '19,500,000 per second. 51.2 nanoseconds per run. 4.79808 % GC time.'" I focused here on the MorphicTransform, since it is the only one actively used in Morphic (to my knowledge). To me this still seems like a rather tame slowdown, especially considering there only a couple hundred Morphs (at worst) calling #transformBy* in a typical Squeak image. =============== Diff against Morphic-mt.1679 =============== Item was changed: ----- Method: FormCanvas>>transformBy:clippingTo:during:smoothing: (in category 'drawing-support') ----- + transformBy: aDisplayTransform clippingTo: aClipRect during: aBlock smoothing: cellSize - transformBy: aDisplayTransform clippingTo: aClipRect during: aBlock smoothing: cellSize "Note: This method has been originally copied from TransformationMorph." | innerRect patchRect sourceQuad warp start subCanvas | + aDisplayTransform isPureTranslation ifTrue: [ + ^ self + translateBy: (aDisplayTransform localPointToGlobal: 0 at 0) truncated + clippingTo: aClipRect + during: aBlock]. - (aDisplayTransform isPureTranslation) ifTrue:[ - ^aBlock value: (self copyOffset: aDisplayTransform offset negated truncated - clipRect: aClipRect) - ]. "Prepare an appropriate warp from patch to innerRect" innerRect := aClipRect. patchRect := (aDisplayTransform globalBoundsToLocal: innerRect) truncated. sourceQuad := (aDisplayTransform sourceQuadFor: innerRect) collect: [:p | p - patchRect topLeft]. warp := self warpFrom: sourceQuad toRect: innerRect. warp cellSize: cellSize. "Render the submorphs visible in the clipping rectangle, as patchForm" start := (self depth = 1 and: [self isShadowDrawing not]) "If this is true B&W, then we need a first pass for erasure." ifTrue: [1] ifFalse: [2]. start to: 2 do: [:i | "If i=1 we first make a shadow and erase it for opaque whites in B&W" subCanvas := self class extent: patchRect extent depth: self depth. i=1 ifTrue: [subCanvas shadowColor: Color black. warp combinationRule: Form erase] ifFalse: [self isShadowDrawing ifTrue: [subCanvas shadowColor: self shadowColor]. warp combinationRule: (self depth = 32 ifTrue: [Form blendAlphaScaled] ifFalse: [Form paint])]. subCanvas translateBy: patchRect topLeft negated during: aBlock. warp sourceForm: subCanvas form; warpBits. warp sourceForm: nil. subCanvas := nil "release space for next loop"] ! From marcel.taeumel at hpi.de Thu Oct 15 12:40:18 2020 From: marcel.taeumel at hpi.de (Marcel Taeumel) Date: Thu, 15 Oct 2020 14:40:18 +0200 Subject: [squeak-dev] Squeak 25th anniversary call for participation In-Reply-To: References: Message-ID: Hi all! Best, Marcel Am 25.09.2020 17:41:51 schrieb Yoshiki Ohshima : Nice! We have some talks by Alan Kay on the net: https://tinlizzie.org/IA/index.php/Talks_by_Alan_Kay and there are other movies of Squeak demos and stuff that are sitting disks but not uploaded. We can get some interesting segments to make a highlight reel. On Thu, Sep 24, 2020 at 8:57 AM Craig Latta wrote: > > > Hi all-- > > On 24 September 1996, Dan Ingalls and team announced the existence > of Squeak, “another run at the fence” toward the joyful use of > computation. Some would say this wonderful surprise was inevitable. > Equally inevitable is the passage of time, and there is joy in that as > well. Let’s amplify our fascination, appreciation, and ambition for > Squeak and the community, by celebrating the 25th anniversary in 2021! > > What would you like to see, hear, and do? We of your board have a > few ideas, including a new issue of Squeak News, and special interview > episodes of the Smalltalk Reflections podcast. This is a good time to > reflect, plan, and invent the future once more. > > Proceed for truth! > > > -C > > -- > Craig Latta :: research computer scientist > Black Page Digital :: Berkeley, California > 663137D7940BF5C0AFC 1349FB2ADA32C4D5314CE > > > -- -- Yoshiki -------------- next part -------------- An HTML attachment was scrubbed... URL: -------------- next part -------------- A non-text attachment was scrubbed... Name: image.png Type: image/png Size: 58042 bytes Desc: not available URL: From marcel.taeumel at hpi.de Thu Oct 15 13:10:16 2020 From: marcel.taeumel at hpi.de (Marcel Taeumel) Date: Thu, 15 Oct 2020 15:10:16 +0200 Subject: [squeak-dev] Methods with hidden deprecation In-Reply-To: References: Message-ID: Hi Patrick, those suggestions look reasonable. Are there simple replacements for each one? Best, Marcel Am 13.10.2020 17:25:02 schrieb patrick.rein at hpi.uni-potsdam.de : Hi everyone, recently I stumbled upon a method with a method comment stating that the method was actually deprecated, while the method was not marked as such in any way. Based on that I looked further into that and found a few other instances. Below is a list of the candidates for deprecation. My suggestion would be to mark them as deprecated and put them into the current deprecation package. As some of these have been around for quite a while without being denoted as deprecated, someone might rely on them heavily, so: Does anyone feel strongly about any of these in either way (reinstatiate, deprecate for sure)? (I have given the number of senders of the selector in the Trunk image in braces after the selector) Bests Patrick # Rather obvious candidates - Collection: - #copyLast: (1) - #copyWithoutFirst (9) - NewParagraph - #lineIndexForCharacter: (0) - Morph - #fullCopy (0) - PostscriptCanvas - #text:at:font:color:justified:parwidth: (0) - Object - #backwardCompatibilityOnly: (0) "welp :)" - Canvas - #imageWithOpaqueWhite:at: (0) - #image:at: (0) - #image:at:rule (0) - FancyMailComposition - #breakLinesInMessage (0) - Preferences class - #parameterAt:default: (0) - SMPackage - maintainer (0) - SocketStream - #receiveDataIfAvailable (0) - SugarLauncher - #welcomeProjectName (0) - TransformMorph - #localVisibleSubmorphBounds # Somewhat disputable candidates - MIMEDocument - #type (?) - UIManager - #openPluggableFileList:label:in: (1 deprecated) - MVUIManager - #openPluggableFileList:label:in: (1 deprecated) - MorphicUIManager - #openPluggableFileList:label:in: (1 deprecated) - SMPackage - #modulePath:moduleVersion:moduleTag:versionComment: (1) -------------- next part -------------- An HTML attachment was scrubbed... URL: From Patrick.Rein at hpi.de Thu Oct 15 14:40:43 2020 From: Patrick.Rein at hpi.de (Rein, Patrick) Date: Thu, 15 Oct 2020 14:40:43 +0000 Subject: [squeak-dev] Methods with hidden deprecation In-Reply-To: References: , Message-ID: <4330c15a5e024b66852f46ac1de67bff@hpi.de> Some do have replacements, such as #copyLast:, others seem to be private interfaces that are not used by the current implementation anymore, e.g. #breakLinesInMessage and would be deleted without any replacement some day. Bests, Patrick ________________________________________ From: Squeak-dev on behalf of Taeumel, Marcel Sent: Thursday, October 15, 2020 3:10:16 PM To: squeak-dev Subject: Re: [squeak-dev] Methods with hidden deprecation Hi Patrick, those suggestions look reasonable. Are there simple replacements for each one? Best, Marcel Am 13.10.2020 17:25:02 schrieb patrick.rein at hpi.uni-potsdam.de : Hi everyone, recently I stumbled upon a method with a method comment stating that the method was actually deprecated, while the method was not marked as such in any way. Based on that I looked further into that and found a few other instances. Below is a list of the candidates for deprecation. My suggestion would be to mark them as deprecated and put them into the current deprecation package. As some of these have been around for quite a while without being denoted as deprecated, someone might rely on them heavily, so: Does anyone feel strongly about any of these in either way (reinstatiate, deprecate for sure)? (I have given the number of senders of the selector in the Trunk image in braces after the selector) Bests Patrick # Rather obvious candidates - Collection: - #copyLast: (1) - #copyWithoutFirst (9) - NewParagraph - #lineIndexForCharacter: (0) - Morph - #fullCopy (0) - PostscriptCanvas - #text:at:font:color:justified:parwidth: (0) - Object - #backwardCompatibilityOnly: (0) "welp :)" - Canvas - #imageWithOpaqueWhite:at: (0) - #image:at: (0) - #image:at:rule (0) - FancyMailComposition - #breakLinesInMessage (0) - Preferences class - #parameterAt:default: (0) - SMPackage - maintainer (0) - SocketStream - #receiveDataIfAvailable (0) - SugarLauncher - #welcomeProjectName (0) - TransformMorph - #localVisibleSubmorphBounds # Somewhat disputable candidates - MIMEDocument - #type (?) - UIManager - #openPluggableFileList:label:in: (1 deprecated) - MVUIManager - #openPluggableFileList:label:in: (1 deprecated) - MorphicUIManager - #openPluggableFileList:label:in: (1 deprecated) - SMPackage - #modulePath:moduleVersion:moduleTag:versionComment: (1) From eliot.miranda at gmail.com Thu Oct 15 14:55:40 2020 From: eliot.miranda at gmail.com (Eliot Miranda) Date: Thu, 15 Oct 2020 07:55:40 -0700 Subject: [squeak-dev] The Trunk: Morphic-stlu.1682.mcz In-Reply-To: References: Message-ID: <7B8B3C0B-68B4-4A17-8F5E-EBA5D8FDDE6E@gmail.com> Hi Marcel, maybe add commentary to MatrixTransform2x3 >>offset and MorphicTransform>>offset that these methods are short cuts and should not be used for transforming coordinates in Morphs, directing people to the real API. And does some of the commit comment belong in a class comment and/or class side documentation method on transforms within Morphic? _,,,^..^,,,_ (phone) > On Oct 15, 2020, at 5:38 AM, commits at source.squeak.org wrote: > > Marcel Taeumel uploaded a new version of Morphic to project The Trunk: > http://source.squeak.org/trunk/Morphic-stlu.1682.mcz > > ==================== Summary ==================== > > Name: Morphic-stlu.1682 > Author: stlu > Time: 10 September 2020, 1:34:13.030274 pm > UUID: c81abdd7-0400-4fe2-bc43-61704bff7fe7 > Ancestors: Morphic-mt.1679 > > Fixes FormCanvas's fast path for pure translations when using MatrixTransform2x3. > > --- > > FormCanvas's current fast path for DisplayTransforms that are pure translations calls #offset, a method that is not (formally) part of the DisplayTransform protocol. While all transform types currently in trunk implement it, these implementations differ in their meaning: > > A) MatrixTransform2x3 >> #offset describes the translation applied to objects transformed by it on the grid > B) MorphicTransform >> #offset describes the translation applied to the grid which objects transformed by it are placed on > > All this ultimately amounts to is a simple negation. However, FormCanvas >> #transformBy:clippingTo:during:smoothing: assumes all display transforms to behave like MorphicTransform, causing MatrixTransform2x3 to translate in the exact opposite direction. Here an example: > > | formCanvas transform | > transform := MatrixTransform2x3 withOffset: -100@ -100. > "uncomment line below for not pure translation which should look (almost) identical" > "transform := transform composedWithLocal: (MatrixTransform2x3 withScale: 0.99)." > formCanvas := FormCanvas extent: 400 at 400. > formCanvas fillColor: Color white. > formCanvas > translateBy: 200 at 200 > during: [:canvas | > canvas > transformBy: transform > clippingTo: (-1000@ -1000 corner: 1000 at 1000) > during: [:c | c fillRectangle: (0 at 0 extent: 100 at 100) color: Color red]]. > formCanvas form asMorph openInHand. > > BUT since #offset has an entirely different meaning for the two transform types, it is IMO not a good idea to adapt either of its implementations to the other. I would not expect widely accepted matrix terminology to have a different meaning in Squeak. As a result, I currently only see 2 options: > > 1. Introduce a new selector (e.g. #canvasOffset or #canvasTranslation) > 2. Use #localPointToGlobal: > > I decided to go with the second option, since it reuses the existing interface and is hence automatically compatible with all existing display transforms. Also, while my imagination is failing to think of an example, assuming all transforms can answer to #offset might not be desirable? As for performance impact, the previous implementation is obviously faster, since it only required a quick method accessor. On my machine I benched the following: > > | transform | > transform := MorphicTransform offset: 123@ -456. > [transform offset] bench. " '152,000,000 per second. 6.59 nanoseconds per run. 0 % GC time.'" > [transform localPointToGlobal: 0 at 0] bench. " '19,500,000 per second. 51.2 nanoseconds per run. 4.79808 % GC time.'" > > I focused here on the MorphicTransform, since it is the only one actively used in Morphic (to my knowledge). To me this still seems like a rather tame slowdown, especially considering there only a couple hundred Morphs (at worst) calling #transformBy* in a typical Squeak image. > > =============== Diff against Morphic-mt.1679 =============== > > Item was changed: > ----- Method: FormCanvas>>transformBy:clippingTo:during:smoothing: (in category 'drawing-support') ----- > + transformBy: aDisplayTransform clippingTo: aClipRect during: aBlock smoothing: cellSize > - transformBy: aDisplayTransform clippingTo: aClipRect during: aBlock smoothing: cellSize > > "Note: This method has been originally copied from TransformationMorph." > | innerRect patchRect sourceQuad warp start subCanvas | > + aDisplayTransform isPureTranslation ifTrue: [ > + ^ self > + translateBy: (aDisplayTransform localPointToGlobal: 0 at 0) truncated > + clippingTo: aClipRect > + during: aBlock]. > - (aDisplayTransform isPureTranslation) ifTrue:[ > - ^aBlock value: (self copyOffset: aDisplayTransform offset negated truncated > - clipRect: aClipRect) > - ]. > "Prepare an appropriate warp from patch to innerRect" > innerRect := aClipRect. > patchRect := (aDisplayTransform globalBoundsToLocal: innerRect) truncated. > sourceQuad := (aDisplayTransform sourceQuadFor: innerRect) > collect: [:p | p - patchRect topLeft]. > warp := self warpFrom: sourceQuad toRect: innerRect. > warp cellSize: cellSize. > > "Render the submorphs visible in the clipping rectangle, as patchForm" > start := (self depth = 1 and: [self isShadowDrawing not]) > "If this is true B&W, then we need a first pass for erasure." > ifTrue: [1] ifFalse: [2]. > start to: 2 do: > [:i | "If i=1 we first make a shadow and erase it for opaque whites in B&W" > subCanvas := self class extent: patchRect extent depth: self depth. > i=1 ifTrue: [subCanvas shadowColor: Color black. > warp combinationRule: Form erase] > ifFalse: [self isShadowDrawing ifTrue: > [subCanvas shadowColor: self shadowColor]. > warp combinationRule: (self depth = 32 > ifTrue: [Form blendAlphaScaled] > ifFalse: [Form paint])]. > subCanvas > translateBy: patchRect topLeft negated > during: aBlock. > warp sourceForm: subCanvas form; warpBits. > warp sourceForm: nil. subCanvas := nil "release space for next loop"] > ! > > From tim at rowledge.org Thu Oct 15 16:57:17 2020 From: tim at rowledge.org (tim Rowledge) Date: Thu, 15 Oct 2020 09:57:17 -0700 Subject: [squeak-dev] Squeak 25th anniversary call for participation In-Reply-To: References: Message-ID: <4077CCBE-57B6-4E83-868E-F6F5C5CB4070@rowledge.org> > On 2020-10-15, at 5:40 AM, Marcel Taeumel wrote: > > Hi all! > > Gonna party like it's 19999 tim -- tim Rowledge; tim at rowledge.org; http://www.rowledge.org/tim Useful random insult:- Mind like a steel sieve. From eliot.miranda at gmail.com Thu Oct 15 18:15:40 2020 From: eliot.miranda at gmail.com (Eliot Miranda) Date: Thu, 15 Oct 2020 11:15:40 -0700 Subject: [squeak-dev] Proposal | Resetting pragma preferences via 'nil' or #reset... message In-Reply-To: References: Message-ID: <831F5593-D914-4C04-97D8-96543088AB33@gmail.com> > On Oct 15, 2020, at 4:27 AM, Marcel Taeumel wrote: > >  > New day, new thoughts on this matter. I don't think that having extra #reset... messages for pragma preferences is necessary. The getter as "ifNil" and so should the setter support a 'nil' argument to reset. I will update those remaining 20% of setters to support 'nil' as argument. +1; very nice. > > Best, > Marcel >> Am 15.10.2020 12:59:57 schrieb Marcel Taeumel : >> >> Hmm... not sure how that happened. Maybe because I did that from a Vivide image. Well, no worries. I will use a fresh Trunk image as catalyst. :-) >> >> Best, >> Marcel >>> Am 14.10.2020 20:32:49 schrieb Eliot Miranda : >>> >>> >>> >>> On Wed, Oct 14, 2020 at 8:03 AM Marcel Taeumel wrote: >>>> Hi all! >>>> >>>> Please find attached a change set that will implement #restoreDefaultValue on PragmaPreference looking for an optional #reset... message or just setting the preference to 'nil' and hoping for the best. >>>> >>>> I added #reset... methods for all pragma preferences that do either (a) not support 'nil' or (b) do costly update stuff. >>>> >>>> In the ReleaseBuilder, I opted for resetting all preferences as early as possible. >>>> >>>> Can I put this in the Trunk? :-) >>> >>> Yes, but only if you remove all those stylings ;-) I don't want y changes file filling up with junk that will be auto-styled over :-) >>> >>> _,,,^..^,,,_ >>> best, Eliot > -------------- next part -------------- An HTML attachment was scrubbed... URL: From commits at source.squeak.org Fri Oct 16 02:36:03 2020 From: commits at source.squeak.org (commits at source.squeak.org) Date: Fri, 16 Oct 2020 02:36:03 0000 Subject: [squeak-dev] The Trunk: EToys-eem.410.mcz Message-ID: Eliot Miranda uploaded a new version of EToys to project The Trunk: http://source.squeak.org/trunk/EToys-eem.410.mcz ==================== Summary ==================== Name: EToys-eem.410 Author: eem Time: 15 October 2020, 7:35:58.395815 pm UUID: eb60faf5-1f7d-459c-b9f9-ee9a691da3a6 Ancestors: EToys-mt.409 Add the cameraUID: primitive, and have the interruptDrivenVideoTest: incluse the camera name in its result. =============== Diff against EToys-mt.409 =============== Item was added: + ----- Method: CameraInterface class>>cameraUID: (in category 'camera ops') ----- + cameraUID: cameraNum + "Answer the unique ID of the given camera. Answer nil if there is no camera with the given number." + + + ^ nil + + "CameraInterface cameraUID: 1"! Item was changed: ----- Method: CameraInterface class>>interruptDrivenVideoTest: (in category 'test') ----- interruptDrivenVideoTest: camNum "A quick test of video input. Displays video on the screen until the mouse is pressed. Answer nil if the interrupt-driven interface is unavailable." "self interruptDrivenVideoTest: 1" "self interruptDrivenVideoTest: 2" "[self interruptDrivenVideoTest: 2] fork. self interruptDrivenVideoTest: 1" | semaphore height | height := 16. 1 to: camNum - 1 do: [:camIndex| "N.B. the of an unopened camera is 0 at 0" height := height + (CameraInterface frameExtent: camIndex) y + 16]. (CameraInterface cameraIsOpen: camNum) ifFalse: [(CameraInterface openCamera: camNum width: 352 height: 288) ifNil: [self inform: 'no camera'. ^nil]]. semaphore := Semaphore new. [CameraInterface camera: camNum setSemaphore: (Smalltalk registerExternalObject: semaphore)] on: Error do: [:err| Smalltalk unregisterExternalObject: semaphore. self inform: 'interrupt-driven camera interface unavailable: ', err messageText. ^nil]. [| f n startTime frameCount msecs fps | [semaphore wait. "N.B. the frame extent may not be known until the delivery of the first frame. + So we have to delay initialization." - Si we have to delay initialization." startTime ifNil: [(self frameExtent: camNum) x = 0 ifTrue: [self inform: 'no camera'. ^nil]. f := Form extent: (CameraInterface frameExtent: camNum) depth: 32. frameCount := 0. startTime := Time millisecondClockValue]. Sensor anyButtonPressed] whileFalse: [n := CameraInterface getFrameForCamera: camNum into: f bits. n > 0 ifTrue: [frameCount := frameCount + 1. f displayAt: 16 @ height]]. msecs := Time millisecondClockValue - startTime. fps := (frameCount * 1000) // msecs. + ^(CameraInterface cameraName: camNum), ': ', frameCount printString, ' frames at ', fps printString, ' frames/sec'] - ^frameCount printString, ' frames at ', fps printString, ' frames/sec'] ensure: [CameraInterface closeCamera: camNum. Smalltalk unregisterExternalObject: semaphore. Sensor waitNoButton]! From builds at travis-ci.org Fri Oct 16 15:23:59 2020 From: builds at travis-ci.org (Travis CI) Date: Fri, 16 Oct 2020 15:23:59 +0000 Subject: [squeak-dev] [CRON] Errored: squeak-smalltalk/squeak-app#1861 (squeak-trunk - 25ebaf1) In-Reply-To: Message-ID: <5f89bb0f7e527_13fae8b6b4058294581@travis-tasks-685697cf47-2pxb9.mail> Build Update for squeak-smalltalk/squeak-app ------------------------------------- Build: #1861 Status: Errored Duration: 18 mins and 53 secs Commit: 25ebaf1 (squeak-trunk) Author: Marcel Taeumel Message: Hi all! The project "squeak-app" is part of the continuous build infrastructure (short: CI) for Squeak's bundles, which you can download at https://files.squeak.org/, followed by the version tag you are looking for. All bundles are updated on a regular basis, which is daily for Trunk (i.e. the current alpha version) and monthly for release versions. Note that there won't be new bundles if Squeak's build number, which reflects in-image code updates, did not change between CI jobs. -- The Squeak Oversight Board [ci skip] View the changeset: https://github.com/squeak-smalltalk/squeak-app/compare/fb55517f583fe544f9225413a23fe82a680200c2...25ebaf18249322227da1f7c767384cb35082fab7 View the full build log and details: https://travis-ci.org/github/squeak-smalltalk/squeak-app/builds/736392797?utm_medium=notification&utm_source=email -- You can unsubscribe from build emails from the squeak-smalltalk/squeak-app repository going to https://travis-ci.org/account/preferences/unsubscribe?repository=8901856&utm_medium=notification&utm_source=email. Or unsubscribe from *all* email updating your settings at https://travis-ci.org/account/preferences/unsubscribe?utm_medium=notification&utm_source=email. Or configure specific recipients for build notifications in your .travis.yml file. See https://docs.travis-ci.com/user/notifications. -------------- next part -------------- An HTML attachment was scrubbed... URL: From commits at source.squeak.org Fri Oct 16 17:55:27 2020 From: commits at source.squeak.org (commits at source.squeak.org) Date: Fri, 16 Oct 2020 17:55:27 0000 Subject: [squeak-dev] The Trunk: System-eem.1181.mcz Message-ID: Eliot Miranda uploaded a new version of System to project The Trunk: http://source.squeak.org/trunk/System-eem.1181.mcz ==================== Summary ==================== Name: System-eem.1181 Author: eem Time: 16 October 2020, 10:55:23.59864 am UUID: 46d93234-f04b-4b34-9730-972c0c5876ac Ancestors: System-mt.1180 Indexed access to registered external objects, avoiding the overhead of copying the entire external object array. =============== Diff against System-mt.1180 =============== Item was added: + ----- Method: ExternalObjectTable>>externalObjectAt:ifAbsent: (in category 'accessing') ----- + externalObjectAt: index ifAbsent: errorBlock + "Answer the externalObject at index, or the result of errorBlock if none." + + ^(semaphore critical: [externalObjectsArray at: index ifAbsent: nil]) ifNil: + [errorBlock value]! Item was added: + ----- Method: SmalltalkImage>>externalObjectAt:ifAbsent: (in category 'external objects') ----- + externalObjectAt: index ifAbsent: errorBlock + "Answer the externalObject at index, or the result of errorBlock if none." + + ^ExternalObjectTable current externalObjectAt: index ifAbsent: errorBlock! From commits at source.squeak.org Fri Oct 16 18:00:05 2020 From: commits at source.squeak.org (commits at source.squeak.org) Date: Fri, 16 Oct 2020 18:00:05 0000 Subject: [squeak-dev] The Trunk: EToys-eem.411.mcz Message-ID: Eliot Miranda uploaded a new version of EToys to project The Trunk: http://source.squeak.org/trunk/EToys-eem.411.mcz ==================== Summary ==================== Name: EToys-eem.411 Author: eem Time: 16 October 2020, 10:59:59.90188 am UUID: b638cb31-a1eb-4d9d-b244-412b5f7ebec9 Ancestors: EToys-eem.410 CameraInterface: Complete (*) the interrupt-driven interface using it (if available) to wait for camera start, and to wait for the next frame. Have closeCamera: unregister any external semaphore. Ypdate the class comment with this example: [| form | form := Form extent: 352 @ 288 depth: 32. CameraInterface openCamera: 1 width: form width height: form height; trySetSemaphoreForCamera: 1. [Sensor noButtonPressed] whileTrue: [CameraInterface waitForNextFrame: 1 timeout: 2000; getFrameForCamera: 1 into: form bits. form displayAt: Sensor cursorPoint]] ensure: [CameraInterface closeCamera: 1] (*) nothing is ever finished, but the essentials are here. =============== Diff against EToys-eem.410 =============== Item was changed: Object subclass: #CameraInterface instanceVariableNames: '' classVariableNames: '' poolDictionaries: '' category: 'Etoys-Squeakland-MorphicExtras-WebCam'! + !CameraInterface commentStamp: 'eem 10/16/2020 10:53' prior: 0! + CameraInterface: Simple cross-platform webcam access interface adapted from MIT Scratch. Changes made so that different cameras can be tested when more than one is connected, and so that the interface is simpler and may be interrupt-driven. - !CameraInterface commentStamp: '' prior: 0! - CameraInterface: Simple cross-platform webcam access interface from MIT Scratch. Small changes made so that different cameras can be tested when more than one is connected. The "CameraPlugin" binary should soon be included in the VM. On Linux the plugin is designed to take advantage of libv4l2 (if found) to support a wide range of cameras. + [| form | + form := Form extent: 352 @ 288 depth: 32. + CameraInterface + openCamera: 1 width: form width height: form height; + trySetSemaphoreForCamera: 1. + [Sensor noButtonPressed] whileTrue: + [CameraInterface + waitForNextFrame: 1 timeout: 2000; + getFrameForCamera: 1 into: form bits. + form displayAt: Sensor cursorPoint]] ensure: [CameraInterface closeCamera: 1] + Copyright (c) 2009 Massachusetts Institute of Technology Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + THE SOFTWARE.! - THE SOFTWARE. - ! Item was added: + ----- Method: CameraInterface class>>cameraGetSemaphore: (in category 'camera ops') ----- + cameraGetSemaphore: cameraNum + "Answer the external semaphore index through which to signal that a frame is available. + Fail if cameraNum has not had a semaphore index set, or is otherwise invalid. + Answer nil on failure for convenience." + + ^nil! Item was changed: ----- Method: CameraInterface class>>closeCamera: (in category 'camera ops') ----- closeCamera: cameraNum + "Close the camera. Do nothing if it was not open. Unregister any associated semaphore." - "Close the camera. Do nothing if it was not open." + (self cameraGetSemaphore: cameraNum) ifNotNil: + [:semaphoreIndex| + Smalltalk unregisterExternalObject: (Smalltalk externalObjectAt: semaphoreIndex ifAbsent: nil)]. + self primitiveCloseCamera: cameraNum! - - ! Item was added: + ----- Method: CameraInterface class>>primitiveCloseCamera: (in category 'private-primitives') ----- + primitiveCloseCamera: cameraNum + "Close the camera. Do nothing if it was not open except answering nil." + + + ^nil! Item was added: + ----- Method: CameraInterface class>>trySetSemaphoreForCamera: (in category 'utilities') ----- + trySetSemaphoreForCamera: camNum + "Attempt to set a semaphore to be signalled when a frame is available. + Fail silently. Use e.g. waitForCameraStart: or waitForNextFrame: to + access the semaphore if available." + | semaphore | + Smalltalk registerExternalObject: (semaphore := Semaphore new). + [CameraInterface camera: camNum setSemaphore: semaphore] + on: Error + do: [:err| + Smalltalk unregisterExternalObject: semaphore]! Item was changed: + ----- Method: CameraInterface class>>waitForCameraStart: (in category 'utilities') ----- - ----- Method: CameraInterface class>>waitForCameraStart: (in category 'camera ops') ----- waitForCameraStart: camNum + "Wait for the camera to get it's first frame (indicated by a non-zero frame extent. Timeout after two seconds." + "self waitForCameraStart: 1" - "Wait for the camera to get it's first frame (indicated by a non-zero frame extent. Timeout after a few seconds." - "self waitForCameraStart" | startTime | + (self cameraGetSemaphore: camNum) ifNotNil: + [:semaphoreIndex| + (Smalltalk externalObjectAt: semaphoreIndex ifAbsent: [self error: 'seriously?!!?!!?!!?']) wait. + ^self]. + startTime := Time utcMicrosecondClock. + [(self packedFrameExtent: camNum) > 0 ifTrue: [^ self]. + (Time utcMicrosecondClock - startTime) < 2000000] whileTrue: + [(Delay forMilliseconds: 50) wait]! - startTime := Time millisecondClockValue. - [(Time millisecondClockValue - startTime) < 2000] whileTrue: [ - (self packedFrameExtent: camNum) > 0 ifTrue: [^ self]. - (Delay forMilliseconds: 50) wait].! Item was added: + ----- Method: CameraInterface class>>waitForNextFrame:timeout: (in category 'utilities') ----- + waitForNextFrame: camNum timeout: timeoutms + "Wait for the camera to get it's first frame (indicated by a non-zero frame extent. Timeout after two seconds." + "self waitForNextFrame: 1 timeout: 2000" + + | now timeoutusecs | + (self cameraGetSemaphore: camNum) ifNotNil: + [:semaphoreIndex| + (Smalltalk externalObjectAt: semaphoreIndex ifAbsent: [self error: 'seriously?!!?!!?!!?']) waitTimeoutMSecs: timeoutms. + ^self]. + now := Time utcMicrosecondClock. + timeoutusecs := timeoutms * 1000. + [(self camera: camNum getParam: 1) > 0 ifTrue: [^self]. + (Time utcMicrosecondClock - now) < timeoutusecs] whileTrue: + [(Delay forMilliseconds: 50) wait]! From eliot.miranda at gmail.com Fri Oct 16 22:23:48 2020 From: eliot.miranda at gmail.com (Eliot Miranda) Date: Fri, 16 Oct 2020 15:23:48 -0700 Subject: [squeak-dev] [Vm-dev] Pool for sysconf constants? In-Reply-To: <20201016214731.GA70979@shell.msen.com> References: <20201013032817.GA78602@shell.msen.com> <20201016214731.GA70979@shell.msen.com> Message-ID: Hi David, > On Oct 16, 2020, at 2:47 PM, David T. Lewis wrote: > > Hi Eliot, > > Replying back on vm-dev. > > Indeed I see the problem now, thanks. > > The closest that I can come to a useful suggestion is to write a > little C program to print out the index values of interest for a > given platform, then read that into the image to build the pool. > The index values are supposed to be opaque but I doubt that they > would change much in practice. This is what an ExternalPool does *automatically*. One creates a pool containing a set of named variables, adds metadata to the pool, and then when the pool needs to initialize or change, it generates the C program automatically, runs it, reaps the values, and updates class side code to initialize the constants for specific platforms. When it is run on a different platform it generates the program for that platform, etc. The management problem therefore is how to manage the executable programs because these are needed if one wants to deploy on a specific platform. I came up with the idea many years ago at ParcPlace when the problem first surfaced (that different platforms, though they may use the same names for symbolic constants, abstract types, etc, but don't use the same values, concrete types, etc). Monty write the implementation. Marcel has shepherded it into source.squeak.org/FFI. Marcel has written an excellent and comprehensive class comment for ExternalPool. I urge that everyone interested in deployment using FFIs read it ASAP. That goes for me too, because things have moved on with the implementation. There's no need to manage external C programs; there's a need to merge the definition code that is automatically generated when run on different platforms. I should push thoguh and sdo a sysconf pool to learn how the current system really works :-) > > I am looking only at a Linux system as I write this, and the only > way I can find to discover the available parameter names is to look > in /usr/include/bits/confname.h to see what is defined. I can't > spot any other way to get at the information, and I can't find any > runtime utility that provides a listing. > > But a little utility program that could be used to update the > pool might be good enough. Attaching an example C program, I'm > not sure if it helps. > > Dave > > >> On Tue, Oct 13, 2020 at 01:49:00PM -0700, Eliot Miranda wrote: >> Hi David, >> >>> On Mon, Oct 12, 2020 at 8:28 PM David T. Lewis wrote: >>> >>> On Sun, Oct 11, 2020 at 11:15:09AM -0700, Eliot Miranda wrote: >>>> Hi All, >>>> >>>> I want to implement a number of processors query on MacOS & other >>>> unices to complement the info provided by GetSystemInfo on Windows. The >>>> natural way to do this on unices is to use sysconf (3), and of course >>> this >>>> points to the issue for which FFI pools are needed, the constant names >>> for >>>> sysconf such as _SC_NPROCESSORS_ONLN are defined, but their values are >>>> implementation dependent. >>>> >>>> But before I go amd implement an FFI pool for this I thought I'd ask >>>> a) anyone already done this? Is it published anywhere? >>>> b) how are we going to organize such pools so that people don't have to >>>> reinvent the wheel? >>>> c) should there be a pool to cover sysconf or to cover unistd.h? (the >>>> point here is that while the pool might start off small, it could grow >>> and >>>> grow and maybe unistd.h is too much surface to cover) >>>> >>>> thoughts, suggestions? >>> >>> Hi Eliot, >>> >>> At first glance, it looks to me like the hard part of the problem is to >>> know what sysconf names are available to be queried on any given platform >>> at runtime. If you know that, or if you are only interested in a limited >>> number of well-known parameters (which seems likely), then it might be >>> simplest to just implement the sysconf(3) call either as an FFI call or >>> a call through the OSProcess plugin. >>> >> >> Well, I *am* implementing it as an FFI call in Terf. The issue is deriving >> the right integer values for the particular symbolic names, because these >> vary across implementations. And that's what FFIPools are designed to >> manage. >> Right now I don't have the FFIPool so I've hard-wired the constant: >> >> !CMacOSXPlatform methodsFor: 'accessing' stamp: 'eem 10/11/2020 17:53' >> prior: 47990341! >> numberOfCPUs >> "Warning, warning, Will Robertson!!!! The sysconf method bakes in a >> decidedly implementation-specific name for the support library *and* bakes >> in a value for a symbolic constant. Both of these are implementation >> dependent and subject to change. That said..." >> ^self sysconf: 58 >> >> "CPlatform current numberOfCPUs"! ! >> !CMacOSXPlatform methodsFor: 'private' stamp: 'eem 10/11/2020 17:51'! >> sysconf: systemInfo >> "Answer a value from sysconf(3)." >> > '/usr/lib/system/libsystem_c.dylib'> >> ^self externalCallFailed >> >> " | scnprocsonline | >> scnprocsonline := 58. >> self current sysconf: scnprocsonline"! ! >> >> There's much to be unhappy about in this code: libSystem.dylib is the >> abstract name, but one can't use it because the search facilities can't >> chain through the libraries that libSystem.B.dylib (ibSystem.dylib is a >> symbolic link) refers to. So this could break in some future MacOS, >> whereas if libSystem.dylib did work, or if there was a symbolic name we >> could use that meant "the C library goddamnit", then it could be relied >> upon. 58 is meaningful only on MacOS, and presumably only since a >> particular version. That's why we need an FFIPool to manage the >> cross-platform variations. The type is longlong, which means we're not >> using a syntax that matches the declaration, and this will work only on >> 64-bits. We can fix the FFI to interpret C names accoding to the >> playtform, but we have a serious backwards-compatibility problem in that >> all of the FFI definitions up til now have been written under this >> assumption. >> >> But I suspect that I am not answering the right question here. If I am >>> off base, can you give an example of some of the parameters that you >>> would want to be able to query? >>> >> >> First off Terf needs _SC_NUM_PROCESSORS_ONLN, which is notionally the >> number of processors online, but now answers the number of cores, which >> shows you how fast these ideas go stale (_SC_NUM_PROCESSORS_CONF is the >> number of processors configured ;-) ). Other ones that could be meaningful >> for applications include _SC_ARG_MAX (The maximum bytes of argument to >> execve(2)) _SC_CHILD_MAX (The maximum number of simultaneous processes per >> user id), _SC_OPEN_MAX (The maximum number of open files per user id), >> _SC_STREAM_MAX (The minimum maximum number of streams that a process may >> have open at any one time), _SC_PHYS_PAGES (The number of pages of physical >> memory). >> >> There are many others, quite a few I can't imagine ever being compelling. >> >> Now yes, one can imagine implementing a cross-platform abstraction for >> these but it's a lot of effort for little gain. It;s easier just to suck >> it up and implement the FFI call. >> >> But I'm imagining these things will get used by the community and I don't >> want people to have to reinvent the wheel. This kind of stuff doesn't >> belong in trunk, but it does belong somewhere where we can share and >> coevolve the facilities. >> >> >>> Thanks, >>> Dave >>> >>> >>> >> >> -- >> _,,,^..^,,,_ >> best, Eliot > >> > > From commits at source.squeak.org Fri Oct 16 22:51:26 2020 From: commits at source.squeak.org (commits at source.squeak.org) Date: Fri, 16 Oct 2020 22:51:26 0000 Subject: [squeak-dev] FFI: FFI-Pools-eem.26.mcz Message-ID: Eliot Miranda uploaded a new version of FFI-Pools to project FFI: http://source.squeak.org/FFI/FFI-Pools-eem.26.mcz ==================== Summary ==================== Name: FFI-Pools-eem.26 Author: eem Time: 16 October 2020, 3:51:24.378651 pm UUID: 3e62dc88-7003-4072-8ee1-59b68e721be5 Ancestors: FFI-Pools-mt.25 Fix a few typos in ExternalPool's class comment. cFormatPlaceholderFor: is a class-side method consequently it should send initializeAtomicTypesExtra to itself not its class. =============== Diff against FFI-Pools-mt.25 =============== Item was changed: SharedPool subclass: #ExternalPool (excessive size, no diff calculated) Item was changed: ----- Method: ExternalPoolReadWriter class>>cFormatPlaceholderFor: (in category 'code generation') ----- cFormatPlaceholderFor: externalType + AtomicCFormatPlaceholders ifNil: [self initializeAtomicTypesExtra]. - AtomicCFormatPlaceholders ifNil: [self class initializeAtomicTypesExtra]. ^ externalType isPointerType ifTrue: ['%p'] ifFalse: [ AtomicCFormatPlaceholders at: externalType atomicType ifAbsent: [nil]]! From lewis at mail.msen.com Sat Oct 17 03:43:11 2020 From: lewis at mail.msen.com (David T. Lewis) Date: Fri, 16 Oct 2020 23:43:11 -0400 Subject: [squeak-dev] [Vm-dev] Pool for sysconf constants? In-Reply-To: References: <20201013032817.GA78602@shell.msen.com> <20201016214731.GA70979@shell.msen.com> Message-ID: <20201017034311.GA20987@shell.msen.com> Hi Eliot, Here's another idea just to stir the pot. I addad a primitive to UnixOSProcessPlugin and evaluated this in Squeak on Linux: | include names entries sysconf | include := '/usr/include/bits/confname.h'. names := ( OSProcess outputOf: 'grep _SC_ ', include, ' | grep #define | cut -f 2' ) findTokens: String lf. entries := names withIndexCollect: [ :e :i | e asSymbol -> ( OSProcess accessor primSysconf: i - 1 ) ]. sysconf := Dictionary withAll: entries. I'm attaching a picture of the resulting dictionary. $0.02, Dave On Fri, Oct 16, 2020 at 03:23:48PM -0700, Eliot Miranda wrote: > Hi David, > > > > On Oct 16, 2020, at 2:47 PM, David T. Lewis wrote: > > > > ???Hi Eliot, > > > > Replying back on vm-dev. > > > > Indeed I see the problem now, thanks. > > > > The closest that I can come to a useful suggestion is to write a > > little C program to print out the index values of interest for a > > given platform, then read that into the image to build the pool. > > The index values are supposed to be opaque but I doubt that they > > would change much in practice. > > This is what an ExternalPool does *automatically*. One creates a pool > containing a set of named variables, adds metadata to the pool, and > then when the pool needs to initialize or change, it generates the C > program automatically, runs it, reaps the values, and updates class > side code to initialize the constants for specific platforms. When it > is run on a different platform it generates the program for that > platform, etc. The management problem therefore is how to manage the > executable programs because these are needed if one wants to deploy on > a specific platform. > > I came up with the idea many years ago at ParcPlace when the problem > first surfaced (that different platforms, though they may use the same > names for symbolic constants, abstract types, etc, but don't use the > same values, concrete types, etc). Monty write the implementation. > Marcel has shepherded it into source.squeak.org/FFI. Marcel has > written an excellent and comprehensive class comment for ExternalPool. > I urge that everyone interested in deployment using FFIs read it ASAP. > That goes for me too, because things have moved on with the > implementation. There's no need to manage external C programs; > there's a need to merge the definition code that is automatically > generated when run on different platforms. > > I should push thoguh and sdo a sysconf pool to learn how the current > system really works :-) > > > > > I am looking only at a Linux system as I write this, and the only > > way I can find to discover the available parameter names is to look > > in /usr/include/bits/confname.h to see what is defined. I can't > > spot any other way to get at the information, and I can't find any > > runtime utility that provides a listing. > > > > But a little utility program that could be used to update the > > pool might be good enough. Attaching an example C program, I'm > > not sure if it helps. > > > > Dave > > > > > >> On Tue, Oct 13, 2020 at 01:49:00PM -0700, Eliot Miranda wrote: > >> Hi David, > >> > >>> On Mon, Oct 12, 2020 at 8:28 PM David T. Lewis wrote: > >>> > >>> On Sun, Oct 11, 2020 at 11:15:09AM -0700, Eliot Miranda wrote: > >>>> Hi All, > >>>> > >>>> I want to implement a number of processors query on MacOS & other > >>>> unices to complement the info provided by GetSystemInfo on Windows. The > >>>> natural way to do this on unices is to use sysconf (3), and of course > >>> this > >>>> points to the issue for which FFI pools are needed, the constant names > >>> for > >>>> sysconf such as _SC_NPROCESSORS_ONLN are defined, but their values are > >>>> implementation dependent. > >>>> > >>>> But before I go amd implement an FFI pool for this I thought I'd ask > >>>> a) anyone already done this? Is it published anywhere? > >>>> b) how are we going to organize such pools so that people don't have to > >>>> reinvent the wheel? > >>>> c) should there be a pool to cover sysconf or to cover unistd.h? (the > >>>> point here is that while the pool might start off small, it could grow > >>> and > >>>> grow and maybe unistd.h is too much surface to cover) > >>>> > >>>> thoughts, suggestions? > >>> > >>> Hi Eliot, > >>> > >>> At first glance, it looks to me like the hard part of the problem is to > >>> know what sysconf names are available to be queried on any given platform > >>> at runtime. If you know that, or if you are only interested in a limited > >>> number of well-known parameters (which seems likely), then it might be > >>> simplest to just implement the sysconf(3) call either as an FFI call or > >>> a call through the OSProcess plugin. > >>> > >> > >> Well, I *am* implementing it as an FFI call in Terf. The issue is deriving > >> the right integer values for the particular symbolic names, because these > >> vary across implementations. And that's what FFIPools are designed to > >> manage. > >> Right now I don't have the FFIPool so I've hard-wired the constant: > >> > >> !CMacOSXPlatform methodsFor: 'accessing' stamp: 'eem 10/11/2020 17:53' > >> prior: 47990341! > >> numberOfCPUs > >> "Warning, warning, Will Robertson!!!! The sysconf method bakes in a > >> decidedly implementation-specific name for the support library *and* bakes > >> in a value for a symbolic constant. Both of these are implementation > >> dependent and subject to change. That said..." > >> ^self sysconf: 58 > >> > >> "CPlatform current numberOfCPUs"! ! > >> !CMacOSXPlatform methodsFor: 'private' stamp: 'eem 10/11/2020 17:51'! > >> sysconf: systemInfo > >> "Answer a value from sysconf(3)." > >> >> '/usr/lib/system/libsystem_c.dylib'> > >> ^self externalCallFailed > >> > >> " | scnprocsonline | > >> scnprocsonline := 58. > >> self current sysconf: scnprocsonline"! ! > >> > >> There's much to be unhappy about in this code: libSystem.dylib is the > >> abstract name, but one can't use it because the search facilities can't > >> chain through the libraries that libSystem.B.dylib (ibSystem.dylib is a > >> symbolic link) refers to. So this could break in some future MacOS, > >> whereas if libSystem.dylib did work, or if there was a symbolic name we > >> could use that meant "the C library goddamnit", then it could be relied > >> upon. 58 is meaningful only on MacOS, and presumably only since a > >> particular version. That's why we need an FFIPool to manage the > >> cross-platform variations. The type is longlong, which means we're not > >> using a syntax that matches the declaration, and this will work only on > >> 64-bits. We can fix the FFI to interpret C names accoding to the > >> playtform, but we have a serious backwards-compatibility problem in that > >> all of the FFI definitions up til now have been written under this > >> assumption. > >> > >> But I suspect that I am not answering the right question here. If I am > >>> off base, can you give an example of some of the parameters that you > >>> would want to be able to query? > >>> > >> > >> First off Terf needs _SC_NUM_PROCESSORS_ONLN, which is notionally the > >> number of processors online, but now answers the number of cores, which > >> shows you how fast these ideas go stale (_SC_NUM_PROCESSORS_CONF is the > >> number of processors configured ;-) ). Other ones that could be meaningful > >> for applications include _SC_ARG_MAX (The maximum bytes of argument to > >> execve(2)) _SC_CHILD_MAX (The maximum number of simultaneous processes per > >> user id), _SC_OPEN_MAX (The maximum number of open files per user id), > >> _SC_STREAM_MAX (The minimum maximum number of streams that a process may > >> have open at any one time), _SC_PHYS_PAGES (The number of pages of physical > >> memory). > >> > >> There are many others, quite a few I can't imagine ever being compelling. > >> > >> Now yes, one can imagine implementing a cross-platform abstraction for > >> these but it's a lot of effort for little gain. It;s easier just to suck > >> it up and implement the FFI call. > >> > >> But I'm imagining these things will get used by the community and I don't > >> want people to have to reinvent the wheel. This kind of stuff doesn't > >> belong in trunk, but it does belong somewhere where we can share and > >> coevolve the facilities. > >> > >> > >>> Thanks, > >>> Dave > >>> > >>> > >>> > >> > >> -- > >> _,,,^..^,,,_ > >> best, Eliot > > > >> > > > > > -------------- next part -------------- A non-text attachment was scrubbed... Name: a Dictionary(size 120).png Type: image/png Size: 46885 bytes Desc: not available URL: From commits at source.squeak.org Sat Oct 17 07:11:06 2020 From: commits at source.squeak.org (commits at source.squeak.org) Date: Sat, 17 Oct 2020 07:11:06 0000 Subject: [squeak-dev] The Inbox: Compiler-tobe.448.mcz Message-ID: A new version of Compiler was added to project The Inbox: http://source.squeak.org/inbox/Compiler-tobe.448.mcz ==================== Summary ==================== Name: Compiler-tobe.448 Author: tobe Time: 17 October 2020, 9:11:04.555834 am UUID: 0827d6fb-39db-4734-8440-9c0af90b39e5 Ancestors: Compiler-eem.447 Report pc for closureCreationNodes of full blocks See BlockNode>>#emitCodeForValue:encoder: for the analogous call without full blocks =============== Diff against Compiler-eem.447 =============== Item was changed: ----- Method: BlockNode>>emitCodeForFullBlockValue:encoder: (in category 'code generation') ----- emitCodeForFullBlockValue: stack encoder: encoder copiedValues do: [:copiedValue| copiedValue emitCodeForValue: stack encoder: encoder]. + closureCreationNode pc: encoder nextPC. encoder genPushFullClosure: closureCreationNode index numCopied: copiedValues size. stack pop: copiedValues size; push: 1! From eliot.miranda at gmail.com Sat Oct 17 09:19:25 2020 From: eliot.miranda at gmail.com (Eliot Miranda) Date: Sat, 17 Oct 2020 02:19:25 -0700 Subject: [squeak-dev] The Inbox: Compiler-tobe.448.mcz In-Reply-To: References: Message-ID: > On Oct 17, 2020, at 12:11 AM, commits at source.squeak.org wrote: > > A new version of Compiler was added to project The Inbox: > http://source.squeak.org/inbox/Compiler-tobe.448.mcz > > ==================== Summary ==================== > > Name: Compiler-tobe.448 > Author: tobe > Time: 17 October 2020, 9:11:04.555834 am > UUID: 0827d6fb-39db-4734-8440-9c0af90b39e5 > Ancestors: Compiler-eem.447 > > Report pc for closureCreationNodes of full blocks > > See BlockNode>>#emitCodeForValue:encoder: for the analogous call without full blocks > > =============== Diff against Compiler-eem.447 =============== > > Item was changed: > ----- Method: BlockNode>>emitCodeForFullBlockValue:encoder: (in category 'code generation') ----- > emitCodeForFullBlockValue: stack encoder: encoder > copiedValues do: > [:copiedValue| copiedValue emitCodeForValue: stack encoder: encoder]. > + closureCreationNode pc: encoder nextPC. > encoder > genPushFullClosure: closureCreationNode index > numCopied: copiedValues size. > stack > pop: copiedValues size; > push: 1! Looks right to me. Push it to trunk... From builds at travis-ci.org Sat Oct 17 15:19:48 2020 From: builds at travis-ci.org (Travis CI) Date: Sat, 17 Oct 2020 15:19:48 +0000 Subject: [squeak-dev] [CRON] Passed: squeak-smalltalk/squeak-app#1862 (squeak-trunk - 25ebaf1) In-Reply-To: Message-ID: <5f8b0b9398144_13f9ab37c2e18165196@travis-tasks-564b9fdf5c-fq6t5.mail> Build Update for squeak-smalltalk/squeak-app ------------------------------------- Build: #1862 Status: Passed Duration: 14 mins and 25 secs Commit: 25ebaf1 (squeak-trunk) Author: Marcel Taeumel Message: Hi all! The project "squeak-app" is part of the continuous build infrastructure (short: CI) for Squeak's bundles, which you can download at https://files.squeak.org/, followed by the version tag you are looking for. All bundles are updated on a regular basis, which is daily for Trunk (i.e. the current alpha version) and monthly for release versions. Note that there won't be new bundles if Squeak's build number, which reflects in-image code updates, did not change between CI jobs. -- The Squeak Oversight Board [ci skip] View the changeset: https://github.com/squeak-smalltalk/squeak-app/compare/fb55517f583fe544f9225413a23fe82a680200c2...25ebaf18249322227da1f7c767384cb35082fab7 View the full build log and details: https://travis-ci.org/github/squeak-smalltalk/squeak-app/builds/736634442?utm_medium=notification&utm_source=email -- You can unsubscribe from build emails from the squeak-smalltalk/squeak-app repository going to https://travis-ci.org/account/preferences/unsubscribe?repository=8901856&utm_medium=notification&utm_source=email. Or unsubscribe from *all* email updating your settings at https://travis-ci.org/account/preferences/unsubscribe?utm_medium=notification&utm_source=email. Or configure specific recipients for build notifications in your .travis.yml file. See https://docs.travis-ci.com/user/notifications. -------------- next part -------------- An HTML attachment was scrubbed... URL: From commits at source.squeak.org Sat Oct 17 16:03:41 2020 From: commits at source.squeak.org (commits at source.squeak.org) Date: Sat, 17 Oct 2020 16:03:41 0000 Subject: [squeak-dev] The Inbox: EToys-kfr.412.mcz Message-ID: A new version of EToys was added to project The Inbox: http://source.squeak.org/inbox/EToys-kfr.412.mcz ==================== Summary ==================== Name: EToys-kfr.412 Author: kfr Time: 17 October 2020, 6:03:37.158564 pm UUID: 391b4e19-c1be-b94a-9ce4-1da156f696c0 Ancestors: EToys-kfr.392, EToys-eem.411 self world can return nil =============== Diff against EToys-kfr.392 =============== Item was changed: ----- Method: CategoryViewer>>assureCategoryFullyVisible (in category '*Etoys-Squeakland-categories') ----- assureCategoryFullyVisible "Keep deleting categoryviewers other than the receiver until the receiver is fully visible." | ready toDelete | ready := false. + [(self bounds bottom > Project current world bottom) and: [ready not]] whileTrue: [ + owner submorphs size > 2 + ifTrue: [ + toDelete := owner submorphs allButFirst reversed + detect: [:cv | cv ~~ self] + ifNone: [^ self]. - [(self bounds bottom > ActiveWorld bottom) and: [ready not]] whileTrue: - [owner submorphs size > 2 ifTrue: - [toDelete :=owner submorphs allButFirst reversed detect: [:cv | cv ~~ self] ifNone: [^ self]. toDelete delete. + self world doOneCycleNow] + ifFalse: [ + ready := true]].! - ActiveWorld doOneCycleNow] - ifFalse: - [ready := true]]! From commits at source.squeak.org Sat Oct 17 17:13:03 2020 From: commits at source.squeak.org (commits at source.squeak.org) Date: Sat, 17 Oct 2020 17:13:03 0000 Subject: [squeak-dev] The Trunk: Tools-eem.1003.mcz Message-ID: Eliot Miranda uploaded a new version of Tools to project The Trunk: http://source.squeak.org/trunk/Tools-eem.1003.mcz ==================== Summary ==================== Name: Tools-eem.1003 Author: eem Time: 17 October 2020, 10:13:01.009098 am UUID: 2da79925-8c60-44c5-a279-aac5879807cc Ancestors: Tools-mt.1002 Add a copy stack to clipboard menu item to the process browser. =============== Diff against Tools-mt.1002 =============== Item was added: + ----- Method: ProcessBrowser>>copyProcessStackToClipboard (in category 'process list') ----- + copyProcessStackToClipboard + | stackStream startContext | + stackStream := WriteStream on: (String new: 256). + startContext := selectedProcess == Processor activeProcess + ifTrue: [thisContext] + ifFalse: [selectedProcess suspendedContext]. + startContext findContextSuchThat: + [:context| + stackStream print: context; cr. + false]. + Clipboard clipboardText: stackStream contents! Item was changed: ----- Method: ProcessBrowser>>processListMenu: (in category 'process list') ----- + processListMenu: menu - processListMenu: menu - | pw | + selectedProcess ifNotNil: + [:process| + [:name :allowStop :allowDebug| + menu addList: #(('inspect (i)' inspectProcess) ('explore (I)' exploreProcess) ('inspect Pointers (P)' inspectPointers)). + (Smalltalk includesKey: #PointerFinder) ifTrue: + [menu add: 'chase pointers (c)' action: #chasePointers]. + allowStop ifTrue: + [menu add: 'terminate (t)' action: #terminateProcess. + process isSuspended + ifTrue: [menu add: 'resume (r)' action: #resumeProcess] + ifFalse: [menu add: 'suspend (s)' action: #suspendProcess]]. + allowDebug ifTrue: + [menu addList: #(('change priority (p)' changePriority) ('debug (d)' debugProcess))]. + menu add: 'profile messages (m)' action: #messageTally. + (process suspendingList isKindOf: Semaphore) ifTrue: + [menu add: 'signal Semaphore (S)' action: #signalSemaphore]. + menu addList: #(('full stack (k)' moreStack) ('copy stack to clipboard' copyProcessStackToClipboard)). + menu addLine] valueWithArguments: (self nameAndRulesFor: process)]. - selectedProcess - ifNotNil: [| nameAndRules | - nameAndRules := self nameAndRulesForSelectedProcess. - menu addList: {{'inspect (i)'. #inspectProcess}. {'explore (I)'. #exploreProcess}. {'inspect Pointers (P)'. #inspectPointers}}. - (Smalltalk includesKey: #PointerFinder) - ifTrue: [ menu add: 'chase pointers (c)' action: #chasePointers. ]. - nameAndRules second - ifTrue: [menu add: 'terminate (t)' action: #terminateProcess. - selectedProcess isSuspended - ifTrue: [menu add: 'resume (r)' action: #resumeProcess] - ifFalse: [menu add: 'suspend (s)' action: #suspendProcess]]. - nameAndRules third - ifTrue: [menu addList: {{'change priority (p)'. #changePriority}. {'debug (d)'. #debugProcess}}]. - menu addList: {{'profile messages (m)'. #messageTally}}. - (selectedProcess suspendingList isKindOf: Semaphore) - ifTrue: [menu add: 'signal Semaphore (S)' action: #signalSemaphore]. - menu add: 'full stack (k)' action: #moreStack. - menu addLine]. - menu addList: {{'find context... (f)'. #findContext}. {'find again (g)'. #nextContext}}. - menu addLine. - menu + addList: #(#('find context... (f)' findContext) #('find again (g)' nextContext)); + addLine; add: (self isAutoUpdating ifTrue: ['turn off auto-update (a)'] ifFalse: ['turn on auto-update (a)']) + action: #toggleAutoUpdate; + add: 'update list (u)' action: #updateProcessList. - action: #toggleAutoUpdate. - menu add: 'update list (u)' action: #updateProcessList. + (Smalltalk at: #CPUWatcher ifAbsent: []) ifNotNil: + [:pw| - pw := Smalltalk at: #CPUWatcher ifAbsent: []. - pw ifNotNil: [ menu addLine. pw isMonitoring + ifTrue: [menu add: 'stop CPUWatcher' action: #stopCPUWatcher] + ifFalse: [menu add: 'start CPUWatcher' action: #startCPUWatcher]]. - ifTrue: [ menu add: 'stop CPUWatcher' action: #stopCPUWatcher ] - ifFalse: [ menu add: 'start CPUWatcher' action: #startCPUWatcher ] - ]. + ^menu! - ^ menu! From tim at rowledge.org Sat Oct 17 18:02:57 2020 From: tim at rowledge.org (tim Rowledge) Date: Sat, 17 Oct 2020 11:02:57 -0700 Subject: [squeak-dev] The Inbox: EToys-kfr.412.mcz In-Reply-To: References: Message-ID: <1C318624-9DFB-44DE-A32C-AAB72F753F02@rowledge.org> > On 2020-10-17, at 9:03 AM, commits at source.squeak.org wrote: > > self world can return nil That is somehow both deeply philosophical and sad tim -- tim Rowledge; tim at rowledge.org; http://www.rowledge.org/tim Useful random insult:- Settled some during shipping and handling. From tim at rowledge.org Sat Oct 17 20:37:28 2020 From: tim at rowledge.org (tim Rowledge) Date: Sat, 17 Oct 2020 13:37:28 -0700 Subject: [squeak-dev] Improving the SystemNavigation browseMessageList... stuff Message-ID: I just had reason to take a look at the list of unimplemented messages in my working image. I was a bit surprised to see such a large number *not* related to my current work - in fact the latest trunk image claims *577* cases. Obviously a few are legitimate places where some test needs an unimplemented symbol to find but still, that's a lot of places where sometihng is going to go wrong. It has to be said that VeryPickyMorph>>#justDroppedInto:event: is especially amusing in this regard. Maybe not so picky after all? What struck me though was how unhelpful the browser ends up being in this case. What we get is a long list of methods where a) there are duplicates - see MenuMorph>>#setTitleParametersFor: for an example. It apparently sends titleColor, titleBorderStyle, titleBorderColor and titleBorderWidth and appears 4 time in the browser. I'd claim that it would be far better to build some variety of Set of MethodReferences in MessageSet>>#initializeMessageList: b) we lose the useful info about which message is unimplemented in the parsing in MessageSet>>#initializeMessageList:. Oddly, I'd swear I've seen something, somewhere, sometime, that could holds onto some more info to pass onto a browser. Anybody? And of course, the browser would need some extensions to actually display the unimplemented message. This might even be a place where Shout would actually appeal even to me. The first question really has to be whether anyone has already tackled this stuff? tim -- tim Rowledge; tim at rowledge.org; http://www.rowledge.org/tim A computer's attention span is only as long as its extension cor................. From tim at rowledge.org Sat Oct 17 23:15:55 2020 From: tim at rowledge.org (tim Rowledge) Date: Sat, 17 Oct 2020 16:15:55 -0700 Subject: [squeak-dev] Improving the SystemNavigation browseMessageList... stuff In-Reply-To: References: Message-ID: <6A70A9A6-A1D2-4402-84A5-AD39DB02FD03@rowledge.org> > On 2020-10-17, at 1:37 PM, tim Rowledge wrote: > > What struck me though was how unhelpful the browser ends up being in this case. What we get is a long list of methods where > a) there are duplicates - see MenuMorph>>#setTitleParametersFor: for an example. It apparently sends titleColor, titleBorderStyle, titleBorderColor and titleBorderWidth and appears 4 time in the browser. I'd claim that it would be far better to build some variety of Set of MethodReferences in MessageSet>>#initializeMessageList: Making a Set instead is easy enough, and then if we convert that to a SortedCollection we get a more useful result. It only takes trivial changes to two methods to do this. Unfortunately it also reveals that the SystemNavigation>>#browseMessageList:name:autoSelect: is in need of some improvement since the 'nothing selected' label is set to the proffered label + the raw incoming collection size - and that is not correct after the Set conversion. This raises a philosophical question about how we really want MessageSet browsers to behave. If we create a list with one method reference repeated 100 times, is there any reason at all anyone would want to see a 100 entry browser list? And is there any reason anyone can think of to not move that label-futzing code into the actual tool instead of a rather unwarranted assumption in the SystemNavigation code? There a promising (if complicated) method #adjustWindowTitleAfterFiltering but unfortunately there is no containing window at the relevant time and so it cannot do the job. tim -- tim Rowledge; tim at rowledge.org; http://www.rowledge.org/tim Strange OpCodes: IBLU: Ignore Basic Laws of Universe From commits at source.squeak.org Sun Oct 18 08:57:13 2020 From: commits at source.squeak.org (commits at source.squeak.org) Date: Sun, 18 Oct 2020 08:57:13 0000 Subject: [squeak-dev] The Inbox: EToys-kfr.413.mcz Message-ID: A new version of EToys was added to project The Inbox: http://source.squeak.org/inbox/EToys-kfr.413.mcz ==================== Summary ==================== Name: EToys-kfr.413 Author: kfr Time: 18 October 2020, 10:57:08.264564 am UUID: eb3b58a1-b672-ba44-9a34-8f6f69215531 Ancestors: EToys-kfr.412 do the most basic installs so Etoys appears with right icons. A few more icons for BookMorph =============== Diff against EToys-kfr.412 =============== Item was changed: ----- Method: ReleaseBuilderSqueakland class>>loadMostUsedEtoysForms (in category 'preparing') ----- loadMostUsedEtoysForms "add must used Etoy icons to ScriptingSystem formDictionary" + "ReleaseBuilderSqueakland loadMostUsedEtoysForms " + "RoundGoldBox, TryItPressed, TryIt, MenuIcon, AddCategoryViewer, AddInstanceVariable, TanOPressed, TanO, Gets, RightCaret, DownCaret, NextPage, NextPagePressed, PrevPage, PrevPagePressed" - "RoundGoldBox, TryItPressed, TryIt, MenuIcon, AddCategoryViewer, AddInstanceVariable, TanOPressed, TanO, Gets, RightCaret, DownCaret" | assoc | + {#scriptingSystemImage109. #scriptingSystemImage127. #scriptingSystemImage064. #scriptingSystemImage038. #scriptingSystemImage165. #scriptingSystemImage171. #scriptingSystemImage014. #scriptingSystemImage053. #scriptingSystemImage080. #scriptingSystemImage044. #scriptingSystemImage023. #scriptingSystemImage032. #scriptingSystemImage107. #scriptingSystemImage153.} - {#scriptingSystemImage109. #scriptingSystemImage127. #scriptingSystemImage064. #scriptingSystemImage038. #scriptingSystemImage165. #scriptingSystemImage171. #scriptingSystemImage014. #scriptingSystemImage053. #scriptingSystemImage080. #scriptingSystemImage044.} do: [:sym | assoc := (self perform: sym). ScriptingSystem saveForm: assoc value atKey: assoc key].! From gettimothy at zoho.com Sun Oct 18 10:18:51 2020 From: gettimothy at zoho.com (gettimothy) Date: Sun, 18 Oct 2020 06:18:51 -0400 Subject: [squeak-dev] Squeak6.0alpha-2002-64bit linux 64x64 Error installing extra packages Message-ID: <1753b380faf.11a118c0b53407.7861349335463862301@zoho.com> Hi folks I was trying to spin up the latest image/vm pair from trunk on linux64x64 for the Roassal install methodology and got a new bug.. I am assuming Linus' law will apply and somebody will find this bug to be shallow.... Error: updateMapName must be specified Pops up immediately when attempting to install the extra packages at the end of the magnificent preferences wizard. Bug appears to start in PreferenceWizardMorph >> installLatestUpdates MCConfiguration ensureOpenTranscript: false. [MCMcmUpdater default doUpdate: false] ensure: [MCConfiguration ensureOpenTranscript: true]. and barfs at MCMcmUpdater >>register "Register this instance, keyed by repository and update map name. Each update maintains its own lastUpdateMap. The registry permits multilple updaters to be maintained, with each updater keeping track of its own last update map."updateMapName isEmpty ifTrue:  [self error: 'updateMapName must be specified']. repository ifNil: [self error: 'repository is ', repository asString]. updateMapName ifNil: [self error: 'updateMapName is ', updateMapName asString]. updateMapName isEmpty ifTrue:  [self error: 'updateMapName must be specified']. ((Registry ifNil: [Registry := Dictionary new]) at: repository ifAbsentPut: [Dictionary new]) at: updateMapName put: self cheers, tty -------------- next part -------------- An HTML attachment was scrubbed... URL: From gettimothy at zoho.com Sun Oct 18 10:57:28 2020 From: gettimothy at zoho.com (gettimothy) Date: Sun, 18 Oct 2020 06:57:28 -0400 Subject: [squeak-dev] FileList "Workspace from Foo.txt" is a redundant OCD nightmare Message-ID: <1753b5b6a08.12001c4da53564.7892679353013142855@zoho.com> Ignore as fitting https://www.pinterest.com/indigogeek/ocd-nightmares/ FileList >>viewContentsInWorkspace "View the contents of my selected file in a new workspace" | aString aFileStream aName | aString := (aFileStream := directory readOnlyFileNamed: self fullName) setConverterForCode contentsOfEntireFile. aName := aFileStream localName. aFileStream close. UIManager default edit: aString withSqueakLineEndings label: 'Workspace from ', aName maybe its the OCD in me, but that verbiage preceding the file name at the top of a workspace is redundant and annoying. 1. redundant--it is at the top of a Workspace. 2. the infinitely expanding title ala Worspace from Workspace from Worspace from Workspace from Foo.txt 3. I have to edit each title upon file in. see OCD above. A simple change to the method: FileList >> viewContentsInWorkspace "View the contents of my selected file in a new workspace" | aString aFileStream aName | aString := (aFileStream := directory readOnlyFileNamed: self fullName) setConverterForCode contentsOfEntireFile. aName := aFileStream localName. aFileStream close. UIManager default edit: aString withSqueakLineEndings label: aName eradicates the OCD nightmare   cheers, tty -------------- next part -------------- An HTML attachment was scrubbed... URL: From gettimothy at zoho.com Sun Oct 18 11:18:29 2020 From: gettimothy at zoho.com (gettimothy) Date: Sun, 18 Oct 2020 07:18:29 -0400 Subject: [squeak-dev] Roassal next steps. Message-ID: <1753b6eaa9b.100671f7753664.7962165064272652854@zoho.com> Hi Jakob "We" might not need Announcements, but Roassal uses them, so "it" needs them. :-) Is AXAnnouncements still API-compatible with the Pharo Announcements (or should I phrase this the other way around)? Either way, it would be nice to have a working Pharo-Announcements-API implementation for Squeak, at least for compatibility's sake. It doesn't have to be in the Trunk, but once you have an implementation or shim, one would extend the BaselineOfRoassal to include this dependency for Squeak only. I think this is worth working on. One problem, is that I have no idea how to access the pharo Announcements repo so I can get it into squeak. The pharo-local/package-cache is empty for the Announcments-Core(tonel-1)  and I don't know where to look on the web for pharo stuff. Any pointers much appreciated, thx -- Sent from: http://forum.world.st/Squeak-Dev-f45488.html -------------- next part -------------- An HTML attachment was scrubbed... URL: From gettimothy at zoho.com Sun Oct 18 11:25:16 2020 From: gettimothy at zoho.com (gettimothy) Date: Sun, 18 Oct 2020 07:25:16 -0400 Subject: [squeak-dev] Roassal next steps. In-Reply-To: <1753b6eaa9b.100671f7753664.7962165064272652854@zoho.com> References: <1753b6eaa9b.100671f7753664.7962165064272652854@zoho.com> Message-ID: <1753b74de70.c330f35153689.4421687570681635679@zoho.com> update... I figured out how to clone the pharo-project/pharo repo and it is downloading now. I should be able to figure it out from there.. ---- On Sun, 18 Oct 2020 07:18:29 -0400 gettimothy wrote ---- Hi Jakob "We" might not need Announcements, but Roassal uses them, so "it" needs them. :-) Is AXAnnouncements still API-compatible with the Pharo Announcements (or should I phrase this the other way around)? Either way, it would be nice to have a working Pharo-Announcements-API implementation for Squeak, at least for compatibility's sake. It doesn't have to be in the Trunk, but once you have an implementation or shim, one would extend the BaselineOfRoassal to include this dependency for Squeak only. I think this is worth working on. One problem, is that I have no idea how to access the pharo Announcements repo so I can get it into squeak. The pharo-local/package-cache is empty for the Announcments-Core(tonel-1)  and I don't know where to look on the web for pharo stuff. Any pointers much appreciated, thx -- Sent from: http://forum.world.st/Squeak-Dev-f45488.html -------------- next part -------------- An HTML attachment was scrubbed... URL: From forums.jakob at resfarm.de Sun Oct 18 11:46:57 2020 From: forums.jakob at resfarm.de (Jakob Reschke) Date: Sun, 18 Oct 2020 06:46:57 -0500 (CDT) Subject: [squeak-dev] Improving the SystemNavigation browseMessageList... stuff In-Reply-To: <6A70A9A6-A1D2-4402-84A5-AD39DB02FD03@rowledge.org> References: <6A70A9A6-A1D2-4402-84A5-AD39DB02FD03@rowledge.org> Message-ID: <1603021617930-0.post@n4.nabble.com> Without the unimplemented selector being highlighted, I cannot see a reason why to display a method twice. *But* with Environments you can have the same combination of class name and selector twice or more in the image and these should still appear separate. That means the deduplication must not rely just on the string representation of the method. Instead, MethodReference must be used. -- Sent from: http://forum.world.st/Squeak-Dev-f45488.html From forums.jakob at resfarm.de Sun Oct 18 11:50:43 2020 From: forums.jakob at resfarm.de (Jakob Reschke) Date: Sun, 18 Oct 2020 06:50:43 -0500 (CDT) Subject: [squeak-dev] Improving the SystemNavigation browseMessageList... stuff In-Reply-To: References: Message-ID: <1603021843976-0.post@n4.nabble.com> timrowledge wrote > b) we lose the useful info about which message is unimplemented in the > parsing in MessageSet>>#initializeMessageList:. Oddly, I'd swear I've seen > something, somewhere, sometime, that could holds onto some more info to > pass onto a browser. Anybody? Do you mean something like "Senders of" selecting the sent selector in a found method? In MessageTrace that revolves around the autoSelectStrings variable. In MessageSet it is just one autoSelectString. -- Sent from: http://forum.world.st/Squeak-Dev-f45488.html From tomjonabc at gmail.com Sun Oct 18 12:04:32 2020 From: tomjonabc at gmail.com (Tom Beckmann) Date: Sun, 18 Oct 2020 14:04:32 +0200 Subject: [squeak-dev] Roassal next steps. In-Reply-To: <1753b74de70.c330f35153689.4421687570681635679@zoho.com> References: <1753b6eaa9b.100671f7753664.7962165064272652854@zoho.com> <1753b74de70.c330f35153689.4421687570681635679@zoho.com> Message-ID: Hey timothy, in theory, after loading Roassal3 from the fork I had sent you, you should already have a somewhat working Announcements installed. The two patches that I sent you, I believe, last week, fixed the two test cases that you pointed out were failing. The package I'm loading on Squeak is this one: http://www.squeaksource.com/AXAnnouncements.html (but it should already be installed if you used Metacello to get Roassal3, you can check in your image to see if there already in an "Announcer" class). Are there other roadblocks concerning Announcements that you are encountering? Best, Tom On Sun, Oct 18, 2020 at 1:25 PM gettimothy via Squeak-dev < squeak-dev at lists.squeakfoundation.org> wrote: > > update... > > I figured out how to clone the pharo-project/pharo repo and it is > downloading now. > > I should be able to figure it out from there.. > > > > ---- On Sun, 18 Oct 2020 07:18:29 -0400 *gettimothy >* wrote ---- > > Hi Jakob > > "We" might not need Announcements, but Roassal uses them, so "it" needs > them. > :-) > > Is AXAnnouncements still API-compatible with the Pharo Announcements (or > should I phrase this the other way around)? Either way, it would be nice to > have a working Pharo-Announcements-API implementation for Squeak, at least > for compatibility's sake. It doesn't have to be in the Trunk, but once you > have an implementation or shim, one would extend the BaselineOfRoassal to > include this dependency for Squeak only. > > I think this is worth working on. > > One problem, is that I have no idea how to access the pharo Announcements > repo so I can get it into squeak. > > The pharo-local/package-cache is empty for the Announcments-Core(tonel-1) > and I don't know where to look on the web for pharo stuff. > > Any pointers much appreciated, thx > > > > > > -- > Sent from: http://forum.world.st/Squeak-Dev-f45488.html > > > > > > -------------- next part -------------- An HTML attachment was scrubbed... URL: From gettimothy at zoho.com Sun Oct 18 12:14:34 2020 From: gettimothy at zoho.com (gettimothy) Date: Sun, 18 Oct 2020 08:14:34 -0400 Subject: [squeak-dev] Roassal next steps. Message-ID: <1753ba200ee.d158966153943.112452886309965245@zoho.com> Hi Tom Hey timothy, in theory, after loading Roassal3 from the fork I had sent you, you should already have a somewhat working Announcements installed. The two patches that I sent you, I believe, last week, fixed the two test cases that you pointed out were failing. The package I'm loading on Squeak is this one: http://www.squeaksource.com/AXAnnouncements.html (but it should already be installed if you used Metacello to get Roassal3, you can check in your image to see if there already in an "Announcer" class). Are there other roadblocks concerning Announcements that you are encountering? Best, Tom I tried loading those methods into AXAnnouncments... SubscriptionRegistry>>getInteractionsForClass: eventClass "Return the list of subscription for a given Event class" | answer | answer := OrderedCollection new. subscriptionsByAnnouncementClasses values do: [ :collection | collection do: [:subscription | (subscription action receiver class includesBehavior: eventClass) ifTrue: [answer add: subscription subscriber]]]. ^ answer SubscriptionRegistry>>handleSubscriberClass: eventClass "Return true if the receiver has a callback subscripbed for the event class" ^ subscriptionsByAnnouncementClasses values anySatisfy: [ :subCollection | subCollection anySatisfy: [:subscriber | subscriber action receiver class includesBehavior: eventClass ]] and saw that SubscriptionRegistry is AXSubscriptionRegistry in AXAnnouncements...so, I unloaded AXAnnouncements and loaded Announcements from the same repo. I failed , for some reason that I forget, so I decided to see if I could just get the pharo Announcments into Squeak. If that fails, I will return to the Annoucements/AXAnnouncments . I got the repo downloaded from pharo-project/pharo using Jakib's Git Browser (thank you Jakob) and I ill next figure out how to get that "package" into squeak from that interface. cheers, tty -------------- next part -------------- An HTML attachment was scrubbed... URL: From eliot.miranda at gmail.com Sun Oct 18 12:41:48 2020 From: eliot.miranda at gmail.com (Eliot Miranda) Date: Sun, 18 Oct 2020 05:41:48 -0700 Subject: [squeak-dev] FileList "Workspace from Foo.txt" is a redundant OCD nightmare In-Reply-To: <1753b5b6a08.12001c4da53564.7892679353013142855@zoho.com> References: <1753b5b6a08.12001c4da53564.7892679353013142855@zoho.com> Message-ID: <2D211EBE-2573-4392-A813-D505B8B89FDD@gmail.com> Hi Tim, > On Oct 18, 2020, at 3:57 AM, gettimothy via Squeak-dev wrote: > >  > Ignore as fitting I can join you; this gets on my tits. > > https://www.pinterest.com/indigogeek/ocd-nightmares/ > > > FileList >>viewContentsInWorkspace > "View the contents of my selected file in a new workspace" > > | aString aFileStream aName | > aString := (aFileStream := directory readOnlyFileNamed: self fullName) setConverterForCode contentsOfEntireFile. > aName := aFileStream localName. > aFileStream close. > UIManager default edit: aString withSqueakLineEndings label: 'Workspace from ', aName > > maybe its the OCD in me, but that verbiage preceding the file name at the top of a workspace is redundant and annoying. > > 1. redundant--it is at the top of a Workspace. > 2. the infinitely expanding title ala Worspace from Workspace from Worspace from Workspace from Foo.txt > 3. I have to edit each title upon file in. see OCD above. > > > A simple change to the method: > FileList >> viewContentsInWorkspace > "View the contents of my selected file in a new workspace" > > | aString aFileStream aName | > aString := (aFileStream := directory readOnlyFileNamed: self fullName) setConverterForCode contentsOfEntireFile. > aName := aFileStream localName. > aFileStream close. > UIManager default edit: aString withSqueakLineEndings label: aName > > > > eradicates the OCD nightmare The only thing I’d suggest differently is that it check if the file name contains “Workspace’ and if not, still adds the ‘Workspace from ’ prefix. > cheers, > > tty -------------- next part -------------- An HTML attachment was scrubbed... URL: From gettimothy at zoho.com Sun Oct 18 12:53:50 2020 From: gettimothy at zoho.com (gettimothy) Date: Sun, 18 Oct 2020 08:53:50 -0400 Subject: [squeak-dev] Roassal next steps. Message-ID: <1753bc5f454.d2cc794654145.7766639996931461688@zoho.com> Hi folks, Announcements-Help loaded fine with the clone of the git browser thingy.... Now, I want to clone the -Core and -Tests, but I get dependency warnings that I would like to attempt to resolve if possible. The first hurdle in that is how to use the BaseLineOf  stuff.... I am reading this  https://github.com/pharo-open-documentation/pharo-wiki/blob/master/General/Baselines.md#how-to-load-a-git-project-using-its-baseline and trying and flailing randomly... I cloned BaselineOfManifest into the Squeak and I am looking at it in the Browser as I type this.... https://github.com/pharo-project/pharo/tree/Pharo9.0/src contains the BaselineOfManifest too.... Metacello new githubUser: 'pharo-project' project: 'pharo' commitish: 'master' path: 'Pharo9.0/src/'; baseline: 'Manifest'; load GoferRepositoryError: Error downloading https://github.com/pharo-project/pharo/zipball/master to /tmp/github--pharoprojectpharomaster.zip. Server said: 404: Not Found Anybody see the obvious thing that I am missing? I will continue attempts after I wake up later this afternoon. cheers. -------------- next part -------------- An HTML attachment was scrubbed... URL: From forums.jakob at resfarm.de Sun Oct 18 14:42:00 2020 From: forums.jakob at resfarm.de (Jakob Reschke) Date: Sun, 18 Oct 2020 09:42:00 -0500 (CDT) Subject: [squeak-dev] Roassal next steps. In-Reply-To: <1753bc5f454.d2cc794654145.7766639996931461688@zoho.com> References: <17512d8a134.bc18650752020.4064004373768089549@zoho.com> <1753bc5f454.d2cc794654145.7766639996931461688@zoho.com> Message-ID: <1603032120659-0.post@n4.nabble.com> Squeak - Dev mailing list wrote > https://github.com/pharo-project/pharo/tree/Pharo9.0/src > > > > contains the BaselineOfManifest too.... > > > Metacello new > > githubUser: 'pharo-project' project: 'pharo' commitish: 'master' path: > 'Pharo9.0/src/'; > > baseline: 'Manifest'; > > load > > > > > GoferRepositoryError: Error downloading > https://github.com/pharo-project/pharo/zipball/master to > /tmp/github--pharoprojectpharomaster.zip. Server said: 404: Not Found > > > > > Anybody see the obvious thing that I am missing? https://github.com/pharo-project/pharo/tree/Pharo9.0/src is of branch 'Pharo9.0', so you would have to put that as commitish and not 'master'. -- Sent from: http://forum.world.st/Squeak-Dev-f45488.html From forums.jakob at resfarm.de Sun Oct 18 15:11:38 2020 From: forums.jakob at resfarm.de (Jakob Reschke) Date: Sun, 18 Oct 2020 10:11:38 -0500 (CDT) Subject: [squeak-dev] Roassal next steps. In-Reply-To: <1603032120659-0.post@n4.nabble.com> References: <17512d8a134.bc18650752020.4064004373768089549@zoho.com> <1753bc5f454.d2cc794654145.7766639996931461688@zoho.com> <1603032120659-0.post@n4.nabble.com> Message-ID: <1603033898995-0.post@n4.nabble.com> Jakob Reschke wrote > https://github.com/pharo-project/pharo/tree/Pharo9.0/src is of branch > 'Pharo9.0', so you would have to put that as commitish and not 'master'. For those wondering why you have to put a branch as a "commit"ish: "Commitish" means anything that denotes a single commit at one moment. It can be - the sha1 of a commit (always resolves to that commit), - the name of a branch (resolves to the commit at which the branch currently is -- or the top commit on the branch if you will), or - the name of a tag (resolves to the tagged commit). And if you further wonder why the URL neither says branch nor commitish, but "tree" instead: because the page shows a tree, which is basically a directory listing. The path after the commitish in the URL (/src) identifies the subtree to view. -- Sent from: http://forum.world.st/Squeak-Dev-f45488.html From forums.jakob at resfarm.de Sun Oct 18 15:14:30 2020 From: forums.jakob at resfarm.de (Jakob Reschke) Date: Sun, 18 Oct 2020 10:14:30 -0500 (CDT) Subject: [squeak-dev] Roassal next steps. In-Reply-To: <1603032120659-0.post@n4.nabble.com> References: <17512d8a134.bc18650752020.4064004373768089549@zoho.com> <1753bc5f454.d2cc794654145.7766639996931461688@zoho.com> <1603032120659-0.post@n4.nabble.com> Message-ID: <1603034070734-0.post@n4.nabble.com> Jakob Reschke wrote >> >> Metacello new >> >> githubUser: 'pharo-project' project: 'pharo' commitish: 'master' path: >> 'Pharo9.0/src/'; >> >> baseline: 'Manifest'; >> >> load > > https://github.com/pharo-project/pharo/tree/Pharo9.0/src is of branch > 'Pharo9.0', so you would have to put that as commitish and not 'master'. Oh, and since Pharo9.0 is the branch, this does not belong to the path. Should probably look something like this: Metacello new githubUser: 'pharo-project' project: 'pharo' commitish: 'Pharo9.0' path: 'src'; baseline: 'Manifest'; load -- Sent from: http://forum.world.st/Squeak-Dev-f45488.html From javier_diaz_r at mac.com Sun Oct 18 15:58:47 2020 From: javier_diaz_r at mac.com (Javier Diaz-Reinoso) Date: Sun, 18 Oct 2020 10:58:47 -0500 Subject: [squeak-dev] FileList "Workspace from Foo.txt" is a redundant OCD nightmare In-Reply-To: <2D211EBE-2573-4392-A813-D505B8B89FDD@gmail.com> References: <1753b5b6a08.12001c4da53564.7892679353013142855@zoho.com> <2D211EBE-2573-4392-A813-D505B8B89FDD@gmail.com> Message-ID: <6E969EC2-8C2C-4DEE-8FE7-28696C74B716@mac.com> I send the list a change set years ago and was ignored, the current version I use also preserve the lineConversion and remember the name for save: > On 18 Oct 2020, at 07:41, Eliot Miranda wrote: > > Hi Tim, > > >> On Oct 18, 2020, at 3:57 AM, gettimothy via Squeak-dev > wrote: >> >>  >> Ignore as fitting > > I can join you; this gets on my tits. > >> >> https://www.pinterest.com/indigogeek/ocd-nightmares/ >> >> >> FileList >>viewContentsInWorkspace >> "View the contents of my selected file in a new workspace" >> >> | aString aFileStream aName | >> aString := (aFileStream := directory readOnlyFileNamed: self fullName) setConverterForCode contentsOfEntireFile. >> aName := aFileStream localName. >> aFileStream close. >> UIManager default edit: aString withSqueakLineEndings label: 'Workspace from ',aName >> >> maybe its the OCD in me, but that verbiage preceding the file name at the top of a workspace is redundant and annoying. >> >> 1. redundant--it is at the top of a Workspace. >> 2. the infinitely expanding title ala Worspace from Workspace from Worspace from Workspace from Foo.txt >> 3. I have to edit each title upon file in. see OCD above. >> >> >> A simple change to the method: >> FileList >> viewContentsInWorkspace >> "View the contents of my selected file in a new workspace" >> >> | aString aFileStream aName | >> aString := (aFileStream := directory readOnlyFileNamed: self fullName) setConverterForCode contentsOfEntireFile. >> aName := aFileStream localName. >> aFileStream close. >> UIManager default edit: aString withSqueakLineEndings label: aName >> >> >> >> eradicates the OCD nightmare > > The only thing I’d suggest differently is that it check if the file name contains “Workspace’ and if not, still adds the ‘Workspace from ’ prefix. > >> cheers, >> >> tty -------------- next part -------------- An HTML attachment was scrubbed... URL: -------------- next part -------------- A non-text attachment was scrubbed... Name: BetterSaveWorkspace.5.cs Type: application/octet-stream Size: 2745 bytes Desc: not available URL: -------------- next part -------------- An HTML attachment was scrubbed... URL: From tim at rowledge.org Sun Oct 18 18:30:15 2020 From: tim at rowledge.org (tim Rowledge) Date: Sun, 18 Oct 2020 11:30:15 -0700 Subject: [squeak-dev] Improving the SystemNavigation browseMessageList... stuff In-Reply-To: <1603021617930-0.post@n4.nabble.com> References: <6A70A9A6-A1D2-4402-84A5-AD39DB02FD03@rowledge.org> <1603021617930-0.post@n4.nabble.com> Message-ID: > On 2020-10-18, at 4:46 AM, Jakob Reschke wrote: > > Without the unimplemented selector being highlighted, I cannot see a reason > why to display a method twice. *But* with Environments you can have the same > combination of class name and selector twice or more in the image and these > should still appear separate. That means the deduplication must not rely > just on the string representation of the method. Instead, MethodReference > must be used. MethodReference is indeed used here. See MessageSet>>initializeMessageList: for example. It appears to have properly environment aware #= but just possibly someone might want to change the #<=. I'm trying to avoid worrying about environments, so I won't be that person. The bit needed to make this tool really useful is the ability to highlight the offending unimplemented message(s) in the selected method. MessageTrace adds a list of individually settable autoSelectStrings but of course the entire edit model expects a single contiguous selection and so we can't easily (mis)use that if there are several unimplemented messages in one method. Really, using a text selection as a highlight is pretty much useless as soon as you have a multipart keyword message. Maybe this is something Shout could actually do for us? And in the process perhaps we could end up highlighting the actual messages and not the same characters in a comment just because it is the first place in some text that we find those letters? If we could inform Shout that we want a special highlighting for the attached set of message selectors then *all* the browsers where we want some "show this found thing" would be improvable. We also need a good way to pass the miscreant symbols along from the original input - which is in the form of an OrderedCollection of Strings like 'MenuMorph addTitle:icon:updatingSelector:updateTarget: calls: titleFont' and get the 'titleFont' to some object that the browser will use to trigger the highlighting. I suppose a subclass of MethodReference might solve that, or a simple composite of a MethodReference and a Set of symbols. tim -- tim Rowledge; tim at rowledge.org; http://www.rowledge.org/tim Useful random insult:- Solid concrete from the eyebrows backwards. From gettimothy at zoho.com Sun Oct 18 19:32:25 2020 From: gettimothy at zoho.com (gettimothy) Date: Sun, 18 Oct 2020 15:32:25 -0400 Subject: [squeak-dev] Roassal next steps. In-Reply-To: References: <1753b6eaa9b.100671f7753664.7962165064272652854@zoho.com> <1753b74de70.c330f35153689.4421687570681635679@zoho.com> Message-ID: <1753d32df9e.e844c09f55677.6158600431127577063@zoho.com> Hi Tom, I will probably revert to your version. I just want to torture myself grokking the Pharo tools and getting fluent in transposing from Git to Monticello in both environments. Jakob's Monticello config worked... Metacello new githubUser: 'pharo-project' project: 'pharo' commitish: 'Pharo9.0' path:'src'; baseline: 'Manifest'; load This package depends on the following classes:   AbstractTool   PackageManifest   RGMetaclassDefinition   RGPackageDefinition   RPackageTag   RGMethodDefinition   RPackage   RGClassDescriptionDefinition and I want to see what it takes to get the dependencies installed. I will probably give up when I see the dependency tree growing towards infinity, but I have a stubborn streak in me. cordially, t ---- On Sun, 18 Oct 2020 08:04:32 -0400 Tom Beckmann wrote ---- Hey timothy, in theory, after loading Roassal3 from the fork I had sent you, you should already have a somewhat working Announcements installed. The two patches that I sent you, I believe, last week, fixed the two test cases that you pointed out were failing. The package I'm loading on Squeak is this one: http://www.squeaksource.com/AXAnnouncements.html (but it should already be installed if you used Metacello to get Roassal3, you can check in your image to see if there already in an "Announcer" class). Are there other roadblocks concerning Announcements that you are encountering? Best, Tom On Sun, Oct 18, 2020 at 1:25 PM gettimothy via Squeak-dev wrote: update... I figured out how to clone the pharo-project/pharo repo and it is downloading now. I should be able to figure it out from there.. ---- On Sun, 18 Oct 2020 07:18:29 -0400 gettimothy wrote ---- Hi Jakob "We" might not need Announcements, but Roassal uses them, so "it" needs them. :-) Is AXAnnouncements still API-compatible with the Pharo Announcements (or should I phrase this the other way around)? Either way, it would be nice to have a working Pharo-Announcements-API implementation for Squeak, at least for compatibility's sake. It doesn't have to be in the Trunk, but once you have an implementation or shim, one would extend the BaselineOfRoassal to include this dependency for Squeak only. I think this is worth working on. One problem, is that I have no idea how to access the pharo Announcements repo so I can get it into squeak. The pharo-local/package-cache is empty for the Announcments-Core(tonel-1)  and I don't know where to look on the web for pharo stuff. Any pointers much appreciated, thx -- Sent from: http://forum.world.st/Squeak-Dev-f45488.html -------------- next part -------------- An HTML attachment was scrubbed... URL: From gettimothy at zoho.com Sun Oct 18 19:51:12 2020 From: gettimothy at zoho.com (gettimothy) Date: Sun, 18 Oct 2020 15:51:12 -0400 Subject: [squeak-dev] Roassal next steps. In-Reply-To: References: <1753b6eaa9b.100671f7753664.7962165064272652854@zoho.com> <1753b74de70.c330f35153689.4421687570681635679@zoho.com> Message-ID: <1753d44120f.10a88a5c855793.5560762917848591901@zoho.com> heh... fun fact...try to load the dependency "Kernel-BytecodeEncoders" via Monticello and watch your image evaporate into thin air! I will revert to Tom's suggestion. Unfortunately it is a short weekend for me, so I will have to leave it there for now. Thanks all for your help. -------------- next part -------------- An HTML attachment was scrubbed... URL: From commits at source.squeak.org Sun Oct 18 21:34:18 2020 From: commits at source.squeak.org (commits at source.squeak.org) Date: Sun, 18 Oct 2020 21:34:18 0000 Subject: [squeak-dev] The Trunk: SystemReporter-eem.45.mcz Message-ID: Eliot Miranda uploaded a new version of SystemReporter to project The Trunk: http://source.squeak.org/trunk/SystemReporter-eem.45.mcz ==================== Summary ==================== Name: SystemReporter-eem.45 Author: eem Time: 18 October 2020, 2:34:17.259317 pm UUID: 619832bc-d802-481e-810e-9f16300125e3 Ancestors: SystemReporter-eem.44 Add BIT_IDENTICAL_FLOATING_POINT to the CogVMFeatureFlags printing. Print flag fields in binary to the appropriate width. =============== Diff against SystemReporter-eem.44 =============== Item was changed: ----- Method: SystemReporter>>reportVMParameters: (in category 'reporting') ----- reportVMParameters: aStream | vmParameters isStack isCog isSpur | self header: 'Virtual Machine Parameters' on: aStream. vmParameters := Smalltalk vm getVMParameters. isStack := (vmParameters at: 42 ifAbsent: [0]) ~= 0. "42 = number of stack pages available" isCog := isStack and: [(vmParameters at: 46) ~= 0]. "46 is machine code zone size" isSpur := isStack and: [(vmParameters at: 41) anyMask: 2r10000]. "41 is imageFormatVersion for the VM; bit 16 is the Spur bit" (isSpur ifFalse: [#( 1 'size of old space' 2 'size of young+old space' 3 'size of memory' 4 'allocationCount' 5 'allocations between GCs' 6 'survivor count tenuring threshold')] ifTrue: [#( 1 'size of old space' 2 'used bytes in new space (used eden + used past space)' 3 'size of heap')]), #( 7 'full GCs since startup' 8 'total milliseconds in full GCs since startup'), (isSpur ifFalse: [#( 9 'incremental GCs since startup' 10 'total milliseconds in incremental GCs since startup' 11 'tenures of surving objects since startup'), {12 to: 19. 'specific to the translating VM'}] ifTrue: [#( 9 'scavenging GCs since startup' 10 'total milliseconds in scavenging GCs since startup' 11 'tenures of surving objects since startup'), {12 to: 15. 'reserved for future use'}, #( 16 'total microseconds in idle since startup' 17 'proportion of code zone available for use (Sista VMs only; read-write)' 18 'total milliseconds in full GC compaction since startup (a portion of parameter 8)' 19 'scavenge threshold; the effective size of eden')]), #( 20 'utc microseconds at startup (if non-zero)' 21 'root/remembered table size (occupancy)' 22 'root/remembered table overflows since startup' 23 'bytes of extra memory to reserve for VM buffers, plugins, etc.' 24 'free memory threshold above which object memory will be shrunk' 25 'memory headroom when growing object memory'), (isStack ifFalse: [#( 26 'interruptChecksEveryNms - force an ioProcessEvents every N milliseconds, in case the image is not calling getNextEvent often')] ifTrue: [#( 26 'heartbeat period (ms; see #58)')]), (isSpur ifFalse: [#( 27 'number of times mark loop iterated for current IGC/FGC includes ALL marking' 28 'number of times sweep loop iterated for current IGC/FGC' 29 'number of times make forward loop iterated for current IGC/FGC' 30 'number of times compact move loop iterated for current IGC/FGC')] ifTrue: [#()]), #( 31 'number of grow memory requests' 32 'number of shrink memory requests'), (isSpur ifFalse: [#( 33 'number of root table entries used for current IGC/FGC' 34 'number of allocations done before current IGC/FGC' 35 'number of survivor objects after current IGC/FGC' 36 'millisecond clock when current IGC/FGC completed' 37 'number of marked objects for Roots of the world, not including Root Table entries for current IGC/FGC' 38 'milliseconds taken by current IGC' 39 'Number of finalization signals for Weak Objects pending when current IGC/FGC completed')] ifTrue: [#( 33 'number of root table entries at last scavenge' 35 'number of survivor objects at last scavenge (if non-zero)' 36 'millisecond clock when current scavenge completed' 38 'milliseconds taken by current scavenge' 39 'Number of finalization signals for Weak Objects pending when current SGC/FGC completed')]), #( 40 'VM word size - 4 or 8'), (isStack ifTrue: [#( 41 'imageFormatVersion for the VM' 42 'number of stack pages available' 43 'desired number of stack pages (stored in image file header, max 65535)' 44 'size of eden, in bytes' 45 'desired size of eden, in bytes (stored in image file header)' 46 'machine code zone size, in bytes (0 in Stack VM)' 47 'desired machine code zone size (0 => default 1Mb to 2Mb depending on processor)'), { 48. 'Persistent image header flags\ bit 0: implies Process has threadId as its 4th inst var\ bit 1: if set, methods that are interpreted will have the flag bit set in their header\ bit 2: if set, implies preempting a process does not put it to the back of its run queue\ bit 3: if set, implies the GUI should run on the first thread and event queues should not be accessed from other threads\ bit 4: if set, implies the new finalization scheme where WeakArrays are queued\ bit 5: if set, implies wheel events will be delivered as such and not mapped to arrow key events\ bit 6: if set, implies arithmetic primitives will fail if given arguments of different types (float vs int)' withCRs }, #( 49 'max size the image promises to grow the external semaphore table to'), (isSpur ifFalse: [{ 50 to: 51. 'reserved for VM parameters that persist in the image (such as size of eden above)'. 52 to: 56. 'specific to Spur' }] ifTrue: [{ 50 to: 51. 'reserved for VM parameters that persist in the image (such as size of eden above)' }, #( 52 'root/remembered table capacity' 53 'number of old space segments' 54 'total free old space' 55 'ratio of growth and image size at or above which a GC will be performed post scavenge')]), #( 56 'number of process switches since startup' 57 'number of ioProcessEvents calls since startup' 58 'number of forceInterruptCheck calls since startup' 59 'number of check event calls since startup' 60 'number of stack page overflows since startup' 61 'number of stack page divorces since startup' 62 'compiled code compactions since startup'), (isCog ifFalse: [#()] ifTrue: [#( 63 'total milliseconds in compiled code compactions since startup' 64 'the number of methods that currently have jitted machine-code')]), + { 65. 'Cog feature flags\ bit 0: set if the VM supports MULTIPLE_BYTECODE_SETS.\ bit 1: set if the VM supports read-only objects (IMMUTABILITY).\ bit 2: set if the VM has an ITIMER_HEARTBEAT\ bit 3: set if the VM supports cross-platform BIT_IDENTICAL_FLOATING_POINT arithmetic' withCRs. - { 65. 'Cog feature flags\ bit 0: set if the VM supports MULTIPLE_BYTECODE_SETS.\ bit 1: set if the VM supports read-only objects.\ bit 2: set if the VM has an ITIMER_HEARTBEAT' withCRs. 66. 'the byte size of a stack page'.}, (isSpur ifFalse: [{ 67 to: 69. 'reserved for more Cog-related info' }] ifTrue: [#( 67 'the maximum allowed size of old space (if zero there is no limit)' 68 'the average number of live stack pages when scanned by scavenge/gc/become' 69 'the maximum number of live stack pages when scanned by scavenge/gc/become')]), #( 70 'the vmProxyMajorVersion (the interpreterProxy VM_MAJOR_VERSION)' 71 'the vmProxyMinorVersion (the interpreterProxy VM_MINOR_VERSION)')] ifFalse: [#()]) pairsDo: [:idx :desc | | value values | aStream nextPut: $#. idx isInteger ifTrue: [value := vmParameters at: idx. + aStream + print: idx; tab: (idx < 10 ifTrue: [2] ifFalse: [1]); + nextPutAll: ((value isInteger and: [idx ~= 41]) + ifTrue: [(desc includesSubstring: 'bit 0:') + ifTrue: [value printStringBase: 2 nDigits: (desc at: (desc lastIndexOf: $:) - 1) digitValue + 1] + ifFalse: [value asStringWithCommas]] + ifFalse: [value printString])] - aStream print: idx; tab: (idx < 10 ifTrue: [2] ifFalse: [1]); nextPutAll: ((value isInteger and: [idx ~= 41]) ifTrue: [value asStringWithCommas] ifFalse: [value printString])] ifFalse: [value := vmParameters at: idx first. aStream print: idx first; next: 2 put: $.; print: idx last; tab. values := idx collect: [:i| vmParameters at: i]. values asSet size = 1 ifTrue: [aStream print: value] ifFalse: [values do: [:v| aStream print: v] separatedBy: [aStream nextPutAll: ', ']]]. aStream tab; nextPutAll: desc; cr]! From commits at source.squeak.org Mon Oct 19 00:23:59 2020 From: commits at source.squeak.org (commits at source.squeak.org) Date: Mon, 19 Oct 2020 00:23:59 0000 Subject: [squeak-dev] The Inbox: System-tpr.1181.mcz Message-ID: A new version of System was added to project The Inbox: http://source.squeak.org/inbox/System-tpr.1181.mcz ==================== Summary ==================== Name: System-tpr.1181 Author: tpr Time: 18 October 2020, 5:23:52.020099 pm UUID: 259789c8-138c-421f-81e0-ac59cc248b07 Ancestors: System-mt.1180 Remove the no-longer needed (mis)calculation of the window label. Accompanies Tools-tpr.1004 =============== Diff against System-mt.1180 =============== Item was changed: ----- Method: SystemNavigation>>browseMessageList:name:autoSelect: (in category 'browse') ----- browseMessageList: messageListOrBlock name: labelString autoSelect: autoSelectString "Create and schedule a MessageSet browser on the message list. If messageListOrBlock is a block, then evaluate it to get the message list." + | messageList | - | messageList title | messageList := messageListOrBlock isBlock ifTrue: [ Cursor wait showWhile: messageListOrBlock ] ifFalse: [ messageListOrBlock ]. messageList size = 0 ifTrue: [ ^self inform: 'There are no', String cr, labelString ]. - title := messageList size > 1 - ifFalse: [ labelString ] - ifTrue: [ labelString, ' [', messageList size printString, ']' ]. ^ ToolSet browseMessageSet: messageList + name: labelString - name: title autoSelect: autoSelectString! From commits at source.squeak.org Mon Oct 19 00:24:19 2020 From: commits at source.squeak.org (commits at source.squeak.org) Date: Mon, 19 Oct 2020 00:24:19 0000 Subject: [squeak-dev] The Inbox: Tools-tpr.1003.mcz Message-ID: A new version of Tools was added to project The Inbox: http://source.squeak.org/inbox/Tools-tpr.1003.mcz ==================== Summary ==================== Name: Tools-tpr.1003 Author: tpr Time: 18 October 2020, 5:24:15.656722 pm UUID: 7a19cdad-a4e2-432e-ab35-b89d0de811e1 Ancestors: Tools-mt.1002 Rework the window label handing of MessageSet/Trace to be a bit more accurate, and to work within the normal style of labels. Instead of assuming the size of the list passed to the MessageSet/Trace is correct, derive it from the post-processing list. We process the list to remove duplicates, which e.g. the #allUnimplementedCalls method produces. This required adding an instvar to M-Set, removing one from M-Trace, setting the new one properly, dumping some dodgy code that used to half-assedly derive the old one, use the proper #changed: #windowTitle to, y'know, change the title, and some faffing with the messageList. As a result we are better placed to make further improvements if/when we develop a way to correctly hightlight multi-part keywords (or indeed, multiple messages) within a single method, which would greatly improve many browsers. This benefits from being accompanied by the single-method change in the System-tpr.1181 package =============== Diff against Tools-mt.1002 =============== Item was changed: CodeHolder subclass: #MessageSet + instanceVariableNames: 'growable messageList messageListFormatted autoSelectString messageListIndex editSelection windowLabel' - instanceVariableNames: 'growable messageList messageListFormatted autoSelectString messageListIndex editSelection' classVariableNames: 'UseUnifiedMessageLabels' poolDictionaries: '' category: 'Tools-Browser'! !MessageSet commentStamp: '' prior: 0! I represent a query path of the retrieval result of making a query about methods in the system. The result is a set of methods, denoted by a message selector and the class in which the method was found. As a StringHolder, the string I represent is the source code of the currently selected method. I am typically viewed in a Message Set Browser consisting of a MessageListView and a BrowserCodeView.! Item was changed: ----- Method: MessageSet class>>openMessageList:name:autoSelect: (in category 'instance creation') ----- openMessageList: messageList name: labelString autoSelect: autoSelectString "Open a system view for a MessageSet on messageList. + The labelString is passed to the model to use as a base label, depending on the selection state" - 1/24/96 sw: the there-are-no msg now supplied by my sender" | messageSet | messageSet := self messageList: messageList. + messageSet + autoSelectString: autoSelectString; + setInitialLabel: labelString. + ^ToolBuilder open: messageSet! - messageSet autoSelectString: autoSelectString. - ^ToolBuilder open: messageSet label: labelString! Item was changed: ----- Method: MessageSet>>adjustWindowTitleAfterFiltering (in category 'private') ----- adjustWindowTitleAfterFiltering + "Set the title of the receiver's window, if any, to reflect the just-completed filtering. Avoid re-doing it if fitering is re-done" - "Set the title of the receiver's window, if any, to reflect the just-completed filtering" + (windowLabel endsWith: 'Filtered') + ifFalse: [windowLabel := windowLabel , ' Filtered'. + self changed: #windowTitle]! - | aWindow existingLabel newLabel | - - (aWindow := self containingWindow) ifNil: [^ self]. - (existingLabel := aWindow label) isEmptyOrNil ifTrue: [^ self]. - (((existingLabel size < 3) or: [existingLabel last ~~ $]]) or: [(existingLabel at: (existingLabel size - 1)) isDigit not]) ifTrue: [^ self]. - existingLabel size to: 1 by: -1 do: - [:anIndex | ((existingLabel at: anIndex) == $[) ifTrue: - [newLabel := (existingLabel copyFrom: 1 to: anIndex), - 'Filtered: ', - messageList size printString, - ']'. - ^ aWindow setLabel: newLabel]] - - - ! Item was changed: ----- Method: MessageSet>>initializeMessageList: (in category 'private') ----- initializeMessageList: anArray "Initialize my messageList from the given list of MethodReference or string objects. NB: special handling for uniclasses. Do /not/ replace the elements of anArray if they are already MethodReferences, so as to allow users to construct richer systems, such as differencers between existing and edited versions of code." + messageList := Set new. - messageList := OrderedCollection new. anArray do: [:each | each isMethodReference + ifTrue: [messageList add: each] - ifTrue: [messageList addLast: each] ifFalse: [ MessageSet parse: each toClassAndSelector: + [ : class : sel | class ifNotNil: [ messageList add: (MethodReference class: class selector: sel) ] ] ] ]. + messageList := messageList asSortedCollection asOrderedCollection. "Possibly better to do asOrderedCollection sort ?" - [ : class : sel | class ifNotNil: [ messageList addLast: (MethodReference class: class selector: sel) ] ] ] ]. "Unify labels if wanted." self class useUnifiedMessageLabels ifTrue: [ messageList withIndexDo: [ : each : index | | cls | cls := each actualClass. each stringVersion: (self indentionPrefixOfSize: (self indentionsIn: each stringVersion)) , (cls ifNil: [each asString] ifNotNil: [cls isUniClass ifTrue: [cls typicalInstanceName, ' ', each selector] ifFalse: [ cls name , ' ' , each selector , ' {' , ((cls organization categoryOfElement: each selector) ifNil: ['']) , '}' , ' {', cls category, '}' ] ]) ] ]. messageListIndex := messageList isEmpty ifTrue: [0] ifFalse: [1]. contents := String empty! Item was changed: ----- Method: MessageSet>>messageListIndex: (in category 'message list') ----- messageListIndex: anInteger + "Set the index of the selected item to be anInteger. + Update the message list morph, the text edit morph and the assorted buttons" - "Set the index of the selected item to be anInteger." messageListIndex := anInteger. contents := messageListIndex ~= 0 ifTrue: [self selectedMessage] ifFalse: ['']. self changed: #messageListIndex. "update my selection" self editSelection: #editMessage. self contentsChanged. (messageListIndex ~= 0 and: [ autoSelectString notNil and: [ self contents notEmpty ] ]) ifTrue: [ self changed: #autoSelect ]. self decorateButtons ! Item was added: + ----- Method: MessageSet>>setInitialLabel: (in category 'accessing') ----- + setInitialLabel: aString + "set the base label for the window, as returned by #windowTitle" + + windowLabel := aString! Item was added: + ----- Method: MessageSet>>windowTitle (in category 'user interface') ----- + windowTitle + "just return the basic label for now" + + ^windowLabel! Item was changed: MessageSet subclass: #MessageTrace + instanceVariableNames: 'autoSelectStrings messageSelections anchorIndex' - instanceVariableNames: 'autoSelectStrings messageSelections anchorIndex defaultSelectString' classVariableNames: '' poolDictionaries: '' category: 'Tools-Browser'! !MessageTrace commentStamp: 'cmm 3/2/2010 20:26' prior: 0! A MessageTrace is a MessageSet allowing efficient sender/implementor message following. With implementors indented below, and senders outdended above, message flow is succinctly expressed, hierarchically. My autoSelectStrings and messageSelections are Arrays of Booleans, parallel to my messageList. Each boolean indicates whether that message is selected. Each autoSelectStrings indicates which string should be highlighted in the code for each method in my messageList.! Item was changed: ----- Method: MessageTrace>>browseAllImplementorsOf: (in category 'actions') ----- browseAllImplementorsOf: selectorSymbol | selectorToBrowse | selectorToBrowse := self selection ifNil: [ selectorSymbol ] + ifNotNil: [ self getImplementorNamed: selectorSymbol asSymbol "since we can get passed literals"]. - ifNotNil: [ self getImplementorNamed: selectorSymbol ]. (self hasUnacceptedEdits or: [ Preferences traceMessages not ]) ifTrue: [ super browseAllImplementorsOf: selectorToBrowse ] ifFalse: [ self addChildMethodsNamed: selectorToBrowse ] ! Item was changed: ----- Method: MessageTrace>>initializeMessageList: (in category 'private initializing') ----- initializeMessageList: anArray - messageSelections := (Array new: anArray size withAll: false) asOrderedCollection. super initializeMessageList: anArray. + messageSelections := (Array new: messageList size withAll: false) asOrderedCollection. self messageAt: messageListIndex beSelected: true. "autoSelectStrings is initialized right after this method, in autoSelectString:" ! Item was changed: ----- Method: MessageTrace>>messageListIndex: (in category 'actions') ----- messageListIndex: anInteger + "Set the index of the selected item to be anInteger. + Find the relevant auto select string to use, do my superclass' work and update the window title" + autoSelectStrings ifNotEmpty: [ autoSelectString := anInteger = 0 + ifTrue: [ "clear the autoSelectString" + String empty ] + ifFalse: [autoSelectStrings at: anInteger] + ]. + + anInteger > 0 ifTrue: [ self + messageAt: anInteger + beSelected: true + ]. + super messageListIndex: anInteger. + self changed: #windowTitle - ifTrue: - [ defaultSelectString ifNotNil: [:default| self containingWindow setLabel: default]. - "clear the autoSelectString" - '' ] - ifFalse: - [ messageListIndex := anInteger. - "setting the window label, below, can't wait for this.." - self containingWindow setLabel: (self windowLabelAt: anInteger). - "work out the string to ask the text view to pre-select. We should do better than this; after all the debugger does" - (autoSelectStrings at: anInteger)] ]. - anInteger > 0 ifTrue: - [ self - messageAt: anInteger - beSelected: true ]. - super messageListIndex: anInteger ! Item was changed: ----- Method: MessageTrace>>windowLabelAt: (in category 'private accessing') ----- windowLabelAt: anInteger + "return a suitable window label when there is an actual list item selected; work out what it should be based upon the array of autoSelectStrings or the current selection" + ^(autoSelectStrings at: anInteger) + ifNil: [ 'Implementors of ', - | str | - defaultSelectString ifNil: - [defaultSelectString := self containingWindow label]. - ^(str := autoSelectStrings at: anInteger) - ifNil: - [ 'Implementors of ', (self class parse: self selection + toClassAndSelector: [ :class :selector | selector ]) + ] + ifNotNil: [:str| 'Senders of ', str ] - toClassAndSelector: [ :class :selector | selector ]) ] - ifNotNil: - [ 'Senders of ', str ] ! Item was added: + ----- Method: MessageTrace>>windowTitle (in category 'building') ----- + windowTitle + "set the window label to suit the selection state; + if no selection, use saved widow label and add the number of items in the messageList + if something is selected, use the relevant string provided by windowLabelAt: which considers the index" + + ^messageListIndex = 0 + ifTrue:[String streamContents: [:str| str nextPutAll: windowLabel; + space; + nextPut: $[; + space; + nextPutAll: messageList size asString; + space; + nextPut: $] + ] + ] + ifFalse: [self windowLabelAt: messageListIndex]! From tim at rowledge.org Mon Oct 19 00:32:39 2020 From: tim at rowledge.org (tim Rowledge) Date: Sun, 18 Oct 2020 17:32:39 -0700 Subject: [squeak-dev] Improving the SystemNavigation browseMessageList... stuff In-Reply-To: References: <6A70A9A6-A1D2-4402-84A5-AD39DB02FD03@rowledge.org> <1603021617930-0.post@n4.nabble.com> Message-ID: <0FA3FBB0-E579-480C-9568-EBAD0C65E057@rowledge.org> OK, review time ! See inbox Tools-tpr.1003 and System-tpr.1181 for some fairly simple changes to how the message list is built (as a set and sorted etc) and improvements to how the window label is derived. The only visible change should be that when the window initially opens the label will reflect the fact that the first item is actually selected - the prior code actually started in a weird state with the label that should be used when nothing is selected. I think it is more correct now but one might argue that nothing should be selected by default for this sort of browser. Now, about that improvement to the Shout stuff... tim -- tim Rowledge; tim at rowledge.org; http://www.rowledge.org/tim Useful random insult:- Wasn't fully debugged before being released. From jecel at merlintec.com Mon Oct 19 01:19:02 2020 From: jecel at merlintec.com (Jecel Assumpcao Jr) Date: Sun, 18 Oct 2020 22:19:02 -0300 Subject: [squeak-dev] Smalltalk-80 (was: (Somewhat off-topic) Xerox Interlisp-D Medley open sourced) In-Reply-To: References: <715b37a6-8476-4629-8e02-23dde385635f@gmail.com> Message-ID: <20201019011908.A01F0540C45@proxy.email-ssl.com.br> Trygve Reenskaug wrote on Tue, 13 Oct 2020 10:37:38 +0200 > How I wish that the Smalltalk world had at least one good > implementation (distinct implementation rather than dialect.) > of ST80. Squeak is, of course, a moving target that leaves a > trail of bit rotting software in darkness behind it. (sigh) There have actually been two new virtual machines developed for Smalltalk-80 in the past year or so. Both are hobby projects, though with todays very fast computers even such can be very usable. I don't know the legality of using the old Xerox image, however. The image is museum quality: the exact bits it had in the early 1980s. But that is just because nobody is actually using it. For the Smalltalk-78 restoration project, for example, they started fixing and improving stuff and that is what Alan demoed. So I doubt that a Smalltalk-80 that a group actually used would change any less than Squeak does. There is always the option of using older Squeaks. I am typing this in Squeak 4.1 and for a project I wanted a very small image for I am using Squeak 2.2. It isn't always easy to find a virtual machine that will run on current operating systems and that can accept such old images. And obviously I have to do without more than two decades of bug fixes, but that is a price I am willing to pay. Pharo changes a lot more than Squeak does (the fork was so it could do so), but what about Cuis? I know its goal is simplicity and not historical stability but my impression is that you get a bit of that as well. -- Jecel https://github.com/dbanay/Smalltalk https://github.com/rochus-keller/Smalltalk From pbpublist at gmail.com Mon Oct 19 01:37:02 2020 From: pbpublist at gmail.com (Phil B) Date: Sun, 18 Oct 2020 21:37:02 -0400 Subject: [squeak-dev] Smalltalk-80 (was: (Somewhat off-topic) Xerox Interlisp-D Medley open sourced) In-Reply-To: <20201019011908.A01F0540C45@proxy.email-ssl.com.br> References: <715b37a6-8476-4629-8e02-23dde385635f@gmail.com> <20201019011908.A01F0540C45@proxy.email-ssl.com.br> Message-ID: Jecel, On Sun, Oct 18, 2020 at 9:19 PM Jecel Assumpcao Jr wrote: > Pharo changes a lot more than Squeak does (the fork was so it could do > so), but what about Cuis? I know its goal is simplicity and not > historical stability but my impression is that you get a bit of that as > well. > Cuis goes for a small image and simplicity, but not backwards compatibility. It changes in backwards incompatible ways far more frequently and substantially than Squeak. For example, any Morphic code ported from Squeak would need to be significantly altered to run in Cuis. > > -- Jecel > Thanks, Phil -------------- next part -------------- An HTML attachment was scrubbed... URL: From davide.grandi at email.it Mon Oct 19 06:45:29 2020 From: davide.grandi at email.it (Davide Grandi) Date: Mon, 19 Oct 2020 08:45:29 +0200 Subject: [squeak-dev] Smalltalk-80 In-Reply-To: <20201019011908.A01F0540C45@proxy.email-ssl.com.br> References: <715b37a6-8476-4629-8e02-23dde385635f@gmail.com> <20201019011908.A01F0540C45@proxy.email-ssl.com.br> Message-ID: ... and Xerox revivals start forking : https://github.com/no-defun-allowed/Smalltalk/ https://github.com/michaelengel/crosstalk https://www.youtube.com/watch?v=JyaQavN9rVA cheers,     Davide On 19/10/2020 03:19, Jecel Assumpcao Jr wrote: > Trygve Reenskaug wrote on Tue, 13 Oct 2020 10:37:38 +0200 >> How I wish that the Smalltalk world had at least one good >> implementation (distinct implementation rather than dialect.) >> of ST80. Squeak is, of course, a moving target that leaves a >> trail of bit rotting software in darkness behind it. (sigh) > There have actually been two new virtual machines developed for > Smalltalk-80 in the past year or so. Both are hobby projects, though > with todays very fast computers even such can be very usable. I don't > know the legality of using the old Xerox image, however. > > The image is museum quality: the exact bits it had in the early 1980s. > But that is just because nobody is actually using it. For the > Smalltalk-78 restoration project, for example, they started fixing and > improving stuff and that is what Alan demoed. So I doubt that a > Smalltalk-80 that a group actually used would change any less than > Squeak does. > > There is always the option of using older Squeaks. I am typing this in > Squeak 4.1 and for a project I wanted a very small image for I am using > Squeak 2.2. It isn't always easy to find a virtual machine that will run > on current operating systems and that can accept such old images. And > obviously I have to do without more than two decades of bug fixes, but > that is a price I am willing to pay. > > Pharo changes a lot more than Squeak does (the fork was so it could do > so), but what about Cuis? I know its goal is simplicity and not > historical stability but my impression is that you get a bit of that as > well. > > -- Jecel > > https://github.com/dbanay/Smalltalk > > https://github.com/rochus-keller/Smalltalk > -- Ing. Davide Grandi email : davide.grandi at email.it linkedin : http://linkedin.com/in/davidegrandi From kirtai+st at gmail.com Mon Oct 19 10:30:09 2020 From: kirtai+st at gmail.com (Douglas Brebner) Date: Mon, 19 Oct 2020 11:30:09 +0100 Subject: [squeak-dev] Smalltalk-80 (was: (Somewhat off-topic) Xerox Interlisp-D Medley open sourced) In-Reply-To: <20201019011908.A01F0540C45@proxy.email-ssl.com.br> References: <715b37a6-8476-4629-8e02-23dde385635f@gmail.com> <20201019011908.A01F0540C45@proxy.email-ssl.com.br> Message-ID: <4a12f0d9-e752-71ac-01da-cce8af8b8b0a@gmail.com> On 19/10/2020 02:19, Jecel Assumpcao Jr wrote: > > There is always the option of using older Squeaks. I am typing this in > Squeak 4.1 and for a project I wanted a very small image for I am using > Squeak 2.2. It isn't always easy to find a virtual machine that will run > on current operating systems and that can accept such old images. And > obviously I have to do without more than two decades of bug fixes, but > that is a price I am willing to pay. I see you're using Celeste. Is it still being updated? And is it still under the Squeak-L licence like squeakmap says? I miss having tools that would let you "live" in a smalltalk image. From builds at travis-ci.org Mon Oct 19 15:25:29 2020 From: builds at travis-ci.org (Travis CI) Date: Mon, 19 Oct 2020 15:25:29 +0000 Subject: [squeak-dev] [CRON] Errored: squeak-smalltalk/squeak-app#1864 (squeak-trunk - 25ebaf1) In-Reply-To: Message-ID: <5f8dafe8a005b_13fd5c09aa788313067@travis-tasks-865556f6c6-tzzxf.mail> Build Update for squeak-smalltalk/squeak-app ------------------------------------- Build: #1864 Status: Errored Duration: 18 mins and 54 secs Commit: 25ebaf1 (squeak-trunk) Author: Marcel Taeumel Message: Hi all! The project "squeak-app" is part of the continuous build infrastructure (short: CI) for Squeak's bundles, which you can download at https://files.squeak.org/, followed by the version tag you are looking for. All bundles are updated on a regular basis, which is daily for Trunk (i.e. the current alpha version) and monthly for release versions. Note that there won't be new bundles if Squeak's build number, which reflects in-image code updates, did not change between CI jobs. -- The Squeak Oversight Board [ci skip] View the changeset: https://github.com/squeak-smalltalk/squeak-app/compare/fb55517f583fe544f9225413a23fe82a680200c2...25ebaf18249322227da1f7c767384cb35082fab7 View the full build log and details: https://travis-ci.org/github/squeak-smalltalk/squeak-app/builds/737102544?utm_medium=notification&utm_source=email -- You can unsubscribe from build emails from the squeak-smalltalk/squeak-app repository going to https://travis-ci.org/account/preferences/unsubscribe?repository=8901856&utm_medium=notification&utm_source=email. Or unsubscribe from *all* email updating your settings at https://travis-ci.org/account/preferences/unsubscribe?utm_medium=notification&utm_source=email. Or configure specific recipients for build notifications in your .travis.yml file. See https://docs.travis-ci.com/user/notifications. -------------- next part -------------- An HTML attachment was scrubbed... URL: From leves at caesar.elte.hu Mon Oct 19 16:39:50 2020 From: leves at caesar.elte.hu (Levente Uzonyi) Date: Mon, 19 Oct 2020 18:39:50 +0200 (CEST) Subject: [squeak-dev] The Inbox: Tools-tpr.1003.mcz In-Reply-To: References: Message-ID: Hi Tim, On Mon, 19 Oct 2020, commits at source.squeak.org wrote: > Item was changed: > ----- Method: MessageSet>>initializeMessageList: (in category 'private') ----- > initializeMessageList: anArray > "Initialize my messageList from the given list of MethodReference or string objects. NB: special handling for uniclasses. > Do /not/ replace the elements of anArray if they are already MethodReferences, so as to allow users to construct richer systems, such as differencers between existing and edited versions of code." > + messageList := Set new. > - messageList := OrderedCollection new. > anArray do: > [:each | each isMethodReference > + ifTrue: [messageList add: each] > - ifTrue: [messageList addLast: each] > ifFalse: > [ MessageSet > parse: each > toClassAndSelector: > + [ : class : sel | class ifNotNil: [ messageList add: (MethodReference class: class selector: sel) ] ] ] ]. > + messageList := messageList asSortedCollection asOrderedCollection. "Possibly better to do asOrderedCollection sort ?" Yes, it's better not to use SortedCollection in this case (as in most cases). If messageList does not have to be an OrderedCollection, then messageList := messageList sorted. is the best option. Levente From tim at rowledge.org Mon Oct 19 22:02:09 2020 From: tim at rowledge.org (tim Rowledge) Date: Mon, 19 Oct 2020 15:02:09 -0700 Subject: [squeak-dev] The Inbox: Tools-tpr.1003.mcz In-Reply-To: References: Message-ID: <43CC0390-8879-44DD-9814-6F002A8E56F5@rowledge.org> > On 2020-10-19, at 9:39 AM, Levente Uzonyi wrote: > >> + messageList := messageList asSortedCollection asOrderedCollection. "Possibly better to do asOrderedCollection sort ?" > > Yes, it's better not to use SortedCollection in this case (as in most cases). > If messageList does not have to be an OrderedCollection, then > > messageList := messageList sorted. > > is the best option. messageList := messageList asOrderedCollection sort seems to work perfectly well and is nicely readable. We do need anOrderedCollection since the tracing adds and removes items in specific indices. I've no idea if the performance would become a practical issue. In fact, I tried a quick hack to make a list of all the implemented messages to time making a really big message list - but that falls foul of a problem I'm simply not willing to spend any time on right now. I hacked allUnimplentedCalls to - allImplementedCalls "Answer a collection of each message that is sent by an expression in a method" | result | result := OrderedCollection new. self allSelectorsAndMethodsDo: [ :behavior :selector :method | method selectorsDo: [ :each | result add: (String streamContents: [ :stream | stream nextPutAll: behavior name; space; nextPutAll: selector; space; nextPutAll: 'calls: '; nextPutAll: each ]) ] ]. ^result ... to return a list in the same format, to pass over to #browseMessageList:name:. It causes a barf in MessageSet class>>#parse:toClassAndSelector: for a rather amusing reason; note how the line in the middle tries to parse the incoming list tuple := (codeReferenceOrString asString includesSubstring: '>>') ifTrue: [(codeReferenceOrString findTokens: '>>') fold: [:a :b| (a findTokens: ' '), {b first = $# ifTrue: [b allButFirst] ifFalse: [b]}]] ifFalse: [codeReferenceOrString asString findTokens: ' .']. That check for '>>', the separator we so often use within a method reference? Guess what happens when we try to handle the input line 'ThirtyTwoBitRegister >> calls: >=' :-) I guess it is simply a fluke that no method with a > in the name is currently mentioned in #allUnimplementedCalls! The #findTokens: simply isn't doing what I think the author expected. Trying to parse the list of strings we get from #allUnimplementedCalls et al. needs more thought, and perhaps the list *created* needs more thought too. tim -- tim Rowledge; tim at rowledge.org; http://www.rowledge.org/tim Useful random insult:- On permanent leave of absence from his senses. From jrmaffeo at gmail.com Mon Oct 19 22:49:38 2020 From: jrmaffeo at gmail.com (John-Reed Maffeo) Date: Mon, 19 Oct 2020 15:49:38 -0700 Subject: [squeak-dev] #installExtraPackages - fails on new install Message-ID: First install of Squeak on a new R.Pi. After going through the setup a window pops up and asks me if I want to install extra packages. I check them all (but 1) off but I can' save them. The Save button says "Please check your internet collection". I know I do have internet connection because I just downloaded the installation. This is a neat feature and I would like to use it. I don't know if the problem is with me or in the stars. I explored the morph using the halo and found the method to #installExtraPackages and ran it from an explorer window but that killed the image w/o installing the packages. I tried to run the method from the workplace, but that failed too. -- John-Reed Maffeo -------------- next part -------------- An HTML attachment was scrubbed... URL: From commits at source.squeak.org Tue Oct 20 00:17:10 2020 From: commits at source.squeak.org (commits at source.squeak.org) Date: Tue, 20 Oct 2020 00:17:10 0000 Subject: [squeak-dev] The Trunk: Tools-eem.1004.mcz Message-ID: Eliot Miranda uploaded a new version of Tools to project The Trunk: http://source.squeak.org/trunk/Tools-eem.1004.mcz ==================== Summary ==================== Name: Tools-eem.1004 Author: eem Time: 19 October 2020, 5:17:08.08257 pm UUID: 8680e986-a863-4369-bc29-967b005c4851 Ancestors: Tools-eem.1003 Integrate Javier Diaz-Reinoso;s kindly contributed improvement to Workspace file editing. =============== Diff against Tools-eem.1003 =============== Item was changed: ----- Method: FileList>>viewContentsInWorkspace (in category 'own services') ----- viewContentsInWorkspace "View the contents of my selected file in a new workspace" + | aFileStream aName lineConversion w | + aFileStream := (directory readOnlyFileNamed: self fullName) setConverterForCode. + aFileStream wantsLineEndConversion: true. + lineConversion := aFileStream detectLineEndConvention. - | aString aFileStream aName | - aString := (aFileStream := directory readOnlyFileNamed: self fullName) setConverterForCode contentsOfEntireFile. aName := aFileStream localName. + w:= UIManager default + edit: ([aFileStream contentsOfEntireFile] ensure: [aFileStream close]) + label: ((aName includesSubstring: 'Workspace') + ifTrue: [(aName endsWith: '.text') ifTrue: [aName allButLast: 5] ifFalse: [aName]] + ifFalse: ['Workspace from ', aName]). + w setProperty: #lineConversion toValue: lineConversion. + directory ~= FileDirectory default ifTrue: [w setProperty: #myDir toValue: directory]! - aFileStream close. - UIManager default edit: aString withSqueakLineEndings label: 'Workspace from ', aName! From commits at source.squeak.org Tue Oct 20 00:18:47 2020 From: commits at source.squeak.org (commits at source.squeak.org) Date: Tue, 20 Oct 2020 00:18:47 0000 Subject: [squeak-dev] The Trunk: Morphic-eem.1704.mcz Message-ID: Eliot Miranda uploaded a new version of Morphic to project The Trunk: http://source.squeak.org/trunk/Morphic-eem.1704.mcz ==================== Summary ==================== Name: Morphic-eem.1704 Author: eem Time: 19 October 2020, 5:18:43.145396 pm UUID: 1889aef2-4bb4-45ee-a4c9-75c721103c1e Ancestors: Morphic-mt.1703 Integrate Javier Diaz-Reinoso's kindly contributed improvement to Workspace file editing. =============== Diff against Morphic-mt.1703 =============== Item was changed: ----- Method: TextEditor>>saveContentsInFile (in category 'menu messages') ----- saveContentsInFile "Save the receiver's contents string to a file, prompting the user for a file-name. Suggest a reasonable file-name." + | fileName stringToSave parentWindow labelToUse suggestedName dir | - | fileName stringToSave parentWindow labelToUse suggestedName | stringToSave := paragraph text string. stringToSave size = 0 ifTrue: [^self inform: 'nothing to save.']. parentWindow := model dependents detect: [:dep | dep isKindOf: SystemWindow] ifNone: [nil]. + dir := parentWindow valueOfProperty: #myDir. + labelToUse := + parentWindow + ifNil: ['Untitled'] + ifNotNil: [ + dir ifNil: [parentWindow label] + ifNotNil:[dir fullNameFor: parentWindow label]]. - labelToUse := parentWindow ifNil: ['Untitled'] - ifNotNil: [parentWindow label]. suggestedName := nil. #(#('Decompressed contents of: ' '.gz')) do: [:leaderTrailer | | lastIndex | "can add more here..." (labelToUse beginsWith: leaderTrailer first) ifTrue: [suggestedName := labelToUse copyFrom: leaderTrailer first size + 1 to: labelToUse size. (labelToUse endsWith: leaderTrailer last) ifTrue: [suggestedName := suggestedName copyFrom: 1 to: suggestedName size - leaderTrailer last size] ifFalse: + [lastIndex := suggestedName lastIndexOf: $. ifAbsent: [0]. + (lastIndex = 0 or: [lastIndex = 1]) + ifFalse: [suggestedName := suggestedName copyFrom: 1 to: lastIndex - 1]]]]. + suggestedName ifNil: [suggestedName := labelToUse. + (labelToUse includesSubstring: '.') ifFalse: [suggestedName := suggestedName , '.text']]. + fileName := UIManager default request: 'File name?' - [lastIndex := suggestedName lastIndexOf: $.. - lastIndex > 1 - ifTrue: [suggestedName := suggestedName copyFrom: 1 to: lastIndex - 1]]]]. - suggestedName ifNil: [suggestedName := labelToUse , '.text']. - fileName := UIManager default saveFilenameRequest: 'File name?' initialAnswer: suggestedName. fileName isEmptyOrNil ifFalse: + [ |ns| + ns := MultiByteFileStream newFileNamed: fileName. + ns lineEndConvention: (parentWindow valueOfProperty: #lineConversion). + ns nextPutAll: stringToSave; + close. + suggestedName ~= fileName ifTrue:[parentWindow label: fileName]. + self morph hasUnacceptedEdits: false. + ]! - [(FileStream newFileNamed: fileName) - nextPutAll: stringToSave; - close]! From eliot.miranda at gmail.com Tue Oct 20 00:19:19 2020 From: eliot.miranda at gmail.com (Eliot Miranda) Date: Mon, 19 Oct 2020 17:19:19 -0700 Subject: [squeak-dev] FileList "Workspace from Foo.txt" is a redundant OCD nightmare In-Reply-To: <6E969EC2-8C2C-4DEE-8FE7-28696C74B716@mac.com> References: <1753b5b6a08.12001c4da53564.7892679353013142855@zoho.com> <2D211EBE-2573-4392-A813-D505B8B89FDD@gmail.com> <6E969EC2-8C2C-4DEE-8FE7-28696C74B716@mac.com> Message-ID: Thanks Javier, I integrated it today. Finally :-) On Sun, Oct 18, 2020 at 8:59 AM Javier Diaz-Reinoso via Squeak-dev < squeak-dev at lists.squeakfoundation.org> wrote: > I send the list a change set years ago and was ignored, the current > version I use also preserve the lineConversion and remember the name for > save: > > > On 18 Oct 2020, at 07:41, Eliot Miranda wrote: > > Hi Tim, > > > On Oct 18, 2020, at 3:57 AM, gettimothy via Squeak-dev < > squeak-dev at lists.squeakfoundation.org> wrote: > >  > Ignore as fitting > > > I can join you; this gets on my tits. > > > https://www.pinterest.com/indigogeek/ocd-nightmares/ > > > FileList >>viewContentsInWorkspace > "View the contents of my selected file in a new workspace" > > | aString aFileStream aName | > aString := (aFileStream := directory readOnlyFileNamed: self fullName) > setConverterForCode contentsOfEntireFile. > aName := aFileStream localName. > aFileStream close. > UIManager default edit: aString withSqueakLineEndings label:* 'Workspace > from ',*aName > > > maybe its the OCD in me, but that verbiage preceding the file name at the > top of a workspace is redundant and annoying. > > 1. redundant--it is at the top of a Workspace. > 2. the infinitely expanding title ala *Worspace from Workspace from > Worspace from Workspace from Foo.txt* > 3. I have to edit each title upon file in. see OCD above. > > > A simple change to the method: > > FileList >> viewContentsInWorkspace > "View the contents of my selected file in a new workspace" > > | aString aFileStream aName | > aString := (aFileStream := directory readOnlyFileNamed: self fullName) > setConverterForCode contentsOfEntireFile. > aName := aFileStream localName. > aFileStream close. > *UIManager default edit: aString withSqueakLineEndings label: aName* > > > > eradicates the OCD nightmare > > > The only thing I’d suggest differently is that it check if the file name > contains “Workspace’ and if not, still adds the ‘Workspace from ’ prefix. > > cheers, > > tty > > > > -- _,,,^..^,,,_ best, Eliot -------------- next part -------------- An HTML attachment was scrubbed... URL: From commits at source.squeak.org Tue Oct 20 00:56:17 2020 From: commits at source.squeak.org (commits at source.squeak.org) Date: Tue, 20 Oct 2020 00:56:17 0000 Subject: [squeak-dev] The Trunk: Morphic-eem.1705.mcz Message-ID: Eliot Miranda uploaded a new version of Morphic to project The Trunk: http://source.squeak.org/trunk/Morphic-eem.1705.mcz ==================== Summary ==================== Name: Morphic-eem.1705 Author: eem Time: 19 October 2020, 5:56:07.299121 pm UUID: bc2b5ee7-0019-4440-8a9e-0ff595cde4ff Ancestors: Morphic-eem.1704 ...and remember to track the target directory if it is changed. =============== Diff against Morphic-eem.1704 =============== Item was changed: ----- Method: TextEditor>>saveContentsInFile (in category 'menu messages') ----- saveContentsInFile "Save the receiver's contents string to a file, prompting the user for a file-name. Suggest a reasonable file-name." + | stringToSave parentWindow labelToUse suggestedName fileName | + (stringToSave := paragraph text string) isEmpty ifTrue: + [^self inform: 'nothing to save.']. + parentWindow := model dependents + detect: [:dep | dep isSystemWindow] + ifNone: [self error: 'could not find parent window']. + labelToUse := (parentWindow valueOfProperty: #myDir) + ifNil: [parentWindow label] + ifNotNil: [:dir| dir fullNameFor: parentWindow label]. - | fileName stringToSave parentWindow labelToUse suggestedName dir | - stringToSave := paragraph text string. - stringToSave size = 0 ifTrue: [^self inform: 'nothing to save.']. - parentWindow := model dependents - detect: [:dep | dep isKindOf: SystemWindow] - ifNone: [nil]. - dir := parentWindow valueOfProperty: #myDir. - labelToUse := - parentWindow - ifNil: ['Untitled'] - ifNotNil: [ - dir ifNil: [parentWindow label] - ifNotNil:[dir fullNameFor: parentWindow label]]. suggestedName := nil. + "can add more here..." + #(('Decompressed contents of: ' '.gz')) do: + [:pair | + [:leader :trailer| + (labelToUse beginsWith: leader) ifTrue: + [suggestedName := labelToUse allButFirst: leader size. + (labelToUse endsWith: trailer) + ifTrue: + [suggestedName := suggestedName allButLast: trailer size] + ifFalse: + [| lastIndex | + lastIndex := suggestedName lastIndexOf: $. ifAbsent: [0]. + lastIndex > 1 ifTrue: + [suggestedName := suggestedName copyFrom: 1 to: lastIndex - 1]]]] + valueWithArguments: pair]. + suggestedName ifNil: + [suggestedName := (labelToUse includes: $.) + ifTrue: [labelToUse] + ifFalse: [labelToUse, '.text']]. + fileName := UIManager default request: 'File name?' initialAnswer: suggestedName. + fileName isEmptyOrNil ifTrue: [^self]. + ((MultiByteFileStream newFileNamed: fileName) + lineEndConvention: (parentWindow valueOfProperty: #lineConversion); "nil is fine here..." + nextPutAll: stringToSave; + close; + directory) ifNotNil: + [:dir| + dir = FileDirectory default + ifTrue: [parentWindow removeProperty: #myDir] + ifFalse: [parentWindow setProperty: #myDir toValue: dir]. + fileName := dir localNameFor: fileName]. + suggestedName ~= fileName ifTrue: + [parentWindow label: ((fileName endsWith: '.text') ifTrue: [fileName allButLast: 5] ifFalse: [fileName])]. + self morph hasUnacceptedEdits: false! - #(#('Decompressed contents of: ' '.gz')) do: - [:leaderTrailer | | lastIndex | - "can add more here..." - - (labelToUse beginsWith: leaderTrailer first) - ifTrue: - [suggestedName := labelToUse copyFrom: leaderTrailer first size + 1 - to: labelToUse size. - (labelToUse endsWith: leaderTrailer last) - ifTrue: - [suggestedName := suggestedName copyFrom: 1 - to: suggestedName size - leaderTrailer last size] - ifFalse: - [lastIndex := suggestedName lastIndexOf: $. ifAbsent: [0]. - (lastIndex = 0 or: [lastIndex = 1]) - ifFalse: [suggestedName := suggestedName copyFrom: 1 to: lastIndex - 1]]]]. - suggestedName ifNil: [suggestedName := labelToUse. - (labelToUse includesSubstring: '.') ifFalse: [suggestedName := suggestedName , '.text']]. - fileName := UIManager default request: 'File name?' - initialAnswer: suggestedName. - fileName isEmptyOrNil - ifFalse: - [ |ns| - ns := MultiByteFileStream newFileNamed: fileName. - ns lineEndConvention: (parentWindow valueOfProperty: #lineConversion). - ns nextPutAll: stringToSave; - close. - suggestedName ~= fileName ifTrue:[parentWindow label: fileName]. - self morph hasUnacceptedEdits: false. - ]! From gettimothy at zoho.com Tue Oct 20 01:29:19 2020 From: gettimothy at zoho.com (gettimothy) Date: Mon, 19 Oct 2020 21:29:19 -0400 Subject: [squeak-dev] FileList "Workspace from Foo.txt" is a redundant        OCD nightmare In-Reply-To: References: <1753b5b6a08.12001c4da53564.7892679353013142855@zoho.com> <2D211EBE-2573-4392-A813-D505B8B89FDD@gmail.com> <6E969EC2-8C2C-4DEE-8FE7-28696C74B716@mac.com> Message-ID: <175439ffa7e.d51fd251181689.6937546813066737879@zoho.com> Thabk you. I am not sure if this other OCD nightmare has been addressed in this discusion, bot the tail end of the title suffers from a similar issue. Workspace titled OCD.txt, save workspace contents to file-> OCD.txt.txt File in contents to Workspace... Workspace titled OCD.txt.txt save workspace contents to file-> OCD.txt.txt.txt ..... Cheers ---- On Mon, 19 Oct 2020 20:19:19 -0400 eliot.miranda at gmail.com wrote ---- Thanks Javier, I integrated it today.  Finally :-) On Sun, Oct 18, 2020 at 8:59 AM Javier Diaz-Reinoso via Squeak-dev wrote: I send the list a change set years ago and was ignored, the current version I use also preserve the lineConversion and remember the name for save: On 18 Oct 2020, at 07:41, Eliot Miranda wrote: Hi Tim, On Oct 18, 2020, at 3:57 AM, gettimothy via Squeak-dev wrote:  Ignore as fitting I can join you; this gets on my tits. https://www.pinterest.com/indigogeek/ocd-nightmares/ FileList >>viewContentsInWorkspace "View the contents of my selected file in a new workspace" | aString aFileStream aName | aString := (aFileStream := directory readOnlyFileNamed: self fullName) setConverterForCode contentsOfEntireFile. aName := aFileStream localName. aFileStream close. UIManager default edit: aString withSqueakLineEndings label: 'Workspace from ',aName maybe its the OCD in me, but that verbiage preceding the file name at the top of a workspace is redundant and annoying. 1. redundant--it is at the top of a Workspace. 2. the infinitely expanding title ala Worspace from Workspace from Worspace from Workspace from Foo.txt 3. I have to edit each title upon file in. see OCD above. A simple change to the method: FileList >> viewContentsInWorkspace "View the contents of my selected file in a new workspace" | aString aFileStream aName | aString := (aFileStream := directory readOnlyFileNamed: self fullName) setConverterForCode contentsOfEntireFile. aName := aFileStream localName. aFileStream close. UIManager default edit: aString withSqueakLineEndings label: aName eradicates the OCD nightmare   The only thing I’d suggest differently is that it check if the file name contains “Workspace’ and if not, still adds the ‘Workspace from ’ prefix. cheers, tty -- _,,,^..^,,,_ best, Eliot -------------- next part -------------- An HTML attachment was scrubbed... URL: From commits at source.squeak.org Tue Oct 20 04:36:42 2020 From: commits at source.squeak.org (commits at source.squeak.org) Date: Tue, 20 Oct 2020 04:36:42 0000 Subject: [squeak-dev] The Trunk: Tools-eem.1005.mcz Message-ID: Eliot Miranda uploaded a new version of Tools to project The Trunk: http://source.squeak.org/trunk/Tools-eem.1005.mcz ==================== Summary ==================== Name: Tools-eem.1005 Author: eem Time: 19 October 2020, 9:36:40.011366 pm UUID: d9422010-74b2-478d-9313-84e1ecc5c5ec Ancestors: Tools-eem.1004 Have the Workspace thang deal with both ,text and .txt =============== Diff against Tools-eem.1004 =============== Item was changed: ----- Method: FileList>>viewContentsInWorkspace (in category 'own services') ----- viewContentsInWorkspace "View the contents of my selected file in a new workspace" | aFileStream aName lineConversion w | aFileStream := (directory readOnlyFileNamed: self fullName) setConverterForCode. aFileStream wantsLineEndConversion: true. lineConversion := aFileStream detectLineEndConvention. aName := aFileStream localName. + w := UIManager default - w:= UIManager default edit: ([aFileStream contentsOfEntireFile] ensure: [aFileStream close]) label: ((aName includesSubstring: 'Workspace') + ifTrue: [#('.text' '.txt') inject: aName into: [:name :ext| (name endsWith: ext) ifTrue: [name allButLast: ext size] ifFalse: [name]]] - ifTrue: [(aName endsWith: '.text') ifTrue: [aName allButLast: 5] ifFalse: [aName]] ifFalse: ['Workspace from ', aName]). w setProperty: #lineConversion toValue: lineConversion. directory ~= FileDirectory default ifTrue: [w setProperty: #myDir toValue: directory]! From gettimothy at zoho.com Tue Oct 20 12:36:55 2020 From: gettimothy at zoho.com (gettimothy) Date: Tue, 20 Oct 2020 08:36:55 -0400 Subject: [squeak-dev] Squeak equivalent of OSPlatform ? Message-ID: <17546032f68.ce305db21041.1420675499747219914@zoho.com> Hi folks, I am puttering about trying to see if I can import Pillar into Squeak. BaselineOfPillar >> customProjectAttributes     "Edit to return a collection of any custom attributes e.g. for conditional loading: Array with: #'Condition1' with: #'Condition2. For more information see: http://code.google.com/p/metacello/wiki/CustomProjectAttrributes " | attributes | attributes := OrderedCollection new. OSPlatform current isWindows ifTrue: [ attributes add: #windows ]. OSPlatform current isUnix    ifTrue: [ attributes add: #unix ]. OSPlatform current isMacOS   ifTrue: [ attributes add: #osx ]. ^ attributes asArray I have poked around a bit and  ThisOSProcess concreteClass looks like a good replacement candidate. However, I figured I would check with you all first. thx in advance. -------------- next part -------------- An HTML attachment was scrubbed... URL: From marcel.taeumel at hpi.de Tue Oct 20 14:31:08 2020 From: marcel.taeumel at hpi.de (Marcel Taeumel) Date: Tue, 20 Oct 2020 16:31:08 +0200 Subject: [squeak-dev] Squeak equivalent of OSPlatform ? In-Reply-To: <17546032f68.ce305db21041.1420675499747219914@zoho.com> References: <17546032f68.ce305db21041.1420675499747219914@zoho.com> Message-ID: Hi Timothy. Both OSProcess and also Squeak-FFI interface SmalltalkImage (via "Smalltalk" global), which queries platform-specific attributes (or labels) via VM primitives: OSProcess class >> #platformName OSProcess class >> #platformSubtype OSProcess class >> #osVersion FFIPlatformDescription class >> #current  FFIPlatformDescription >> #name FFIPlatformDescription >> #subtype FFIPlatformDescription >> #is(Windows|ARM|Unix) SmalltalkImage >> #getSystemAttribute: SmalltalkImage >> #platformName SmalltalkImage >> #platformSubtype But beware of writing too much "is(Unix|Windows)"-like code across your abstraction levels because checking for more specific capabilites might produce more readable code such as "canReadFat32Device". ... which was not your question at all here. :-D Best, Marcel Am 20.10.2020 14:37:50 schrieb gettimothy via Squeak-dev : Hi folks, I am puttering about trying to see if I can import Pillar into Squeak. BaselineOfPillar >> customProjectAttributes     "Edit to return a collection of any custom attributes e.g. for conditional loading: Array with: #'Condition1' with: #'Condition2. For more information see: http://code.google.com/p/metacello/wiki/CustomProjectAttrributes [http://code.google.com/p/metacello/wiki/CustomProjectAttrributes] " | attributes | attributes := OrderedCollection new. OSPlatform current isWindows ifTrue: [ attributes add: #windows ]. OSPlatform current isUnix    ifTrue: [ attributes add: #unix ]. OSPlatform current isMacOS   ifTrue: [ attributes add: #osx ]. ^ attributes asArray I have poked around a bit and  ThisOSProcess concreteClass looks like a good replacement candidate. However, I figured I would check with you all first. thx in advance. -------------- next part -------------- An HTML attachment was scrubbed... URL: From builds at travis-ci.org Tue Oct 20 15:23:51 2020 From: builds at travis-ci.org (Travis CI) Date: Tue, 20 Oct 2020 15:23:51 +0000 Subject: [squeak-dev] [CRON] Passed: squeak-smalltalk/squeak-app#1865 (squeak-trunk - 25ebaf1) In-Reply-To: Message-ID: <5f8f0107140b3_13f99445b3d182675ba@travis-tasks-5cd6fb7d67-4vv7s.mail> Build Update for squeak-smalltalk/squeak-app ------------------------------------- Build: #1865 Status: Passed Duration: 16 mins and 41 secs Commit: 25ebaf1 (squeak-trunk) Author: Marcel Taeumel Message: Hi all! The project "squeak-app" is part of the continuous build infrastructure (short: CI) for Squeak's bundles, which you can download at https://files.squeak.org/, followed by the version tag you are looking for. All bundles are updated on a regular basis, which is daily for Trunk (i.e. the current alpha version) and monthly for release versions. Note that there won't be new bundles if Squeak's build number, which reflects in-image code updates, did not change between CI jobs. -- The Squeak Oversight Board [ci skip] View the changeset: https://github.com/squeak-smalltalk/squeak-app/compare/fb55517f583fe544f9225413a23fe82a680200c2...25ebaf18249322227da1f7c767384cb35082fab7 View the full build log and details: https://travis-ci.org/github/squeak-smalltalk/squeak-app/builds/737434850?utm_medium=notification&utm_source=email -- You can unsubscribe from build emails from the squeak-smalltalk/squeak-app repository going to https://travis-ci.org/account/preferences/unsubscribe?repository=8901856&utm_medium=notification&utm_source=email. Or unsubscribe from *all* email updating your settings at https://travis-ci.org/account/preferences/unsubscribe?utm_medium=notification&utm_source=email. Or configure specific recipients for build notifications in your .travis.yml file. See https://docs.travis-ci.com/user/notifications. -------------- next part -------------- An HTML attachment was scrubbed... URL: From tim at rowledge.org Tue Oct 20 17:13:14 2020 From: tim at rowledge.org (tim Rowledge) Date: Tue, 20 Oct 2020 10:13:14 -0700 Subject: [squeak-dev] Squeak equivalent of OSPlatform ? In-Reply-To: References: <17546032f68.ce305db21041.1420675499747219914@zoho.com> Message-ID: > On 2020-10-20, at 7:31 AM, Marcel Taeumel wrote: > > But beware of writing too much "is(Unix|Windows)"-like code across your abstraction levels because checking for more specific capabilites might produce more readable code such as "canReadFat32Device". ... which was not your question at all here. :-D Exactly - ask 'can I do this' not 'am I a wotsit'. tim -- tim Rowledge; tim at rowledge.org; http://www.rowledge.org/tim Don't diddle code to make it faster; find a better algorithm. From javier_diaz_r at mac.com Tue Oct 20 17:26:37 2020 From: javier_diaz_r at mac.com (Javier Diaz-Reinoso) Date: Tue, 20 Oct 2020 12:26:37 -0500 Subject: [squeak-dev] FileList "Workspace from Foo.txt" is a redundant        OCD nightmare In-Reply-To: <175439ffa7e.d51fd251181689.6937546813066737879@zoho.com> References: <1753b5b6a08.12001c4da53564.7892679353013142855@zoho.com> <2D211EBE-2573-4392-A813-D505B8B89FDD@gmail.com> <6E969EC2-8C2C-4DEE-8FE7-28696C74B716@mac.com> <175439ffa7e.d51fd251181689.6937546813066737879@zoho.com> Message-ID: <3FEC8BE3-BF9D-4D28-9E38-696EFB5CC685@mac.com> Not with this change. > On 19 Oct 2020, at 20:29, gettimothy via Squeak-dev wrote: > > Thabk you. > > > I am not sure if this other OCD nightmare has been addressed in this discusion, bot the tail end of the title suffers from a similar issue. > > Workspace titled OCD.txt, save workspace contents to file-> OCD.txt.txt > File in contents to Workspace... > Workspace titled OCD.txt.txt save workspace contents to file-> OCD.txt.txt.txt > ..... > > Cheers > > > ---- On Mon, 19 Oct 2020 20:19:19 -0400 eliot.miranda at gmail.com wrote ---- > > Thanks Javier, I integrated it today. Finally :-) > > On Sun, Oct 18, 2020 at 8:59 AM Javier Diaz-Reinoso via Squeak-dev > wrote: > I send the list a change set years ago and was ignored, the current version I use also preserve the lineConversion and remember the name for save: > > > On 18 Oct 2020, at 07:41, Eliot Miranda > wrote: > > Hi Tim, > > > On Oct 18, 2020, at 3:57 AM, gettimothy via Squeak-dev > wrote: > >  > Ignore as fitting > > I can join you; this gets on my tits. > > > https://www.pinterest.com/indigogeek/ocd-nightmares/ > > > FileList >>viewContentsInWorkspace > "View the contents of my selected file in a new workspace" > > | aString aFileStream aName | > aString := (aFileStream := directory readOnlyFileNamed: self fullName) setConverterForCode contentsOfEntireFile. > aName := aFileStream localName. > aFileStream close. > UIManager default edit: aString withSqueakLineEndings label: 'Workspace from ',aName > > maybe its the OCD in me, but that verbiage preceding the file name at the top of a workspace is redundant and annoying. > > 1. redundant--it is at the top of a Workspace. > 2. the infinitely expanding title ala Worspace from Workspace from Worspace from Workspace from Foo.txt > 3. I have to edit each title upon file in. see OCD above. > > > A simple change to the method: > FileList >> viewContentsInWorkspace > "View the contents of my selected file in a new workspace" > > | aString aFileStream aName | > aString := (aFileStream := directory readOnlyFileNamed: self fullName) setConverterForCode contentsOfEntireFile. > aName := aFileStream localName. > aFileStream close. > UIManager default edit: aString withSqueakLineEndings label: aName > > > > eradicates the OCD nightmare > > The only thing I’d suggest differently is that it check if the file name contains “Workspace’ and if not, still adds the ‘Workspace from ’ prefix. > > cheers, > > tty > > > > > -- > _,,,^..^,,,_ > best, Eliot > > > -------------- next part -------------- An HTML attachment was scrubbed... URL: From eliot.miranda at gmail.com Tue Oct 20 17:31:23 2020 From: eliot.miranda at gmail.com (Eliot Miranda) Date: Tue, 20 Oct 2020 10:31:23 -0700 Subject: [squeak-dev] FileList "Workspace from Foo.txt" is a redundant        OCD nightmare In-Reply-To: <3FEC8BE3-BF9D-4D28-9E38-696EFB5CC685@mac.com> References: <1753b5b6a08.12001c4da53564.7892679353013142855@zoho.com> <2D211EBE-2573-4392-A813-D505B8B89FDD@gmail.com> <6E969EC2-8C2C-4DEE-8FE7-28696C74B716@mac.com> <175439ffa7e.d51fd251181689.6937546813066737879@zoho.com> <3FEC8BE3-BF9D-4D28-9E38-696EFB5CC685@mac.com> Message-ID: On Tue, Oct 20, 2020 at 10:26 AM Javier Diaz-Reinoso via Squeak-dev < squeak-dev at lists.squeakfoundation.org> wrote: > Not with this change. > I tweaked it a bit. It should be ok now. If you'd like to review my massage of your code I'd appreciate it. > > On 19 Oct 2020, at 20:29, gettimothy via Squeak-dev < > squeak-dev at lists.squeakfoundation.org> wrote: > > Thabk you. > > > I am not sure if this other OCD nightmare has been addressed in this > discusion, bot the tail end of the title suffers from a similar issue. > > Workspace titled OCD.txt, save workspace contents to file-> OCD.txt.txt > File in contents to Workspace... > Workspace titled OCD.txt.txt save workspace contents to > file-> OCD.txt.txt.txt > ..... > > Cheers > > > ---- On Mon, 19 Oct 2020 20:19:19 -0400 * eliot.miranda at gmail.com > * wrote ---- > > Thanks Javier, I integrated it today. Finally :-) > > On Sun, Oct 18, 2020 at 8:59 AM Javier Diaz-Reinoso via Squeak-dev < > squeak-dev at lists.squeakfoundation.org> wrote: > > I send the list a change set years ago and was ignored, the current > version I use also preserve the lineConversion and remember the name for > save: > > > On 18 Oct 2020, at 07:41, Eliot Miranda wrote: > > Hi Tim, > > > On Oct 18, 2020, at 3:57 AM, gettimothy via Squeak-dev < > squeak-dev at lists.squeakfoundation.org> wrote: > >  > Ignore as fitting > > > I can join you; this gets on my tits. > > > https://www.pinterest.com/indigogeek/ocd-nightmares/ > > > FileList >>viewContentsInWorkspace > "View the contents of my selected file in a new workspace" > > | aString aFileStream aName | > aString := (aFileStream := directory readOnlyFileNamed: self fullName) > setConverterForCode contentsOfEntireFile. > aName := aFileStream localName. > aFileStream close. > UIManager default edit: aString withSqueakLineEndings label:* 'Workspace > from ',*aName > > > maybe its the OCD in me, but that verbiage preceding the file name at the > top of a workspace is redundant and annoying. > > 1. redundant--it is at the top of a Workspace. > 2. the infinitely expanding title ala *Worspace from Workspace from > Worspace from Workspace from Foo.txt* > 3. I have to edit each title upon file in. see OCD above. > > > A simple change to the method: > > FileList >> viewContentsInWorkspace > "View the contents of my selected file in a new workspace" > > | aString aFileStream aName | > aString := (aFileStream := directory readOnlyFileNamed: self fullName) > setConverterForCode contentsOfEntireFile. > aName := aFileStream localName. > aFileStream close. > *UIManager default edit: aString withSqueakLineEndings label: aName* > > > > eradicates the OCD nightmare > > > The only thing I’d suggest differently is that it check if the file name > contains “Workspace’ and if not, still adds the ‘Workspace from ’ prefix. > > cheers, > > tty > > > > > > -- > _,,,^..^,,,_ > best, Eliot > > > > > > -- _,,,^..^,,,_ best, Eliot -------------- next part -------------- An HTML attachment was scrubbed... URL: From gettimothy at zoho.com Tue Oct 20 18:55:35 2020 From: gettimothy at zoho.com (gettimothy) Date: Tue, 20 Oct 2020 14:55:35 -0400 Subject: [squeak-dev] Squeak equivalent of OSPlatform ? Message-ID: <175475ddd0a.1263071407846.3717784616042551373@zoho.com> Hi folks, > On 2020-10-20, at 7:31 AM, Marcel Taeumel wrote: > > But beware of writing too much "is(Unix|Windows)"-like code across your abstraction levels because checking for more specific capabilites might produce more readable code such as "canReadFat32Device". ... which was not your question at all here. :-D Exactly - ask 'can I do this' not 'am I a wotsit'. Fascinating! I see the utility of it. thx FWIW, the install of Pillar on Squeak relies on something called a PackageManifest and a KernelManifest in Pharo. I do not think it is worth pursuing via that route and I suspect I will have to roll-my-own. cheers. -------------- next part -------------- An HTML attachment was scrubbed... URL: From tim at rowledge.org Tue Oct 20 19:18:44 2020 From: tim at rowledge.org (tim Rowledge) Date: Tue, 20 Oct 2020 12:18:44 -0700 Subject: [squeak-dev] Squeak equivalent of OSPlatform ? In-Reply-To: <175475ddd0a.1263071407846.3717784616042551373@zoho.com> References: <175475ddd0a.1263071407846.3717784616042551373@zoho.com> Message-ID: <235F1492-6B8A-4E95-9912-08B86F633E4F@rowledge.org> > On 2020-10-20, at 11:55 AM, gettimothy via Squeak-dev wrote: > > Hi folks, > > > On 2020-10-20, at 7:31 AM, Marcel Taeumel wrote: > > > > But beware of writing too much "is(Unix|Windows)"-like code across your abstraction levels because checking for more specific capabilites might produce more readable code such as "canReadFat32Device". ... which was not your question at all here. :-D > > Exactly - ask 'can I do this' not 'am I a wotsit'. > > Fascinating! I see the utility of it. thx > There's a hierarchy of less-dumb things to do in this area. #isKindOf: is about the worst possible (though I'm sure somebody will chime in with an even worse idea). Specialising is a bit (as we often do, because of lack of opportunity to get it right) to #isInteger or #isThingyMorph is at least sensibly indicative of what you are asking. #canHandleDoodahReverse is much better but sometimes hard to implement really cleanly across a system. And of course there's always [thingy doStuff] on: MyStuffError do: [:ex| ex helpMeObiWanKenobi] if you prefer to beg forgiveness rather than ask permission, but exceptions always seem to scare people off. And there is some performance cost - at least, there always seemed to be. Maybe there isn't so much any more? tim -- tim Rowledge; tim at rowledge.org; http://www.rowledge.org/tim Trancelators interpret messages from the dead From javier_diaz_r at MAC.COM Tue Oct 20 19:27:17 2020 From: javier_diaz_r at MAC.COM (Javier Diaz-Reinoso) Date: Tue, 20 Oct 2020 14:27:17 -0500 Subject: [squeak-dev] FileList "Workspace from Foo.txt" is a redundant        OCD nightmare In-Reply-To: References: <1753b5b6a08.12001c4da53564.7892679353013142855@zoho.com> <2D211EBE-2573-4392-A813-D505B8B89FDD@gmail.com> <6E969EC2-8C2C-4DEE-8FE7-28696C74B716@mac.com> <175439ffa7e.d51fd251181689.6937546813066737879@zoho.com> <3FEC8BE3-BF9D-4D28-9E38-696EFB5CC685@mac.com> Message-ID: <9B6FC8CF-57A9-4F84-B447-DB896D4E50E6@MAC.COM> I find you like the 'Workspace from ', I think at first I conserve that but then I discard as redundant, but if you need that the change is OK with me. By the way I also have a hack for your PluggableSystemWindowWithLabelButton, I don't like the hidden (magic?) button, I always try to move the window and instead the menu pop up, so I modify the button as a visible and with '<=>' as the label, remind me of the Previous, Next arrows in other text editors like XCode: I think you probably don't like that also, but I always have the 'extra st' folder for my modifications, thats is the things I like in Squeak. > On 20 Oct 2020, at 12:31, Eliot Miranda wrote: > > > > On Tue, Oct 20, 2020 at 10:26 AM Javier Diaz-Reinoso via Squeak-dev > wrote: > Not with this change. > > I tweaked it a bit. It should be ok now. If you'd like to review my massage of your code I'd appreciate it. > >> On 19 Oct 2020, at 20:29, gettimothy via Squeak-dev > wrote: >> >> Thabk you. >> >> >> I am not sure if this other OCD nightmare has been addressed in this discusion, bot the tail end of the title suffers from a similar issue. >> >> Workspace titled OCD.txt, save workspace contents to file-> OCD.txt.txt >> File in contents to Workspace... >> Workspace titled OCD.txt.txt save workspace contents to file-> OCD.txt.txt.txt >> ..... >> >> Cheers >> >> >> ---- On Mon, 19 Oct 2020 20:19:19 -0400 eliot.miranda at gmail.com wrote ---- >> >> Thanks Javier, I integrated it today. Finally :-) >> >> On Sun, Oct 18, 2020 at 8:59 AM Javier Diaz-Reinoso via Squeak-dev > wrote: >> I send the list a change set years ago and was ignored, the current version I use also preserve the lineConversion and remember the name for save: >> >> >> On 18 Oct 2020, at 07:41, Eliot Miranda > wrote: >> >> Hi Tim, >> >> >> On Oct 18, 2020, at 3:57 AM, gettimothy via Squeak-dev > wrote: >> >>  >> Ignore as fitting >> >> I can join you; this gets on my tits. >> >> >> https://www.pinterest.com/indigogeek/ocd-nightmares/ >> >> >> FileList >>viewContentsInWorkspace >> "View the contents of my selected file in a new workspace" >> >> | aString aFileStream aName | >> aString := (aFileStream := directory readOnlyFileNamed: self fullName) setConverterForCode contentsOfEntireFile. >> aName := aFileStream localName. >> aFileStream close. >> UIManager default edit: aString withSqueakLineEndings label: 'Workspace from ',aName >> >> maybe its the OCD in me, but that verbiage preceding the file name at the top of a workspace is redundant and annoying. >> >> 1. redundant--it is at the top of a Workspace. >> 2. the infinitely expanding title ala Worspace from Workspace from Worspace from Workspace from Foo.txt >> 3. I have to edit each title upon file in. see OCD above. >> >> >> A simple change to the method: >> FileList >> viewContentsInWorkspace >> "View the contents of my selected file in a new workspace" >> >> | aString aFileStream aName | >> aString := (aFileStream := directory readOnlyFileNamed: self fullName) setConverterForCode contentsOfEntireFile. >> aName := aFileStream localName. >> aFileStream close. >> UIManager default edit: aString withSqueakLineEndings label: aName >> >> >> >> eradicates the OCD nightmare >> >> The only thing I’d suggest differently is that it check if the file name contains “Workspace’ and if not, still adds the ‘Workspace from ’ prefix. >> >> cheers, >> >> tty >> >> >> >> >> -- >> _,,,^..^,,,_ >> best, Eliot >> >> >> > > > > > -- > _,,,^..^,,,_ > best, Eliot -------------- next part -------------- An HTML attachment was scrubbed... URL: -------------- next part -------------- A non-text attachment was scrubbed... Name: Screen Shot 2020-10-20 at 14.21.07.png Type: image/png Size: 20030 bytes Desc: not available URL: From forums.jakob at resfarm.de Tue Oct 20 21:40:22 2020 From: forums.jakob at resfarm.de (Jakob Reschke) Date: Tue, 20 Oct 2020 16:40:22 -0500 (CDT) Subject: [squeak-dev] Squeak equivalent of OSPlatform ? In-Reply-To: <235F1492-6B8A-4E95-9912-08B86F633E4F@rowledge.org> References: <17546032f68.ce305db21041.1420675499747219914@zoho.com> <175475ddd0a.1263071407846.3717784616042551373@zoho.com> <235F1492-6B8A-4E95-9912-08B86F633E4F@rowledge.org> Message-ID: <1603230022372-0.post@n4.nabble.com> timrowledge wrote > And of course there's always > [thingy doStuff] > on: MyStuffError > do: [:ex| ex helpMeObiWanKenobi] Though this doesn't work so well to check protocol conformance with on: MessageNotUnderstood ("Can I use thingy doStuff or must I use otherThingy doFluff instead on this platform?"). 1) thingy might actually implement doStuff, but have a different idea of what it means than your code expects, 2) unless Obi-Wan very carefully checks the message send that signalled MNU, you would also catch all the random type errors the programmers of thingy made deep in doStuff. -- Sent from: http://forum.world.st/Squeak-Dev-f45488.html From gettimothy at zoho.com Tue Oct 20 21:59:27 2020 From: gettimothy at zoho.com (gettimothy) Date: Tue, 20 Oct 2020 17:59:27 -0400 Subject: [squeak-dev] Protocol Standards was (Re: Squeak equivalent of OSPlatform ?) In-Reply-To: <1603230022372-0.post@n4.nabble.com> References: <17546032f68.ce305db21041.1420675499747219914@zoho.com> <175475ddd0a.1263071407846.3717784616042551373@zoho.com> <235F1492-6B8A-4E95-9912-08B86F633E4F@rowledge.org> <1603230022372-0.post@n4.nabble.com> Message-ID: <17548063488.dc3018e9231483.9004947560851820798@zoho.com> This thread raises an important issue * Does Squeak have a protocol/method naming standard? Does OpenSmalltalk ? Its a huge issue for the consortium minded, but the utility is self evident when one realizes that Smalltalks are poised for explosive growth. I have bumped into, on Seaside, this issue and I entirely agree with the maintainer that java-isms are detrimental to thinking in objects. Surely helpers can be written to scan method names and flag them for improvement. *(SpeakinAsA DeveloperWhoHabituallyRevertsToCamelCaseWithDisastrousRamificationsAndClassNamesTwiceThisInLengthInA FutileDesireForClarity) ---- On Tue, 20 Oct 2020 17:40:22 -0400 forums.jakob at resfarm.de wrote ---- timrowledge wrote > And of course there's always > [thingy doStuff] >     on: MyStuffError >     do: [:ex| ex helpMeObiWanKenobi] Though this doesn't work so well to check protocol conformance with on: MessageNotUnderstood ("Can I use thingy doStuff or must I use otherThingy doFluff instead on this platform?"). 1) thingy might actually implement doStuff, but have a different idea of what it means than your code expects, 2) unless Obi-Wan very carefully checks the message send that signalled MNU, you would also catch all the random type errors the programmers of thingy made deep in doStuff. -- Sent from: http://forum.world.st/Squeak-Dev-f45488.html -------------- next part -------------- An HTML attachment was scrubbed... URL: From jecel at merlintec.com Tue Oct 20 22:15:07 2020 From: jecel at merlintec.com (Jecel Assumpcao Jr) Date: Tue, 20 Oct 2020 19:15:07 -0300 Subject: [squeak-dev] Celeste (was: Smalltalk-80) In-Reply-To: <4a12f0d9-e752-71ac-01da-cce8af8b8b0a@gmail.com> References: <715b37a6-8476-4629-8e02-23dde385635f@gmail.com> <20201019011908.A01F0540C45@proxy.email-ssl.com.br> <4a12f0d9-e752-71ac-01da-cce8af8b8b0a@gmail.com> Message-ID: <20201020221515.2C6C19C0800@proxy.email-ssl.com.br> Douglas Brebner wrote on Mon, 19 Oct 2020 11:30:09 +0100 > I see you're using Celeste. Is it still being updated? Earlier this year I looked into that as I was trying to updated my Celeste image from Squeak 4.1 32 bits to 5.3 64 bits in order to overcome the 4GB email limit. I found a few Celeste packages that were newer than what I had in 4.1. I also have a few modifications of my own, which overlap these newer packages quite a bit. Unfortunately reading my changeset files messed up things in 5.3 and I didn't investigate the problem further and instead reset my email archive, which has since grown to 358MB again. > And is it still > under the Squeak-L licence like squeakmap says? The following Celeste developers has signed a release to have their Squeak-L code available also under the MIT license: Adam Spitz, Daniel Vainsencher and Lex Spoon. On the other hand, the incomplete list I have of signatories doesn't include Bernhard Pieber nor Giovanni Giorgi, who is listed as the current administrator for Celeste on Squeak Source. Looking at old .changes files I can also see Celeste methods from Andreas Raab, Alejandro Magistrello, Vanessa Freudenberg, Dan Ingalls, Javier Diaz-Reinoso, John Maloney, Mike Rutenberg, Ned Konz, Bob Arning, Richard A. O'Keefe, Richard A. O'Keefe, Steve Elkins, Scott Wallace, Ted Kaehler and Yoshiki Ohshima. There were also methods by "dms" whose name I don't know. I think it is reasonable to consider that Celete is available under the MIT license. > I miss having tools that would let you "live" in a smalltalk image. Scamper started out a bit outdated and was quickly left behind as the web kept changing. Other things are a little more usable in today's world. A fully working SqueakNOS or equivalent would quickly show what is missing. -- Jecel From leves at caesar.elte.hu Tue Oct 20 22:34:05 2020 From: leves at caesar.elte.hu (Levente Uzonyi) Date: Wed, 21 Oct 2020 00:34:05 +0200 (CEST) Subject: [squeak-dev] Squeak equivalent of OSPlatform ? In-Reply-To: <17546032f68.ce305db21041.1420675499747219914@zoho.com> References: <17546032f68.ce305db21041.1420675499747219914@zoho.com> Message-ID: Hi Tim, On Tue, 20 Oct 2020, gettimothy via Squeak-dev wrote: > Hi folks, > > I am puttering about trying to see if I can import Pillar into Squeak. > BaselineOfPillar >> customProjectAttributes >     "Edit to return a collection of any custom attributes e.g. for conditional loading: Array with: #'Condition1' with: #'Condition2. > For more information see: http://code.google.com/p/metacello/wiki/CustomProjectAttrributes " > > | attributes | > attributes := OrderedCollection new. > OSPlatform current isWindows ifTrue: [ attributes add: #windows ]. > OSPlatform current isUnix    ifTrue: [ attributes add: #unix ]. > OSPlatform current isMacOS   ifTrue: [ attributes add: #osx ]. > ^ attributes asArray > > > I have poked around a bit and  > > ThisOSProcess concreteClass > > looks like a good replacement candidate. > > However, I figured I would check with you all first. That's totally unrelated. It's easier to fire up a pharo image if you want to figure out what got rewritten into what than guessing. So, OSPlatform provides the same information as the methods of the os category of SmalltalkImage do in Squeak. A simple replacement of that method in Squeak would be: ^Smalltalk platformName caseOf: { [ 'Mac OS' ] -> [ #(osx) ]. [ 'Win32' ] -> [ #(windows) ]. [ 'unix' ] -> [ #(unix) ] } otherwise: [ #() ] Levente > > > thx in advance. > > > > > > > From tim at rowledge.org Wed Oct 21 02:33:19 2020 From: tim at rowledge.org (tim Rowledge) Date: Tue, 20 Oct 2020 19:33:19 -0700 Subject: [squeak-dev] Squeak equivalent of OSPlatform ? In-Reply-To: <1603230022372-0.post@n4.nabble.com> References: <17546032f68.ce305db21041.1420675499747219914@zoho.com> <175475ddd0a.1263071407846.3717784616042551373@zoho.com> <235F1492-6B8A-4E95-9912-08B86F633E4F@rowledge.org> <1603230022372-0.post@n4.nabble.com> Message-ID: <2D0AAAB8-48D6-4246-BDE1-B7C6781728FA@rowledge.org> > On 2020-10-20, at 2:40 PM, Jakob Reschke wrote: > > timrowledge wrote >> And of course there's always >> [thingy doStuff] >> on: MyStuffError >> do: [:ex| ex helpMeObiWanKenobi] > > Though this doesn't work so well to check protocol conformance with on: > MessageNotUnderstood ("Can I use thingy doStuff or must I use otherThingy > doFluff instead on this platform?"). 1) thingy might actually implement > doStuff, but have a different idea of what it means than your code expects, > 2) unless Obi-Wan very carefully checks the message send that signalled MNU, > you would also catch all the random type errors the programmers of thingy > made deep in doStuff. > Yes. Exceptions can be exceptionally perplexing and stressing. This is probably why we too often see use of 'on: Error' etc. tim -- tim Rowledge; tim at rowledge.org; http://www.rowledge.org/tim CITOKATE - Criticism is the Only Known Antidote to Error From marcel.taeumel at hpi.de Wed Oct 21 07:10:11 2020 From: marcel.taeumel at hpi.de (Marcel Taeumel) Date: Wed, 21 Oct 2020 09:10:11 +0200 Subject: [squeak-dev] Celeste (was: Smalltalk-80) In-Reply-To: <20201020221515.2C6C19C0800@proxy.email-ssl.com.br> References: <715b37a6-8476-4629-8e02-23dde385635f@gmail.com> <20201019011908.A01F0540C45@proxy.email-ssl.com.br> <4a12f0d9-e752-71ac-01da-cce8af8b8b0a@gmail.com> <20201020221515.2C6C19C0800@proxy.email-ssl.com.br> Message-ID: Hi all! > Scamper started out a bit outdated and was quickly left behind as the web kept changing. Here is a more recent version of Scamper: https://github.com/hpi-swa-teaching/Scamper [https://github.com/hpi-swa-teaching/Scamper] Here is a MagicMouse, different approach on Web browsing, which uses Chromium and its PNG export plus UI event magic from Morphic to Chromium: https://github.com/cmfcmf/MagicMouse [https://github.com/cmfcmf/MagicMouse] Best, Marcel Am 21.10.2020 00:15:27 schrieb Jecel Assumpcao Jr : Douglas Brebner wrote on Mon, 19 Oct 2020 11:30:09 +0100 > I see you're using Celeste. Is it still being updated? Earlier this year I looked into that as I was trying to updated my Celeste image from Squeak 4.1 32 bits to 5.3 64 bits in order to overcome the 4GB email limit. I found a few Celeste packages that were newer than what I had in 4.1. I also have a few modifications of my own, which overlap these newer packages quite a bit. Unfortunately reading my changeset files messed up things in 5.3 and I didn't investigate the problem further and instead reset my email archive, which has since grown to 358MB again. > And is it still > under the Squeak-L licence like squeakmap says? The following Celeste developers has signed a release to have their Squeak-L code available also under the MIT license: Adam Spitz, Daniel Vainsencher and Lex Spoon. On the other hand, the incomplete list I have of signatories doesn't include Bernhard Pieber nor Giovanni Giorgi, who is listed as the current administrator for Celeste on Squeak Source. Looking at old .changes files I can also see Celeste methods from Andreas Raab, Alejandro Magistrello, Vanessa Freudenberg, Dan Ingalls, Javier Diaz-Reinoso, John Maloney, Mike Rutenberg, Ned Konz, Bob Arning, Richard A. O'Keefe, Richard A. O'Keefe, Steve Elkins, Scott Wallace, Ted Kaehler and Yoshiki Ohshima. There were also methods by "dms" whose name I don't know. I think it is reasonable to consider that Celete is available under the MIT license. > I miss having tools that would let you "live" in a smalltalk image. Scamper started out a bit outdated and was quickly left behind as the web kept changing. Other things are a little more usable in today's world. A fully working SqueakNOS or equivalent would quickly show what is missing. -- Jecel -------------- next part -------------- An HTML attachment was scrubbed... URL: From cmfcmf.flach at gmail.com Wed Oct 21 12:21:08 2020 From: cmfcmf.flach at gmail.com (cmfcmf) Date: Wed, 21 Oct 2020 07:21:08 -0500 (CDT) Subject: [squeak-dev] Context >> #quickStep broken on non-local returns? Message-ID: <1603282868719-0.post@n4.nabble.com> Hi, I am playing around with the simulator (e.g., Context class >> #trace:). To make the simulation faster, I'd like to quick-step some message sends. However, I noticed that quick-stepping doesn't work as intended if a quick-stepped send executes a non-local return. Given the following method: Running this method in the simulator using repeated calls to Context >> #step for all non-send-bytecodes and Context >> #quickStep for all send bytecodes works fine except when quick-stepping the send of at:ifPresent: The context returned by quickstepping this send has an empty stack, whereas I would expect the return value of 84 on top of the stack. The root cause, as far as I can see, is Context >> #quickSend:to:with:lookupIn:, which seems to make assumptions in its ifCurtailed: block that appear to not (or no longer) hold true. [1] I have attached a ContextTest class that includes the example method shown above and a failing test. Note that the debugger does _not_ appear to use the Context >> #quickStep mechanism when using the "over" button (in fact, the quickStep method does not appear to be used at all). The debugger uses a different technique, namely Context >> #runUntilErrorOrReturnFrom: (Debugger >> #doStep -> Process >> #completeStep: -> Process >> #complete: -> Context >> #runUntilErrorOrReturnFrom:). I observed the behavior in a fresh Squeak 5.3 image. Best Christian ContextTest.st [1] Below, I have annotated the ifCurtailed: block of Context >> #quickSend:to:with:lookupIn: with my understanding of what it is trying to do and where it goes wrong: ------ I have already tried some things to fix the ifCurtailed: block in Context >> #quickSend:to:with:lookupIn:, but I'm not sure if that's entirely correct either. However, it at least passes the test. -- Sent from: http://forum.world.st/Squeak-Dev-f45488.html From cmfcmf.flach at gmail.com Wed Oct 21 12:31:27 2020 From: cmfcmf.flach at gmail.com (cmfcmf) Date: Wed, 21 Oct 2020 07:31:27 -0500 (CDT) Subject: [squeak-dev] Context >> #quickStep broken on non-local returns? In-Reply-To: <1603282868719-0.post@n4.nabble.com> References: <1603282868719-0.post@n4.nabble.com> Message-ID: <1603283487700-0.post@n4.nabble.com> I'm afraid the code was lost from my message, even though the preview here on the forum included the code :( (Possibly I shouldn't have wrapped it in "raw" tags [using the More -> Raw Text button of the editor here on the forum]?) Anyways, here's the code again: ... snip ... Given the following method: methodToUseForQuickStepping | dictionary | dictionary := Dictionary new. dictionary at: #foo put: 42. dictionary at: #foo ifPresent: [:value | ^ value * 2]. ^ nil ... snip ... [1] Below, I have annotated the ifCurtailed: block of Context >> #quickSend:to:with:lookupIn: with my understanding of what it is trying to do and where it goes wrong: "This is supposed to be the block context, i.e. the context of the block passed to at:ifPresent:, that just executed the non-local return. However, it is _not_ (bug)" contextToReturnTo := thisContext sender receiver. "Now, given the block context, decrement the pc so that we are right before/at(?) the bytecode that caused the non-local return" contextToReturnTo pc: contextToReturnTo previousPc. "If it is indeed a non-local return (when would it not be??)" contextToReturnTo willReturnTopFromMethod ifTrue: "push the return value onto the stack (tempAt: 1 is the result temporary of the BlockClosure >> ifCurtailed: method" [contextToReturnTo push: (thisContext sender tempAt: 1)]. "Completely unrelated to everything above, escape the handling of ifCurtailed blocks by setting my sender to the sender of #quickSend:to:with:lookupIn:" thisContext swapSender: thisContext home sender. "This is the value that will be returned from #quickSend:to:with:lookupIn:" contextToReturnTo] ------ I have already tried some things to fix the ifCurtailed: block in Context >> #quickSend:to:with:lookupIn:, but I'm not sure if that's entirely correct either. However, it at least passes the test. contextToReturnTo := thisContext receiver sender. "block / method that was returned into" contextToReturnTo push: (thisContext sender tempAt: 1) "return value". thisContext swapSender: thisContext home sender. "Make this block return to the method's sender" contextToReturnTo] -- Sent from: http://forum.world.st/Squeak-Dev-f45488.html From cmfcmf.flach at gmail.com Wed Oct 21 13:09:25 2020 From: cmfcmf.flach at gmail.com (cmfcmf) Date: Wed, 21 Oct 2020 08:09:25 -0500 (CDT) Subject: [squeak-dev] Debugger / Simulator cannot simulate (some) objects as methods Message-ID: <1603285765621-0.post@n4.nabble.com> Hi, when using simple objects as methods, the simulator (and therefore the debugger also) raises an error if the object used as method does not implement certain methods from CompiledMethod (e.g., numArgs). If such code is debugged, the debugger opens a never-ending stream of error windows. I am under the (possibly wrong) assumption that objects as methods should _not_ need to implement the complete CompiledMethod protocol to be compatible with simulation and debugging. I have attached a failing test called Context2Test that uses the simulator to simulate a call of an object as method. You can also see the "never-ending stream of error windows" by placing a "self halt" at the top of the test and then stepping through the first assertion using the "over" button. WARNING: Might make your image unusable. The root cause is the Context >> #send:to:with:lookupIn: method which assumes that all methods are CompiledMethods. I have attached a simple fix that works great for me – let me know what you think about it. Best Christian Context2Test.st Context-sendtowithlookupIn.st -- Sent from: http://forum.world.st/Squeak-Dev-f45488.html From marcel.taeumel at hpi.de Wed Oct 21 13:40:50 2020 From: marcel.taeumel at hpi.de (Marcel Taeumel) Date: Wed, 21 Oct 2020 15:40:50 +0200 Subject: [squeak-dev] Debugger / Simulator cannot simulate (some) objects as methods In-Reply-To: <1603285765621-0.post@n4.nabble.com> References: <1603285765621-0.post@n4.nabble.com> Message-ID: Hi Christan, the object-as-method support in the debuuger and code simulator has never been good. :-( Not back in Squeak 3.x, not now. Maybe we can fix some of the most urgent bugs. :-) Best, Marcel Am 21.10.2020 15:09:35 schrieb cmfcmf : Hi, when using simple objects as methods, the simulator (and therefore the debugger also) raises an error if the object used as method does not implement certain methods from CompiledMethod (e.g., numArgs). If such code is debugged, the debugger opens a never-ending stream of error windows. I am under the (possibly wrong) assumption that objects as methods should _not_ need to implement the complete CompiledMethod protocol to be compatible with simulation and debugging. I have attached a failing test called Context2Test that uses the simulator to simulate a call of an object as method. You can also see the "never-ending stream of error windows" by placing a "self halt" at the top of the test and then stepping through the first assertion using the "over" button. WARNING: Might make your image unusable. The root cause is the Context >> #send:to:with:lookupIn: method which assumes that all methods are CompiledMethods. I have attached a simple fix that works great for me – let me know what you think about it. Best Christian Context2Test.st Context-sendtowithlookupIn.st -- Sent from: http://forum.world.st/Squeak-Dev-f45488.html -------------- next part -------------- An HTML attachment was scrubbed... URL: From eliot.miranda at gmail.com Wed Oct 21 14:59:06 2020 From: eliot.miranda at gmail.com (Eliot Miranda) Date: Wed, 21 Oct 2020 07:59:06 -0700 Subject: [squeak-dev] Debugger / Simulator cannot simulate (some) objects as methods In-Reply-To: <1603285765621-0.post@n4.nabble.com> References: <1603285765621-0.post@n4.nabble.com> Message-ID: Hi, > On Oct 21, 2020, at 6:09 AM, cmfcmf wrote: > > Hi, > > when using simple objects as methods, the simulator (and therefore the > debugger also) raises an error if the object used as method does not > implement certain methods from CompiledMethod (e.g., numArgs). If such code > is debugged, the debugger opens a never-ending stream of error windows. > > I am under the (possibly wrong) assumption that objects as methods should > _not_ need to implement the complete CompiledMethod protocol to be > compatible with simulation and debugging. Since the only gap that needs filling is from the retrieval of the object from the method dictionary to the send of run:asMethod:withAruuments: (or whatever the actual selector is) let me suggest that you create a wrapper class whose instances hold on to an object to be run as a method and the selector and argument count and respond to the required CompiledCode protocol. Then modify the simulator at the point where it gets the result of the message lookup from the dictionary and wraps the result in one of these if it is neither CompiledCode (isCompiledCode) not nil. We don’t want to litter the simulation code with checks and the wrapper approach has the best chance. Of course another test will be needed before a new contest is created, and maybe one test at the top of the tryPrimitive: method. > > I have attached a failing test called Context2Test that uses the simulator > to simulate a call of an object as method. You can also see the > "never-ending stream of error windows" by placing a "self halt" at the top > of the test and then stepping through the first assertion using the "over" > button. WARNING: Might make your image unusable. > > The root cause is the Context >> #send:to:with:lookupIn: method which > assumes that all methods are CompiledMethods. I have attached a simple fix > that works great for me – let me know what you think about it. > > Best > Christian > > Context2Test.st > Context-sendtowithlookupIn.st > > > > > -- > Sent from: http://forum.world.st/Squeak-Dev-f45488.html > From marcel.taeumel at hpi.de Wed Oct 21 15:33:40 2020 From: marcel.taeumel at hpi.de (Marcel Taeumel) Date: Wed, 21 Oct 2020 17:33:40 +0200 Subject: [squeak-dev] #installExtraPackages - fails on new install In-Reply-To: References: Message-ID: Hi John-Reed, hmmm... So "TestCase new ensureSecureInternetConnection" does not work in your image? Maybe SqueakSSL is not working on that R.Pi. Best, Marcel Am 20.10.2020 00:49:59 schrieb John-Reed Maffeo : First install of Squeak on a new R.Pi. After going through the setup a window pops up and asks me if I want to install extra packages. I check them all (but 1) off but I can' save them. The Save button says "Please check your internet collection". I know I do have internet connection because I just downloaded the installation. This is a neat feature and I would like to use it. I don't know if the problem is with me or in the stars. I explored the morph using the halo and found the method to #installExtraPackages and ran it from  an explorer window but that killed the image w/o installing the packages. I tried to run the method from the workplace, but that failed too. -- John-Reed Maffeo -------------- next part -------------- An HTML attachment was scrubbed... URL: From commits at source.squeak.org Wed Oct 21 16:02:58 2020 From: commits at source.squeak.org (commits at source.squeak.org) Date: Wed, 21 Oct 2020 16:02:58 0000 Subject: [squeak-dev] The Trunk: MonticelloConfigurations-mt.163.mcz Message-ID: Marcel Taeumel uploaded a new version of MonticelloConfigurations to project The Trunk: http://source.squeak.org/trunk/MonticelloConfigurations-mt.163.mcz ==================== Summary ==================== Name: MonticelloConfigurations-mt.163 Author: mt Time: 21 October 2020, 6:02:57.952951 pm UUID: 18789ac3-9476-9a40-aeea-a6dcfc3a5b32 Ancestors: MonticelloConfigurations-mt.162 Restore default name for update map to be 'update'. Not sure whether this one should also be ensured in ReleaseBuilder. =============== Diff against MonticelloConfigurations-mt.162 =============== Item was changed: ----- Method: MCMcmUpdater class>>updateMapName (in category 'preferences') ----- updateMapName "The default update map name" + ^DefaultUpdateMap ifNil: ['update']! - ^DefaultUpdateMap ifNil:['']! From marcel.taeumel at hpi.de Wed Oct 21 16:04:09 2020 From: marcel.taeumel at hpi.de (Marcel Taeumel) Date: Wed, 21 Oct 2020 18:04:09 +0200 Subject: [squeak-dev] Squeak6.0alpha-2002-64bit linux 64x64 Error installing extra packages In-Reply-To: <1753b380faf.11a118c0b53407.7861349335463862301@zoho.com> References: <1753b380faf.11a118c0b53407.7861349335463862301@zoho.com> Message-ID: Hi Timothy, please open your preferences and set "Update map name" to 'update'. I fixed that in Trunk through MonticelloConfigurations-mt.163.mcz Best, Marcel Am 18.10.2020 12:19:04 schrieb gettimothy via Squeak-dev : Hi folks I was trying to spin up the latest image/vm pair from trunk on linux64x64 for the Roassal install methodology and got a new bug.. I am assuming Linus' law will apply and somebody will find this bug to be shallow.... Error: updateMapName must be specified Pops up immediately when attempting to install the extra packages at the end of the magnificent preferences wizard. Bug appears to start in PreferenceWizardMorph >> installLatestUpdates MCConfiguration ensureOpenTranscript: false. [MCMcmUpdater default doUpdate: false] ensure: [MCConfiguration ensureOpenTranscript: true]. and barfs at MCMcmUpdater >>register "Register this instance, keyed by repository and update map name. Each update maintains its own lastUpdateMap. The registry permits multilple updaters to be maintained, with each updater keeping track of its own last update map."updateMapName isEmpty ifTrue:  [self error: 'updateMapName must be specified']. repository ifNil: [self error: 'repository is ', repository asString]. updateMapName ifNil: [self error: 'updateMapName is ', updateMapName asString]. updateMapName isEmpty ifTrue:  [self error: 'updateMapName must be specified']. ((Registry ifNil: [Registry := Dictionary new]) at: repository ifAbsentPut: [Dictionary new]) at: updateMapName put: self cheers, tty -------------- next part -------------- An HTML attachment was scrubbed... URL: From marcel.taeumel at hpi.de Wed Oct 21 16:12:34 2020 From: marcel.taeumel at hpi.de (Marcel Taeumel) Date: Wed, 21 Oct 2020 18:12:34 +0200 Subject: [squeak-dev] The Inbox: EToys-kfr.412.mcz In-Reply-To: <1C318624-9DFB-44DE-A32C-AAB72F753F02@rowledge.org> References: <1C318624-9DFB-44DE-A32C-AAB72F753F02@rowledge.org> Message-ID: Hi Karl, please do not chain unprocessed inbox items in the ancestry. This way, we can never copy over your versions but always have to re-commit your changes method-by-method. Instead, base your changes on the most recent Trunk version. EToys-kfr.413 (inbox) needs kfr.412 (inbox) but is unrelated EToys-kfr.412 (inbox) needs kfr.392 (inbox) and eem.411 (trunk) EToys-kfr.392 (inbox) needs kfr.378 (inbox) and mt.391 (trunk) ... Yes, we will see to merge your EToys contributions ASAP. Thanks! ^__^ Best, Marcel Am 17.10.2020 20:03:09 schrieb tim Rowledge : > On 2020-10-17, at 9:03 AM, commits at source.squeak.org wrote: > > self world can return nil That is somehow both deeply philosophical and sad tim -- tim Rowledge; tim at rowledge.org; http://www.rowledge.org/tim Useful random insult:- Settled some during shipping and handling. -------------- next part -------------- An HTML attachment was scrubbed... URL: From commits at source.squeak.org Wed Oct 21 16:13:56 2020 From: commits at source.squeak.org (commits at source.squeak.org) Date: Wed, 21 Oct 2020 16:13:56 0000 Subject: [squeak-dev] The Trunk: Compiler-tobe.448.mcz Message-ID: Marcel Taeumel uploaded a new version of Compiler to project The Trunk: http://source.squeak.org/trunk/Compiler-tobe.448.mcz ==================== Summary ==================== Name: Compiler-tobe.448 Author: tobe Time: 17 October 2020, 9:11:04.555834 am UUID: 0827d6fb-39db-4734-8440-9c0af90b39e5 Ancestors: Compiler-eem.447 Report pc for closureCreationNodes of full blocks See BlockNode>>#emitCodeForValue:encoder: for the analogous call without full blocks =============== Diff against Compiler-eem.447 =============== Item was changed: ----- Method: BlockNode>>emitCodeForFullBlockValue:encoder: (in category 'code generation') ----- emitCodeForFullBlockValue: stack encoder: encoder copiedValues do: [:copiedValue| copiedValue emitCodeForValue: stack encoder: encoder]. + closureCreationNode pc: encoder nextPC. encoder genPushFullClosure: closureCreationNode index numCopied: copiedValues size. stack pop: copiedValues size; push: 1! From marcel.taeumel at hpi.de Wed Oct 21 16:21:18 2020 From: marcel.taeumel at hpi.de (Marcel Taeumel) Date: Wed, 21 Oct 2020 18:21:18 +0200 Subject: [squeak-dev] [Vm-dev] Pool for sysconf constants? In-Reply-To: References: <20201013032817.GA78602@shell.msen.com> <20201016214731.GA70979@shell.msen.com> Message-ID: Hi Eliot! > I should push thoguh and sdo a sysconf pool to learn how the current system really works :-) This is so exciting!! ^__^ Best, Marcel Am 17.10.2020 00:24:11 schrieb Eliot Miranda : Hi David, > On Oct 16, 2020, at 2:47 PM, David T. Lewis wrote: > > Hi Eliot, > > Replying back on vm-dev. > > Indeed I see the problem now, thanks. > > The closest that I can come to a useful suggestion is to write a > little C program to print out the index values of interest for a > given platform, then read that into the image to build the pool. > The index values are supposed to be opaque but I doubt that they > would change much in practice. This is what an ExternalPool does *automatically*. One creates a pool containing a set of named variables, adds metadata to the pool, and then when the pool needs to initialize or change, it generates the C program automatically, runs it, reaps the values, and updates class side code to initialize the constants for specific platforms. When it is run on a different platform it generates the program for that platform, etc. The management problem therefore is how to manage the executable programs because these are needed if one wants to deploy on a specific platform. I came up with the idea many years ago at ParcPlace when the problem first surfaced (that different platforms, though they may use the same names for symbolic constants, abstract types, etc, but don't use the same values, concrete types, etc). Monty write the implementation. Marcel has shepherded it into source.squeak.org/FFI. Marcel has written an excellent and comprehensive class comment for ExternalPool. I urge that everyone interested in deployment using FFIs read it ASAP. That goes for me too, because things have moved on with the implementation. There's no need to manage external C programs; there's a need to merge the definition code that is automatically generated when run on different platforms. I should push thoguh and sdo a sysconf pool to learn how the current system really works :-) > > I am looking only at a Linux system as I write this, and the only > way I can find to discover the available parameter names is to look > in /usr/include/bits/confname.h to see what is defined. I can't > spot any other way to get at the information, and I can't find any > runtime utility that provides a listing. > > But a little utility program that could be used to update the > pool might be good enough. Attaching an example C program, I'm > not sure if it helps. > > Dave > > >> On Tue, Oct 13, 2020 at 01:49:00PM -0700, Eliot Miranda wrote: >> Hi David, >> >>> On Mon, Oct 12, 2020 at 8:28 PM David T. Lewis wrote: >>> >>> On Sun, Oct 11, 2020 at 11:15:09AM -0700, Eliot Miranda wrote: >>>> Hi All, >>>> >>>> I want to implement a number of processors query on MacOS & other >>>> unices to complement the info provided by GetSystemInfo on Windows. The >>>> natural way to do this on unices is to use sysconf (3), and of course >>> this >>>> points to the issue for which FFI pools are needed, the constant names >>> for >>>> sysconf such as _SC_NPROCESSORS_ONLN are defined, but their values are >>>> implementation dependent. >>>> >>>> But before I go amd implement an FFI pool for this I thought I'd ask >>>> a) anyone already done this? Is it published anywhere? >>>> b) how are we going to organize such pools so that people don't have to >>>> reinvent the wheel? >>>> c) should there be a pool to cover sysconf or to cover unistd.h? (the >>>> point here is that while the pool might start off small, it could grow >>> and >>>> grow and maybe unistd.h is too much surface to cover) >>>> >>>> thoughts, suggestions? >>> >>> Hi Eliot, >>> >>> At first glance, it looks to me like the hard part of the problem is to >>> know what sysconf names are available to be queried on any given platform >>> at runtime. If you know that, or if you are only interested in a limited >>> number of well-known parameters (which seems likely), then it might be >>> simplest to just implement the sysconf(3) call either as an FFI call or >>> a call through the OSProcess plugin. >>> >> >> Well, I *am* implementing it as an FFI call in Terf. The issue is deriving >> the right integer values for the particular symbolic names, because these >> vary across implementations. And that's what FFIPools are designed to >> manage. >> Right now I don't have the FFIPool so I've hard-wired the constant: >> >> !CMacOSXPlatform methodsFor: 'accessing' stamp: 'eem 10/11/2020 17:53' >> prior: 47990341! >> numberOfCPUs >> "Warning, warning, Will Robertson!!!! The sysconf method bakes in a >> decidedly implementation-specific name for the support library *and* bakes >> in a value for a symbolic constant. Both of these are implementation >> dependent and subject to change. That said..." >> ^self sysconf: 58 >> >> "CPlatform current numberOfCPUs"! ! >> !CMacOSXPlatform methodsFor: 'private' stamp: 'eem 10/11/2020 17:51'! >> sysconf: systemInfo >> "Answer a value from sysconf(3)." >> >> '/usr/lib/system/libsystem_c.dylib'> >> ^self externalCallFailed >> >> " | scnprocsonline | >> scnprocsonline := 58. >> self current sysconf: scnprocsonline"! ! >> >> There's much to be unhappy about in this code: libSystem.dylib is the >> abstract name, but one can't use it because the search facilities can't >> chain through the libraries that libSystem.B.dylib (ibSystem.dylib is a >> symbolic link) refers to. So this could break in some future MacOS, >> whereas if libSystem.dylib did work, or if there was a symbolic name we >> could use that meant "the C library goddamnit", then it could be relied >> upon. 58 is meaningful only on MacOS, and presumably only since a >> particular version. That's why we need an FFIPool to manage the >> cross-platform variations. The type is longlong, which means we're not >> using a syntax that matches the declaration, and this will work only on >> 64-bits. We can fix the FFI to interpret C names accoding to the >> playtform, but we have a serious backwards-compatibility problem in that >> all of the FFI definitions up til now have been written under this >> assumption. >> >> But I suspect that I am not answering the right question here. If I am >>> off base, can you give an example of some of the parameters that you >>> would want to be able to query? >>> >> >> First off Terf needs _SC_NUM_PROCESSORS_ONLN, which is notionally the >> number of processors online, but now answers the number of cores, which >> shows you how fast these ideas go stale (_SC_NUM_PROCESSORS_CONF is the >> number of processors configured ;-) ). Other ones that could be meaningful >> for applications include _SC_ARG_MAX (The maximum bytes of argument to >> execve(2)) _SC_CHILD_MAX (The maximum number of simultaneous processes per >> user id), _SC_OPEN_MAX (The maximum number of open files per user id), >> _SC_STREAM_MAX (The minimum maximum number of streams that a process may >> have open at any one time), _SC_PHYS_PAGES (The number of pages of physical >> memory). >> >> There are many others, quite a few I can't imagine ever being compelling. >> >> Now yes, one can imagine implementing a cross-platform abstraction for >> these but it's a lot of effort for little gain. It;s easier just to suck >> it up and implement the FFI call. >> >> But I'm imagining these things will get used by the community and I don't >> want people to have to reinvent the wheel. This kind of stuff doesn't >> belong in trunk, but it does belong somewhere where we can share and >> coevolve the facilities. >> >> >>> Thanks, >>> Dave >>> >>> >>> >> >> -- >> _,,,^..^,,,_ >> best, Eliot > >> > > -------------- next part -------------- An HTML attachment was scrubbed... URL: From tim at rowledge.org Wed Oct 21 17:01:24 2020 From: tim at rowledge.org (tim Rowledge) Date: Wed, 21 Oct 2020 10:01:24 -0700 Subject: [squeak-dev] #installExtraPackages - fails on new install In-Reply-To: References: Message-ID: > On 2020-10-21, at 8:33 AM, Marcel Taeumel wrote: > > > hmmm... So "TestCase new ensureSecureInternetConnection" does not work in your image? Maybe SqueakSSL is not working on that R.Pi. > Works ok on my Pi4 so should have some chance of working on any other Pi. tim -- tim Rowledge; tim at rowledge.org; http://www.rowledge.org/tim Strange OpCodes: IOP: Insult OPerator From gettimothy at zoho.com Wed Oct 21 17:09:26 2020 From: gettimothy at zoho.com (gettimothy) Date: Wed, 21 Oct 2020 13:09:26 -0400 Subject: [squeak-dev] #installExtraPackages - fails on new install In-Reply-To: References: Message-ID: <1754c230ba5.c68a703024213.9040368036096187468@zoho.com> IIRC, I had these symptoms when SmalltalkHub.com was down. I just checked smalltalkhub, and it is up, so retry? ---- On Wed, 21 Oct 2020 11:33:40 -0400 Marcel Taeumel wrote ---- Hi John-Reed, hmmm... So "TestCase new ensureSecureInternetConnection" does not work in your image? Maybe SqueakSSL is not working on that R.Pi. Best, Marcel Am 20.10.2020 00:49:59 schrieb John-Reed Maffeo : First install of Squeak on a new R.Pi. After going through the setup a window pops up and asks me if I want to install extra packages. I check them all (but 1) off but I can' save them. The Save button says "Please check your internet collection". I know I do have internet connection because I just downloaded the installation. This is a neat feature and I would like to use it. I don't know if the problem is with me or in the stars. I explored the morph using the halo and found the method to #installExtraPackages and ran it from  an explorer window but that killed the image w/o installing the packages. I tried to run the method from the workplace, but that failed too. -- John-Reed Maffeo -------------- next part -------------- An HTML attachment was scrubbed... URL: From kirtai+st at gmail.com Wed Oct 21 17:38:03 2020 From: kirtai+st at gmail.com (Douglas Brebner) Date: Wed, 21 Oct 2020 18:38:03 +0100 Subject: [squeak-dev] Celeste (was: Smalltalk-80) In-Reply-To: <20201020221515.2C6C19C0800@proxy.email-ssl.com.br> References: <715b37a6-8476-4629-8e02-23dde385635f@gmail.com> <20201019011908.A01F0540C45@proxy.email-ssl.com.br> <4a12f0d9-e752-71ac-01da-cce8af8b8b0a@gmail.com> <20201020221515.2C6C19C0800@proxy.email-ssl.com.br> Message-ID: <6714ddec-1105-d687-b3d4-d199f8c84173@gmail.com> On 20/10/2020 23:15, Jecel Assumpcao Jr wrote: > Douglas Brebner wrote on Mon, 19 Oct 2020 11:30:09 +0100 > I think it is reasonable to consider that Celete is available under the MIT license. Thank you >> I miss having tools that would let you "live" in a smalltalk image. > Scamper started out a bit outdated and was quickly left behind as the > web kept changing. Other things are a little more usable in today's > world. A fully working SqueakNOS or equivalent would quickly show what > is missing. Yes, web stuff, especially rendering, is a hideously complex, massive task. Maybe an approach like the nyxt browser (common lisp) which wraps an engine would be feasible but I'm not confident. Special purpose clients should work, assuming they don't assume the availiblility of a web renderer. -------------- next part -------------- An HTML attachment was scrubbed... URL: From eliot.miranda at gmail.com Wed Oct 21 17:38:06 2020 From: eliot.miranda at gmail.com (Eliot Miranda) Date: Wed, 21 Oct 2020 10:38:06 -0700 Subject: [squeak-dev] FileList "Workspace from Foo.txt" is a redundant        OCD nightmare In-Reply-To: <9B6FC8CF-57A9-4F84-B447-DB896D4E50E6@MAC.COM> References: <1753b5b6a08.12001c4da53564.7892679353013142855@zoho.com> <2D211EBE-2573-4392-A813-D505B8B89FDD@gmail.com> <6E969EC2-8C2C-4DEE-8FE7-28696C74B716@mac.com> <175439ffa7e.d51fd251181689.6937546813066737879@zoho.com> <3FEC8BE3-BF9D-4D28-9E38-696EFB5CC685@mac.com> <9B6FC8CF-57A9-4F84-B447-DB896D4E50E6@MAC.COM> Message-ID: Hi Javier, On Tue, Oct 20, 2020 at 12:27 PM Javier Diaz-Reinoso via Squeak-dev < squeak-dev at lists.squeakfoundation.org> wrote: > I find you like the 'Workspace from ', I think at first I conserve that > but then I discard as redundant, but if you need that the change is OK with > me. > It's not that I like it or don't. It's the way the system worked and one shouldn't break things like that just for personal preference. So in integrating your code I had two criteria - fix the bugs (your code to track the directory and line ending, and to get the title and save name right, is clearly an improvement) - don't change the observable behaviour except in eliminating bugs I'm happy not to have "Workspace from ..." in the title but I don't get to just do that on a whim. That would need to be discussed and something close to consensus reached before it could be changed. > By the way I also have a hack for > your PluggableSystemWindowWithLabelButton, I don't like the hidden (magic?) > button, I always try to move the window and instead the menu pop up, so I > modify the button as a visible and with '<=>' as the label, remind me of > the Previous, Next arrows in other text editors like XCode: > > I think you probably don't like that also, but I always have the 'extra > st' folder for my modifications, thats is the things I like in Squeak. > > On 20 Oct 2020, at 12:31, Eliot Miranda wrote: > > > > On Tue, Oct 20, 2020 at 10:26 AM Javier Diaz-Reinoso via Squeak-dev < > squeak-dev at lists.squeakfoundation.org> wrote: > >> Not with this change. >> > > I tweaked it a bit. It should be ok now. If you'd like to review my > massage of your code I'd appreciate it. > >> >> On 19 Oct 2020, at 20:29, gettimothy via Squeak-dev < >> squeak-dev at lists.squeakfoundation.org> wrote: >> >> Thabk you. >> >> >> I am not sure if this other OCD nightmare has been addressed in this >> discusion, bot the tail end of the title suffers from a similar issue. >> >> Workspace titled OCD.txt, save workspace contents to file-> OCD.txt.txt >> File in contents to Workspace... >> Workspace titled OCD.txt.txt save workspace contents to >> file-> OCD.txt.txt.txt >> ..... >> >> Cheers >> >> >> ---- On Mon, 19 Oct 2020 20:19:19 -0400 *eliot.miranda at gmail.com >> *wrote ---- >> >> Thanks Javier, I integrated it today. Finally :-) >> >> On Sun, Oct 18, 2020 at 8:59 AM Javier Diaz-Reinoso via Squeak-dev < >> squeak-dev at lists.squeakfoundation.org> wrote: >> >> I send the list a change set years ago and was ignored, the current >> version I use also preserve the lineConversion and remember the name for >> save: >> >> >> On 18 Oct 2020, at 07:41, Eliot Miranda wrote: >> >> Hi Tim, >> >> >> On Oct 18, 2020, at 3:57 AM, gettimothy via Squeak-dev < >> squeak-dev at lists.squeakfoundation.org> wrote: >> >>  >> Ignore as fitting >> >> >> I can join you; this gets on my tits. >> >> >> https://www.pinterest.com/indigogeek/ocd-nightmares/ >> >> >> FileList >>viewContentsInWorkspace >> "View the contents of my selected file in a new workspace" >> >> | aString aFileStream aName | >> aString := (aFileStream := directory readOnlyFileNamed: self fullName) >> setConverterForCode contentsOfEntireFile. >> aName := aFileStream localName. >> aFileStream close. >> UIManager default edit: aString withSqueakLineEndings label:* 'Workspace >> from ',*aName >> >> >> maybe its the OCD in me, but that verbiage preceding the file name at the >> top of a workspace is redundant and annoying. >> >> 1. redundant--it is at the top of a Workspace. >> 2. the infinitely expanding title ala *Worspace from Workspace from >> Worspace from Workspace from Foo.txt* >> 3. I have to edit each title upon file in. see OCD above. >> >> >> A simple change to the method: >> >> FileList >> viewContentsInWorkspace >> "View the contents of my selected file in a new workspace" >> >> | aString aFileStream aName | >> aString := (aFileStream := directory readOnlyFileNamed: self fullName) >> setConverterForCode contentsOfEntireFile. >> aName := aFileStream localName. >> aFileStream close. >> *UIManager default edit: aString withSqueakLineEndings label: aName* >> >> >> >> eradicates the OCD nightmare >> >> >> The only thing I’d suggest differently is that it check if the file name >> contains “Workspace’ and if not, still adds the ‘Workspace from ’ prefix. >> >> cheers, >> >> tty >> >> >> >> >> >> -- >> _,,,^..^,,,_ >> best, Eliot >> >> >> >> >> >> > > -- > _,,,^..^,,,_ > best, Eliot > > > > -- _,,,^..^,,,_ best, Eliot -------------- next part -------------- An HTML attachment was scrubbed... URL: -------------- next part -------------- A non-text attachment was scrubbed... Name: Screen Shot 2020-10-20 at 14.21.07.png Type: image/png Size: 20030 bytes Desc: not available URL: From karlramberg at gmail.com Wed Oct 21 18:30:06 2020 From: karlramberg at gmail.com (karl ramberg) Date: Wed, 21 Oct 2020 20:30:06 +0200 Subject: [squeak-dev] The Inbox: EToys-kfr.412.mcz In-Reply-To: References: <1C318624-9DFB-44DE-A32C-AAB72F753F02@rowledge.org> Message-ID: Removed from inbox now Best, Karl On Wed, Oct 21, 2020 at 6:12 PM Marcel Taeumel wrote: > Hi Karl, > > please do not chain unprocessed inbox items in the ancestry. This way, we > can never copy over your versions but always have to re-commit your changes > method-by-method. Instead, base your changes on the most recent Trunk > version. > > EToys-kfr.413 (inbox) needs kfr.412 (inbox) but is unrelated > EToys-kfr.412 (inbox) needs kfr.392 (inbox) and eem.411 (trunk) > EToys-kfr.392 (inbox) needs kfr.378 (inbox) and mt.391 (trunk) > ... > > Yes, we will see to merge your EToys contributions ASAP. Thanks! ^__^ > > Best, > Marcel > > Am 17.10.2020 20:03:09 schrieb tim Rowledge : > > > > On 2020-10-17, at 9:03 AM, commits at source.squeak.org wrote: > > > > self world can return nil > > That is somehow both deeply philosophical and sad > > tim > -- > tim Rowledge; tim at rowledge.org; http://www.rowledge.org/tim > Useful random insult:- Settled some during shipping and handling. > > > > > -------------- next part -------------- An HTML attachment was scrubbed... URL: From marcel.taeumel at hpi.de Thu Oct 22 07:50:01 2020 From: marcel.taeumel at hpi.de (Marcel Taeumel) Date: Thu, 22 Oct 2020 09:50:01 +0200 Subject: [squeak-dev] WebResponse | Bug in binary-vs-ascii Message-ID: Hi all! So, WebClient will pass the 'stream' as-is when creating the WebResponse via #readFrom:. The response will then read the headers. But there is no code that checks 'content-type' nor 'content-encoding' to set that stream back to binary. :-( This is a bug? Well, there is code that checks the stream for "isBinary" to then use appropriate buffers, i.e. String or ByteArray.  Best, Marcel -------------- next part -------------- An HTML attachment was scrubbed... URL: From gettimothy at zoho.com Thu Oct 22 12:35:33 2020 From: gettimothy at zoho.com (gettimothy) Date: Thu, 22 Oct 2020 08:35:33 -0400 Subject: [squeak-dev] Roassal next steps. In-Reply-To: References: <1753b6eaa9b.100671f7753664.7962165064272652854@zoho.com> <1753b74de70.c330f35153689.4421687570681635679@zoho.com> Message-ID: <175504ea818.e97438a53947.1738347645579055369@zoho.com> Hi Tom, I just reinstalled from zero and the Announcements are installed. I will apply your patches now. cheers, ---- On Sun, 18 Oct 2020 08:04:32 -0400 Tom Beckmann wrote ---- Hey timothy, in theory, after loading Roassal3 from the fork I had sent you, you should already have a somewhat working Announcements installed. The two patches that I sent you, I believe, last week, fixed the two test cases that you pointed out were failing. The package I'm loading on Squeak is this one: http://www.squeaksource.com/AXAnnouncements.html (but it should already be installed if you used Metacello to get Roassal3, you can check in your image to see if there already in an "Announcer" class). Are there other roadblocks concerning Announcements that you are encountering? Best, Tom On Sun, Oct 18, 2020 at 1:25 PM gettimothy via Squeak-dev wrote: update... I figured out how to clone the pharo-project/pharo repo and it is downloading now. I should be able to figure it out from there.. ---- On Sun, 18 Oct 2020 07:18:29 -0400 gettimothy wrote ---- Hi Jakob "We" might not need Announcements, but Roassal uses them, so "it" needs them. :-) Is AXAnnouncements still API-compatible with the Pharo Announcements (or should I phrase this the other way around)? Either way, it would be nice to have a working Pharo-Announcements-API implementation for Squeak, at least for compatibility's sake. It doesn't have to be in the Trunk, but once you have an implementation or shim, one would extend the BaselineOfRoassal to include this dependency for Squeak only. I think this is worth working on. One problem, is that I have no idea how to access the pharo Announcements repo so I can get it into squeak. The pharo-local/package-cache is empty for the Announcments-Core(tonel-1)  and I don't know where to look on the web for pharo stuff. Any pointers much appreciated, thx -- Sent from: http://forum.world.st/Squeak-Dev-f45488.html -------------- next part -------------- An HTML attachment was scrubbed... URL: From gettimothy at zoho.com Thu Oct 22 14:51:20 2020 From: gettimothy at zoho.com (gettimothy) Date: Thu, 22 Oct 2020 10:51:20 -0400 Subject: [squeak-dev] Roassal3 tests: (BoxedFloat64 infinity) >= 1 -> false Message-ID: <17550caf811.11f7fea6b6179.7340930979644316667@zoho.com> Hi folks, Version: Squeak6.0alphaUpdate: 20010 Working through the Roassal3 tests   in RSAbstractAnimation>>loops: aNumber self assert: aNumber >= 1 description: 'The number of times to repeat this animation'.    <----test fails here. loops := aNumber aNumber is Infinity (inspecting displays a Boxed Float) Poking around a bit... (BoxedFloat64 infinity) >= 1  -> false then.... (BoxedFloat64 infinity) < 1 ->true Is this expected? If so, suggestions on how  I should I make the test reflect reality? thx in advance. -------------- next part -------------- An HTML attachment was scrubbed... URL: From Christoph.Thiede at student.hpi.uni-potsdam.de Thu Oct 22 17:28:42 2020 From: Christoph.Thiede at student.hpi.uni-potsdam.de (Thiede, Christoph) Date: Thu, 22 Oct 2020 17:28:42 +0000 Subject: [squeak-dev] Debugger / Simulator cannot simulate (some) objects as methods In-Reply-To: References: <1603285765621-0.post@n4.nabble.com>, Message-ID: <2b359e9fe9a047959749d12536459b8c@student.hpi.uni-potsdam.de> Hi Christian, hi all, I already implemented the simulation of objects as methods in Kernel-ct.1339 (Inbox). It has been working fine for me since February - we only need to get things like this merged sooner to prevent everyone from reinventing the wheel. :-) Best, Christoph ________________________________ Von: Squeak-dev im Auftrag von Eliot Miranda Gesendet: Mittwoch, 21. Oktober 2020 16:59:06 An: The general-purpose Squeak developers list Betreff: Re: [squeak-dev] Debugger / Simulator cannot simulate (some) objects as methods Hi, > On Oct 21, 2020, at 6:09 AM, cmfcmf wrote: > > Hi, > > when using simple objects as methods, the simulator (and therefore the > debugger also) raises an error if the object used as method does not > implement certain methods from CompiledMethod (e.g., numArgs). If such code > is debugged, the debugger opens a never-ending stream of error windows. > > I am under the (possibly wrong) assumption that objects as methods should > _not_ need to implement the complete CompiledMethod protocol to be > compatible with simulation and debugging. Since the only gap that needs filling is from the retrieval of the object from the method dictionary to the send of run:asMethod:withAruuments: (or whatever the actual selector is) let me suggest that you create a wrapper class whose instances hold on to an object to be run as a method and the selector and argument count and respond to the required CompiledCode protocol. Then modify the simulator at the point where it gets the result of the message lookup from the dictionary and wraps the result in one of these if it is neither CompiledCode (isCompiledCode) not nil. We don’t want to litter the simulation code with checks and the wrapper approach has the best chance. Of course another test will be needed before a new contest is created, and maybe one test at the top of the tryPrimitive: method. > > I have attached a failing test called Context2Test that uses the simulator > to simulate a call of an object as method. You can also see the > "never-ending stream of error windows" by placing a "self halt" at the top > of the test and then stepping through the first assertion using the "over" > button. WARNING: Might make your image unusable. > > The root cause is the Context >> #send:to:with:lookupIn: method which > assumes that all methods are CompiledMethods. I have attached a simple fix > that works great for me – let me know what you think about it. > > Best > Christian > > Context2Test.st > Context-sendtowithlookupIn.st > > > > > -- > Sent from: http://forum.world.st/Squeak-Dev-f45488.html > -------------- next part -------------- An HTML attachment was scrubbed... URL: From vanessa at codefrau.net Thu Oct 22 20:06:55 2020 From: vanessa at codefrau.net (Vanessa Freudenberg) Date: Thu, 22 Oct 2020 13:06:55 -0700 Subject: [squeak-dev] Roassal3 tests: (BoxedFloat64 infinity) >= 1 -> false In-Reply-To: <17550caf811.11f7fea6b6179.7340930979644316667@zoho.com> References: <17550caf811.11f7fea6b6179.7340930979644316667@zoho.com> Message-ID: What does "BoxedFloat64 infinity print? And what VM are you on? 32 or 64 bits? FWIW, it works fine on this VM: Open Smalltalk Cog[Spur] VM [CoInterpreterPrimitives VMMaker.oscog-nice.2715] 64 bit Mac OS X built on Mar 3 2020 08:28:30 GMT Compiler: 4.2.1 Compatible Apple LLVM 8.1.0 (clang-802.0.42) platform sources revision VM: 202003021730 https://github.com/OpenSmalltalk/opensmalltalk-vm.git Date: Mon Mar 2 18:30:55 2020 CommitHash: 6a0bc96 Plugins: 202003021730 https://github.com/OpenSmalltalk/opensmalltalk-vm.git CoInterpreter VMMaker.oscog-nice.2715 uuid: 78e2f556-9829-42fe-963d-e19dfc43c0e9 Mar 3 2020 StackToRegisterMappingCogit VMMaker.oscog-eem.2719 uuid: e40f3e94-3a54-411b-9613-5d19114ea131 Mar 3 2020 - Vanessa - On Thu, Oct 22, 2020 at 7:51 AM gettimothy via Squeak-dev < squeak-dev at lists.squeakfoundation.org> wrote: > Hi folks, > > Version: Squeak6.0alphaUpdate: 20010 > > > Working through the Roassal3 tests > > in RSAbstractAnimation>>loops: aNumber > *self assert: aNumber >= 1 description: 'The number of times to repeat > this animation'. <----test fails here.* > loops := aNumber > > aNumber is Infinity (inspecting displays a Boxed Float) > > Poking around a bit... > > (BoxedFloat64 infinity) >= 1 -> false > > > then.... > > (BoxedFloat64 infinity) < 1 ->true > > > Is this expected? > > If so, suggestions on how I should I make the test reflect reality? > > thx in advance. > > > -------------- next part -------------- An HTML attachment was scrubbed... URL: From tomjonabc at gmail.com Fri Oct 23 05:42:52 2020 From: tomjonabc at gmail.com (Tom Beckmann) Date: Fri, 23 Oct 2020 07:42:52 +0200 Subject: [squeak-dev] Roassal3 tests: (BoxedFloat64 infinity) >= 1 -> false In-Reply-To: References: <17550caf811.11f7fea6b6179.7340930979644316667@zoho.com> Message-ID: Hi timothy, here, too, I don't observe any issues. Is it possible that you loaded some Number/Math package from Pharo that could have introduced erroneous overrides? All tests from Roassal3-Animation pass for me, except two that assume that `3 second` returns `0:00:03`, which it does in Pharo, while in Squeak it always returns `0:00:01`. Not sure which behavior I like more (I think I would personally prefer Squeak's behavior, iff it threw an error when I run `3 second` instead of silently discarding the two seconds). Regardless of that we should propose to change it to `#seconds`, as Roassal uses `#seconds` everywhere else in their code when referring to time spans >1 second. Best, Tom On Thu, Oct 22, 2020 at 10:07 PM Vanessa Freudenberg wrote: > What does "BoxedFloat64 infinity print? > > And what VM are you on? 32 or 64 bits? > > FWIW, it works fine on this VM: > > Open Smalltalk Cog[Spur] VM [CoInterpreterPrimitives > VMMaker.oscog-nice.2715] 64 bit > Mac OS X built on Mar 3 2020 08:28:30 GMT Compiler: 4.2.1 Compatible > Apple LLVM 8.1.0 (clang-802.0.42) > platform sources revision VM: 202003021730 > https://github.com/OpenSmalltalk/opensmalltalk-vm.git Date: Mon Mar 2 > 18:30:55 2020 CommitHash: 6a0bc96 Plugins: 202003021730 > https://github.com/OpenSmalltalk/opensmalltalk-vm.git > CoInterpreter VMMaker.oscog-nice.2715 uuid: > 78e2f556-9829-42fe-963d-e19dfc43c0e9 Mar 3 2020 > StackToRegisterMappingCogit VMMaker.oscog-eem.2719 uuid: > e40f3e94-3a54-411b-9613-5d19114ea131 Mar 3 2020 > > - Vanessa - > > On Thu, Oct 22, 2020 at 7:51 AM gettimothy via Squeak-dev < > squeak-dev at lists.squeakfoundation.org> wrote: > >> Hi folks, >> >> Version: Squeak6.0alphaUpdate: 20010 >> >> >> Working through the Roassal3 tests >> >> in RSAbstractAnimation>>loops: aNumber >> *self assert: aNumber >= 1 description: 'The number of times to repeat >> this animation'. <----test fails here.* >> loops := aNumber >> >> aNumber is Infinity (inspecting displays a Boxed Float) >> >> Poking around a bit... >> >> (BoxedFloat64 infinity) >= 1 -> false >> >> >> then.... >> >> (BoxedFloat64 infinity) < 1 ->true >> >> >> Is this expected? >> >> If so, suggestions on how I should I make the test reflect reality? >> >> thx in advance. >> >> >> -------------- next part -------------- An HTML attachment was scrubbed... URL: From commits at source.squeak.org Fri Oct 23 09:16:52 2020 From: commits at source.squeak.org (commits at source.squeak.org) Date: Fri, 23 Oct 2020 09:16:52 0000 Subject: [squeak-dev] The Trunk: Graphics-mt.441.mcz Message-ID: Marcel Taeumel uploaded a new version of Graphics to project The Trunk: http://source.squeak.org/trunk/Graphics-mt.441.mcz ==================== Summary ==================== Name: Graphics-mt.441 Author: mt Time: 23 October 2020, 11:16:33.855975 am UUID: f361d2b2-6806-6147-a702-9ae9b4a6f9ec Ancestors: Graphics-mt.440 Some clean up around DisplayTransform. Thanks to Stephan Lutz (stlu)! =============== Diff against Graphics-mt.440 =============== Item was changed: ----- Method: CompositeTransform>>asMorphicTransform (in category 'converting') ----- asMorphicTransform "Squash a composite transform down to a simple one" + ^ MorphicTransform + offset: (self localPointToGlobal: 0 at 0) negated + angle: self angle + scale: self scale! - ^ MorphicTransform offset: self offset angle: self angle scale: self scale! Item was removed: - ----- Method: CompositeTransform>>offset (in category 'accessing') ----- - offset - ^ (self localPointToGlobal: 0 at 0) negated! Item was removed: - ----- Method: IdentityTransform>>offset (in category 'accessing') ----- - offset - ^0 at 0! Item was changed: ----- Method: MatrixTransform2x3>>offset (in category 'accessing') ----- offset + "The translation applied to all transformed points." + "Note: While other transform types also implement this method their actual behavior can differ. Only use it if you know what kind of transform you have on hand. Otherwise, use #localPointToGlobal: instead." ^self a13 @ self a23! Item was changed: ----- Method: MorphicTransform class>>offset:angle:scale: (in category 'instance creation') ----- + offset: aPoint angle: radians scale: factor - offset: aPoint angle: a scale: s + ^ self basicNew setOffset: aPoint angle: radians scale: factor! - ^ self basicNew setOffset: aPoint angle: a scale: s! Item was changed: ----- Method: MorphicTransform>>offset (in category 'accessing') ----- offset + "The translation applied to the transformed coordinate system's origin." + "Note: While other transform types also implement this method their actual behavior can differ. Only use it if you know what kind of transform you have on hand. Otherwise, use #localPointToGlobal: instead." ^ offset ! From commits at source.squeak.org Fri Oct 23 09:17:30 2020 From: commits at source.squeak.org (commits at source.squeak.org) Date: Fri, 23 Oct 2020 09:17:30 0000 Subject: [squeak-dev] The Trunk: Morphic-mt.1706.mcz Message-ID: Marcel Taeumel uploaded a new version of Morphic to project The Trunk: http://source.squeak.org/trunk/Morphic-mt.1706.mcz ==================== Summary ==================== Name: Morphic-mt.1706 Author: mt Time: 23 October 2020, 11:17:24.216975 am UUID: bccea572-5cda-db4d-a72a-63f5a8f4e49d Ancestors: Morphic-eem.1705 Complements Graphics-mt.441 =============== Diff against Morphic-eem.1705 =============== Item was changed: ----- Method: ColorPatchCanvas>>transformBy:clippingTo:during:smoothing: (in category 'drawing-support') ----- transformBy: aDisplayTransform clippingTo: aClipRect during: aBlock smoothing: cellSize "Note: This method has been originally copied from TransformationMorph." | innerRect patchRect sourceQuad warp start subCanvas | + aDisplayTransform isPureTranslation ifTrue: [ + ^ self + translateBy: (aDisplayTransform localPointToGlobal: 0 at 0) truncated + clippingTo: aClipRect + during: aBlock]. - (aDisplayTransform isPureTranslation) ifTrue:[ - subCanvas := self copyOffset: aDisplayTransform offset negated truncated - clipRect: aClipRect. - aBlock value: subCanvas. - foundMorph := subCanvas foundMorph. - ^self - ]. "Prepare an appropriate warp from patch to innerRect" innerRect := aClipRect. patchRect := aDisplayTransform globalBoundsToLocal: (self clipRect intersect: innerRect). sourceQuad := (aDisplayTransform sourceQuadFor: innerRect) collect: [:p | p - patchRect topLeft]. warp := self warpFrom: sourceQuad toRect: innerRect. warp cellSize: cellSize. "Render the submorphs visible in the clipping rectangle, as patchForm" start := (self depth = 1 and: [self isShadowDrawing not]) "If this is true B&W, then we need a first pass for erasure." ifTrue: [1] ifFalse: [2]. start to: 2 do: [:i | "If i=1 we first make a shadow and erase it for opaque whites in B&W" subCanvas := ColorPatchCanvas extent: patchRect extent depth: self depth. subCanvas stopMorph: stopMorph. subCanvas foundMorph: foundMorph. subCanvas doStop: doStop. i=1 ifTrue: [subCanvas shadowColor: Color black. warp combinationRule: Form erase] ifFalse: [self isShadowDrawing ifTrue: [subCanvas shadowColor: self shadowColor]. warp combinationRule: Form paint]. subCanvas translateBy: patchRect topLeft negated during: aBlock. i = 2 ifTrue:[foundMorph := subCanvas foundMorph]. warp sourceForm: subCanvas form; warpBits. warp sourceForm: nil. subCanvas := nil "release space for next loop"] ! From commits at source.squeak.org Fri Oct 23 09:17:58 2020 From: commits at source.squeak.org (commits at source.squeak.org) Date: Fri, 23 Oct 2020 09:17:58 0000 Subject: [squeak-dev] The Trunk: 60Deprecated-mt.82.mcz Message-ID: Marcel Taeumel uploaded a new version of 60Deprecated to project The Trunk: http://source.squeak.org/trunk/60Deprecated-mt.82.mcz ==================== Summary ==================== Name: 60Deprecated-mt.82 Author: mt Time: 23 October 2020, 11:17:56.931975 am UUID: 8d2b06eb-e1e5-1040-a27a-64bb36ee2562 Ancestors: 60Deprecated-mt.81 Complements Graphics-mt.441 =============== Diff against 60Deprecated-mt.81 =============== Item was added: + ----- Method: CompositeTransform>>offset (in category '*60Deprecated-accessing') ----- + offset + self deprecated: 'Use #localPointToGlobal: instead. Behavior of #offset can vary between transform types.'. + ^ (self localPointToGlobal: 0 at 0) negated! Item was added: + ----- Method: IdentityTransform>>offset (in category '*60Deprecated-accessing') ----- + offset + self deprecated: 'Use #localPointToGlobal: instead. Behavior of #offset can vary between transform types.'. + ^0 at 0! From commits at source.squeak.org Fri Oct 23 09:38:43 2020 From: commits at source.squeak.org (commits at source.squeak.org) Date: Fri, 23 Oct 2020 09:38:43 0000 Subject: [squeak-dev] The Trunk: System-mt.1182.mcz Message-ID: Marcel Taeumel uploaded a new version of System to project The Trunk: http://source.squeak.org/trunk/System-mt.1182.mcz ==================== Summary ==================== Name: System-mt.1182 Author: mt Time: 23 October 2020, 11:38:38.259209 am UUID: 9ac892f7-a8df-d342-a4d7-36023435e3b1 Ancestors: System-eem.1181 Adds Stephan Lutz (stlu) as contributor. =============== Diff against System-eem.1181 =============== Item was changed: ----- Method: SystemNavigation class>>privateAuthorsRaw (in category 'class initialization') ----- (excessive size, no diff calculated) Item was changed: + (PackageInfo named: 'System') postscript: 'SystemNavigation initializeAuthors.'! - (PackageInfo named: 'System') postscript: 'UserInterfaceTheme cleanUpAndReset.'! From commits at source.squeak.org Fri Oct 23 09:57:36 2020 From: commits at source.squeak.org (commits at source.squeak.org) Date: Fri, 23 Oct 2020 09:57:36 0000 Subject: [squeak-dev] The Trunk: Tools-mt.1006.mcz Message-ID: Marcel Taeumel uploaded a new version of Tools to project The Trunk: http://source.squeak.org/trunk/Tools-mt.1006.mcz ==================== Summary ==================== Name: Tools-mt.1006 Author: mt Time: 23 October 2020, 11:57:33.577209 am UUID: e5ad1011-afd5-f649-b77a-132aa14ab49c Ancestors: Tools-eem.1005 Adds author's full name to annotation pane if known and configured for annotations. See Preferences class >> #defaultAnnotationRequests. =============== Diff against Tools-eem.1005 =============== Item was changed: ----- Method: CodeHolder>>annotationForSelector:ofClass: (in category 'annotation') ----- annotationForSelector: aSelector ofClass: aClass "Provide a line of content for an annotation pane, representing information about the given selector and class" | separator aStream requestList | aSelector == #Comment ifTrue: [^ self annotationForClassCommentFor: aClass]. aSelector == #Definition ifTrue: [^ self annotationForClassDefinitionFor: aClass]. aSelector == #Hierarchy ifTrue: [^ self annotationForHierarchyFor: aClass]. aStream := (String new: 512) writeStream. requestList := self annotationRequests. separator := requestList size > 1 ifTrue: [self annotationSeparator] ifFalse: ['']. requestList + do: [:aRequest | | aString sendersCount aComment aCategory implementorsCount aList stamp authorInitials | - do: [:aRequest | | aString sendersCount aComment aCategory implementorsCount aList stamp | aRequest == #firstComment ifTrue: [aComment := aClass firstCommentAt: aSelector. aComment isEmptyOrNil ifFalse: [aStream nextPutAll: aComment , separator]]. aRequest == #masterComment ifTrue: [aComment := aClass supermostPrecodeCommentFor: aSelector. aComment isEmptyOrNil ifFalse: [aStream nextPutAll: aComment , separator]]. aRequest == #documentation ifTrue: [aComment := aClass precodeCommentOrInheritedCommentFor: aSelector. aComment isEmptyOrNil ifFalse: [aStream nextPutAll: aComment , separator]]. aRequest == #timeStamp ifTrue: [stamp := self timeStamp. aStream nextPutAll: (stamp size > 0 ifTrue: [stamp , separator] ifFalse: ['no timeStamp' , separator])]. + aRequest == #author + ifTrue: [authorInitials := self timeStamp + findTokens ifEmpty: [''] ifNotEmpty: [:tokens | tokens first]. + aStream + nextPutAll: (SystemNavigation authorsInverted + at: authorInitials + ifPresent: [:fullNames | fullNames anyOne] + ifAbsent: ['(unknown author)']), separator]. aRequest == #messageCategory ifTrue: [aCategory := aClass organization categoryOfElement: aSelector. aCategory ifNotNil: ["woud be nil for a method no longer present, e.g. in a recent-submissions browser" aStream nextPutAll: aCategory , separator]]. aRequest == #sendersCount ifTrue: [sendersCount := (self systemNavigation allCallsOn: aSelector) size. sendersCount := sendersCount = 1 ifTrue: ['1 sender'] ifFalse: [sendersCount printString , ' senders']. aStream nextPutAll: sendersCount , separator]. aRequest == #implementorsCount ifTrue: [implementorsCount := self systemNavigation numberOfImplementorsOf: aSelector. implementorsCount := implementorsCount = 1 ifTrue: ['1 implementor'] ifFalse: [implementorsCount printString , ' implementors']. aStream nextPutAll: implementorsCount , separator]. aRequest == #priorVersionsCount ifTrue: [self addPriorVersionsCountForSelector: aSelector ofClass: aClass to: aStream]. aRequest == #priorTimeStamp ifTrue: [stamp := VersionsBrowser timeStampFor: aSelector class: aClass reverseOrdinal: 2. stamp ifNotNil: [aStream nextPutAll: 'prior time stamp: ' , stamp , separator]]. aRequest == #recentChangeSet ifTrue: [aString := ChangesOrganizer mostRecentChangeSetWithChangeForClass: aClass selector: aSelector. aString size > 0 ifTrue: [aStream nextPutAll: aString , separator]]. aRequest == #allChangeSets ifTrue: [aList := ChangesOrganizer allChangeSetsWithClass: aClass selector: aSelector. aList size > 0 ifTrue: [aList size = 1 ifTrue: [aStream nextPutAll: 'only in change set '] ifFalse: [aStream nextPutAll: 'in change sets: ']. aList do: [:aChangeSet | aStream nextPutAll: aChangeSet name , ' ']] ifFalse: [aStream nextPutAll: 'in no change set']. aStream nextPutAll: separator]]. ^ aStream contents! From commits at source.squeak.org Fri Oct 23 09:58:13 2020 From: commits at source.squeak.org (commits at source.squeak.org) Date: Fri, 23 Oct 2020 09:58:13 0000 Subject: [squeak-dev] The Trunk: System-mt.1183.mcz Message-ID: Marcel Taeumel uploaded a new version of System to project The Trunk: http://source.squeak.org/trunk/System-mt.1183.mcz ==================== Summary ==================== Name: System-mt.1183 Author: mt Time: 23 October 2020, 11:58:08.658209 am UUID: 8ce94b0e-ef66-f443-a568-efa0c20a9876 Ancestors: System-mt.1182 Complements Tools-mt.1006 =============== Diff against System-mt.1182 =============== Item was changed: ----- Method: Preferences class>>annotationInfo (in category 'prefs - annotations') ----- annotationInfo "Answer a list of pairs characterizing all the available kinds of annotations; in each pair, the first element is a symbol representing the info type, and the second element is a string providing the corresponding balloon help" ^ #( (timeStamp 'The time stamp of the last submission of the method.') + (author 'The author''s full name if known.') (firstComment 'The first comment in the method, if any.') (masterComment 'The comment at the beginning of the supermost implementor of the method if any.') (documentation 'Comment at beginning of the method or, if it has none, comment at the beginning of a superclass''s implementation of the method') (messageCategory 'Which method category the method lies in') (sendersCount 'A report of how many senders there of the message.') (implementorsCount 'A report of how many implementors there are of the message.') (recentChangeSet 'The most recent change set bearing the method.') (allChangeSets 'A list of all change sets bearing the method.') (priorVersionsCount 'A report of how many previous versions there are of the method' ) (priorTimeStamp 'The time stamp of the penultimate submission of the method, if any'))! Item was changed: ----- Method: Preferences class>>defaultAnnotationInfo (in category 'prefs - annotations') ----- defaultAnnotationInfo + ^ #(timeStamp author messageCategory implementorsCount allChangeSets)! - ^ #(timeStamp messageCategory implementorsCount allChangeSets)! From commits at source.squeak.org Fri Oct 23 09:58:48 2020 From: commits at source.squeak.org (commits at source.squeak.org) Date: Fri, 23 Oct 2020 09:58:48 0000 Subject: [squeak-dev] The Trunk: ReleaseBuilder-mt.213.mcz Message-ID: Marcel Taeumel uploaded a new version of ReleaseBuilder to project The Trunk: http://source.squeak.org/trunk/ReleaseBuilder-mt.213.mcz ==================== Summary ==================== Name: ReleaseBuilder-mt.213 Author: mt Time: 23 October 2020, 11:58:47.490209 am UUID: c085bc06-144c-1a4a-921e-5d248bcdd4c9 Ancestors: ReleaseBuilder-mt.212 Tools-mt.1006 =============== Diff against ReleaseBuilder-mt.212 =============== Item was changed: ----- Method: ReleaseBuilder class>>setPreferences (in category 'scripts') ----- setPreferences "Preferences class defaultValueTableForCurrentRelease" " Preferences outOfTheBox." "<-- uncomment after #defaultValueTableForCurrentRelease is fixed up." "General User interaction" Preferences enable: #generalizedYellowButtonMenu ; enable: #swapMouseButtons; disable: #mouseOverForKeyboardFocus. Morph indicateKeyboardFocus: true. Project uiManager openToolsAttachedToMouseCursor: false. SearchBar useScratchPad: false. HandMorph sendMouseWheelToKeyboardFocus: false. HandMorph synthesizeMouseWheelEvents: true. "Text input." TextEditor autoEnclose: true ; autoIndent: true ; encloseSelection: false ; destructiveBackWord: false ; blinkingCursor: true ; dumbbellCursor: false. PluggableTextMorph simpleFrameAdornments: false. TextMorphForEditView draggableTextSelection: true. "Windows" SystemWindow reuseWindows: false. SystemWindow windowsRaiseOnClick: true. SystemWindow windowTitleActiveOnFirstClick: true. Model windowActiveOnFirstClick: false. "Not good for little screen real estate." Model useColorfulWindows: false. Preferences disable: #fastDragWindowForMorphic. AbstractResizerMorph gripThickness: 4; handleLength: 25. CornerGripMorph drawCornerResizeHandles: false; drawEdgeResizeHandles: false. ProportionalSplitterMorph showSplitterHandles: false; smartHorizontalSplitters: false; smartVerticalSplitters: false. "Scroll bars." Preferences enable: #scrollBarsNarrow; enable: #scrollBarsOnRight; enable: #alwaysHideHScrollbar; disable: #alwaysShowHScrollbar; disable: #alwaysShowVScrollbar. ScrollBar scrollBarsWithoutArrowButtons: true; scrollBarsWithoutMenuButton: true. ScrollPane useRetractableScrollBars: false. "Rounded corners." Morph preferredCornerRadius: 8. SystemWindow roundedWindowCorners: false. DialogWindow roundedDialogCorners: false. MenuMorph roundedMenuCorners: false. PluggableButtonMorph roundedButtonCorners: false. ScrollBar roundedScrollBarLook: false. "Gradients." SystemWindow gradientWindow: false. DialogWindow gradientDialog: false. MenuMorph gradientMenu: false. PluggableButtonMorph gradientButton: false. ScrollBar gradientScrollBar: false. "Shadows" Preferences enable: #menuAppearance3d. Morph useSoftDropShadow: true. "Lists and Trees" PluggableListMorph filterableLists: true; clearFilterAutomatically: false; clearFilterDelay: 500; highlightHoveredRow: true; highlightPreSelection: false; menuRequestUpdatesSelection: true. PluggableTreeMorph filterByLabelsOnly: false; maximumSearchDepth: 1. "Standard Tools" TheWorldMainDockingBar showWorldMainDockingBar: true; showSecondsInClock: true; twentyFourHourClock: true. SearchBar useSmartSearch: true. Workspace shouldStyle: false. TranscriptStream forceUpdate: true; redirectToStdOut: false; characterLimit: 20000. Browser listClassesHierarchically: true; showClassIcons: true; showMessageIcons: true; sortMessageCategoriesAlphabetically: true. MessageSet useUnifiedMessageLabels: true. + Preferences + enable: #annotationPanes; + defaultAnnotationRequests: #(timeStamp author messageCategory implementorsCount allChangeSets); + enable: #optionalButtons; + disable: #diffsWithPrettyPrint; + enable: #traceMessages; + enable: #alternativeBrowseIt; + enable: #menuWithIcons; + enable: #visualExplorer. - Preferences enable: #annotationPanes; - enable: #optionalButtons; - disable: #diffsWithPrettyPrint; - enable: #traceMessages; - enable: #alternativeBrowseIt; - enable: #menuWithIcons; - enable: #visualExplorer. Preferences disable: #debugLogTimestamp. "Halo" Preferences enable: #showBoundsInHalo ; disable: #alternateHandlesLook; disable: #showDirectionHandles. Morph haloForAll: true; metaMenuForAll: true. "System" NetNameResolver enableIPv6: false. Scanner allowUnderscoreAsAssignment: true; prefAllowUnderscoreSelectors: true. Deprecation showDeprecationWarnings: true "that's all, folks"! From commits at source.squeak.org Fri Oct 23 10:09:38 2020 From: commits at source.squeak.org (commits at source.squeak.org) Date: Fri, 23 Oct 2020 10:09:38 0000 Subject: [squeak-dev] The Trunk: System-mt.1184.mcz Message-ID: Marcel Taeumel uploaded a new version of System to project The Trunk: http://source.squeak.org/trunk/System-mt.1184.mcz ==================== Summary ==================== Name: System-mt.1184 Author: mt Time: 23 October 2020, 12:09:33.729209 pm UUID: cf1523df-d3d3-ce4b-bd4e-31d13c084874 Ancestors: System-mt.1183 Fixes inverted author index to be case-sensitive to improve lookup quality for overlaps such as "JM" and "jm". =============== Diff against System-mt.1183 =============== Item was changed: ----- Method: SystemNavigation class>>initializeAuthors (in category 'class initialization') ----- initializeAuthors "self initializeAuthors" | s currentName currentAbbrv | Authors := Dictionary new. s := self privateAuthorsRaw readStream. [s atEnd] whileFalse: [ "Read author name" currentName := String streamContents: [:as | [s peek ~= $#] whileTrue: [as nextPut: s next]]. Authors at: currentName put: Set new. "Read abbreviations" s next. "skip $#" currentAbbrv := ''. [s atEnd not and: [s peek ~= $!!]] whileTrue: [ s peek = $# ifTrue: [ (Authors at: currentName) add: currentAbbrv. currentAbbrv := ''. s next. "skip $#"]. currentAbbrv := currentAbbrv, s next asString. "slow..." ]. currentAbbrv ifNotEmpty: [(Authors at: currentName) add: currentAbbrv]. s next. "skip $!!" ]. "Fill inverted index for authors." AuthorsInverted := Dictionary new. Authors keysAndValuesDo: [:fullName :abbreviations | abbreviations do: [:abbrv | (AuthorsInverted + at: abbrv - at: abbrv asLowercase ifAbsentPut: [Set new]) add: fullName]].! Item was changed: ----- Method: SystemNavigation class>>privateAuthorsRaw (in category 'class initialization') ----- (excessive size, no diff calculated) From commits at source.squeak.org Fri Oct 23 10:10:56 2020 From: commits at source.squeak.org (commits at source.squeak.org) Date: Fri, 23 Oct 2020 10:10:56 0000 Subject: [squeak-dev] The Trunk: Tools-mt.1007.mcz Message-ID: Marcel Taeumel uploaded a new version of Tools to project The Trunk: http://source.squeak.org/trunk/Tools-mt.1007.mcz ==================== Summary ==================== Name: Tools-mt.1007 Author: mt Time: 23 October 2020, 12:10:53.141209 pm UUID: 9ccc180b-1174-b74e-b409-bfe93b29097a Ancestors: Tools-mt.1006 Make format of "unknown author" match "no timestamp". =============== Diff against Tools-mt.1006 =============== Item was changed: ----- Method: CodeHolder>>annotationForSelector:ofClass: (in category 'annotation') ----- annotationForSelector: aSelector ofClass: aClass "Provide a line of content for an annotation pane, representing information about the given selector and class" | separator aStream requestList | aSelector == #Comment ifTrue: [^ self annotationForClassCommentFor: aClass]. aSelector == #Definition ifTrue: [^ self annotationForClassDefinitionFor: aClass]. aSelector == #Hierarchy ifTrue: [^ self annotationForHierarchyFor: aClass]. aStream := (String new: 512) writeStream. requestList := self annotationRequests. separator := requestList size > 1 ifTrue: [self annotationSeparator] ifFalse: ['']. requestList do: [:aRequest | | aString sendersCount aComment aCategory implementorsCount aList stamp authorInitials | aRequest == #firstComment ifTrue: [aComment := aClass firstCommentAt: aSelector. aComment isEmptyOrNil ifFalse: [aStream nextPutAll: aComment , separator]]. aRequest == #masterComment ifTrue: [aComment := aClass supermostPrecodeCommentFor: aSelector. aComment isEmptyOrNil ifFalse: [aStream nextPutAll: aComment , separator]]. aRequest == #documentation ifTrue: [aComment := aClass precodeCommentOrInheritedCommentFor: aSelector. aComment isEmptyOrNil ifFalse: [aStream nextPutAll: aComment , separator]]. aRequest == #timeStamp ifTrue: [stamp := self timeStamp. aStream nextPutAll: (stamp size > 0 ifTrue: [stamp , separator] ifFalse: ['no timeStamp' , separator])]. aRequest == #author ifTrue: [authorInitials := self timeStamp findTokens ifEmpty: [''] ifNotEmpty: [:tokens | tokens first]. aStream nextPutAll: (SystemNavigation authorsInverted at: authorInitials ifPresent: [:fullNames | fullNames anyOne] + ifAbsent: ['unknown author']), separator]. - ifAbsent: ['(unknown author)']), separator]. aRequest == #messageCategory ifTrue: [aCategory := aClass organization categoryOfElement: aSelector. aCategory ifNotNil: ["woud be nil for a method no longer present, e.g. in a recent-submissions browser" aStream nextPutAll: aCategory , separator]]. aRequest == #sendersCount ifTrue: [sendersCount := (self systemNavigation allCallsOn: aSelector) size. sendersCount := sendersCount = 1 ifTrue: ['1 sender'] ifFalse: [sendersCount printString , ' senders']. aStream nextPutAll: sendersCount , separator]. aRequest == #implementorsCount ifTrue: [implementorsCount := self systemNavigation numberOfImplementorsOf: aSelector. implementorsCount := implementorsCount = 1 ifTrue: ['1 implementor'] ifFalse: [implementorsCount printString , ' implementors']. aStream nextPutAll: implementorsCount , separator]. aRequest == #priorVersionsCount ifTrue: [self addPriorVersionsCountForSelector: aSelector ofClass: aClass to: aStream]. aRequest == #priorTimeStamp ifTrue: [stamp := VersionsBrowser timeStampFor: aSelector class: aClass reverseOrdinal: 2. stamp ifNotNil: [aStream nextPutAll: 'prior time stamp: ' , stamp , separator]]. aRequest == #recentChangeSet ifTrue: [aString := ChangesOrganizer mostRecentChangeSetWithChangeForClass: aClass selector: aSelector. aString size > 0 ifTrue: [aStream nextPutAll: aString , separator]]. aRequest == #allChangeSets ifTrue: [aList := ChangesOrganizer allChangeSetsWithClass: aClass selector: aSelector. aList size > 0 ifTrue: [aList size = 1 ifTrue: [aStream nextPutAll: 'only in change set '] ifFalse: [aStream nextPutAll: 'in change sets: ']. aList do: [:aChangeSet | aStream nextPutAll: aChangeSet name , ' ']] ifFalse: [aStream nextPutAll: 'in no change set']. aStream nextPutAll: separator]]. ^ aStream contents! From gettimothy at zoho.com Fri Oct 23 11:10:48 2020 From: gettimothy at zoho.com (gettimothy) Date: Fri, 23 Oct 2020 07:10:48 -0400 Subject: [squeak-dev] Roassal3 tests: (BoxedFloat64 infinity) >= 1 -> false In-Reply-To: References: <17550caf811.11f7fea6b6179.7340930979644316667@zoho.com> Message-ID: <17555276ad3.ebe3bbd44272.6130836788277497306@zoho.com> I will check this first. thx. ---- On Fri, 23 Oct 2020 01:42:52 -0400 Tom Beckmann wrote ---- Hi timothy, here, too, I don't observe any issues. Is it possible that you loaded some Number/Math package from Pharo that could have introduced erroneous overrides? All tests from Roassal3-Animation pass for me, except two that assume that `3 second` returns `0:00:03`, which it does in Pharo, while in Squeak it always returns `0:00:01`. Not sure which behavior I like more (I think I would personally prefer Squeak's behavior, iff it threw an error when I run `3 second` instead of silently discarding the two seconds). Regardless of that we should propose to change it to `#seconds`, as Roassal uses `#seconds` everywhere else in their code when referring to time spans >1 second. Best, Tom On Thu, Oct 22, 2020 at 10:07 PM Vanessa Freudenberg wrote: What does "BoxedFloat64 infinity print? And what VM are you on? 32 or 64 bits? FWIW, it works fine on this VM: Open Smalltalk Cog[Spur] VM [CoInterpreterPrimitives VMMaker.oscog-nice.2715] 64 bit Mac OS X built on Mar  3 2020 08:28:30 GMT Compiler: 4.2.1 Compatible Apple LLVM 8.1.0 (clang-802.0.42) platform sources revision VM: 202003021730 https://github.com/OpenSmalltalk/opensmalltalk-vm.git Date: Mon Mar 2 18:30:55 2020 CommitHash: 6a0bc96 Plugins: 202003021730 https://github.com/OpenSmalltalk/opensmalltalk-vm.git CoInterpreter VMMaker.oscog-nice.2715 uuid: 78e2f556-9829-42fe-963d-e19dfc43c0e9 Mar  3 2020 StackToRegisterMappingCogit VMMaker.oscog-eem.2719 uuid: e40f3e94-3a54-411b-9613-5d19114ea131 Mar  3 2020 - Vanessa - On Thu, Oct 22, 2020 at 7:51 AM gettimothy via Squeak-dev wrote: Hi folks, Version: Squeak6.0alphaUpdate: 20010 Working through the Roassal3 tests   in RSAbstractAnimation>>loops: aNumber self assert: aNumber >= 1 description: 'The number of times to repeat this animation'.    <----test fails here. loops := aNumber aNumber is Infinity (inspecting displays a Boxed Float) Poking around a bit... (BoxedFloat64 infinity) >= 1  -> false then.... (BoxedFloat64 infinity) < 1 ->true Is this expected? If so, suggestions on how  I should I make the test reflect reality? thx in advance. -------------- next part -------------- An HTML attachment was scrubbed... URL: From gettimothy at zoho.com Fri Oct 23 11:14:03 2020 From: gettimothy at zoho.com (gettimothy) Date: Fri, 23 Oct 2020 07:14:03 -0400 Subject: [squeak-dev] nameing of Trunk releases off? Message-ID: <175552a6738.ce2123fc4314.7570141494534041198@zoho.com> Hi Folks, I am downloading the latest trunk image from http://files.squeak.org/trunk/Squeak6.0alpha-20010-64bit/ The "last modified" of the linux .zip (and the trailing portion of the name) reads  Squeak6.0alpha-20010-64bit-202003021730-Linux.zip   2020-10-22 15:24 35.3M File Shouldn't the name of the file reflect the date? cordially, -------------- next part -------------- An HTML attachment was scrubbed... URL: From gettimothy at zoho.com Fri Oct 23 11:27:54 2020 From: gettimothy at zoho.com (gettimothy) Date: Fri, 23 Oct 2020 07:27:54 -0400 Subject: [squeak-dev] Roassal3 tests: (BoxedFloat64 infinity) >= 1 -> false In-Reply-To: References: <17550caf811.11f7fea6b6179.7340930979644316667@zoho.com> Message-ID: <175553713ec.cf7756fe4463.8640737351575188603@zoho.com> Ok, what Tom said must have been the issue. I Downloaded and configured a new linux  image from http://files.squeak.org/trunk/Squeak6.0alpha-20010-64bit/ Name Last Modified Size Type http://files.squeak.org/trunk//   -   Directory http://files.squeak.org/trunk/Squeak6.0alpha-20010-64bit/Squeak6.0alpha-20010-64bit-202003021730-Linux.zip 2020-10-22 15:24 35.3M File http://files.squeak.org/trunk/Squeak6.0alpha-20010-64bit/Squeak6.0alpha-20010-64bit-202003021730-Windows.zip 2020-10-22 15:24 34.1M File http://files.squeak.org/trunk/Squeak6.0alpha-20010-64bit/Squeak6.0alpha-20010-64bit-202003021730-macOS.dmg 2020-10-22 15:24 29.4M File http://files.squeak.org/trunk/Squeak6.0alpha-20010-64bit/Squeak6.0alpha-20010-64bit-All-in-One.zip 2020-10-22 15:24 39.7M File http://files.squeak.org/trunk/Squeak6.0alpha-20010-64bit/Squeak6.0alpha-20010-64bit.zip 2020-10-22 15:24 19.1M File then ran:  BoxedFloat64 infinity Infinity (BoxedFloat64 infinity) >= 1 true (BoxedFloat64 infinity) < 1 false Sorry for the noise. ---- On Thu, 22 Oct 2020 16:06:55 -0400 Vanessa Freudenberg wrote ---- What does "BoxedFloat64 infinity print? And what VM are you on? 32 or 64 bits? FWIW, it works fine on this VM: Open Smalltalk Cog[Spur] VM [CoInterpreterPrimitives VMMaker.oscog-nice.2715] 64 bit Mac OS X built on Mar  3 2020 08:28:30 GMT Compiler: 4.2.1 Compatible Apple LLVM 8.1.0 (clang-802.0.42) platform sources revision VM: 202003021730 https://github.com/OpenSmalltalk/opensmalltalk-vm.git Date: Mon Mar 2 18:30:55 2020 CommitHash: 6a0bc96 Plugins: 202003021730 https://github.com/OpenSmalltalk/opensmalltalk-vm.git CoInterpreter VMMaker.oscog-nice.2715 uuid: 78e2f556-9829-42fe-963d-e19dfc43c0e9 Mar  3 2020 StackToRegisterMappingCogit VMMaker.oscog-eem.2719 uuid: e40f3e94-3a54-411b-9613-5d19114ea131 Mar  3 2020 - Vanessa - On Thu, Oct 22, 2020 at 7:51 AM gettimothy via Squeak-dev wrote: Hi folks, Version: Squeak6.0alphaUpdate: 20010 Working through the Roassal3 tests   in RSAbstractAnimation>>loops: aNumber self assert: aNumber >= 1 description: 'The number of times to repeat this animation'.    <----test fails here. loops := aNumber aNumber is Infinity (inspecting displays a Boxed Float) Poking around a bit... (BoxedFloat64 infinity) >= 1  -> false then.... (BoxedFloat64 infinity) < 1 ->true Is this expected? If so, suggestions on how  I should I make the test reflect reality? thx in advance. -------------- next part -------------- An HTML attachment was scrubbed... URL: From marcel.taeumel at hpi.de Fri Oct 23 11:29:18 2020 From: marcel.taeumel at hpi.de (Marcel Taeumel) Date: Fri, 23 Oct 2020 13:29:18 +0200 Subject: [squeak-dev] nameing of Trunk releases off? In-Reply-To: <175552a6738.ce2123fc4314.7570141494534041198@zoho.com> References: <175552a6738.ce2123fc4314.7570141494534041198@zoho.com> Message-ID: Hi Timothy. >  Shouldn't the name of the file reflect the date? No, that date is from the VM bundled in the archive. Best, Marcel Am 23.10.2020 13:14:13 schrieb gettimothy via Squeak-dev : Hi Folks, I am downloading the latest trunk image from http://files.squeak.org/trunk/Squeak6.0alpha-20010-64bit/ [http://files.squeak.org/trunk/Squeak6.0alpha-20010-64bit/] The "last modified" of the linux .zip (and the trailing portion of the name) reads  Squeak6.0alpha-20010-64bit-202003021730-Linux.zip   2020-10-22 15:24 35.3M File Shouldn't the name of the file reflect the date? cordially, -------------- next part -------------- An HTML attachment was scrubbed... URL: From Christoph.Thiede at student.hpi.uni-potsdam.de Fri Oct 23 12:11:27 2020 From: Christoph.Thiede at student.hpi.uni-potsdam.de (Thiede, Christoph) Date: Fri, 23 Oct 2020 12:11:27 +0000 Subject: [squeak-dev] Changeset: Enhanced integration of drag'n'drop from host Message-ID: Hi all! :-) I'm glad to officially submit my dropFiles changeset today, finally. It enhances the integration of drag'n'drop (DnD) events delivered by the VM from the host operating system to the image, following one of Marcel's ideas: Instead of generating separate DropFilesEvent instances, every DnD event from the VM is translated into a TransferMorph that can be dragged into every morph or tool like every other Morph of TransferMorph, too. [cid:9eca4e4e-37b5-47f0-baa1-8223bba9ae2b] What is the goal of this changeset? This design change entails two key advantages: First, every dragged host element is represented by a first-class object (which is a TransferMorph) instance. Second, as a consequence, applications do no longer need to implement a separate protocol for handling host DnDs (which was #dropFiles:/#wantsDropFiles:) but only need to provide one single proper implementation of #acceptDroppingMorph:event:/#wantsDroppedTransferMorph:. In particular, this also enables developers who use the ToolBuilder(Spec) framework to handle contents dropped from the host system since the old dropFiles protocol was never forwarded to the ToolBuilder framework. How does it work? There have already been complete implementations of the DropPlugin on the VM side for all important platforms (Windows, Linux, and macOS) for a long time (almost 20 years ...) which record four different types of drag events, namely: #dragEnter, #dragMove, #dragLeave, and #dragDrop. However, until now, only the last of them, #dragDrop, has been handled on the image side (see HandMorph >> #generateDropFilesEvent:). The main work of this changeset can be found in just this method where I added support for the other drag types in order to create, move, and release a TransferMorph accordingly. Other changes include: * Deprecated, but kept working the old DropFilesEvent protocol (these events are still processed, but a DeprecationWarning is signaled if any morph actually handles them). * Migrated the only implementation of the old dropFiles protocol, which is PasteUpMorph, to the unified TransferMorph protocol. * Introduced a new event class + protocol for SystemLaunchEvent (aka #launchDrop) which is generated by a singleton VM when it has been invoked with a new image file (see class comment). That #launchDrop is a curious hack on the VM side to reuse the DnD protocol but has completely different semantics that now are separated on the image side. * Implemented the SystemLaunchEvent protocol on PasteUpMorph. Besides the changeset, I have also fixed a few minor inconsistencies with several VM-specific implementations in the OpenSmalltalk-VM repository (see #508, #514, and #518) that have already been merged (thanks to all reviewers!). What's the current state of the changeset? I have successfully tested the changeset on Windows (Win 2004) and Ubuntu/X11. Also, I made sure it works with Squeak.js and TruffleSqueak. However, I do not have any possibility to test it on the OSVM implementations for macOS and iOS, so your help and feedback especially for these platforms will be greatly appreciated! Please see the attached demo video on how to test the changeset: Simply drag some files into an inspector field or a workspace and you should receive a list of FileStreams and/or FileDirectories. Also, aborting a drag operation should not fail, i.e. drag a file over the image but then drop the file in another window. What's next? There is much more potential for a comfortable host DnD integration! Concretely, I am having two downstream goals in mind: First, dropping other content types besides files and/or directories in your image, such as texts or images (currently, the DropPlugin implementations that I could try out are restricted to the former two types). Second, dragging objects out of the VM to save them as a file, or even better, to drop them in a second image! Vanessa has told me that this was even possible in the past for certain platforms, but unfortunately, the relevant code appears to be dead nowadays. Nevertheless, I have stumbled upon a lot of stubs for both features in the DropPlugin and HandMorph code, and I'm looking forward to reviving them in some interesting follow-up projects! Which related contributions/discussions are there else? * System-ct.1156 (Inbox, fixes double prompt for handling a dropped file when the first dialog was canceled; not included in the changeset) * [squeak-dev] Re: Please try out | Inspector Refactoring =) (the thread contains some interesting brainstorming about MIME type support for dragging inside the image) Please test and review! And many thanks to Marcel for his helpful tips! Best, Christoph -------------- next part -------------- An HTML attachment was scrubbed... URL: -------------- next part -------------- A non-text attachment was scrubbed... Name: pastedImage.png Type: image/png Size: 133740 bytes Desc: pastedImage.png URL: -------------- next part -------------- An embedded and charset-unspecified text was scrubbed... Name: dropFiles3.23.cs URL: -------------- next part -------------- A non-text attachment was scrubbed... Name: DnD-demo.gif Type: image/gif Size: 262966 bytes Desc: DnD-demo.gif URL: From gettimothy at zoho.com Fri Oct 23 12:57:03 2020 From: gettimothy at zoho.com (gettimothy) Date: Fri, 23 Oct 2020 08:57:03 -0400 Subject: [squeak-dev] Roassal3 tests: (BoxedFloat64 infinity) >= 1 -> false In-Reply-To: References: <17550caf811.11f7fea6b6179.7340930979644316667@zoho.com> Message-ID: <1755588b1cb.d35e13a15382.5520196583611844963@zoho.com> Hi Tom, The problem has re-introduced itself during the Roassal3 installation process. I will try to isolate the exact point. BoxedFloat64 infinity  Infinity (BoxedFloat64 infinity) >= 1  false (BoxedFloat64 infinity) < 1  true cordially, t ---- On Fri, 23 Oct 2020 01:42:52 -0400 Tom Beckmann wrote ---- Hi timothy, here, too, I don't observe any issues. Is it possible that you loaded some Number/Math package from Pharo that could have introduced erroneous overrides? All tests from Roassal3-Animation pass for me, except two that assume that `3 second` returns `0:00:03`, which it does in Pharo, while in Squeak it always returns `0:00:01`. Not sure which behavior I like more (I think I would personally prefer Squeak's behavior, iff it threw an error when I run `3 second` instead of silently discarding the two seconds). Regardless of that we should propose to change it to `#seconds`, as Roassal uses `#seconds` everywhere else in their code when referring to time spans >1 second. Best, Tom On Thu, Oct 22, 2020 at 10:07 PM Vanessa Freudenberg wrote: What does "BoxedFloat64 infinity print? And what VM are you on? 32 or 64 bits? FWIW, it works fine on this VM: Open Smalltalk Cog[Spur] VM [CoInterpreterPrimitives VMMaker.oscog-nice.2715] 64 bit Mac OS X built on Mar  3 2020 08:28:30 GMT Compiler: 4.2.1 Compatible Apple LLVM 8.1.0 (clang-802.0.42) platform sources revision VM: 202003021730 https://github.com/OpenSmalltalk/opensmalltalk-vm.git Date: Mon Mar 2 18:30:55 2020 CommitHash: 6a0bc96 Plugins: 202003021730 https://github.com/OpenSmalltalk/opensmalltalk-vm.git CoInterpreter VMMaker.oscog-nice.2715 uuid: 78e2f556-9829-42fe-963d-e19dfc43c0e9 Mar  3 2020 StackToRegisterMappingCogit VMMaker.oscog-eem.2719 uuid: e40f3e94-3a54-411b-9613-5d19114ea131 Mar  3 2020 - Vanessa - On Thu, Oct 22, 2020 at 7:51 AM gettimothy via Squeak-dev wrote: Hi folks, Version: Squeak6.0alphaUpdate: 20010 Working through the Roassal3 tests   in RSAbstractAnimation>>loops: aNumber self assert: aNumber >= 1 description: 'The number of times to repeat this animation'.    <----test fails here. loops := aNumber aNumber is Infinity (inspecting displays a Boxed Float) Poking around a bit... (BoxedFloat64 infinity) >= 1  -> false then.... (BoxedFloat64 infinity) < 1 ->true Is this expected? If so, suggestions on how  I should I make the test reflect reality? thx in advance. -------------- next part -------------- An HTML attachment was scrubbed... URL: From gettimothy at zoho.com Fri Oct 23 13:12:32 2020 From: gettimothy at zoho.com (gettimothy) Date: Fri, 23 Oct 2020 09:12:32 -0400 Subject: [squeak-dev] Roassal3 tests: (BoxedFloat64 infinity) >= 1 -> false In-Reply-To: References: <17550caf811.11f7fea6b6179.7340930979644316667@zoho.com> Message-ID: <1755596e1d9.b73a14565576.942335619944858061@zoho.com> Ok, Something seriously weird here. I start with the "prisitine" image where all those tests pass. Well, I just reopened that image and now they fail. I am running from the Squeak-Launcher. I will first investigate the VM, then the Squeak Launcher. It may be a while, I am battling the covid, so I am a bit weak. -------------- next part -------------- An HTML attachment was scrubbed... URL: From gettimothy at zoho.com Fri Oct 23 13:45:45 2020 From: gettimothy at zoho.com (gettimothy) Date: Fri, 23 Oct 2020 09:45:45 -0400 Subject: [squeak-dev] reproduced bug Message-ID: <17555b54a12.c77e45096046.1006022077838634435@zoho.com> Hi folks, start with a pristine image, following pass: BoxedFloat64 infinity (BoxedFloat64 infinity) >= 1 (BoxedFloat64 infinity) < 1  Image ----- /home/wm/Squeak/images/RoassalSqueak6.0alpha-2001022-64bit/RoassalSqueak6.0alpha-2001022-64bit.image Squeak6.0alpha latest update: #20019 Current Change Set: HomeProject Image format 68021 (64 bit) Virtual Machine --------------- /home/wm/Squeak/vms/sqcogspur64linuxht20201018/lib/squeak/5.0-202010180357/squeak Open Smalltalk Cog[Spur] VM [CoInterpreterPrimitives VMMaker.oscog-eem.2847] Unix built on Oct 18 2020 04:01:26 Compiler: 4.2.1 Compatible Clang 7.0.0 (tags/RELEASE_700/final) platform sources revision VM: 202010180357 https://github.com/OpenSmalltalk/opensmalltalk-vm.git Date: Sat Oct 17 20:57:51 2020 CommitHash: 712cfe6 Plugins: 202010180357 https://github.com/OpenSmalltalk/opensmalltalk-vm.git CoInterpreter VMMaker.oscog-eem.2847 uuid: 7737c3b2-b284-4437-8070-d692253551e5 Oct 18 2020 StackToRegisterMappingCogit VMMaker.oscog-eem.2847 uuid: 7737c3b2-b284-4437-8070-d692253551e5 Oct 18 2020 Run the Roassal3 install steps, checking the Infinity tests as I go. pristine image Preference Wizard last page install git, refactor etc. Installer ensureRecentMetacello SquitAddRemote >>remoteName ^ remoteName ifNil: [String empty] ifNotNil: [remoteName asString] Manually unload all three tonel packages using the Monticello Browser MonticelloTonel-Core MonticelloTonel-FileSystem MonticelloTonel-Tests and then running: Metacello new      repository: 'github://squeak-smalltalk/squeak-tonel:squeak';      baseline: 'Tonel';      load. TonelFileUtils TonelFileSystemUtils initialize TonelFileUtils current BoxedFloat64 infinity   Infinity (BoxedFloat64 infinity) >= 1  true (BoxedFloat64 infinity) < 1   false Transcript clear. Metacello new     repository: 'github://tom95/Roassal3';     baseline: 'Roassal3';     load. BoxedFloat64 infinity   Infinity (BoxedFloat64 infinity) >= 1  true (BoxedFloat64 infinity) < 1   false save and quit. re-open image and it errs out. BoxedFloat64 infinity  Infinity (BoxedFloat64 infinity) >= 1  false (BoxedFloat64 infinity) < 1   true Funny, If I do a save-and-quit, then re-run the image, the error sometimes goes away. ok...the Save and Quit toggles the bug. Every other run introduces the error. odd! Next up, I am going to remove the Squeak-Launcher as a possible source of the error. -------------- next part -------------- An HTML attachment was scrubbed... URL: From hannes.hirzel at gmail.com Fri Oct 23 13:47:42 2020 From: hannes.hirzel at gmail.com (H. Hirzel) Date: Fri, 23 Oct 2020 13:47:42 +0000 Subject: [squeak-dev] assert:equals: in Object In-Reply-To: <5687a836624d4cd582b6a2db30e18e12@student.hpi.uni-potsdam.de> References: <1602530868859-0.post@n4.nabble.com> <5687a836624d4cd582b6a2db30e18e12@student.hpi.uni-potsdam.de> Message-ID: Hello On 10/13/20, Thiede, Christoph wrote: >> Then IMO we should follow suit. For once I agree with them ;-) > > Nooo ... :( I don't know their reasons, but inverting a long-existing > convention from one day to another seems like a true nightmare to me. If I understand correctly Pharo has swapped assert:equals: in TestCase to equals:assert: in TestCase Is this so? If yes then the impact for changes is actually quite small for Squeak. It means that in addition to assert: expected equals: actual ^self assert: expected = actual description: [ self comparingStringBetween: expected and: actual ] a method equals: actual assert: expected ^assert: expected equals: actual is also needed in Squeak. > This would invalidate the semantics of every existing test case that was ever > written for Squeak/Smalltalk. Not the semantics which is the about the meaning. It is a minor syntax change (= change of structure/ form): the order of arguments in one or two methods. So one or two methods more in Squeak fixes this. > Plus, IMHO it is often useful to order parameters by their complexity > ascending (e.g., put blocks last) to provide a good writeability/readability > of a message's senders. While the expected argument often is a constant, the > actual argument mainly is the result of a possibly complex operation, e.g.: > > self assert: 42 equals: (myComputer > doComplexComputationWith: 6 > and: 7 > mode: #multiplyInt). > > How would the opposite read like? > > self assert: (myComputer > doComplexComputationWith: 6 > and: 7 > mode: #multiplyInt) equals: 42. > > IMO, much less comprehensible. I agree that the former self assert: 42 equals: (myComputer doComplexComputationWith: 6 and: 7 mode: #multiplyInt). is much more readable. This is what Squeak implements. Best wishes Hannes > Best, > Christoph > > ________________________________ > Von: Squeak-dev im Auftrag > von Eliot Miranda > Gesendet: Dienstag, 13. Oktober 2020 04:02:48 > An: The general-purpose Squeak developers list > Betreff: Re: [squeak-dev] assert:equals: in Object > > > > On Mon, Oct 12, 2020 at 12:27 PM Jakob Reschke > > wrote: > Eliot Miranda-2 wrote >> - appealing to the SUnit community to reverse the order of arguments to >> assert:equals:, plus a rewrite rule that reversed the obvious cases where >> the first argument is a literal constant. > > For what it is worth, Pharo has just swapped the parameters... which makes > all "portable" test cases awkward. > > Then IMO we should follow suit. For once I agree with them ;-) > -- > Sent from: http://forum.world.st/Squeak-Dev-f45488.html > > > > -- > _,,,^..^,,,_ > best, Eliot > From commits at source.squeak.org Fri Oct 23 13:48:03 2020 From: commits at source.squeak.org (commits at source.squeak.org) Date: Fri, 23 Oct 2020 13:48:03 0000 Subject: [squeak-dev] The Trunk: PreferenceBrowser-mt.108.mcz Message-ID: Marcel Taeumel uploaded a new version of PreferenceBrowser to project The Trunk: http://source.squeak.org/trunk/PreferenceBrowser-mt.108.mcz ==================== Summary ==================== Name: PreferenceBrowser-mt.108 Author: mt Time: 23 October 2020, 3:48:02.598318 pm UUID: 990dd13a-f954-bc4c-90cf-6f57db249a7b Ancestors: PreferenceBrowser-mt.107 Make views on text prefs more flexible to support, for example, arrays with literals. =============== Diff against PreferenceBrowser-mt.107 =============== Item was changed: ----- Method: PBTextPreferenceView>>preferenceValue (in category 'user interface') ----- preferenceValue + ^ (self preference preferenceValue ifNil: ['']) asStringOrText! - ^self preference preferenceValue ifNil: ['']! From commits at source.squeak.org Fri Oct 23 13:49:05 2020 From: commits at source.squeak.org (commits at source.squeak.org) Date: Fri, 23 Oct 2020 13:49:05 0000 Subject: [squeak-dev] The Trunk: System-mt.1185.mcz Message-ID: Marcel Taeumel uploaded a new version of System to project The Trunk: http://source.squeak.org/trunk/System-mt.1185.mcz ==================== Summary ==================== Name: System-mt.1185 Author: mt Time: 23 October 2020, 3:49:01.483318 pm UUID: 95150ca0-412a-2847-9579-0bacb8cb0160 Ancestors: System-mt.1184 Promote annotation requests to be a pragma preference. Needs PreferenceBrowser-mt.108. =============== Diff against System-mt.1184 =============== Item was changed: ----- Method: Preferences class>>defaultAnnotationRequests (in category 'prefs - annotations') ----- defaultAnnotationRequests + "Preferences annotationInfo" + + + ^ (Parameters at: #MethodAnnotations ifAbsent: []) + ifNil: [self setDefaultAnnotationInfo] + ! - ^ Parameters at: #MethodAnnotations ifAbsent: - [self setDefaultAnnotationInfo] - "Preferences annotationInfo"! Item was changed: ----- Method: Preferences class>>defaultAnnotationRequests: (in category 'prefs - annotations') ----- + defaultAnnotationRequests: listOrString + + | requests | + requests := listOrString isString + ifTrue: [Compiler evaluate: listOrString] + ifFalse: [listOrString]. + (requests isNil or: [requests allSatisfy: [:request | self annotationInfo anySatisfy: [:info | info first = request]]]) + ifFalse: [self inform: 'Ignored. Please use the following requests:', String cr, String cr, + (self annotationInfo inject: '' into: [:all :spec | all, spec first printString, String tab, spec second, String cr])] + ifTrue: [Parameters at: #MethodAnnotations put: requests]! - defaultAnnotationRequests: newList - ^ Parameters at: #MethodAnnotations put: newList! From eliot.miranda at gmail.com Fri Oct 23 14:15:21 2020 From: eliot.miranda at gmail.com (Eliot Miranda) Date: Fri, 23 Oct 2020 07:15:21 -0700 Subject: [squeak-dev] reproduced bug In-Reply-To: <17555b54a12.c77e45096046.1006022077838634435@zoho.com> References: <17555b54a12.c77e45096046.1006022077838634435@zoho.com> Message-ID: <2B451078-B289-4900-9067-362D57BD5DC6@gmail.com> Hi Timothy, what is the value of { (Float infinity basicAt: 1) hex. (Float infinity basicAt: 2) hex. (BoxedFloat64 infinity basicAt: 1) hex. (BoxedFloat64 infinity basicAt: 2) hex. BoxedFloat64 infinity == Float infinity } before and after the change? _,,,^..^,,,_ (phone) > On Oct 23, 2020, at 6:45 AM, gettimothy via Squeak-dev wrote: > >  > Hi folks, > > > > start with a pristine image, following pass: > > BoxedFloat64 infinity > (BoxedFloat64 infinity) >= 1 > (BoxedFloat64 infinity) < 1 > > Image > ----- > /home/wm/Squeak/images/RoassalSqueak6.0alpha-2001022-64bit/RoassalSqueak6.0alpha-2001022-64bit.image > Squeak6.0alpha > latest update: #20019 > Current Change Set: HomeProject > Image format 68021 (64 bit) > > Virtual Machine > --------------- > /home/wm/Squeak/vms/sqcogspur64linuxht20201018/lib/squeak/5.0-202010180357/squeak > Open Smalltalk Cog[Spur] VM [CoInterpreterPrimitives VMMaker.oscog-eem.2847] > Unix built on Oct 18 2020 04:01:26 Compiler: 4.2.1 Compatible Clang 7.0.0 (tags/RELEASE_700/final) > platform sources revision VM: 202010180357 https://github.com/OpenSmalltalk/opensmalltalk-vm.git Date: Sat Oct 17 20:57:51 2020 CommitHash: 712cfe6 Plugins: 202010180357 https://github.com/OpenSmalltalk/opensmalltalk-vm.git > CoInterpreter VMMaker.oscog-eem.2847 uuid: 7737c3b2-b284-4437-8070-d692253551e5 Oct 18 2020 > StackToRegisterMappingCogit VMMaker.oscog-eem.2847 uuid: 7737c3b2-b284-4437-8070-d692253551e5 Oct 18 2020 > > Run the Roassal3 install steps, checking the Infinity tests as I go. > pristine image > > Preference Wizard last page install git, refactor etc. > > Installer ensureRecentMetacello > > SquitAddRemote >>remoteName > > ^ remoteName ifNil: [String empty] ifNotNil: [remoteName asString] > > Manually unload all three tonel packages using the Monticello Browser > > MonticelloTonel-Core > MonticelloTonel-FileSystem > MonticelloTonel-Tests > > > > and then running: > Metacello new > repository: 'github://squeak-smalltalk/squeak-tonel:squeak'; > baseline: 'Tonel'; > load. > > TonelFileUtils > > TonelFileSystemUtils initialize > TonelFileUtils current > > > BoxedFloat64 infinity Infinity > (BoxedFloat64 infinity) >= 1 true > (BoxedFloat64 infinity) < 1 false > > > Transcript clear. > Metacello new > repository: 'github://tom95/Roassal3'; > baseline: 'Roassal3'; > load. > > BoxedFloat64 infinity Infinity > (BoxedFloat64 infinity) >= 1 true > (BoxedFloat64 infinity) < 1 false > > > save and quit. > > re-open image and it errs out. > BoxedFloat64 infinity Infinity > (BoxedFloat64 infinity) >= 1 false > (BoxedFloat64 infinity) < 1 true > > > > Funny, If I do a save-and-quit, then re-run the image, the error sometimes goes away. > > ok...the Save and Quit toggles the bug. > > Every other run introduces the error. > > > odd! > > > Next up, I am going to remove the Squeak-Launcher as a possible source of the error. > > > > -------------- next part -------------- An HTML attachment was scrubbed... URL: From gettimothy at zoho.com Fri Oct 23 14:23:37 2020 From: gettimothy at zoho.com (gettimothy) Date: Fri, 23 Oct 2020 10:23:37 -0400 Subject: [squeak-dev] Its the heartbeat timer vm to BoxFloat64 infinity and beyond!!!! Message-ID: <17555d7f591.b40683c66544.2535708035693790878@zoho.com> Hi folks, I isolated the bug to the heartbeat timer vm. bash-4.3$ ls Squeak6.0alpha-20010-64bit-202003021730-Linux bin  shared  sqcogspur64linux  sqcogspur64linuxht20201018  squeak.sh I have the above image, stand-alone, out-of-the-box. The bin directory is the vm ships with the zip. it works fine. sqcogspur64linux from trunk, works fine. sqcogspur64linuxht20201018  introduces the bug. to reproduce: ./sqcogspur64linuxht20201018/bin/squeak shared/Squeak6.0alpha-20010-64bit.image In a workspace... BoxedFloat64 infinity    Infinity (BoxedFloat64 infinity) >= 1   true (BoxedFloat64 infinity) < 1    false save and quit, then rerun. ./sqcogspur64linuxht20201018/bin/squeak shared/Squeak6.0alpha-20010-64bit.image BoxedFloat64 infinity     Infinity (BoxedFloat64 infinity) >= 1   false (BoxedFloat64 infinity) < 1    true Best of luck to the VM team on this one! cheers, Buzz Lightyear, Space Ranger. -------------- next part -------------- An HTML attachment was scrubbed... URL: From gettimothy at zoho.com Fri Oct 23 14:27:16 2020 From: gettimothy at zoho.com (gettimothy) Date: Fri, 23 Oct 2020 10:27:16 -0400 Subject: [squeak-dev] reproduced bug In-Reply-To: <2B451078-B289-4900-9067-362D57BD5DC6@gmail.com> References: <17555b54a12.c77e45096046.1006022077838634435@zoho.com> <2B451078-B289-4900-9067-362D57BD5DC6@gmail.com> Message-ID: <17555db4c1d.ff5f00696602.917010827946334033@zoho.com> Hi Eliot. While things are working as expected.... #('16r7FF00000' '16r0' '16r7FF00000' '16r0' true) After the save and quit, then re-run when things are broken... #('16r0' '16r7FF00000' '16r0' '16r7FF00000' true) cheers, ---- On Fri, 23 Oct 2020 10:15:21 -0400 Eliot Miranda wrote ---- Hi Timothy,    what is the value of       { (Float infinity basicAt: 1) hex.         (Float infinity basicAt: 2) hex.         (BoxedFloat64 infinity basicAt: 1) hex.         (BoxedFloat64 infinity basicAt: 2) hex.          BoxedFloat64 infinity == Float infinity } before and after the change?          _,,,^..^,,,_ (phone) On Oct 23, 2020, at 6:45 AM, gettimothy via Squeak-dev wrote: Hi folks, start with a pristine image, following pass: BoxedFloat64 infinity (BoxedFloat64 infinity) >= 1 (BoxedFloat64 infinity) < 1  Image ----- /home/wm/Squeak/images/RoassalSqueak6.0alpha-2001022-64bit/RoassalSqueak6.0alpha-2001022-64bit.image Squeak6.0alpha latest update: #20019 Current Change Set: HomeProject Image format 68021 (64 bit) Virtual Machine --------------- /home/wm/Squeak/vms/sqcogspur64linuxht20201018/lib/squeak/5.0-202010180357/squeak Open Smalltalk Cog[Spur] VM [CoInterpreterPrimitives VMMaker.oscog-eem.2847] Unix built on Oct 18 2020 04:01:26 Compiler: 4.2.1 Compatible Clang 7.0.0 (tags/RELEASE_700/final) platform sources revision VM: 202010180357 https://github.com/OpenSmalltalk/opensmalltalk-vm.git Date: Sat Oct 17 20:57:51 2020 CommitHash: 712cfe6 Plugins: 202010180357 https://github.com/OpenSmalltalk/opensmalltalk-vm.git CoInterpreter VMMaker.oscog-eem.2847 uuid: 7737c3b2-b284-4437-8070-d692253551e5 Oct 18 2020 StackToRegisterMappingCogit VMMaker.oscog-eem.2847 uuid: 7737c3b2-b284-4437-8070-d692253551e5 Oct 18 2020 Run the Roassal3 install steps, checking the Infinity tests as I go. pristine image Preference Wizard last page install git, refactor etc. Installer ensureRecentMetacello SquitAddRemote >>remoteName ^ remoteName ifNil: [String empty] ifNotNil: [remoteName asString] Manually unload all three tonel packages using the Monticello Browser MonticelloTonel-Core MonticelloTonel-FileSystem MonticelloTonel-Tests and then running: Metacello new      repository: 'github://squeak-smalltalk/squeak-tonel:squeak';      baseline: 'Tonel';      load. TonelFileUtils TonelFileSystemUtils initialize TonelFileUtils current BoxedFloat64 infinity   Infinity (BoxedFloat64 infinity) >= 1  true (BoxedFloat64 infinity) < 1   false Transcript clear. Metacello new     repository: 'github://tom95/Roassal3';     baseline: 'Roassal3';     load. BoxedFloat64 infinity   Infinity (BoxedFloat64 infinity) >= 1  true (BoxedFloat64 infinity) < 1   false save and quit. re-open image and it errs out. BoxedFloat64 infinity  Infinity (BoxedFloat64 infinity) >= 1  false (BoxedFloat64 infinity) < 1   true Funny, If I do a save-and-quit, then re-run the image, the error sometimes goes away. ok...the Save and Quit toggles the bug. Every other run introduces the error. odd! Next up, I am going to remove the Squeak-Launcher as a possible source of the error. -------------- next part -------------- An HTML attachment was scrubbed... URL: From cmfcmf.flach at gmail.com Fri Oct 23 16:32:09 2020 From: cmfcmf.flach at gmail.com (Christian Flach) Date: Fri, 23 Oct 2020 18:32:09 +0200 Subject: [squeak-dev] Debugger / Simulator cannot simulate (some) objects as methods In-Reply-To: <2b359e9fe9a047959749d12536459b8c@student.hpi.uni-potsdam.de> References: <1603285765621-0.post@n4.nabble.com> <2b359e9fe9a047959749d12536459b8c@student.hpi.uni-potsdam.de> Message-ID: Hi, Christoph – great to hear that you also ran into this issue and have already proposed a very similar fix (your fix even being a bit more 'correct' than mine, since it avoids sending the class message)! Eliot – thank you for your insights. If I'm not mistaken, your proposed solution would add additional restrictions to objects as methods (OAMs) during simulation and debugging. This is because OAMs are more flexible than CompiledMethods: For example, unlike a CompiledMethod, an OAM does not have a fixed number of arguments it can respond to. Take a look at the following OAM that responds to a message send with the number of arguments sent: run: selector with: arguments in: aReceiver ^ arguments size The proposed wrapper class would not be able to adequately respond to the numArgs message for this OAM. I personally also don't feel like adjusting a single method inside the simulator by adding a check for OAMs would "litter the simulation code". Best, Christian Am Do., 22. Okt. 2020 um 19:28 Uhr schrieb Thiede, Christoph < Christoph.Thiede at student.hpi.uni-potsdam.de>: > Hi Christian, hi all, > > > I already implemented the simulation of objects as methods in Kernel-ct.1339 > (Inbox). It has been working fine for me since February - we only need to > get things like this merged sooner to prevent everyone from reinventing > the wheel. :-) > > > Best, > > Christoph > > ------------------------------ > *Von:* Squeak-dev im > Auftrag von Eliot Miranda > *Gesendet:* Mittwoch, 21. Oktober 2020 16:59:06 > *An:* The general-purpose Squeak developers list > *Betreff:* Re: [squeak-dev] Debugger / Simulator cannot simulate (some) > objects as methods > > Hi, > > > On Oct 21, 2020, at 6:09 AM, cmfcmf wrote: > > > > Hi, > > > > when using simple objects as methods, the simulator (and therefore the > > debugger also) raises an error if the object used as method does not > > implement certain methods from CompiledMethod (e.g., numArgs). If such > code > > is debugged, the debugger opens a never-ending stream of error windows. > > > > I am under the (possibly wrong) assumption that objects as methods should > > _not_ need to implement the complete CompiledMethod protocol to be > > compatible with simulation and debugging. > > Since the only gap that needs filling is from the retrieval of the object > from the method dictionary to the send of run:asMethod:withAruuments: (or > whatever the actual selector is) let me suggest that you create a wrapper > class whose instances hold on to an object to be run as a method and the > selector and argument count and respond to the required CompiledCode > protocol. Then modify the simulator at the point where it gets the result > of the message lookup from the dictionary and wraps the result in one of > these if it is neither CompiledCode (isCompiledCode) not nil. We don’t want > to litter the simulation code with checks and the wrapper approach has the > best chance. > > Of course another test will be needed before a new contest is created, and > maybe one test at the top of the tryPrimitive: method. > > > > > I have attached a failing test called Context2Test that uses the > simulator > > to simulate a call of an object as method. You can also see the > > "never-ending stream of error windows" by placing a "self halt" at the > top > > of the test and then stepping through the first assertion using the > "over" > > button. WARNING: Might make your image unusable. > > > > The root cause is the Context >> #send:to:with:lookupIn: method which > > assumes that all methods are CompiledMethods. I have attached a simple > fix > > that works great for me – let me know what you think about it. > > > > Best > > Christian > > > > Context2Test.st > > Context-sendtowithlookupIn.st > > > > > > > > > > -- > > Sent from: http://forum.world.st/Squeak-Dev-f45488.html > > > > > -------------- next part -------------- An HTML attachment was scrubbed... URL: From tim at rowledge.org Fri Oct 23 16:37:47 2020 From: tim at rowledge.org (tim Rowledge) Date: Fri, 23 Oct 2020 09:37:47 -0700 Subject: [squeak-dev] nameing of Trunk releases off? In-Reply-To: References: <175552a6738.ce2123fc4314.7570141494534041198@zoho.com> Message-ID: <6BBF41B6-A8CA-42A7-A508-BD7F6D743936@rowledge.org> If we're still shipping an early March VM in the 'latest' package then surely the bulid/pacakge setup is broken? > On 2020-10-23, at 4:29 AM, Marcel Taeumel wrote: > > Hi Timothy. > > > Shouldn't the name of the file reflect the date? > > No, that date is from the VM bundled in the archive. > > Best, > Marcel >> Am 23.10.2020 13:14:13 schrieb gettimothy via Squeak-dev : >> >> Hi Folks, >> >> >> I am downloading the latest trunk image from http://files.squeak.org/trunk/Squeak6.0alpha-20010-64bit/ >> >> The "last modified" of the linux .zip (and the trailing portion of the name) reads >> >> >> Squeak6.0alpha-20010-64bit-202003021730-Linux.zip >> >> 2020-10-22 15:24 >> 35.3M >> File >> >> Shouldn't the name of the file reflect the date? >> >> cordially, >> >> >> > tim -- tim Rowledge; tim at rowledge.org; http://www.rowledge.org/tim granary - old folks home From tim at rowledge.org Fri Oct 23 16:40:33 2020 From: tim at rowledge.org (tim Rowledge) Date: Fri, 23 Oct 2020 09:40:33 -0700 Subject: [squeak-dev] Roassal3 tests: (BoxedFloat64 infinity) >= 1 -> false In-Reply-To: <1755596e1d9.b73a14565576.942335619944858061@zoho.com> References: <17550caf811.11f7fea6b6179.7340930979644316667@zoho.com> <1755596e1d9.b73a14565576.942335619944858061@zoho.com> Message-ID: <0708D4B6-9314-401C-9CF0-2A6DEF00DA21@rowledge.org> > On 2020-10-23, at 6:12 AM, gettimothy via Squeak-dev wrote: > > It may be a while, I am battling the covid, so I am a bit weak. Take care and look after your health first! tim -- tim Rowledge; tim at rowledge.org; http://www.rowledge.org/tim Oxymorons: Tight slacks From marcel.taeumel at hpi.de Fri Oct 23 16:52:16 2020 From: marcel.taeumel at hpi.de (Marcel Taeumel) Date: Fri, 23 Oct 2020 18:52:16 +0200 Subject: [squeak-dev] nameing of Trunk releases off? In-Reply-To: <6BBF41B6-A8CA-42A7-A508-BD7F6D743936@rowledge.org> References: <175552a6738.ce2123fc4314.7570141494534041198@zoho.com> <6BBF41B6-A8CA-42A7-A508-BD7F6D743936@rowledge.org> Message-ID: > If we're still shipping an early March VM in the 'latest' package then surely the bulid/pacakge setup is broken? We decided to decouple VM releases from Squeak releases. However, it would be possible to use a somewhat stable, more recent VM just for Trunk builds. See: http://files.squeak.org/base/Squeak-trunk/ http://files.squeak.org/base/Squeak64-trunk/ Best, Marcel Am 23.10.2020 18:38:01 schrieb tim Rowledge : If we're still shipping an early March VM in the 'latest' package then surely the bulid/pacakge setup is broken? > On 2020-10-23, at 4:29 AM, Marcel Taeumel wrote: > > Hi Timothy. > > > Shouldn't the name of the file reflect the date? > > No, that date is from the VM bundled in the archive. > > Best, > Marcel >> Am 23.10.2020 13:14:13 schrieb gettimothy via Squeak-dev : >> >> Hi Folks, >> >> >> I am downloading the latest trunk image from http://files.squeak.org/trunk/Squeak6.0alpha-20010-64bit/ >> >> The "last modified" of the linux .zip (and the trailing portion of the name) reads >> >> >> Squeak6.0alpha-20010-64bit-202003021730-Linux.zip >> >> 2020-10-22 15:24 >> 35.3M >> File >> >> Shouldn't the name of the file reflect the date? >> >> cordially, >> >> >> > tim -- tim Rowledge; tim at rowledge.org; http://www.rowledge.org/tim granary - old folks home -------------- next part -------------- An HTML attachment was scrubbed... URL: From Christoph.Thiede at student.hpi.uni-potsdam.de Fri Oct 23 17:01:56 2020 From: Christoph.Thiede at student.hpi.uni-potsdam.de (Thiede, Christoph) Date: Fri, 23 Oct 2020 17:01:56 +0000 Subject: [squeak-dev] Roassal3 tests: (BoxedFloat64 infinity) >= 1 -> false In-Reply-To: <0708D4B6-9314-401C-9CF0-2A6DEF00DA21@rowledge.org> References: <17550caf811.11f7fea6b6179.7340930979644316667@zoho.com> <1755596e1d9.b73a14565576.942335619944858061@zoho.com>, <0708D4B6-9314-401C-9CF0-2A6DEF00DA21@rowledge.org> Message-ID: <42aa543719e34f168b9e174cf6685d9b@student.hpi.uni-potsdam.de> > On 2020-10-23, at 6:12 AM, gettimothy via Squeak-dev wrote: > > It may be a while, I am battling the covid, so I am a bit weak. Get well soon! Best, Christoph ________________________________ Von: Squeak-dev im Auftrag von tim Rowledge Gesendet: Freitag, 23. Oktober 2020 18:40:33 An: The general-purpose Squeak developers list Betreff: Re: [squeak-dev] Roassal3 tests: (BoxedFloat64 infinity) >= 1 -> false > On 2020-10-23, at 6:12 AM, gettimothy via Squeak-dev wrote: > > It may be a while, I am battling the covid, so I am a bit weak. Take care and look after your health first! tim -- tim Rowledge; tim at rowledge.org; http://www.rowledge.org/tim Oxymorons: Tight slacks -------------- next part -------------- An HTML attachment was scrubbed... URL: From eliot.miranda at gmail.com Fri Oct 23 17:23:31 2020 From: eliot.miranda at gmail.com (Eliot Miranda) Date: Fri, 23 Oct 2020 10:23:31 -0700 Subject: [squeak-dev] Debugger / Simulator cannot simulate (some) objects as methods In-Reply-To: References: Message-ID: <66765144-9F91-4F9F-971D-051F03D00FF0@gmail.com> Hi Christian, > On Oct 23, 2020, at 9:32 AM, Christian Flach wrote: > >  > Hi, > > Christoph – great to hear that you also ran into this issue and have already proposed a very similar fix (your fix even being a bit more 'correct' than mine, since it avoids sending the class message)! > > Eliot – thank you for your insights. If I'm not mistaken, your proposed solution would add additional restrictions to objects as methods (OAMs) during simulation and debugging. This is because OAMs are more flexible than CompiledMethods: For example, unlike a CompiledMethod, an OAM does not have a fixed number of arguments it can respond to. Take a look at the following OAM that responds to a message send with the number of arguments sent: > > run: selector with: arguments in: aReceiver > ^ arguments size > > The proposed wrapper class would not be able to adequately respond to the numArgs message for this OAM. Well a wrapper could have as much stats as one wanted, but ... > > I personally also don't feel like adjusting a single method inside the simulator by adding a check for OAMs would "litter the simulation code". Cool, glad to hear only one method is changed. Can we not move this to trunk? > > Best, > Christian > >> Am Do., 22. Okt. 2020 um 19:28 Uhr schrieb Thiede, Christoph : >> Hi Christian, hi all, >> >> >> >> I already implemented the simulation of objects as methods in Kernel-ct.1339 (Inbox). It has been working fine for me since February - we only need to get things like this merged sooner to prevent everyone from reinventing the wheel. :-) >> >> >> >> Best, >> >> Christoph >> >> Von: Squeak-dev im Auftrag von Eliot Miranda >> Gesendet: Mittwoch, 21. Oktober 2020 16:59:06 >> An: The general-purpose Squeak developers list >> Betreff: Re: [squeak-dev] Debugger / Simulator cannot simulate (some) objects as methods >> >> Hi, >> >> > On Oct 21, 2020, at 6:09 AM, cmfcmf wrote: >> > >> > Hi, >> > >> > when using simple objects as methods, the simulator (and therefore the >> > debugger also) raises an error if the object used as method does not >> > implement certain methods from CompiledMethod (e.g., numArgs). If such code >> > is debugged, the debugger opens a never-ending stream of error windows. >> > >> > I am under the (possibly wrong) assumption that objects as methods should >> > _not_ need to implement the complete CompiledMethod protocol to be >> > compatible with simulation and debugging. >> >> Since the only gap that needs filling is from the retrieval of the object from the method dictionary to the send of run:asMethod:withAruuments: (or whatever the actual selector is) let me suggest that you create a wrapper class whose instances hold on to an object to be run as a method and the selector and argument count and respond to the required CompiledCode protocol. Then modify the simulator at the point where it gets the result of the message lookup from the dictionary and wraps the result in one of these if it is neither CompiledCode (isCompiledCode) not nil. We don’t want to litter the simulation code with checks and the wrapper approach has the best chance. >> >> Of course another test will be needed before a new contest is created, and maybe one test at the top of the tryPrimitive: method. >> >> > >> > I have attached a failing test called Context2Test that uses the simulator >> > to simulate a call of an object as method. You can also see the >> > "never-ending stream of error windows" by placing a "self halt" at the top >> > of the test and then stepping through the first assertion using the "over" >> > button. WARNING: Might make your image unusable. >> > >> > The root cause is the Context >> #send:to:with:lookupIn: method which >> > assumes that all methods are CompiledMethods. I have attached a simple fix >> > that works great for me – let me know what you think about it. >> > >> > Best >> > Christian >> > >> > Context2Test.st >> > Context-sendtowithlookupIn.st >> > >> > >> > >> > >> > -- >> > Sent from: http://forum.world.st/Squeak-Dev-f45488.html >> > >> >> > -------------- next part -------------- An HTML attachment was scrubbed... URL: From commits at source.squeak.org Fri Oct 23 22:12:49 2020 From: commits at source.squeak.org (commits at source.squeak.org) Date: Fri, 23 Oct 2020 22:12:49 0000 Subject: [squeak-dev] The Inbox: Compiler-ct.449.mcz Message-ID: A new version of Compiler was added to project The Inbox: http://source.squeak.org/inbox/Compiler-ct.449.mcz ==================== Summary ==================== Name: Compiler-ct.449 Author: ct Time: 24 October 2020, 12:12:47.879256 am UUID: f4dcd413-ed53-bf47-8762-a0e1c23f7a7f Ancestors: Compiler-tobe.448 Redesigns SyntaxErrorNotification to hold a CompilationCue instead of 'inClass' and 'code', in orderto allow for recompilation of syntax errors where other compilation parameters have been specified, e.g. context or environment. For example, the following syntax error could not be resolved before this patch: Compiler new evaluate: 'aCue yourself:' in: thisContext sender to: thisContext sender receiver. =============== Diff against Compiler-tobe.448 =============== Item was added: + ----- Method: CompilationCue>>source: (in category 'accessing') ----- + source: aString + + source := aString. + sourceStream := source readStream.! Item was changed: ----- Method: Parser>>notify:at: (in category 'error handling') ----- notify: string at: location | messageText | messageText := '"' , string , ' ->"'. cue requestor isNil ifTrue: [ | notification | (encoder == self or: [encoder isNil]) ifTrue: [^ self fail "failure setting up syntax error"]. (notification := SyntaxErrorNotification + cue: (cue copy + source: (source contents asText + copyReplaceFrom: location + to: location - 1 + with: messageText); + yourself) - inClass: encoder classEncoding - withCode: (source contents asText - copyReplaceFrom: location - to: location - 1 - with: messageText) doitFlag: doitFlag errorMessage: string location: location) signal. notification tryNewSourceIfAvailable] ifFalse: [cue requestor notify: messageText at: location in: source]. ^ self fail! Item was changed: Error subclass: #SyntaxErrorNotification + instanceVariableNames: 'cue doitFlag errorMessage location newSource' - instanceVariableNames: 'inClass code doitFlag errorMessage location newSource' classVariableNames: '' poolDictionaries: '' category: 'Compiler-Exceptions'! + !SyntaxErrorNotification commentStamp: 'ct 10/24/2020 00:01' prior: 0! - !SyntaxErrorNotification commentStamp: 'nice 9/18/2013 22:16' prior: 0! A SyntaxErrorNotification is an Exception occuring when compiling a Smalltalk source code with incorrect syntax. Note that in interactive mode, this exception is not raised because the Compiler will interact directly with source code editor. The defaultAction is to raise a SyntaxError pop up window so as to enable interactive handling even in non interactive mode. Instance Variables + cue: - category: - code: doitFlag: errorMessage: - inClass: location: newSource: + cue + - the cue for compilation, including receiver class, optional context, and original source code - category - - the category in which the method will be classified - code - - the source code to be compiled or evaluated - doitFlag - true if this is a doIt (code to evaluate), false if this is a method (code of a method to be compiled) errorMessage - contains information about the syntax error - inClass - - target class in which to compile the method - location - position in the source code where the syntax error occured newSource + - eventually hold a source code replacement typically passed by the SyntaxError window! - - eventually hold a source code replacement typically passed by the SyntaxError window - ! Item was added: + ----- Method: SyntaxErrorNotification class>>cue:doitFlag:errorMessage:location: (in category 'instance creation') ----- + cue: aCue doitFlag: doitFlag errorMessage: errorString location: location + + ^ self new + setCue: aCue + doitFlag: doitFlag + errorMessage: errorString + location: location! Item was changed: + ----- Method: SyntaxErrorNotification class>>inClass:withCode:doitFlag:errorMessage:location: (in category 'instance creation') ----- - ----- Method: SyntaxErrorNotification class>>inClass:withCode:doitFlag:errorMessage:location: (in category 'exceptionInstantiator') ----- inClass: aClass withCode: codeString doitFlag: doitFlag errorMessage: errorString location: location + + self deprecated: 'ct: Use #cue:doitFlag:errorMessage:location:'. + ^ self + cue: (CompilationCue source: codeString class: aClass requestor: nil) - ^self new - setClass: aClass - code: codeString doitFlag: doitFlag errorMessage: errorString location: location! Item was added: + ----- Method: SyntaxErrorNotification>>context (in category 'accessing') ----- + context + + ^ cue context! Item was changed: ----- Method: SyntaxErrorNotification>>errorClass (in category 'accessing') ----- errorClass + + ^ cue getClass! - ^inClass! Item was changed: ----- Method: SyntaxErrorNotification>>errorCode (in category 'accessing') ----- errorCode + + ^ cue source! - ^code! Item was changed: ----- Method: SyntaxErrorNotification>>messageText (in category 'accessing') ----- messageText ^ super messageText + ifEmpty: [messageText := self errorCode]! - ifEmpty: [messageText := code]! Item was changed: ----- Method: SyntaxErrorNotification>>reparse:notifying:ifFail: (in category 'accessing') ----- reparse: aString notifying: aController ifFail: failBlock "Try to parse if aString has correct syntax, but do not evaluate/install any code. In case of incorrect syntax, execute failBlock and let a Compiler interact with the requestor. In case of correct syntax, set newSource." + + (doitFlag ifTrue: [nil class] ifFalse: [self errorClass]) newCompiler + compileCue: (cue copy + source: aString; + requestor: aController; + yourself) + noPattern: doitFlag + ifFail: failBlock. + newSource := aString.! - doitFlag - ifTrue: [nil class newCompiler compileNoPattern: aString in: nil class notifying: aController ifFail: failBlock] - ifFalse: [inClass newCompiler compile: aString in: inClass notifying: aController ifFail: failBlock]. - newSource := aString! Item was removed: - ----- Method: SyntaxErrorNotification>>setClass:code:doitFlag:errorMessage:location: (in category 'accessing') ----- - setClass: aClass code: codeString doitFlag: aBoolean errorMessage: errorString location: anInteger - inClass := aClass. - code := codeString. - doitFlag := aBoolean. - errorMessage := errorString. - location := anInteger! Item was added: + ----- Method: SyntaxErrorNotification>>setCue:doitFlag:errorMessage:location: (in category 'initialize-release') ----- + setCue: aCue doitFlag: aBoolean errorMessage: errorString location: anInteger + + cue := aCue. + doitFlag := aBoolean. + errorMessage := errorString. + location := anInteger! From commits at source.squeak.org Fri Oct 23 22:15:16 2020 From: commits at source.squeak.org (commits at source.squeak.org) Date: Fri, 23 Oct 2020 22:15:16 0000 Subject: [squeak-dev] The Inbox: Tools-ct.1006.mcz Message-ID: A new version of Tools was added to project The Inbox: http://source.squeak.org/inbox/Tools-ct.1006.mcz ==================== Summary ==================== Name: Tools-ct.1006 Author: ct Time: 24 October 2020, 12:15:14.188256 am UUID: f95dd0b3-94e1-2a4c-b66b-1870b1dc549c Ancestors: Tools-eem.1005 Complements Compiler-ct.449 (CompilationCue in SyntaxErrorNotification). Fixes syntax highlighting in SyntaxError window. =============== Diff against Tools-eem.1005 =============== Item was changed: ----- Method: SyntaxError>>aboutToStyle: (in category 'text menu support') ----- aboutToStyle: aStyler aStyler classOrMetaClass: self selectedClassOrMetaClass; + environment: notification environment; + context: notification context; parseAMethod: notification doitFlag not. ^ true! From commits at source.squeak.org Fri Oct 23 22:16:38 2020 From: commits at source.squeak.org (commits at source.squeak.org) Date: Fri, 23 Oct 2020 22:16:38 0000 Subject: [squeak-dev] The Inbox: Compiler-ct.450.mcz Message-ID: A new version of Compiler was added to project The Inbox: http://source.squeak.org/inbox/Compiler-ct.450.mcz ==================== Summary ==================== Name: Compiler-ct.450 Author: ct Time: 24 October 2020, 12:16:36.359256 am UUID: ea5bdd56-7ceb-ae4f-a2d7-1b9d11cda893 Ancestors: Compiler-ct.449 Implements #environment on SyntaxErrorNotification. Sorry I hit the Accept button to soon... =============== Diff against Compiler-ct.449 =============== Item was added: + ----- Method: SyntaxErrorNotification>>environment (in category 'accessing') ----- + environment + + ^ cue environment! From commits at source.squeak.org Fri Oct 23 22:17:48 2020 From: commits at source.squeak.org (commits at source.squeak.org) Date: Fri, 23 Oct 2020 22:17:48 0000 Subject: [squeak-dev] The Inbox: Tests-ct.443.mcz Message-ID: A new version of Tests was added to project The Inbox: http://source.squeak.org/inbox/Tests-ct.443.mcz ==================== Summary ==================== Name: Tests-ct.443 Author: ct Time: 24 October 2020, 12:17:46.734256 am UUID: 24e6ccf0-c6ea-084a-a60a-3aeeb26962a6 Ancestors: Tests-mt.442 Removes unintended mock category from package organization. =============== Diff against Tests-mt.442 =============== Item was changed: SystemOrganization addCategory: #'Tests-Bugs'! SystemOrganization addCategory: #'Tests-Compiler'! SystemOrganization addCategory: #'Tests-Dependencies'! SystemOrganization addCategory: #'Tests-Digital Signatures'! SystemOrganization addCategory: #'Tests-Environments'! SystemOrganization addCategory: #'Tests-Exceptions'! SystemOrganization addCategory: #'Tests-FilePackage'! SystemOrganization addCategory: #'Tests-Files'! SystemOrganization addCategory: #'Tests-Finalization'! SystemOrganization addCategory: #'Tests-Hex'! SystemOrganization addCategory: #'Tests-Installer-Core'! SystemOrganization addCategory: #'Tests-Localization'! SystemOrganization addCategory: #'Tests-Monticello'! SystemOrganization addCategory: #'Tests-Monticello-Mocks'! SystemOrganization addCategory: #'Tests-Monticello-Utils'! SystemOrganization addCategory: #'Tests-Object Events'! SystemOrganization addCategory: #'Tests-ObjectsAsMethods'! SystemOrganization addCategory: #'Tests-PrimCallController'! SystemOrganization addCategory: #'Tests-Release'! SystemOrganization addCategory: #'Tests-System-Applications'! SystemOrganization addCategory: #'Tests-System-Digital Signatures'! SystemOrganization addCategory: #'Tests-System-Object Storage'! SystemOrganization addCategory: #'Tests-System-Preferences'! SystemOrganization addCategory: #'Tests-System-Support'! SystemOrganization addCategory: #'Tests-Utilities'! SystemOrganization addCategory: #'Tests-VM'! - SystemOrganization addCategory: #'Tests-MonticelloMocks'! SystemOrganization addCategory: #'Tests-Sound'! From commits at source.squeak.org Fri Oct 23 22:18:05 2020 From: commits at source.squeak.org (commits at source.squeak.org) Date: Fri, 23 Oct 2020 22:18:05 0000 Subject: [squeak-dev] The Inbox: Kernel-ct.1354.mcz Message-ID: A new version of Kernel was added to project The Inbox: http://source.squeak.org/inbox/Kernel-ct.1354.mcz ==================== Summary ==================== Name: Kernel-ct.1354 Author: ct Time: 24 October 2020, 12:18:01.669256 am UUID: 76d0d109-56f9-a640-b1af-a403809b23a2 Ancestors: Kernel-mt.1353 empty log message =============== Diff against Kernel-mt.1353 =============== From commits at source.squeak.org Fri Oct 23 22:39:15 2020 From: commits at source.squeak.org (commits at source.squeak.org) Date: Fri, 23 Oct 2020 22:39:15 0000 Subject: [squeak-dev] The Inbox: Kernel-ct.1355.mcz Message-ID: A new version of Kernel was added to project The Inbox: http://source.squeak.org/inbox/Kernel-ct.1355.mcz ==================== Summary ==================== Name: Kernel-ct.1355 Author: ct Time: 24 October 2020, 12:39:11.860058 am UUID: 32ca6b45-a632-e743-8a51-10d5d9dee1b3 Ancestors: Kernel-mt.1353 Fixes source logging when fixing a SyntaxError. In the past, the old source was stored in the logs instead of the new one. =============== Diff against Kernel-mt.1353 =============== Item was changed: ----- Method: ClassDescription>>compileCue:classified:withStamp:logSource: (in category 'compiling') ----- compileCue: compilationCue classified: category withStamp: changeStamp logSource: logSource | methodAndNode methodNode selector | methodNode := self newCompiler compile: compilationCue ifFail: [^nil]. methodAndNode := CompiledMethodWithNode generateMethodFromNode: methodNode trailer: (compilationCue methodTrailer ifNil: [self defaultMethodTrailerIfLogSource: logSource]). selector := methodAndNode selector. logSource ifTrue: [self + logMethodSource: methodNode sourceText - logMethodSource: compilationCue source forMethodWithNode: methodAndNode inCategory: category withStamp: changeStamp notifying: compilationCue requestor. RecentMessages default recordSelector: selector forClass: methodAndNode method methodClass inEnvironment: compilationCue environment]. self addAndClassifySelector: selector withMethod: methodAndNode method inProtocol: category notifying: compilationCue requestor. self instanceSide noteCompilationOf: selector meta: self isClassSide. ^selector! From commits at source.squeak.org Fri Oct 23 22:40:42 2020 From: commits at source.squeak.org (commits at source.squeak.org) Date: Fri, 23 Oct 2020 22:40:42 0000 Subject: [squeak-dev] The Inbox: KernelTests-ct.387.mcz Message-ID: A new version of KernelTests was added to project The Inbox: http://source.squeak.org/inbox/KernelTests-ct.387.mcz ==================== Summary ==================== Name: KernelTests-ct.387 Author: ct Time: 24 October 2020, 12:40:40.526058 am UUID: aa73c56f-88e1-3b4d-9d59-fb29df3363a7 Ancestors: KernelTests-ul.386 Adds regression test for Kernel-ct.1355 (source logging after SyntaxError). Should I invest further complexity into this test for the purpose of keeping the production source logs clean? =============== Diff against KernelTests-ul.386 =============== Item was added: + ----- Method: ClassDescriptionTest>>testLogSourceAfterReparseSyntaxError (in category 'testing') ----- + testLogSourceAfterReparseSyntaxError + + | class source | + SystemChangeNotifier uniqueInstance doSilently: [[ + class := Object newSubclass. + source := 'foo [x'. + [class compile: source] + on: SyntaxErrorNotification do: [:error | + error resume: (source := source , ']')]. + self assert: source equals: (class sourceCodeAt: #foo) asString. + ] ensure: [class removeFromSystem]].! Item was changed: + ----- Method: ClassDescriptionTest>>testOrganization (in category 'testing') ----- - ----- Method: ClassDescriptionTest>>testOrganization (in category 'tests') ----- testOrganization | aClassOrganizer | aClassOrganizer := ClassDescription organization. self assert: (aClassOrganizer isKindOf: ClassOrganizer).! From forums.jakob at resfarm.de Sat Oct 24 09:58:53 2020 From: forums.jakob at resfarm.de (Jakob Reschke) Date: Sat, 24 Oct 2020 04:58:53 -0500 (CDT) Subject: [squeak-dev] assert:equals: in Object In-Reply-To: References: <1602530868859-0.post@n4.nabble.com> <5687a836624d4cd582b6a2db30e18e12@student.hpi.uni-potsdam.de> Message-ID: <1603533533213-0.post@n4.nabble.com> Hannes Hirzel wrote > If I understand correctly Pharo has swapped > assert:equals: in TestCase > to > equals:assert: in TestCase > > Is this so? Unfortunately, no. >From Pharo 6.1: TAssertable>>assert: actual equals: expected ^ self assert: expected = actual description: [self comparingStringBetween: actual and: expected] -- Sent from: http://forum.world.st/Squeak-Dev-f45488.html From forums.jakob at resfarm.de Sat Oct 24 10:12:11 2020 From: forums.jakob at resfarm.de (Jakob Reschke) Date: Sat, 24 Oct 2020 05:12:11 -0500 (CDT) Subject: [squeak-dev] The Inbox: KernelTests-ct.387.mcz In-Reply-To: References: Message-ID: <1603534331586-0.post@n4.nabble.com> commits-2 wrote > Should I invest further complexity into this test for the purpose of > keeping the production source logs clean? I think keeping the logs clean is a worthy goal (especially if you have to recover changes after not saving for a while). Does your implementation still log anything? Since the test does not use Monticello I think it should be silent. For extra emphasis you could have used compileSilently: instead of compile:, though I thought muting the SystemChangeNotifier would be sufficient here. I tend to override performTest: to wrap the doSilently: around the test method execution, if most of the tests in the class are exepected to log something. -- Sent from: http://forum.world.st/Squeak-Dev-f45488.html From gettimothy at zoho.com Sat Oct 24 10:31:55 2020 From: gettimothy at zoho.com (gettimothy) Date: Sat, 24 Oct 2020 06:31:55 -0400 Subject: [squeak-dev] Basic Coding question, I do not recall seeing addressed in the literature Message-ID: <1755a2a2df9.fddcd5a516740.8472159683610033956@zoho.com> Hi Folks, Pardon the noobish "eyes of wonder" on the following.  Recently, Eliot asked...    what is the value of       { (Float infinity basicAt: 1) hex.         (Float infinity basicAt: 2) hex.         (BoxedFloat64 infinity basicAt: 1) hex.         (BoxedFloat64 infinity basicAt: 2) hex.          BoxedFloat64 infinity == Float infinity } The result is: #('16r7FF00000' '16r0' '16r7FF00000' '16r0' true) This shows that the stuff in an Array is evaluated BEFORE the array is "produced". This is NOT in the Terse Guide and I do not recall seeing it in the books I read when I first started Squeak. It is a very handy tool. I guess the behavior makes sense, as an Array is not a Block . Also, putting the same stuff in an OrderedCollection gives the same behavior. |x| x := OrderedCollection new. x add:(Float infinity basicAt: 1) hex. x add:(Float infinity basicAt: 2) hex. x add:(BoxedFloat64 infinity basicAt: 1) hex. x add:(BoxedFloat64 infinity basicAt: 2) hex. x add: BoxedFloat64 infinity == Float infinity . x inspect. The construct is very reminiscent of on of the early lessons in the SICP series,  Anyhoo, one more cool thing to add to the toolbox. cheers. -------------- next part -------------- An HTML attachment was scrubbed... URL: From hannes.hirzel at gmail.com Sat Oct 24 11:01:17 2020 From: hannes.hirzel at gmail.com (H. Hirzel) Date: Sat, 24 Oct 2020 11:01:17 +0000 Subject: [squeak-dev] assert:equals: in Object In-Reply-To: References: <79aca96b0f334332a72c84f0db65a307@student.hpi.uni-potsdam.de> Message-ID: On 10/9/20, Tony Garnock-Jones wrote: > Hi Christoph, > > On 10/9/20 4:53 PM, Thiede, Christoph wrote: >>> Anyway, having it by default be the case that Workspaces' >> code environments be TestCases seems very sensible to me. >> >> What do you mean by this? Such a TestCase receiver environment should >> definitively be not the default, this would be very confusing! > > Oh interesting! What kind of confusion do you foresee? I had just > imagined that the only visible-ish change would be availability of > TestCase instance-side methods on the "self" in the Workspace. > >>> "Assertions [...] MUST BE LEFT ACTIVE IN >>> PRODUCTION CODE >> Are we on the same page now? :-) > > Yes, I think we are! :-) Thanks. > > Tony I consider that assertions are useful to have in the production code an an argument in favor of having assert:equals:description: implemented the class Object. A situation where SUnit and all the tests are not necessarily loaded. --Hannes From gettimothy at zoho.com Sat Oct 24 11:20:45 2020 From: gettimothy at zoho.com (gettimothy) Date: Sat, 24 Oct 2020 07:20:45 -0400 Subject: [squeak-dev] RSChartExample new example02ScatterPlot open. Message-ID: <1755a56e5a0.e78889f516944.8102222902668046664@zoho.com> Hi folks, I am going to go through the RSChartExample and see if I can get all the examples to work. To get   RSChartExample new example02ScatterPlot open. to work, I had to implement the pharo method #numberOfMethods. In Pharo, the method is in ClassDescription, so in Squeak, under method category *Roassal3-Squeak I implemented it as: ClassDescription >>numberOfMethods ^self  localSelectors size. and the example opens. Please advise if you see a better way. cordially, -------------- next part -------------- An HTML attachment was scrubbed... URL: From gettimothy at zoho.com Sat Oct 24 12:30:32 2020 From: gettimothy at zoho.com (gettimothy) Date: Sat, 24 Oct 2020 08:30:32 -0400 Subject: [squeak-dev] RSChartExample almost all working. Message-ID: <1755a96c839.c650420817201.1995551507597095633@zoho.com> Hi Folks, I am going through the RSChartExample examples. Most are working. The one below prefaced with an 'x' are not working , those without the 'x' are working... RSChartExample new example01Markers open. RSChartExample new example02ScatterPlot open. RSChartExample new example03Plot open. RSChartExample new example04WithTick open. RSChartExample new example05WithTick open. RSChartExample new example06CustomNumberOfTicks open. RSChartExample new example07AdjustingFontSize open. RSChartExample new example08TwoCharts open. RSChartExample new example09LinearSqrtSymlog open. RSChartExample new example10BarPlot open. RSChartExample new example11BarplotCombinedWithLine open. RSChartExample new example12ScatterPlotAndNormalizer open. xRSChartExample new example13AreaPlot open. xRSChartExample new example14AreaPlotWithError open. xRSChartExample new example15AreaBox open. xRSChartExample new example16Series open. xRSChartExample new example17CLPvsUSD open. xRSChartExample new example18Animation open. The ones with the 'x' are failing on a method I have imported from pharo Collection, Dictionary, SequenceableCollection, SortedCollection need to implement flatCollect: Collection >>flatCollect: aBlock "Evaluate aBlock for each of the receiver's elements and answer the list of all resulting values flatten one level. Assumes that aBlock returns some kind of collection for each element. Equivalent to the lisp's mapcan" "( #((3 4) (1 2)) flatCollect: [:each | each ] )>>> #(3 4 1 2)" "( #(3 4 1 2) flatCollect: [:each | { each } ] ) >>> #(3 4 1 2)" ^ self flatCollect: aBlock as: self species etc... The error I am getting is an 'Attempt to index a non-existent element in an OrderedCollection from the flatCollect in SequenceableCollection...(The breaks and method vars are mine as I attempt to grok this) SequenceableCollection >> flatCollect: aBlock "Evaluate aBlock for each of the receiver's elements and answer the list of all resulting values flatten one level. Assumes that aBlock returns some kind of collection for each element. optimized version for Sequencable Collection and subclasses implementing #writeStream" "(#( (2 -3) (4 -5) #(-6)) flatCollect: [ :e | e abs  ]) >>> #(2 3 4 5 6)" "(#( (2 -3) #((4 -5)) #(-6)) flatCollect: [ :e | e abs  ]) >>> #(2 3 #(4 5) 6)" |x i| self isEmpty ifTrue: [ ^ self copy ]. i := 0. x := self species new: 0 streamContents: [ :stream | self do: [ :each | i := i +1. stream nextPutAll: (aBlock value: each).  <--BARFS HERE self break.  <--NEVER REACHED ]]. ^x. The above fails in SequenceableCollection >> replaceFrom: start to: stop with: replacement startingAt: repStart "This destructively replaces elements from start to stop in the receiver starting at index, repStart, in the sequenceable collection, replacementCollection. Answer the receiver. No range checks are performed." | index repOff | repOff := repStart - start. index := start - 1. [(index := index + 1) <= stop] whileTrue: [self at: index put: (replacement at: repOff + index)]   <- BARF HERE at the at: put: I will be figuring this out next. FWIW, using the Git Browser on the pharo repo...I make the pharo9 "current' and then am able to get GradientPaint and required classes into Squeak.... steps are these:   >From Git Browser.... Switch to Pharo9 branch. src/Athens-Core browse Edition in Selected Version in the browser...Athens-Core-Paints->AthensAbstractPaint load class. same for, GradientPaint  LinearGradientPaint and RadialGradientPaint anyhoo, progress. Also, the Morphic folks, once we get this working, will probably want to poke around to make the BalloonMorphs behave. -------------- next part -------------- An HTML attachment was scrubbed... URL: From gettimothy at zoho.com Sat Oct 24 12:34:11 2020 From: gettimothy at zoho.com (gettimothy) Date: Sat, 24 Oct 2020 08:34:11 -0400 Subject: [squeak-dev] roassal3 at:put "why" Message-ID: <1755a9a1ddd.efa6f0cb17218.5810931663276882365@zoho.com> Hi folks. Here is the "why" of the failure.... OrderedCollection >> at: anInteger put: anObject "Put anObject at element index anInteger. at:put: cannot be used to append, front or back, to an ordered collection; it is used by a knowledgeable client to replace an element." | index | 1 <= anInteger ifFalse: [ self errorNoSuchElement ]. (index := anInteger + firstIndex - 1) <= lastIndex ifFalse: [ self errorNoSuchElement ]. ^array at: index put: anObject At this point, the size of the collection is zero. I will see if I can finagle this at the OC creation... x := self species new: 0 streamContents: [ :stream | self do: [ :each | i := i +1. stream nextPutAll: (aBlock value: each). self break. ]]. That '0' is probably the problem. cheers. -------------- next part -------------- An HTML attachment was scrubbed... URL: From gettimothy at zoho.com Sat Oct 24 13:15:59 2020 From: gettimothy at zoho.com (gettimothy) Date: Sat, 24 Oct 2020 09:15:59 -0400 Subject: [squeak-dev] changesets for previous changes... Message-ID: <1755ac0643c.b874ef5317441.1145783769444430075@zoho.com> Hi folks, attached are the change sets for the flatCollect: and other methods per the recent email. -------------- next part -------------- An HTML attachment was scrubbed... URL: -------------- next part -------------- A non-text attachment was scrubbed... Name: AthensAbstractPaint.tty.1.cs Type: application/octet-stream Size: 700 bytes Desc: not available URL: -------------- next part -------------- A non-text attachment was scrubbed... Name: ClassDescription.tty.1.cs Type: application/octet-stream Size: 226 bytes Desc: not available URL: -------------- next part -------------- A non-text attachment was scrubbed... Name: Collection.tty.1.cs Type: application/octet-stream Size: 1085 bytes Desc: not available URL: -------------- next part -------------- A non-text attachment was scrubbed... Name: Dictionary.tty.1.cs Type: application/octet-stream Size: 576 bytes Desc: not available URL: -------------- next part -------------- A non-text attachment was scrubbed... Name: GradientPaint.tty.1.cs Type: application/octet-stream Size: 2042 bytes Desc: not available URL: -------------- next part -------------- A non-text attachment was scrubbed... Name: LinearGradientPaint.tty.1.cs Type: application/octet-stream Size: 1120 bytes Desc: not available URL: -------------- next part -------------- A non-text attachment was scrubbed... Name: LinearGradientPaint class.tty.1.cs Type: application/octet-stream Size: 255 bytes Desc: not available URL: -------------- next part -------------- A non-text attachment was scrubbed... Name: RadialGradientPaint.tty.1.cs Type: application/octet-stream Size: 1343 bytes Desc: not available URL: -------------- next part -------------- A non-text attachment was scrubbed... Name: SequenceableCollection.tty.1.cs Type: application/octet-stream Size: 801 bytes Desc: not available URL: -------------- next part -------------- A non-text attachment was scrubbed... Name: SortedCollection.tty.1.cs Type: application/octet-stream Size: 469 bytes Desc: not available URL: From hannes.hirzel at gmail.com Sat Oct 24 14:16:28 2020 From: hannes.hirzel at gmail.com (H. Hirzel) Date: Sat, 24 Oct 2020 14:16:28 +0000 Subject: [squeak-dev] RSChartExample almost all working. In-Reply-To: <1755a96c839.c650420817201.1995551507597095633@zoho.com> References: <1755a96c839.c650420817201.1995551507597095633@zoho.com> Message-ID: Hello Regarding the missing Squeak method flatCollect: in Collection, Dictionary, SequenceableCollection, SortedCollection This could be a method to include in Squeak trunk as well. It has been discussed in Pharo in 2009 see mail copied in below with a summary flatCollect: and associated test cases. But it is probably better to copy the code from a current Pharo implementation and adapt it. --Hannes --------------------------------------------- Stéphane Ducasse Sun, Dec 27, 2009 at 4:26 PM Reply-To: Pharo-project at lists.gforge.inria.fr To: "Pharo-project at lists.gforge.inria.fr Development" Reply | Reply to all | Forward | Print | Delete | Show original hi here are the collection extensions we use in Moose. I copied them to PharoTaskForces so that we can discuss and tweak the code if wanted. My favorite is flatCollect:/flatCollectAsSet: groupedBy: There are really useful. Stef testFlatCollectArray "self debug: #testFlatCollectArray" self assert: ((#((1 2) (3 4) (5 3)) flatCollect: [ :each ]) = #(1 2 3 4 5 3)). self assert: ((#((1 2) (2 3) (1 3 4)) flatCollect: [:each]) = #(1 2 2 3 1 3 4)). self assert: ((#((1 2) (2 3) () ()) flatCollect: [:each]) = #(1 2 2 3)). self assert: ((#((1 2) (2 3) (1 3 4)) flatCollect: [:each| Array with: each]) = #(#(1 2) #(2 3) #(1 3 4))). self assert: ((#((1 2) (2 3) (1 3 4)) flatCollect: [:each| Set with: each]) = #(#(1 2) #(2 3) #(1 3 4))). testFlatCollectSet "self debug: #testFlatCollectSet" self assert: ((#((1 2) (1 2) (1 3 4)) asSet flatCollect: [:each]) = #(1 1 2 3 4) asSet). self assert: ((#() asSet flatCollect: [:each]) = #() asSet). self assert: ((#((1 2) () (1 3 4)) asSet flatCollect: [:each]) = #(1 1 2 3 4) asSet). self assert: ((#((1 2) #((99)) (1 3 4)) asSet flatCollect: [:each]) = #(1 1 2 3 4 (99)) asSet). self assert: ((#((1 2) #(()) (1 3 4)) asSet flatCollect: [:each]) = #(1 1 2 3 4 ()) asSet). testCollectAsSet "self debug: #testCollectAsSet" self assert: ((#() collectAsSet: [:each | each odd]) = Set new). self assert: (#(1 2 3 4 5 6) collectAsSet: [:each | each odd]) = (Set with: true with: false). self assert: (#(1 3 5 7 9 11) collectAsSet: [:each | each odd]) = (Set with: true). self assert: (#(1 2 3 4 5 4 3 2 1) collectAsSet: [:each | each]) = (1 to: 5) asSet. testGroupedByArray "self debug: #testGroupedByArray" | res | res := #(1 2 3 4 5) groupedBy: [:each | each odd]. self assert: (res at: true) = #(1 3 5). self assert: (res at: false) = #(2 4) Set>>flatCollect: aBlock ^self flatCollectAsSet: aBlock Symbol>>value "Allow this object to act as a ValueHolder on itself." ^self OrderedCollection>>removeAtIndex: anIndex "Remove the element of the collection at position anIndex. Answer the object removed." | obj | obj := self at: anIndex. self removeIndex: anIndex + firstIndex - 1. ^obj Collection ============================== collectAsSet: aBlock "Evaluates aBlock for each element of the receiver and collects the resulting values into a Set." "This is an efficient shorthand for [ (self collect: aBlock) asSet ]." "originally developed by a. kuhn and released under MIT." ^self inject: Set new into: [ :set :each | set add: (aBlock value: each); yourself ]. copyEmpty: aSize "Answer a copy of the receiver that contains no elements. This method should be redefined in subclasses that add instance variables, so that the state of those variables is preserved" ^self class new: aSize flatCollect: aBlock "Evaluate aBlock for each of the receiver's elements and answer the list of all resulting values flatten one level. Assumes that aBlock returns some kind of collection for each element. Equivalent to the lisp's mapcan" "original written by a. Kuhn and released under MIT" | stream | self isEmpty ifTrue: [ ^ self copy ]. stream := (self species new: 0) nsWriteStream. self do: [ :each | stream nextPutAll: (aBlock value: each) ]. ^ stream contents flatCollectAsSet: aBlock "Evaluate aBlock for each of the receiver's elements and answer the list of all resulting values flatten one level. Assumes that aBlock returns some kind of collection for each element. Equivalent to the lisp's mapcan" "original written by a. Kuhn and released under MIT" | set | self isEmpty ifTrue: [^self copy ]. set := Set new. self do: [ :each | set addAll: (aBlock value: each) ]. ^set flatten "Recursively collect each non-collection element of the receiver and its descendant collections. Please note, this implementation assumes that strings are to be treated as objects rather than as collection." ^self gather: [ :each ] groupedBy: aBlock "Return a dictionary whose keys are the result of evaluating aBlock for all elements in the collection, and the value for each key is the collection of elements that evaluated to that key. e.g. #(1 2 3 4 5) groupedBy: [:each | each odd] a Dictionary true ---> #( 1 3 5) false --> #(2 4) originally developed by a. kuhn and released under MIT." | result | result := Dictionary new. self do: [:each | | key collection | key := aBlock value: each. collection := result at: key ifAbsentPut: [OrderedCollection new]. collection add: each]. self species ~~ OrderedCollection ifTrue: ["Convert the result collections to be the right type. Note that it should be safe to modify the dictionary while iterating because we only replace values for existing keys" result keysAndValuesDo: [:key :value | result at: key put: (self species withAll: value)]]. ^result includesAll: aCollection "Answer true if the receiver includes all elements of aCollection with at least as many occurrences as in aCollection. For a less strict comparison please refer to supersetOf: and its inverse subsetOf:." ^(aCollection isCollection) and: [ aCollection size <= self size and: [ aCollection allSatisfy: [ :each | (aCollection occurrencesOf: each) <= (self occurrencesOf: each) ]]] nilSafeGroupedBy: aBlock ^ self groupedBy: [ :each | | value | value := aBlock value: each. value ifNil: [ UndefinedObject ]. ] selectAsSet: aBlock "Evaluate aBlock with each of the receiver's elements as the argument. Collect into a new set, only those elements for which aBlock evaluates to true. Answer the new collection." | newSet | newSet := Set new. self do: [:each | (aBlock value: each) ifTrue: [newSet add: each]]. ^newSet shuffle "Swaps the receiver's elements at random." self shuffle: (self size * self size log) asInteger sum: aSymbolOrBlock ^self inject: 0 into: [:sum :each | sum + (aSymbolOrBlock value: each)] shuffle: times "Swaps random elements of the receiver." | size random | size := self size. random := Random new. times timesRepeat: [ self swap: (random next * size) floor + 1 with: (random next * size) floor + 1 ]. On 10/24/20, gettimothy via Squeak-dev wrote: > Hi Folks, > > > > I am going through the RSChartExample examples. > > > > Most are working. > > > > The one below prefaced with an 'x' are not working , those without the 'x' > are working... > > > > > > RSChartExample new example01Markers open. > > RSChartExample new example02ScatterPlot open. > > RSChartExample new example03Plot open. > > RSChartExample new example04WithTick open. > > RSChartExample new example05WithTick open. > > RSChartExample new example06CustomNumberOfTicks open. > > RSChartExample new example07AdjustingFontSize open. > > RSChartExample new example08TwoCharts open. > > RSChartExample new example09LinearSqrtSymlog open. > > RSChartExample new example10BarPlot open. > > RSChartExample new example11BarplotCombinedWithLine open. > > RSChartExample new example12ScatterPlotAndNormalizer open. > > xRSChartExample new example13AreaPlot open. > > xRSChartExample new example14AreaPlotWithError open. > > xRSChartExample new example15AreaBox open. > > xRSChartExample new example16Series open. > > xRSChartExample new example17CLPvsUSD open. > > xRSChartExample new example18Animation open. > > > > > > > > The ones with the 'x' are failing on a method I have imported from pharo > > > > Collection, Dictionary, SequenceableCollection, SortedCollection need to > implement flatCollect: > > Collection >>flatCollect: aBlock > > "Evaluate aBlock for each of the receiver's elements and answer the > > list of all resulting values flatten one level. Assumes that aBlock returns > some kind > > of collection for each element. Equivalent to the lisp's mapcan" > > > > "( #((3 4) (1 2)) flatCollect: [:each | each ] )>>> #(3 4 1 2)" > > "( #(3 4 1 2) flatCollect: [:each | { each } ] ) >>> #(3 4 1 2)" > > > > ^ self flatCollect: aBlock as: self species > > > > etc... > > > > The error I am getting is an 'Attempt to index a non-existent element in an > OrderedCollection from the flatCollect in SequenceableCollection...(The > breaks and method vars are mine as I attempt to grok this) > > > > SequenceableCollection >> flatCollect: aBlock > > "Evaluate aBlock for each of the receiver's elements and answer the > > list of all resulting values flatten one level. Assumes that aBlock returns > some kind > > of collection for each element. optimized version for Sequencable Collection > and subclasses > > implementing #writeStream" > > > > "(#( (2 -3) (4 -5) #(-6)) flatCollect: [ :e | e abs  ]) >>> #(2 3 4 5 6)" > > > > "(#( (2 -3) #((4 -5)) #(-6)) flatCollect: [ :e | e abs  ]) >>> #(2 3 #(4 5) > 6)" > > |x i| > > self isEmpty > > ifTrue: [ ^ self copy ]. > > i := 0. > > x := self species > > new: 0 > > streamContents: [ :stream | self do: [ :each | > > i := i +1. > > stream nextPutAll: (aBlock value: each).  <--BARFS HERE > > self break.  <--NEVER REACHED > > ]]. > > > > ^x. > > > > > > > > The above fails in > > > > SequenceableCollection >> replaceFrom: start to: stop with: replacement > startingAt: repStart > > "This destructively replaces elements from start to stop in the receiver > > starting at index, repStart, in the sequenceable collection, > > replacementCollection. Answer the receiver. No range checks are > > performed." > > > > | index repOff | > > repOff := repStart - start. > > index := start - 1. > > [(index := index + 1) <= stop] > > whileTrue: [self at: index put: (replacement at: repOff + index)]   <- BARF > HERE > > > > > > at the at: put: > > > > I will be figuring this out next. > > > > > > FWIW, using the Git Browser on the pharo repo...I make the pharo9 "current' > and then am able to get GradientPaint and required classes into Squeak.... > > > > steps are these: > > > > > > From Git Browser.... > > > > Switch to Pharo9 branch. > > > > src/Athens-Core browse Edition in Selected Version > > in the browser...Athens-Core-Paints->AthensAbstractPaint > > load class. > > same for, GradientPaint  LinearGradientPaint and RadialGradientPaint > > > > anyhoo, progress. > > > > > > Also, the Morphic folks, once we get this working, will probably want to > poke around to make the BalloonMorphs behave. From Das.Linux at gmx.de Sat Oct 24 15:56:24 2020 From: Das.Linux at gmx.de (Tobias Pape) Date: Sat, 24 Oct 2020 17:56:24 +0200 Subject: [squeak-dev] RSChartExample almost all working. In-Reply-To: References: <1755a96c839.c650420817201.1995551507597095633@zoho.com> Message-ID: > On 24.10.2020, at 16:16, H. Hirzel wrote: > > Hello > > Regarding the missing Squeak method flatCollect: in > > Collection, Dictionary, SequenceableCollection, SortedCollection > > This could be a method to include in Squeak trunk as well. It has been > discussed in Pharo in 2009 see mail copied in below with a summary > flatCollect: and associated test cases. #gather: has been around since 2002, why not just use that? #((1 2) (3 4) (5 3)) gather: [:ea | ea] "=> #(1 2 3 4 5 3)" #((1 2) (2 3) () ()) gather: [:ea | ea] "=> #(1 2 2 3)" etc. I really do not like the "flatten" analogy too much. That said, we do have #flatten/#flattened #((1 2) (2 3) () ()) flatten "=> #(1 2 2 3)" This is different in that is has special handling of Strings. Best regards -Tobias > > But it is probably better to copy the code from a current Pharo > implementation and adapt it. > > --Hannes > > --------------------------------------------- > Stéphane Ducasse Sun, Dec 27, 2009 at 4:26 PM > Reply-To: Pharo-project at lists.gforge.inria.fr > To: "Pharo-project at lists.gforge.inria.fr Development" > > Reply | Reply to all | Forward | Print | Delete | Show original > hi > > here are the collection extensions we use in Moose. > I copied them to PharoTaskForces so that we can discuss and tweak the > code if wanted. > > My favorite is > flatCollect:/flatCollectAsSet: > groupedBy: > > There are really useful. > > Stef > > > testFlatCollectArray > "self debug: #testFlatCollectArray" > > self assert: ((#((1 2) (3 4) (5 3)) flatCollect: [ :each ]) = > #(1 2 3 4 5 3)). > self assert: ((#((1 2) (2 3) (1 3 4)) flatCollect: [:each]) = > #(1 2 2 3 1 3 4)). > > self assert: ((#((1 2) (2 3) () ()) flatCollect: [:each]) = #(1 2 2 3)). > > self assert: ((#((1 2) (2 3) (1 3 4)) flatCollect: [:each| > Array with: each]) > = #(#(1 2) #(2 3) #(1 3 4))). > > self assert: ((#((1 2) (2 3) (1 3 4)) flatCollect: [:each| Set > with: each]) > = #(#(1 2) #(2 3) #(1 3 4))). > > > testFlatCollectSet > "self debug: #testFlatCollectSet" > > self assert: ((#((1 2) (1 2) (1 3 4)) asSet flatCollect: > [:each]) = #(1 1 2 3 4) asSet). > self assert: ((#() asSet flatCollect: [:each]) = #() asSet). > > self assert: ((#((1 2) () (1 3 4)) asSet flatCollect: > [:each]) = #(1 1 2 3 4) asSet). > self assert: ((#((1 2) #((99)) (1 3 4)) asSet flatCollect: [:each]) > = #(1 1 2 3 4 (99)) asSet). > self assert: ((#((1 2) #(()) (1 3 4)) asSet flatCollect: [:each]) > = #(1 1 2 3 4 ()) asSet). > > testCollectAsSet > "self debug: #testCollectAsSet" > > self assert: ((#() collectAsSet: [:each | each odd]) = Set new). > self assert: (#(1 2 3 4 5 6) collectAsSet: [:each | each odd]) > = (Set with: true with: false). > self assert: (#(1 3 5 7 9 11) collectAsSet: [:each | each odd]) > = (Set with: true). > > self assert: (#(1 2 3 4 5 4 3 2 1) collectAsSet: [:each | > each]) = (1 to: 5) asSet. > > > testGroupedByArray > "self debug: #testGroupedByArray" > > | res | > res := #(1 2 3 4 5) groupedBy: [:each | each odd]. > self assert: (res at: true) = #(1 3 5). > self assert: (res at: false) = #(2 4) > > > > Set>>flatCollect: aBlock > > > ^self flatCollectAsSet: aBlock > > > Symbol>>value > "Allow this object to act as a ValueHolder on itself." > > ^self > > OrderedCollection>>removeAtIndex: anIndex > "Remove the element of the collection at position anIndex. > Answer the object removed." > > | obj | > obj := self at: anIndex. > self removeIndex: anIndex + firstIndex - 1. > ^obj > > Collection > ============================== > > collectAsSet: aBlock > "Evaluates aBlock for each element of the receiver and collects > the resulting values into a Set." > > "This is an efficient shorthand for [ (self collect: aBlock) asSet ]." > "originally developed by a. kuhn and released under MIT." > > ^self inject: Set new into: [ :set :each | > set add: (aBlock value: each); yourself ]. > > > copyEmpty: aSize > "Answer a copy of the receiver that contains no elements. > > This method should be redefined in subclasses that add > instance variables, so that the state of those variables > is preserved" > > ^self class new: aSize > > > flatCollect: aBlock > "Evaluate aBlock for each of the receiver's elements and answer the > list of all resulting values flatten one level. Assumes that > aBlock returns some kind > of collection for each element. Equivalent to the lisp's mapcan" > "original written by a. Kuhn and released under MIT" > > | stream | > self isEmpty ifTrue: [ ^ self copy ]. > stream := (self species new: 0) nsWriteStream. > self do: [ :each | stream nextPutAll: (aBlock value: each) ]. > ^ stream contents > > flatCollectAsSet: aBlock > "Evaluate aBlock for each of the receiver's elements and answer the > list of all resulting values flatten one level. Assumes that > aBlock returns some kind > of collection for each element. Equivalent to the lisp's mapcan" > > "original written by a. Kuhn and released under MIT" > > | set | > self isEmpty ifTrue: [^self copy ]. > set := Set new. > self do: [ :each | > set addAll: (aBlock value: each) ]. > ^set > > > flatten > "Recursively collect each non-collection element of the > receiver and its descendant > collections. Please note, this implementation assumes that > strings are to be treated > as objects rather than as collection." > > ^self gather: [ :each ] > > groupedBy: aBlock > "Return a dictionary whose keys are the result of evaluating > aBlock for all elements in > the collection, and the value for each key is the collection > of elements that evaluated > to that key. e.g. > #(1 2 3 4 5) groupedBy: [:each | each odd] > a Dictionary > true ---> #( 1 3 5) > false --> #(2 4) > originally developed by a. kuhn and released under MIT." > > | result | > result := Dictionary new. > self do: > [:each | | key collection | > key := aBlock value: each. > collection := result at: key ifAbsentPut: > [OrderedCollection new]. > collection add: each]. > self species ~~ OrderedCollection ifTrue: > ["Convert the result collections to be the right type. > Note that it should be safe to modify the dictionary > while iterating because we only replace values for > existing keys" > result keysAndValuesDo: > [:key :value | result at: key put: (self > species withAll: value)]]. > > ^result > > includesAll: aCollection > "Answer true if the receiver includes all elements of > aCollection with at > least as many occurrences as in aCollection. For a less strict > comparison > please refer to supersetOf: and its inverse subsetOf:." > > > ^(aCollection isCollection) and: [ > aCollection size <= self size and: [ > aCollection allSatisfy: [ :each | > (aCollection occurrencesOf: each) <= > (self occurrencesOf: each) ]]] > > nilSafeGroupedBy: aBlock > ^ self groupedBy: [ :each | > | value | > value := aBlock value: each. > value ifNil: [ UndefinedObject ]. > ] > > selectAsSet: aBlock > "Evaluate aBlock with each of the receiver's elements as the argument. > Collect into a new set, only those elements for which > aBlock evaluates to true. Answer the new collection." > > | newSet | > newSet := Set new. > self do: [:each | (aBlock value: each) ifTrue: [newSet add: each]]. > ^newSet > > shuffle > "Swaps the receiver's elements at random." > > self shuffle: (self size * self size log) asInteger > > sum: aSymbolOrBlock > > ^self > inject: 0 > into: [:sum :each | sum + (aSymbolOrBlock value: each)] > > shuffle: times > "Swaps random elements of the receiver." > > | size random | > size := self size. > random := Random new. > times timesRepeat: [ > self swap: (random next * size) floor + 1 with: > (random next * size) floor + 1 > ]. > > > > > > On 10/24/20, gettimothy via Squeak-dev > wrote: >> Hi Folks, >> >> >> >> I am going through the RSChartExample examples. >> >> >> >> Most are working. >> >> >> >> The one below prefaced with an 'x' are not working , those without the 'x' >> are working... >> >> >> >> >> >> RSChartExample new example01Markers open. >> >> RSChartExample new example02ScatterPlot open. >> >> RSChartExample new example03Plot open. >> >> RSChartExample new example04WithTick open. >> >> RSChartExample new example05WithTick open. >> >> RSChartExample new example06CustomNumberOfTicks open. >> >> RSChartExample new example07AdjustingFontSize open. >> >> RSChartExample new example08TwoCharts open. >> >> RSChartExample new example09LinearSqrtSymlog open. >> >> RSChartExample new example10BarPlot open. >> >> RSChartExample new example11BarplotCombinedWithLine open. >> >> RSChartExample new example12ScatterPlotAndNormalizer open. >> >> xRSChartExample new example13AreaPlot open. >> >> xRSChartExample new example14AreaPlotWithError open. >> >> xRSChartExample new example15AreaBox open. >> >> xRSChartExample new example16Series open. >> >> xRSChartExample new example17CLPvsUSD open. >> >> xRSChartExample new example18Animation open. >> >> >> >> >> >> >> >> The ones with the 'x' are failing on a method I have imported from pharo >> >> >> >> Collection, Dictionary, SequenceableCollection, SortedCollection need to >> implement flatCollect: >> >> Collection >>flatCollect: aBlock >> >> "Evaluate aBlock for each of the receiver's elements and answer the >> >> list of all resulting values flatten one level. Assumes that aBlock returns >> some kind >> >> of collection for each element. Equivalent to the lisp's mapcan" >> >> >> >> "( #((3 4) (1 2)) flatCollect: [:each | each ] )>>> #(3 4 1 2)" >> >> "( #(3 4 1 2) flatCollect: [:each | { each } ] ) >>> #(3 4 1 2)" >> >> >> >> ^ self flatCollect: aBlock as: self species >> >> >> >> etc... >> >> >> >> The error I am getting is an 'Attempt to index a non-existent element in an >> OrderedCollection from the flatCollect in SequenceableCollection...(The >> breaks and method vars are mine as I attempt to grok this) >> >> >> >> SequenceableCollection >> flatCollect: aBlock >> >> "Evaluate aBlock for each of the receiver's elements and answer the >> >> list of all resulting values flatten one level. Assumes that aBlock returns >> some kind >> >> of collection for each element. optimized version for Sequencable Collection >> and subclasses >> >> implementing #writeStream" >> >> >> >> "(#( (2 -3) (4 -5) #(-6)) flatCollect: [ :e | e abs ]) >>> #(2 3 4 5 6)" >> >> >> >> "(#( (2 -3) #((4 -5)) #(-6)) flatCollect: [ :e | e abs ]) >>> #(2 3 #(4 5) >> 6)" >> >> |x i| >> >> self isEmpty >> >> ifTrue: [ ^ self copy ]. >> >> i := 0. >> >> x := self species >> >> new: 0 >> >> streamContents: [ :stream | self do: [ :each | >> >> i := i +1. >> >> stream nextPutAll: (aBlock value: each). <--BARFS HERE >> >> self break. <--NEVER REACHED >> >> ]]. >> >> >> >> ^x. >> >> >> >> >> >> >> >> The above fails in >> >> >> >> SequenceableCollection >> replaceFrom: start to: stop with: replacement >> startingAt: repStart >> >> "This destructively replaces elements from start to stop in the receiver >> >> starting at index, repStart, in the sequenceable collection, >> >> replacementCollection. Answer the receiver. No range checks are >> >> performed." >> >> >> >> | index repOff | >> >> repOff := repStart - start. >> >> index := start - 1. >> >> [(index := index + 1) <= stop] >> >> whileTrue: [self at: index put: (replacement at: repOff + index)] <- BARF >> HERE >> >> >> >> >> >> at the at: put: >> >> >> >> I will be figuring this out next. >> >> >> >> >> >> FWIW, using the Git Browser on the pharo repo...I make the pharo9 "current' >> and then am able to get GradientPaint and required classes into Squeak.... >> >> >> >> steps are these: >> >> >> >> >> >> From Git Browser.... >> >> >> >> Switch to Pharo9 branch. >> >> >> >> src/Athens-Core browse Edition in Selected Version >> >> in the browser...Athens-Core-Paints->AthensAbstractPaint >> >> load class. >> >> same for, GradientPaint LinearGradientPaint and RadialGradientPaint >> >> >> >> anyhoo, progress. >> >> >> >> >> >> Also, the Morphic folks, once we get this working, will probably want to >> poke around to make the BalloonMorphs behave. > From Christoph.Thiede at student.hpi.uni-potsdam.de Sat Oct 24 18:07:20 2020 From: Christoph.Thiede at student.hpi.uni-potsdam.de (Thiede, Christoph) Date: Sat, 24 Oct 2020 18:07:20 +0000 Subject: [squeak-dev] RSChartExample almost all working. In-Reply-To: References: <1755a96c839.c650420817201.1995551507597095633@zoho.com> , Message-ID: <7c6b54310e984a228a36271898bf77d7@student.hpi.uni-potsdam.de> > #gather: has been around since 2002, why not just use that? +1 See also: http://forum.world.st/The-Inbox-Collections-ct-850-mcz-tp5102416p5102476.html Best, Christoph ________________________________ Von: Squeak-dev im Auftrag von Tobias Pape Gesendet: Samstag, 24. Oktober 2020 17:56:24 An: The general-purpose Squeak developers list Cc: Beckmann, Tom Betreff: Re: [squeak-dev] RSChartExample almost all working. > On 24.10.2020, at 16:16, H. Hirzel wrote: > > Hello > > Regarding the missing Squeak method flatCollect: in > > Collection, Dictionary, SequenceableCollection, SortedCollection > > This could be a method to include in Squeak trunk as well. It has been > discussed in Pharo in 2009 see mail copied in below with a summary > flatCollect: and associated test cases. #gather: has been around since 2002, why not just use that? #((1 2) (3 4) (5 3)) gather: [:ea | ea] "=> #(1 2 3 4 5 3)" #((1 2) (2 3) () ()) gather: [:ea | ea] "=> #(1 2 2 3)" etc. I really do not like the "flatten" analogy too much. That said, we do have #flatten/#flattened #((1 2) (2 3) () ()) flatten "=> #(1 2 2 3)" This is different in that is has special handling of Strings. Best regards -Tobias > > But it is probably better to copy the code from a current Pharo > implementation and adapt it. > > --Hannes > > --------------------------------------------- > Stéphane Ducasse Sun, Dec 27, 2009 at 4:26 PM > Reply-To: Pharo-project at lists.gforge.inria.fr > To: "Pharo-project at lists.gforge.inria.fr Development" > > Reply | Reply to all | Forward | Print | Delete | Show original > hi > > here are the collection extensions we use in Moose. > I copied them to PharoTaskForces so that we can discuss and tweak the > code if wanted. > > My favorite is > flatCollect:/flatCollectAsSet: > groupedBy: > > There are really useful. > > Stef > > > testFlatCollectArray > "self debug: #testFlatCollectArray" > > self assert: ((#((1 2) (3 4) (5 3)) flatCollect: [ :each ]) = > #(1 2 3 4 5 3)). > self assert: ((#((1 2) (2 3) (1 3 4)) flatCollect: [:each]) = > #(1 2 2 3 1 3 4)). > > self assert: ((#((1 2) (2 3) () ()) flatCollect: [:each]) = #(1 2 2 3)). > > self assert: ((#((1 2) (2 3) (1 3 4)) flatCollect: [:each| > Array with: each]) > = #(#(1 2) #(2 3) #(1 3 4))). > > self assert: ((#((1 2) (2 3) (1 3 4)) flatCollect: [:each| Set > with: each]) > = #(#(1 2) #(2 3) #(1 3 4))). > > > testFlatCollectSet > "self debug: #testFlatCollectSet" > > self assert: ((#((1 2) (1 2) (1 3 4)) asSet flatCollect: > [:each]) = #(1 1 2 3 4) asSet). > self assert: ((#() asSet flatCollect: [:each]) = #() asSet). > > self assert: ((#((1 2) () (1 3 4)) asSet flatCollect: > [:each]) = #(1 1 2 3 4) asSet). > self assert: ((#((1 2) #((99)) (1 3 4)) asSet flatCollect: [:each]) > = #(1 1 2 3 4 (99)) asSet). > self assert: ((#((1 2) #(()) (1 3 4)) asSet flatCollect: [:each]) > = #(1 1 2 3 4 ()) asSet). > > testCollectAsSet > "self debug: #testCollectAsSet" > > self assert: ((#() collectAsSet: [:each | each odd]) = Set new). > self assert: (#(1 2 3 4 5 6) collectAsSet: [:each | each odd]) > = (Set with: true with: false). > self assert: (#(1 3 5 7 9 11) collectAsSet: [:each | each odd]) > = (Set with: true). > > self assert: (#(1 2 3 4 5 4 3 2 1) collectAsSet: [:each | > each]) = (1 to: 5) asSet. > > > testGroupedByArray > "self debug: #testGroupedByArray" > > | res | > res := #(1 2 3 4 5) groupedBy: [:each | each odd]. > self assert: (res at: true) = #(1 3 5). > self assert: (res at: false) = #(2 4) > > > > Set>>flatCollect: aBlock > > > ^self flatCollectAsSet: aBlock > > > Symbol>>value > "Allow this object to act as a ValueHolder on itself." > > ^self > > OrderedCollection>>removeAtIndex: anIndex > "Remove the element of the collection at position anIndex. > Answer the object removed." > > | obj | > obj := self at: anIndex. > self removeIndex: anIndex + firstIndex - 1. > ^obj > > Collection > ============================== > > collectAsSet: aBlock > "Evaluates aBlock for each element of the receiver and collects > the resulting values into a Set." > > "This is an efficient shorthand for [ (self collect: aBlock) asSet ]." > "originally developed by a. kuhn and released under MIT." > > ^self inject: Set new into: [ :set :each | > set add: (aBlock value: each); yourself ]. > > > copyEmpty: aSize > "Answer a copy of the receiver that contains no elements. > > This method should be redefined in subclasses that add > instance variables, so that the state of those variables > is preserved" > > ^self class new: aSize > > > flatCollect: aBlock > "Evaluate aBlock for each of the receiver's elements and answer the > list of all resulting values flatten one level. Assumes that > aBlock returns some kind > of collection for each element. Equivalent to the lisp's mapcan" > "original written by a. Kuhn and released under MIT" > > | stream | > self isEmpty ifTrue: [ ^ self copy ]. > stream := (self species new: 0) nsWriteStream. > self do: [ :each | stream nextPutAll: (aBlock value: each) ]. > ^ stream contents > > flatCollectAsSet: aBlock > "Evaluate aBlock for each of the receiver's elements and answer the > list of all resulting values flatten one level. Assumes that > aBlock returns some kind > of collection for each element. Equivalent to the lisp's mapcan" > > "original written by a. Kuhn and released under MIT" > > | set | > self isEmpty ifTrue: [^self copy ]. > set := Set new. > self do: [ :each | > set addAll: (aBlock value: each) ]. > ^set > > > flatten > "Recursively collect each non-collection element of the > receiver and its descendant > collections. Please note, this implementation assumes that > strings are to be treated > as objects rather than as collection." > > ^self gather: [ :each ] > > groupedBy: aBlock > "Return a dictionary whose keys are the result of evaluating > aBlock for all elements in > the collection, and the value for each key is the collection > of elements that evaluated > to that key. e.g. > #(1 2 3 4 5) groupedBy: [:each | each odd] > a Dictionary > true ---> #( 1 3 5) > false --> #(2 4) > originally developed by a. kuhn and released under MIT." > > | result | > result := Dictionary new. > self do: > [:each | | key collection | > key := aBlock value: each. > collection := result at: key ifAbsentPut: > [OrderedCollection new]. > collection add: each]. > self species ~~ OrderedCollection ifTrue: > ["Convert the result collections to be the right type. > Note that it should be safe to modify the dictionary > while iterating because we only replace values for > existing keys" > result keysAndValuesDo: > [:key :value | result at: key put: (self > species withAll: value)]]. > > ^result > > includesAll: aCollection > "Answer true if the receiver includes all elements of > aCollection with at > least as many occurrences as in aCollection. For a less strict > comparison > please refer to supersetOf: and its inverse subsetOf:." > > > ^(aCollection isCollection) and: [ > aCollection size <= self size and: [ > aCollection allSatisfy: [ :each | > (aCollection occurrencesOf: each) <= > (self occurrencesOf: each) ]]] > > nilSafeGroupedBy: aBlock > ^ self groupedBy: [ :each | > | value | > value := aBlock value: each. > value ifNil: [ UndefinedObject ]. > ] > > selectAsSet: aBlock > "Evaluate aBlock with each of the receiver's elements as the argument. > Collect into a new set, only those elements for which > aBlock evaluates to true. Answer the new collection." > > | newSet | > newSet := Set new. > self do: [:each | (aBlock value: each) ifTrue: [newSet add: each]]. > ^newSet > > shuffle > "Swaps the receiver's elements at random." > > self shuffle: (self size * self size log) asInteger > > sum: aSymbolOrBlock > > ^self > inject: 0 > into: [:sum :each | sum + (aSymbolOrBlock value: each)] > > shuffle: times > "Swaps random elements of the receiver." > > | size random | > size := self size. > random := Random new. > times timesRepeat: [ > self swap: (random next * size) floor + 1 with: > (random next * size) floor + 1 > ]. > > > > > > On 10/24/20, gettimothy via Squeak-dev > wrote: >> Hi Folks, >> >> >> >> I am going through the RSChartExample examples. >> >> >> >> Most are working. >> >> >> >> The one below prefaced with an 'x' are not working , those without the 'x' >> are working... >> >> >> >> >> >> RSChartExample new example01Markers open. >> >> RSChartExample new example02ScatterPlot open. >> >> RSChartExample new example03Plot open. >> >> RSChartExample new example04WithTick open. >> >> RSChartExample new example05WithTick open. >> >> RSChartExample new example06CustomNumberOfTicks open. >> >> RSChartExample new example07AdjustingFontSize open. >> >> RSChartExample new example08TwoCharts open. >> >> RSChartExample new example09LinearSqrtSymlog open. >> >> RSChartExample new example10BarPlot open. >> >> RSChartExample new example11BarplotCombinedWithLine open. >> >> RSChartExample new example12ScatterPlotAndNormalizer open. >> >> xRSChartExample new example13AreaPlot open. >> >> xRSChartExample new example14AreaPlotWithError open. >> >> xRSChartExample new example15AreaBox open. >> >> xRSChartExample new example16Series open. >> >> xRSChartExample new example17CLPvsUSD open. >> >> xRSChartExample new example18Animation open. >> >> >> >> >> >> >> >> The ones with the 'x' are failing on a method I have imported from pharo >> >> >> >> Collection, Dictionary, SequenceableCollection, SortedCollection need to >> implement flatCollect: >> >> Collection >>flatCollect: aBlock >> >> "Evaluate aBlock for each of the receiver's elements and answer the >> >> list of all resulting values flatten one level. Assumes that aBlock returns >> some kind >> >> of collection for each element. Equivalent to the lisp's mapcan" >> >> >> >> "( #((3 4) (1 2)) flatCollect: [:each | each ] )>>> #(3 4 1 2)" >> >> "( #(3 4 1 2) flatCollect: [:each | { each } ] ) >>> #(3 4 1 2)" >> >> >> >> ^ self flatCollect: aBlock as: self species >> >> >> >> etc... >> >> >> >> The error I am getting is an 'Attempt to index a non-existent element in an >> OrderedCollection from the flatCollect in SequenceableCollection...(The >> breaks and method vars are mine as I attempt to grok this) >> >> >> >> SequenceableCollection >> flatCollect: aBlock >> >> "Evaluate aBlock for each of the receiver's elements and answer the >> >> list of all resulting values flatten one level. Assumes that aBlock returns >> some kind >> >> of collection for each element. optimized version for Sequencable Collection >> and subclasses >> >> implementing #writeStream" >> >> >> >> "(#( (2 -3) (4 -5) #(-6)) flatCollect: [ :e | e abs ]) >>> #(2 3 4 5 6)" >> >> >> >> "(#( (2 -3) #((4 -5)) #(-6)) flatCollect: [ :e | e abs ]) >>> #(2 3 #(4 5) >> 6)" >> >> |x i| >> >> self isEmpty >> >> ifTrue: [ ^ self copy ]. >> >> i := 0. >> >> x := self species >> >> new: 0 >> >> streamContents: [ :stream | self do: [ :each | >> >> i := i +1. >> >> stream nextPutAll: (aBlock value: each). <--BARFS HERE >> >> self break. <--NEVER REACHED >> >> ]]. >> >> >> >> ^x. >> >> >> >> >> >> >> >> The above fails in >> >> >> >> SequenceableCollection >> replaceFrom: start to: stop with: replacement >> startingAt: repStart >> >> "This destructively replaces elements from start to stop in the receiver >> >> starting at index, repStart, in the sequenceable collection, >> >> replacementCollection. Answer the receiver. No range checks are >> >> performed." >> >> >> >> | index repOff | >> >> repOff := repStart - start. >> >> index := start - 1. >> >> [(index := index + 1) <= stop] >> >> whileTrue: [self at: index put: (replacement at: repOff + index)] <- BARF >> HERE >> >> >> >> >> >> at the at: put: >> >> >> >> I will be figuring this out next. >> >> >> >> >> >> FWIW, using the Git Browser on the pharo repo...I make the pharo9 "current' >> and then am able to get GradientPaint and required classes into Squeak.... >> >> >> >> steps are these: >> >> >> >> >> >> From Git Browser.... >> >> >> >> Switch to Pharo9 branch. >> >> >> >> src/Athens-Core browse Edition in Selected Version >> >> in the browser...Athens-Core-Paints->AthensAbstractPaint >> >> load class. >> >> same for, GradientPaint LinearGradientPaint and RadialGradientPaint >> >> >> >> anyhoo, progress. >> >> >> >> >> >> Also, the Morphic folks, once we get this working, will probably want to >> poke around to make the BalloonMorphs behave. > -------------- next part -------------- An HTML attachment was scrubbed... URL: From Christoph.Thiede at student.hpi.uni-potsdam.de Sat Oct 24 18:53:45 2020 From: Christoph.Thiede at student.hpi.uni-potsdam.de (Thiede, Christoph) Date: Sat, 24 Oct 2020 18:53:45 +0000 Subject: [squeak-dev] Debugger / Simulator cannot simulate (some) objects as methods In-Reply-To: References: <1603285765621-0.post@n4.nabble.com>, Message-ID: <2cde22636dda4d89940b1876527a05a2@student.hpi.uni-potsdam.de> Hi Marcel, which bugs are there that are not fixed with Kernel-ct.1339? :-) Best, Christoph ________________________________ Von: Squeak-dev im Auftrag von Taeumel, Marcel Gesendet: Mittwoch, 21. Oktober 2020 15:40:50 An: squeak-dev Betreff: Re: [squeak-dev] Debugger / Simulator cannot simulate (some) objects as methods Hi Christan, the object-as-method support in the debuuger and code simulator has never been good. :-( Not back in Squeak 3.x, not now. Maybe we can fix some of the most urgent bugs. :-) Best, Marcel Am 21.10.2020 15:09:35 schrieb cmfcmf : Hi, when using simple objects as methods, the simulator (and therefore the debugger also) raises an error if the object used as method does not implement certain methods from CompiledMethod (e.g., numArgs). If such code is debugged, the debugger opens a never-ending stream of error windows. I am under the (possibly wrong) assumption that objects as methods should _not_ need to implement the complete CompiledMethod protocol to be compatible with simulation and debugging. I have attached a failing test called Context2Test that uses the simulator to simulate a call of an object as method. You can also see the "never-ending stream of error windows" by placing a "self halt" at the top of the test and then stepping through the first assertion using the "over" button. WARNING: Might make your image unusable. The root cause is the Context >> #send:to:with:lookupIn: method which assumes that all methods are CompiledMethods. I have attached a simple fix that works great for me – let me know what you think about it. Best Christian Context2Test.st Context-sendtowithlookupIn.st -- Sent from: http://forum.world.st/Squeak-Dev-f45488.html -------------- next part -------------- An HTML attachment was scrubbed... URL: From Christoph.Thiede at student.hpi.uni-potsdam.de Sat Oct 24 19:13:31 2020 From: Christoph.Thiede at student.hpi.uni-potsdam.de (Thiede, Christoph) Date: Sat, 24 Oct 2020 19:13:31 +0000 Subject: [squeak-dev] Improving the SystemNavigation browseMessageList... stuff In-Reply-To: <0FA3FBB0-E579-480C-9568-EBAD0C65E057@rowledge.org> References: <6A70A9A6-A1D2-4402-84A5-AD39DB02FD03@rowledge.org> <1603021617930-0.post@n4.nabble.com> , <0FA3FBB0-E579-480C-9568-EBAD0C65E057@rowledge.org> Message-ID: <655d8bdd3c6b47d0b0f2fe57f65b8147@student.hpi.uni-potsdam.de> Hi Tim, some scattered comments on your changes: It's a great idea to refactor this windowTitle stuff! Personally, I think it would look nicer if you could leave out the spaces between the brackets, e.g. "Implementors of initialize [987]" instead of "Implementors of initialize [ 987 ]". Not a regression, but still a bug: Select 42 in some method in a MessageTrace and browse senders -> Error: Instances of SmallInteger are not indexable from #findAgainNow. Is this related to your changes? > Possibly better to do asOrderedCollection sort ? Sounds reasonable. > Now, about that improvement to the Shout stuff... Your ideas sound interesting. We have collected so many ideas on what Shout/attributes could do else (ShoutAttribute, highlight searched text, and here are some other rough ideas: highlight all occurrences of the currently selected word/selector as you may know it from VS Code; automatically style hyperlinks with a TextURL (ask Tom Beckmann for more details on this idea) or class names with a TextLink; a text attribute that adds a tooltip to a certain subtext; allow to browse a word by Ctrl + clicking it, probably again via a text attribute; ...). Maybe we should finally split up the TextAttribute hierarchy into two layers, one low-level layer for emphasis, indent, etc., and one high-level layer for attributes that need to be converted into low-level attributes before display, e.g. StyleAttribute, HighlightAttribute, etc. This conversion could be done by a shout-like mechanism. Yeah, these are indeed rough ideas, just wanted to collect them anywhere. :-) Best, Christoph ________________________________ Von: Squeak-dev im Auftrag von tim Rowledge Gesendet: Montag, 19. Oktober 2020 02:32:39 An: The general-purpose Squeak developers list Betreff: Re: [squeak-dev] Improving the SystemNavigation browseMessageList... stuff OK, review time ! See inbox Tools-tpr.1003 and System-tpr.1181 for some fairly simple changes to how the message list is built (as a set and sorted etc) and improvements to how the window label is derived. The only visible change should be that when the window initially opens the label will reflect the fact that the first item is actually selected - the prior code actually started in a weird state with the label that should be used when nothing is selected. I think it is more correct now but one might argue that nothing should be selected by default for this sort of browser. Now, about that improvement to the Shout stuff... tim -- tim Rowledge; tim at rowledge.org; http://www.rowledge.org/tim Useful random insult:- Wasn't fully debugged before being released. -------------- next part -------------- An HTML attachment was scrubbed... URL: -------------- next part -------------- A non-text attachment was scrubbed... Name: pastedImage.png Type: image/png Size: 8008 bytes Desc: pastedImage.png URL: From Christoph.Thiede at student.hpi.uni-potsdam.de Sat Oct 24 19:24:56 2020 From: Christoph.Thiede at student.hpi.uni-potsdam.de (Thiede, Christoph) Date: Sat, 24 Oct 2020 19:24:56 +0000 Subject: [squeak-dev] Changeset: Eliminating global state from Morphic In-Reply-To: <1602417263970-0.post@n4.nabble.com> References: <20200914154934.GA85344@shell.msen.com> <316eb771b4674076a884bb4caea31175@student.hpi.uni-potsdam.de> <20200930002206.GA34073@shell.msen.com> <4ff55bdbdfa44cc396bcdb61125b8fb9@student.hpi.uni-potsdam.de>, <1602417263970-0.post@n4.nabble.com> Message-ID: <59955fb61b744ae3b7676f8de83774a6@student.hpi.uni-potsdam.de> Hi Marcel, these are reasonable follow-ups, though I think they would be part of another big project, decoupling various packages in Squeak and cleaning up their dependencies. However, your list looks like a good guide for developers that do not know the differences between these variants. Shall we copy your text somewhere into the wiki? Best, Christoph ________________________________ Von: Squeak-dev im Auftrag von Taeumel, Marcel Gesendet: Sonntag, 11. Oktober 2020 13:54:23 An: squeak-dev at lists.squeakfoundation.org Betreff: Re: [squeak-dev] Changeset: Eliminating global state from Morphic Hi Christoph. It's all in Trunk now. ;-) Here are possible next steps: 1. "Project current world" vs. "self currentWorld" In all packages that should not be dependent from Morphic, use "Project current world". Otherwise, use "self currentWorld". 2. "self currentWorld" vs. "self world" In morphs, try to use "self world" whenever possible. Only class-side methods should use "self currentWorld". Well, if you have code that should work with morphs not being installed in any world, use "self currentWorld" because it will fall back to "Project current world". 3. "self currentHand" in non-Morphic packages (ST80, Tools, etc.) Well, there are some cases where the use of "self currentHand" adds a dependency to the Morphic package. Not sure whether we can fix this now or whether we want to extract object-oriented event handling out of Morphic first to be used in other graphics frameworks such as ST80, SqueakShell, etc. :-) Best, Marcel Christoph Thiede wrote > Hi Marcel, > > > thanks for reviewing and splitting up the changes! I confirm that two > members of my image farm survived the recent patches without any problem. > :D > > > Best, > > Christoph > > <http://www.hpi.de/> > ________________________________ > Von: Squeak-dev < > squeak-dev-bounces at .squeakfoundation > > im Auftrag von Taeumel, Marcel > Gesendet: Donnerstag, 8. Oktober 2020 17:20:26 > An: squeak-dev > Betreff: Re: [squeak-dev] Changeset: Eliminating global state from Morphic > > Hi Christoph, hi all! > > The first part of this refactoring is in the Trunk. Please try updating > your images and report back! > http://forum.world.st/The-Trunk-Morphic-mt-1697-mcz-td5123173.html > > If all went well, I will commit the second part, too, which will remove > all remaining references to ActiveWorld etc. > > Best, > Marcel > > Am 30.09.2020 18:22:43 schrieb Thiede, Christoph < > christoph.thiede at .uni-potsdam > >: > > This version includes a test method, #testActiveVariablesObsoletion, that > makes sure that no one will try to reference one of the deprecated > ActiveVariable bindings again in the future. Thanks to Marcel for the tip! > > > Best, > > Christoph > > ________________________________ > Von: Squeak-dev < > squeak-dev-bounces at .squeakfoundation > > im Auftrag von Thiede, Christoph > Gesendet: Mittwoch, 30. September 2020 17:50:43 > An: The general-purpose Squeak developers list > Betreff: Re: [squeak-dev] Changeset: Eliminating global state from Morphic > > > Here is another version of the changeset that does not even longer raise a > debugger when removing the current hand. > > > Best, > > Christoph > > ________________________________ > Von: Squeak-dev < > squeak-dev-bounces at .squeakfoundation > > im Auftrag von Thiede, Christoph > Gesendet: Mittwoch, 30. September 2020 11:40:05 > An: The general-purpose Squeak developers list > Betreff: Re: [squeak-dev] Changeset: Eliminating global state from Morphic > > > Hm, probably we should integrate the "filein without UI updates" option > into the FileList menu, too ...? > > > Best, > > Christoph > > <http://www.hpi.de/> > ________________________________ > Von: Squeak-dev < > squeak-dev-bounces at .squeakfoundation > > im Auftrag von David T. Lewis < > lewis at .msen > > > Gesendet: Mittwoch, 30. September 2020 02:22:06 > An: The general-purpose Squeak developers list > Betreff: Re: [squeak-dev] Changeset: Eliminating global state from Morphic > > On Mon, Sep 28, 2020 at 10:55:45AM +0000, Thiede, Christoph wrote: >> Hi all, >> >> >> Dave, I double-checked it. When loading the second changeset, can you >> confirm that you used the new option in the drop handler dialog? >> >> >> [cid:3848a1c6-d67f-4999-a714-ffafff2b4a22] >> > > No, I did definitely not do that. I opened a FileList and selected the > change sets one at a time, and clicked install for each. Installing the > second change set locked the image. > > After reading your email, I did this: > > 1) Forwarded your email to my > dtlewis290@ > (spam oriented) account > so I could view the graphic attachment, which showed that you are using > drag and drop when you load the change sets. > > 2) Opened a GUI file browser on my Ubuntu laptop, and used drag and drop > to copy the two change sets to my image. > > 3) On dropping the second change set into the image, I selected the > "... without updating UI" option. > > That worked. > > Dave -- Sent from: http://forum.world.st/Squeak-Dev-f45488.html -------------- next part -------------- An HTML attachment was scrubbed... URL: From eliot.miranda at gmail.com Sun Oct 25 00:39:48 2020 From: eliot.miranda at gmail.com (Eliot Miranda) Date: Sat, 24 Oct 2020 17:39:48 -0700 Subject: [squeak-dev] Basic Coding question, I do not recall seeing addressed in the literature In-Reply-To: <1755a2a2df9.fddcd5a516740.8472159683610033956@zoho.com> References: <1755a2a2df9.fddcd5a516740.8472159683610033956@zoho.com> Message-ID: Hi Timothy, On Sat, Oct 24, 2020 at 3:32 AM gettimothy via Squeak-dev < squeak-dev at lists.squeakfoundation.org> wrote: > Hi Folks, > > Pardon the noobish "eyes of wonder" on the following. > > Recently, Eliot asked... > > what is the value of > { (Float infinity basicAt: 1) hex. > (Float infinity basicAt: 2) hex. > (BoxedFloat64 infinity basicAt: 1) hex. > (BoxedFloat64 infinity basicAt: 2) hex. > BoxedFloat64 infinity == Float infinity } > > The result is: > > > #('16r7FF00000' '16r0' '16r7FF00000' '16r0' true) > > This shows that the stuff in an Array is evaluated BEFORE the array is > "produced". > These are called Array Tuples, and Dan Ingalls added them to Squeak many years ago. They are lovely concise forms, way more convenient than Array with: with: with: ... and not limited in size. Since Dan adding them several dialects have followed suit. Alas we've yet to see a new edition of the Blue Book to mention these and other great improvements (e.g. ByteArray literals, Vassili Bykov's ifNil:ifNotNil:, closures) although I do dream of doing a revised blue book with a modern VM specification in the last section. And I'd love to see a Red Book on the Squeak tools. Monticello is, for example, very beautiful, and should be more widely praised, used, and documented. > > This is NOT in the Terse Guide and I do not recall seeing it in the books > I read when I first started Squeak. > It should be :-) > > It is a very handy tool. > > I guess the behavior makes sense, as an Array is not a Block . Also, > putting the same stuff in an OrderedCollection gives the same behavior. > > > |x| > x := OrderedCollection new. > x add:(Float infinity basicAt: 1) hex. > x add:(Float infinity basicAt: 2) hex. > x add:(BoxedFloat64 infinity basicAt: 1) hex. > x add:(BoxedFloat64 infinity basicAt: 2) hex. > x add: BoxedFloat64 infinity == Float infinity . > x inspect. > > > The construct is very reminiscent of on of the early lessons in the SICP > series, > > > Anyhoo, one more cool thing to add to the toolbox. > > cheers. > > > -- _,,,^..^,,,_ best, Eliot -------------- next part -------------- An HTML attachment was scrubbed... URL: From gettimothy at zoho.com Sun Oct 25 09:30:25 2020 From: gettimothy at zoho.com (gettimothy) Date: Sun, 25 Oct 2020 05:30:25 -0400 Subject: [squeak-dev] Basic Coding question, I do not recall seeing addressed in the literature In-Reply-To: References: <1755a2a2df9.fddcd5a516740.8472159683610033956@zoho.com> Message-ID: <1755f183efd.fcb98b0173676.8601855651231182622@zoho.com> Thanks Eliot When Roassal3 side project is done, my attention turns to either porting Pillar, or , more likeky, writing our own markdown parser with XTreams grammar and various actor backends to duplicate the Pillar output (including HelpBrowser, xhtml, latex, morse code...) What I see being different is the source document living entirely within squeak classes, and storeable, distributable via monticello, with git being a secondary source of input to the monticello. Ergo, any squeak user can contribute by editing simple markup, or modifying existing templates. The Array example is in my list of things to cover . So, suppose a couple of booklets exist covering Common Patterns and Idioms, Cool Code Snippets, Arrays, etc... A query to the in image documents for 'Array' will show those titles, edit and save in place, view in place, save via monticello, voila, every image has the documentation. Squeak does not have a documentation problem, it has a documentation aggregation problem. Cheers -------------- next part -------------- An HTML attachment was scrubbed... URL: From gettimothy at zoho.com Sun Oct 25 11:31:09 2020 From: gettimothy at zoho.com (gettimothy) Date: Sun, 25 Oct 2020 07:31:09 -0400 Subject: [squeak-dev] #gather appears to be working....next idiom is groupedBy: In-Reply-To: References: <1755a96c839.c650420817201.1995551507597095633@zoho.com> Message-ID: <1755f86c618.fb58f2e523809.7920694575512771487@zoho.com> First, thank you for the 'gather' tip. It appears to work just fine. Next pharo-ism is something named 'groupedBy:' Collection >> groupedBy: aBlock "Answer a dictionary whose keys are the result of evaluating aBlock for all my elements, and the value for each key is the selection of my elements that evaluated to that key. Uses species. Example of use: (#(1 2 3 4 5) groupedBy: [ :v | v odd ]) asString >>> 'an OrderedDictionary(true->#(1 3 5) false->#(2 4))' " This looks like 'select:' to me. any objections/insight much appreciated. thx -------------- next part -------------- An HTML attachment was scrubbed... URL: From tomjonabc at gmail.com Sun Oct 25 11:39:52 2020 From: tomjonabc at gmail.com (Tom Beckmann) Date: Sun, 25 Oct 2020 12:39:52 +0100 Subject: [squeak-dev] #gather appears to be working....next idiom is groupedBy: In-Reply-To: <1755f86c618.fb58f2e523809.7920694575512771487@zoho.com> References: <1755a96c839.c650420817201.1995551507597095633@zoho.com> <1755f86c618.fb58f2e523809.7920694575512771487@zoho.com> Message-ID: Hi timothy, checkout Squeak's `Collection>>groupBy:`. There are some different semantics though: Pharo's version will preserve the relative order of the groups as they first appear in the collection and also return the same species of Collection nested in the dictionary, while Squeak disregards order of groups and always returns OrderedCollections. Since both the naming (group*ed*By: since it returns a copy) and the properties of the output are more strict in Pharo's version, I would vote to copy the exact code from Pharo's version in the *Roassal-Squeak extension category to not break any assumptions from migrated code. Best, Tom On Sun, Oct 25, 2020 at 12:31 PM gettimothy via Squeak-dev < squeak-dev at lists.squeakfoundation.org> wrote: > First, > > thank you for the 'gather' tip. It appears to work just fine. > > Next pharo-ism is something named 'groupedBy:' > > Collection >> groupedBy: aBlock > "Answer a dictionary whose keys are the result of evaluating aBlock for > all my elements, and the value for each key is the selection of my elements > that evaluated to that key. Uses species. > > Example of use: > (#(1 2 3 4 5) groupedBy: [ :v | v odd ]) asString >>> 'an > OrderedDictionary(true->#(1 3 5) false->#(2 4))' > " > > > > This looks like 'select:' to me. > > > any objections/insight much appreciated. > > thx > > > > -------------- next part -------------- An HTML attachment was scrubbed... URL: From gettimothy at zoho.com Sun Oct 25 13:24:27 2020 From: gettimothy at zoho.com (gettimothy) Date: Sun, 25 Oct 2020 09:24:27 -0400 Subject: [squeak-dev] Roassal3...What is optimal, port Athens? Athens-Cairo? or build out the Roassal3-Squeak RsBalloonFOO heirarchy Message-ID: <1755fee7f36.f5ef702324417.98502659133065400@zoho.com> Hi Tom (and others), >From an earlier email, you remarked that you where able to get an example up and running quickly by ignoring Athens (?) and rolling your own. Is this approach "optimal" ? Here is an example of things we cannot do until dependencies are resolved...heck, at the bottom of this email* is the entire Roassal install "log" that I saved when I installed the package: You must resolve these dependencies before you will be able to load these definitions:   AthensCairoPathBuilder>>arcDegreeStart:sweep:centerX:y:radius:   AthensCairoPathBuilder>>arcRadianStart:sweep:centerX:y:radius:   AthensCairoPathBuilder>>ellipticalArc3:xrot:large:sweep:to:   AthensCairoPathBuilder>>ellipticalArc:xrot:large:sweep:to:   AthensCairoPathBuilder>>ellipticalArc:xrot:large:sweep:to:relative: I can either port the AthensCairoPathBuilder or I can move the functionality to your BalloonPathBuilder. Since I know nothing about either, it will be equally painful to implement either, so the question becomes, which path yeilds the best results going forward? Consider too, that "grok FFI" is on my skillset todo-list and Athens-Cairo looks like it would put a checkmark on that todo-list item. I do not know enough to make an informed decision (I intuitively prefer to get the base right, but as we discovered with the pharo kernel bytes fiasco, that is not always possible) Your thoughts? cheers, tty. *Install log follows: This package depends on the following classes:   AthensCairoPathBuilder You must resolve these dependencies before you will be able to load these definitions:   AthensCairoPathBuilder>>arcDegreeStart:sweep:centerX:y:radius:   AthensCairoPathBuilder>>arcRadianStart:sweep:centerX:y:radius:   AthensCairoPathBuilder>>ellipticalArc3:xrot:large:sweep:to:   AthensCairoPathBuilder>>ellipticalArc:xrot:large:sweep:to:   AthensCairoPathBuilder>>ellipticalArc:xrot:large:sweep:to:relative: This package depends on the following classes:   PackageManifest You must resolve these dependencies before you will be able to load these definitions:   ManifestGeometryTests   ManifestGeometryTests class>>ruleRBStringConcatenationRuleV1FalsePositive This package depends on the following classes:   GradientPaint You must resolve these dependencies before you will be able to load these definitions:   GradientPaint>>interpolateTo:at: This package depends on the following classes:   AthensCairoPathBuilder   AthensCairoSurface   RPackage You must resolve these dependencies before you will be able to load these definitions:   AthensCairoPathBuilder>>arcAround:radius:startAngle:endAngle:   AthensCairoPathBuilder>>arcAround:radius:startAngle:endAngle:cw:   AthensCairoPathBuilder>>arcCos:   AthensCairoPathBuilder>>ellipticalArc2:xrot:large:sweep:to:   AthensCairoSurface>>hasBeenFreed   RPackage>>dependentPackages This package depends on the following classes:   PharoDarkTheme   ClyBrowserToolMorph   UITheme You must resolve these dependencies before you will be able to load these definitions:   PharoDarkTheme>>classBoxBackgroundColor   RSUMLCalypso   RSUMLCalypso>>activationPriority   RSUMLCalypso>>applyTheme:   RSUMLCalypso>>build   RSUMLCalypso>>classes   RSUMLCalypso>>defaultIconName   RSUMLCalypso>>limitedClasses:   RSUMLCalypso>>tabOrder   RSUMLClassCalypso   RSUMLClassCalypso class>>classUmlTapActivation   RSUMLClassCalypso>>classes   RSUMLClassCalypso>>defaultTitle   RSUMLClassCalypso>>isSimilarTo:   RSUMLClassCalypso>>setUpModelFromContext   RSUMLClassCalypso>>targetClass   RSUMLPackageCalypso   RSUMLPackageCalypso class>>classUmlTapActivation   RSUMLPackageCalypso>>classes   RSUMLPackageCalypso>>defaultIconName   RSUMLPackageCalypso>>defaultTitle   RSUMLPackageCalypso>>isSimilarTo:   RSUMLPackageCalypso>>packages   RSUMLPackageCalypso>>setUpModelFromContext   UITheme>>classBoxBackgroundColor   UITheme>>methodsLimitUML This package depends on the following classes:   GLMMorphicWidgetRenderer   GLMPresentation   GLMMorphicRenderer You must resolve these dependencies before you will be able to load these definitions:   GLMMorphicRenderer>>renderRoassal3Presentation:   GLMMorphicRoassal3Renderer   GLMMorphicRoassal3Renderer>>render:   GLMPresentation>>roassal3   GLMRoassal3Presentation   GLMRoassal3Presentation>>canvas   GLMRoassal3Presentation>>initialize   GLMRoassal3Presentation>>initializeCanvas:   GLMRoassal3Presentation>>renderGlamorouslyOn:   GLMRoassal3Presentation>>setUpInteractions This package depends on the following classes:   RPackage You must resolve these dependencies before you will be able to load these definitions:   RPackage>>dependentPackagesWithOccurences   RPackage>>numberOfDependenciesToward: This package depends on the following classes:   ParametrizedTestCase You must resolve these dependencies before you will be able to load these definitions:   RSPAnimationTest   RSPAnimationTest class>>testParameters   RSPAnimationTest>>animationClass   RSPAnimationTest>>animationClass:   RSPAnimationTest>>setUp   RSPAnimationTest>>testBasic   RSPAnimationTest>>testBasicInCanvas   RSPAnimationTest>>testDelay This package depends on the following classes:   ParametrizedTestCase You must resolve these dependencies before you will be able to load these definitions:   RSPBoundingTest   RSPBoundingTest class>>testParameters   RSPBoundingTest>>setUp   RSPBoundingTest>>shapeClass   RSPBoundingTest>>shapeClass:   RSPBoundingTest>>testDraw   RSPBoundingTest>>testDrawBorder   RSPBoundingTest>>testPosition   RSPLinesTest   RSPLinesTest class>>testParameters   RSPLinesTest>>setUp   RSPLinesTest>>shapeClass   RSPLinesTest>>shapeClass:   RSPLinesTest>>testDraw   RSPLinesTest>>testDrawMarkers This package depends on the following classes:   AthensLineSegment   AthensCubicSegment   AthensCloseSegment   AthensPathSegment You must resolve these dependencies before you will be able to load these definitions:   AthensCloseSegment>>visitWith:   AthensCubicSegment>>durationFor:   AthensCubicSegment>>pointsWithStart:duration:   AthensCubicSegment>>visitWith:   AthensLineSegment>>durationFor:   AthensLineSegment>>pointsWithStart:duration:   AthensPathSegment>>durationFor:   AthensPathSegment>>pointsWithStart:   AthensPathSegment>>pointsWithStart:duration: -------------- next part -------------- An HTML attachment was scrubbed... URL: From tomjonabc at gmail.com Sun Oct 25 13:39:23 2020 From: tomjonabc at gmail.com (Tom Beckmann) Date: Sun, 25 Oct 2020 14:39:23 +0100 Subject: [squeak-dev] Roassal3...What is optimal, port Athens? Athens-Cairo? or build out the Roassal3-Squeak RsBalloonFOO heirarchy In-Reply-To: <1755fee7f36.f5ef702324417.98502659133065400@zoho.com> References: <1755fee7f36.f5ef702324417.98502659133065400@zoho.com> Message-ID: Hi timothy, my personal opinion is that, for Squeak, it would be more interesting to get a working implementation in Balloon going, rather than porting Athens. Having Athens-Cairo would bring higher quality graphics (as of right now), but it's also a rather large dependency that may introduce portability issues, while we know for sure that Balloon "just works". Staying with Balloon could also make running the Roassal port in some of the Squeak derivatives such as SqueakJS, GraalSqueak or RSqueak simpler than depending on FFI. Note, however, that I have not dug deep into Athens' code, so I may be over- or underestimating the complexity it would introduce. I do know that the Balloon backend for Athens (porting which would also be an option) was very incomplete when I last looked at it. Best, Tom On Sun, Oct 25, 2020 at 2:24 PM gettimothy via Squeak-dev < squeak-dev at lists.squeakfoundation.org> wrote: > Hi Tom (and others), > > From an earlier email, you remarked that you where able to get an example > up and running quickly by ignoring Athens (?) and rolling your own. > > Is this approach "optimal" ? > > > Here is an example of things we cannot do until dependencies are > resolved...heck, at the bottom of this email* is the entire Roassal install > "log" that I saved when I installed the package: > > > You must resolve these dependencies before you will be able to load these > definitions: > AthensCairoPathBuilder>>arcDegreeStart:sweep:centerX:y:radius: > AthensCairoPathBuilder>>arcRadianStart:sweep:centerX:y:radius: > AthensCairoPathBuilder>>ellipticalArc3:xrot:large:sweep:to: > AthensCairoPathBuilder>>ellipticalArc:xrot:large:sweep:to: > AthensCairoPathBuilder>>ellipticalArc:xrot:large:sweep:to:relative: > > I can either port the AthensCairoPathBuilder or I can move the > functionality to your BalloonPathBuilder. > > > Since I know nothing about either, it will be equally painful to implement > either, so the question becomes, which path yeilds the best results going > forward? > > > Consider too, that "grok FFI" is on my skillset todo-list and Athens-Cairo > looks like it would put a checkmark on that todo-list item. > > I do not know enough to make an informed decision (I intuitively prefer to > get the base right, but as we discovered with the pharo kernel bytes > fiasco, that is not always possible) > > Your thoughts? > > cheers, > > tty. > > > > *Install log follows: > > This package depends on the following classes: > AthensCairoPathBuilder > You must resolve these dependencies before you will be able to load these > definitions: > AthensCairoPathBuilder>>arcDegreeStart:sweep:centerX:y:radius: > AthensCairoPathBuilder>>arcRadianStart:sweep:centerX:y:radius: > AthensCairoPathBuilder>>ellipticalArc3:xrot:large:sweep:to: > AthensCairoPathBuilder>>ellipticalArc:xrot:large:sweep:to: > AthensCairoPathBuilder>>ellipticalArc:xrot:large:sweep:to:relative: > > This package depends on the following classes: > PackageManifest > You must resolve these dependencies before you will be able to load these > definitions: > ManifestGeometryTests > ManifestGeometryTests class>>ruleRBStringConcatenationRuleV1FalsePositive > > > This package depends on the following classes: > GradientPaint > You must resolve these dependencies before you will be able to load these > definitions: > GradientPaint>>interpolateTo:at: > > > This package depends on the following classes: > AthensCairoPathBuilder > AthensCairoSurface > RPackage > You must resolve these dependencies before you will be able to load these > definitions: > AthensCairoPathBuilder>>arcAround:radius:startAngle:endAngle: > AthensCairoPathBuilder>>arcAround:radius:startAngle:endAngle:cw: > AthensCairoPathBuilder>>arcCos: > AthensCairoPathBuilder>>ellipticalArc2:xrot:large:sweep:to: > AthensCairoSurface>>hasBeenFreed > RPackage>>dependentPackages > This package depends on the following classes: > PharoDarkTheme > ClyBrowserToolMorph > UITheme > You must resolve these dependencies before you will be able to load these > definitions: > PharoDarkTheme>>classBoxBackgroundColor > RSUMLCalypso > RSUMLCalypso>>activationPriority > RSUMLCalypso>>applyTheme: > RSUMLCalypso>>build > RSUMLCalypso>>classes > RSUMLCalypso>>defaultIconName > RSUMLCalypso>>limitedClasses: > RSUMLCalypso>>tabOrder > RSUMLClassCalypso > RSUMLClassCalypso class>>classUmlTapActivation > RSUMLClassCalypso>>classes > RSUMLClassCalypso>>defaultTitle > RSUMLClassCalypso>>isSimilarTo: > RSUMLClassCalypso>>setUpModelFromContext > RSUMLClassCalypso>>targetClass > RSUMLPackageCalypso > RSUMLPackageCalypso class>>classUmlTapActivation > RSUMLPackageCalypso>>classes > RSUMLPackageCalypso>>defaultIconName > RSUMLPackageCalypso>>defaultTitle > RSUMLPackageCalypso>>isSimilarTo: > RSUMLPackageCalypso>>packages > RSUMLPackageCalypso>>setUpModelFromContext > UITheme>>classBoxBackgroundColor > UITheme>>methodsLimitUML > > > This package depends on the following classes: > GLMMorphicWidgetRenderer > GLMPresentation > GLMMorphicRenderer > You must resolve these dependencies before you will be able to load these > definitions: > GLMMorphicRenderer>>renderRoassal3Presentation: > GLMMorphicRoassal3Renderer > GLMMorphicRoassal3Renderer>>render: > GLMPresentation>>roassal3 > GLMRoassal3Presentation > GLMRoassal3Presentation>>canvas > GLMRoassal3Presentation>>initialize > GLMRoassal3Presentation>>initializeCanvas: > GLMRoassal3Presentation>>renderGlamorouslyOn: > GLMRoassal3Presentation>>setUpInteractions > > > This package depends on the following classes: > RPackage > You must resolve these dependencies before you will be able to load these > definitions: > RPackage>>dependentPackagesWithOccurences > RPackage>>numberOfDependenciesToward: > > This package depends on the following classes: > ParametrizedTestCase > You must resolve these dependencies before you will be able to load these > definitions: > RSPAnimationTest > RSPAnimationTest class>>testParameters > RSPAnimationTest>>animationClass > RSPAnimationTest>>animationClass: > RSPAnimationTest>>setUp > RSPAnimationTest>>testBasic > RSPAnimationTest>>testBasicInCanvas > RSPAnimationTest>>testDelay > > This package depends on the following classes: > ParametrizedTestCase > You must resolve these dependencies before you will be able to load these > definitions: > RSPBoundingTest > RSPBoundingTest class>>testParameters > RSPBoundingTest>>setUp > RSPBoundingTest>>shapeClass > RSPBoundingTest>>shapeClass: > RSPBoundingTest>>testDraw > RSPBoundingTest>>testDrawBorder > RSPBoundingTest>>testPosition > RSPLinesTest > RSPLinesTest class>>testParameters > RSPLinesTest>>setUp > RSPLinesTest>>shapeClass > RSPLinesTest>>shapeClass: > RSPLinesTest>>testDraw > RSPLinesTest>>testDrawMarkers > > This package depends on the following classes: > AthensLineSegment > AthensCubicSegment > AthensCloseSegment > AthensPathSegment > You must resolve these dependencies before you will be able to load these > definitions: > AthensCloseSegment>>visitWith: > AthensCubicSegment>>durationFor: > AthensCubicSegment>>pointsWithStart:duration: > AthensCubicSegment>>visitWith: > AthensLineSegment>>durationFor: > AthensLineSegment>>pointsWithStart:duration: > AthensPathSegment>>durationFor: > AthensPathSegment>>pointsWithStart: > AthensPathSegment>>pointsWithStart:duration: > > > > > -------------- next part -------------- An HTML attachment was scrubbed... URL: From eliot.miranda at gmail.com Sun Oct 25 13:44:11 2020 From: eliot.miranda at gmail.com (Eliot Miranda) Date: Sun, 25 Oct 2020 06:44:11 -0700 Subject: [squeak-dev] Roassal3...What is optimal, port Athens? Athens-Cairo? or build out the Roassal3-Squeak RsBalloonFOO heirarchy In-Reply-To: <1755fee7f36.f5ef702324417.98502659133065400@zoho.com> References: <1755fee7f36.f5ef702324417.98502659133065400@zoho.com> Message-ID: <0E8D8308-2000-4B5A-B79A-1CB8759B563B@gmail.com> Hi Timothy, > On Oct 25, 2020, at 6:24 AM, gettimothy via Squeak-dev wrote: > >  > Hi Tom (and others), > > From an earlier email, you remarked that you where able to get an example up and running quickly by ignoring Athens (?) and rolling your own. > > Is this approach "optimal" ? No; strategically it would be a disaster. First, as I understand it the Athens library is built above Cairo, a large foreign dependency, implemented in C, several times larger than the VM itself. Second, Juan Vuletich is making good progress with Morphic3, a Smalltalk implementation (a Smalltalk compiler) did similar functionality, running on the GPU. This dependency would be much like our dependency on the VM, in that it used our own technology stack , and therefore we can modify it, and do so quite quickly. So for the moment you should roll you own or host above BitBLT until we can move to Morphic3. This is essential. Under no circumstances should you release something using Athens/Cairo. If will do lasting damage to this community and its strategic direction and viability. > > > Here is an example of things we cannot do until dependencies are resolved...heck, at the bottom of this email* is the entire Roassal install "log" that I saved when I installed the package: > > > You must resolve these dependencies before you will be able to load these definitions: > AthensCairoPathBuilder>>arcDegreeStart:sweep:centerX:y:radius: > AthensCairoPathBuilder>>arcRadianStart:sweep:centerX:y:radius: > AthensCairoPathBuilder>>ellipticalArc3:xrot:large:sweep:to: > AthensCairoPathBuilder>>ellipticalArc:xrot:large:sweep:to: > AthensCairoPathBuilder>>ellipticalArc:xrot:large:sweep:to:relative: > I can either port the AthensCairoPathBuilder or I can move the functionality to your BalloonPathBuilder. > > > Since I know nothing about either, it will be equally painful to implement either, so the question becomes, which path yeilds the best results going forward? > > > Consider too, that "grok FFI" is on my skillset todo-list and Athens-Cairo looks like it would put a checkmark on that todo-list item. > > I do not know enough to make an informed decision (I intuitively prefer to get the base right, but as we discovered with the pharo kernel bytes fiasco, that is not always possible) > > Your thoughts? > > cheers, > > tty. > > > > *Install log follows: > > This package depends on the following classes: > AthensCairoPathBuilder > You must resolve these dependencies before you will be able to load these definitions: > AthensCairoPathBuilder>>arcDegreeStart:sweep:centerX:y:radius: > AthensCairoPathBuilder>>arcRadianStart:sweep:centerX:y:radius: > AthensCairoPathBuilder>>ellipticalArc3:xrot:large:sweep:to: > AthensCairoPathBuilder>>ellipticalArc:xrot:large:sweep:to: > AthensCairoPathBuilder>>ellipticalArc:xrot:large:sweep:to:relative: > > This package depends on the following classes: > PackageManifest > You must resolve these dependencies before you will be able to load these definitions: > ManifestGeometryTests > ManifestGeometryTests class>>ruleRBStringConcatenationRuleV1FalsePositive > > > This package depends on the following classes: > GradientPaint > You must resolve these dependencies before you will be able to load these definitions: > GradientPaint>>interpolateTo:at: > > > This package depends on the following classes: > AthensCairoPathBuilder > AthensCairoSurface > RPackage > You must resolve these dependencies before you will be able to load these definitions: > AthensCairoPathBuilder>>arcAround:radius:startAngle:endAngle: > AthensCairoPathBuilder>>arcAround:radius:startAngle:endAngle:cw: > AthensCairoPathBuilder>>arcCos: > AthensCairoPathBuilder>>ellipticalArc2:xrot:large:sweep:to: > AthensCairoSurface>>hasBeenFreed > RPackage>>dependentPackages > This package depends on the following classes: > PharoDarkTheme > ClyBrowserToolMorph > UITheme > You must resolve these dependencies before you will be able to load these definitions: > PharoDarkTheme>>classBoxBackgroundColor > RSUMLCalypso > RSUMLCalypso>>activationPriority > RSUMLCalypso>>applyTheme: > RSUMLCalypso>>build > RSUMLCalypso>>classes > RSUMLCalypso>>defaultIconName > RSUMLCalypso>>limitedClasses: > RSUMLCalypso>>tabOrder > RSUMLClassCalypso > RSUMLClassCalypso class>>classUmlTapActivation > RSUMLClassCalypso>>classes > RSUMLClassCalypso>>defaultTitle > RSUMLClassCalypso>>isSimilarTo: > RSUMLClassCalypso>>setUpModelFromContext > RSUMLClassCalypso>>targetClass > RSUMLPackageCalypso > RSUMLPackageCalypso class>>classUmlTapActivation > RSUMLPackageCalypso>>classes > RSUMLPackageCalypso>>defaultIconName > RSUMLPackageCalypso>>defaultTitle > RSUMLPackageCalypso>>isSimilarTo: > RSUMLPackageCalypso>>packages > RSUMLPackageCalypso>>setUpModelFromContext > UITheme>>classBoxBackgroundColor > UITheme>>methodsLimitUML > > > This package depends on the following classes: > GLMMorphicWidgetRenderer > GLMPresentation > GLMMorphicRenderer > You must resolve these dependencies before you will be able to load these definitions: > GLMMorphicRenderer>>renderRoassal3Presentation: > GLMMorphicRoassal3Renderer > GLMMorphicRoassal3Renderer>>render: > GLMPresentation>>roassal3 > GLMRoassal3Presentation > GLMRoassal3Presentation>>canvas > GLMRoassal3Presentation>>initialize > GLMRoassal3Presentation>>initializeCanvas: > GLMRoassal3Presentation>>renderGlamorouslyOn: > GLMRoassal3Presentation>>setUpInteractions > > > This package depends on the following classes: > RPackage > You must resolve these dependencies before you will be able to load these definitions: > RPackage>>dependentPackagesWithOccurences > RPackage>>numberOfDependenciesToward: > > This package depends on the following classes: > ParametrizedTestCase > You must resolve these dependencies before you will be able to load these definitions: > RSPAnimationTest > RSPAnimationTest class>>testParameters > RSPAnimationTest>>animationClass > RSPAnimationTest>>animationClass: > RSPAnimationTest>>setUp > RSPAnimationTest>>testBasic > RSPAnimationTest>>testBasicInCanvas > RSPAnimationTest>>testDelay > > This package depends on the following classes: > ParametrizedTestCase > You must resolve these dependencies before you will be able to load these definitions: > RSPBoundingTest > RSPBoundingTest class>>testParameters > RSPBoundingTest>>setUp > RSPBoundingTest>>shapeClass > RSPBoundingTest>>shapeClass: > RSPBoundingTest>>testDraw > RSPBoundingTest>>testDrawBorder > RSPBoundingTest>>testPosition > RSPLinesTest > RSPLinesTest class>>testParameters > RSPLinesTest>>setUp > RSPLinesTest>>shapeClass > RSPLinesTest>>shapeClass: > RSPLinesTest>>testDraw > RSPLinesTest>>testDrawMarkers > > This package depends on the following classes: > AthensLineSegment > AthensCubicSegment > AthensCloseSegment > AthensPathSegment > You must resolve these dependencies before you will be able to load these definitions: > AthensCloseSegment>>visitWith: > AthensCubicSegment>>durationFor: > AthensCubicSegment>>pointsWithStart:duration: > AthensCubicSegment>>visitWith: > AthensLineSegment>>durationFor: > AthensLineSegment>>pointsWithStart:duration: > AthensPathSegment>>durationFor: > AthensPathSegment>>pointsWithStart: > AthensPathSegment>>pointsWithStart:duration: _,,,^..^,,,_ (phone) -------------- next part -------------- An HTML attachment was scrubbed... URL: From eliot.miranda at gmail.com Sun Oct 25 13:46:46 2020 From: eliot.miranda at gmail.com (Eliot Miranda) Date: Sun, 25 Oct 2020 06:46:46 -0700 Subject: [squeak-dev] Roassal3...What is optimal, port Athens? Athens-Cairo? or build out the Roassal3-Squeak RsBalloonFOO heirarchy In-Reply-To: References: Message-ID: <8905BF24-D495-46E4-879F-85D7A5D47853@gmail.com> > On Oct 25, 2020, at 6:39 AM, Tom Beckmann wrote: > >  > Hi timothy, > > my personal opinion is that, for Squeak, it would be more interesting to get a working implementation in Balloon going, rather than porting Athens. Having Athens-Cairo would bring higher quality graphics (as of right now), but it's also a rather large dependency that may introduce portability issues, while we know for sure that Balloon "just works". +1 > Staying with Balloon could also make running the Roassal port in some of the Squeak derivatives such as SqueakJS, GraalSqueak or RSqueak simpler than depending on FFI. > Note, however, that I have not dug deep into Athens' code, so I may be over- or underestimating the complexity it would introduce. I do know that the Balloon backend for Athens (porting which would also be an option) was very incomplete when I last looked at it. > > Best, > Tom > >> On Sun, Oct 25, 2020 at 2:24 PM gettimothy via Squeak-dev wrote: >> Hi Tom (and others), >> >> From an earlier email, you remarked that you where able to get an example up and running quickly by ignoring Athens (?) and rolling your own. >> >> Is this approach "optimal" ? >> >> >> Here is an example of things we cannot do until dependencies are resolved...heck, at the bottom of this email* is the entire Roassal install "log" that I saved when I installed the package: >> >> >> You must resolve these dependencies before you will be able to load these definitions: >> AthensCairoPathBuilder>>arcDegreeStart:sweep:centerX:y:radius: >> AthensCairoPathBuilder>>arcRadianStart:sweep:centerX:y:radius: >> AthensCairoPathBuilder>>ellipticalArc3:xrot:large:sweep:to: >> AthensCairoPathBuilder>>ellipticalArc:xrot:large:sweep:to: >> AthensCairoPathBuilder>>ellipticalArc:xrot:large:sweep:to:relative: >> I can either port the AthensCairoPathBuilder or I can move the functionality to your BalloonPathBuilder. >> >> >> Since I know nothing about either, it will be equally painful to implement either, so the question becomes, which path yeilds the best results going forward? >> >> >> Consider too, that "grok FFI" is on my skillset todo-list and Athens-Cairo looks like it would put a checkmark on that todo-list item. >> >> I do not know enough to make an informed decision (I intuitively prefer to get the base right, but as we discovered with the pharo kernel bytes fiasco, that is not always possible) >> >> Your thoughts? >> >> cheers, >> >> tty. >> >> >> >> *Install log follows: >> >> This package depends on the following classes: >> AthensCairoPathBuilder >> You must resolve these dependencies before you will be able to load these definitions: >> AthensCairoPathBuilder>>arcDegreeStart:sweep:centerX:y:radius: >> AthensCairoPathBuilder>>arcRadianStart:sweep:centerX:y:radius: >> AthensCairoPathBuilder>>ellipticalArc3:xrot:large:sweep:to: >> AthensCairoPathBuilder>>ellipticalArc:xrot:large:sweep:to: >> AthensCairoPathBuilder>>ellipticalArc:xrot:large:sweep:to:relative: >> >> This package depends on the following classes: >> PackageManifest >> You must resolve these dependencies before you will be able to load these definitions: >> ManifestGeometryTests >> ManifestGeometryTests class>>ruleRBStringConcatenationRuleV1FalsePositive >> >> >> This package depends on the following classes: >> GradientPaint >> You must resolve these dependencies before you will be able to load these definitions: >> GradientPaint>>interpolateTo:at: >> >> >> This package depends on the following classes: >> AthensCairoPathBuilder >> AthensCairoSurface >> RPackage >> You must resolve these dependencies before you will be able to load these definitions: >> AthensCairoPathBuilder>>arcAround:radius:startAngle:endAngle: >> AthensCairoPathBuilder>>arcAround:radius:startAngle:endAngle:cw: >> AthensCairoPathBuilder>>arcCos: >> AthensCairoPathBuilder>>ellipticalArc2:xrot:large:sweep:to: >> AthensCairoSurface>>hasBeenFreed >> RPackage>>dependentPackages >> This package depends on the following classes: >> PharoDarkTheme >> ClyBrowserToolMorph >> UITheme >> You must resolve these dependencies before you will be able to load these definitions: >> PharoDarkTheme>>classBoxBackgroundColor >> RSUMLCalypso >> RSUMLCalypso>>activationPriority >> RSUMLCalypso>>applyTheme: >> RSUMLCalypso>>build >> RSUMLCalypso>>classes >> RSUMLCalypso>>defaultIconName >> RSUMLCalypso>>limitedClasses: >> RSUMLCalypso>>tabOrder >> RSUMLClassCalypso >> RSUMLClassCalypso class>>classUmlTapActivation >> RSUMLClassCalypso>>classes >> RSUMLClassCalypso>>defaultTitle >> RSUMLClassCalypso>>isSimilarTo: >> RSUMLClassCalypso>>setUpModelFromContext >> RSUMLClassCalypso>>targetClass >> RSUMLPackageCalypso >> RSUMLPackageCalypso class>>classUmlTapActivation >> RSUMLPackageCalypso>>classes >> RSUMLPackageCalypso>>defaultIconName >> RSUMLPackageCalypso>>defaultTitle >> RSUMLPackageCalypso>>isSimilarTo: >> RSUMLPackageCalypso>>packages >> RSUMLPackageCalypso>>setUpModelFromContext >> UITheme>>classBoxBackgroundColor >> UITheme>>methodsLimitUML >> >> >> This package depends on the following classes: >> GLMMorphicWidgetRenderer >> GLMPresentation >> GLMMorphicRenderer >> You must resolve these dependencies before you will be able to load these definitions: >> GLMMorphicRenderer>>renderRoassal3Presentation: >> GLMMorphicRoassal3Renderer >> GLMMorphicRoassal3Renderer>>render: >> GLMPresentation>>roassal3 >> GLMRoassal3Presentation >> GLMRoassal3Presentation>>canvas >> GLMRoassal3Presentation>>initialize >> GLMRoassal3Presentation>>initializeCanvas: >> GLMRoassal3Presentation>>renderGlamorouslyOn: >> GLMRoassal3Presentation>>setUpInteractions >> >> >> This package depends on the following classes: >> RPackage >> You must resolve these dependencies before you will be able to load these definitions: >> RPackage>>dependentPackagesWithOccurences >> RPackage>>numberOfDependenciesToward: >> >> This package depends on the following classes: >> ParametrizedTestCase >> You must resolve these dependencies before you will be able to load these definitions: >> RSPAnimationTest >> RSPAnimationTest class>>testParameters >> RSPAnimationTest>>animationClass >> RSPAnimationTest>>animationClass: >> RSPAnimationTest>>setUp >> RSPAnimationTest>>testBasic >> RSPAnimationTest>>testBasicInCanvas >> RSPAnimationTest>>testDelay >> >> This package depends on the following classes: >> ParametrizedTestCase >> You must resolve these dependencies before you will be able to load these definitions: >> RSPBoundingTest >> RSPBoundingTest class>>testParameters >> RSPBoundingTest>>setUp >> RSPBoundingTest>>shapeClass >> RSPBoundingTest>>shapeClass: >> RSPBoundingTest>>testDraw >> RSPBoundingTest>>testDrawBorder >> RSPBoundingTest>>testPosition >> RSPLinesTest >> RSPLinesTest class>>testParameters >> RSPLinesTest>>setUp >> RSPLinesTest>>shapeClass >> RSPLinesTest>>shapeClass: >> RSPLinesTest>>testDraw >> RSPLinesTest>>testDrawMarkers >> >> This package depends on the following classes: >> AthensLineSegment >> AthensCubicSegment >> AthensCloseSegment >> AthensPathSegment >> You must resolve these dependencies before you will be able to load these definitions: >> AthensCloseSegment>>visitWith: >> AthensCubicSegment>>durationFor: >> AthensCubicSegment>>pointsWithStart:duration: >> AthensCubicSegment>>visitWith: >> AthensLineSegment>>durationFor: >> AthensLineSegment>>pointsWithStart:duration: >> AthensPathSegment>>durationFor: >> AthensPathSegment>>pointsWithStart: >> AthensPathSegment>>pointsWithStart:duration: >> >> >> > -------------- next part -------------- An HTML attachment was scrubbed... URL: From gettimothy at zoho.com Sun Oct 25 13:54:24 2020 From: gettimothy at zoho.com (gettimothy) Date: Sun, 25 Oct 2020 09:54:24 -0400 Subject: [squeak-dev] Roassal3...What is optimal, port Athens? Athens-Cairo? or build out the Roassal3-Squeak RsBalloonFOO heirarchy Message-ID: <1756009eadc.11951bc4f24673.6401716078387023399@zoho.com> Hi Tom, Eliot has chimed in with a resounding, "Oh! The Humanity!!!" Hindenburg level Disaster alert, so port to Balloon(?) is the way to go and Cairo is a no go. So then, should we mirror the Athen's heirarchy with Balloon stuff? What I am saying, is that, rather than hacking a hodge-podge, I would feel better with a structure to adhere to. In my Browser, I see "Balloon-Collections, Engine, Fills, Geometry, Simulations and then I see Graphics-Display, Primitives....etc. I also see the RSAthensMorph.... For that "install log " list of messages/classes that must be implemented, I am more than happy to create the methods in appropriate places and go from there. I just do not know the appropriate places. Some mapping strategy...I guess I could try to intuit it, but others who know this stuff may have better ideas. cheers, Hi timothy, my personal opinion is that, for Squeak, it would be more interesting to get a working implementation in Balloon going, rather than porting Athens. Having Athens-Cairo would bring higher quality graphics (as of right now), but it's also a rather large dependency that may introduce portability issues, while we know for sure that Balloon "just works". Staying with Balloon could also make running the Roassal port in some of the Squeak derivatives such as SqueakJS, GraalSqueak or RSqueak simpler than depending on FFI. Note, however, that I have not dug deep into Athens' code, so I may be over- or underestimating the complexity it would introduce. I do know that the Balloon backend for Athens (porting which would also be an option) was very incomplete when I last looked at it. Best, Tom On Sun, Oct 25, 2020 at 2:24 PM gettimothy via Squeak-dev wrote: Hi Tom (and others), >From an earlier email, you remarked that you where able to get an example up and running quickly by ignoring Athens (?) and rolling your own. Is this approach "optimal" ? Here is an example of things we cannot do until dependencies are resolved...heck, at the bottom of this email* is the entire Roassal install "log" that I saved when I installed the package: You must resolve these dependencies before you will be able to load these definitions:   AthensCairoPathBuilder>>arcDegreeStart:sweep:centerX:y:radius:   AthensCairoPathBuilder>>arcRadianStart:sweep:centerX:y:radius:   AthensCairoPathBuilder>>ellipticalArc3:xrot:large:sweep:to:   AthensCairoPathBuilder>>ellipticalArc:xrot:large:sweep:to:   AthensCairoPathBuilder>>ellipticalArc:xrot:large:sweep:to:relative: I can either port the AthensCairoPathBuilder or I can move the functionality to your BalloonPathBuilder. Since I know nothing about either, it will be equally painful to implement either, so the question becomes, which path yeilds the best results going forward? Consider too, that "grok FFI" is on my skillset todo-list and Athens-Cairo looks like it would put a checkmark on that todo-list item. I do not know enough to make an informed decision (I intuitively prefer to get the base right, but as we discovered with the pharo kernel bytes fiasco, that is not always possible) Your thoughts? cheers, tty. *Install log follows: This package depends on the following classes:   AthensCairoPathBuilder You must resolve these dependencies before you will be able to load these definitions:   AthensCairoPathBuilder>>arcDegreeStart:sweep:centerX:y:radius:   AthensCairoPathBuilder>>arcRadianStart:sweep:centerX:y:radius:   AthensCairoPathBuilder>>ellipticalArc3:xrot:large:sweep:to:   AthensCairoPathBuilder>>ellipticalArc:xrot:large:sweep:to:   AthensCairoPathBuilder>>ellipticalArc:xrot:large:sweep:to:relative: This package depends on the following classes:   PackageManifest You must resolve these dependencies before you will be able to load these definitions:   ManifestGeometryTests   ManifestGeometryTests class>>ruleRBStringConcatenationRuleV1FalsePositive This package depends on the following classes:   GradientPaint You must resolve these dependencies before you will be able to load these definitions:   GradientPaint>>interpolateTo:at: This package depends on the following classes:   AthensCairoPathBuilder   AthensCairoSurface   RPackage You must resolve these dependencies before you will be able to load these definitions:   AthensCairoPathBuilder>>arcAround:radius:startAngle:endAngle:   AthensCairoPathBuilder>>arcAround:radius:startAngle:endAngle:cw:   AthensCairoPathBuilder>>arcCos:   AthensCairoPathBuilder>>ellipticalArc2:xrot:large:sweep:to:   AthensCairoSurface>>hasBeenFreed   RPackage>>dependentPackages This package depends on the following classes:   PharoDarkTheme   ClyBrowserToolMorph   UITheme You must resolve these dependencies before you will be able to load these definitions:   PharoDarkTheme>>classBoxBackgroundColor   RSUMLCalypso   RSUMLCalypso>>activationPriority   RSUMLCalypso>>applyTheme:   RSUMLCalypso>>build   RSUMLCalypso>>classes   RSUMLCalypso>>defaultIconName   RSUMLCalypso>>limitedClasses:   RSUMLCalypso>>tabOrder   RSUMLClassCalypso   RSUMLClassCalypso class>>classUmlTapActivation   RSUMLClassCalypso>>classes   RSUMLClassCalypso>>defaultTitle   RSUMLClassCalypso>>isSimilarTo:   RSUMLClassCalypso>>setUpModelFromContext   RSUMLClassCalypso>>targetClass   RSUMLPackageCalypso   RSUMLPackageCalypso class>>classUmlTapActivation   RSUMLPackageCalypso>>classes   RSUMLPackageCalypso>>defaultIconName   RSUMLPackageCalypso>>defaultTitle   RSUMLPackageCalypso>>isSimilarTo:   RSUMLPackageCalypso>>packages   RSUMLPackageCalypso>>setUpModelFromContext   UITheme>>classBoxBackgroundColor   UITheme>>methodsLimitUML This package depends on the following classes:   GLMMorphicWidgetRenderer   GLMPresentation   GLMMorphicRenderer You must resolve these dependencies before you will be able to load these definitions:   GLMMorphicRenderer>>renderRoassal3Presentation:   GLMMorphicRoassal3Renderer   GLMMorphicRoassal3Renderer>>render:   GLMPresentation>>roassal3   GLMRoassal3Presentation   GLMRoassal3Presentation>>canvas   GLMRoassal3Presentation>>initialize   GLMRoassal3Presentation>>initializeCanvas:   GLMRoassal3Presentation>>renderGlamorouslyOn:   GLMRoassal3Presentation>>setUpInteractions This package depends on the following classes:   RPackage You must resolve these dependencies before you will be able to load these definitions:   RPackage>>dependentPackagesWithOccurences   RPackage>>numberOfDependenciesToward: This package depends on the following classes:   ParametrizedTestCase You must resolve these dependencies before you will be able to load these definitions:   RSPAnimationTest   RSPAnimationTest class>>testParameters   RSPAnimationTest>>animationClass   RSPAnimationTest>>animationClass:   RSPAnimationTest>>setUp   RSPAnimationTest>>testBasic   RSPAnimationTest>>testBasicInCanvas   RSPAnimationTest>>testDelay This package depends on the following classes:   ParametrizedTestCase You must resolve these dependencies before you will be able to load these definitions:   RSPBoundingTest   RSPBoundingTest class>>testParameters   RSPBoundingTest>>setUp   RSPBoundingTest>>shapeClass   RSPBoundingTest>>shapeClass:   RSPBoundingTest>>testDraw   RSPBoundingTest>>testDrawBorder   RSPBoundingTest>>testPosition   RSPLinesTest   RSPLinesTest class>>testParameters   RSPLinesTest>>setUp   RSPLinesTest>>shapeClass   RSPLinesTest>>shapeClass:   RSPLinesTest>>testDraw   RSPLinesTest>>testDrawMarkers This package depends on the following classes:   AthensLineSegment   AthensCubicSegment   AthensCloseSegment   AthensPathSegment You must resolve these dependencies before you will be able to load these definitions:   AthensCloseSegment>>visitWith:   AthensCubicSegment>>durationFor:   AthensCubicSegment>>pointsWithStart:duration:   AthensCubicSegment>>visitWith:   AthensLineSegment>>durationFor:   AthensLineSegment>>pointsWithStart:duration:   AthensPathSegment>>durationFor:   AthensPathSegment>>pointsWithStart:   AthensPathSegment>>pointsWithStart:duration: -------------- next part -------------- An HTML attachment was scrubbed... URL: From gettimothy at zoho.com Sun Oct 25 14:11:58 2020 From: gettimothy at zoho.com (gettimothy) Date: Sun, 25 Oct 2020 10:11:58 -0400 Subject: [squeak-dev] Roassal3 "action plan" Message-ID: <175601a0053.1170bddf424774.608972920449146652@zoho.com> Hi Tom, After thinking on it, it makes sense to port all the pharo Athens calls to methods in "some appropriate class" in the Balloon or Graphics area and modifying the pharo call to those methods to use the Balloon/Graphics methods. AND when doing that, duplicate the Tests for those calls. All the while asking for pointers on specific instances. The approach gives me a needed structure, instead of doing "stupid stuff" like cloning in the GraphicsPaint class from Athen's directly into squeak, just to make things work. Sound like a plan? -------------- next part -------------- An HTML attachment was scrubbed... URL: From eric.gade at gmail.com Sun Oct 25 14:44:12 2020 From: eric.gade at gmail.com (Eric Gade) Date: Sun, 25 Oct 2020 10:44:12 -0400 Subject: [squeak-dev] Morphs and Data Question Message-ID: Hi all, I have a quick question that is perhaps very elementary. What is the best way to design my Morph subclasses so that they "react" to changes on their models? For example, if I have some data related model with text that updates and I want the "view" (the Morph) to update whenever this occurs? In my own quick code I've always just implemented a `step` method that checks for data on the model updates, but is that too brutal and inefficient? Thanks, -- Eric -------------- next part -------------- An HTML attachment was scrubbed... URL: From gettimothy at zoho.com Sun Oct 25 14:58:37 2020 From: gettimothy at zoho.com (gettimothy) Date: Sun, 25 Oct 2020 10:58:37 -0400 Subject: [squeak-dev] Roassal3 Examples update. Message-ID: <1756044b8e2.f5ca4d9025070.9015285472149169854@zoho.com> Hi Tom, The following steps in bold, I just repeated to get most of the examples working in that class. The ones with an 'x' preceding them do not work, and I will be using the Balloon port principles to resolve the bugs in them going forward, rather than attempting to import the classes via Git. need stdev  from pharo   in Collection  in *Roassal3-Squeak category stdev | avg sample sum | "In statistics, the standard deviation is a measure that is used to quantify the amount of variation or dispersion of a set of data values. For details about implementation see comment in self sum." avg := self average. sample := self anyOne. sum := self inject: sample into: [ :accum :each | accum + (each - avg) squared ]. sum := sum - sample. ^ (sum / (self size - 1)) sqrt Browse Collection, add bogus method, flatCollect: aBlock. find senders... change flatCollect: to gather: change RPackageOrganizer to PackageOrganizer (repeat browse senders until all changed) delete bogus method, flatCollect. ClassDescription, add method category *Roassal-Squeak add method 'numberOfMethods' >> ^self  localSelectors size. ===run examples === RSChartExample new example01Markers open. RSChartExample new example02ScatterPlot open. RSChartExample new example03Plot open. RSChartExample new example04WithTick open. RSChartExample new example05WithTick open. RSChartExample new example06CustomNumberOfTicks open. RSChartExample new example07AdjustingFontSize open. RSChartExample new example08TwoCharts open. RSChartExample new example09LinearSqrtSymlog open. RSChartExample new example10BarPlot open. RSChartExample new example11BarplotCombinedWithLine open. RSChartExample new example12ScatterPlotAndNormalizer open. xRSChartExample new example13AreaPlot open. xRSChartExample new example14AreaPlotWithError open. xRSChartExample new example15AreaBox open. xRSChartExample new example16Series open. xRSChartExample new example17CLPvsUSD open. xRSChartExample new example18Animation open. ok, progress. cheers, t -------------- next part -------------- An HTML attachment was scrubbed... URL: From tomjonabc at gmail.com Sun Oct 25 15:26:30 2020 From: tomjonabc at gmail.com (Tom Beckmann) Date: Sun, 25 Oct 2020 16:26:30 +0100 Subject: [squeak-dev] Roassal3 "action plan" In-Reply-To: <175601a0053.1170bddf424774.608972920449146652@zoho.com> References: <175601a0053.1170bddf424774.608972920449146652@zoho.com> Message-ID: Hi timothy, what I could gleam from the Roassal codebase, my assumption is that their design initially started out with an arbitrary graphics backend in mind but, gradually, some lower-level aspects leaked into the domain-specific high-level code. You can see that the codebase contains two or three classes specifically with "Athens" in their name, which typically aim to abstract and collect the interface needed by Roassal to produce graphics. So, our goal would be to extend these abstractions to serve the use cases where Athens-specific code currently exists in the Roassal domain layer. Then, we can "simply" go in, provide a second interface that uses Balloon as its backend and we're done! Since an incremental process is obviously beneficial here and will yield the fastest sense of progress, starting out by creating this Balloon interface and making it just about serviceable is what we currently have in our repo. I believe Balloon as an engine should be able to express just about all the requirements that Roassal puts on Athens, even though I'm rather sure we'll have to employ some trickery for e.g. text. To make it more concrete: I think your approach of going test by test or example by example should work well. Ideally, you would compare the output of each example with what you find in Pharo and see where things are currently entirely broken or missing. If you then encounter a test/example that uses Athens-specific code, try to isolate the code in one of the abstraction classes, such as the RSAthensMorph or RSAthensRenderer and try to provide an equivalent implementation for our own RSBalloonMorph and RSBalloonRenderer classes. Eventually, we can then simply not load the RSAthensMorph and RSAthensRenderer were all Athens-specific code is isolated and should thus no longer encounter code that cannot load in Squeak. Additionally, it may be worthwhile to keep a separate document in case we encounter larger architectural issues where Roassal and Athens code are intertwined, such that the Roassal team can review the document rather than having to sift through a pull request of thousands of lines. Best, Tom On Sun, Oct 25, 2020 at 3:12 PM gettimothy via Squeak-dev < squeak-dev at lists.squeakfoundation.org> wrote: > Hi Tom, > > After thinking on it, it makes sense to port all the pharo Athens calls to > methods in "some appropriate class" in the Balloon or Graphics area and > modifying the pharo call to those methods to use the Balloon/Graphics > methods. > > AND > > when doing that, duplicate the Tests for those calls. > > All the while asking for pointers on specific instances. > > > The approach gives me a needed structure, instead of doing "stupid stuff" > like cloning in the GraphicsPaint class from Athen's directly into squeak, > just to make things work. > > Sound like a plan? > > > > > > > -------------- next part -------------- An HTML attachment was scrubbed... URL: From gettimothy at zoho.com Sun Oct 25 15:43:24 2020 From: gettimothy at zoho.com (gettimothy) Date: Sun, 25 Oct 2020 11:43:24 -0400 Subject: [squeak-dev] Roassal3 "action plan" Message-ID: <175606db85c.d7ed6e7425394.106663829946075620@zoho.com> Hi Tom thanks for the reply. what I could gleam from the Roassal codebase, my assumption is that their design initially started out with an arbitrary graphics backend in mind but, gradually, some lower-level aspects leaked into the domain-specific high-level code. You can see that the codebase contains two or three classes specifically with "Athens" in their name, which typically aim to abstract and collect the interface needed by Roassal to produce graphics. So, our goal would be to extend these abstractions to serve the use cases where Athens-specific code currently exists in the Roassal domain layer. Then, we can "simply" go in, provide a second interface that uses Balloon as its backend and we're done! Since an incremental process is obviously beneficial here and will yield the fastest sense of progress, starting out by creating this Balloon interface and making it just about serviceable is what we currently have in our repo. I believe Balloon as an engine should be able to express just about all the requirements that Roassal puts on Athens, even though I'm rather sure we'll have to employ some trickery for e.g. text. Athens becomes Balloon.... To make it more concrete: I think your approach of going test by test or example by example should work well. Ideally, you would compare the output of each example with what you find in Pharo and see where things are currently entirely broken or missing. If you then encounter a test/example that uses Athens-specific code, try to isolate the code in one of the abstraction classes, such as the RSAthensMorph or RSAthensRenderer and try to provide an equivalent implementation for our own RSBalloonMorph and RSBalloonRenderer classes. Eventually, we can then simply not load the RSAthensMorph and RSAthensRenderer were all Athens-specific code is isolated and should thus no longer encounter code that cannot load in Squeak. cool!  That's what I am doing now. The emphatic "NO" on Cairo is what I needed to hear to proceed down this path. btw, I got two more of those tests working by adding a method to BallonPathBuilder...steps to get all but the four last ones are: ===modify messages for pharo-isms=== need stdev  from pharo   in Collection  stdev | avg sample sum | "In statistics, the standard deviation is a measure that is used to quantify the amount of variation or dispersion of a set of data values. For details about implementation see comment in self sum." avg := self average. sample := self anyOne. sum := self inject: sample into: [ :accum :each | accum + (each - avg) squared ]. sum := sum - sample. ^ (sum / (self size - 1)) sqrt flatCollect: becomes 'gather:'. Browse Collection, add bogus method, flatCollect: aBlock. find senders... RPackageOrganizer becomes PackageOrganizer (repeat until all changed) ClassDescription, add method category *Roassal-Squeak add method 'numberOfMethods' >> ^self  localSelectors size. BalloonPathBuilder add method cateogry *Roassal3-Squeak ad method >>close self closePath. ===run examples === RSChartExample new example01Markers open. RSChartExample new example02ScatterPlot open. RSChartExample new example03Plot open. RSChartExample new example04WithTick open. RSChartExample new example05WithTick open. RSChartExample new example06CustomNumberOfTicks open. RSChartExample new example07AdjustingFontSize open. RSChartExample new example08TwoCharts open. RSChartExample new example09LinearSqrtSymlog open. RSChartExample new example10BarPlot open. RSChartExample new example11BarplotCombinedWithLine open. RSChartExample new example12ScatterPlotAndNormalizer open. RSChartExample new example13AreaPlot open. RSChartExample new example14AreaPlotWithError open. xRSChartExample new example15AreaBox open. xRSChartExample new example16Series open. xRSChartExample new example17CLPvsUSD open. xRSChartExample new example18Animation open. Additionally, it may be worthwhile to keep a separate document in case we encounter larger architectural issues where Roassal and Athens code are intertwined, such that the Roassal team can review the document rather than having to sift through a pull request of thousands of lines. I will leave that to you, but I will contribute when I encounter that stuff. Best, Tom cheers. p.s. I am saving to a local monticello repo as I go. Its easier than me having to relearn Metacello and the Git is just a reference at this point. -------------- next part -------------- An HTML attachment was scrubbed... URL: From gettimothy at zoho.com Sun Oct 25 15:45:17 2020 From: gettimothy at zoho.com (gettimothy) Date: Sun, 25 Oct 2020 11:45:17 -0400 Subject: [squeak-dev] Roassal3 do not save and quit image with a Roassal3 example open. The image freezes and you have to start over. Message-ID: <175606f723c.da0f502125403.6931719489958384958@zoho.com> Just sayin. I have done this twice already, (: -------------- next part -------------- An HTML attachment was scrubbed... URL: From Christoph.Thiede at student.hpi.uni-potsdam.de Sun Oct 25 17:04:49 2020 From: Christoph.Thiede at student.hpi.uni-potsdam.de (Thiede, Christoph) Date: Sun, 25 Oct 2020 17:04:49 +0000 Subject: [squeak-dev] Morphs and Data Question In-Reply-To: References: Message-ID: <41cd40c59b5740269f95f4bc9ab1b25d@student.hpi.uni-potsdam.de> Hi Eric, for general "reacting to changes", you could an observer pattern. I think this answer from StackOverflow explains it quite well: https://stackoverflow.com/a/17083241/13994294 For example in Squeak, you could take a look at the Pluggable morph implementations in the system categories Morphic-Pluggable Widgets as well as ToolBuilder-Morphic. For instance, in PluggableButtonMorph, you can see that the communication between morph and model is realized by defining selectors on the morph that will be performed to get necessary data and that can be signaled using the observer pattern to update the visual representation. See PluggableButtonMorph >> #update:. Apart from that, you could also take a look at the "Object Events" pattern in Squeak, see Object >> #when:send:to: + overloads and senders. Personally, I prefer the "normal" observer pattern the most time because it feels less like coupling the morph and the model too strong to each other, and it gives you greater flexibility without necessarily defining one selector per event type on the morph class. (Last but not least, it would be a possibility to store closures that were generated by the morph in the model and to evaluate them on every change. However, this is usually an anti-pattern because it creates a very strong coupling between the morph and the model, so I would not really recommend using this approach ...) To learn more about the underlying design patterns, you could look up in the encyclopedia of your choice the terms "Observer pattern", "MVC", and "MVVM". I hope that helps, and if you have further questions, please don't hesitate to ask them. :-) Best, Christoph ________________________________ Von: Squeak-dev im Auftrag von Eric Gade Gesendet: Sonntag, 25. Oktober 2020 15:44:12 An: The general-purpose Squeak developers list Betreff: [squeak-dev] Morphs and Data Question Hi all, I have a quick question that is perhaps very elementary. What is the best way to design my Morph subclasses so that they "react" to changes on their models? For example, if I have some data related model with text that updates and I want the "view" (the Morph) to update whenever this occurs? In my own quick code I've always just implemented a `step` method that checks for data on the model updates, but is that too brutal and inefficient? Thanks, -- Eric -------------- next part -------------- An HTML attachment was scrubbed... URL: From tim at rowledge.org Sun Oct 25 17:39:49 2020 From: tim at rowledge.org (tim Rowledge) Date: Sun, 25 Oct 2020 10:39:49 -0700 Subject: [squeak-dev] Morphs and Data Question In-Reply-To: References: Message-ID: > On 2020-10-25, at 7:44 AM, Eric Gade wrote: > What is the best way to design my Morph subclasses so that they "react" to changes on their models? For example, if I have some data related model with text that updates and I want the "view" (the Morph) to update whenever this occurs? In my own quick code I've always just implemented a `step` method that checks for data on the model updates, but is that too brutal and inefficient? > A simple step method is certainly possible and certainly effective - but if you set the step time too short it will also eat your cpu alive. The basic strategy is to use some mechanism to signal to your morph that something has changed and thereby set a flag that the morph needs redraw/updating. One of the nice things about morphs (and I've certainly fulminated about a lot of the not-so-nice things over time) is that the system can work better than the old MVC approach to the #changed:/#update: protocol. The old approach often lead to massive storms (or worse, recursions) of a change leading to an update that lead to a number of changes that each lead to ... etc. Morphic quite neatly broke that (when used properly) by allowing for an update to flag that a redraw is needed. Multiple changes simply keep setting that flag and eventually the morphic cycle reaches the "everybody what wants to, update!" phase. I know there are plenty of people that know the details better than me, so I'll let them explain more... tim -- tim Rowledge; tim at rowledge.org; http://www.rowledge.org/tim The downside of being better than everyone else is that people tend to assume you're pretentious From Christoph.Thiede at student.hpi.uni-potsdam.de Sun Oct 25 21:03:13 2020 From: Christoph.Thiede at student.hpi.uni-potsdam.de (Thiede, Christoph) Date: Sun, 25 Oct 2020 21:03:13 +0000 Subject: [squeak-dev] The Inbox: WebClient-Core-ct.126.mcz In-Reply-To: References: <2532b37139184eb6b0ecf3f288081b61@student.hpi.uni-potsdam.de> <0B67EEA2-2AC1-4156-A8D8-56C192B48EF6@gmx.de> <80f7baf3a0eb4d3685d8aea6f12aef5c@student.hpi.uni-potsdam.de> <11383fd575bc4eaeb8d2dec513a190bc@student.hpi.uni-potsdam.de>, Message-ID: <8159c070274b4ec2a20469c278fa3cff@student.hpi.uni-potsdam.de> Hi Tobias, sorry for the long delay. I was on holiday a few days and did not manage to return earlier to this interesting topic ... > No thats wrong. Curl will only send auth data if you provide it. > Doing "curl -u user:pw" is the same as using WebClient httpGet:do: and adding the Authorization header manually > The point is, you instruct Curl to _provide credentials unconditionally_. I think this is exactly the point. "curl -u user:pw" reads as "Download a resource, 'specify[ing] the user name and password to use for server authentication"' (cited from the man). If I do WebClient httpDo: [:client | client username: 'user'; password: 'pw'; get: 'https://example.com/rest/whoami'], this reads exactly the same for me. Otherwise, #username: and #password: better might be renamed into #optionalUsername/#lazyUsername/#usernameIfAsked etc. Apart from this, I have tested the behavior for Pharo, too, where the default web client is ZnClient: And it works like curl, too, rather than like our WebClient, i.e. the following works without any extra low-level instructions: ZnClient new url: 'https://api.github.com/repos/LinqLover/openHAB-configuration/zipball/master'; username: 'LinqLover' password: 'mytoken'; downloadTo: 'foo.zip' > So you always know beforehand which resources need authentication? > Neat, I dont :D I suppose we are having different use cases in mind: You are thinking of a generic browser application while I am thinking of a specific API client implementation. Is this correct? If I'm developing a REST API client, I do have to know whether a resource requires authentication or whether it doesn't. This is usually specified in the API documentation. Why add another level of uncertainty by using this trial-and-error strategy? In the context of my Metacello PR, the problem is that following your approach of specifying the Authorization header would mess up all the different layers of abstraction that are not aware of web client implementations and headers but only of a URL and a username/password pair. I had hoped that I could pass a constant string 'Basic' to the Authorization header for all cases where the WebClient is invoked, but unfortunately, GitHub does not understand this either, the header must contain the password even in the first run. It would lead to some portion on unhandsome spaghetti code if I had to implement an edge case for GitHub in the relevant method (MetacelloSqueakPlatform class >> #downloadZipArchive:to:username:pass:); for this reason, I would find it really helpful to turn on preAuth at this place. Do you dislike this feature in general, even when turned off by default? I'm not even requiring to make this an opt-out feature, this inbox version only implements it as an opt-in. Best, Christoph ________________________________ Von: Squeak-dev im Auftrag von Tobias Pape Gesendet: Dienstag, 13. Oktober 2020 10:04:23 An: The general-purpose Squeak developers list Betreff: Re: [squeak-dev] The Inbox: WebClient-Core-ct.126.mcz Hi > On 12.10.2020, at 23:42, Thiede, Christoph wrote: > > Hi Tobias, > > okay, I see this authorization pattern now, so you mentioned two ways to work around the current limitations: > First, by GETting https://api.github.com/authorizations before, or second, by passing the Authorization header manually. > Is this correct? Yes. However, the second one is the one GitHub "recommends" > > However, both of these approaches lack of the RESTful-typical simplicity of "making a single HTTP request without dealing with complex call protocols or low-level connectivity code". To give an illustration of my use case, please see this PR on Metacello: https://github.com/Metacello/metacello/pull/534 > IMHO it would be a shame if you could not access a popular REST API like api.github.com in Squeak using a single message send to the WebClient/WebSocket class. There is no such thing as simplicity when a REST-Based resource-provider supports both authenticated and unauthenticated access. If you cannot know beforehand, no single-request stuff is gonna help. No dice. > > > > Why not? > > > > It leaks credentials unnecessarily. > > Ah, good point! But this pattern (EAFP for web connections) is not really state of the art, is it? As mentioned, curl, for example, sends the authentication data in the very first request, which is a tool I would tend to *call* state of the art. No thats wrong. Curl will only send auth data if you provide it. Doing "curl -u user:pw" is the same as using WebClient httpGet:do: and adding the Authorization header manually The sequence is split manually: ``` $ curl https://api.github.com/repos/krono/debug/zipball/master { "message": "Not Found", "documentation_url": "https://docs.github.com/rest/reference/repos#download-a-repository-archive" } # Well, I'm left to guess. Maybe exists, maybe not. $ curl -u krono https://api.github.com/repos/krono/debug/zipball/master ``` (In this case, I can't even show what's going on as I use 2FA, which makes single-request REST to _never_ work on private repos.) The point is, you instruct Curl to _provide credentials unconditionally_. The "heavy lifting" of finding out when to do that is not done by curl but by users of curl. Look: ``` $ curl http://www.hpi.uni-potsdam.de/hirschfeld/squeaksource/xpaware/ $ # Well, no response? $ curl -v http://www.hpi.uni-potsdam.de/hirschfeld/squeaksource/xpaware/ * Trying 2001:638:807:204::8d59:e178... * TCP_NODELAY set * Connected to www.hpi.uni-potsdam.de (2001:638:807:204::8d59:e178) port 80 (#0) > GET /hirschfeld/squeaksource/xpaware/ HTTP/1.1 > Host: www.hpi.uni-potsdam.de > User-Agent: curl/7.54.0 > Accept: */* > < HTTP/1.1 401 < Date: Tue, 13 Oct 2020 07:43:04 GMT < Server: nginx/1.14.2 < Content-Length: 0 < WWW-Authenticate: Basic realm="SwaSource - XP aware" < * Connection #0 to host www.hpi.uni-potsdam.de left intact ``` Thats the 401 we're looking for. We have found that the resource needs authentication. Sidenote: Curl can do the roundtrip (man curl, search anyauth): ``` $ curl -u topa --anyauth -v http://www.hpi.uni-potsdam.de/hirschfeld/squeaksource/xpaware/ Enter host password for user 'topa': * Trying 2001:638:807:204::8d59:e178... * TCP_NODELAY set * Connected to www.hpi.uni-potsdam.de (2001:638:807:204::8d59:e178) port 80 (#0) > GET /hirschfeld/squeaksource/xpaware/ HTTP/1.1 > Host: www.hpi.uni-potsdam.de > User-Agent: curl/7.54.0 > Accept: */* > < HTTP/1.1 401 < Date: Tue, 13 Oct 2020 07:46:05 GMT < Server: nginx/1.14.2 < Content-Length: 0 < WWW-Authenticate: Basic realm="SwaSource - XP aware" < * Connection #0 to host www.hpi.uni-potsdam.de left intact * Issue another request to this URL: 'http://www.hpi.uni-potsdam.de/hirschfeld/squeaksource/xpaware/' * Found bundle for host www.hpi.uni-potsdam.de: 0x7fb8c8c0b1b0 [can pipeline] * Re-using existing connection! (#0) with host www.hpi.uni-potsdam.de * Connected to www.hpi.uni-potsdam.de (2001:638:807:204::8d59:e178) port 80 (#0) * Server auth using Basic with user 'topa' > GET /hirschfeld/squeaksource/xpaware/ HTTP/1.1 > Host: www.hpi.uni-potsdam.de > Authorization: Basic ******************* > User-Agent: curl/7.54.0 > Accept: */* > < HTTP/1.1 200 < Date: Tue, 13 Oct 2020 07:46:05 GMT < Server: nginx/1.14.2 < Content-Type: text/html < Content-Length: 15131 < Vary: Accept-Encoding ``` And in this case it does _not_ send auth in the first request but only in the second. Sidenote2: If the first request comes back 200, no second one is issued, no credentials leak: ``` $ curl -u topa --anyauth -v http://www.hpi.uni-potsdam.de/hirschfeld/squeaksource/xpforums/ Enter host password for user 'topa': * Trying 2001:638:807:204::8d59:e178... * TCP_NODELAY set * Connected to www.hpi.uni-potsdam.de (2001:638:807:204::8d59:e178) port 80 (#0) > GET /hirschfeld/squeaksource/xpforums/ HTTP/1.1 > Host: www.hpi.uni-potsdam.de > User-Agent: curl/7.54.0 > Accept: */* > < HTTP/1.1 200 < Date: Tue, 13 Oct 2020 07:46:56 GMT < Server: nginx/1.14.2 < Content-Type: text/html < Content-Length: 75860 < Vary: Accept-Encoding ``` > And speed is another point, given the fact that internet connections in Squeak are really slow ... > Why do you call this behavior a leak? The application developer will not pass authentication data to the web client unless they expect the server to consume these data anyway. So you always know beforehand which resources need authentication? Neat, I dont :D > If you deem it necessary, we could turn off the pre-authentication as soon as the client was redirected to another server ... What happens here is that we're bending over backwards because github decided to be a bad player. I mean, on most sited you visit in browsers, no auth data is sent _unless_ you are asked to (redirect to a login) or you _explicitely_ click on a login link. If you want preemtive auth, do it with WebClient httpGet:do:. > > > I understand that the method is maybe not the most common style, but I think that functional changes should in such cases not be mixed with style changes. > > Alright, please see WebClient-Core-ct.128. But maybe we should consider to use prettyDiff for the mailing list notifications as a default? Just an idea. I personally find prettydiffs useless, but that's just me. Best regards -Tobias -------------- next part -------------- An HTML attachment was scrubbed... URL: From Das.Linux at gmx.de Sun Oct 25 21:19:49 2020 From: Das.Linux at gmx.de (Tobias Pape) Date: Sun, 25 Oct 2020 22:19:49 +0100 Subject: [squeak-dev] The Inbox: WebClient-Core-ct.126.mcz In-Reply-To: <8159c070274b4ec2a20469c278fa3cff@student.hpi.uni-potsdam.de> References: <2532b37139184eb6b0ecf3f288081b61@student.hpi.uni-potsdam.de> <0B67EEA2-2AC1-4156-A8D8-56C192B48EF6@gmx.de> <80f7baf3a0eb4d3685d8aea6f12aef5c@student.hpi.uni-potsdam.de> <11383fd575bc4eaeb8d2dec513a190bc@student.hpi.uni-potsdam.de> <8159c070274b4ec2a20469c278fa3cff@student.hpi.uni-potsdam.de> Message-ID: <163C8A17-6F6B-4EBF-B7A1-7082ED8A63BD@gmx.de> Hi > On 25.10.2020, at 22:03, Thiede, Christoph wrote: > > Hi Tobias, > > sorry for the long delay. I was on holiday a few days and did not manage to return earlier to this interesting topic ... > > > > No thats wrong. Curl will only send auth data if you provide it. > > > Doing "curl -u user:pw" is the same as using WebClient httpGet:do: and adding the Authorization header manually > > > The point is, you instruct Curl to _provide credentials unconditionally_. > > I think this is exactly the point. "curl -u user:pw" reads as "Download a resource, 'specify[ing] the user name and password to use for server authentication"' (cited from the man). Yes, that means _unconditionally_, even if the source does not need it. This is called an information leak. > If I do > WebClient httpDo: [:client | client username: 'user'; password: 'pw'; get: 'https://example.com/rest/whoami'], > this reads exactly the same for me. Otherwise, #username: and #password: better might be renamed into #optionalUsername/#lazyUsername/#usernameIfAsked etc. > Nope. > Apart from this, I have tested the behavior for Pharo, too, where the default web client is ZnClient: And it works like curl, too, rather than like our WebClient, i.e. the following works without any extra low-level instructions: > > ZnClient new > url: 'https://api.github.com/repos/LinqLover/openHAB-configuration/zipball/master'; > username: 'LinqLover' password: 'mytoken'; > downloadTo: 'foo.zip' > > > So you always know beforehand which resources need authentication? > > Neat, I dont :D > > I suppose we are having different use cases in mind: You are thinking of a generic browser application while I am thinking of a specific API client implementation. Is this correct? No. The API should stick to the HTTP RFCs and use 401 to say: You need authentication. > If I'm developing a REST API client, I do have to know whether a resource requires authentication or whether it doesn't. This is usually specified in the API documentation. Why add another level of uncertainty by using this trial-and-error strategy? Because preemtive auth is wrong. Sadly you omitted the anyauth stuff that actually works how Authentication in HTTP is spec'ed. Yes, it is "one request more". Yes, it is right thing to do. Just because it is convenient and just because people are doing it, it does not mean it is good. In fact, the whole "curl as API-consumer" is fine, but sticking "-u" to each and every request is a security nightmare just second to "curl ... | sudo bash". > > > In the context of my Metacello PR, the problem is that following your approach of specifying the Authorization header would mess up all the different layers of abstraction that are not aware of web client implementations and headers but only of a URL and a username/password pair. I had hoped that I could pass a constant string 'Basic' to the Authorization header for all cases where the WebClient is invoked, but unfortunately, GitHub does not understand this either, the header must contain the password even in the first run. Except when you use "https://api.github.com/authorizations" first, which 401s. > It would lead to some portion on unhandsome spaghetti code if I had to implement an edge case for GitHub in the relevant method (MetacelloSqueakPlatform class >> #downloadZipArchive:to:username:pass:); for this reason, I would find it really helpful to turn on preAuth at this place. > Do you dislike this feature in general, even when turned off by default? Yes. WebClient is not just an API-consumer. It ought to be safe. Otherwise, encode it in the URL? > I'm not even requiring to make this an opt-out feature, this inbox version only implements it as an opt-in. I don't know. I think there has been too little input from others here. Don't rely on just my "judgement" ;) Best regards -Tobias > > Best, > Christoph > > Von: Squeak-dev im Auftrag von Tobias Pape > Gesendet: Dienstag, 13. Oktober 2020 10:04:23 > An: The general-purpose Squeak developers list > Betreff: Re: [squeak-dev] The Inbox: WebClient-Core-ct.126.mcz > > Hi > > > On 12.10.2020, at 23:42, Thiede, Christoph wrote: > > > > Hi Tobias, > > > > okay, I see this authorization pattern now, so you mentioned two ways to work around the current limitations: > > First, by GETting https://api.github.com/authorizations before, or second, by passing the Authorization header manually. > > Is this correct? > > Yes. However, the second one is the one GitHub "recommends" > > > > > > However, both of these approaches lack of the RESTful-typical simplicity of "making a single HTTP request without dealing with complex call protocols or low-level connectivity code". To give an illustration of my use case, please see this PR on Metacello:https://github.com/Metacello/metacello/pull/534 > > IMHO it would be a shame if you could not access a popular REST API like api.github.com in Squeak using a single message send to the WebClient/WebSocket class. > > There is no such thing as simplicity when a REST-Based resource-provider supports both authenticated and unauthenticated access. > If you cannot know beforehand, no single-request stuff is gonna help. No dice. > > > > > > > > Why not? > > > > > > It leaks credentials unnecessarily. > > > > Ah, good point! But this pattern (EAFP for web connections) is not really state of the art, is it? As mentioned, curl, for example, sends the authentication data in the very first request, which is a tool I would tend to *call* state of the art. > > No thats wrong. Curl will only send auth data if you provide it. > > Doing "curl -u user:pw" is the same as using WebClient httpGet:do: and adding the Authorization header manually > > > The sequence is split manually: > ``` > $ curl https://api.github.com/repos/krono/debug/zipball/master > { > "message": "Not Found", > "documentation_url": "https://docs.github.com/rest/reference/repos#download-a-repository-archive" > } > # Well, I'm left to guess. Maybe exists, maybe not. > $ curl -u krono https://api.github.com/repos/krono/debug/zipball/master > > ``` > (In this case, I can't even show what's going on as I use 2FA, which makes single-request REST to _never_ work on private repos.) > > The point is, you instruct Curl to _provide credentials unconditionally_. > The "heavy lifting" of finding out when to do that is not done by curl but by users of curl. > > Look: > > ``` > $ curl http://www.hpi.uni-potsdam.de/hirschfeld/squeaksource/xpaware/ > $ > # Well, no response? > $ curl -v http://www.hpi.uni-potsdam.de/hirschfeld/squeaksource/xpaware/ > * Trying 2001:638:807:204::8d59:e178... > * TCP_NODELAY set > * Connected to www.hpi.uni-potsdam.de (2001:638:807:204::8d59:e178) port 80 (#0) > > GET /hirschfeld/squeaksource/xpaware/ HTTP/1.1 > > Host: www.hpi.uni-potsdam.de > > User-Agent: curl/7.54.0 > > Accept: */* > > > < HTTP/1.1 401 > < Date: Tue, 13 Oct 2020 07:43:04 GMT > < Server: nginx/1.14.2 > < Content-Length: 0 > < WWW-Authenticate: Basic realm="SwaSource - XP aware" > < > * Connection #0 to host www.hpi.uni-potsdam.de left intact > ``` > > Thats the 401 we're looking for. We have found that the resource needs authentication. > > Sidenote: Curl can do the roundtrip (man curl, search anyauth): > > ``` > $ curl -u topa --anyauth -v http://www.hpi.uni-potsdam.de/hirschfeld/squeaksource/xpaware/ > Enter host password for user 'topa': > * Trying 2001:638:807:204::8d59:e178... > * TCP_NODELAY set > * Connected to www.hpi.uni-potsdam.de (2001:638:807:204::8d59:e178) port 80 (#0) > > GET /hirschfeld/squeaksource/xpaware/ HTTP/1.1 > > Host: www.hpi.uni-potsdam.de > > User-Agent: curl/7.54.0 > > Accept: */* > > > < HTTP/1.1 401 > < Date: Tue, 13 Oct 2020 07:46:05 GMT > < Server: nginx/1.14.2 > < Content-Length: 0 > < WWW-Authenticate: Basic realm="SwaSource - XP aware" > < > * Connection #0 to host www.hpi.uni-potsdam.de left intact > * Issue another request to this URL: 'http://www.hpi.uni-potsdam.de/hirschfeld/squeaksource/xpaware/' > * Found bundle for host www.hpi.uni-potsdam.de: 0x7fb8c8c0b1b0 [can pipeline] > * Re-using existing connection! (#0) with host www.hpi.uni-potsdam.de > * Connected to www.hpi.uni-potsdam.de (2001:638:807:204::8d59:e178) port 80 (#0) > * Server auth using Basic with user 'topa' > > GET /hirschfeld/squeaksource/xpaware/ HTTP/1.1 > > Host: www.hpi.uni-potsdam.de > > Authorization: Basic ******************* > > User-Agent: curl/7.54.0 > > Accept: */* > > > < HTTP/1.1 200 > < Date: Tue, 13 Oct 2020 07:46:05 GMT > < Server: nginx/1.14.2 > < Content-Type: text/html > < Content-Length: 15131 > < Vary: Accept-Encoding > ``` > > And in this case it does _not_ send auth in the first request but only in the second. > > Sidenote2: If the first request comes back 200, no second one is issued, no credentials leak: > > ``` > $ curl -u topa --anyauth -v http://www.hpi.uni-potsdam.de/hirschfeld/squeaksource/xpforums/ > Enter host password for user 'topa': > * Trying 2001:638:807:204::8d59:e178... > * TCP_NODELAY set > * Connected to www.hpi.uni-potsdam.de (2001:638:807:204::8d59:e178) port 80 (#0) > > GET /hirschfeld/squeaksource/xpforums/ HTTP/1.1 > > Host: www.hpi.uni-potsdam.de > > User-Agent: curl/7.54.0 > > Accept: */* > > > < HTTP/1.1 200 > < Date: Tue, 13 Oct 2020 07:46:56 GMT > < Server: nginx/1.14.2 > < Content-Type: text/html > < Content-Length: 75860 > < Vary: Accept-Encoding > ``` > > > > > > > And speed is another point, given the fact that internet connections in Squeak are really slow ... > > Why do you call this behavior a leak? The application developer will not pass authentication data to the web client unless they expect the server to consume these data anyway. > > So you always know beforehand which resources need authentication? > Neat, I dont :D > > > If you deem it necessary, we could turn off the pre-authentication as soon as the client was redirected to another server ... > > What happens here is that we're bending over backwards because github decided to be a bad player. > > I mean, on most sited you visit in browsers, no auth data is sent _unless_ you are asked to (redirect to a login) or you _explicitely_ click on a login link. > > If you want preemtive auth, do it with WebClient httpGet:do:. > > > > > > > > I understand that the method is maybe not the most common style, but I think that functional changes should in such cases not be mixed with style changes. > > > > Alright, please see WebClient-Core-ct.128. But maybe we should consider to use prettyDiff for the mailing list notifications as a default? Just an idea. > > I personally find prettydiffs useless, but that's just me. > > Best regards > -Tobias From Christoph.Thiede at student.hpi.uni-potsdam.de Sun Oct 25 22:00:03 2020 From: Christoph.Thiede at student.hpi.uni-potsdam.de (Thiede, Christoph) Date: Sun, 25 Oct 2020 22:00:03 +0000 Subject: [squeak-dev] The Inbox: WebClient-Core-ct.126.mcz In-Reply-To: <163C8A17-6F6B-4EBF-B7A1-7082ED8A63BD@gmx.de> References: <2532b37139184eb6b0ecf3f288081b61@student.hpi.uni-potsdam.de> <0B67EEA2-2AC1-4156-A8D8-56C192B48EF6@gmx.de> <80f7baf3a0eb4d3685d8aea6f12aef5c@student.hpi.uni-potsdam.de> <11383fd575bc4eaeb8d2dec513a190bc@student.hpi.uni-potsdam.de> <8159c070274b4ec2a20469c278fa3cff@student.hpi.uni-potsdam.de>, <163C8A17-6F6B-4EBF-B7A1-7082ED8A63BD@gmx.de> Message-ID: <0ab25f63845546d4ba87ac0f2c454b48@student.hpi.uni-potsdam.de> Hi Tobias, > The API should stick to the HTTP RFCs and use 401 to say: You need authentication. Hm, but this would be an information leak on the server-side. :-) > Sadly you omitted the anyauth stuff that actually works how Authentication in HTTP is spec'ed. Sorry about that. Still, even in curl, anyauth is an opt-in feature, not an opt-out. So my proposal for adding #preAuthenticationMethod as an opt-in feature would be equivalent to adding an #anyAuth property as an opt-out. Why should WebClient be less powerful than curl? I see it can be abused, but Squeak already contains a lot of dangerous protocols that still can be useful in particular situations. Just insert a warning into the method comment and it'll be OK I think. > Except when you use "https://api.github.com/authorizations" first, which 401s. True; but still, this would require either a change in the design or an edge-case implementation because the WebClient connection logic is not aware of whether GitHub or BitBucket or whatever else should be contacted. > Otherwise, encode it in the URL? Do you mean like http://username:password at www.example.com? At the moment, WebClient is not treating this differently than WebClient >> #username and #password. Is this the correct behavior? curl, again, uses preauth in this situation, and Pharo does this, too. Unfortunately, I could not find a clear answer to this question in RFC1738 ... > Don't rely on just my "judgement" ;) Your arguments are highly appreciated! I'm just trying to figure out your motivations ... Yepp, some >=3rd opinions would be a good thing. :-) Best, Christoph ________________________________ Von: Squeak-dev im Auftrag von Tobias Pape Gesendet: Sonntag, 25. Oktober 2020 22:19:49 An: The general-purpose Squeak developers list Betreff: Re: [squeak-dev] The Inbox: WebClient-Core-ct.126.mcz Hi > On 25.10.2020, at 22:03, Thiede, Christoph wrote: > > Hi Tobias, > > sorry for the long delay. I was on holiday a few days and did not manage to return earlier to this interesting topic ... > > > > No thats wrong. Curl will only send auth data if you provide it. > > > Doing "curl -u user:pw" is the same as using WebClient httpGet:do: and adding the Authorization header manually > > > The point is, you instruct Curl to _provide credentials unconditionally_. > > I think this is exactly the point. "curl -u user:pw" reads as "Download a resource, 'specify[ing] the user name and password to use for server authentication"' (cited from the man). Yes, that means _unconditionally_, even if the source does not need it. This is called an information leak. > If I do > WebClient httpDo: [:client | client username: 'user'; password: 'pw'; get: 'https://example.com/rest/whoami'], > this reads exactly the same for me. Otherwise, #username: and #password: better might be renamed into #optionalUsername/#lazyUsername/#usernameIfAsked etc. > Nope. > Apart from this, I have tested the behavior for Pharo, too, where the default web client is ZnClient: And it works like curl, too, rather than like our WebClient, i.e. the following works without any extra low-level instructions: > > ZnClient new > url: 'https://api.github.com/repos/LinqLover/openHAB-configuration/zipball/master'; > username: 'LinqLover' password: 'mytoken'; > downloadTo: 'foo.zip' > > > So you always know beforehand which resources need authentication? > > Neat, I dont :D > > I suppose we are having different use cases in mind: You are thinking of a generic browser application while I am thinking of a specific API client implementation. Is this correct? No. The API should stick to the HTTP RFCs and use 401 to say: You need authentication. > If I'm developing a REST API client, I do have to know whether a resource requires authentication or whether it doesn't. This is usually specified in the API documentation. Why add another level of uncertainty by using this trial-and-error strategy? Because preemtive auth is wrong. Sadly you omitted the anyauth stuff that actually works how Authentication in HTTP is spec'ed. Yes, it is "one request more". Yes, it is right thing to do. Just because it is convenient and just because people are doing it, it does not mean it is good. In fact, the whole "curl as API-consumer" is fine, but sticking "-u" to each and every request is a security nightmare just second to "curl ... | sudo bash". > > > In the context of my Metacello PR, the problem is that following your approach of specifying the Authorization header would mess up all the different layers of abstraction that are not aware of web client implementations and headers but only of a URL and a username/password pair. I had hoped that I could pass a constant string 'Basic' to the Authorization header for all cases where the WebClient is invoked, but unfortunately, GitHub does not understand this either, the header must contain the password even in the first run. Except when you use "https://api.github.com/authorizations" first, which 401s. > It would lead to some portion on unhandsome spaghetti code if I had to implement an edge case for GitHub in the relevant method (MetacelloSqueakPlatform class >> #downloadZipArchive:to:username:pass:); for this reason, I would find it really helpful to turn on preAuth at this place. > Do you dislike this feature in general, even when turned off by default? Yes. WebClient is not just an API-consumer. It ought to be safe. Otherwise, encode it in the URL? > I'm not even requiring to make this an opt-out feature, this inbox version only implements it as an opt-in. I don't know. I think there has been too little input from others here. Don't rely on just my "judgement" ;) Best regards -Tobias > > Best, > Christoph > > Von: Squeak-dev im Auftrag von Tobias Pape > Gesendet: Dienstag, 13. Oktober 2020 10:04:23 > An: The general-purpose Squeak developers list > Betreff: Re: [squeak-dev] The Inbox: WebClient-Core-ct.126.mcz > > Hi > > > On 12.10.2020, at 23:42, Thiede, Christoph wrote: > > > > Hi Tobias, > > > > okay, I see this authorization pattern now, so you mentioned two ways to work around the current limitations: > > First, by GETting https://api.github.com/authorizations before, or second, by passing the Authorization header manually. > > Is this correct? > > Yes. However, the second one is the one GitHub "recommends" > > > > > > However, both of these approaches lack of the RESTful-typical simplicity of "making a single HTTP request without dealing with complex call protocols or low-level connectivity code". To give an illustration of my use case, please see this PR on Metacello:https://github.com/Metacello/metacello/pull/534 > > IMHO it would be a shame if you could not access a popular REST API like api.github.com in Squeak using a single message send to the WebClient/WebSocket class. > > There is no such thing as simplicity when a REST-Based resource-provider supports both authenticated and unauthenticated access. > If you cannot know beforehand, no single-request stuff is gonna help. No dice. > > > > > > > > Why not? > > > > > > It leaks credentials unnecessarily. > > > > Ah, good point! But this pattern (EAFP for web connections) is not really state of the art, is it? As mentioned, curl, for example, sends the authentication data in the very first request, which is a tool I would tend to *call* state of the art. > > No thats wrong. Curl will only send auth data if you provide it. > > Doing "curl -u user:pw" is the same as using WebClient httpGet:do: and adding the Authorization header manually > > > The sequence is split manually: > ``` > $ curl https://api.github.com/repos/krono/debug/zipball/master > { > "message": "Not Found", > "documentation_url": "https://docs.github.com/rest/reference/repos#download-a-repository-archive" > } > # Well, I'm left to guess. Maybe exists, maybe not. > $ curl -u krono https://api.github.com/repos/krono/debug/zipball/master > > ``` > (In this case, I can't even show what's going on as I use 2FA, which makes single-request REST to _never_ work on private repos.) > > The point is, you instruct Curl to _provide credentials unconditionally_. > The "heavy lifting" of finding out when to do that is not done by curl but by users of curl. > > Look: > > ``` > $ curl http://www.hpi.uni-potsdam.de/hirschfeld/squeaksource/xpaware/ > $ > # Well, no response? > $ curl -v http://www.hpi.uni-potsdam.de/hirschfeld/squeaksource/xpaware/ > * Trying 2001:638:807:204::8d59:e178... > * TCP_NODELAY set > * Connected to www.hpi.uni-potsdam.de (2001:638:807:204::8d59:e178) port 80 (#0) > > GET /hirschfeld/squeaksource/xpaware/ HTTP/1.1 > > Host: www.hpi.uni-potsdam.de > > User-Agent: curl/7.54.0 > > Accept: */* > > > < HTTP/1.1 401 > < Date: Tue, 13 Oct 2020 07:43:04 GMT > < Server: nginx/1.14.2 > < Content-Length: 0 > < WWW-Authenticate: Basic realm="SwaSource - XP aware" > < > * Connection #0 to host www.hpi.uni-potsdam.de left intact > ``` > > Thats the 401 we're looking for. We have found that the resource needs authentication. > > Sidenote: Curl can do the roundtrip (man curl, search anyauth): > > ``` > $ curl -u topa --anyauth -v http://www.hpi.uni-potsdam.de/hirschfeld/squeaksource/xpaware/ > Enter host password for user 'topa': > * Trying 2001:638:807:204::8d59:e178... > * TCP_NODELAY set > * Connected to www.hpi.uni-potsdam.de (2001:638:807:204::8d59:e178) port 80 (#0) > > GET /hirschfeld/squeaksource/xpaware/ HTTP/1.1 > > Host: www.hpi.uni-potsdam.de > > User-Agent: curl/7.54.0 > > Accept: */* > > > < HTTP/1.1 401 > < Date: Tue, 13 Oct 2020 07:46:05 GMT > < Server: nginx/1.14.2 > < Content-Length: 0 > < WWW-Authenticate: Basic realm="SwaSource - XP aware" > < > * Connection #0 to host www.hpi.uni-potsdam.de left intact > * Issue another request to this URL: 'http://www.hpi.uni-potsdam.de/hirschfeld/squeaksource/xpaware/' > * Found bundle for host www.hpi.uni-potsdam.de: 0x7fb8c8c0b1b0 [can pipeline] > * Re-using existing connection! (#0) with host www.hpi.uni-potsdam.de > * Connected to www.hpi.uni-potsdam.de (2001:638:807:204::8d59:e178) port 80 (#0) > * Server auth using Basic with user 'topa' > > GET /hirschfeld/squeaksource/xpaware/ HTTP/1.1 > > Host: www.hpi.uni-potsdam.de > > Authorization: Basic ******************* > > User-Agent: curl/7.54.0 > > Accept: */* > > > < HTTP/1.1 200 > < Date: Tue, 13 Oct 2020 07:46:05 GMT > < Server: nginx/1.14.2 > < Content-Type: text/html > < Content-Length: 15131 > < Vary: Accept-Encoding > ``` > > And in this case it does _not_ send auth in the first request but only in the second. > > Sidenote2: If the first request comes back 200, no second one is issued, no credentials leak: > > ``` > $ curl -u topa --anyauth -v http://www.hpi.uni-potsdam.de/hirschfeld/squeaksource/xpforums/ > Enter host password for user 'topa': > * Trying 2001:638:807:204::8d59:e178... > * TCP_NODELAY set > * Connected to www.hpi.uni-potsdam.de (2001:638:807:204::8d59:e178) port 80 (#0) > > GET /hirschfeld/squeaksource/xpforums/ HTTP/1.1 > > Host: www.hpi.uni-potsdam.de > > User-Agent: curl/7.54.0 > > Accept: */* > > > < HTTP/1.1 200 > < Date: Tue, 13 Oct 2020 07:46:56 GMT > < Server: nginx/1.14.2 > < Content-Type: text/html > < Content-Length: 75860 > < Vary: Accept-Encoding > ``` > > > > > > > And speed is another point, given the fact that internet connections in Squeak are really slow ... > > Why do you call this behavior a leak? The application developer will not pass authentication data to the web client unless they expect the server to consume these data anyway. > > So you always know beforehand which resources need authentication? > Neat, I dont :D > > > If you deem it necessary, we could turn off the pre-authentication as soon as the client was redirected to another server ... > > What happens here is that we're bending over backwards because github decided to be a bad player. > > I mean, on most sited you visit in browsers, no auth data is sent _unless_ you are asked to (redirect to a login) or you _explicitely_ click on a login link. > > If you want preemtive auth, do it with WebClient httpGet:do:. > > > > > > > > I understand that the method is maybe not the most common style, but I think that functional changes should in such cases not be mixed with style changes. > > > > Alright, please see WebClient-Core-ct.128. But maybe we should consider to use prettyDiff for the mailing list notifications as a default? Just an idea. > > I personally find prettydiffs useless, but that's just me. > > Best regards > -Tobias -------------- next part -------------- An HTML attachment was scrubbed... URL: From tim at rowledge.org Sun Oct 25 23:52:13 2020 From: tim at rowledge.org (tim Rowledge) Date: Sun, 25 Oct 2020 16:52:13 -0700 Subject: [squeak-dev] Improving the SystemNavigation browseMessageList... stuff In-Reply-To: <655d8bdd3c6b47d0b0f2fe57f65b8147@student.hpi.uni-potsdam.de> References: <6A70A9A6-A1D2-4402-84A5-AD39DB02FD03@rowledge.org> <1603021617930-0.post@n4.nabble.com> <0FA3FBB0-E579-480C-9568-EBAD0C65E057@rowledge.org> <655d8bdd3c6b47d0b0f2fe57f65b8147@student.hpi.uni-potsdam.de> Message-ID: <74BB0DEF-0774-4717-A296-400A6755AFA6@rowledge.org> > On 2020-10-24, at 12:13 PM, Thiede, Christoph wrote: > > Hi Tim, > > some scattered comments on your changes: It's a great idea to refactor this windowTitle stuff! > > Personally, I think it would look nicer if you could leave out the spaces between the brackets, e.g. "Implementors of initialize [987]" instead of "Implementors of initialize [ 987 ]". No argument there. > > Not a regression, but still a bug: Select 42 in some method in a MessageTrace and browse senders -> Error: Instances of SmallInteger are not indexable from #findAgainNow. Is this related to your changes? No, but certainly a bug. It's related to - I suspect - the problem I noticed in MessageTrace>>#getImplementorNamed: where we find that occasionally the parameter 'selectorSymbol' is actually a Character. Which is indeed not indexable. *That* seems to stem from TextEditor>>implementorsOfIt where we see that we are using ``` self selectedLiteral ifNotNil: [:aLiteral| ^self model browseAllImplementorsOf: aLiteral]. ``` ( a change tagged by Marcel about 6 months ago) and in this case aLiteral is the Character [ It's possible the code finding the literal is not working right. It's possible the concept is faulty - should it even try to find all the 'implementors' of something like $[ ? One of my changes 'fixes' at least part of the problem but I couldn't replicate your exact case. > > > Possibly better to do asOrderedCollection sort ? > > Sounds reasonable. Yeah, it works and reads better. > > > Now, about that improvement to the Shout stuff... > > Your ideas sound interesting. We have collected so many ideas on what Shout/attributes could do else (ShoutAttribute, highlight searched text, and here are some other rough ideas: > highlight all occurrences of the currently selected word/selector as you may know it from VS Code; No. Absolutely no. Nope. Nopetty nope with nope-sauce on top. I've encountered this in the horrific code editor used by WordPress and it is *horrible*. It's also an poorly bounded expense of time. I mean seriously, if you are editing a megabyte file and select 'e' wold it realyl make any sense at all to search out and highlight every damn 'e' ? Madness. Typical 'UI cleverness' from microsoft, the people that wouldn't know a good UI if it bit them on the cerebral cortex. > automatically style hyperlinks with a TextURL (ask Tom Beckmann for more details on this idea) or class names with a TextLink; a text attribute that adds a tooltip to a certain subtext; allow to browse a word by Ctrl + clicking it, probably again via a text attribute; ...). This is essentially the data parsing and marking stuff that is used in (amongst others) Apple Mail and can be used to do 'useful things' like spotting a likely appointment to add to your calendar. Again, there are potential performance issues that need careful consideration and there would need to be ways to specify which things get done for each situation - I really don't want time spent on searching for appointments in source code! Also, heavily covered by patents that have been litigated and cost people serious money - I know because I worked on one or two cases. Given the lack of people screaming to not do it, I'll move a slightly updated version into the trunk and we'll see how it goes. tim -- tim Rowledge; tim at rowledge.org; http://www.rowledge.org/tim A bad random number generator: 1, 1, 1, 1, 1, 4.33e+67, 1, 1, 1 From commits at source.squeak.org Mon Oct 26 00:52:46 2020 From: commits at source.squeak.org (commits at source.squeak.org) Date: Mon, 26 Oct 2020 00:52:46 0000 Subject: [squeak-dev] The Trunk: Tools-tpr.1008.mcz Message-ID: tim Rowledge uploaded a new version of Tools to project The Trunk: http://source.squeak.org/trunk/Tools-tpr.1008.mcz ==================== Summary ==================== Name: Tools-tpr.1008 Author: tpr Time: 25 October 2020, 5:52:09.007789 pm UUID: 2ebe15ce-0c25-4b8d-b993-f1c51203dee5 Ancestors: Tools-tpr.1003, Tools-mt.1007 Rework the window label handing of MessageSet/Trace to be a bit more accurate, and to work within the normal style of labels. Instead of assuming the size of the list passed to the MessageSet/Trace is correct, derive it from the post-processing list. We process the list to remove duplicates, which e.g. the #allUnimplementedCalls method produces. This required adding an instvar to M-Set, removing one from M-Trace, setting the new one properly, dumping some dodgy code that used to half-assedly derive the old one, use the proper #changed: #windowTitle to, y'know, change the title, and some faffing with the messageList. As a result we are better placed to make further improvements if/when we develop a way to correctly hightlight multi-part keywords (or indeed, multiple messages) within a single method, which would greatly improve many browsers. This benefits from being accompanied by the single-method change in the System-tpr.1181 package =============== Diff against Tools-mt.1007 =============== Item was changed: CodeHolder subclass: #MessageSet + instanceVariableNames: 'growable messageList messageListFormatted autoSelectString messageListIndex editSelection windowLabel' - instanceVariableNames: 'growable messageList messageListFormatted autoSelectString messageListIndex editSelection' classVariableNames: 'UseUnifiedMessageLabels' poolDictionaries: '' category: 'Tools-Browser'! !MessageSet commentStamp: '' prior: 0! I represent a query path of the retrieval result of making a query about methods in the system. The result is a set of methods, denoted by a message selector and the class in which the method was found. As a StringHolder, the string I represent is the source code of the currently selected method. I am typically viewed in a Message Set Browser consisting of a MessageListView and a BrowserCodeView.! Item was changed: ----- Method: MessageSet class>>openMessageList:name:autoSelect: (in category 'instance creation') ----- openMessageList: messageList name: labelString autoSelect: autoSelectString "Open a system view for a MessageSet on messageList. + The labelString is passed to the model to use as a base label, depending on the selection state" - 1/24/96 sw: the there-are-no msg now supplied by my sender" | messageSet | messageSet := self messageList: messageList. + messageSet + autoSelectString: autoSelectString; + setInitialLabel: labelString. + ^ToolBuilder open: messageSet! - messageSet autoSelectString: autoSelectString. - ^ToolBuilder open: messageSet label: labelString! Item was changed: ----- Method: MessageSet>>adjustWindowTitleAfterFiltering (in category 'private') ----- adjustWindowTitleAfterFiltering + "Set the title of the receiver's window, if any, to reflect the just-completed filtering. Avoid re-doing it if fitering is re-done" - "Set the title of the receiver's window, if any, to reflect the just-completed filtering" + (windowLabel endsWith: 'Filtered') + ifFalse: [windowLabel := windowLabel , ' Filtered'. + self changed: #windowTitle]! - | aWindow existingLabel newLabel | - - (aWindow := self containingWindow) ifNil: [^ self]. - (existingLabel := aWindow label) isEmptyOrNil ifTrue: [^ self]. - (((existingLabel size < 3) or: [existingLabel last ~~ $]]) or: [(existingLabel at: (existingLabel size - 1)) isDigit not]) ifTrue: [^ self]. - existingLabel size to: 1 by: -1 do: - [:anIndex | ((existingLabel at: anIndex) == $[) ifTrue: - [newLabel := (existingLabel copyFrom: 1 to: anIndex), - 'Filtered: ', - messageList size printString, - ']'. - ^ aWindow setLabel: newLabel]] - - - ! Item was changed: ----- Method: MessageSet>>initializeMessageList: (in category 'private') ----- initializeMessageList: anArray "Initialize my messageList from the given list of MethodReference or string objects. NB: special handling for uniclasses. Do /not/ replace the elements of anArray if they are already MethodReferences, so as to allow users to construct richer systems, such as differencers between existing and edited versions of code." + messageList := Set new. - messageList := OrderedCollection new. anArray do: [:each | each isMethodReference + ifTrue: [messageList add: each] - ifTrue: [messageList addLast: each] ifFalse: [ MessageSet parse: each toClassAndSelector: + [ : class : sel | class ifNotNil: [ messageList add: (MethodReference class: class selector: sel) ] ] ] ]. + messageList := messageList asOrderedCollection sort. - [ : class : sel | class ifNotNil: [ messageList addLast: (MethodReference class: class selector: sel) ] ] ] ]. "Unify labels if wanted." self class useUnifiedMessageLabels ifTrue: [ messageList withIndexDo: [ : each : index | | cls | cls := each actualClass. each stringVersion: (self indentionPrefixOfSize: (self indentionsIn: each stringVersion)) , (cls ifNil: [each asString] ifNotNil: [cls isUniClass ifTrue: [cls typicalInstanceName, ' ', each selector] ifFalse: [ cls name , ' ' , each selector , ' {' , ((cls organization categoryOfElement: each selector) ifNil: ['']) , '}' , ' {', cls category, '}' ] ]) ] ]. messageListIndex := messageList isEmpty ifTrue: [0] ifFalse: [1]. contents := String empty! Item was changed: ----- Method: MessageSet>>messageListIndex: (in category 'message list') ----- messageListIndex: anInteger + "Set the index of the selected item to be anInteger. + Update the message list morph, the text edit morph and the assorted buttons" - "Set the index of the selected item to be anInteger." messageListIndex := anInteger. contents := messageListIndex ~= 0 ifTrue: [self selectedMessage] ifFalse: ['']. self changed: #messageListIndex. "update my selection" self editSelection: #editMessage. self contentsChanged. (messageListIndex ~= 0 and: [ autoSelectString notNil and: [ self contents notEmpty ] ]) ifTrue: [ self changed: #autoSelect ]. self decorateButtons ! Item was added: + ----- Method: MessageSet>>setInitialLabel: (in category 'accessing') ----- + setInitialLabel: aString + "set the base label for the window, as returned by #windowTitle" + + windowLabel := aString! Item was added: + ----- Method: MessageSet>>windowTitle (in category 'user interface') ----- + windowTitle + "just return the basic label for now" + + ^windowLabel! Item was changed: MessageSet subclass: #MessageTrace + instanceVariableNames: 'autoSelectStrings messageSelections anchorIndex' - instanceVariableNames: 'autoSelectStrings messageSelections anchorIndex defaultSelectString' classVariableNames: '' poolDictionaries: '' category: 'Tools-Browser'! !MessageTrace commentStamp: 'cmm 3/2/2010 20:26' prior: 0! A MessageTrace is a MessageSet allowing efficient sender/implementor message following. With implementors indented below, and senders outdended above, message flow is succinctly expressed, hierarchically. My autoSelectStrings and messageSelections are Arrays of Booleans, parallel to my messageList. Each boolean indicates whether that message is selected. Each autoSelectStrings indicates which string should be highlighted in the code for each method in my messageList.! Item was changed: ----- Method: MessageTrace>>browseAllImplementorsOf: (in category 'actions') ----- browseAllImplementorsOf: selectorSymbol | selectorToBrowse | selectorToBrowse := self selection ifNil: [ selectorSymbol ] + ifNotNil: [ self getImplementorNamed: selectorSymbol asSymbol "since we can get passed literals"]. - ifNotNil: [ self getImplementorNamed: selectorSymbol ]. (self hasUnacceptedEdits or: [ Preferences traceMessages not ]) ifTrue: [ super browseAllImplementorsOf: selectorToBrowse ] ifFalse: [ self addChildMethodsNamed: selectorToBrowse ] ! Item was changed: ----- Method: MessageTrace>>initializeMessageList: (in category 'private initializing') ----- initializeMessageList: anArray - messageSelections := (Array new: anArray size withAll: false) asOrderedCollection. super initializeMessageList: anArray. + messageSelections := (Array new: messageList size withAll: false) asOrderedCollection. self messageAt: messageListIndex beSelected: true. "autoSelectStrings is initialized right after this method, in autoSelectString:" ! Item was changed: ----- Method: MessageTrace>>messageListIndex: (in category 'actions') ----- messageListIndex: anInteger + "Set the index of the selected item to be anInteger. + Find the relevant auto select string to use, do my superclass' work and update the window title" + autoSelectStrings ifNotEmpty: [ autoSelectString := anInteger = 0 + ifTrue: [ "clear the autoSelectString" + String empty ] + ifFalse: [autoSelectStrings at: anInteger] + ]. + + anInteger > 0 ifTrue: [ self + messageAt: anInteger + beSelected: true + ]. + super messageListIndex: anInteger. + self changed: #windowTitle - ifTrue: - [ defaultSelectString ifNotNil: [:default| self containingWindow setLabel: default]. - "clear the autoSelectString" - '' ] - ifFalse: - [ messageListIndex := anInteger. - "setting the window label, below, can't wait for this.." - self containingWindow setLabel: (self windowLabelAt: anInteger). - "work out the string to ask the text view to pre-select. We should do better than this; after all the debugger does" - (autoSelectStrings at: anInteger)] ]. - anInteger > 0 ifTrue: - [ self - messageAt: anInteger - beSelected: true ]. - super messageListIndex: anInteger ! Item was changed: ----- Method: MessageTrace>>windowLabelAt: (in category 'private accessing') ----- windowLabelAt: anInteger + "return a suitable window label when there is an actual list item selected; work out what it should be based upon the array of autoSelectStrings or the current selection" + ^(autoSelectStrings at: anInteger) + ifNil: [ 'Implementors of ', - | str | - defaultSelectString ifNil: - [defaultSelectString := self containingWindow label]. - ^(str := autoSelectStrings at: anInteger) - ifNil: - [ 'Implementors of ', (self class parse: self selection + toClassAndSelector: [ :class :selector | selector ]) + ] + ifNotNil: [:str| 'Senders of ', str ] - toClassAndSelector: [ :class :selector | selector ]) ] - ifNotNil: - [ 'Senders of ', str ] ! Item was added: + ----- Method: MessageTrace>>windowTitle (in category 'building') ----- + windowTitle + "set the window label to suit the selection state; + if no selection, use saved widow label and add the number of items in the messageList + if something is selected, use the relevant string provided by windowLabelAt: which considers the index" + + ^messageListIndex = 0 + ifTrue:[String streamContents: [:str| str nextPutAll: windowLabel; + space; + nextPut: $[; + nextPutAll: messageList size asString; + nextPut: $] + ] + ] + ifFalse: [self windowLabelAt: messageListIndex]! From commits at source.squeak.org Mon Oct 26 01:04:44 2020 From: commits at source.squeak.org (commits at source.squeak.org) Date: Mon, 26 Oct 2020 01:04:44 0000 Subject: [squeak-dev] The Trunk: System-tpr.1186.mcz Message-ID: tim Rowledge uploaded a new version of System to project The Trunk: http://source.squeak.org/trunk/System-tpr.1186.mcz ==================== Summary ==================== Name: System-tpr.1186 Author: tpr Time: 25 October 2020, 6:04:37.06521 pm UUID: 63e37c9d-9d2c-4164-bf71-a0452572ed62 Ancestors: System-tpr.1181, System-mt.1185 Remove the no-longer needed (mis)calculation of the window label. Accompanies Tools-tpr.1008 Hopefully this has merged correctly and won't result in chaos... =============== Diff against System-mt.1185 =============== Item was changed: ----- Method: SystemNavigation>>browseMessageList:name:autoSelect: (in category 'browse') ----- browseMessageList: messageListOrBlock name: labelString autoSelect: autoSelectString "Create and schedule a MessageSet browser on the message list. If messageListOrBlock is a block, then evaluate it to get the message list." + | messageList | - | messageList title | messageList := messageListOrBlock isBlock ifTrue: [ Cursor wait showWhile: messageListOrBlock ] ifFalse: [ messageListOrBlock ]. messageList size = 0 ifTrue: [ ^self inform: 'There are no', String cr, labelString ]. - title := messageList size > 1 - ifFalse: [ labelString ] - ifTrue: [ labelString, ' [', messageList size printString, ']' ]. ^ ToolSet browseMessageSet: messageList + name: labelString - name: title autoSelect: autoSelectString! From marcel.taeumel at hpi.de Mon Oct 26 06:09:47 2020 From: marcel.taeumel at hpi.de (Marcel Taeumel) Date: Mon, 26 Oct 2020 07:09:47 +0100 Subject: [squeak-dev] The Trunk: Tools-tpr.1008.mcz In-Reply-To: References: Message-ID: Hi Tim. Please also upload Tools-tpr.1003 to Trunk. And double-check ancestry if other packages are missing. Best, Marcel Am 26.10.2020 01:52:56 schrieb commits at source.squeak.org : tim Rowledge uploaded a new version of Tools to project The Trunk: http://source.squeak.org/trunk/Tools-tpr.1008.mcz ==================== Summary ==================== Name: Tools-tpr.1008 Author: tpr Time: 25 October 2020, 5:52:09.007789 pm UUID: 2ebe15ce-0c25-4b8d-b993-f1c51203dee5 Ancestors: Tools-tpr.1003, Tools-mt.1007 Rework the window label handing of MessageSet/Trace to be a bit more accurate, and to work within the normal style of labels. Instead of assuming the size of the list passed to the MessageSet/Trace is correct, derive it from the post-processing list. We process the list to remove duplicates, which e.g. the #allUnimplementedCalls method produces. This required adding an instvar to M-Set, removing one from M-Trace, setting the new one properly, dumping some dodgy code that used to half-assedly derive the old one, use the proper #changed: #windowTitle to, y'know, change the title, and some faffing with the messageList. As a result we are better placed to make further improvements if/when we develop a way to correctly hightlight multi-part keywords (or indeed, multiple messages) within a single method, which would greatly improve many browsers. This benefits from being accompanied by the single-method change in the System-tpr.1181 package =============== Diff against Tools-mt.1007 =============== Item was changed: CodeHolder subclass: #MessageSet + instanceVariableNames: 'growable messageList messageListFormatted autoSelectString messageListIndex editSelection windowLabel' - instanceVariableNames: 'growable messageList messageListFormatted autoSelectString messageListIndex editSelection' classVariableNames: 'UseUnifiedMessageLabels' poolDictionaries: '' category: 'Tools-Browser'! !MessageSet commentStamp: '' prior: 0! I represent a query path of the retrieval result of making a query about methods in the system. The result is a set of methods, denoted by a message selector and the class in which the method was found. As a StringHolder, the string I represent is the source code of the currently selected method. I am typically viewed in a Message Set Browser consisting of a MessageListView and a BrowserCodeView.! Item was changed: ----- Method: MessageSet class>>openMessageList:name:autoSelect: (in category 'instance creation') ----- openMessageList: messageList name: labelString autoSelect: autoSelectString "Open a system view for a MessageSet on messageList. + The labelString is passed to the model to use as a base label, depending on the selection state" - 1/24/96 sw: the there-are-no msg now supplied by my sender" | messageSet | messageSet := self messageList: messageList. + messageSet + autoSelectString: autoSelectString; + setInitialLabel: labelString. + ^ToolBuilder open: messageSet! - messageSet autoSelectString: autoSelectString. - ^ToolBuilder open: messageSet label: labelString! Item was changed: ----- Method: MessageSet>>adjustWindowTitleAfterFiltering (in category 'private') ----- adjustWindowTitleAfterFiltering + "Set the title of the receiver's window, if any, to reflect the just-completed filtering. Avoid re-doing it if fitering is re-done" - "Set the title of the receiver's window, if any, to reflect the just-completed filtering" + (windowLabel endsWith: 'Filtered') + ifFalse: [windowLabel := windowLabel , ' Filtered'. + self changed: #windowTitle]! - | aWindow existingLabel newLabel | - - (aWindow := self containingWindow) ifNil: [^ self]. - (existingLabel := aWindow label) isEmptyOrNil ifTrue: [^ self]. - (((existingLabel size - existingLabel size to: 1 by: -1 do: - [:anIndex | ((existingLabel at: anIndex) == $[) ifTrue: - [newLabel := (existingLabel copyFrom: 1 to: anIndex), - 'Filtered: ', - messageList size printString, - ']'. - ^ aWindow setLabel: newLabel]] - - - ! Item was changed: ----- Method: MessageSet>>initializeMessageList: (in category 'private') ----- initializeMessageList: anArray "Initialize my messageList from the given list of MethodReference or string objects. NB: special handling for uniclasses. Do /not/ replace the elements of anArray if they are already MethodReferences, so as to allow users to construct richer systems, such as differencers between existing and edited versions of code." + messageList := Set new. - messageList := OrderedCollection new. anArray do: [:each | each isMethodReference + ifTrue: [messageList add: each] - ifTrue: [messageList addLast: each] ifFalse: [ MessageSet parse: each toClassAndSelector: + [ : class : sel | class ifNotNil: [ messageList add: (MethodReference class: class selector: sel) ] ] ] ]. + messageList := messageList asOrderedCollection sort. - [ : class : sel | class ifNotNil: [ messageList addLast: (MethodReference class: class selector: sel) ] ] ] ]. "Unify labels if wanted." self class useUnifiedMessageLabels ifTrue: [ messageList withIndexDo: [ : each : index | | cls | cls := each actualClass. each stringVersion: (self indentionPrefixOfSize: (self indentionsIn: each stringVersion)) , (cls ifNil: [each asString] ifNotNil: [cls isUniClass ifTrue: [cls typicalInstanceName, ' ', each selector] ifFalse: [ cls name , ' ' , each selector , ' {' , ((cls organization categoryOfElement: each selector) ifNil: ['']) , '}' , ' {', cls category, '}' ] ]) ] ]. messageListIndex := messageList isEmpty ifTrue: [0] ifFalse: [1]. contents := String empty! Item was changed: ----- Method: MessageSet>>messageListIndex: (in category 'message list') ----- messageListIndex: anInteger + "Set the index of the selected item to be anInteger. + Update the message list morph, the text edit morph and the assorted buttons" - "Set the index of the selected item to be anInteger." messageListIndex := anInteger. contents := messageListIndex ~= 0 ifTrue: [self selectedMessage] ifFalse: ['']. self changed: #messageListIndex. "update my selection" self editSelection: #editMessage. self contentsChanged. (messageListIndex ~= 0 and: [ autoSelectString notNil and: [ self contents notEmpty ] ]) ifTrue: [ self changed: #autoSelect ]. self decorateButtons ! Item was added: + ----- Method: MessageSet>>setInitialLabel: (in category 'accessing') ----- + setInitialLabel: aString + "set the base label for the window, as returned by #windowTitle" + + windowLabel := aString! Item was added: + ----- Method: MessageSet>>windowTitle (in category 'user interface') ----- + windowTitle + "just return the basic label for now" + + ^windowLabel! Item was changed: MessageSet subclass: #MessageTrace + instanceVariableNames: 'autoSelectStrings messageSelections anchorIndex' - instanceVariableNames: 'autoSelectStrings messageSelections anchorIndex defaultSelectString' classVariableNames: '' poolDictionaries: '' category: 'Tools-Browser'! !MessageTrace commentStamp: 'cmm 3/2/2010 20:26' prior: 0! A MessageTrace is a MessageSet allowing efficient sender/implementor message following. With implementors indented below, and senders outdended above, message flow is succinctly expressed, hierarchically. My autoSelectStrings and messageSelections are Arrays of Booleans, parallel to my messageList. Each boolean indicates whether that message is selected. Each autoSelectStrings indicates which string should be highlighted in the code for each method in my messageList.! Item was changed: ----- Method: MessageTrace>>browseAllImplementorsOf: (in category 'actions') ----- browseAllImplementorsOf: selectorSymbol | selectorToBrowse | selectorToBrowse := self selection ifNil: [ selectorSymbol ] + ifNotNil: [ self getImplementorNamed: selectorSymbol asSymbol "since we can get passed literals"]. - ifNotNil: [ self getImplementorNamed: selectorSymbol ]. (self hasUnacceptedEdits or: [ Preferences traceMessages not ]) ifTrue: [ super browseAllImplementorsOf: selectorToBrowse ] ifFalse: [ self addChildMethodsNamed: selectorToBrowse ] ! Item was changed: ----- Method: MessageTrace>>initializeMessageList: (in category 'private initializing') ----- initializeMessageList: anArray - messageSelections := (Array new: anArray size withAll: false) asOrderedCollection. super initializeMessageList: anArray. + messageSelections := (Array new: messageList size withAll: false) asOrderedCollection. self messageAt: messageListIndex beSelected: true. "autoSelectStrings is initialized right after this method, in autoSelectString:" ! Item was changed: ----- Method: MessageTrace>>messageListIndex: (in category 'actions') ----- messageListIndex: anInteger + "Set the index of the selected item to be anInteger. + Find the relevant auto select string to use, do my superclass' work and update the window title" + autoSelectStrings ifNotEmpty: [ autoSelectString := anInteger = 0 + ifTrue: [ "clear the autoSelectString" + String empty ] + ifFalse: [autoSelectStrings at: anInteger] + ]. + + anInteger > 0 ifTrue: [ self + messageAt: anInteger + beSelected: true + ]. + super messageListIndex: anInteger. + self changed: #windowTitle - ifTrue: - [ defaultSelectString ifNotNil: [:default| self containingWindow setLabel: default]. - "clear the autoSelectString" - '' ] - ifFalse: - [ messageListIndex := anInteger. - "setting the window label, below, can't wait for this.." - self containingWindow setLabel: (self windowLabelAt: anInteger). - "work out the string to ask the text view to pre-select. We should do better than this; after all the debugger does" - (autoSelectStrings at: anInteger)] ]. - anInteger > 0 ifTrue: - [ self - messageAt: anInteger - beSelected: true ]. - super messageListIndex: anInteger ! Item was changed: ----- Method: MessageTrace>>windowLabelAt: (in category 'private accessing') ----- windowLabelAt: anInteger + "return a suitable window label when there is an actual list item selected; work out what it should be based upon the array of autoSelectStrings or the current selection" + ^(autoSelectStrings at: anInteger) + ifNil: [ 'Implementors of ', - | str | - defaultSelectString ifNil: - [defaultSelectString := self containingWindow label]. - ^(str := autoSelectStrings at: anInteger) - ifNil: - [ 'Implementors of ', (self class parse: self selection + toClassAndSelector: [ :class :selector | selector ]) + ] + ifNotNil: [:str| 'Senders of ', str ] - toClassAndSelector: [ :class :selector | selector ]) ] - ifNotNil: - [ 'Senders of ', str ] ! Item was added: + ----- Method: MessageTrace>>windowTitle (in category 'building') ----- + windowTitle + "set the window label to suit the selection state; + if no selection, use saved widow label and add the number of items in the messageList + if something is selected, use the relevant string provided by windowLabelAt: which considers the index" + + ^messageListIndex = 0 + ifTrue:[String streamContents: [:str| str nextPutAll: windowLabel; + space; + nextPut: $[; + nextPutAll: messageList size asString; + nextPut: $] + ] + ] + ifFalse: [self windowLabelAt: messageListIndex]! -------------- next part -------------- An HTML attachment was scrubbed... URL: From marcel.taeumel at hpi.de Mon Oct 26 06:26:03 2020 From: marcel.taeumel at hpi.de (Marcel Taeumel) Date: Mon, 26 Oct 2020 07:26:03 +0100 Subject: [squeak-dev] Roassal3 "action plan" In-Reply-To: <175606db85c.d7ed6e7425394.106663829946075620@zoho.com> References: <175606db85c.d7ed6e7425394.106663829946075620@zoho.com> Message-ID: Hi Timothy, it's great that you are working on this! Once it's (somewhat) running, I can write some wrappers for the vizualizations to make them work in Vivide (http://github.com/hpi-swa/vivide [http://github.com/hpi-swa/vivide]). Best, Marcel Am 25.10.2020 16:43:37 schrieb gettimothy via Squeak-dev : Hi Tom thanks for the reply. what I could gleam from the Roassal codebase, my assumption is that their design initially started out with an arbitrary graphics backend in mind but, gradually, some lower-level aspects leaked into the domain-specific high-level code. You can see that the codebase contains two or three classes specifically with "Athens" in their name, which typically aim to abstract and collect the interface needed by Roassal to produce graphics. So, our goal would be to extend these abstractions to serve the use cases where Athens-specific code currently exists in the Roassal domain layer. Then, we can "simply" go in, provide a second interface that uses Balloon as its backend and we're done! Since an incremental process is obviously beneficial here and will yield the fastest sense of progress, starting out by creating this Balloon interface and making it just about serviceable is what we currently have in our repo. I believe Balloon as an engine should be able to express just about all the requirements that Roassal puts on Athens, even though I'm rather sure we'll have to employ some trickery for e.g. text. Athens becomes Balloon.... To make it more concrete: I think your approach of going test by test or example by example should work well. Ideally, you would compare the output of each example with what you find in Pharo and see where things are currently entirely broken or missing. If you then encounter a test/example that uses Athens-specific code, try to isolate the code in one of the abstraction classes, such as the RSAthensMorph or RSAthensRenderer and try to provide an equivalent implementation for our own RSBalloonMorph and RSBalloonRenderer classes. Eventually, we can then simply not load the RSAthensMorph and RSAthensRenderer were all Athens-specific code is isolated and should thus no longer encounter code that cannot load in Squeak. cool!  That's what I am doing now. The emphatic "NO" on Cairo is what I needed to hear to proceed down this path. btw, I got two more of those tests working by adding a method to BallonPathBuilder...steps to get all but the four last ones are: ===modify messages for pharo-isms=== need stdev  from pharo   in Collection  stdev | avg sample sum | "In statistics, the standard deviation is a measure that is used to quantify the amount of variation or dispersion of a set of data values. For details about implementation see comment in self sum." avg := self average. sample := self anyOne. sum := self inject: sample into: [ :accum :each | accum + (each - avg) squared ]. sum := sum - sample. ^ (sum / (self size - 1)) sqrt flatCollect: becomes 'gather:'. Browse Collection, add bogus method, flatCollect: aBlock. find senders... RPackageOrganizer becomes PackageOrganizer (repeat until all changed) ClassDescription, add method category *Roassal-Squeak add method 'numberOfMethods' >> ^self  localSelectors size. BalloonPathBuilder add method cateogry *Roassal3-Squeak ad method >>close self closePath. ===run examples === RSChartExample new example01Markers open. RSChartExample new example02ScatterPlot open. RSChartExample new example03Plot open. RSChartExample new example04WithTick open. RSChartExample new example05WithTick open. RSChartExample new example06CustomNumberOfTicks open. RSChartExample new example07AdjustingFontSize open. RSChartExample new example08TwoCharts open. RSChartExample new example09LinearSqrtSymlog open. RSChartExample new example10BarPlot open. RSChartExample new example11BarplotCombinedWithLine open. RSChartExample new example12ScatterPlotAndNormalizer open. RSChartExample new example13AreaPlot open. RSChartExample new example14AreaPlotWithError open. xRSChartExample new example15AreaBox open. xRSChartExample new example16Series open. xRSChartExample new example17CLPvsUSD open. xRSChartExample new example18Animation open. Additionally, it may be worthwhile to keep a separate document in case we encounter larger architectural issues where Roassal and Athens code are intertwined, such that the Roassal team can review the document rather than having to sift through a pull request of thousands of lines. I will leave that to you, but I will contribute when I encounter that stuff. Best, Tom cheers. p.s. I am saving to a local monticello repo as I go. Its easier than me having to relearn Metacello and the Git is just a reference at this point. -------------- next part -------------- An HTML attachment was scrubbed... URL: From marcel.taeumel at hpi.de Mon Oct 26 06:36:12 2020 From: marcel.taeumel at hpi.de (Marcel Taeumel) Date: Mon, 26 Oct 2020 07:36:12 +0100 Subject: [squeak-dev] changesets for previous changes... In-Reply-To: <1755ac0643c.b874ef5317441.1145783769444430075@zoho.com> References: <1755ac0643c.b874ef5317441.1145783769444430075@zoho.com> Message-ID: Hi Timothy, thanks for doing this! See #gather: and #collect:as: which is already in Trunk. Maybe also take a look at #flatten(ed). I suppose there is no need for a #flatCollect:. Best, Marcel Am 24.10.2020 15:16:10 schrieb gettimothy via Squeak-dev : Hi folks, attached are the change sets for the flatCollect: and other methods per the recent email. -------------- next part -------------- An HTML attachment was scrubbed... URL: From marcel.taeumel at hpi.de Mon Oct 26 06:40:06 2020 From: marcel.taeumel at hpi.de (Marcel Taeumel) Date: Mon, 26 Oct 2020 07:40:06 +0100 Subject: [squeak-dev] assert:equals: in Object In-Reply-To: References: <79aca96b0f334332a72c84f0db65a307@student.hpi.uni-potsdam.de> Message-ID: > A situation where SUnit and all the tests are not necessarily loaded. Hmm... maybe we might consider adding an SUnit-Core? Well, not sure it makes sense to have an image without SUnit. But then you might want to also strip, e.g., network support to shrink the image file a little bit more. :-) Best, Marcel Am 24.10.2020 13:01:30 schrieb H. Hirzel : On 10/9/20, Tony Garnock-Jones wrote: > Hi Christoph, > > On 10/9/20 4:53 PM, Thiede, Christoph wrote: >>> Anyway, having it by default be the case that Workspaces' >> code environments be TestCases seems very sensible to me. >> >> What do you mean by this? Such a TestCase receiver environment should >> definitively be not the default, this would be very confusing! > > Oh interesting! What kind of confusion do you foresee? I had just > imagined that the only visible-ish change would be availability of > TestCase instance-side methods on the "self" in the Workspace. > >>> "Assertions [...] MUST BE LEFT ACTIVE IN >>> PRODUCTION CODE >> Are we on the same page now? :-) > > Yes, I think we are! :-) Thanks. > > Tony I consider that assertions are useful to have in the production code an an argument in favor of having assert:equals:description: implemented the class Object. A situation where SUnit and all the tests are not necessarily loaded. --Hannes -------------- next part -------------- An HTML attachment was scrubbed... URL: From marcel.taeumel at hpi.de Mon Oct 26 06:41:59 2020 From: marcel.taeumel at hpi.de (Marcel Taeumel) Date: Mon, 26 Oct 2020 07:41:59 +0100 Subject: [squeak-dev] The Inbox: Kernel-ct.1354.mcz In-Reply-To: References: Message-ID: Can this be moved to "treated" in favor of ct.1355? Am 24.10.2020 00:18:12 schrieb commits at source.squeak.org : A new version of Kernel was added to project The Inbox: http://source.squeak.org/inbox/Kernel-ct.1354.mcz ==================== Summary ==================== Name: Kernel-ct.1354 Author: ct Time: 24 October 2020, 12:18:01.669256 am UUID: 76d0d109-56f9-a640-b1af-a403809b23a2 Ancestors: Kernel-mt.1353 empty log message =============== Diff against Kernel-mt.1353 =============== -------------- next part -------------- An HTML attachment was scrubbed... URL: From marcel.taeumel at hpi.de Mon Oct 26 06:47:02 2020 From: marcel.taeumel at hpi.de (Marcel Taeumel) Date: Mon, 26 Oct 2020 07:47:02 +0100 Subject: [squeak-dev] Changeset: Enhanced integration of drag'n'drop from host In-Reply-To: References: Message-ID: Hi Christoph! This is great news! I will take a look at it and test it for the Windows platform. Best, Marcel Am 23.10.2020 14:11:28 schrieb Thiede, Christoph : Hi all! :-) I'm glad to officially submit my dropFiles changeset today, finally. It enhances the integration of drag'n'drop (DnD) events delivered by the VM from the host operating system to the image, following one of Marcel's ideas: Instead of generating separate DropFilesEvent instances, every DnD event from the VM is translated into a TransferMorph that can be dragged into every morph or tool like every other Morph of TransferMorph, too. What is the goal of this changeset? This design change entails two key advantages: First, every dragged host element is represented by a first-class object (which is a TransferMorph) instance. Second, as a consequence, applications do no longer need to implement a separate protocol for handling host DnDs (which was #dropFiles:/#wantsDropFiles:) but only need to provide one single proper implementation of #acceptDroppingMorph:event:/#wantsDroppedTransferMorph:. In particular, this also enables developers who use the ToolBuilder(Spec) framework to handle contents dropped from the host system since the old dropFiles protocol was never forwarded to the ToolBuilder framework. How does it work? There have already been complete implementations of the DropPlugin on the VM side for all important platforms (Windows, Linux, and macOS) for a long time (almost 20 years ...) which record four different types of drag events, namely: #dragEnter, #dragMove, #dragLeave, and #dragDrop. However, until now, only the last of them, #dragDrop, has been handled on the image side (see HandMorph >> #generateDropFilesEvent:). The main work of this changeset can be found in just this method where I added support for the other drag types in order to create, move, and release a TransferMorph accordingly. Other changes include: * Deprecated, but kept working the old DropFilesEvent protocol (these events are still processed, but a DeprecationWarning is signaled if any morph actually handles them). * Migrated the only implementation of the old dropFiles protocol, which is PasteUpMorph, to the unified TransferMorph protocol. * Introduced a new event class + protocol for SystemLaunchEvent (aka #launchDrop) which is generated by a singleton VM when it has been invoked with a new image file (see class comment). That #launchDrop is a curious hack on the VM side to reuse the DnD protocol but has completely different semantics that now are separated on the image side. * Implemented the SystemLaunchEvent protocol on PasteUpMorph. Besides the changeset, I have also fixed a few minor inconsistencies with several VM-specific implementations in the OpenSmalltalk-VM repository (see #508 [https://github.com/OpenSmalltalk/opensmalltalk-vm/pull/508], #514 [https://github.com/OpenSmalltalk/opensmalltalk-vm/pull/514], and #518 [https://github.com/OpenSmalltalk/opensmalltalk-vm/pull/518]) that have already been merged (thanks to all reviewers!). What's the current state of the changeset? I have successfully tested the changeset on Windows (Win 2004) and Ubuntu/X11. Also, I made sure it works with Squeak.js and TruffleSqueak. However, I do not have any possibility to test it on the OSVM implementations for macOS and iOS, so your help and feedback especially for these platforms will be greatly appreciated! Please see the attached demo video on how to test the changeset: Simply drag some files into an inspector field or a workspace and you should receive a list of FileStreams and/or FileDirectories. Also, aborting a drag operation should not fail, i.e. drag a file over the image but then drop the file in another window. What's next? There is much more potential for a comfortable host DnD integration! Concretely, I am having two downstream goals in mind: First, dropping other content types besides files and/or directories in your image, such as texts or images (currently, the DropPlugin implementations that I could try out are restricted to the former two types). Second, dragging objects out of the VM to save them as a file, or even better, to drop them in a second image! Vanessa has told me [https://github.com/OpenSmalltalk/opensmalltalk-vm/pull/508#issuecomment-655021654] that this was even possible in the past for certain platforms, but unfortunately, the relevant code appears to be dead nowadays. Nevertheless, I have stumbled upon a lot of stubs for both features in the DropPlugin and HandMorph code, and I'm looking forward to reviving them in some interesting follow-up projects! Which related contributions/discussions are there else? * System-ct.1156 (Inbox, fixes double prompt for handling a dropped file when the first dialog was canceled; not included in the changeset) * [squeak-dev] Re: Please try out | Inspector Refactoring =) [http://forum.world.st/Please-try-out-Inspector-Refactoring-tp5114974p5116422.html] (the thread contains some interesting brainstorming about MIME type support for dragging inside the image) Please test and review! And many thanks to Marcel for his helpful tips! Best, Christoph -------------- next part -------------- An HTML attachment was scrubbed... URL: -------------- next part -------------- A non-text attachment was scrubbed... Name: pastedImage.png Type: image/png Size: 133740 bytes Desc: not available URL: From marcel.taeumel at hpi.de Mon Oct 26 06:49:19 2020 From: marcel.taeumel at hpi.de (Marcel Taeumel) Date: Mon, 26 Oct 2020 07:49:19 +0100 Subject: [squeak-dev] The Inbox: Kernel-ct.1339.mcz In-Reply-To: References: Message-ID: Hi all! Can we merge this into Trunk? (Also see a discussion here: http://forum.world.st/Debugger-Simulator-cannot-simulate-some-objects-as-methods-td5123791.html) Best, Marcel Am 04.09.2020 21:09:30 schrieb commits at source.squeak.org : A new version of Kernel was added to project The Inbox: http://source.squeak.org/inbox/Kernel-ct.1339.mcz ==================== Summary ==================== Name: Kernel-ct.1339 Author: ct Time: 4 September 2020, 9:09:14.713421 pm UUID: edc35a82-ce03-014c-85de-13d68c7fc46f Ancestors: Kernel-ct.1338 Implement missing simulation of objects as methods. In the past, it was not possible to debug/simulate code that used objects as methods properly. (Thanks to Marcel for the hint!) This very simple commit adds support of the OaM protocol [1] to the simulation machinery. Now you can debug all tests in TestObjectsAsMethods as you would expect, instead of crashing your image! Update: Uploaded again, this time with additional documentation comment, reformatted code, and multilingual support/fix of typös. Replaces Kernel-ct.1306, which can be moved to the treated inbox. [1] "The [Objects as Methods] contract is that, when the VM encounters an ordinary object (rather than a compiled method) in the method dictionary during lookup, it sends it the special selector #run:with:in: providing the original selector, arguments, and receiver.". DOI: 10.1145/2991041.2991062. =============== Diff against Kernel-ct.1338 =============== Item was changed: ----- Method: Context>>send:to:with:lookupIn: (in category 'controlling') ----- send: selector to: rcvr with: arguments lookupIn: lookupClass + "Simulate the action of sending a message with selector and arguments to rcvr. The argument, lookupClass, is the class in which to lookup the message. This is the receiver's class for normal messages, but for super messages it will be some specific class related to the source method." - "Simulate the action of sending a message with selector and arguments - to rcvr. The argument, lookupClass, is the class in which to lookup the - message. This is the receiver's class for normal messages, but for super - messages it will be some specific class related to the source method." | meth primIndex val ctxt | + (meth := lookupClass lookupSelector: selector) ifNil: [ + ^ self + send: #doesNotUnderstand: + to: rcvr + with: {(Message selector: selector arguments: arguments) lookupClass: lookupClass} + lookupIn: lookupClass]. + + meth isCompiledMethod ifFalse: [ + "Object as Methods (OaM) protocol: 'The contract is that, when the VM encounters an ordinary object (rather than a compiled method) in the method dictionary during lookup, it sends it the special selector #run:with:in: providing the original selector, arguments, and receiver.'. DOI: 10.1145/2991041.2991062." + ^ self send: #run:with:in: + to: meth + with: {selector. arguments. rcvr}]. + + meth numArgs ~= arguments size ifTrue: [ + ^ self error: ('Wrong number of arguments in simulated message {1}' translated format: {selector})]. + (primIndex := meth primitive) > 0 ifTrue: [ + val := self doPrimitive: primIndex method: meth receiver: rcvr args: arguments. + (self isPrimFailToken: val) ifFalse: [^ val]]. + + (selector == #doesNotUnderstand: and: [lookupClass == ProtoObject]) ifTrue: [ + ^ self error: ('Simulated message {1} not understood' translated format: {arguments first selector})]. + - (meth := lookupClass lookupSelector: selector) ifNil: - [^self send: #doesNotUnderstand: - to: rcvr - with: {(Message selector: selector arguments: arguments) lookupClass: lookupClass} - lookupIn: lookupClass]. - meth numArgs ~= arguments size ifTrue: - [^self error: 'Wrong number of arguments in simulated message ', selector printString]. - (primIndex := meth primitive) > 0 ifTrue: - [val := self doPrimitive: primIndex method: meth receiver: rcvr args: arguments. - (self isPrimFailToken: val) ifFalse: - [^val]]. - (selector == #doesNotUnderstand: and: [lookupClass == ProtoObject]) ifTrue: - [^self error: 'Simulated message ', arguments first selector, ' not understood']. ctxt := Context sender: self receiver: rcvr method: meth arguments: arguments. + (primIndex notNil and: [primIndex > 0]) ifTrue: [ + ctxt failPrimitiveWith: val]. + + ^ ctxt! - primIndex > 0 ifTrue: - [ctxt failPrimitiveWith: val]. - ^ctxt! -------------- next part -------------- An HTML attachment was scrubbed... URL: From tomjonabc at gmail.com Mon Oct 26 07:39:58 2020 From: tomjonabc at gmail.com (Tom Beckmann) Date: Mon, 26 Oct 2020 08:39:58 +0100 Subject: [squeak-dev] The Inbox: WebClient-Core-ct.126.mcz In-Reply-To: <0ab25f63845546d4ba87ac0f2c454b48@student.hpi.uni-potsdam.de> References: <2532b37139184eb6b0ecf3f288081b61@student.hpi.uni-potsdam.de> <0B67EEA2-2AC1-4156-A8D8-56C192B48EF6@gmx.de> <80f7baf3a0eb4d3685d8aea6f12aef5c@student.hpi.uni-potsdam.de> <11383fd575bc4eaeb8d2dec513a190bc@student.hpi.uni-potsdam.de> <8159c070274b4ec2a20469c278fa3cff@student.hpi.uni-potsdam.de> <163C8A17-6F6B-4EBF-B7A1-7082ED8A63BD@gmx.de> <0ab25f63845546d4ba87ac0f2c454b48@student.hpi.uni-potsdam.de> Message-ID: Hey everyone, to sum up my understanding: the goal of this change is to change this pattern WebClient new httpGet: ' https://api.github.com/repos/myuser/myprivaterepo/zipball/master' do: [:req | req headerAt: 'Authorization' put: 'Basic ', 'myuser:mypasswd' base64Encoded] to WebClient new preAuthenticateMethod: #basic; user: 'myuser' password: 'mypasswd'; httpGet: ' https://api.github.com/repos/myuser/myprivaterepo/zipball/master' I dare say the fact that this pattern is required cannot be disputed since a number of services, such as Github, require the user to authenticate in this way. So the question boils down to whether we want to explicitly support the pattern or require users to have some low-level understanding of the Authorization header to be able to produce it themselves. Most HTTP client libraries that I looked at (httpie, curl, axios, Zinc) do provide this convenience to the user, typically even making it even "easier" by eagerly assuming Basic auth as soon as a username and password are provided. Now for my personal take: I think Christoph's proposed change is minimally invasive (the diff is still not perfectly cleaned up, potentially making it appear larger than it is) and adds value for the user for a (common?) pattern, while making it very explicit what happens with their credentials and when. So it's a +0.5 from me, and it would be a +1 if we could get a "perfectly clean" diff for reviewing the code (I only looked at it from the conceptual POV for now). Maybe I also missed an update that cleaned the diff but couldn't find a "perfect" one in the inbox thus far :) Best, Tom On Sun, Oct 25, 2020 at 11:00 PM Thiede, Christoph < Christoph.Thiede at student.hpi.uni-potsdam.de> wrote: > Hi Tobias, > > > > The API should stick to the HTTP RFCs and use 401 to say: You need > authentication. > > > Hm, but this would be an information leak on the server-side. :-) > > > > Sadly you omitted the anyauth stuff that actually works how > Authentication in HTTP is spec'ed. > > Sorry about that. Still, even in curl, anyauth is an opt-in feature, not > an opt-out. So my proposal for adding #preAuthenticationMethod as > an opt-in feature would be equivalent to adding an #anyAuth property as an > opt-out. Why should WebClient be less powerful than curl? I see it can be > abused, but Squeak already contains a lot of dangerous protocols that still > can be useful in particular situations. Just insert a warning into > the method comment and it'll be OK I think. > > > Except when you use "https://api.github.com/authorizations" first, > which 401s. > > True; but still, this would require either a change in the design or an > edge-case implementation because the WebClient connection logic is not > aware of whether GitHub or BitBucket or whatever else should be contacted. > > > Otherwise, encode it in the URL? > > Do you mean like http://username:password at www.example.com? At the moment, > WebClient is not treating this differently than WebClient >> #username and > #password. Is this the correct behavior? curl, again, uses preauth in this > situation, and Pharo does this, too. Unfortunately, I could not find a > clear answer to this question in RFC1738 ... > > > Don't rely on just my "judgement" ;) > > Your arguments are highly appreciated! I'm just trying to figure out your > motivations ... Yepp, some >=3rd opinions would be a good thing. :-) > > Best, > Christoph > > ------------------------------ > *Von:* Squeak-dev im > Auftrag von Tobias Pape > *Gesendet:* Sonntag, 25. Oktober 2020 22:19:49 > *An:* The general-purpose Squeak developers list > *Betreff:* Re: [squeak-dev] The Inbox: WebClient-Core-ct.126.mcz > > Hi > > > On 25.10.2020, at 22:03, Thiede, Christoph < > Christoph.Thiede at student.hpi.uni-potsdam.de> wrote: > > > > Hi Tobias, > > > > sorry for the long delay. I was on holiday a few days and did not manage > to return earlier to this interesting topic ... > > > > > > > No thats wrong. Curl will only send auth data if you provide it. > > > > > Doing "curl -u user:pw" is the same as using WebClient httpGet:do: and > adding the Authorization header manually > > > > > The point is, you instruct Curl to _provide credentials > unconditionally_. > > > > I think this is exactly the point. "curl -u user:pw" reads as "Download > a resource, 'specify[ing] the user name and password to use for server > authentication"' (cited from the man). > > Yes, that means _unconditionally_, even if the source does not need it. > This is called an information leak. > > > > If I do > > WebClient httpDo: [:client | client username: 'user'; password: 'pw'; > get: 'https://example.com/rest/whoami'], > > this reads exactly the same for me. Otherwise, #username: and #password: > better might be renamed into > #optionalUsername/#lazyUsername/#usernameIfAsked etc. > > > > Nope. > > > Apart from this, I have tested the behavior for Pharo, too, where the > default web client is ZnClient: And it works like curl, too, rather than > like our WebClient, i.e. the following works without any extra low-level > instructions: > > > > ZnClient new > > url: ' > https://api.github.com/repos/LinqLover/openHAB-configuration/zipball/master > '; > > username: 'LinqLover' password: 'mytoken'; > > downloadTo: 'foo.zip' > > > > > So you always know beforehand which resources need authentication? > > > Neat, I dont :D > > > > I suppose we are having different use cases in mind: You are thinking of > a generic browser application while I am thinking of a specific API client > implementation. Is this correct? > > No. The API should stick to the HTTP RFCs and use 401 to say: You need > authentication. > > > If I'm developing a REST API client, I do have to know whether a > resource requires authentication or whether it doesn't. This is usually > specified in the API documentation. Why add another level of uncertainty by > using this trial-and-error strategy? > > Because preemtive auth is wrong. > > Sadly you omitted the anyauth stuff that actually works how Authentication > in HTTP is spec'ed. > Yes, it is "one request more". Yes, it is right thing to do. > > Just because it is convenient and just because people are doing it, it > does not mean it is good. > In fact, the whole "curl as API-consumer" is fine, but sticking "-u" to > each and every request is a security nightmare just second to "curl ... | > sudo bash". > > > > > > > In the context of my Metacello PR, the problem is that following your > approach of specifying the Authorization header would mess up all the > different layers of abstraction that are not aware of web client > implementations and headers but only of a URL and a username/password pair. > I had hoped that I could pass a constant string 'Basic' to the > Authorization header for all cases where the WebClient is invoked, but > unfortunately, GitHub does not understand this either, the header must > contain the password even in the first run. > > Except when you use "https://api.github.com/authorizations" first, which > 401s. > > > > It would lead to some portion on unhandsome spaghetti code if I had to > implement an edge case for GitHub in the relevant method > (MetacelloSqueakPlatform class >> #downloadZipArchive:to:username:pass:); > for this reason, I would find it really helpful to turn on preAuth at this > place. > > > Do you dislike this feature in general, even when turned off by default? > > Yes. WebClient is not just an API-consumer. It ought to be safe. > Otherwise, encode it in the URL? > > > I'm not even requiring to make this an opt-out feature, this inbox > version only implements it as an opt-in. > > I don't know. > > I think there has been too little input from others here. > Don't rely on just my "judgement" ;) > > Best regards > -Tobias > > > > > > Best, > > Christoph > > > > Von: Squeak-dev im > Auftrag von Tobias Pape > > Gesendet: Dienstag, 13. Oktober 2020 10:04:23 > > An: The general-purpose Squeak developers list > > Betreff: Re: [squeak-dev] The Inbox: WebClient-Core-ct.126.mcz > > > > Hi > > > > > On 12.10.2020, at 23:42, Thiede, Christoph < > Christoph.Thiede at student.hpi.uni-potsdam.de> wrote: > > > > > > Hi Tobias, > > > > > > okay, I see this authorization pattern now, so you mentioned two ways > to work around the current limitations: > > > First, by GETting https://api.github.com/authorizations before, or > second, by passing the Authorization header manually. > > > Is this correct? > > > > Yes. However, the second one is the one GitHub "recommends" > > > > > > > > > > However, both of these approaches lack of the RESTful-typical > simplicity of "making a single HTTP request without dealing with complex > call protocols or low-level connectivity code". To give an illustration of > my use case, please see this PR on Metacello: > https://github.com/Metacello/metacello/pull/534 > > > IMHO it would be a shame if you could not access a popular REST API > like api.github.com in Squeak using a single message send to the > WebClient/WebSocket class. > > > > There is no such thing as simplicity when a REST-Based resource-provider > supports both authenticated and unauthenticated access. > > If you cannot know beforehand, no single-request stuff is gonna help. No > dice. > > > > > > > > > > > > Why not? > > > > > > > > It leaks credentials unnecessarily. > > > > > > Ah, good point! But this pattern (EAFP for web connections) is not > really state of the art, is it? As mentioned, curl, for example, sends the > authentication data in the very first request, which is a tool I would tend > to *call* state of the art. > > > > No thats wrong. Curl will only send auth data if you provide it. > > > > Doing "curl -u user:pw" is the same as using WebClient httpGet:do: and > adding the Authorization header manually > > > > > > The sequence is split manually: > > ``` > > $ curl https://api.github.com/repos/krono/debug/zipball/master > > { > > "message": "Not Found", > > "documentation_url": " > https://docs.github.com/rest/reference/repos#download-a-repository-archive > " > > } > > # Well, I'm left to guess. Maybe exists, maybe not. > > $ curl -u krono https://api.github.com/repos/krono/debug/zipball/master > > > > ``` > > (In this case, I can't even show what's going on as I use 2FA, which > makes single-request REST to _never_ work on private repos.) > > > > The point is, you instruct Curl to _provide credentials unconditionally_. > > The "heavy lifting" of finding out when to do that is not done by curl > but by users of curl. > > > > Look: > > > > ``` > > $ curl http://www.hpi.uni-potsdam.de/hirschfeld/squeaksource/xpaware/ > > $ > > # Well, no response? > > $ curl -v > http://www.hpi.uni-potsdam.de/hirschfeld/squeaksource/xpaware/ > > * Trying 2001:638:807:204::8d59:e178... > > * TCP_NODELAY set > > * Connected to www.hpi.uni-potsdam.de (2001:638:807:204::8d59:e178) > port 80 (#0) > > > GET /hirschfeld/squeaksource/xpaware/ HTTP/1.1 > > > Host: www.hpi.uni-potsdam.de > > > User-Agent: curl/7.54.0 > > > Accept: */* > > > > > < HTTP/1.1 401 > > < Date: Tue, 13 Oct 2020 07:43:04 GMT > > < Server: nginx/1.14.2 > > < Content-Length: 0 > > < WWW-Authenticate: Basic realm="SwaSource - XP aware" > > < > > * Connection #0 to host www.hpi.uni-potsdam.de left intact > > ``` > > > > Thats the 401 we're looking for. We have found that the resource needs > authentication. > > > > Sidenote: Curl can do the roundtrip (man curl, search anyauth): > > > > ``` > > $ curl -u topa --anyauth -v > http://www.hpi.uni-potsdam.de/hirschfeld/squeaksource/xpaware/ > > Enter host password for user 'topa': > > * Trying 2001:638:807:204::8d59:e178... > > * TCP_NODELAY set > > * Connected to www.hpi.uni-potsdam.de (2001:638:807:204::8d59:e178) > port 80 (#0) > > > GET /hirschfeld/squeaksource/xpaware/ HTTP/1.1 > > > Host: www.hpi.uni-potsdam.de > > > User-Agent: curl/7.54.0 > > > Accept: */* > > > > > < HTTP/1.1 401 > > < Date: Tue, 13 Oct 2020 07:46:05 GMT > > < Server: nginx/1.14.2 > > < Content-Length: 0 > > < WWW-Authenticate: Basic realm="SwaSource - XP aware" > > < > > * Connection #0 to host www.hpi.uni-potsdam.de left intact > > * Issue another request to this URL: ' > http://www.hpi.uni-potsdam.de/hirschfeld/squeaksource/xpaware/' > > * Found bundle for host www.hpi.uni-potsdam.de: 0x7fb8c8c0b1b0 [can > pipeline] > > * Re-using existing connection! (#0) with host www.hpi.uni-potsdam.de > > * Connected to www.hpi.uni-potsdam.de (2001:638:807:204::8d59:e178) > port 80 (#0) > > * Server auth using Basic with user 'topa' > > > GET /hirschfeld/squeaksource/xpaware/ HTTP/1.1 > > > Host: www.hpi.uni-potsdam.de > > > Authorization: Basic ******************* > > > User-Agent: curl/7.54.0 > > > Accept: */* > > > > > < HTTP/1.1 200 > > < Date: Tue, 13 Oct 2020 07:46:05 GMT > > < Server: nginx/1.14.2 > > < Content-Type: text/html > > < Content-Length: 15131 > > < Vary: Accept-Encoding > > ``` > > > > And in this case it does _not_ send auth in the first request but only > in the second. > > > > Sidenote2: If the first request comes back 200, no second one is issued, > no credentials leak: > > > > ``` > > $ curl -u topa --anyauth -v > http://www.hpi.uni-potsdam.de/hirschfeld/squeaksource/xpforums/ > > Enter host password for user 'topa': > > * Trying 2001:638:807:204::8d59:e178... > > * TCP_NODELAY set > > * Connected to www.hpi.uni-potsdam.de (2001:638:807:204::8d59:e178) > port 80 (#0) > > > GET /hirschfeld/squeaksource/xpforums/ HTTP/1.1 > > > Host: www.hpi.uni-potsdam.de > > > User-Agent: curl/7.54.0 > > > Accept: */* > > > > > < HTTP/1.1 200 > > < Date: Tue, 13 Oct 2020 07:46:56 GMT > > < Server: nginx/1.14.2 > > < Content-Type: text/html > > < Content-Length: 75860 > > < Vary: Accept-Encoding > > ``` > > > > > > > > > > > > > And speed is another point, given the fact that internet connections > in Squeak are really slow ... > > > Why do you call this behavior a leak? The application developer will > not pass authentication data to the web client unless they expect the > server to consume these data anyway. > > > > So you always know beforehand which resources need authentication? > > Neat, I dont :D > > > > > If you deem it necessary, we could turn off the pre-authentication as > soon as the client was redirected to another server ... > > > > What happens here is that we're bending over backwards because github > decided to be a bad player. > > > > I mean, on most sited you visit in browsers, no auth data is sent > _unless_ you are asked to (redirect to a login) or you _explicitely_ click > on a login link. > > > > If you want preemtive auth, do it with WebClient httpGet:do:. > > > > > > > > > > > > > I understand that the method is maybe not the most common style, but > I think that functional changes should in such cases not be mixed with > style changes. > > > > > > Alright, please see WebClient-Core-ct.128. But maybe we should > consider to use prettyDiff for the mailing list notifications as a default? > Just an idea. > > > > I personally find prettydiffs useless, but that's just me. > > > > Best regards > > -Tobias > > > > > -------------- next part -------------- An HTML attachment was scrubbed... URL: From Das.Linux at gmx.de Mon Oct 26 08:51:51 2020 From: Das.Linux at gmx.de (Tobias Pape) Date: Mon, 26 Oct 2020 09:51:51 +0100 Subject: [squeak-dev] The Inbox: WebClient-Core-ct.126.mcz In-Reply-To: References: <2532b37139184eb6b0ecf3f288081b61@student.hpi.uni-potsdam.de> <0B67EEA2-2AC1-4156-A8D8-56C192B48EF6@gmx.de> <80f7baf3a0eb4d3685d8aea6f12aef5c@student.hpi.uni-potsdam.de> <11383fd575bc4eaeb8d2dec513a190bc@student.hpi.uni-potsdam.de> <8159c070274b4ec2a20469c278fa3cff@student.hpi.uni-potsdam.de> <163C8A17-6F6B-4EBF-B7A1-7082ED8A63BD@gmx.de> <0ab25f63845546d4ba87ac0f2c454b48@student.hpi.uni-potsdam.de> Message-ID: > On 26.10.2020, at 08:39, Tom Beckmann wrote: > > Hey everyone, > > to sum up my understanding: the goal of this change is to change this pattern > > WebClient new > httpGet: 'https://api.github.com/repos/myuser/myprivaterepo/zipball/master' > do: [:req | req headerAt: 'Authorization' put: 'Basic ', 'myuser:mypasswd' base64Encoded] > > to > > WebClient new > preAuthenticateMethod: #basic; > user: 'myuser' password: 'mypasswd'; > httpGet: 'https://api.github.com/repos/myuser/myprivaterepo/zipball/master' > > I dare say the fact that this pattern is required cannot be disputed since a number of services, such as Github, require the user to authenticate in this way. Sure, but it wont work for me anyways, Since I have 2FA. :D And It won't work in 4 weeks time anyways: https://docs.github.com/en/free-pro-team at latest/rest/overview/other-authentication-methods """ Via username and password Deprecation Notice: GitHub will discontinue password authentication to the API. You must now authenticate to the GitHub API with an API token, such as an OAuth access token, GitHub App installation access token, or personal access token, depending on what you need to do with the token. Password authentication to the API will be removed on November 13, 2020. For more information, including scheduled brownouts, see the blog post. """ Gah :D > > So the question boils down to whether we want to explicitly support the pattern or require users to have some low-level understanding of the Authorization header to be able to produce it themselves. > Most HTTP client libraries that I looked at (httpie, curl, axios, Zinc) do provide this convenience to the user, typically even making it even "easier" by eagerly assuming Basic auth as soon as a username and password are provided. > > Now for my personal take: I think Christoph's proposed change is minimally invasive (the diff is still not perfectly cleaned up, potentially making it appear larger than it is) and adds value for the user for a (common?) pattern, while making it very explicit what happens with their credentials and when. So it's a +0.5 from me, and it would be a +1 if we could get a "perfectly clean" diff for reviewing the code (I only looked at it from the conceptual POV for now). Maybe I also missed an update that cleaned the diff but couldn't find a "perfect" one in the inbox thus far :) > > Best, > Tom > > On Sun, Oct 25, 2020 at 11:00 PM Thiede, Christoph wrote: > Hi Tobias, > > > > The API should stick to the HTTP RFCs and use 401 to say: You need authentication. > > > > Hm, but this would be an information leak on the server-side. :-) > > > > > Sadly you omitted the anyauth stuff that actually works how Authentication in HTTP is spec'ed. > > > Sorry about that. Still, even in curl, anyauth is an opt-in feature, not an opt-out. So my proposal for adding #preAuthenticationMethod as an opt-in feature would be equivalent to adding an #anyAuth property as an opt-out. Why should WebClient be less powerful than curl? I see it can be abused, but Squeak already contains a lot of dangerous protocols that still can be useful in particular situations. Just insert a warning into the method comment and it'll be OK I think. > > > Except when you use "https://api.github.com/authorizations" first, which 401s. > > True; but still, this would require either a change in the design or an edge-case implementation because the WebClient connection logic is not aware of whether GitHub or BitBucket or whatever else should be contacted. > > > Otherwise, encode it in the URL? > > Do you mean like http://username:password at www.example.com? At the moment, WebClient is not treating this differently than WebClient >> #username and #password. Is this the correct behavior? curl, again, uses preauth in this situation, and Pharo does this, too. Unfortunately, I could not find a clear answer to this question in RFC1738 ... > > > Don't rely on just my "judgement" ;) > > Your arguments are highly appreciated! I'm just trying to figure out your motivations ... Yepp, some >=3rd opinions would be a good thing. :-) > > Best, > Christoph > > Von: Squeak-dev im Auftrag von Tobias Pape > Gesendet: Sonntag, 25. Oktober 2020 22:19:49 > An: The general-purpose Squeak developers list > Betreff: Re: [squeak-dev] The Inbox: WebClient-Core-ct.126.mcz > > Hi > > > On 25.10.2020, at 22:03, Thiede, Christoph wrote: > > > > Hi Tobias, > > > > sorry for the long delay. I was on holiday a few days and did not manage to return earlier to this interesting topic ... > > > > > > > No thats wrong. Curl will only send auth data if you provide it. > > > > > Doing "curl -u user:pw" is the same as using WebClient httpGet:do: and adding the Authorization header manually > > > > > The point is, you instruct Curl to _provide credentials unconditionally_. > > > > I think this is exactly the point. "curl -u user:pw" reads as "Download a resource, 'specify[ing] the user name and password to use for server authentication"' (cited from the man). > > Yes, that means _unconditionally_, even if the source does not need it. > This is called an information leak. > > > > If I do > > WebClient httpDo: [:client | client username: 'user'; password: 'pw'; get: 'https://example.com/rest/whoami'], > > this reads exactly the same for me. Otherwise, #username: and #password: better might be renamed into #optionalUsername/#lazyUsername/#usernameIfAsked etc. > > > > Nope. > > > Apart from this, I have tested the behavior for Pharo, too, where the default web client is ZnClient: And it works like curl, too, rather than like our WebClient, i.e. the following works without any extra low-level instructions: > > > > ZnClient new > > url: 'https://api.github.com/repos/LinqLover/openHAB-configuration/zipball/master'; > > username: 'LinqLover' password: 'mytoken'; > > downloadTo: 'foo.zip' > > > > > So you always know beforehand which resources need authentication? > > > Neat, I dont :D > > > > I suppose we are having different use cases in mind: You are thinking of a generic browser application while I am thinking of a specific API client implementation. Is this correct? > > No. The API should stick to the HTTP RFCs and use 401 to say: You need authentication. > > > If I'm developing a REST API client, I do have to know whether a resource requires authentication or whether it doesn't. This is usually specified in the API documentation. Why add another level of uncertainty by using this trial-and-error strategy? > > Because preemtive auth is wrong. > > Sadly you omitted the anyauth stuff that actually works how Authentication in HTTP is spec'ed. > Yes, it is "one request more". Yes, it is right thing to do. > > Just because it is convenient and just because people are doing it, it does not mean it is good. > In fact, the whole "curl as API-consumer" is fine, but sticking "-u" to each and every request is a security nightmare just second to "curl ... | sudo bash". > > > > > > > In the context of my Metacello PR, the problem is that following your approach of specifying the Authorization header would mess up all the different layers of abstraction that are not aware of web client implementations and headers but only of a URL and a username/password pair. I had hoped that I could pass a constant string 'Basic' to the Authorization header for all cases where the WebClient is invoked, but unfortunately, GitHub does not understand this either, the header must contain the password even in the first run. > > Except when you use "https://api.github.com/authorizations" first, which 401s. > > > > It would lead to some portion on unhandsome spaghetti code if I had to implement an edge case for GitHub in the relevant method (MetacelloSqueakPlatform class >> #downloadZipArchive:to:username:pass:); for this reason, I would find it really helpful to turn on preAuth at this place. > > > Do you dislike this feature in general, even when turned off by default? > > Yes. WebClient is not just an API-consumer. It ought to be safe. > Otherwise, encode it in the URL? > > > I'm not even requiring to make this an opt-out feature, this inbox version only implements it as an opt-in. > > I don't know. > > I think there has been too little input from others here. > Don't rely on just my "judgement" ;) > > Best regards > -Tobias > > > > > > Best, > > Christoph > > > > Von: Squeak-dev im Auftrag von Tobias Pape > > Gesendet: Dienstag, 13. Oktober 2020 10:04:23 > > An: The general-purpose Squeak developers list > > Betreff: Re: [squeak-dev] The Inbox: WebClient-Core-ct.126.mcz > > > > Hi > > > > > On 12.10.2020, at 23:42, Thiede, Christoph wrote: > > > > > > Hi Tobias, > > > > > > okay, I see this authorization pattern now, so you mentioned two ways to work around the current limitations: > > > First, by GETting https://api.github.com/authorizations before, or second, by passing the Authorization header manually. > > > Is this correct? > > > > Yes. However, the second one is the one GitHub "recommends" > > > > > > > > > > However, both of these approaches lack of the RESTful-typical simplicity of "making a single HTTP request without dealing with complex call protocols or low-level connectivity code". To give an illustration of my use case, please see this PR on Metacello:https://github.com/Metacello/metacello/pull/534 > > > IMHO it would be a shame if you could not access a popular REST API like api.github.com in Squeak using a single message send to the WebClient/WebSocket class. > > > > There is no such thing as simplicity when a REST-Based resource-provider supports both authenticated and unauthenticated access. > > If you cannot know beforehand, no single-request stuff is gonna help. No dice. > > > > > > > > > > > > Why not? > > > > > > > > It leaks credentials unnecessarily. > > > > > > Ah, good point! But this pattern (EAFP for web connections) is not really state of the art, is it? As mentioned, curl, for example, sends the authentication data in the very first request, which is a tool I would tend to *call* state of the art. > > > > No thats wrong. Curl will only send auth data if you provide it. > > > > Doing "curl -u user:pw" is the same as using WebClient httpGet:do: and adding the Authorization header manually > > > > > > The sequence is split manually: > > ``` > > $ curl https://api.github.com/repos/krono/debug/zipball/master > > { > > "message": "Not Found", > > "documentation_url": "https://docs.github.com/rest/reference/repos#download-a-repository-archive" > > } > > # Well, I'm left to guess. Maybe exists, maybe not. > > $ curl -u krono https://api.github.com/repos/krono/debug/zipball/master > > > > ``` > > (In this case, I can't even show what's going on as I use 2FA, which makes single-request REST to _never_ work on private repos.) > > > > The point is, you instruct Curl to _provide credentials unconditionally_. > > The "heavy lifting" of finding out when to do that is not done by curl but by users of curl. > > > > Look: > > > > ``` > > $ curl http://www.hpi.uni-potsdam.de/hirschfeld/squeaksource/xpaware/ > > $ > > # Well, no response? > > $ curl -v http://www.hpi.uni-potsdam.de/hirschfeld/squeaksource/xpaware/ > > * Trying 2001:638:807:204::8d59:e178... > > * TCP_NODELAY set > > * Connected to www.hpi.uni-potsdam.de (2001:638:807:204::8d59:e178) port 80 (#0) > > > GET /hirschfeld/squeaksource/xpaware/ HTTP/1.1 > > > Host: www.hpi.uni-potsdam.de > > > User-Agent: curl/7.54.0 > > > Accept: */* > > > > > < HTTP/1.1 401 > > < Date: Tue, 13 Oct 2020 07:43:04 GMT > > < Server: nginx/1.14.2 > > < Content-Length: 0 > > < WWW-Authenticate: Basic realm="SwaSource - XP aware" > > < > > * Connection #0 to host www.hpi.uni-potsdam.de left intact > > ``` > > > > Thats the 401 we're looking for. We have found that the resource needs authentication. > > > > Sidenote: Curl can do the roundtrip (man curl, search anyauth): > > > > ``` > > $ curl -u topa --anyauth -v http://www.hpi.uni-potsdam.de/hirschfeld/squeaksource/xpaware/ > > Enter host password for user 'topa': > > * Trying 2001:638:807:204::8d59:e178... > > * TCP_NODELAY set > > * Connected to www.hpi.uni-potsdam.de (2001:638:807:204::8d59:e178) port 80 (#0) > > > GET /hirschfeld/squeaksource/xpaware/ HTTP/1.1 > > > Host: www.hpi.uni-potsdam.de > > > User-Agent: curl/7.54.0 > > > Accept: */* > > > > > < HTTP/1.1 401 > > < Date: Tue, 13 Oct 2020 07:46:05 GMT > > < Server: nginx/1.14.2 > > < Content-Length: 0 > > < WWW-Authenticate: Basic realm="SwaSource - XP aware" > > < > > * Connection #0 to host www.hpi.uni-potsdam.de left intact > > * Issue another request to this URL: 'http://www.hpi.uni-potsdam.de/hirschfeld/squeaksource/xpaware/' > > * Found bundle for host www.hpi.uni-potsdam.de: 0x7fb8c8c0b1b0 [can pipeline] > > * Re-using existing connection! (#0) with host www.hpi.uni-potsdam.de > > * Connected to www.hpi.uni-potsdam.de (2001:638:807:204::8d59:e178) port 80 (#0) > > * Server auth using Basic with user 'topa' > > > GET /hirschfeld/squeaksource/xpaware/ HTTP/1.1 > > > Host: www.hpi.uni-potsdam.de > > > Authorization: Basic ******************* > > > User-Agent: curl/7.54.0 > > > Accept: */* > > > > > < HTTP/1.1 200 > > < Date: Tue, 13 Oct 2020 07:46:05 GMT > > < Server: nginx/1.14.2 > > < Content-Type: text/html > > < Content-Length: 15131 > > < Vary: Accept-Encoding > > ``` > > > > And in this case it does _not_ send auth in the first request but only in the second. > > > > Sidenote2: If the first request comes back 200, no second one is issued, no credentials leak: > > > > ``` > > $ curl -u topa --anyauth -v http://www.hpi.uni-potsdam.de/hirschfeld/squeaksource/xpforums/ > > Enter host password for user 'topa': > > * Trying 2001:638:807:204::8d59:e178... > > * TCP_NODELAY set > > * Connected to www.hpi.uni-potsdam.de (2001:638:807:204::8d59:e178) port 80 (#0) > > > GET /hirschfeld/squeaksource/xpforums/ HTTP/1.1 > > > Host: www.hpi.uni-potsdam.de > > > User-Agent: curl/7.54.0 > > > Accept: */* > > > > > < HTTP/1.1 200 > > < Date: Tue, 13 Oct 2020 07:46:56 GMT > > < Server: nginx/1.14.2 > > < Content-Type: text/html > > < Content-Length: 75860 > > < Vary: Accept-Encoding > > ``` > > > > > > > > > > > > > And speed is another point, given the fact that internet connections in Squeak are really slow ... > > > Why do you call this behavior a leak? The application developer will not pass authentication data to the web client unless they expect the server to consume these data anyway. > > > > So you always know beforehand which resources need authentication? > > Neat, I dont :D > > > > > If you deem it necessary, we could turn off the pre-authentication as soon as the client was redirected to another server ... > > > > What happens here is that we're bending over backwards because github decided to be a bad player. > > > > I mean, on most sited you visit in browsers, no auth data is sent _unless_ you are asked to (redirect to a login) or you _explicitely_ click on a login link. > > > > If you want preemtive auth, do it with WebClient httpGet:do:. > > > > > > > > > > > > > I understand that the method is maybe not the most common style, but I think that functional changes should in such cases not be mixed with style changes. > > > > > > Alright, please see WebClient-Core-ct.128. But maybe we should consider to use prettyDiff for the mailing list notifications as a default? Just an idea. > > > > I personally find prettydiffs useless, but that's just me. > > > > Best regards > > -Tobias > > > > > From trygver at ifi.uio.no Mon Oct 26 09:26:52 2020 From: trygver at ifi.uio.no (Trygve Reenskaug) Date: Mon, 26 Oct 2020 10:26:52 +0100 Subject: [squeak-dev] Morphs and Data Question In-Reply-To: References: Message-ID: Hi Eric, I believe using a step method is unnecessarily obscure and inefficient. I nearly always use the old ST80 /changed:/update:/ mechanism for MVC implementations: 1. A View set up the mechanism by sending/model addDependent: self/. /Object>>addDependent//: anObject /is a predefined method. 2. Whenever the Model changes, you send /model changed: aSymbo//l//. //Object>>//changed: aSymbo//l///is a predefined method. 3. /Object>>changed:/ causes the object (Model) to send /update: aSymbol/ to all its dependents (Views) 4. /You override Object>>update/: in your View to make it refresh itself. Best Trygve On 2020-10-25 15:44, Eric Gade wrote: > Hi all, > > I have a quick question that is perhaps very elementary. What is the > best way to design my Morph subclasses so that they "react" to changes > on their models? For example, if I have some data related model with > text that updates and I want the "view" (the Morph) to update whenever > this occurs? In my own quick code I've always just implemented a > `step` method that checks for data on the model updates, but is that > too brutal and inefficient? > > Thanks, > > -- > Eric > -- /The essence of object orientation is that objects collaborateto achieve a goal. / Trygve Reenskaug mailto: trygver at ifi.uio.no Morgedalsvn. 5A http://heim.ifi.uio.no/trygver/ N-0378 Oslo http://fullOO.info Norway                     Tel: (+47) 468 58 625 -------------- next part -------------- An HTML attachment was scrubbed... URL: From Das.Linux at gmx.de Mon Oct 26 09:37:48 2020 From: Das.Linux at gmx.de (Tobias Pape) Date: Mon, 26 Oct 2020 10:37:48 +0100 Subject: [squeak-dev] The Inbox: WebClient-Core-ct.126.mcz In-Reply-To: <0ab25f63845546d4ba87ac0f2c454b48@student.hpi.uni-potsdam.de> References: <2532b37139184eb6b0ecf3f288081b61@student.hpi.uni-potsdam.de> <0B67EEA2-2AC1-4156-A8D8-56C192B48EF6@gmx.de> <80f7baf3a0eb4d3685d8aea6f12aef5c@student.hpi.uni-potsdam.de> <11383fd575bc4eaeb8d2dec513a190bc@student.hpi.uni-potsdam.de> <8159c070274b4ec2a20469c278fa3cff@student.hpi.uni-potsdam.de> <163C8A17-6F6B-4EBF-B7A1-7082ED8A63BD@gmx.de> <0ab25f63845546d4ba87ac0f2c454b48@student.hpi.uni-potsdam.de> Message-ID: <494468EE-CE59-43EA-ACA0-7C4987C3A47F@gmx.de> > On 25.10.2020, at 23:00, Thiede, Christoph wrote: > > Hi Tobias, > > > The API should stick to the HTTP RFCs and use 401 to say: You need authentication. > > Hm, but this would be an information leak on the server-side. :-) somewhat, and I get what GitHub does… > > > Sadly you omitted the anyauth stuff that actually works how Authentication in HTTP is spec'ed. > > Sorry about that. Still, even in curl, anyauth is an opt-in feature, not an opt-out. So my proposal for adding #preAuthenticationMethod as an opt-in feature would be equivalent to adding an #anyAuth property as an opt-out. Why should WebClient be less powerful than curl? I see it can be abused, but Squeak already contains a lot of dangerous protocols that still can be useful in particular situations. Just insert a warning into the method comment and it'll be OK I think. I don't think it works that way. > > > Except when you use "https://api.github.com/authorizations" first, which 401s. > > True; but still, this would require either a change in the design or an edge-case implementation because the WebClient connection logic is not aware of whether GitHub or BitBucket or whatever else should be contacted. Or, you know, for wherever your GitHub client is implemented[1], make sure to first go to the authz url when you have a password? [1]: Yes, I think you/we/one should have a GitHub client if working with an API. It is not just a simple "web site" anymore. > > > Otherwise, encode it in the URL? > > Do you mean like http://username:password at www.example.com? At the moment, WebClient is not treating this differently than WebClient >> #username and #password. Is this the correct behavior? curl, again, uses preauth in this situation, and Pharo does this, too. Unfortunately, I could not find a clear answer to this question in RFC1738 ... ahh yes, :D. I just imagined a browser, which would ask for PW on 401, but sent it anyway if given in the URL. =-=-= Think of it that way. You do not present your passport at every door you ring a bell, but only those you're asked for it. ;) > > > Don't rely on just my "judgement" ;) > > Your arguments are highly appreciated! I'm just trying to figure out your motivations ... Yepp, some >=3rd opinions would be a good thing. :-) :) best regards -tobias > > Best, > Christoph > Von: Squeak-dev im Auftrag von Tobias Pape > Gesendet: Sonntag, 25. Oktober 2020 22:19:49 > An: The general-purpose Squeak developers list > Betreff: Re: [squeak-dev] The Inbox: WebClient-Core-ct.126.mcz > > Hi > > > On 25.10.2020, at 22:03, Thiede, Christoph wrote: > > > > Hi Tobias, > > > > sorry for the long delay. I was on holiday a few days and did not manage to return earlier to this interesting topic ... > > > > > > > No thats wrong. Curl will only send auth data if you provide it. > > > > > Doing "curl -u user:pw" is the same as using WebClient httpGet:do: and adding the Authorization header manually > > > > > The point is, you instruct Curl to _provide credentials unconditionally_. > > > > I think this is exactly the point. "curl -u user:pw" reads as "Download a resource, 'specify[ing] the user name and password to use for server authentication"' (cited from the man). > > Yes, that means _unconditionally_, even if the source does not need it. > This is called an information leak. > > > > If I do > > WebClient httpDo: [:client | client username: 'user'; password: 'pw'; get: 'https://example.com/rest/whoami'], > > this reads exactly the same for me. Otherwise, #username: and #password: better might be renamed into #optionalUsername/#lazyUsername/#usernameIfAsked etc. > > > > Nope. > > > Apart from this, I have tested the behavior for Pharo, too, where the default web client is ZnClient: And it works like curl, too, rather than like our WebClient, i.e. the following works without any extra low-level instructions: > > > > ZnClient new > > url: 'https://api.github.com/repos/LinqLover/openHAB-configuration/zipball/master'; > > username: 'LinqLover' password: 'mytoken'; > > downloadTo: 'foo.zip' > > > > > So you always know beforehand which resources need authentication? > > > Neat, I dont :D > > > > I suppose we are having different use cases in mind: You are thinking of a generic browser application while I am thinking of a specific API client implementation. Is this correct? > > No. The API should stick to the HTTP RFCs and use 401 to say: You need authentication. > > > If I'm developing a REST API client, I do have to know whether a resource requires authentication or whether it doesn't. This is usually specified in the API documentation. Why add another level of uncertainty by using this trial-and-error strategy? > > Because preemtive auth is wrong. > > Sadly you omitted the anyauth stuff that actually works how Authentication in HTTP is spec'ed. > Yes, it is "one request more". Yes, it is right thing to do. > > Just because it is convenient and just because people are doing it, it does not mean it is good. > In fact, the whole "curl as API-consumer" is fine, but sticking "-u" to each and every request is a security nightmare just second to "curl ... | sudo bash". > > > > > > > In the context of my Metacello PR, the problem is that following your approach of specifying the Authorization header would mess up all the different layers of abstraction that are not aware of web client implementations and headers but only of a URL and a username/password pair. I had hoped that I could pass a constant string 'Basic' to the Authorization header for all cases where the WebClient is invoked, but unfortunately, GitHub does not understand this either, the header must contain the password even in the first run. > > Except when you use "https://api.github.com/authorizations" first, which 401s. > > > > It would lead to some portion on unhandsome spaghetti code if I had to implement an edge case for GitHub in the relevant method (MetacelloSqueakPlatform class >> #downloadZipArchive:to:username:pass:); for this reason, I would find it really helpful to turn on preAuth at this place. > > > Do you dislike this feature in general, even when turned off by default? > > Yes. WebClient is not just an API-consumer. It ought to be safe. > Otherwise, encode it in the URL? > > > I'm not even requiring to make this an opt-out feature, this inbox version only implements it as an opt-in. > > I don't know. > > I think there has been too little input from others here. > Don't rely on just my "judgement" ;) > > Best regards > -Tobias > > > > > > Best, > > Christoph > > > > Von: Squeak-dev im Auftrag von Tobias Pape > > Gesendet: Dienstag, 13. Oktober 2020 10:04:23 > > An: The general-purpose Squeak developers list > > Betreff: Re: [squeak-dev] The Inbox: WebClient-Core-ct.126.mcz > > > > Hi > > > > > On 12.10.2020, at 23:42, Thiede, Christoph wrote: > > > > > > Hi Tobias, > > > > > > okay, I see this authorization pattern now, so you mentioned two ways to work around the current limitations: > > > First, by GETting https://api.github.com/authorizations before, or second, by passing the Authorization header manually. > > > Is this correct? > > > > Yes. However, the second one is the one GitHub "recommends" > > > > > > > > > > However, both of these approaches lack of the RESTful-typical simplicity of "making a single HTTP request without dealing with complex call protocols or low-level connectivity code". To give an illustration of my use case, please see this PR on Metacello:https://github.com/Metacello/metacello/pull/534 > > > IMHO it would be a shame if you could not access a popular REST API like api.github.com in Squeak using a single message send to the WebClient/WebSocket class. > > > > There is no such thing as simplicity when a REST-Based resource-provider supports both authenticated and unauthenticated access. > > If you cannot know beforehand, no single-request stuff is gonna help. No dice. > > > > > > > > > > > > Why not? > > > > > > > > It leaks credentials unnecessarily. > > > > > > Ah, good point! But this pattern (EAFP for web connections) is not really state of the art, is it? As mentioned, curl, for example, sends the authentication data in the very first request, which is a tool I would tend to *call* state of the art. > > > > No thats wrong. Curl will only send auth data if you provide it. > > > > Doing "curl -u user:pw" is the same as using WebClient httpGet:do: and adding the Authorization header manually > > > > > > The sequence is split manually: > > ``` > > $ curl https://api.github.com/repos/krono/debug/zipball/master > > { > > "message": "Not Found", > > "documentation_url": "https://docs.github.com/rest/reference/repos#download-a-repository-archive" > > } > > # Well, I'm left to guess. Maybe exists, maybe not. > > $ curl -u krono https://api.github.com/repos/krono/debug/zipball/master > > > > ``` > > (In this case, I can't even show what's going on as I use 2FA, which makes single-request REST to _never_ work on private repos.) > > > > The point is, you instruct Curl to _provide credentials unconditionally_. > > The "heavy lifting" of finding out when to do that is not done by curl but by users of curl. > > > > Look: > > > > ``` > > $ curl http://www.hpi.uni-potsdam.de/hirschfeld/squeaksource/xpaware/ > > $ > > # Well, no response? > > $ curl -v http://www.hpi.uni-potsdam.de/hirschfeld/squeaksource/xpaware/ > > * Trying 2001:638:807:204::8d59:e178... > > * TCP_NODELAY set > > * Connected to www.hpi.uni-potsdam.de (2001:638:807:204::8d59:e178) port 80 (#0) > > > GET /hirschfeld/squeaksource/xpaware/ HTTP/1.1 > > > Host: www.hpi.uni-potsdam.de > > > User-Agent: curl/7.54.0 > > > Accept: */* > > > > > < HTTP/1.1 401 > > < Date: Tue, 13 Oct 2020 07:43:04 GMT > > < Server: nginx/1.14.2 > > < Content-Length: 0 > > < WWW-Authenticate: Basic realm="SwaSource - XP aware" > > < > > * Connection #0 to host www.hpi.uni-potsdam.de left intact > > ``` > > > > Thats the 401 we're looking for. We have found that the resource needs authentication. > > > > Sidenote: Curl can do the roundtrip (man curl, search anyauth): > > > > ``` > > $ curl -u topa --anyauth -v http://www.hpi.uni-potsdam.de/hirschfeld/squeaksource/xpaware/ > > Enter host password for user 'topa': > > * Trying 2001:638:807:204::8d59:e178... > > * TCP_NODELAY set > > * Connected to www.hpi.uni-potsdam.de (2001:638:807:204::8d59:e178) port 80 (#0) > > > GET /hirschfeld/squeaksource/xpaware/ HTTP/1.1 > > > Host: www.hpi.uni-potsdam.de > > > User-Agent: curl/7.54.0 > > > Accept: */* > > > > > < HTTP/1.1 401 > > < Date: Tue, 13 Oct 2020 07:46:05 GMT > > < Server: nginx/1.14.2 > > < Content-Length: 0 > > < WWW-Authenticate: Basic realm="SwaSource - XP aware" > > < > > * Connection #0 to host www.hpi.uni-potsdam.de left intact > > * Issue another request to this URL: 'http://www.hpi.uni-potsdam.de/hirschfeld/squeaksource/xpaware/' > > * Found bundle for host www.hpi.uni-potsdam.de: 0x7fb8c8c0b1b0 [can pipeline] > > * Re-using existing connection! (#0) with host www.hpi.uni-potsdam.de > > * Connected to www.hpi.uni-potsdam.de (2001:638:807:204::8d59:e178) port 80 (#0) > > * Server auth using Basic with user 'topa' > > > GET /hirschfeld/squeaksource/xpaware/ HTTP/1.1 > > > Host: www.hpi.uni-potsdam.de > > > Authorization: Basic ******************* > > > User-Agent: curl/7.54.0 > > > Accept: */* > > > > > < HTTP/1.1 200 > > < Date: Tue, 13 Oct 2020 07:46:05 GMT > > < Server: nginx/1.14.2 > > < Content-Type: text/html > > < Content-Length: 15131 > > < Vary: Accept-Encoding > > ``` > > > > And in this case it does _not_ send auth in the first request but only in the second. > > > > Sidenote2: If the first request comes back 200, no second one is issued, no credentials leak: > > > > ``` > > $ curl -u topa --anyauth -v http://www.hpi.uni-potsdam.de/hirschfeld/squeaksource/xpforums/ > > Enter host password for user 'topa': > > * Trying 2001:638:807:204::8d59:e178... > > * TCP_NODELAY set > > * Connected to www.hpi.uni-potsdam.de (2001:638:807:204::8d59:e178) port 80 (#0) > > > GET /hirschfeld/squeaksource/xpforums/ HTTP/1.1 > > > Host: www.hpi.uni-potsdam.de > > > User-Agent: curl/7.54.0 > > > Accept: */* > > > > > < HTTP/1.1 200 > > < Date: Tue, 13 Oct 2020 07:46:56 GMT > > < Server: nginx/1.14.2 > > < Content-Type: text/html > > < Content-Length: 75860 > > < Vary: Accept-Encoding > > ``` > > > > > > > > > > > > > And speed is another point, given the fact that internet connections in Squeak are really slow ... > > > Why do you call this behavior a leak? The application developer will not pass authentication data to the web client unless they expect the server to consume these data anyway. > > > > So you always know beforehand which resources need authentication? > > Neat, I dont :D > > > > > If you deem it necessary, we could turn off the pre-authentication as soon as the client was redirected to another server ... > > > > What happens here is that we're bending over backwards because github decided to be a bad player. > > > > I mean, on most sited you visit in browsers, no auth data is sent _unless_ you are asked to (redirect to a login) or you _explicitely_ click on a login link. > > > > If you want preemtive auth, do it with WebClient httpGet:do:. > > > > > > > > > > > > > I understand that the method is maybe not the most common style, but I think that functional changes should in such cases not be mixed with style changes. > > > > > > Alright, please see WebClient-Core-ct.128. But maybe we should consider to use prettyDiff for the mailing list notifications as a default? Just an idea. > > > > I personally find prettydiffs useless, but that's just me. > > > > Best regards > > -Tobias From tomjonabc at gmail.com Mon Oct 26 09:59:24 2020 From: tomjonabc at gmail.com (Tom Beckmann) Date: Mon, 26 Oct 2020 10:59:24 +0100 Subject: [squeak-dev] The Inbox: WebClient-Core-ct.126.mcz In-Reply-To: <494468EE-CE59-43EA-ACA0-7C4987C3A47F@gmx.de> References: <2532b37139184eb6b0ecf3f288081b61@student.hpi.uni-potsdam.de> <0B67EEA2-2AC1-4156-A8D8-56C192B48EF6@gmx.de> <80f7baf3a0eb4d3685d8aea6f12aef5c@student.hpi.uni-potsdam.de> <11383fd575bc4eaeb8d2dec513a190bc@student.hpi.uni-potsdam.de> <8159c070274b4ec2a20469c278fa3cff@student.hpi.uni-potsdam.de> <163C8A17-6F6B-4EBF-B7A1-7082ED8A63BD@gmx.de> <0ab25f63845546d4ba87ac0f2c454b48@student.hpi.uni-potsdam.de> <494468EE-CE59-43EA-ACA0-7C4987C3A47F@gmx.de> Message-ID: Hi Tobias, > On 26.10.2020, at 08:39, Tom Beckmann wrote: > > > > Hey everyone, > > > > to sum up my understanding: the goal of this change is to change this > pattern > > > > WebClient new > > httpGet: ' > https://api.github.com/repos/myuser/myprivaterepo/zipball/master' > > do: [:req | req headerAt: 'Authorization' put: 'Basic ', > 'myuser:mypasswd' base64Encoded] > > > > to > > > > WebClient new > > preAuthenticateMethod: #basic; > > user: 'myuser' password: 'mypasswd'; > > httpGet: ' > https://api.github.com/repos/myuser/myprivaterepo/zipball/master' > > > > I dare say the fact that this pattern is required cannot be disputed > since a number of services, such as Github, require the user to > authenticate in this way. > > Sure, but it wont work for me anyways, Since I have 2FA. > :D Even with 2FA, `'Basic ', 'myuser:myPersonalAccessToken' base64Encoded` would currently give you the likely easiest way to access the endpoint using most clients. The way it reads [1] you are correct in that even this will no longer work and we would need to switch to `'token myPersonalAccessToken'` as the Authorization header. We should investigate soon if this would also affect the GitBrowser. Best, Tom [1] https://developer.github.com/changes/2020-02-14-deprecating-password-auth/ On Mon, Oct 26, 2020 at 10:37 AM Tobias Pape wrote: > > > On 25.10.2020, at 23:00, Thiede, Christoph < > Christoph.Thiede at student.hpi.uni-potsdam.de> wrote: > > > > Hi Tobias, > > > > > The API should stick to the HTTP RFCs and use 401 to say: You need > authentication. > > > > Hm, but this would be an information leak on the server-side. :-) > > somewhat, and I get what GitHub does… > > > > > > > Sadly you omitted the anyauth stuff that actually works how > Authentication in HTTP is spec'ed. > > > > Sorry about that. Still, even in curl, anyauth is an opt-in feature, not > an opt-out. So my proposal for adding #preAuthenticationMethod as an opt-in > feature would be equivalent to adding an #anyAuth property as an opt-out. > Why should WebClient be less powerful than curl? I see it can be abused, > but Squeak already contains a lot of dangerous protocols that still can be > useful in particular situations. Just insert a warning into the method > comment and it'll be OK I think. > > I don't think it works that way. > > > > > > > Except when you use "https://api.github.com/authorizations" first, > which 401s. > > > > True; but still, this would require either a change in the design or an > edge-case implementation because the WebClient connection logic is not > aware of whether GitHub or BitBucket or whatever else should be contacted. > > Or, you know, for wherever your GitHub client is implemented[1], make sure > to first go to the authz url when you have a password? > > [1]: Yes, I think you/we/one should have a GitHub client if working with > an API. It is not just a simple "web site" anymore. > > > > > > > Otherwise, encode it in the URL? > > > > Do you mean like http://username:password at www.example.com? At the > moment, WebClient is not treating this differently than WebClient >> > #username and #password. Is this the correct behavior? curl, again, uses > preauth in this situation, and Pharo does this, too. Unfortunately, I could > not find a clear answer to this question in RFC1738 ... > > ahh yes, :D. > I just imagined a browser, which would ask for PW on 401, but sent it > anyway if given in the URL. > > > =-=-= > Think of it that way. You do not present your passport at every door you > ring a bell, but only those you're asked for it. ;) > > > > > > > > Don't rely on just my "judgement" ;) > > > > Your arguments are highly appreciated! I'm just trying to figure out > your motivations ... Yepp, some >=3rd opinions would be a good thing. :-) > > > :) > > best regards > -tobias > > > > Best, > > Christoph > > Von: Squeak-dev im > Auftrag von Tobias Pape > > Gesendet: Sonntag, 25. Oktober 2020 22:19:49 > > An: The general-purpose Squeak developers list > > Betreff: Re: [squeak-dev] The Inbox: WebClient-Core-ct.126.mcz > > > > Hi > > > > > On 25.10.2020, at 22:03, Thiede, Christoph < > Christoph.Thiede at student.hpi.uni-potsdam.de> wrote: > > > > > > Hi Tobias, > > > > > > sorry for the long delay. I was on holiday a few days and did not > manage to return earlier to this interesting topic ... > > > > > > > > > > No thats wrong. Curl will only send auth data if you provide it. > > > > > > > Doing "curl -u user:pw" is the same as using WebClient httpGet:do: > and adding the Authorization header manually > > > > > > > The point is, you instruct Curl to _provide credentials > unconditionally_. > > > > > > I think this is exactly the point. "curl -u user:pw" reads as > "Download a resource, 'specify[ing] the user name and password to use for > server authentication"' (cited from the man). > > > > Yes, that means _unconditionally_, even if the source does not need it. > > This is called an information leak. > > > > > > > If I do > > > WebClient httpDo: [:client | client username: 'user'; password: 'pw'; > get: 'https://example.com/rest/whoami'], > > > this reads exactly the same for me. Otherwise, #username: and > #password: better might be renamed into > #optionalUsername/#lazyUsername/#usernameIfAsked etc. > > > > > > > Nope. > > > > > Apart from this, I have tested the behavior for Pharo, too, where the > default web client is ZnClient: And it works like curl, too, rather than > like our WebClient, i.e. the following works without any extra low-level > instructions: > > > > > > ZnClient new > > > url: ' > https://api.github.com/repos/LinqLover/openHAB-configuration/zipball/master > '; > > > username: 'LinqLover' password: 'mytoken'; > > > downloadTo: 'foo.zip' > > > > > > > So you always know beforehand which resources need authentication? > > > > Neat, I dont :D > > > > > > I suppose we are having different use cases in mind: You are thinking > of a generic browser application while I am thinking of a specific API > client implementation. Is this correct? > > > > No. The API should stick to the HTTP RFCs and use 401 to say: You need > authentication. > > > > > If I'm developing a REST API client, I do have to know whether a > resource requires authentication or whether it doesn't. This is usually > specified in the API documentation. Why add another level of uncertainty by > using this trial-and-error strategy? > > > > Because preemtive auth is wrong. > > > > Sadly you omitted the anyauth stuff that actually works how > Authentication in HTTP is spec'ed. > > Yes, it is "one request more". Yes, it is right thing to do. > > > > Just because it is convenient and just because people are doing it, it > does not mean it is good. > > In fact, the whole "curl as API-consumer" is fine, but sticking "-u" to > each and every request is a security nightmare just second to "curl ... | > sudo bash". > > > > > > > > > > > In the context of my Metacello PR, the problem is that following your > approach of specifying the Authorization header would mess up all the > different layers of abstraction that are not aware of web client > implementations and headers but only of a URL and a username/password pair. > I had hoped that I could pass a constant string 'Basic' to the > Authorization header for all cases where the WebClient is invoked, but > unfortunately, GitHub does not understand this either, the header must > contain the password even in the first run. > > > > Except when you use "https://api.github.com/authorizations" first, > which 401s. > > > > > > > It would lead to some portion on unhandsome spaghetti code if I had to > implement an edge case for GitHub in the relevant method > (MetacelloSqueakPlatform class >> #downloadZipArchive:to:username:pass:); > for this reason, I would find it really helpful to turn on preAuth at this > place. > > > > > Do you dislike this feature in general, even when turned off by > default? > > > > Yes. WebClient is not just an API-consumer. It ought to be safe. > > Otherwise, encode it in the URL? > > > > > I'm not even requiring to make this an opt-out feature, this inbox > version only implements it as an opt-in. > > > > I don't know. > > > > I think there has been too little input from others here. > > Don't rely on just my "judgement" ;) > > > > Best regards > > -Tobias > > > > > > > > > > Best, > > > Christoph > > > > > > Von: Squeak-dev im > Auftrag von Tobias Pape > > > Gesendet: Dienstag, 13. Oktober 2020 10:04:23 > > > An: The general-purpose Squeak developers list > > > Betreff: Re: [squeak-dev] The Inbox: WebClient-Core-ct.126.mcz > > > > > > Hi > > > > > > > On 12.10.2020, at 23:42, Thiede, Christoph < > Christoph.Thiede at student.hpi.uni-potsdam.de> wrote: > > > > > > > > Hi Tobias, > > > > > > > > okay, I see this authorization pattern now, so you mentioned two > ways to work around the current limitations: > > > > First, by GETting https://api.github.com/authorizations before, or > second, by passing the Authorization header manually. > > > > Is this correct? > > > > > > Yes. However, the second one is the one GitHub "recommends" > > > > > > > > > > > > > > However, both of these approaches lack of the RESTful-typical > simplicity of "making a single HTTP request without dealing with complex > call protocols or low-level connectivity code". To give an illustration of > my use case, please see this PR on Metacello: > https://github.com/Metacello/metacello/pull/534 > > > > IMHO it would be a shame if you could not access a popular REST API > like api.github.com in Squeak using a single message send to the > WebClient/WebSocket class. > > > > > > There is no such thing as simplicity when a REST-Based > resource-provider supports both authenticated and unauthenticated access. > > > If you cannot know beforehand, no single-request stuff is gonna help. > No dice. > > > > > > > > > > > > > > > > Why not? > > > > > > > > > > It leaks credentials unnecessarily. > > > > > > > > Ah, good point! But this pattern (EAFP for web connections) is not > really state of the art, is it? As mentioned, curl, for example, sends the > authentication data in the very first request, which is a tool I would tend > to *call* state of the art. > > > > > > No thats wrong. Curl will only send auth data if you provide it. > > > > > > Doing "curl -u user:pw" is the same as using WebClient httpGet:do: and > adding the Authorization header manually > > > > > > > > > The sequence is split manually: > > > ``` > > > $ curl https://api.github.com/repos/krono/debug/zipball/master > > > { > > > "message": "Not Found", > > > "documentation_url": " > https://docs.github.com/rest/reference/repos#download-a-repository-archive > " > > > } > > > # Well, I'm left to guess. Maybe exists, maybe not. > > > $ curl -u krono > https://api.github.com/repos/krono/debug/zipball/master > > > > > > ``` > > > (In this case, I can't even show what's going on as I use 2FA, which > makes single-request REST to _never_ work on private repos.) > > > > > > The point is, you instruct Curl to _provide credentials > unconditionally_. > > > The "heavy lifting" of finding out when to do that is not done by curl > but by users of curl. > > > > > > Look: > > > > > > ``` > > > $ curl http://www.hpi.uni-potsdam.de/hirschfeld/squeaksource/xpaware/ > > > $ > > > # Well, no response? > > > $ curl -v > http://www.hpi.uni-potsdam.de/hirschfeld/squeaksource/xpaware/ > > > * Trying 2001:638:807:204::8d59:e178... > > > * TCP_NODELAY set > > > * Connected to www.hpi.uni-potsdam.de (2001:638:807:204::8d59:e178) > port 80 (#0) > > > > GET /hirschfeld/squeaksource/xpaware/ HTTP/1.1 > > > > Host: www.hpi.uni-potsdam.de > > > > User-Agent: curl/7.54.0 > > > > Accept: */* > > > > > > > < HTTP/1.1 401 > > > < Date: Tue, 13 Oct 2020 07:43:04 GMT > > > < Server: nginx/1.14.2 > > > < Content-Length: 0 > > > < WWW-Authenticate: Basic realm="SwaSource - XP aware" > > > < > > > * Connection #0 to host www.hpi.uni-potsdam.de left intact > > > ``` > > > > > > Thats the 401 we're looking for. We have found that the resource needs > authentication. > > > > > > Sidenote: Curl can do the roundtrip (man curl, search anyauth): > > > > > > ``` > > > $ curl -u topa --anyauth -v > http://www.hpi.uni-potsdam.de/hirschfeld/squeaksource/xpaware/ > > > Enter host password for user 'topa': > > > * Trying 2001:638:807:204::8d59:e178... > > > * TCP_NODELAY set > > > * Connected to www.hpi.uni-potsdam.de (2001:638:807:204::8d59:e178) > port 80 (#0) > > > > GET /hirschfeld/squeaksource/xpaware/ HTTP/1.1 > > > > Host: www.hpi.uni-potsdam.de > > > > User-Agent: curl/7.54.0 > > > > Accept: */* > > > > > > > < HTTP/1.1 401 > > > < Date: Tue, 13 Oct 2020 07:46:05 GMT > > > < Server: nginx/1.14.2 > > > < Content-Length: 0 > > > < WWW-Authenticate: Basic realm="SwaSource - XP aware" > > > < > > > * Connection #0 to host www.hpi.uni-potsdam.de left intact > > > * Issue another request to this URL: ' > http://www.hpi.uni-potsdam.de/hirschfeld/squeaksource/xpaware/' > > > * Found bundle for host www.hpi.uni-potsdam.de: 0x7fb8c8c0b1b0 [can > pipeline] > > > * Re-using existing connection! (#0) with host www.hpi.uni-potsdam.de > > > * Connected to www.hpi.uni-potsdam.de (2001:638:807:204::8d59:e178) > port 80 (#0) > > > * Server auth using Basic with user 'topa' > > > > GET /hirschfeld/squeaksource/xpaware/ HTTP/1.1 > > > > Host: www.hpi.uni-potsdam.de > > > > Authorization: Basic ******************* > > > > User-Agent: curl/7.54.0 > > > > Accept: */* > > > > > > > < HTTP/1.1 200 > > > < Date: Tue, 13 Oct 2020 07:46:05 GMT > > > < Server: nginx/1.14.2 > > > < Content-Type: text/html > > > < Content-Length: 15131 > > > < Vary: Accept-Encoding > > > ``` > > > > > > And in this case it does _not_ send auth in the first request but only > in the second. > > > > > > Sidenote2: If the first request comes back 200, no second one is > issued, no credentials leak: > > > > > > ``` > > > $ curl -u topa --anyauth -v > http://www.hpi.uni-potsdam.de/hirschfeld/squeaksource/xpforums/ > > > Enter host password for user 'topa': > > > * Trying 2001:638:807:204::8d59:e178... > > > * TCP_NODELAY set > > > * Connected to www.hpi.uni-potsdam.de (2001:638:807:204::8d59:e178) > port 80 (#0) > > > > GET /hirschfeld/squeaksource/xpforums/ HTTP/1.1 > > > > Host: www.hpi.uni-potsdam.de > > > > User-Agent: curl/7.54.0 > > > > Accept: */* > > > > > > > < HTTP/1.1 200 > > > < Date: Tue, 13 Oct 2020 07:46:56 GMT > > > < Server: nginx/1.14.2 > > > < Content-Type: text/html > > > < Content-Length: 75860 > > > < Vary: Accept-Encoding > > > ``` > > > > > > > > > > > > > > > > > > > And speed is another point, given the fact that internet connections > in Squeak are really slow ... > > > > Why do you call this behavior a leak? The application developer will > not pass authentication data to the web client unless they expect the > server to consume these data anyway. > > > > > > So you always know beforehand which resources need authentication? > > > Neat, I dont :D > > > > > > > If you deem it necessary, we could turn off the pre-authentication > as soon as the client was redirected to another server ... > > > > > > What happens here is that we're bending over backwards because github > decided to be a bad player. > > > > > > I mean, on most sited you visit in browsers, no auth data is sent > _unless_ you are asked to (redirect to a login) or you _explicitely_ click > on a login link. > > > > > > If you want preemtive auth, do it with WebClient httpGet:do:. > > > > > > > > > > > > > > > > > > I understand that the method is maybe not the most common style, > but I think that functional changes should in such cases not be mixed with > style changes. > > > > > > > > Alright, please see WebClient-Core-ct.128. But maybe we should > consider to use prettyDiff for the mailing list notifications as a default? > Just an idea. > > > > > > I personally find prettydiffs useless, but that's just me. > > > > > > Best regards > > > -Tobias > > > > -------------- next part -------------- An HTML attachment was scrubbed... URL: From kksubbu.ml at gmail.com Mon Oct 26 10:12:25 2020 From: kksubbu.ml at gmail.com (K K Subbu) Date: Mon, 26 Oct 2020 15:42:25 +0530 Subject: [squeak-dev] Morphs and Data Question In-Reply-To: References: Message-ID: <3dbdaa23-e2cf-097d-06e9-9420e6fe4d24@gmail.com> On 25/10/20 8:14 pm, Eric Gade wrote: > For example, if I have some data related model with text that updates > and I want the "view" (the Morph) to update whenever this occurs? In my > own quick code I've always just implemented a `step` method that checks > for data on the model updates, but is that too brutal and inefficient? It depends. Stepping is for periodic sampling. If you have fast changing variables but a view is required, say, only once every 100ms, then stepping is fine. But if the changes are slow and asynchronous (say from radio buttons) then an observer pattern explained by Trygve is a better choice. HTH .. Subbu From gettimothy at zoho.com Mon Oct 26 12:07:33 2020 From: gettimothy at zoho.com (gettimothy) Date: Mon, 26 Oct 2020 08:07:33 -0400 Subject: [squeak-dev] Roassal3 status update and how to share work? Message-ID: <17564ce758b.cb1bcb4d34428.7239073609515268041@zoho.com> Hi folks, I have been saving my work via monticello and the mcz's are available at ftp://menmachinesmaterials.com/ Let me know if I should do the git/fork thing... The status of the RSChartExamples is.... RSChartExample new example01Markers open. RSChartExample new example02ScatterPlot open. RSChartExample new example03Plot open. RSChartExample new example04WithTick open. RSChartExample new example05WithTick open. RSChartExample new example06CustomNumberOfTicks open. RSChartExample new example07AdjustingFontSize open. RSChartExample new example08TwoCharts open. RSChartExample new example09LinearSqrtSymlog open. RSChartExample new example10BarPlot open. RSChartExample new example11BarplotCombinedWithLine open. RSChartExample new example12ScatterPlotAndNormalizer open. RSChartExample new example13AreaPlot open. RSChartExample new example14AreaPlotWithError open. RSChartExample new example15AreaBox open. RSChartExample new example16Series open. 1xRSChartExample new example17CLPvsUSD open. 2xRSChartExample new example18Animation open. ==1x & 2x What is the error. MessageNotUnderstood: LinearGradientPaint>>isTranslucent in BalloonEngine>>registerFills. RSBallonCanvas (BalloonCanvas) >>drawGeneralBezierShape: contours color: c borderWidth: borderWidth borderColor: borderColor "Draw a general boundary shape (e.g., possibly containing holes)" | fillC borderC | fillC := self shadowColor ifNil:[c]. < From Christoph.Thiede at student.hpi.uni-potsdam.de Mon Oct 26 13:12:26 2020 From: Christoph.Thiede at student.hpi.uni-potsdam.de (Thiede, Christoph) Date: Mon, 26 Oct 2020 13:12:26 +0000 Subject: [squeak-dev] The Inbox: Kernel-ct.1354.mcz In-Reply-To: References: , Message-ID: <5869d425627e47ae9df0fe5d51e8b7d0@student.hpi.uni-potsdam.de> Ooops :D Obviously, yes, sorry ... Best, Christoph ________________________________ Von: Squeak-dev im Auftrag von Taeumel, Marcel Gesendet: Montag, 26. Oktober 2020 07:41:59 An: squeak-dev Betreff: Re: [squeak-dev] The Inbox: Kernel-ct.1354.mcz Can this be moved to "treated" in favor of ct.1355? Am 24.10.2020 00:18:12 schrieb commits at source.squeak.org : A new version of Kernel was added to project The Inbox: http://source.squeak.org/inbox/Kernel-ct.1354.mcz ==================== Summary ==================== Name: Kernel-ct.1354 Author: ct Time: 24 October 2020, 12:18:01.669256 am UUID: 76d0d109-56f9-a640-b1af-a403809b23a2 Ancestors: Kernel-mt.1353 empty log message =============== Diff against Kernel-mt.1353 =============== -------------- next part -------------- An HTML attachment was scrubbed... URL: From Christoph.Thiede at student.hpi.uni-potsdam.de Mon Oct 26 13:14:02 2020 From: Christoph.Thiede at student.hpi.uni-potsdam.de (Thiede, Christoph) Date: Mon, 26 Oct 2020 13:14:02 +0000 Subject: [squeak-dev] assert:equals: in Object In-Reply-To: References: <79aca96b0f334332a72c84f0db65a307@student.hpi.uni-potsdam.de> , Message-ID: > Well, not sure it makes sense to have an image without SUnit. IMO, definitively if you have a server image for production purposes only. Best, Christoph ________________________________ Von: Squeak-dev im Auftrag von Taeumel, Marcel Gesendet: Montag, 26. Oktober 2020 07:40:06 An: squeak-dev Betreff: Re: [squeak-dev] assert:equals: in Object > A situation where SUnit and all the tests are not necessarily loaded. Hmm... maybe we might consider adding an SUnit-Core? Well, not sure it makes sense to have an image without SUnit. But then you might want to also strip, e.g., network support to shrink the image file a little bit more. :-) Best, Marcel Am 24.10.2020 13:01:30 schrieb H. Hirzel : On 10/9/20, Tony Garnock-Jones wrote: > Hi Christoph, > > On 10/9/20 4:53 PM, Thiede, Christoph wrote: >>> Anyway, having it by default be the case that Workspaces' >> code environments be TestCases seems very sensible to me. >> >> What do you mean by this? Such a TestCase receiver environment should >> definitively be not the default, this would be very confusing! > > Oh interesting! What kind of confusion do you foresee? I had just > imagined that the only visible-ish change would be availability of > TestCase instance-side methods on the "self" in the Workspace. > >>> "Assertions [...] MUST BE LEFT ACTIVE IN >>> PRODUCTION CODE >> Are we on the same page now? :-) > > Yes, I think we are! :-) Thanks. > > Tony I consider that assertions are useful to have in the production code an an argument in favor of having assert:equals:description: implemented the class Object. A situation where SUnit and all the tests are not necessarily loaded. --Hannes -------------- next part -------------- An HTML attachment was scrubbed... URL: From Christoph.Thiede at student.hpi.uni-potsdam.de Mon Oct 26 13:25:45 2020 From: Christoph.Thiede at student.hpi.uni-potsdam.de (Thiede, Christoph) Date: Mon, 26 Oct 2020 13:25:45 +0000 Subject: [squeak-dev] The Inbox: WebClient-Core-ct.126.mcz In-Reply-To: References: <2532b37139184eb6b0ecf3f288081b61@student.hpi.uni-potsdam.de> <0B67EEA2-2AC1-4156-A8D8-56C192B48EF6@gmx.de> <80f7baf3a0eb4d3685d8aea6f12aef5c@student.hpi.uni-potsdam.de> <11383fd575bc4eaeb8d2dec513a190bc@student.hpi.uni-potsdam.de> <8159c070274b4ec2a20469c278fa3cff@student.hpi.uni-potsdam.de> <163C8A17-6F6B-4EBF-B7A1-7082ED8A63BD@gmx.de> <0ab25f63845546d4ba87ac0f2c454b48@student.hpi.uni-potsdam.de> <494468EE-CE59-43EA-ACA0-7C4987C3A47F@gmx.de>, Message-ID: <7bbd79122ee646edab0e2a540d69effb@student.hpi.uni-potsdam.de> Hi Tom, Hi Tobias, > Maybe I also missed an update that cleaned the diff but couldn't find a "perfect" one in the inbox thus far :) Is WebClient-Core-ct.128 not yet perfect enough for you? :-) > And It won't work in 4 weeks time anyways You can still use an access token as a password - actually, I never trust any Squeak image with my real GitHub password because Squeak does not store the password protected. > Or, you know, for wherever your GitHub client is implemented[1], make sure to first go to the authz url when you have a password? Still an edge case. Does this read nice to you? https://github.com/Metacello/metacello/blob/3b7d6814d155088910d6c7b17e85d89ba55f078e/repository/Metacello-Platform.squeak.package/MetacelloSqueakPlatform.class/instance/httpGet.username.pass.do..st Best, Christoph ________________________________ Von: Squeak-dev im Auftrag von Tom Beckmann Gesendet: Montag, 26. Oktober 2020 10:59:24 An: The general-purpose Squeak developers list Betreff: Re: [squeak-dev] The Inbox: WebClient-Core-ct.126.mcz Hi Tobias, > On 26.10.2020, at 08:39, Tom Beckmann > wrote: > > Hey everyone, > > to sum up my understanding: the goal of this change is to change this pattern > > WebClient new > httpGet: 'https://api.github.com/repos/myuser/myprivaterepo/zipball/master' > do: [:req | req headerAt: 'Authorization' put: 'Basic ', 'myuser:mypasswd' base64Encoded] > > to > > WebClient new > preAuthenticateMethod: #basic; > user: 'myuser' password: 'mypasswd'; > httpGet: 'https://api.github.com/repos/myuser/myprivaterepo/zipball/master' > > I dare say the fact that this pattern is required cannot be disputed since a number of services, such as Github, require the user to authenticate in this way. Sure, but it wont work for me anyways, Since I have 2FA. :D Even with 2FA, `'Basic ', 'myuser:myPersonalAccessToken' base64Encoded` would currently give you the likely easiest way to access the endpoint using most clients. The way it reads [1] you are correct in that even this will no longer work and we would need to switch to `'token myPersonalAccessToken'` as the Authorization header. We should investigate soon if this would also affect the GitBrowser. Best, Tom [1] https://developer.github.com/changes/2020-02-14-deprecating-password-auth/ On Mon, Oct 26, 2020 at 10:37 AM Tobias Pape > wrote: > On 25.10.2020, at 23:00, Thiede, Christoph > wrote: > > Hi Tobias, > > > The API should stick to the HTTP RFCs and use 401 to say: You need authentication. > > Hm, but this would be an information leak on the server-side. :-) somewhat, and I get what GitHub does… > > > Sadly you omitted the anyauth stuff that actually works how Authentication in HTTP is spec'ed. > > Sorry about that. Still, even in curl, anyauth is an opt-in feature, not an opt-out. So my proposal for adding #preAuthenticationMethod as an opt-in feature would be equivalent to adding an #anyAuth property as an opt-out. Why should WebClient be less powerful than curl? I see it can be abused, but Squeak already contains a lot of dangerous protocols that still can be useful in particular situations. Just insert a warning into the method comment and it'll be OK I think. I don't think it works that way. > > > Except when you use "https://api.github.com/authorizations" first, which 401s. > > True; but still, this would require either a change in the design or an edge-case implementation because the WebClient connection logic is not aware of whether GitHub or BitBucket or whatever else should be contacted. Or, you know, for wherever your GitHub client is implemented[1], make sure to first go to the authz url when you have a password? [1]: Yes, I think you/we/one should have a GitHub client if working with an API. It is not just a simple "web site" anymore. > > > Otherwise, encode it in the URL? > > Do you mean like http://username:password at www.example.com? At the moment, WebClient is not treating this differently than WebClient >> #username and #password. Is this the correct behavior? curl, again, uses preauth in this situation, and Pharo does this, too. Unfortunately, I could not find a clear answer to this question in RFC1738 ... ahh yes, :D. I just imagined a browser, which would ask for PW on 401, but sent it anyway if given in the URL. =-=-= Think of it that way. You do not present your passport at every door you ring a bell, but only those you're asked for it. ;) > > > Don't rely on just my "judgement" ;) > > Your arguments are highly appreciated! I'm just trying to figure out your motivations ... Yepp, some >=3rd opinions would be a good thing. :-) :) best regards -tobias > > Best, > Christoph > Von: Squeak-dev > im Auftrag von Tobias Pape > > Gesendet: Sonntag, 25. Oktober 2020 22:19:49 > An: The general-purpose Squeak developers list > Betreff: Re: [squeak-dev] The Inbox: WebClient-Core-ct.126.mcz > > Hi > > > On 25.10.2020, at 22:03, Thiede, Christoph > wrote: > > > > Hi Tobias, > > > > sorry for the long delay. I was on holiday a few days and did not manage to return earlier to this interesting topic ... > > > > > > > No thats wrong. Curl will only send auth data if you provide it. > > > > > Doing "curl -u user:pw" is the same as using WebClient httpGet:do: and adding the Authorization header manually > > > > > The point is, you instruct Curl to _provide credentials unconditionally_. > > > > I think this is exactly the point. "curl -u user:pw" reads as "Download a resource, 'specify[ing] the user name and password to use for server authentication"' (cited from the man). > > Yes, that means _unconditionally_, even if the source does not need it. > This is called an information leak. > > > > If I do > > WebClient httpDo: [:client | client username: 'user'; password: 'pw'; get: 'https://example.com/rest/whoami'], > > this reads exactly the same for me. Otherwise, #username: and #password: better might be renamed into #optionalUsername/#lazyUsername/#usernameIfAsked etc. > > > > Nope. > > > Apart from this, I have tested the behavior for Pharo, too, where the default web client is ZnClient: And it works like curl, too, rather than like our WebClient, i.e. the following works without any extra low-level instructions: > > > > ZnClient new > > url: 'https://api.github.com/repos/LinqLover/openHAB-configuration/zipball/master'; > > username: 'LinqLover' password: 'mytoken'; > > downloadTo: 'foo.zip' > > > > > So you always know beforehand which resources need authentication? > > > Neat, I dont :D > > > > I suppose we are having different use cases in mind: You are thinking of a generic browser application while I am thinking of a specific API client implementation. Is this correct? > > No. The API should stick to the HTTP RFCs and use 401 to say: You need authentication. > > > If I'm developing a REST API client, I do have to know whether a resource requires authentication or whether it doesn't. This is usually specified in the API documentation. Why add another level of uncertainty by using this trial-and-error strategy? > > Because preemtive auth is wrong. > > Sadly you omitted the anyauth stuff that actually works how Authentication in HTTP is spec'ed. > Yes, it is "one request more". Yes, it is right thing to do. > > Just because it is convenient and just because people are doing it, it does not mean it is good. > In fact, the whole "curl as API-consumer" is fine, but sticking "-u" to each and every request is a security nightmare just second to "curl ... | sudo bash". > > > > > > > In the context of my Metacello PR, the problem is that following your approach of specifying the Authorization header would mess up all the different layers of abstraction that are not aware of web client implementations and headers but only of a URL and a username/password pair. I had hoped that I could pass a constant string 'Basic' to the Authorization header for all cases where the WebClient is invoked, but unfortunately, GitHub does not understand this either, the header must contain the password even in the first run. > > Except when you use "https://api.github.com/authorizations" first, which 401s. > > > > It would lead to some portion on unhandsome spaghetti code if I had to implement an edge case for GitHub in the relevant method (MetacelloSqueakPlatform class >> #downloadZipArchive:to:username:pass:); for this reason, I would find it really helpful to turn on preAuth at this place. > > > Do you dislike this feature in general, even when turned off by default? > > Yes. WebClient is not just an API-consumer. It ought to be safe. > Otherwise, encode it in the URL? > > > I'm not even requiring to make this an opt-out feature, this inbox version only implements it as an opt-in. > > I don't know. > > I think there has been too little input from others here. > Don't rely on just my "judgement" ;) > > Best regards > -Tobias > > > > > > Best, > > Christoph > > > > Von: Squeak-dev > im Auftrag von Tobias Pape > > > Gesendet: Dienstag, 13. Oktober 2020 10:04:23 > > An: The general-purpose Squeak developers list > > Betreff: Re: [squeak-dev] The Inbox: WebClient-Core-ct.126.mcz > > > > Hi > > > > > On 12.10.2020, at 23:42, Thiede, Christoph > wrote: > > > > > > Hi Tobias, > > > > > > okay, I see this authorization pattern now, so you mentioned two ways to work around the current limitations: > > > First, by GETting https://api.github.com/authorizations before, or second, by passing the Authorization header manually. > > > Is this correct? > > > > Yes. However, the second one is the one GitHub "recommends" > > > > > > > > > > However, both of these approaches lack of the RESTful-typical simplicity of "making a single HTTP request without dealing with complex call protocols or low-level connectivity code". To give an illustration of my use case, please see this PR on Metacello:https://github.com/Metacello/metacello/pull/534 > > > IMHO it would be a shame if you could not access a popular REST API like api.github.com in Squeak using a single message send to the WebClient/WebSocket class. > > > > There is no such thing as simplicity when a REST-Based resource-provider supports both authenticated and unauthenticated access. > > If you cannot know beforehand, no single-request stuff is gonna help. No dice. > > > > > > > > > > > > Why not? > > > > > > > > It leaks credentials unnecessarily. > > > > > > Ah, good point! But this pattern (EAFP for web connections) is not really state of the art, is it? As mentioned, curl, for example, sends the authentication data in the very first request, which is a tool I would tend to *call* state of the art. > > > > No thats wrong. Curl will only send auth data if you provide it. > > > > Doing "curl -u user:pw" is the same as using WebClient httpGet:do: and adding the Authorization header manually > > > > > > The sequence is split manually: > > ``` > > $ curl https://api.github.com/repos/krono/debug/zipball/master > > { > > "message": "Not Found", > > "documentation_url": "https://docs.github.com/rest/reference/repos#download-a-repository-archive" > > } > > # Well, I'm left to guess. Maybe exists, maybe not. > > $ curl -u krono https://api.github.com/repos/krono/debug/zipball/master > > > > ``` > > (In this case, I can't even show what's going on as I use 2FA, which makes single-request REST to _never_ work on private repos.) > > > > The point is, you instruct Curl to _provide credentials unconditionally_. > > The "heavy lifting" of finding out when to do that is not done by curl but by users of curl. > > > > Look: > > > > ``` > > $ curl http://www.hpi.uni-potsdam.de/hirschfeld/squeaksource/xpaware/ > > $ > > # Well, no response? > > $ curl -v http://www.hpi.uni-potsdam.de/hirschfeld/squeaksource/xpaware/ > > * Trying 2001:638:807:204::8d59:e178... > > * TCP_NODELAY set > > * Connected to www.hpi.uni-potsdam.de (2001:638:807:204::8d59:e178) port 80 (#0) > > > GET /hirschfeld/squeaksource/xpaware/ HTTP/1.1 > > > Host: www.hpi.uni-potsdam.de > > > User-Agent: curl/7.54.0 > > > Accept: */* > > > > > < HTTP/1.1 401 > > < Date: Tue, 13 Oct 2020 07:43:04 GMT > > < Server: nginx/1.14.2 > > < Content-Length: 0 > > < WWW-Authenticate: Basic realm="SwaSource - XP aware" > > < > > * Connection #0 to host www.hpi.uni-potsdam.de left intact > > ``` > > > > Thats the 401 we're looking for. We have found that the resource needs authentication. > > > > Sidenote: Curl can do the roundtrip (man curl, search anyauth): > > > > ``` > > $ curl -u topa --anyauth -v http://www.hpi.uni-potsdam.de/hirschfeld/squeaksource/xpaware/ > > Enter host password for user 'topa': > > * Trying 2001:638:807:204::8d59:e178... > > * TCP_NODELAY set > > * Connected to www.hpi.uni-potsdam.de (2001:638:807:204::8d59:e178) port 80 (#0) > > > GET /hirschfeld/squeaksource/xpaware/ HTTP/1.1 > > > Host: www.hpi.uni-potsdam.de > > > User-Agent: curl/7.54.0 > > > Accept: */* > > > > > < HTTP/1.1 401 > > < Date: Tue, 13 Oct 2020 07:46:05 GMT > > < Server: nginx/1.14.2 > > < Content-Length: 0 > > < WWW-Authenticate: Basic realm="SwaSource - XP aware" > > < > > * Connection #0 to host www.hpi.uni-potsdam.de left intact > > * Issue another request to this URL: 'http://www.hpi.uni-potsdam.de/hirschfeld/squeaksource/xpaware/' > > * Found bundle for host www.hpi.uni-potsdam.de: 0x7fb8c8c0b1b0 [can pipeline] > > * Re-using existing connection! (#0) with host www.hpi.uni-potsdam.de > > * Connected to www.hpi.uni-potsdam.de (2001:638:807:204::8d59:e178) port 80 (#0) > > * Server auth using Basic with user 'topa' > > > GET /hirschfeld/squeaksource/xpaware/ HTTP/1.1 > > > Host: www.hpi.uni-potsdam.de > > > Authorization: Basic ******************* > > > User-Agent: curl/7.54.0 > > > Accept: */* > > > > > < HTTP/1.1 200 > > < Date: Tue, 13 Oct 2020 07:46:05 GMT > > < Server: nginx/1.14.2 > > < Content-Type: text/html > > < Content-Length: 15131 > > < Vary: Accept-Encoding > > ``` > > > > And in this case it does _not_ send auth in the first request but only in the second. > > > > Sidenote2: If the first request comes back 200, no second one is issued, no credentials leak: > > > > ``` > > $ curl -u topa --anyauth -v http://www.hpi.uni-potsdam.de/hirschfeld/squeaksource/xpforums/ > > Enter host password for user 'topa': > > * Trying 2001:638:807:204::8d59:e178... > > * TCP_NODELAY set > > * Connected to www.hpi.uni-potsdam.de (2001:638:807:204::8d59:e178) port 80 (#0) > > > GET /hirschfeld/squeaksource/xpforums/ HTTP/1.1 > > > Host: www.hpi.uni-potsdam.de > > > User-Agent: curl/7.54.0 > > > Accept: */* > > > > > < HTTP/1.1 200 > > < Date: Tue, 13 Oct 2020 07:46:56 GMT > > < Server: nginx/1.14.2 > > < Content-Type: text/html > > < Content-Length: 75860 > > < Vary: Accept-Encoding > > ``` > > > > > > > > > > > > > And speed is another point, given the fact that internet connections in Squeak are really slow ... > > > Why do you call this behavior a leak? The application developer will not pass authentication data to the web client unless they expect the server to consume these data anyway. > > > > So you always know beforehand which resources need authentication? > > Neat, I dont :D > > > > > If you deem it necessary, we could turn off the pre-authentication as soon as the client was redirected to another server ... > > > > What happens here is that we're bending over backwards because github decided to be a bad player. > > > > I mean, on most sited you visit in browsers, no auth data is sent _unless_ you are asked to (redirect to a login) or you _explicitely_ click on a login link. > > > > If you want preemtive auth, do it with WebClient httpGet:do:. > > > > > > > > > > > > > I understand that the method is maybe not the most common style, but I think that functional changes should in such cases not be mixed with style changes. > > > > > > Alright, please see WebClient-Core-ct.128. But maybe we should consider to use prettyDiff for the mailing list notifications as a default? Just an idea. > > > > I personally find prettydiffs useless, but that's just me. > > > > Best regards > > -Tobias -------------- next part -------------- An HTML attachment was scrubbed... URL: From gettimothy at zoho.com Mon Oct 26 13:25:45 2020 From: gettimothy at zoho.com (gettimothy) Date: Mon, 26 Oct 2020 09:25:45 -0400 Subject: [squeak-dev] Roassal3 update RSAnimationExamples also, the Morphic team may want to make "screen savers" out of some of this stuff (: Message-ID: <17565160ce6.1002d728335558.2943827498794342023@zoho.com> Hi folks Quick Roassal3 update... Quite a few of the RSAnimationExamples work. In the below, an x preceding it means it does not work. (semi works) means the balloon morph at least opens. Levente, check out RSAnimationExamples new  example33AnimatedLayout open.  bet we can put the XTreams AST into this for degugging... xRSAnimationExamples new example01BoxWindmill  open. xRSAnimationExamples new example02BoxesLineCircles  open. RSAnimationExamples new  example03Atom  open.   (semi works) xRSAnimationExamples new  example04Phyco  open. RSAnimationExamples new example05ElasticEllipses  open.  (colors differ from pharo) RSAnimationExamples new  example06LinePatterns open.   (semi works) RSAnimationExamples new example07CircleParty  open. (semi works) xRSAnimationExamples new example08ArcTree  open. RSAnimationExamples new  example09PerlinParticles  open. (c to clear does not work) RSAnimationExamples new   example09b open. xRSAnimationExamples new   example10Arcs open. RSAnimationExamples new  example11C open. RSAnimationExamples new  example12Sky open. RSAnimationExamples new  example13ArcNoise open. RSAnimationExamples new  example14Retina open. xRSAnimationExamples new   example15SpaceDandy open. xRSAnimationExamples new  example16Gris open. RSAnimationExamples new  example17Flor open. RSAnimationExamples new  example18Rainbow open. RSAnimationExamples new  example19Stars open. xRSAnimationExamples new  example20CircleWaves open.  (semi works) xRSAnimationExamples new  example21Lines open. xRSAnimationExamples new  example22Lines open. RSAnimationExamples new example23PerlinNoise  open.  (semi works) RSAnimationExamples new example24RoassalPerlinNoise  open. (semi works) RSAnimationExamples new  example25AnimationCircle open. RSAnimationExamples new  example26Bezier open. xRSAnimationExamples new  example27RSLocate open. RSAnimationExamples new  example28AlteredWorld open. RSAnimationExamples new example29Tick  open. xRSAnimationExamples new  example30Perlin open. RSAnimationExamples new example31RoundRectagles  open.   (nice!) xRSAnimationExamples new example32SimpleClock  open. RSAnimationExamples new  example33AnimatedLayout open. (semi works...totally cool on pharo, will work great for the Abstract Syntax Tree) xRSAnimationExamples new example34ForceLayout  open. xRSAnimationExamples new example35Roassal  open. xRSAnimationExamples new  example36Title open. RSAnimationExamples new example37RectangleForceLayout  open. xRSAnimationExamples new example38PerlinRose  open. xRSAnimationExamples new example39Duna  open. RSAnimationExamples new example40Circles  open. RSAnimationExamples new  example41River open.  (semi works) RSAnimationExamples new  example42OneLine open. RSAnimationExamples new  example43Waves open.  (semi works) xRSAnimationExamples new  example44A open. -------------- next part -------------- An HTML attachment was scrubbed... URL: From tomjonabc at gmail.com Mon Oct 26 13:33:31 2020 From: tomjonabc at gmail.com (Tom Beckmann) Date: Mon, 26 Oct 2020 14:33:31 +0100 Subject: [squeak-dev] The Inbox: WebClient-Core-ct.126.mcz In-Reply-To: <7bbd79122ee646edab0e2a540d69effb@student.hpi.uni-potsdam.de> References: <2532b37139184eb6b0ecf3f288081b61@student.hpi.uni-potsdam.de> <0B67EEA2-2AC1-4156-A8D8-56C192B48EF6@gmx.de> <80f7baf3a0eb4d3685d8aea6f12aef5c@student.hpi.uni-potsdam.de> <11383fd575bc4eaeb8d2dec513a190bc@student.hpi.uni-potsdam.de> <8159c070274b4ec2a20469c278fa3cff@student.hpi.uni-potsdam.de> <163C8A17-6F6B-4EBF-B7A1-7082ED8A63BD@gmx.de> <0ab25f63845546d4ba87ac0f2c454b48@student.hpi.uni-potsdam.de> <494468EE-CE59-43EA-ACA0-7C4987C3A47F@gmx.de> <7bbd79122ee646edab0e2a540d69effb@student.hpi.uni-potsdam.de> Message-ID: Hi Christoph, > > Maybe I also missed an update that cleaned the diff but couldn't find a "perfect" one in the inbox thus far :) > > Is WebClient-Core-ct.128 not yet perfect enough for you? :-) I assume it's this, right? [1] There are still a number of changed empty lines and e.g. the change from `1 to: do: ` to use `detect:`, which are changes I agree with, but also make the diff unnecessarily large. Hope I'm not mistaken about these not being integral for your proposed change :) Best, Tom [1] http://forum.world.st/The-Inbox-WebClient-Core-ct-128-mcz-td5123384.html On Mon, Oct 26, 2020 at 2:25 PM Thiede, Christoph < Christoph.Thiede at student.hpi.uni-potsdam.de> wrote: > Hi Tom, Hi Tobias, > > > > Maybe I also missed an update that cleaned the diff but couldn't find a > "perfect" one in the inbox thus far :) > > > Is WebClient-Core-ct.128 not yet perfect enough for you? :-) > > > And It won't work in 4 weeks time anyways > > You can still use an access token as a password - actually, I never trust > any Squeak image with my real GitHub password because Squeak does not store > the password protected. > > > Or, you know, for wherever your GitHub client is implemented[1], make > sure to first go to the authz url when you have a password? > > Still an edge case. Does this read nice to you? > > https://github.com/Metacello/metacello/blob/3b7d6814d155088910d6c7b17e85d89ba55f078e/repository/Metacello-Platform.squeak.package/MetacelloSqueakPlatform.class/instance/httpGet.username.pass.do..st > > Best, > Christoph > ------------------------------ > *Von:* Squeak-dev im > Auftrag von Tom Beckmann > *Gesendet:* Montag, 26. Oktober 2020 10:59:24 > *An:* The general-purpose Squeak developers list > *Betreff:* Re: [squeak-dev] The Inbox: WebClient-Core-ct.126.mcz > > Hi Tobias, > > > On 26.10.2020, at 08:39, Tom Beckmann wrote: >> > >> > Hey everyone, >> > >> > to sum up my understanding: the goal of this change is to change this >> pattern >> > >> > WebClient new >> > httpGet: ' >> https://api.github.com/repos/myuser/myprivaterepo/zipball/master' >> > do: [:req | req headerAt: 'Authorization' put: 'Basic ', >> 'myuser:mypasswd' base64Encoded] >> > >> > to >> > >> > WebClient new >> > preAuthenticateMethod: #basic; >> > user: 'myuser' password: 'mypasswd'; >> > httpGet: ' >> https://api.github.com/repos/myuser/myprivaterepo/zipball/master' >> > >> > I dare say the fact that this pattern is required cannot be disputed >> since a number of services, such as Github, require the user to >> authenticate in this way. >> >> Sure, but it wont work for me anyways, Since I have 2FA. >> :D > > > Even with 2FA, `'Basic ', 'myuser:myPersonalAccessToken' base64Encoded` > would currently give you the likely easiest way to access the endpoint > using most clients. The way it reads [1] you are correct in that even this > will no longer work and we would need to switch to `'token > myPersonalAccessToken'` as the Authorization header. We should investigate > soon if this would also affect the GitBrowser. > > Best, > Tom > > [1] > https://developer.github.com/changes/2020-02-14-deprecating-password-auth/ > > > On Mon, Oct 26, 2020 at 10:37 AM Tobias Pape wrote: > >> >> > On 25.10.2020, at 23:00, Thiede, Christoph < >> Christoph.Thiede at student.hpi.uni-potsdam.de> wrote: >> > >> > Hi Tobias, >> > >> > > The API should stick to the HTTP RFCs and use 401 to say: You need >> authentication. >> > >> > Hm, but this would be an information leak on the server-side. :-) >> >> somewhat, and I get what GitHub does… >> >> >> > >> > > Sadly you omitted the anyauth stuff that actually works how >> Authentication in HTTP is spec'ed. >> > >> > Sorry about that. Still, even in curl, anyauth is an opt-in feature, >> not an opt-out. So my proposal for adding #preAuthenticationMethod as an >> opt-in feature would be equivalent to adding an #anyAuth property as an >> opt-out. Why should WebClient be less powerful than curl? I see it can be >> abused, but Squeak already contains a lot of dangerous protocols that still >> can be useful in particular situations. Just insert a warning into the >> method comment and it'll be OK I think. >> >> I don't think it works that way. >> >> >> > >> > > Except when you use "https://api.github.com/authorizations" first, >> which 401s. >> > >> > True; but still, this would require either a change in the design or an >> edge-case implementation because the WebClient connection logic is not >> aware of whether GitHub or BitBucket or whatever else should be contacted. >> >> Or, you know, for wherever your GitHub client is implemented[1], make >> sure to first go to the authz url when you have a password? >> >> [1]: Yes, I think you/we/one should have a GitHub client if working with >> an API. It is not just a simple "web site" anymore. >> >> >> > >> > > Otherwise, encode it in the URL? >> > >> > Do you mean like http://username:password at www.example.com? At the >> moment, WebClient is not treating this differently than WebClient >> >> #username and #password. Is this the correct behavior? curl, again, uses >> preauth in this situation, and Pharo does this, too. Unfortunately, I could >> not find a clear answer to this question in RFC1738 ... >> >> ahh yes, :D. >> I just imagined a browser, which would ask for PW on 401, but sent it >> anyway if given in the URL. >> >> >> =-=-= >> Think of it that way. You do not present your passport at every door you >> ring a bell, but only those you're asked for it. ;) >> >> >> >> > >> > > Don't rely on just my "judgement" ;) >> > >> > Your arguments are highly appreciated! I'm just trying to figure out >> your motivations ... Yepp, some >=3rd opinions would be a good thing. :-) >> >> >> :) >> >> best regards >> -tobias >> > >> > Best, >> > Christoph >> > Von: Squeak-dev im >> Auftrag von Tobias Pape >> > Gesendet: Sonntag, 25. Oktober 2020 22:19:49 >> > An: The general-purpose Squeak developers list >> > Betreff: Re: [squeak-dev] The Inbox: WebClient-Core-ct.126.mcz >> > >> > Hi >> > >> > > On 25.10.2020, at 22:03, Thiede, Christoph < >> Christoph.Thiede at student.hpi.uni-potsdam.de> wrote: >> > > >> > > Hi Tobias, >> > > >> > > sorry for the long delay. I was on holiday a few days and did not >> manage to return earlier to this interesting topic ... >> > > >> > > >> > > > No thats wrong. Curl will only send auth data if you provide it. >> > > >> > > > Doing "curl -u user:pw" is the same as using WebClient httpGet:do: >> and adding the Authorization header manually >> > > >> > > > The point is, you instruct Curl to _provide credentials >> unconditionally_. >> > > >> > > I think this is exactly the point. "curl -u user:pw" reads as >> "Download a resource, 'specify[ing] the user name and password to use for >> server authentication"' (cited from the man). >> > >> > Yes, that means _unconditionally_, even if the source does not need it. >> > This is called an information leak. >> > >> > >> > > If I do >> > > WebClient httpDo: [:client | client username: 'user'; password: 'pw'; >> get: 'https://example.com/rest/whoami'], >> > > this reads exactly the same for me. Otherwise, #username: and >> #password: better might be renamed into >> #optionalUsername/#lazyUsername/#usernameIfAsked etc. >> > > >> > >> > Nope. >> > >> > > Apart from this, I have tested the behavior for Pharo, too, where the >> default web client is ZnClient: And it works like curl, too, rather than >> like our WebClient, i.e. the following works without any extra low-level >> instructions: >> > > >> > > ZnClient new >> > > url: ' >> https://api.github.com/repos/LinqLover/openHAB-configuration/zipball/master >> '; >> > > username: 'LinqLover' password: 'mytoken'; >> > > downloadTo: 'foo.zip' >> > > >> > > > So you always know beforehand which resources need authentication? >> > > > Neat, I dont :D >> > > >> > > I suppose we are having different use cases in mind: You are thinking >> of a generic browser application while I am thinking of a specific API >> client implementation. Is this correct? >> > >> > No. The API should stick to the HTTP RFCs and use 401 to say: You need >> authentication. >> > >> > > If I'm developing a REST API client, I do have to know whether a >> resource requires authentication or whether it doesn't. This is usually >> specified in the API documentation. Why add another level of uncertainty by >> using this trial-and-error strategy? >> > >> > Because preemtive auth is wrong. >> > >> > Sadly you omitted the anyauth stuff that actually works how >> Authentication in HTTP is spec'ed. >> > Yes, it is "one request more". Yes, it is right thing to do. >> > >> > Just because it is convenient and just because people are doing it, it >> does not mean it is good. >> > In fact, the whole "curl as API-consumer" is fine, but sticking "-u" to >> each and every request is a security nightmare just second to "curl ... | >> sudo bash". >> > >> > > >> > > >> > > In the context of my Metacello PR, the problem is that following your >> approach of specifying the Authorization header would mess up all the >> different layers of abstraction that are not aware of web client >> implementations and headers but only of a URL and a username/password pair. >> I had hoped that I could pass a constant string 'Basic' to the >> Authorization header for all cases where the WebClient is invoked, but >> unfortunately, GitHub does not understand this either, the header must >> contain the password even in the first run. >> > >> > Except when you use "https://api.github.com/authorizations" first, >> which 401s. >> > >> > >> > > It would lead to some portion on unhandsome spaghetti code if I had >> to implement an edge case for GitHub in the relevant method >> (MetacelloSqueakPlatform class >> #downloadZipArchive:to:username:pass:); >> for this reason, I would find it really helpful to turn on preAuth at this >> place. >> > >> > > Do you dislike this feature in general, even when turned off by >> default? >> > >> > Yes. WebClient is not just an API-consumer. It ought to be safe. >> > Otherwise, encode it in the URL? >> > >> > > I'm not even requiring to make this an opt-out feature, this inbox >> version only implements it as an opt-in. >> > >> > I don't know. >> > >> > I think there has been too little input from others here. >> > Don't rely on just my "judgement" ;) >> > >> > Best regards >> > -Tobias >> > >> > >> > > >> > > Best, >> > > Christoph >> > > >> > > Von: Squeak-dev im >> Auftrag von Tobias Pape >> > > Gesendet: Dienstag, 13. Oktober 2020 10:04:23 >> > > An: The general-purpose Squeak developers list >> > > Betreff: Re: [squeak-dev] The Inbox: WebClient-Core-ct.126.mcz >> > > >> > > Hi >> > > >> > > > On 12.10.2020, at 23:42, Thiede, Christoph < >> Christoph.Thiede at student.hpi.uni-potsdam.de> wrote: >> > > > >> > > > Hi Tobias, >> > > > >> > > > okay, I see this authorization pattern now, so you mentioned two >> ways to work around the current limitations: >> > > > First, by GETting https://api.github.com/authorizations before, or >> second, by passing the Authorization header manually. >> > > > Is this correct? >> > > >> > > Yes. However, the second one is the one GitHub "recommends" >> > > >> > > >> > > > >> > > > However, both of these approaches lack of the RESTful-typical >> simplicity of "making a single HTTP request without dealing with complex >> call protocols or low-level connectivity code". To give an illustration of >> my use case, please see this PR on Metacello: >> https://github.com/Metacello/metacello/pull/534 >> > > > IMHO it would be a shame if you could not access a popular REST API >> like api.github.com in Squeak using a single message send to the >> WebClient/WebSocket class. >> > > >> > > There is no such thing as simplicity when a REST-Based >> resource-provider supports both authenticated and unauthenticated access. >> > > If you cannot know beforehand, no single-request stuff is gonna help. >> No dice. >> > > >> > > >> > > > >> > > > > > Why not? >> > > > > >> > > > > It leaks credentials unnecessarily. >> > > > >> > > > Ah, good point! But this pattern (EAFP for web connections) is not >> really state of the art, is it? As mentioned, curl, for example, sends the >> authentication data in the very first request, which is a tool I would tend >> to *call* state of the art. >> > > >> > > No thats wrong. Curl will only send auth data if you provide it. >> > > >> > > Doing "curl -u user:pw" is the same as using WebClient httpGet:do: >> and adding the Authorization header manually >> > > >> > > >> > > The sequence is split manually: >> > > ``` >> > > $ curl https://api.github.com/repos/krono/debug/zipball/master >> > > { >> > > "message": "Not Found", >> > > "documentation_url": " >> https://docs.github.com/rest/reference/repos#download-a-repository-archive >> " >> > > } >> > > # Well, I'm left to guess. Maybe exists, maybe not. >> > > $ curl -u krono >> https://api.github.com/repos/krono/debug/zipball/master >> > > >> > > ``` >> > > (In this case, I can't even show what's going on as I use 2FA, which >> makes single-request REST to _never_ work on private repos.) >> > > >> > > The point is, you instruct Curl to _provide credentials >> unconditionally_. >> > > The "heavy lifting" of finding out when to do that is not done by >> curl but by users of curl. >> > > >> > > Look: >> > > >> > > ``` >> > > $ curl http://www.hpi.uni-potsdam.de/hirschfeld/squeaksource/xpaware/ >> > > $ >> > > # Well, no response? >> > > $ curl -v >> http://www.hpi.uni-potsdam.de/hirschfeld/squeaksource/xpaware/ >> > > * Trying 2001:638:807:204::8d59:e178... >> > > * TCP_NODELAY set >> > > * Connected to www.hpi.uni-potsdam.de (2001:638:807:204::8d59:e178) >> port 80 (#0) >> > > > GET /hirschfeld/squeaksource/xpaware/ HTTP/1.1 >> > > > Host: www.hpi.uni-potsdam.de >> > > > User-Agent: curl/7.54.0 >> > > > Accept: */* >> > > > >> > > < HTTP/1.1 401 >> > > < Date: Tue, 13 Oct 2020 07:43:04 GMT >> > > < Server: nginx/1.14.2 >> > > < Content-Length: 0 >> > > < WWW-Authenticate: Basic realm="SwaSource - XP aware" >> > > < >> > > * Connection #0 to host www.hpi.uni-potsdam.de left intact >> > > ``` >> > > >> > > Thats the 401 we're looking for. We have found that the resource >> needs authentication. >> > > >> > > Sidenote: Curl can do the roundtrip (man curl, search anyauth): >> > > >> > > ``` >> > > $ curl -u topa --anyauth -v >> http://www.hpi.uni-potsdam.de/hirschfeld/squeaksource/xpaware/ >> > > Enter host password for user 'topa': >> > > * Trying 2001:638:807:204::8d59:e178... >> > > * TCP_NODELAY set >> > > * Connected to www.hpi.uni-potsdam.de (2001:638:807:204::8d59:e178) >> port 80 (#0) >> > > > GET /hirschfeld/squeaksource/xpaware/ HTTP/1.1 >> > > > Host: www.hpi.uni-potsdam.de >> > > > User-Agent: curl/7.54.0 >> > > > Accept: */* >> > > > >> > > < HTTP/1.1 401 >> > > < Date: Tue, 13 Oct 2020 07:46:05 GMT >> > > < Server: nginx/1.14.2 >> > > < Content-Length: 0 >> > > < WWW-Authenticate: Basic realm="SwaSource - XP aware" >> > > < >> > > * Connection #0 to host www.hpi.uni-potsdam.de left intact >> > > * Issue another request to this URL: ' >> http://www.hpi.uni-potsdam.de/hirschfeld/squeaksource/xpaware/' >> > > * Found bundle for host www.hpi.uni-potsdam.de: 0x7fb8c8c0b1b0 [can >> pipeline] >> > > * Re-using existing connection! (#0) with host www.hpi.uni-potsdam.de >> > > * Connected to www.hpi.uni-potsdam.de (2001:638:807:204::8d59:e178) >> port 80 (#0) >> > > * Server auth using Basic with user 'topa' >> > > > GET /hirschfeld/squeaksource/xpaware/ HTTP/1.1 >> > > > Host: www.hpi.uni-potsdam.de >> > > > Authorization: Basic ******************* >> > > > User-Agent: curl/7.54.0 >> > > > Accept: */* >> > > > >> > > < HTTP/1.1 200 >> > > < Date: Tue, 13 Oct 2020 07:46:05 GMT >> > > < Server: nginx/1.14.2 >> > > < Content-Type: text/html >> > > < Content-Length: 15131 >> > > < Vary: Accept-Encoding >> > > ``` >> > > >> > > And in this case it does _not_ send auth in the first request but >> only in the second. >> > > >> > > Sidenote2: If the first request comes back 200, no second one is >> issued, no credentials leak: >> > > >> > > ``` >> > > $ curl -u topa --anyauth -v >> http://www.hpi.uni-potsdam.de/hirschfeld/squeaksource/xpforums/ >> > > Enter host password for user 'topa': >> > > * Trying 2001:638:807:204::8d59:e178... >> > > * TCP_NODELAY set >> > > * Connected to www.hpi.uni-potsdam.de (2001:638:807:204::8d59:e178) >> port 80 (#0) >> > > > GET /hirschfeld/squeaksource/xpforums/ HTTP/1.1 >> > > > Host: www.hpi.uni-potsdam.de >> > > > User-Agent: curl/7.54.0 >> > > > Accept: */* >> > > > >> > > < HTTP/1.1 200 >> > > < Date: Tue, 13 Oct 2020 07:46:56 GMT >> > > < Server: nginx/1.14.2 >> > > < Content-Type: text/html >> > > < Content-Length: 75860 >> > > < Vary: Accept-Encoding >> > > ``` >> > > >> > > >> > > >> > > >> > > >> > > > And speed is another point, given the fact that internet >> connections in Squeak are really slow ... >> > > > Why do you call this behavior a leak? The application developer >> will not pass authentication data to the web client unless they expect the >> server to consume these data anyway. >> > > >> > > So you always know beforehand which resources need authentication? >> > > Neat, I dont :D >> > > >> > > > If you deem it necessary, we could turn off the pre-authentication >> as soon as the client was redirected to another server ... >> > > >> > > What happens here is that we're bending over backwards because github >> decided to be a bad player. >> > > >> > > I mean, on most sited you visit in browsers, no auth data is sent >> _unless_ you are asked to (redirect to a login) or you _explicitely_ click >> on a login link. >> > > >> > > If you want preemtive auth, do it with WebClient httpGet:do:. >> > > >> > > >> > > >> > > > >> > > > > I understand that the method is maybe not the most common style, >> but I think that functional changes should in such cases not be mixed with >> style changes. >> > > > >> > > > Alright, please see WebClient-Core-ct.128. But maybe we should >> consider to use prettyDiff for the mailing list notifications as a default? >> Just an idea. >> > > >> > > I personally find prettydiffs useless, but that's just me. >> > > >> > > Best regards >> > > -Tobias >> >> >> >> > -------------- next part -------------- An HTML attachment was scrubbed... URL: From marcel.taeumel at hpi.de Mon Oct 26 13:36:30 2020 From: marcel.taeumel at hpi.de (Marcel Taeumel) Date: Mon, 26 Oct 2020 14:36:30 +0100 Subject: [squeak-dev] assert:equals: in Object In-Reply-To: References: <79aca96b0f334332a72c84f0db65a307@student.hpi.uni-potsdam.de> <,> Message-ID: > IMO, definitively if you have a server image for production purposes only. Well, only if you really need the resources. Because the need for debugging can arise anytime, anywhere ... ;-) Best, Marcel Am 26.10.2020 14:14:09 schrieb Thiede, Christoph : > Well, not sure it makes sense to have an image without SUnit. IMO, definitively if you have a server image for production purposes only. Best, Christoph Von: Squeak-dev im Auftrag von Taeumel, Marcel Gesendet: Montag, 26. Oktober 2020 07:40:06 An: squeak-dev Betreff: Re: [squeak-dev] assert:equals: in Object   > A situation where SUnit and all the tests are not necessarily loaded. Hmm... maybe we might consider adding an SUnit-Core? Well, not sure it makes sense to have an image without SUnit. But then you might want to also strip, e.g., network support to shrink the image file a little bit more. :-) Best, Marcel Am 24.10.2020 13:01:30 schrieb H. Hirzel : On 10/9/20, Tony Garnock-Jones wrote: > Hi Christoph, > > On 10/9/20 4:53 PM, Thiede, Christoph wrote: >>> Anyway, having it by default be the case that Workspaces' >> code environments be TestCases seems very sensible to me. >> >> What do you mean by this? Such a TestCase receiver environment should >> definitively be not the default, this would be very confusing! > > Oh interesting! What kind of confusion do you foresee? I had just > imagined that the only visible-ish change would be availability of > TestCase instance-side methods on the "self" in the Workspace. > >>> "Assertions [...] MUST BE LEFT ACTIVE IN >>> PRODUCTION CODE >> Are we on the same page now? :-) > > Yes, I think we are! :-) Thanks. > > Tony I consider that assertions are useful to have in the production code an an argument in favor of having assert:equals:description: implemented the class Object. A situation where SUnit and all the tests are not necessarily loaded. --Hannes -------------- next part -------------- An HTML attachment was scrubbed... URL: From eliot.miranda at gmail.com Mon Oct 26 13:46:49 2020 From: eliot.miranda at gmail.com (Eliot Miranda) Date: Mon, 26 Oct 2020 06:46:49 -0700 Subject: [squeak-dev] Roassal3 "action plan" In-Reply-To: <175606db85c.d7ed6e7425394.106663829946075620@zoho.com> References: <175606db85c.d7ed6e7425394.106663829946075620@zoho.com> Message-ID: <63501448-68A4-4103-9BEA-BDF710921145@gmail.com> Hi Timothy, > On Oct 25, 2020, at 8:43 AM, gettimothy via Squeak-dev wrote: > >  > Hi Tom > > thanks for the reply. > > > > what I could gleam from the Roassal codebase, my assumption is that their design initially started out with an arbitrary graphics backend in mind but, gradually, some lower-level aspects leaked into the domain-specific high-level code. You can see that the codebase contains two or three classes specifically with "Athens" in their name, which typically aim to abstract and collect the interface needed by Roassal to produce graphics. So, our goal would be to extend these abstractions to serve the use cases where Athens-specific code currently exists in the Roassal domain layer. Then, we can "simply" go in, provide a second interface that uses Balloon as its backend and we're done! Since an incremental process is obviously beneficial here and will yield the fastest sense of progress, starting out by creating this Balloon interface and making it just about serviceable is what we currently have in our repo. I believe Balloon as an engine should be able to express just about all the requirements that Roassal puts on Athens, even though I'm rather sure we'll have to employ some trickery for e.g. text. > > > Athens becomes Balloon.... > > > > To make it more concrete: I think your approach of going test by test or example by example should work well. Ideally, you would compare the output of each example with what you find in Pharo and see where things are currently entirely broken or missing. If you then encounter a test/example that uses Athens-specific code, try to isolate the code in one of the abstraction classes, such as the RSAthensMorph or RSAthensRenderer and try to provide an equivalent implementation for our own RSBalloonMorph and RSBalloonRenderer classes. Eventually, we can then simply not load the RSAthensMorph and RSAthensRenderer were all Athens-specific code is isolated and should thus no longer encounter code that cannot load in Squeak. > > > cool! That's what I am doing now. The emphatic "NO" on Cairo is what I needed to hear to proceed down this path. > > > btw, I got two more of those tests working by adding a method to BallonPathBuilder...steps to get all but the four last ones are: > > > > ===modify messages for pharo-isms=== > need stdev from pharo in Collection > > stdev > | avg sample sum | > "In statistics, the standard deviation is a measure that is used to quantify the amount of variation or dispersion of a set of data values. > For details about implementation see comment in self sum." > avg := self average. > sample := self anyOne. > sum := self inject: sample into: [ :accum :each | accum + (each - avg) squared ]. > sum := sum - sample. > ^ (sum / (self size - 1)) sqrt > > flatCollect: becomes 'gather:'. > Browse Collection, add bogus method, flatCollect: aBlock. find senders... > RPackageOrganizer becomes PackageOrganizer > (repeat until all changed) > ClassDescription, add method category *Roassal-Squeak > add method 'numberOfMethods' >> ^self localSelectors size. > BalloonPathBuilder add method cateogry *Roassal3-Squeak ad method > >>close > self closePath. > > > ===run examples === > > RSChartExample new example01Markers open. > RSChartExample new example02ScatterPlot open. > RSChartExample new example03Plot open. > RSChartExample new example04WithTick open. > RSChartExample new example05WithTick open. > RSChartExample new example06CustomNumberOfTicks open. > RSChartExample new example07AdjustingFontSize open. > RSChartExample new example08TwoCharts open. > RSChartExample new example09LinearSqrtSymlog open. > RSChartExample new example10BarPlot open. > RSChartExample new example11BarplotCombinedWithLine open. > RSChartExample new example12ScatterPlotAndNormalizer open. > RSChartExample new example13AreaPlot open. > RSChartExample new example14AreaPlotWithError open. > xRSChartExample new example15AreaBox open. > xRSChartExample new example16Series open. > xRSChartExample new example17CLPvsUSD open. > xRSChartExample new example18Animation open. > > > Additionally, it may be worthwhile to keep a separate document in case we encounter larger architectural issues where Roassal and Athens code are intertwined, such that the Roassal team can review the document rather than having to sift through a pull request of thousands of lines. > > > > I will leave that to you, but I will contribute when I encounter that stuff. > > Best, > Tom > > cheers. > > > p.s. I am saving to a local monticello repo as I go. Its easier than me having to relearn Metacello and the Git is just a reference at this point. Why not create a project on SqueakSource.com so you can easily share and collaborate? No need to use metacello. But working in splendid isolation in a local repository doesn’t seem particularly productive. -------------- next part -------------- An HTML attachment was scrubbed... URL: From eliot.miranda at gmail.com Mon Oct 26 13:49:48 2020 From: eliot.miranda at gmail.com (Eliot Miranda) Date: Mon, 26 Oct 2020 06:49:48 -0700 Subject: [squeak-dev] The Inbox: Kernel-ct.1339.mcz In-Reply-To: References: Message-ID: Please can we not refornat this code as C and continue to use Beck-style rectangular blocks? Please? _,,,^..^,,,_ (phone) > On Oct 25, 2020, at 11:49 PM, Marcel Taeumel wrote: > >  > Hi all! > > Can we merge this into Trunk? > > (Also see a discussion here: http://forum.world.st/Debugger-Simulator-cannot-simulate-some-objects-as-methods-td5123791.html) > > Best, > Marcel >> Am 04.09.2020 21:09:30 schrieb commits at source.squeak.org : >> >> A new version of Kernel was added to project The Inbox: >> http://source.squeak.org/inbox/Kernel-ct.1339.mcz >> >> ==================== Summary ==================== >> >> Name: Kernel-ct.1339 >> Author: ct >> Time: 4 September 2020, 9:09:14.713421 pm >> UUID: edc35a82-ce03-014c-85de-13d68c7fc46f >> Ancestors: Kernel-ct.1338 >> >> Implement missing simulation of objects as methods. >> >> In the past, it was not possible to debug/simulate code that used objects as methods properly. (Thanks to Marcel for the hint!) This very simple commit adds support of the OaM protocol [1] to the simulation machinery. Now you can debug all tests in TestObjectsAsMethods as you would expect, instead of crashing your image! >> >> Update: Uploaded again, this time with additional documentation comment, reformatted code, and multilingual support/fix of typös. Replaces Kernel-ct.1306, which can be moved to the treated inbox. >> >> [1] "The [Objects as Methods] contract is that, when the VM encounters an ordinary object (rather than a compiled method) in the method dictionary during lookup, it sends it the special selector #run:with:in: providing the original selector, arguments, and receiver.". DOI: 10.1145/2991041.2991062. >> >> =============== Diff against Kernel-ct.1338 =============== >> >> Item was changed: >> ----- Method: Context>>send:to:with:lookupIn: (in category 'controlling') ----- >> send: selector to: rcvr with: arguments lookupIn: lookupClass >> + "Simulate the action of sending a message with selector and arguments to rcvr. The argument, lookupClass, is the class in which to lookup the message. This is the receiver's class for normal messages, but for super messages it will be some specific class related to the source method." >> - "Simulate the action of sending a message with selector and arguments >> - to rcvr. The argument, lookupClass, is the class in which to lookup the >> - message. This is the receiver's class for normal messages, but for super >> - messages it will be some specific class related to the source method." >> >> | meth primIndex val ctxt | >> + (meth := lookupClass lookupSelector: selector) ifNil: [ >> + ^ self >> + send: #doesNotUnderstand: >> + to: rcvr >> + with: {(Message selector: selector arguments: arguments) lookupClass: lookupClass} >> + lookupIn: lookupClass]. >> + >> + meth isCompiledMethod ifFalse: [ >> + "Object as Methods (OaM) protocol: 'The contract is that, when the VM encounters an ordinary object (rather than a compiled method) in the method dictionary during lookup, it sends it the special selector #run:with:in: providing the original selector, arguments, and receiver.'. DOI: 10.1145/2991041.2991062." >> + ^ self send: #run:with:in: >> + to: meth >> + with: {selector. arguments. rcvr}]. >> + >> + meth numArgs ~= arguments size ifTrue: [ >> + ^ self error: ('Wrong number of arguments in simulated message {1}' translated format: {selector})]. >> + (primIndex := meth primitive) > 0 ifTrue: [ >> + val := self doPrimitive: primIndex method: meth receiver: rcvr args: arguments. >> + (self isPrimFailToken: val) ifFalse: [^ val]]. >> + >> + (selector == #doesNotUnderstand: and: [lookupClass == ProtoObject]) ifTrue: [ >> + ^ self error: ('Simulated message {1} not understood' translated format: {arguments first selector})]. >> + >> - (meth := lookupClass lookupSelector: selector) ifNil: >> - [^self send: #doesNotUnderstand: >> - to: rcvr >> - with: {(Message selector: selector arguments: arguments) lookupClass: lookupClass} >> - lookupIn: lookupClass]. >> - meth numArgs ~= arguments size ifTrue: >> - [^self error: 'Wrong number of arguments in simulated message ', selector printString]. >> - (primIndex := meth primitive) > 0 ifTrue: >> - [val := self doPrimitive: primIndex method: meth receiver: rcvr args: arguments. >> - (self isPrimFailToken: val) ifFalse: >> - [^val]]. >> - (selector == #doesNotUnderstand: and: [lookupClass == ProtoObject]) ifTrue: >> - [^self error: 'Simulated message ', arguments first selector, ' not understood']. >> ctxt := Context sender: self receiver: rcvr method: meth arguments: arguments. >> + (primIndex notNil and: [primIndex > 0]) ifTrue: [ >> + ctxt failPrimitiveWith: val]. >> + >> + ^ ctxt! >> - primIndex > 0 ifTrue: >> - [ctxt failPrimitiveWith: val]. >> - ^ctxt! >> >> > -------------- next part -------------- An HTML attachment was scrubbed... URL: From gettimothy at zoho.com Mon Oct 26 13:51:46 2020 From: gettimothy at zoho.com (gettimothy) Date: Mon, 26 Oct 2020 09:51:46 -0400 Subject: [squeak-dev] Squeak equivalent of pharo construct icons := Smalltalk ui icons icons associations sorted: [:a :b | a key < b key]. Message-ID: <175652ddf49.10cf8b5c636044.6664637434422878391@zoho.com> Hi folks In the Roassal3, I am working through the RSSVGAnimationExamples and several of them get bitmaps via something named Smalltalk ui.... icons := Smalltalk ui icons icons associations sorted: [:a :b | a key < b key]. Another example is in   RSSVGAnimatioinExamples new  example03Boat open. pharo := RSBitmap new form: (self iconNamed: #pharo);  <---HERE yourself. which is a method in Object that does this: Object>>iconNamed: aSymbol ^ Smalltalk ui icons iconNamed: aSymbol Workarounds and hacks greatly appreciated. thx -------------- next part -------------- An HTML attachment was scrubbed... URL: From marcel.taeumel at hpi.de Mon Oct 26 13:52:06 2020 From: marcel.taeumel at hpi.de (Marcel Taeumel) Date: Mon, 26 Oct 2020 14:52:06 +0100 Subject: [squeak-dev] The Inbox: Kernel-ct.1339.mcz In-Reply-To: References: Message-ID: Absolutely. Those Squeak modules should be written in a consistent formatting style. Best, Marcel Am 26.10.2020 14:50:00 schrieb Eliot Miranda : Please can we not refornat this code as C and continue to use Beck-style rectangular blocks?  Please? _,,,^..^,,,_ (phone) On Oct 25, 2020, at 11:49 PM, Marcel Taeumel wrote:  Hi all! Can we merge this into Trunk? (Also see a discussion here: http://forum.world.st/Debugger-Simulator-cannot-simulate-some-objects-as-methods-td5123791.html) Best, Marcel Am 04.09.2020 21:09:30 schrieb commits at source.squeak.org : A new version of Kernel was added to project The Inbox: http://source.squeak.org/inbox/Kernel-ct.1339.mcz ==================== Summary ==================== Name: Kernel-ct.1339 Author: ct Time: 4 September 2020, 9:09:14.713421 pm UUID: edc35a82-ce03-014c-85de-13d68c7fc46f Ancestors: Kernel-ct.1338 Implement missing simulation of objects as methods. In the past, it was not possible to debug/simulate code that used objects as methods properly. (Thanks to Marcel for the hint!) This very simple commit adds support of the OaM protocol [1] to the simulation machinery. Now you can debug all tests in TestObjectsAsMethods as you would expect, instead of crashing your image! Update: Uploaded again, this time with additional documentation comment, reformatted code, and multilingual support/fix of typös. Replaces Kernel-ct.1306, which can be moved to the treated inbox. [1] "The [Objects as Methods] contract is that, when the VM encounters an ordinary object (rather than a compiled method) in the method dictionary during lookup, it sends it the special selector #run:with:in: providing the original selector, arguments, and receiver.". DOI: 10.1145/2991041.2991062. =============== Diff against Kernel-ct.1338 =============== Item was changed: ----- Method: Context>>send:to:with:lookupIn: (in category 'controlling') ----- send: selector to: rcvr with: arguments lookupIn: lookupClass + "Simulate the action of sending a message with selector and arguments to rcvr. The argument, lookupClass, is the class in which to lookup the message. This is the receiver's class for normal messages, but for super messages it will be some specific class related to the source method." - "Simulate the action of sending a message with selector and arguments - to rcvr. The argument, lookupClass, is the class in which to lookup the - message. This is the receiver's class for normal messages, but for super - messages it will be some specific class related to the source method." | meth primIndex val ctxt | + (meth := lookupClass lookupSelector: selector) ifNil: [ + ^ self + send: #doesNotUnderstand: + to: rcvr + with: {(Message selector: selector arguments: arguments) lookupClass: lookupClass} + lookupIn: lookupClass]. + + meth isCompiledMethod ifFalse: [ + "Object as Methods (OaM) protocol: 'The contract is that, when the VM encounters an ordinary object (rather than a compiled method) in the method dictionary during lookup, it sends it the special selector #run:with:in: providing the original selector, arguments, and receiver.'. DOI: 10.1145/2991041.2991062." + ^ self send: #run:with:in: + to: meth + with: {selector. arguments. rcvr}]. + + meth numArgs ~= arguments size ifTrue: [ + ^ self error: ('Wrong number of arguments in simulated message {1}' translated format: {selector})]. + (primIndex := meth primitive) > 0 ifTrue: [ + val := self doPrimitive: primIndex method: meth receiver: rcvr args: arguments. + (self isPrimFailToken: val) ifFalse: [^ val]]. + + (selector == #doesNotUnderstand: and: [lookupClass == ProtoObject]) ifTrue: [ + ^ self error: ('Simulated message {1} not understood' translated format: {arguments first selector})]. + - (meth := lookupClass lookupSelector: selector) ifNil: - [^self send: #doesNotUnderstand: - to: rcvr - with: {(Message selector: selector arguments: arguments) lookupClass: lookupClass} - lookupIn: lookupClass]. - meth numArgs ~= arguments size ifTrue: - [^self error: 'Wrong number of arguments in simulated message ', selector printString]. - (primIndex := meth primitive) > 0 ifTrue: - [val := self doPrimitive: primIndex method: meth receiver: rcvr args: arguments. - (self isPrimFailToken: val) ifFalse: - [^val]]. - (selector == #doesNotUnderstand: and: [lookupClass == ProtoObject]) ifTrue: - [^self error: 'Simulated message ', arguments first selector, ' not understood']. ctxt := Context sender: self receiver: rcvr method: meth arguments: arguments. + (primIndex notNil and: [primIndex > 0]) ifTrue: [ + ctxt failPrimitiveWith: val]. + + ^ ctxt! - primIndex > 0 ifTrue: - [ctxt failPrimitiveWith: val]. - ^ctxt! -------------- next part -------------- An HTML attachment was scrubbed... URL: From eliot.miranda at gmail.com Mon Oct 26 13:53:52 2020 From: eliot.miranda at gmail.com (Eliot Miranda) Date: Mon, 26 Oct 2020 06:53:52 -0700 Subject: [squeak-dev] The Inbox: Kernel-ct.1339.mcz In-Reply-To: References: Message-ID: > On Oct 25, 2020, at 11:49 PM, Marcel Taeumel wrote: > >  > Hi all! > > Can we merge this into Trunk? > > (Also see a discussion here: http://forum.world.st/Debugger-Simulator-cannot-simulate-some-objects-as-methods-td5123791.html) If the formatting is restored I could see what the changes are. I do not like the use of C style blocks, changing the code I carefully wrote in Beck-style rectangular blocks, for well articulated reasons, being rewritten to use a style that is ugly, vertically wasteful, and in this case unnecessary as it obscures the changes. > > Best, > Marcel >> Am 04.09.2020 21:09:30 schrieb commits at source.squeak.org : >> >> A new version of Kernel was added to project The Inbox: >> http://source.squeak.org/inbox/Kernel-ct.1339.mcz >> >> ==================== Summary ==================== >> >> Name: Kernel-ct.1339 >> Author: ct >> Time: 4 September 2020, 9:09:14.713421 pm >> UUID: edc35a82-ce03-014c-85de-13d68c7fc46f >> Ancestors: Kernel-ct.1338 >> >> Implement missing simulation of objects as methods. >> >> In the past, it was not possible to debug/simulate code that used objects as methods properly. (Thanks to Marcel for the hint!) This very simple commit adds support of the OaM protocol [1] to the simulation machinery. Now you can debug all tests in TestObjectsAsMethods as you would expect, instead of crashing your image! >> >> Update: Uploaded again, this time with additional documentation comment, reformatted code, and multilingual support/fix of typös. Replaces Kernel-ct.1306, which can be moved to the treated inbox. >> >> [1] "The [Objects as Methods] contract is that, when the VM encounters an ordinary object (rather than a compiled method) in the method dictionary during lookup, it sends it the special selector #run:with:in: providing the original selector, arguments, and receiver.". DOI: 10.1145/2991041.2991062. >> >> =============== Diff against Kernel-ct.1338 =============== >> >> Item was changed: >> ----- Method: Context>>send:to:with:lookupIn: (in category 'controlling') ----- >> send: selector to: rcvr with: arguments lookupIn: lookupClass >> + "Simulate the action of sending a message with selector and arguments to rcvr. The argument, lookupClass, is the class in which to lookup the message. This is the receiver's class for normal messages, but for super messages it will be some specific class related to the source method." >> - "Simulate the action of sending a message with selector and arguments >> - to rcvr. The argument, lookupClass, is the class in which to lookup the >> - message. This is the receiver's class for normal messages, but for super >> - messages it will be some specific class related to the source method." >> >> | meth primIndex val ctxt | >> + (meth := lookupClass lookupSelector: selector) ifNil: [ >> + ^ self >> + send: #doesNotUnderstand: >> + to: rcvr >> + with: {(Message selector: selector arguments: arguments) lookupClass: lookupClass} >> + lookupIn: lookupClass]. >> + >> + meth isCompiledMethod ifFalse: [ >> + "Object as Methods (OaM) protocol: 'The contract is that, when the VM encounters an ordinary object (rather than a compiled method) in the method dictionary during lookup, it sends it the special selector #run:with:in: providing the original selector, arguments, and receiver.'. DOI: 10.1145/2991041.2991062." >> + ^ self send: #run:with:in: >> + to: meth >> + with: {selector. arguments. rcvr}]. >> + >> + meth numArgs ~= arguments size ifTrue: [ >> + ^ self error: ('Wrong number of arguments in simulated message {1}' translated format: {selector})]. >> + (primIndex := meth primitive) > 0 ifTrue: [ >> + val := self doPrimitive: primIndex method: meth receiver: rcvr args: arguments. >> + (self isPrimFailToken: val) ifFalse: [^ val]]. >> + >> + (selector == #doesNotUnderstand: and: [lookupClass == ProtoObject]) ifTrue: [ >> + ^ self error: ('Simulated message {1} not understood' translated format: {arguments first selector})]. >> + >> - (meth := lookupClass lookupSelector: selector) ifNil: >> - [^self send: #doesNotUnderstand: >> - to: rcvr >> - with: {(Message selector: selector arguments: arguments) lookupClass: lookupClass} >> - lookupIn: lookupClass]. >> - meth numArgs ~= arguments size ifTrue: >> - [^self error: 'Wrong number of arguments in simulated message ', selector printString]. >> - (primIndex := meth primitive) > 0 ifTrue: >> - [val := self doPrimitive: primIndex method: meth receiver: rcvr args: arguments. >> - (self isPrimFailToken: val) ifFalse: >> - [^val]]. >> - (selector == #doesNotUnderstand: and: [lookupClass == ProtoObject]) ifTrue: >> - [^self error: 'Simulated message ', arguments first selector, ' not understood']. >> ctxt := Context sender: self receiver: rcvr method: meth arguments: arguments. >> + (primIndex notNil and: [primIndex > 0]) ifTrue: [ >> + ctxt failPrimitiveWith: val]. >> + >> + ^ ctxt! >> - primIndex > 0 ifTrue: >> - [ctxt failPrimitiveWith: val]. >> - ^ctxt! >> >> > -------------- next part -------------- An HTML attachment was scrubbed... URL: From gettimothy at zoho.com Mon Oct 26 13:54:05 2020 From: gettimothy at zoho.com (gettimothy) Date: Mon, 26 Oct 2020 09:54:05 -0400 Subject: [squeak-dev] Roassal3 "action plan" In-Reply-To: <63501448-68A4-4103-9BEA-BDF710921145@gmail.com> References: <175606db85c.d7ed6e7425394.106663829946075620@zoho.com> <63501448-68A4-4103-9BEA-BDF710921145@gmail.com> Message-ID: <175652ffd53.109d78fb736092.6149103054346434833@zoho.com> Hi Eliot. Why not create a project on SqueakSource.com so you can easily share and collaborate?  No need to use metacello.  But working in splendid isolation in a local repository doesn’t seem particularly productive.   If somebody wants to open it up, that is great by me.   Tom's working off of a git repo...and, it is Tom's project, so I will let him decide. cheers. -------------- next part -------------- An HTML attachment was scrubbed... URL: From Christoph.Thiede at student.hpi.uni-potsdam.de Mon Oct 26 13:57:05 2020 From: Christoph.Thiede at student.hpi.uni-potsdam.de (Thiede, Christoph) Date: Mon, 26 Oct 2020 13:57:05 +0000 Subject: [squeak-dev] The Inbox: WebClient-Core-ct.126.mcz In-Reply-To: References: <2532b37139184eb6b0ecf3f288081b61@student.hpi.uni-potsdam.de> <0B67EEA2-2AC1-4156-A8D8-56C192B48EF6@gmx.de> <80f7baf3a0eb4d3685d8aea6f12aef5c@student.hpi.uni-potsdam.de> <11383fd575bc4eaeb8d2dec513a190bc@student.hpi.uni-potsdam.de> <8159c070274b4ec2a20469c278fa3cff@student.hpi.uni-potsdam.de> <163C8A17-6F6B-4EBF-B7A1-7082ED8A63BD@gmx.de> <0ab25f63845546d4ba87ac0f2c454b48@student.hpi.uni-potsdam.de> <494468EE-CE59-43EA-ACA0-7C4987C3A47F@gmx.de> <7bbd79122ee646edab0e2a540d69effb@student.hpi.uni-potsdam.de>, Message-ID: <8a76d919a4f041329ac827ff57f518fc@student.hpi.uni-potsdam.de> Hi Tom, ouch, these "empty changes" are not displayed in Monticello, that's why I missed them ... The #detect: refactoring could still be left out, but it's an integral change to send the new message #authProcess:from:header:params: at this place. Hm ... producing minimal diffs seems to be really challenging :-) Best, Christoph ________________________________ Von: Squeak-dev im Auftrag von Tom Beckmann Gesendet: Montag, 26. Oktober 2020 14:33:31 An: The general-purpose Squeak developers list Betreff: Re: [squeak-dev] The Inbox: WebClient-Core-ct.126.mcz Hi Christoph, > > Maybe I also missed an update that cleaned the diff but couldn't find a "perfect" one in the inbox thus far :) > > Is WebClient-Core-ct.128 not yet perfect enough for you? :-) I assume it's this, right? [1] There are still a number of changed empty lines and e.g. the change from `1 to: do: ` to use `detect:`, which are changes I agree with, but also make the diff unnecessarily large. Hope I'm not mistaken about these not being integral for your proposed change :) Best, Tom [1] http://forum.world.st/The-Inbox-WebClient-Core-ct-128-mcz-td5123384.html On Mon, Oct 26, 2020 at 2:25 PM Thiede, Christoph > wrote: Hi Tom, Hi Tobias, > Maybe I also missed an update that cleaned the diff but couldn't find a "perfect" one in the inbox thus far :) Is WebClient-Core-ct.128 not yet perfect enough for you? :-) > And It won't work in 4 weeks time anyways You can still use an access token as a password - actually, I never trust any Squeak image with my real GitHub password because Squeak does not store the password protected. > Or, you know, for wherever your GitHub client is implemented[1], make sure to first go to the authz url when you have a password? Still an edge case. Does this read nice to you? https://github.com/Metacello/metacello/blob/3b7d6814d155088910d6c7b17e85d89ba55f078e/repository/Metacello-Platform.squeak.package/MetacelloSqueakPlatform.class/instance/httpGet.username.pass.do..st Best, Christoph ________________________________ Von: Squeak-dev > im Auftrag von Tom Beckmann > Gesendet: Montag, 26. Oktober 2020 10:59:24 An: The general-purpose Squeak developers list Betreff: Re: [squeak-dev] The Inbox: WebClient-Core-ct.126.mcz Hi Tobias, > On 26.10.2020, at 08:39, Tom Beckmann > wrote: > > Hey everyone, > > to sum up my understanding: the goal of this change is to change this pattern > > WebClient new > httpGet: 'https://api.github.com/repos/myuser/myprivaterepo/zipball/master' > do: [:req | req headerAt: 'Authorization' put: 'Basic ', 'myuser:mypasswd' base64Encoded] > > to > > WebClient new > preAuthenticateMethod: #basic; > user: 'myuser' password: 'mypasswd'; > httpGet: 'https://api.github.com/repos/myuser/myprivaterepo/zipball/master' > > I dare say the fact that this pattern is required cannot be disputed since a number of services, such as Github, require the user to authenticate in this way. Sure, but it wont work for me anyways, Since I have 2FA. :D Even with 2FA, `'Basic ', 'myuser:myPersonalAccessToken' base64Encoded` would currently give you the likely easiest way to access the endpoint using most clients. The way it reads [1] you are correct in that even this will no longer work and we would need to switch to `'token myPersonalAccessToken'` as the Authorization header. We should investigate soon if this would also affect the GitBrowser. Best, Tom [1] https://developer.github.com/changes/2020-02-14-deprecating-password-auth/ On Mon, Oct 26, 2020 at 10:37 AM Tobias Pape > wrote: > On 25.10.2020, at 23:00, Thiede, Christoph > wrote: > > Hi Tobias, > > > The API should stick to the HTTP RFCs and use 401 to say: You need authentication. > > Hm, but this would be an information leak on the server-side. :-) somewhat, and I get what GitHub does… > > > Sadly you omitted the anyauth stuff that actually works how Authentication in HTTP is spec'ed. > > Sorry about that. Still, even in curl, anyauth is an opt-in feature, not an opt-out. So my proposal for adding #preAuthenticationMethod as an opt-in feature would be equivalent to adding an #anyAuth property as an opt-out. Why should WebClient be less powerful than curl? I see it can be abused, but Squeak already contains a lot of dangerous protocols that still can be useful in particular situations. Just insert a warning into the method comment and it'll be OK I think. I don't think it works that way. > > > Except when you use "https://api.github.com/authorizations" first, which 401s. > > True; but still, this would require either a change in the design or an edge-case implementation because the WebClient connection logic is not aware of whether GitHub or BitBucket or whatever else should be contacted. Or, you know, for wherever your GitHub client is implemented[1], make sure to first go to the authz url when you have a password? [1]: Yes, I think you/we/one should have a GitHub client if working with an API. It is not just a simple "web site" anymore. > > > Otherwise, encode it in the URL? > > Do you mean like http://username:password at www.example.com? At the moment, WebClient is not treating this differently than WebClient >> #username and #password. Is this the correct behavior? curl, again, uses preauth in this situation, and Pharo does this, too. Unfortunately, I could not find a clear answer to this question in RFC1738 ... ahh yes, :D. I just imagined a browser, which would ask for PW on 401, but sent it anyway if given in the URL. =-=-= Think of it that way. You do not present your passport at every door you ring a bell, but only those you're asked for it. ;) > > > Don't rely on just my "judgement" ;) > > Your arguments are highly appreciated! I'm just trying to figure out your motivations ... Yepp, some >=3rd opinions would be a good thing. :-) :) best regards -tobias > > Best, > Christoph > Von: Squeak-dev > im Auftrag von Tobias Pape > > Gesendet: Sonntag, 25. Oktober 2020 22:19:49 > An: The general-purpose Squeak developers list > Betreff: Re: [squeak-dev] The Inbox: WebClient-Core-ct.126.mcz > > Hi > > > On 25.10.2020, at 22:03, Thiede, Christoph > wrote: > > > > Hi Tobias, > > > > sorry for the long delay. I was on holiday a few days and did not manage to return earlier to this interesting topic ... > > > > > > > No thats wrong. Curl will only send auth data if you provide it. > > > > > Doing "curl -u user:pw" is the same as using WebClient httpGet:do: and adding the Authorization header manually > > > > > The point is, you instruct Curl to _provide credentials unconditionally_. > > > > I think this is exactly the point. "curl -u user:pw" reads as "Download a resource, 'specify[ing] the user name and password to use for server authentication"' (cited from the man). > > Yes, that means _unconditionally_, even if the source does not need it. > This is called an information leak. > > > > If I do > > WebClient httpDo: [:client | client username: 'user'; password: 'pw'; get: 'https://example.com/rest/whoami'], > > this reads exactly the same for me. Otherwise, #username: and #password: better might be renamed into #optionalUsername/#lazyUsername/#usernameIfAsked etc. > > > > Nope. > > > Apart from this, I have tested the behavior for Pharo, too, where the default web client is ZnClient: And it works like curl, too, rather than like our WebClient, i.e. the following works without any extra low-level instructions: > > > > ZnClient new > > url: 'https://api.github.com/repos/LinqLover/openHAB-configuration/zipball/master'; > > username: 'LinqLover' password: 'mytoken'; > > downloadTo: 'foo.zip' > > > > > So you always know beforehand which resources need authentication? > > > Neat, I dont :D > > > > I suppose we are having different use cases in mind: You are thinking of a generic browser application while I am thinking of a specific API client implementation. Is this correct? > > No. The API should stick to the HTTP RFCs and use 401 to say: You need authentication. > > > If I'm developing a REST API client, I do have to know whether a resource requires authentication or whether it doesn't. This is usually specified in the API documentation. Why add another level of uncertainty by using this trial-and-error strategy? > > Because preemtive auth is wrong. > > Sadly you omitted the anyauth stuff that actually works how Authentication in HTTP is spec'ed. > Yes, it is "one request more". Yes, it is right thing to do. > > Just because it is convenient and just because people are doing it, it does not mean it is good. > In fact, the whole "curl as API-consumer" is fine, but sticking "-u" to each and every request is a security nightmare just second to "curl ... | sudo bash". > > > > > > > In the context of my Metacello PR, the problem is that following your approach of specifying the Authorization header would mess up all the different layers of abstraction that are not aware of web client implementations and headers but only of a URL and a username/password pair. I had hoped that I could pass a constant string 'Basic' to the Authorization header for all cases where the WebClient is invoked, but unfortunately, GitHub does not understand this either, the header must contain the password even in the first run. > > Except when you use "https://api.github.com/authorizations" first, which 401s. > > > > It would lead to some portion on unhandsome spaghetti code if I had to implement an edge case for GitHub in the relevant method (MetacelloSqueakPlatform class >> #downloadZipArchive:to:username:pass:); for this reason, I would find it really helpful to turn on preAuth at this place. > > > Do you dislike this feature in general, even when turned off by default? > > Yes. WebClient is not just an API-consumer. It ought to be safe. > Otherwise, encode it in the URL? > > > I'm not even requiring to make this an opt-out feature, this inbox version only implements it as an opt-in. > > I don't know. > > I think there has been too little input from others here. > Don't rely on just my "judgement" ;) > > Best regards > -Tobias > > > > > > Best, > > Christoph > > > > Von: Squeak-dev > im Auftrag von Tobias Pape > > > Gesendet: Dienstag, 13. Oktober 2020 10:04:23 > > An: The general-purpose Squeak developers list > > Betreff: Re: [squeak-dev] The Inbox: WebClient-Core-ct.126.mcz > > > > Hi > > > > > On 12.10.2020, at 23:42, Thiede, Christoph > wrote: > > > > > > Hi Tobias, > > > > > > okay, I see this authorization pattern now, so you mentioned two ways to work around the current limitations: > > > First, by GETting https://api.github.com/authorizations before, or second, by passing the Authorization header manually. > > > Is this correct? > > > > Yes. However, the second one is the one GitHub "recommends" > > > > > > > > > > However, both of these approaches lack of the RESTful-typical simplicity of "making a single HTTP request without dealing with complex call protocols or low-level connectivity code". To give an illustration of my use case, please see this PR on Metacello:https://github.com/Metacello/metacello/pull/534 > > > IMHO it would be a shame if you could not access a popular REST API like api.github.com in Squeak using a single message send to the WebClient/WebSocket class. > > > > There is no such thing as simplicity when a REST-Based resource-provider supports both authenticated and unauthenticated access. > > If you cannot know beforehand, no single-request stuff is gonna help. No dice. > > > > > > > > > > > > Why not? > > > > > > > > It leaks credentials unnecessarily. > > > > > > Ah, good point! But this pattern (EAFP for web connections) is not really state of the art, is it? As mentioned, curl, for example, sends the authentication data in the very first request, which is a tool I would tend to *call* state of the art. > > > > No thats wrong. Curl will only send auth data if you provide it. > > > > Doing "curl -u user:pw" is the same as using WebClient httpGet:do: and adding the Authorization header manually > > > > > > The sequence is split manually: > > ``` > > $ curl https://api.github.com/repos/krono/debug/zipball/master > > { > > "message": "Not Found", > > "documentation_url": "https://docs.github.com/rest/reference/repos#download-a-repository-archive" > > } > > # Well, I'm left to guess. Maybe exists, maybe not. > > $ curl -u krono https://api.github.com/repos/krono/debug/zipball/master > > > > ``` > > (In this case, I can't even show what's going on as I use 2FA, which makes single-request REST to _never_ work on private repos.) > > > > The point is, you instruct Curl to _provide credentials unconditionally_. > > The "heavy lifting" of finding out when to do that is not done by curl but by users of curl. > > > > Look: > > > > ``` > > $ curl http://www.hpi.uni-potsdam.de/hirschfeld/squeaksource/xpaware/ > > $ > > # Well, no response? > > $ curl -v http://www.hpi.uni-potsdam.de/hirschfeld/squeaksource/xpaware/ > > * Trying 2001:638:807:204::8d59:e178... > > * TCP_NODELAY set > > * Connected to www.hpi.uni-potsdam.de (2001:638:807:204::8d59:e178) port 80 (#0) > > > GET /hirschfeld/squeaksource/xpaware/ HTTP/1.1 > > > Host: www.hpi.uni-potsdam.de > > > User-Agent: curl/7.54.0 > > > Accept: */* > > > > > < HTTP/1.1 401 > > < Date: Tue, 13 Oct 2020 07:43:04 GMT > > < Server: nginx/1.14.2 > > < Content-Length: 0 > > < WWW-Authenticate: Basic realm="SwaSource - XP aware" > > < > > * Connection #0 to host www.hpi.uni-potsdam.de left intact > > ``` > > > > Thats the 401 we're looking for. We have found that the resource needs authentication. > > > > Sidenote: Curl can do the roundtrip (man curl, search anyauth): > > > > ``` > > $ curl -u topa --anyauth -v http://www.hpi.uni-potsdam.de/hirschfeld/squeaksource/xpaware/ > > Enter host password for user 'topa': > > * Trying 2001:638:807:204::8d59:e178... > > * TCP_NODELAY set > > * Connected to www.hpi.uni-potsdam.de (2001:638:807:204::8d59:e178) port 80 (#0) > > > GET /hirschfeld/squeaksource/xpaware/ HTTP/1.1 > > > Host: www.hpi.uni-potsdam.de > > > User-Agent: curl/7.54.0 > > > Accept: */* > > > > > < HTTP/1.1 401 > > < Date: Tue, 13 Oct 2020 07:46:05 GMT > > < Server: nginx/1.14.2 > > < Content-Length: 0 > > < WWW-Authenticate: Basic realm="SwaSource - XP aware" > > < > > * Connection #0 to host www.hpi.uni-potsdam.de left intact > > * Issue another request to this URL: 'http://www.hpi.uni-potsdam.de/hirschfeld/squeaksource/xpaware/' > > * Found bundle for host www.hpi.uni-potsdam.de: 0x7fb8c8c0b1b0 [can pipeline] > > * Re-using existing connection! (#0) with host www.hpi.uni-potsdam.de > > * Connected to www.hpi.uni-potsdam.de (2001:638:807:204::8d59:e178) port 80 (#0) > > * Server auth using Basic with user 'topa' > > > GET /hirschfeld/squeaksource/xpaware/ HTTP/1.1 > > > Host: www.hpi.uni-potsdam.de > > > Authorization: Basic ******************* > > > User-Agent: curl/7.54.0 > > > Accept: */* > > > > > < HTTP/1.1 200 > > < Date: Tue, 13 Oct 2020 07:46:05 GMT > > < Server: nginx/1.14.2 > > < Content-Type: text/html > > < Content-Length: 15131 > > < Vary: Accept-Encoding > > ``` > > > > And in this case it does _not_ send auth in the first request but only in the second. > > > > Sidenote2: If the first request comes back 200, no second one is issued, no credentials leak: > > > > ``` > > $ curl -u topa --anyauth -v http://www.hpi.uni-potsdam.de/hirschfeld/squeaksource/xpforums/ > > Enter host password for user 'topa': > > * Trying 2001:638:807:204::8d59:e178... > > * TCP_NODELAY set > > * Connected to www.hpi.uni-potsdam.de (2001:638:807:204::8d59:e178) port 80 (#0) > > > GET /hirschfeld/squeaksource/xpforums/ HTTP/1.1 > > > Host: www.hpi.uni-potsdam.de > > > User-Agent: curl/7.54.0 > > > Accept: */* > > > > > < HTTP/1.1 200 > > < Date: Tue, 13 Oct 2020 07:46:56 GMT > > < Server: nginx/1.14.2 > > < Content-Type: text/html > > < Content-Length: 75860 > > < Vary: Accept-Encoding > > ``` > > > > > > > > > > > > > And speed is another point, given the fact that internet connections in Squeak are really slow ... > > > Why do you call this behavior a leak? The application developer will not pass authentication data to the web client unless they expect the server to consume these data anyway. > > > > So you always know beforehand which resources need authentication? > > Neat, I dont :D > > > > > If you deem it necessary, we could turn off the pre-authentication as soon as the client was redirected to another server ... > > > > What happens here is that we're bending over backwards because github decided to be a bad player. > > > > I mean, on most sited you visit in browsers, no auth data is sent _unless_ you are asked to (redirect to a login) or you _explicitely_ click on a login link. > > > > If you want preemtive auth, do it with WebClient httpGet:do:. > > > > > > > > > > > > > I understand that the method is maybe not the most common style, but I think that functional changes should in such cases not be mixed with style changes. > > > > > > Alright, please see WebClient-Core-ct.128. But maybe we should consider to use prettyDiff for the mailing list notifications as a default? Just an idea. > > > > I personally find prettydiffs useless, but that's just me. > > > > Best regards > > -Tobias -------------- next part -------------- An HTML attachment was scrubbed... URL: From gettimothy at zoho.com Mon Oct 26 14:00:50 2020 From: gettimothy at zoho.com (gettimothy) Date: Mon, 26 Oct 2020 10:00:50 -0400 Subject: [squeak-dev] AthensCairoText substitute needed for Roassal3 SVG Message-ID: <17565362b63.e1c48f5336199.4595886363217962561@zoho.com> Hi Folks, in RSSVGExamples example02Miku  there is this tidbit: utf8String ifNil: [ act := AthensCairoText new. utf8String := act convertTextUtf8: label text. label path: utf8String. ]. In pharo, the AthensCairoText comment reads: Class: AthensCairoText                                                                                                     do not use this class. this is subject of change or removal The class looks like it wraps FFI calls, so we don't want it anyway... suggestions on what to replace it with? thanks in advance . -------------- next part -------------- An HTML attachment was scrubbed... URL: From tomjonabc at gmail.com Mon Oct 26 14:10:43 2020 From: tomjonabc at gmail.com (Tom Beckmann) Date: Mon, 26 Oct 2020 15:10:43 +0100 Subject: [squeak-dev] Roassal3 "action plan" In-Reply-To: <175652ffd53.109d78fb736092.6149103054346434833@zoho.com> References: <175606db85c.d7ed6e7425394.106663829946075620@zoho.com> <63501448-68A4-4103-9BEA-BDF710921145@gmail.com> <175652ffd53.109d78fb736092.6149103054346434833@zoho.com> Message-ID: Hi timothy, thank you for asking for my opinion here :) I would say please move to whichever stack you are most comfortable with. I can adapt accordingly for when I find time to contribute again. Eventually, we will have to move back to git to propose upstream changes but until then I see no reason not to use Monticello. I agree with Elliot that it would be very useful to always have your most up-to-date changes somewhere publicly accessible. So please feel free to create a project on squeaksource.com and maybe you could even add me (tobe) and also Eliot (?) as contributors right away. Best, Tom On Mon, Oct 26, 2020 at 2:54 PM gettimothy via Squeak-dev < squeak-dev at lists.squeakfoundation.org> wrote: > Hi Eliot. > > Why not create a project on SqueakSource.com so you can easily share and > collaborate? No need to use metacello. But working in splendid isolation > in a local repository doesn’t seem particularly productive. > > > > If somebody wants to open it up, that is great by me. > > Tom's working off of a git repo...and, it is Tom's project, so I will let > him decide. > > cheers. > > > > > > -------------- next part -------------- An HTML attachment was scrubbed... URL: From btc at openinworld.com Mon Oct 26 14:16:59 2020 From: btc at openinworld.com (Ben Coman) Date: Mon, 26 Oct 2020 22:16:59 +0800 Subject: [squeak-dev] Roassal3...What is optimal, port Athens? Athens-Cairo? or build out the Roassal3-Squeak RsBalloonFOO heirarchy In-Reply-To: <0E8D8308-2000-4B5A-B79A-1CB8759B563B@gmail.com> References: <1755fee7f36.f5ef702324417.98502659133065400@zoho.com> <0E8D8308-2000-4B5A-B79A-1CB8759B563B@gmail.com> Message-ID: My understanding is that Athens in itself has nothing to do with FFI. The Cario FFI calls are encapsulated in the Athen-Cario backend. Indeed, with an Athens-HTML backend Matthius seems to have got Athens running on Amber, which I'm sure doesn't have FFI... https://www.youtube.com/watch?v=9nAkiwbZZEQ An Athens-Balloon seems to have been planned, slide 7... https://rmod.inria.fr/archives/talks/2012-PharoConf-Athens.pdf I don't know the status. cheers -ben On Sun, 25 Oct 2020 at 21:44, Eliot Miranda wrote: > Hi Timothy > > No; strategically it would be a disaster. First, as I understand it the > Athens library is built above Cairo, a large foreign dependency, > implemented in C, several times larger than the VM itself. Second, Juan > Vuletich is making good progress with Morphic3, a Smalltalk implementation > (a Smalltalk compiler) did similar functionality, running on the GPU. This > dependency would be much like our dependency on the VM, in that it used our > own technology stack , and therefore we can modify it, and do so quite > quickly. > > So for the moment you should roll you own or host above BitBLT until we > can move to Morphic3. This is essential. Under no circumstances should > you release something using Athens/Cairo. If will do lasting damage to > this community and its strategic direction and viability. > > > > Here is an example of things we cannot do until dependencies are > resolved...heck, at the bottom of this email* is the entire Roassal install > "log" that I saved when I installed the package: > > > You must resolve these dependencies before you will be able to load these > definitions: > AthensCairoPathBuilder>>arcDegreeStart:sweep:centerX:y:radius: > AthensCairoPathBuilder>>arcRadianStart:sweep:centerX:y:radius: > AthensCairoPathBuilder>>ellipticalArc3:xrot:large:sweep:to: > AthensCairoPathBuilder>>ellipticalArc:xrot:large:sweep:to: > AthensCairoPathBuilder>>ellipticalArc:xrot:large:sweep:to:relative: > > I can either port the AthensCairoPathBuilder or I can move the > functionality to your BalloonPathBuilder. > > > Since I know nothing about either, it will be equally painful to implement > either, so the question becomes, which path yeilds the best results going > forward? > > > Consider too, that "grok FFI" is on my skillset todo-list and Athens-Cairo > looks like it would put a checkmark on that todo-list item. > > I do not know enough to make an informed decision (I intuitively prefer to > get the base right, but as we discovered with the pharo kernel bytes > fiasco, that is not always possible) > > Your thoughts? > > cheers, > > tty. > > > > *Install log follows: > > This package depends on the following classes: > AthensCairoPathBuilder > You must resolve these dependencies before you will be able to load these > definitions: > AthensCairoPathBuilder>>arcDegreeStart:sweep:centerX:y:radius: > AthensCairoPathBuilder>>arcRadianStart:sweep:centerX:y:radius: > AthensCairoPathBuilder>>ellipticalArc3:xrot:large:sweep:to: > AthensCairoPathBuilder>>ellipticalArc:xrot:large:sweep:to: > AthensCairoPathBuilder>>ellipticalArc:xrot:large:sweep:to:relative: > > This package depends on the following classes: > PackageManifest > You must resolve these dependencies before you will be able to load these > definitions: > ManifestGeometryTests > ManifestGeometryTests class>>ruleRBStringConcatenationRuleV1FalsePositive > > > This package depends on the following classes: > GradientPaint > You must resolve these dependencies before you will be able to load these > definitions: > GradientPaint>>interpolateTo:at: > > > This package depends on the following classes: > AthensCairoPathBuilder > AthensCairoSurface > RPackage > You must resolve these dependencies before you will be able to load these > definitions: > AthensCairoPathBuilder>>arcAround:radius:startAngle:endAngle: > AthensCairoPathBuilder>>arcAround:radius:startAngle:endAngle:cw: > AthensCairoPathBuilder>>arcCos: > AthensCairoPathBuilder>>ellipticalArc2:xrot:large:sweep:to: > AthensCairoSurface>>hasBeenFreed > RPackage>>dependentPackages > This package depends on the following classes: > PharoDarkTheme > ClyBrowserToolMorph > UITheme > You must resolve these dependencies before you will be able to load these > definitions: > PharoDarkTheme>>classBoxBackgroundColor > RSUMLCalypso > RSUMLCalypso>>activationPriority > RSUMLCalypso>>applyTheme: > RSUMLCalypso>>build > RSUMLCalypso>>classes > RSUMLCalypso>>defaultIconName > RSUMLCalypso>>limitedClasses: > RSUMLCalypso>>tabOrder > RSUMLClassCalypso > RSUMLClassCalypso class>>classUmlTapActivation > RSUMLClassCalypso>>classes > RSUMLClassCalypso>>defaultTitle > RSUMLClassCalypso>>isSimilarTo: > RSUMLClassCalypso>>setUpModelFromContext > RSUMLClassCalypso>>targetClass > RSUMLPackageCalypso > RSUMLPackageCalypso class>>classUmlTapActivation > RSUMLPackageCalypso>>classes > RSUMLPackageCalypso>>defaultIconName > RSUMLPackageCalypso>>defaultTitle > RSUMLPackageCalypso>>isSimilarTo: > RSUMLPackageCalypso>>packages > RSUMLPackageCalypso>>setUpModelFromContext > UITheme>>classBoxBackgroundColor > UITheme>>methodsLimitUML > > > This package depends on the following classes: > GLMMorphicWidgetRenderer > GLMPresentation > GLMMorphicRenderer > You must resolve these dependencies before you will be able to load these > definitions: > GLMMorphicRenderer>>renderRoassal3Presentation: > GLMMorphicRoassal3Renderer > GLMMorphicRoassal3Renderer>>render: > GLMPresentation>>roassal3 > GLMRoassal3Presentation > GLMRoassal3Presentation>>canvas > GLMRoassal3Presentation>>initialize > GLMRoassal3Presentation>>initializeCanvas: > GLMRoassal3Presentation>>renderGlamorouslyOn: > GLMRoassal3Presentation>>setUpInteractions > > > This package depends on the following classes: > RPackage > You must resolve these dependencies before you will be able to load these > definitions: > RPackage>>dependentPackagesWithOccurences > RPackage>>numberOfDependenciesToward: > > This package depends on the following classes: > ParametrizedTestCase > You must resolve these dependencies before you will be able to load these > definitions: > RSPAnimationTest > RSPAnimationTest class>>testParameters > RSPAnimationTest>>animationClass > RSPAnimationTest>>animationClass: > RSPAnimationTest>>setUp > RSPAnimationTest>>testBasic > RSPAnimationTest>>testBasicInCanvas > RSPAnimationTest>>testDelay > > This package depends on the following classes: > ParametrizedTestCase > You must resolve these dependencies before you will be able to load these > definitions: > RSPBoundingTest > RSPBoundingTest class>>testParameters > RSPBoundingTest>>setUp > RSPBoundingTest>>shapeClass > RSPBoundingTest>>shapeClass: > RSPBoundingTest>>testDraw > RSPBoundingTest>>testDrawBorder > RSPBoundingTest>>testPosition > RSPLinesTest > RSPLinesTest class>>testParameters > RSPLinesTest>>setUp > RSPLinesTest>>shapeClass > RSPLinesTest>>shapeClass: > RSPLinesTest>>testDraw > RSPLinesTest>>testDrawMarkers > > This package depends on the following classes: > AthensLineSegment > AthensCubicSegment > AthensCloseSegment > AthensPathSegment > You must resolve these dependencies before you will be able to load these > definitions: > AthensCloseSegment>>visitWith: > AthensCubicSegment>>durationFor: > AthensCubicSegment>>pointsWithStart:duration: > AthensCubicSegment>>visitWith: > AthensLineSegment>>durationFor: > AthensLineSegment>>pointsWithStart:duration: > AthensPathSegment>>durationFor: > AthensPathSegment>>pointsWithStart: > AthensPathSegment>>pointsWithStart:duration: > > > _,,,^..^,,,_ (phone) > > -------------- next part -------------- An HTML attachment was scrubbed... URL: From gettimothy at zoho.com Mon Oct 26 15:42:10 2020 From: gettimothy at zoho.com (gettimothy) Date: Mon, 26 Oct 2020 11:42:10 -0400 Subject: [squeak-dev] Roassal3 "action plan" In-Reply-To: References: <175606db85c.d7ed6e7425394.106663829946075620@zoho.com> <63501448-68A4-4103-9BEA-BDF710921145@gmail.com> <175652ffd53.109d78fb736092.6149103054346434833@zoho.com> Message-ID: <1756592f287.107f3c45639024.5003562192914496550@zoho.com> I will do that now, cheers! ---- On Mon, 26 Oct 2020 10:10:43 -0400 Tom Beckmann wrote ---- Hi timothy, thank you for asking for my opinion here :) I would say please move to whichever stack you are most comfortable with. I can adapt accordingly for when I find time to contribute again. Eventually, we will have to move back to git to propose upstream changes but until then I see no reason not to use Monticello. I agree with Elliot that it would be very useful to always have your most up-to-date changes somewhere publicly accessible. So please feel free to create a project on http://squeaksource.com and maybe you could even add me (tobe) and also Eliot (?) as contributors right away. Best, Tom On Mon, Oct 26, 2020 at 2:54 PM gettimothy via Squeak-dev wrote: Hi Eliot. Why not create a project on SqueakSource.com so you can easily share and collaborate?  No need to use metacello.  But working in splendid isolation in a local repository doesn’t seem particularly productive.   If somebody wants to open it up, that is great by me.   Tom's working off of a git repo...and, it is Tom's project, so I will let him decide. cheers. -------------- next part -------------- An HTML attachment was scrubbed... URL: From gettimothy at zoho.com Mon Oct 26 15:46:47 2020 From: gettimothy at zoho.com (gettimothy) Date: Mon, 26 Oct 2020 11:46:47 -0400 Subject: [squeak-dev] Roassal already on squeaksource.com In-Reply-To: References: <175606db85c.d7ed6e7425394.106663829946075620@zoho.com> <63501448-68A4-4103-9BEA-BDF710921145@gmail.com> <175652ffd53.109d78fb736092.6149103054346434833@zoho.com> Message-ID: <17565972d68.1138ea5aa39110.1563858387710157469@zoho.com> Hi folks, A Roassal project already exists on Squeaksource. http://www.squeaksource.com/Roassal/ Not my project. Found this when I went to create the project. How to proceed? Create  Roassal3 project? cheers. ---- On Mon, 26 Oct 2020 10:10:43 -0400 Tom Beckmann wrote ---- Hi timothy, thank you for asking for my opinion here :) I would say please move to whichever stack you are most comfortable with. I can adapt accordingly for when I find time to contribute again. Eventually, we will have to move back to git to propose upstream changes but until then I see no reason not to use Monticello. I agree with Elliot that it would be very useful to always have your most up-to-date changes somewhere publicly accessible. So please feel free to create a project on http://squeaksource.com and maybe you could even add me (tobe) and also Eliot (?) as contributors right away. Best, Tom On Mon, Oct 26, 2020 at 2:54 PM gettimothy via Squeak-dev wrote: Hi Eliot. Why not create a project on SqueakSource.com so you can easily share and collaborate?  No need to use metacello.  But working in splendid isolation in a local repository doesn’t seem particularly productive.   If somebody wants to open it up, that is great by me.   Tom's working off of a git repo...and, it is Tom's project, so I will let him decide. cheers. -------------- next part -------------- An HTML attachment was scrubbed... URL: From commits at source.squeak.org Mon Oct 26 16:12:18 2020 From: commits at source.squeak.org (commits at source.squeak.org) Date: Mon, 26 Oct 2020 16:12:18 0000 Subject: [squeak-dev] The Trunk: SUnit-pre.123.mcz Message-ID: Patrick Rein uploaded a new version of SUnit to project The Trunk: http://source.squeak.org/trunk/SUnit-pre.123.mcz ==================== Summary ==================== Name: SUnit-pre.123 Author: pre Time: 26 October 2020, 5:12:17.449595 pm UUID: 105fdee7-2395-6043-bb05-19c732d23ef0 Ancestors: SUnit-pre.122 Adds long overdue class comment to the TestResource class on how to create and use TestResources. =============== Diff against SUnit-pre.122 =============== Item was changed: Object subclass: #TestResource instanceVariableNames: 'name description' classVariableNames: '' poolDictionaries: '' category: 'SUnit-Kernel'! TestResource class instanceVariableNames: 'current'! + + !TestResource commentStamp: 'pre 10/26/2020 17:11' prior: 0! + A TestResource represents a resource required for tests that is time consuming / difficult to setup AND does not break test isolation, i.e. it can be reused across tests within one suite. + + To define your own test resource, subclass from TestResource. The most important method to implement is #setUp, where you can define how the test resource is to be initialized. You can store arbitrary state here. Analogously, you can release relevant state in the #tearDown method. + + If you want to have a test resource available for a suite, implement the method #resources on the class side of your TestCase subclass. You can then access your resource by calling #current on your TestResource subclass.! TestResource class instanceVariableNames: 'current'! From gettimothy at zoho.com Mon Oct 26 16:47:42 2020 From: gettimothy at zoho.com (gettimothy) Date: Mon, 26 Oct 2020 12:47:42 -0400 Subject: [squeak-dev] Tom's Roassal3 now on squeaksource Message-ID: <17565cef29c.c892728240164.7052561839334924300@zoho.com> MCHttpRepository location: 'http://www.squeaksource.com/Roassal3' user: 'tty' password: '' Eliot and Tom, you are admins. Let me know if I screwed something up, or if I can make things better. cheers. -------------- next part -------------- An HTML attachment was scrubbed... URL: From tim at rowledge.org Mon Oct 26 16:58:07 2020 From: tim at rowledge.org (tim Rowledge) Date: Mon, 26 Oct 2020 09:58:07 -0700 Subject: [squeak-dev] assert:equals: in Object In-Reply-To: References: <79aca96b0f334332a72c84f0db65a307@student.hpi.uni-potsdam.de> Message-ID: <66FFC206-29FB-4309-BA72-995A1DE23937@rowledge.org> > On 2020-10-25, at 11:40 PM, Marcel Taeumel wrote: > > > A situation where SUnit and all the tests are not necessarily loaded. > > Hmm... maybe we might consider adding an SUnit-Core? Well, not sure it makes sense to have an image without SUnit. But then you might want to also strip, e.g., network support to shrink the image file a little bit more. :-) Once upon a time that was a big deal because memory was short. Given that I have been sent almost content-free Word documents that take up more space than a well loaded Squeak image, I suggest we probably don't need to care so much these days. It offends my CDO (OCD but the letters in *the right order*), but that's the reality. tim -- tim Rowledge; tim at rowledge.org; http://www.rowledge.org/tim It said, "Insert disk #3," but only two will fit! From jrmaffeo at gmail.com Mon Oct 26 16:59:05 2020 From: jrmaffeo at gmail.com (John-Reed Maffeo) Date: Mon, 26 Oct 2020 09:59:05 -0700 Subject: [squeak-dev] #installExtraPackages - fails on new install In-Reply-To: <1754c230ba5.c68a703024213.9040368036096187468@zoho.com> References: <1754c230ba5.c68a703024213.9040368036096187468@zoho.com> Message-ID: Runnin g on a Raspberry Pi 4 Model B Rev 1.4 I did a new install, starting with download from www.squeak.org to verify that my internet was working. /home/pi/Squeak/Squeak5.3/Squeak5.3-19435-32bit-202003021730-ARMv6/shared/Squeak5.3-19435-32bit.image Squeak5.3 latest update: #19435 I went through the PreferanceWizard and got through 6 panes and selected Done. The install pane came up and the install button said "Please check your internet connection..." I poked around and found the method hasInternetConnection in class PreferenceWizardMorph which invokes "TestCase new ensureSecureInternetConnection". I ran that method and received "Error: primitaveSSLCreate failed". I have no idea how to debug the primitive. I tried to update the image to see if that would help and a got a seg fault. "Segmentation fault Mon Oct 26 09:36:22 2020 /usr/lib/squeak/5.0-201610101924/squeak Squeak VM version: 5.0-201610101924 Wed Oct 12 14:50:05 PDT 2016 gcc 4.9.2 [Production Spur VM] Built from: CoInterpreter VMMaker.oscog-eem.1950 uuid: b4089b49-1494-49d2-8966-57cba5c92194 Oct 12 2016 With: StackToRegisterMappingCogit VMMaker.oscog-eem.1950 uuid: b4089b49-1494-49d2-8966-57cba5c92194 Oct 12 2016 Revision: VM: 201610101924 tim at Diziet.local:Documents/Squeak/Rasbian-VM/vm $ Date: Mon Oct 10 12:24:25 2016 -0700 $ Plugins: 201610101924 tim at Diziet.local:Documents/Squeak/Rasbian-VM/vm $ Build host: Linux Goldskin 4.4.21-v7+ #911 SMP Thu Sep 15 14:22:38 BST 2016 armv7l GNU/Linux plugin path: /usr/lib/squeak/5.0-201610101924 [default: /usr/lib/squeak/5.0-201610101924/]" On Wed, Oct 21, 2020 at 10:09 AM gettimothy via Squeak-dev < squeak-dev at lists.squeakfoundation.org> wrote: > IIRC, I had these symptoms when SmalltalkHub.com was down. > > I just checked smalltalkhub, and it is up, so retry? > > > > > ---- On Wed, 21 Oct 2020 11:33:40 -0400 *Marcel Taeumel > >* wrote ---- > > Hi John-Reed, > > hmmm... So "TestCase new ensureSecureInternetConnection" does not work in > your image? Maybe SqueakSSL is not working on that R.Pi. > > Best, > Marcel > > Am 20.10.2020 00:49:59 schrieb John-Reed Maffeo : > First install of Squeak on a new R.Pi. After going through the setup a > window pops up and asks me if I want to install extra packages. I check > them all (but 1) off but I can' save them. The Save button says "Please > check your internet collection". I know I do have internet connection > because I just downloaded the installation. > > This is a neat feature and I would like to use it. I don't know if the > problem is with me or in the stars. > > I explored the morph using the halo and found the method to > #installExtraPackages and ran it from an explorer window but that killed > the image w/o installing the packages. > > I tried to run the method from the workplace, but that failed too. > > -- > John-Reed Maffeo > > > > > > -- John-Reed Maffeo -------------- next part -------------- An HTML attachment was scrubbed... URL: From tim at rowledge.org Mon Oct 26 17:33:37 2020 From: tim at rowledge.org (tim Rowledge) Date: Mon, 26 Oct 2020 10:33:37 -0700 Subject: [squeak-dev] #installExtraPackages - fails on new install In-Reply-To: References: <1754c230ba5.c68a703024213.9040368036096187468@zoho.com> Message-ID: <7276F53A-FF78-49BD-A5BE-3E33B932C8C4@rowledge.org> > On 2020-10-26, at 9:59 AM, John-Reed Maffeo wrote: > > I tried to update the image to see if that would help and a got a seg fault. > > "Segmentation fault Mon Oct 26 09:36:22 2020 > > /usr/lib/squeak/5.0-201610101924/squeak > Squeak VM version: 5.0-201610101924 Wed Oct 12 14:50:05 PDT 2016 gcc 4.9.2 [Production Spur VM] > Built from: CoInterpreter VMMaker.oscog-eem.1950 uuid: b4089b49-1494-49d2-8966-57cba5c92194 Oct 12 2016 > With: StackToRegisterMappingCogit VMMaker.oscog-eem.1950 uuid: b4089b49-1494-49d2-8966-57cba5c92194 Oct 12 2016 > Revision: VM: 201610101924 tim at Diziet.local:Documents/Squeak/Rasbian-VM/vm $ Date: Mon Oct 10 12:24:25 2016 -0700 $ Plugins: 201610101924 tim at Diziet.local:Documents/Squeak/Rasbian-VM/vm $ > Build host: Linux Goldskin 4.4.21-v7+ #911 SMP Thu Sep 15 14:22:38 BST 2016 armv7l GNU/Linux > plugin path: /usr/lib/squeak/5.0-201610101924 [default: /usr/lib/squeak/5.0-201610101924/]" OK, it looks like you somehow ended up running a *very* old VM that I built (in 2016!) for the NuScratch install in Raspbian. That might explain this. This is actually an artefact of the completely broken way we are bundling and installing linux VM packages, exposded by the Pi having an already installed VM in the 'proper' place but the package you downloaded relying on a VM in a completely different place! There's a bunch of different ways to fix this, many of them far more unix-expert than I can handle. The simplest I can think of *for Raspbian* is to edit the file properties of an image file to pint to the newer vm. Start by opening the file browser and finding an image file. Select it and r-click->Properties. In that dialog you should see (about halfway down) 'open with' and a pulldown menu. At the bottom of that should be 'Customize' - click on that. Next comes a 'Choose Application' dialog and you could slelct from a wide variety of incorrect choices. Do not click on 'Games->Minecraft Pi' and try running Squeak in Minecraft. It only leads to Fear, and Fear leads to Eating Too Many Biscuits. Instead, click on the 'Custom Command Line' tab. Now you see a way to enter an actual command line (duh!). I always use the 'Browse...' button to open a file finder, locate the 'Squeak' shell script and choose that. The shell script will be in some fairly deeply buried directory within the package you downloaded. Once you have found it and selected it and clicked on the 'OK' button in the file finder the path will appear back in the 'Choose Application' dialog. Almost done! Now in that 'Command line to execute:' text field, add %f at the end (with a space after the final bit of the filename!) so that the name of the image file you click on will be passed to the squeak shell script. I always put sometihng hopefully helpful in the 'Application name' text field as well. Finally, click on the OK button. One last step I almost always have to do is to to set the permissions of the image file(s) to have 'nobody' for the 'Execute:' permission. No idea why. With all that done, you should find that a d-click on the image file will run the latest VM for you. Like I said, broken. tim -- tim Rowledge; tim at rowledge.org; http://www.rowledge.org/tim Programming is an art form that fights back. From commits at source.squeak.org Mon Oct 26 17:35:17 2020 From: commits at source.squeak.org (commits at source.squeak.org) Date: Mon, 26 Oct 2020 17:35:17 0000 Subject: [squeak-dev] The Trunk: Tools-tpr.1003.mcz Message-ID: tim Rowledge uploaded a new version of Tools to project The Trunk: http://source.squeak.org/trunk/Tools-tpr.1003.mcz ==================== Summary ==================== Name: Tools-tpr.1003 Author: tpr Time: 18 October 2020, 5:24:15.656722 pm UUID: 7a19cdad-a4e2-432e-ab35-b89d0de811e1 Ancestors: Tools-mt.1002 Rework the window label handing of MessageSet/Trace to be a bit more accurate, and to work within the normal style of labels. Instead of assuming the size of the list passed to the MessageSet/Trace is correct, derive it from the post-processing list. We process the list to remove duplicates, which e.g. the #allUnimplementedCalls method produces. This required adding an instvar to M-Set, removing one from M-Trace, setting the new one properly, dumping some dodgy code that used to half-assedly derive the old one, use the proper #changed: #windowTitle to, y'know, change the title, and some faffing with the messageList. As a result we are better placed to make further improvements if/when we develop a way to correctly hightlight multi-part keywords (or indeed, multiple messages) within a single method, which would greatly improve many browsers. This benefits from being accompanied by the single-method change in the System-tpr.1181 package =============== Diff against Tools-mt.1002 =============== Item was changed: CodeHolder subclass: #MessageSet + instanceVariableNames: 'growable messageList messageListFormatted autoSelectString messageListIndex editSelection windowLabel' - instanceVariableNames: 'growable messageList messageListFormatted autoSelectString messageListIndex editSelection' classVariableNames: 'UseUnifiedMessageLabels' poolDictionaries: '' category: 'Tools-Browser'! !MessageSet commentStamp: '' prior: 0! I represent a query path of the retrieval result of making a query about methods in the system. The result is a set of methods, denoted by a message selector and the class in which the method was found. As a StringHolder, the string I represent is the source code of the currently selected method. I am typically viewed in a Message Set Browser consisting of a MessageListView and a BrowserCodeView.! Item was changed: ----- Method: MessageSet class>>openMessageList:name:autoSelect: (in category 'instance creation') ----- openMessageList: messageList name: labelString autoSelect: autoSelectString "Open a system view for a MessageSet on messageList. + The labelString is passed to the model to use as a base label, depending on the selection state" - 1/24/96 sw: the there-are-no msg now supplied by my sender" | messageSet | messageSet := self messageList: messageList. + messageSet + autoSelectString: autoSelectString; + setInitialLabel: labelString. + ^ToolBuilder open: messageSet! - messageSet autoSelectString: autoSelectString. - ^ToolBuilder open: messageSet label: labelString! Item was changed: ----- Method: MessageSet>>adjustWindowTitleAfterFiltering (in category 'private') ----- adjustWindowTitleAfterFiltering + "Set the title of the receiver's window, if any, to reflect the just-completed filtering. Avoid re-doing it if fitering is re-done" - "Set the title of the receiver's window, if any, to reflect the just-completed filtering" + (windowLabel endsWith: 'Filtered') + ifFalse: [windowLabel := windowLabel , ' Filtered'. + self changed: #windowTitle]! - | aWindow existingLabel newLabel | - - (aWindow := self containingWindow) ifNil: [^ self]. - (existingLabel := aWindow label) isEmptyOrNil ifTrue: [^ self]. - (((existingLabel size < 3) or: [existingLabel last ~~ $]]) or: [(existingLabel at: (existingLabel size - 1)) isDigit not]) ifTrue: [^ self]. - existingLabel size to: 1 by: -1 do: - [:anIndex | ((existingLabel at: anIndex) == $[) ifTrue: - [newLabel := (existingLabel copyFrom: 1 to: anIndex), - 'Filtered: ', - messageList size printString, - ']'. - ^ aWindow setLabel: newLabel]] - - - ! Item was changed: ----- Method: MessageSet>>initializeMessageList: (in category 'private') ----- initializeMessageList: anArray "Initialize my messageList from the given list of MethodReference or string objects. NB: special handling for uniclasses. Do /not/ replace the elements of anArray if they are already MethodReferences, so as to allow users to construct richer systems, such as differencers between existing and edited versions of code." + messageList := Set new. - messageList := OrderedCollection new. anArray do: [:each | each isMethodReference + ifTrue: [messageList add: each] - ifTrue: [messageList addLast: each] ifFalse: [ MessageSet parse: each toClassAndSelector: + [ : class : sel | class ifNotNil: [ messageList add: (MethodReference class: class selector: sel) ] ] ] ]. + messageList := messageList asSortedCollection asOrderedCollection. "Possibly better to do asOrderedCollection sort ?" - [ : class : sel | class ifNotNil: [ messageList addLast: (MethodReference class: class selector: sel) ] ] ] ]. "Unify labels if wanted." self class useUnifiedMessageLabels ifTrue: [ messageList withIndexDo: [ : each : index | | cls | cls := each actualClass. each stringVersion: (self indentionPrefixOfSize: (self indentionsIn: each stringVersion)) , (cls ifNil: [each asString] ifNotNil: [cls isUniClass ifTrue: [cls typicalInstanceName, ' ', each selector] ifFalse: [ cls name , ' ' , each selector , ' {' , ((cls organization categoryOfElement: each selector) ifNil: ['']) , '}' , ' {', cls category, '}' ] ]) ] ]. messageListIndex := messageList isEmpty ifTrue: [0] ifFalse: [1]. contents := String empty! Item was changed: ----- Method: MessageSet>>messageListIndex: (in category 'message list') ----- messageListIndex: anInteger + "Set the index of the selected item to be anInteger. + Update the message list morph, the text edit morph and the assorted buttons" - "Set the index of the selected item to be anInteger." messageListIndex := anInteger. contents := messageListIndex ~= 0 ifTrue: [self selectedMessage] ifFalse: ['']. self changed: #messageListIndex. "update my selection" self editSelection: #editMessage. self contentsChanged. (messageListIndex ~= 0 and: [ autoSelectString notNil and: [ self contents notEmpty ] ]) ifTrue: [ self changed: #autoSelect ]. self decorateButtons ! Item was added: + ----- Method: MessageSet>>setInitialLabel: (in category 'accessing') ----- + setInitialLabel: aString + "set the base label for the window, as returned by #windowTitle" + + windowLabel := aString! Item was added: + ----- Method: MessageSet>>windowTitle (in category 'user interface') ----- + windowTitle + "just return the basic label for now" + + ^windowLabel! Item was changed: MessageSet subclass: #MessageTrace + instanceVariableNames: 'autoSelectStrings messageSelections anchorIndex' - instanceVariableNames: 'autoSelectStrings messageSelections anchorIndex defaultSelectString' classVariableNames: '' poolDictionaries: '' category: 'Tools-Browser'! !MessageTrace commentStamp: 'cmm 3/2/2010 20:26' prior: 0! A MessageTrace is a MessageSet allowing efficient sender/implementor message following. With implementors indented below, and senders outdended above, message flow is succinctly expressed, hierarchically. My autoSelectStrings and messageSelections are Arrays of Booleans, parallel to my messageList. Each boolean indicates whether that message is selected. Each autoSelectStrings indicates which string should be highlighted in the code for each method in my messageList.! Item was changed: ----- Method: MessageTrace>>browseAllImplementorsOf: (in category 'actions') ----- browseAllImplementorsOf: selectorSymbol | selectorToBrowse | selectorToBrowse := self selection ifNil: [ selectorSymbol ] + ifNotNil: [ self getImplementorNamed: selectorSymbol asSymbol "since we can get passed literals"]. - ifNotNil: [ self getImplementorNamed: selectorSymbol ]. (self hasUnacceptedEdits or: [ Preferences traceMessages not ]) ifTrue: [ super browseAllImplementorsOf: selectorToBrowse ] ifFalse: [ self addChildMethodsNamed: selectorToBrowse ] ! Item was changed: ----- Method: MessageTrace>>initializeMessageList: (in category 'private initializing') ----- initializeMessageList: anArray - messageSelections := (Array new: anArray size withAll: false) asOrderedCollection. super initializeMessageList: anArray. + messageSelections := (Array new: messageList size withAll: false) asOrderedCollection. self messageAt: messageListIndex beSelected: true. "autoSelectStrings is initialized right after this method, in autoSelectString:" ! Item was changed: ----- Method: MessageTrace>>messageListIndex: (in category 'actions') ----- messageListIndex: anInteger + "Set the index of the selected item to be anInteger. + Find the relevant auto select string to use, do my superclass' work and update the window title" + autoSelectStrings ifNotEmpty: [ autoSelectString := anInteger = 0 + ifTrue: [ "clear the autoSelectString" + String empty ] + ifFalse: [autoSelectStrings at: anInteger] + ]. + + anInteger > 0 ifTrue: [ self + messageAt: anInteger + beSelected: true + ]. + super messageListIndex: anInteger. + self changed: #windowTitle - ifTrue: - [ defaultSelectString ifNotNil: [:default| self containingWindow setLabel: default]. - "clear the autoSelectString" - '' ] - ifFalse: - [ messageListIndex := anInteger. - "setting the window label, below, can't wait for this.." - self containingWindow setLabel: (self windowLabelAt: anInteger). - "work out the string to ask the text view to pre-select. We should do better than this; after all the debugger does" - (autoSelectStrings at: anInteger)] ]. - anInteger > 0 ifTrue: - [ self - messageAt: anInteger - beSelected: true ]. - super messageListIndex: anInteger ! Item was changed: ----- Method: MessageTrace>>windowLabelAt: (in category 'private accessing') ----- windowLabelAt: anInteger + "return a suitable window label when there is an actual list item selected; work out what it should be based upon the array of autoSelectStrings or the current selection" + ^(autoSelectStrings at: anInteger) + ifNil: [ 'Implementors of ', - | str | - defaultSelectString ifNil: - [defaultSelectString := self containingWindow label]. - ^(str := autoSelectStrings at: anInteger) - ifNil: - [ 'Implementors of ', (self class parse: self selection + toClassAndSelector: [ :class :selector | selector ]) + ] + ifNotNil: [:str| 'Senders of ', str ] - toClassAndSelector: [ :class :selector | selector ]) ] - ifNotNil: - [ 'Senders of ', str ] ! Item was added: + ----- Method: MessageTrace>>windowTitle (in category 'building') ----- + windowTitle + "set the window label to suit the selection state; + if no selection, use saved widow label and add the number of items in the messageList + if something is selected, use the relevant string provided by windowLabelAt: which considers the index" + + ^messageListIndex = 0 + ifTrue:[String streamContents: [:str| str nextPutAll: windowLabel; + space; + nextPut: $[; + space; + nextPutAll: messageList size asString; + space; + nextPut: $] + ] + ] + ifFalse: [self windowLabelAt: messageListIndex]! From commits at source.squeak.org Mon Oct 26 17:36:09 2020 From: commits at source.squeak.org (commits at source.squeak.org) Date: Mon, 26 Oct 2020 17:36:09 0000 Subject: [squeak-dev] The Trunk: MorphicExtras-pre.279.mcz Message-ID: Patrick Rein uploaded a new version of MorphicExtras to project The Trunk: http://source.squeak.org/trunk/MorphicExtras-pre.279.mcz ==================== Summary ==================== Name: MorphicExtras-pre.279 Author: pre Time: 26 October 2020, 6:35:34.734595 pm UUID: 1deb32ba-e1e4-1a43-ae43-cc06c2dd2245 Ancestors: MorphicExtras-mt.278 Deprecates two private methods that stated that they are deprecated in their comments. Adds one such comment to yet another method. =============== Diff against MorphicExtras-mt.278 =============== Item was removed: - ----- Method: FancyMailComposition>>breakLinesInMessage: (in category 'private') ----- - breakLinesInMessage: message - "reformat long lines in the specified message into shorter ones" - self flag: #TODO. "Maybe deprecated" - message body mainType = 'text' ifTrue: [ - "it's a single-part text message. reformat the text" - | newBodyText | - newBodyText := self breakLines: message bodyText atWidth: 72. - message body: (MIMEDocument contentType: message body contentType content: newBodyText). - - ^self ]. - - message body isMultipart ifTrue: [ - "multipart message; process the top-level parts. HACK: the parts are modified in place" - message parts do: [ :part | - part body mainType = 'text' ifTrue: [ - | newBodyText | - newBodyText := self breakLines: part bodyText atWidth: 72. - part body: (MIMEDocument contentType: part body contentType content: newBodyText) ] ]. - message regenerateBodyFromParts. ].! Item was removed: - ----- Method: PostscriptCanvas>>text:at:font:color:justified:parwidth: (in category 'private') ----- - text: s at:point font: fontOrNil color: c justified:justify parwidth:parwidth - - self flag: #bob. "deprecated in favor of #textStyled......." - - - - - - - - self setFont:(fontOrNil ifNil:[self defaultFont]). - self comment:' text color: ',c printString. - self setColor:c. - self comment:' origin ', origin printString. - self moveto: point. - target print:' ('; - print:s asPostscript; print:') '. - justify ifTrue:[ - target write:parwidth; print:' jshow'; cr. - ] ifFalse:[ - target print:'show'. - ]. - target cr. - ! Item was changed: ----- Method: PostscriptCanvas>>text:at:font:color:spacePad: (in category 'private') ----- text: s at: point font: fontOrNil color: c spacePad: pad + "Potentially deprecated, no senders in 5.3, seems to have been replaced by textStyled:..." | fillC oldC | fillC := self shadowColor ifNil: [c]. self setFont: (fontOrNil ifNil: [self defaultFont]). self comment: ' text color: ' , c printString. oldC := currentColor. self setColor: fillC. self comment: ' origin ' , origin printString. self moveto: point. target write: pad; print: ' 0 32 ('; print: s asPostscript; print: ') widthshow'; cr. self setColor: oldC.! From tim at rowledge.org Mon Oct 26 17:37:14 2020 From: tim at rowledge.org (tim Rowledge) Date: Mon, 26 Oct 2020 10:37:14 -0700 Subject: [squeak-dev] The Trunk: Tools-tpr.1008.mcz In-Reply-To: References: Message-ID: <799E67C0-B829-46C6-8E24-48897A146BFC@rowledge.org> > On 2020-10-25, at 11:09 PM, Marcel Taeumel wrote: > > Hi Tim. > > Please also upload Tools-tpr.1003 to Trunk. And double-check ancestry if other packages are missing. OK, I believe I've just done that, hopefully correctly. We really need to try to make the suggested changes to support treating/rejecting inbox items directly from the MC tools... tim -- tim Rowledge; tim at rowledge.org; http://www.rowledge.org/tim Useful random insult:- Wasn't fully debugged before being released. From commits at source.squeak.org Mon Oct 26 17:38:17 2020 From: commits at source.squeak.org (commits at source.squeak.org) Date: Mon, 26 Oct 2020 17:38:17 0000 Subject: [squeak-dev] The Trunk: Morphic-pre.1707.mcz Message-ID: Patrick Rein uploaded a new version of Morphic to project The Trunk: http://source.squeak.org/trunk/Morphic-pre.1707.mcz ==================== Summary ==================== Name: Morphic-pre.1707 Author: pre Time: 26 October 2020, 6:37:05.943595 pm UUID: dde21a70-157a-7943-93ca-2ac63b8be1af Ancestors: Morphic-mt.1706 Deprecates five methods that should be deprecated according to their method comments. =============== Diff against Morphic-mt.1706 =============== Item was removed: - ----- Method: Canvas>>image:at: (in category 'drawing-obsolete') ----- - image: aForm at: aPoint - "Note: This protocol is deprecated. Use #paintImage: instead." - self image: aForm - at: aPoint - sourceRect: aForm boundingBox - rule: Form paint. - ! Item was removed: - ----- Method: Canvas>>image:at:rule: (in category 'drawing-obsolete') ----- - image: aForm at: aPoint rule: combinationRule - "Note: This protocol is deprecated. Use one of the explicit image drawing messages (#paintImage, #drawImage) instead." - self image: aForm - at: aPoint - sourceRect: aForm boundingBox - rule: combinationRule. - ! Item was removed: - ----- Method: Canvas>>imageWithOpaqueWhite:at: (in category 'drawing-obsolete') ----- - imageWithOpaqueWhite: aForm at: aPoint - "Note: This protocol is deprecated. Use #drawImage: instead" - self image: aForm - at: aPoint - sourceRect: (0 at 0 extent: aForm extent) - rule: Form over. - ! Item was removed: - ----- Method: Morph>>fullCopy (in category 'copying') ----- - fullCopy - "Deprecated, but maintained for backward compatibility with existing code (no senders in the base 3.0 image). Calls are revectored to #veryDeepCopy, but note that #veryDeepCopy does not do exactly the same thing that the original #fullCopy did, so beware!!" - - ^ self veryDeepCopy! Item was removed: - ----- Method: NewParagraph>>lineIndexForCharacter: (in category 'private') ----- - lineIndexForCharacter: characterIndex - "Deprecated" - - ^self lineIndexOfCharacterIndex: characterIndex ! From commits at source.squeak.org Mon Oct 26 17:39:20 2020 From: commits at source.squeak.org (commits at source.squeak.org) Date: Mon, 26 Oct 2020 17:39:20 0000 Subject: [squeak-dev] The Trunk: 60Deprecated-pre.83.mcz Message-ID: Patrick Rein uploaded a new version of 60Deprecated to project The Trunk: http://source.squeak.org/trunk/60Deprecated-pre.83.mcz ==================== Summary ==================== Name: 60Deprecated-pre.83 Author: pre Time: 26 October 2020, 6:39:16.338595 pm UUID: 440cec82-c788-7840-a57c-bc79a5111b3f Ancestors: 60Deprecated-mt.82 Deprecates seven methods that should be deprecated according to their method comments. Complements the commits to Morphic and Morphic-Extras. =============== Diff against 60Deprecated-mt.82 =============== Item was added: + ----- Method: Canvas>>image:at: (in category '*60Deprecated-drawing') ----- + image: aForm at: aPoint + "Note: This protocol is deprecated. Use #paintImage: instead." + self deprecated: 'Use #paintImage: or #drawImage: instead'. + self image: aForm + at: aPoint + sourceRect: aForm boundingBox + rule: Form paint. + ! Item was added: + ----- Method: Canvas>>image:at:rule: (in category '*60Deprecated-drawing') ----- + image: aForm at: aPoint rule: combinationRule + "Note: This protocol is deprecated. Use one of the explicit image drawing messages (#paintImage, #drawImage) instead." + self deprecated: 'Use #paintImage: or #drawImage: instead'. + self image: aForm + at: aPoint + sourceRect: aForm boundingBox + rule: combinationRule. + ! Item was added: + ----- Method: Canvas>>imageWithOpaqueWhite:at: (in category '*60Deprecated-drawing') ----- + imageWithOpaqueWhite: aForm at: aPoint + "Note: This protocol is deprecated. Use #drawImage: instead" + self deprecated: 'Use #paintImage: or #drawImage: instead'. + self image: aForm + at: aPoint + sourceRect: (0 at 0 extent: aForm extent) + rule: Form over. + ! Item was added: + ----- Method: FancyMailComposition>>breakLinesInMessage: (in category '*60Deprecated-private') ----- + breakLinesInMessage: message + "reformat long lines in the specified message into shorter ones" + self deprecated: 'This should not be done by the mail composition, by now the MailMessage takes care of it'. + message body mainType = 'text' ifTrue: [ + "it's a single-part text message. reformat the text" + | newBodyText | + newBodyText := self breakLines: message bodyText atWidth: 72. + message body: (MIMEDocument contentType: message body contentType content: newBodyText). + + ^self ]. + + message body isMultipart ifTrue: [ + "multipart message; process the top-level parts. HACK: the parts are modified in place" + message parts do: [ :part | + part body mainType = 'text' ifTrue: [ + | newBodyText | + newBodyText := self breakLines: part bodyText atWidth: 72. + part body: (MIMEDocument contentType: part body contentType content: newBodyText) ] ]. + message regenerateBodyFromParts. ].! Item was added: + ----- Method: Morph>>fullCopy (in category '*60Deprecated-copying') ----- + fullCopy + "Deprecated, but maintained for backward compatibility with existing code (no senders in the base 3.0 image). Calls are revectored to #veryDeepCopy, but note that #veryDeepCopy does not do exactly the same thing that the original #fullCopy did, so beware!!" + self deprecated: 'Use #veryDeepCopy instead'. + ^ self veryDeepCopy! Item was added: + ----- Method: NewParagraph>>lineIndexForCharacter: (in category '*60Deprecated-private') ----- + lineIndexForCharacter: characterIndex + + self deprecated: 'Use #lineIndexOfCharacterIndex: instead'. + ^self lineIndexOfCharacterIndex: characterIndex ! Item was added: + ----- Method: PostscriptCanvas>>text:at:font:color:justified:parwidth: (in category '*60Deprecated-private') ----- + text: s at:point font: fontOrNil color: c justified:justify parwidth:parwidth + + self deprecated: 'Use #textStyled:at:font:color:justified:parwidth: instead'. + self flag: #bob. "deprecated in favor of #textStyled......." + + + + + + + + self setFont:(fontOrNil ifNil:[self defaultFont]). + self comment:' text color: ',c printString. + self setColor:c. + self comment:' origin ', origin printString. + self moveto: point. + target print:' ('; + print:s asPostscript; print:') '. + justify ifTrue:[ + target write:parwidth; print:' jshow'; cr. + ] ifFalse:[ + target print:'show'. + ]. + target cr. + ! From Christoph.Thiede at student.hpi.uni-potsdam.de Mon Oct 26 20:14:00 2020 From: Christoph.Thiede at student.hpi.uni-potsdam.de (Thiede, Christoph) Date: Mon, 26 Oct 2020 20:14:00 +0000 Subject: [squeak-dev] Improving the SystemNavigation browseMessageList... stuff In-Reply-To: <74BB0DEF-0774-4717-A296-400A6755AFA6@rowledge.org> References: <6A70A9A6-A1D2-4402-84A5-AD39DB02FD03@rowledge.org> <1603021617930-0.post@n4.nabble.com> <0FA3FBB0-E579-480C-9568-EBAD0C65E057@rowledge.org> <655d8bdd3c6b47d0b0f2fe57f65b8147@student.hpi.uni-potsdam.de>, <74BB0DEF-0774-4717-A296-400A6755AFA6@rowledge.org> Message-ID: <8744a7f6e4b24cebbfd91928ec90207d@student.hpi.uni-potsdam.de> > Not a regression, but still a bug: Select 42 in some method in a MessageTrace and browse senders -> Error: Instances of SmallInteger are not indexable from #findAgainNow. Is this related to your changes? Ah, I believe I already fixed this one in Tools-ct.986. Sorry, I'm losing the overview of my own changes ... However, this will be a merge conflict with your changes. Sigh. > > highlight all occurrences of the currently selected word/selector as you may know it from VS Code; > > No. Alright, a matter of taste. No problem ... May I say the bad word once again? We could make it a *preference* :D It can be useful at some times and useless at other times. In Squeak, methods are usually short so the possible outcome is smaller, but still it could help me to identify recurring literals at a glance, just for example. I was just brainstorming ... There are even more things that currently are too much coupled to the editor imho ... For instance, support for displaying/highlighting opposite brackets or everything between two brackets could be improved as well ... > Given the lack of people screaming to not do it, I'll move a slightly updated version into the trunk and we'll see how it goes. Great, thank you! Best, Christoph ________________________________ Von: Squeak-dev im Auftrag von tim Rowledge Gesendet: Montag, 26. Oktober 2020 00:52:13 An: The general-purpose Squeak developers list Betreff: Re: [squeak-dev] Improving the SystemNavigation browseMessageList... stuff > On 2020-10-24, at 12:13 PM, Thiede, Christoph wrote: > > Hi Tim, > > some scattered comments on your changes: It's a great idea to refactor this windowTitle stuff! > > Personally, I think it would look nicer if you could leave out the spaces between the brackets, e.g. "Implementors of initialize [987]" instead of "Implementors of initialize [ 987 ]". No argument there. > > Not a regression, but still a bug: Select 42 in some method in a MessageTrace and browse senders -> Error: Instances of SmallInteger are not indexable from #findAgainNow. Is this related to your changes? No, but certainly a bug. It's related to - I suspect - the problem I noticed in MessageTrace>>#getImplementorNamed: where we find that occasionally the parameter 'selectorSymbol' is actually a Character. Which is indeed not indexable. *That* seems to stem from TextEditor>>implementorsOfIt where we see that we are using ``` self selectedLiteral ifNotNil: [:aLiteral| ^self model browseAllImplementorsOf: aLiteral]. ``` ( a change tagged by Marcel about 6 months ago) and in this case aLiteral is the Character [ It's possible the code finding the literal is not working right. It's possible the concept is faulty - should it even try to find all the 'implementors' of something like $[ ? One of my changes 'fixes' at least part of the problem but I couldn't replicate your exact case. > > > Possibly better to do asOrderedCollection sort ? > > Sounds reasonable. Yeah, it works and reads better. > > > Now, about that improvement to the Shout stuff... > > Your ideas sound interesting. We have collected so many ideas on what Shout/attributes could do else (ShoutAttribute, highlight searched text, and here are some other rough ideas: > highlight all occurrences of the currently selected word/selector as you may know it from VS Code; No. Absolutely no. Nope. Nopetty nope with nope-sauce on top. I've encountered this in the horrific code editor used by WordPress and it is *horrible*. It's also an poorly bounded expense of time. I mean seriously, if you are editing a megabyte file and select 'e' wold it realyl make any sense at all to search out and highlight every damn 'e' ? Madness. Typical 'UI cleverness' from microsoft, the people that wouldn't know a good UI if it bit them on the cerebral cortex. > automatically style hyperlinks with a TextURL (ask Tom Beckmann for more details on this idea) or class names with a TextLink; a text attribute that adds a tooltip to a certain subtext; allow to browse a word by Ctrl + clicking it, probably again via a text attribute; ...). This is essentially the data parsing and marking stuff that is used in (amongst others) Apple Mail and can be used to do 'useful things' like spotting a likely appointment to add to your calendar. Again, there are potential performance issues that need careful consideration and there would need to be ways to specify which things get done for each situation - I really don't want time spent on searching for appointments in source code! Also, heavily covered by patents that have been litigated and cost people serious money - I know because I worked on one or two cases. Given the lack of people screaming to not do it, I'll move a slightly updated version into the trunk and we'll see how it goes. tim -- tim Rowledge; tim at rowledge.org; http://www.rowledge.org/tim A bad random number generator: 1, 1, 1, 1, 1, 4.33e+67, 1, 1, 1 -------------- next part -------------- An HTML attachment was scrubbed... URL: From hannes.hirzel at gmail.com Mon Oct 26 21:46:10 2020 From: hannes.hirzel at gmail.com (H. Hirzel) Date: Mon, 26 Oct 2020 21:46:10 +0000 Subject: [squeak-dev] assert:equals: in Object In-Reply-To: <66FFC206-29FB-4309-BA72-995A1DE23937@rowledge.org> References: <79aca96b0f334332a72c84f0db65a307@student.hpi.uni-potsdam.de> <66FFC206-29FB-4309-BA72-995A1DE23937@rowledge.org> Message-ID: Hi Tim Not fully sure what you mean, probably not cod (a type of fish) cod (cash on delivery) doc (the extension of an MS Word file which these days might often be larger than a Squeak image) :-) a) As for the original proposal from Eliot which started this thread, what is your conclusion? and / or related to this My impression is that Eliot's main concern is a smooth workflow in moving code back and forth from an SUnit test to a workspace. As this discussion shows this may also be adressed on the workspace level. But for the moment he says that adding one method to class Object would help him --Hannes Details: ---------- A Squeak 5.3 release image has out of the box Object subclass: #TestCase instanceVariableNames: 'testSelector timeout' classVariableNames: '' poolDictionaries: '' category: 'SUnit-Kernel' assert: aBooleanOrBlock aBooleanOrBlock value ifFalse: [self signalFailure: 'Assertion failed'] assert: aBooleanOrBlock description: aStringOrBlock aBooleanOrBlock value ifFalse: [ | description | description := aStringOrBlock value. self logFailure: description. TestResult failure signal: description ] assert: expected equals: actual ^self assert: expected = actual description: [ self comparingStringBetween: expected and: actual ] assert: expected equals: actual description: aString ^self assert: expected = actual description: [ aString , ': ', (self comparingStringBetween: expected and: actual) ] Meanwhile class Object has assert: aBlock "Throw an assertion error if aBlock does not evaluates to true." aBlock value ifFalse: [AssertionFailure signal: 'Assertion failed'] assert: aBlock description: aStringOrBlock "Throw an assertion error if aBlock does not evaluates to true." aBlock value ifFalse: [ AssertionFailure signal: aStringOrBlock value ] assert: aBlock descriptionBlock: descriptionBlock "Throw an assertion error if aBlock does not evaluate to true." aBlock value ifFalse: [AssertionFailure signal: descriptionBlock value asString ] but no assert: expected equals: actual And this is the main request by Eliot: to have this method assert: expected equals: actual also in class object as I understand it. As for me -- no objection to that. On 10/26/20, tim Rowledge wrote: > > >> On 2020-10-25, at 11:40 PM, Marcel Taeumel wrote: >> >> > A situation where SUnit and all the tests are not necessarily loaded. >> >> Hmm... maybe we might consider adding an SUnit-Core? Well, not sure it >> makes sense to have an image without SUnit. But then you might want to >> also strip, e.g., network support to shrink the image file a little bit >> more. :-) > > Once upon a time that was a big deal because memory was short. Given that I > have been sent almost content-free Word documents that take up more space > than a well loaded Squeak image, I suggest we probably don't need to care so > much these days. > > It offends my CDO (OCD but the letters in *the right order*), but that's the > reality. > > > tim > -- > tim Rowledge; tim at rowledge.org; http://www.rowledge.org/tim > It said, "Insert disk #3," but only two will fit! > > > > From lewis at mail.msen.com Tue Oct 27 00:41:27 2020 From: lewis at mail.msen.com (David T. Lewis) Date: Mon, 26 Oct 2020 20:41:27 -0400 Subject: [squeak-dev] Tom's Roassal3 now on squeaksource In-Reply-To: <17565cef29c.c892728240164.7052561839334924300@zoho.com> References: <17565cef29c.c892728240164.7052561839334924300@zoho.com> Message-ID: <20201027004127.GA10312@shell.msen.com> On Mon, Oct 26, 2020 at 12:47:42PM -0400, gettimothy via Squeak-dev wrote: > MCHttpRepository > > location: 'http://www.squeaksource.com/Roassal3' > > user: 'tty' > > password: '' > > > > Eliot and Tom, you are admins. Let me know if I screwed something up, or if I can make things better. > Hi tty, One suggestion - in the "Project Description" for Roassal3 on squeaksource.com, add a few lines to give credit to the original authors, and maybe explain how this project relates to the other repositories. I don't really know the background on Roassal, but I would guess that the other Roassal on squeaksource.com was the early work of its original developers, and that later work probably took place on smalltalkhub and then on GitHub. If you can briefly explain this in the "Project Description" for Roassal3 it will help to put your project in context, and it will also ensure that original authors are credited for their work. Thanks :-) Dave From gettimothy at zoho.com Tue Oct 27 12:20:35 2020 From: gettimothy at zoho.com (gettimothy) Date: Tue, 27 Oct 2020 08:20:35 -0400 Subject: [squeak-dev] Roassal3 question for the morphic pros to get majority of Roassal3 examples working properly. How to center a RSBalloonMorph in the world? Message-ID: <1756a00bf1f.afef4a7353058.3243849966528828637@zoho.com> Hi Folks, TL;DR; How do I get a RSBalloonMorph to open up inside the extents of The World?  If we fix this, then the majority of Roassal3 examples are working examples. For Roassal3 MCHttpRepository location: 'http://www.squeaksource.com/Roassal3' user: '' password: ''  I have a class named RSExampleDoits  which has class side methods that allow easy access to the various examples a healthy majority of which are "semi-working". For example: rsBasicAnimationExamples "working" "semi working" "the viewport for these is off-World on open." RSBasicAnimationExamples new  example01Basic  open. RSBasicAnimationExamples new example02Sequential   open. RSBasicAnimationExamples new  example03Ramp  open. RSBasicAnimationExamples new  example05LoopEvent  open. RSBasicAnimationExamples new   example06Parallel open. "not working" RSBasicAnimationExamples new  example04DashAnimation  open. RSBasicAnimationExamples new example07CornerRadius   open. The basic problem is that the example shows up mostly off-screen in the World off to the right and must be pulled in by the mouse to see it. the 'open' and 'createMorph' send are to RSCanvas ProtoObject #()       Object #()             RSObject #()                   RSObjectWithProperty #('announcer' 'properties')                         RSCanvas #('shapes' 'fixedShapes' 'camera' 'animations' 'extent' 'color' 'morph' 'clearBackground' 'showRectangles' 'nodes' 'edges') open | window | self createMorph. window := morph openInWindow. window extent: 500 at 500. morph privateOwner: window. ^ window createMorph "Create a Morph that contains myself." Smalltalk at: #AthensCanvas ifPresent: [morph := RSAthensMorph new renderer: RSAthensRenderer new; yourself] ifAbsent: [morph := RSBalloonMorph new renderer: RSBalloonRenderer new; yourself].     <<---THIS IS CALLED. morph canvas: self. ^ morph your insights are much appreciated. -------------- next part -------------- An HTML attachment was scrubbed... URL: From eliot.miranda at gmail.com Tue Oct 27 14:01:32 2020 From: eliot.miranda at gmail.com (Eliot Miranda) Date: Tue, 27 Oct 2020 07:01:32 -0700 Subject: [squeak-dev] Tom's Roassal3 now on squeaksource In-Reply-To: <17565cef29c.c892728240164.7052561839334924300@zoho.com> References: <17565cef29c.c892728240164.7052561839334924300@zoho.com> Message-ID: <38BC6925-F58D-4A0B-A765-AE690160D397@gmail.com> > On Oct 26, 2020, at 9:47 AM, gettimothy via Squeak-dev wrote: > >  > MCHttpRepository > location: 'http://www.squeaksource.com/Roassal3' > user: 'tty' > password: '' > > Eliot and Tom, you are admins. Let me know if I screwed something up, or if I can make things better. > > cheers. I vote for making Alexandre an admin. This is his baby. Tom what do you think? Alexandre, what to you think? > > > > > > -------------- next part -------------- An HTML attachment was scrubbed... URL: From eliot.miranda at gmail.com Tue Oct 27 14:19:32 2020 From: eliot.miranda at gmail.com (Eliot Miranda) Date: Tue, 27 Oct 2020 07:19:32 -0700 Subject: [squeak-dev] assert:equals: in Object In-Reply-To: References: Message-ID: <48059FDE-660A-444A-9CBF-83BF85E390A8@gmail.com> Hi Hannes, > On Oct 26, 2020, at 2:46 PM, H. Hirzel wrote: > > Hi Tim > > Not fully sure what you mean, probably not > cod (a type of fish) > cod (cash on delivery) > doc (the extension of an MS Word file which these days might > often be larger than a Squeak image) > > :-) > > > a) As for the original proposal from Eliot which started this thread, > what is your conclusion? > and / or related to this > > > My impression is that Eliot's main concern is a smooth workflow in > moving code back and forth from an SUnit test to a workspace. As this > discussion shows this may also be adressed on the workspace level. > > > But for the moment he says that adding one method to class Object would help him My response earlier in got lost. I realized that the issue is my own incompetence. Instead if using a regular workspace one can use an inspector on the test case itself. I suppose the nice extension would be to allow one to define a default receiver for a Workspace other than nil. This is simply a UI convenience; there is less visual noise in using a workspace than an inspector. Conceptually alongside the allow automatic variable declaration/reset workspace variables menu items one could have a “specify default receiver via doit...” entry and store the default receiver in the variables dictionary. Resetting variables would have the side effect of resetting the default receiver back to nil. But it isn’t a big deal. What I should do is try and get it into my head that I can always run doits in an inspector if I want to get at a specific class’s protocol. _,,,^..^,,,_ (phone) > > --Hannes > > > Details: > ---------- > > A Squeak 5.3 release image has out of the box > > Object subclass: #TestCase > instanceVariableNames: 'testSelector timeout' > classVariableNames: '' > poolDictionaries: '' > category: 'SUnit-Kernel' > > > > assert: aBooleanOrBlock > > aBooleanOrBlock value ifFalse: [self signalFailure: 'Assertion failed'] > > > > assert: aBooleanOrBlock description: aStringOrBlock > > aBooleanOrBlock value ifFalse: [ > | description | > description := aStringOrBlock value. > self logFailure: description. > TestResult failure signal: description ] > > > > assert: expected equals: actual > > ^self > assert: expected = actual > description: [ self comparingStringBetween: expected and: actual ] > > > assert: expected equals: actual description: aString > > ^self > assert: expected = actual > description: [ aString , ': ', (self comparingStringBetween: > expected and: actual) ] > > > > Meanwhile class Object has > > assert: aBlock > "Throw an assertion error if aBlock does not evaluates to true." > > aBlock value ifFalse: [AssertionFailure signal: 'Assertion failed'] > > > assert: aBlock description: aStringOrBlock > "Throw an assertion error if aBlock does not evaluates to true." > > aBlock value ifFalse: [ AssertionFailure signal: aStringOrBlock value ] > > > assert: aBlock descriptionBlock: descriptionBlock > "Throw an assertion error if aBlock does not evaluate to true." > > aBlock value ifFalse: [AssertionFailure signal: descriptionBlock > value asString ] > > > but no > > > assert: expected equals: actual > > > And this is the main request by Eliot: to have this method > > assert: expected equals: actual > > > also in class object as I understand it. > > As for me -- no objection to that. > > >> On 10/26/20, tim Rowledge wrote: >> >> >>>> On 2020-10-25, at 11:40 PM, Marcel Taeumel wrote: >>> >>>> A situation where SUnit and all the tests are not necessarily loaded. >>> >>> Hmm... maybe we might consider adding an SUnit-Core? Well, not sure it >>> makes sense to have an image without SUnit. But then you might want to >>> also strip, e.g., network support to shrink the image file a little bit >>> more. :-) >> >> Once upon a time that was a big deal because memory was short. Given that I >> have been sent almost content-free Word documents that take up more space >> than a well loaded Squeak image, I suggest we probably don't need to care so >> much these days. >> >> It offends my CDO (OCD but the letters in *the right order*), but that's the >> reality. >> >> >> tim >> -- >> tim Rowledge; tim at rowledge.org; http://www.rowledge.org/tim >> It said, "Insert disk #3," but only two will fit! >> >> >> >> > From jrmaffeo at gmail.com Tue Oct 27 16:02:12 2020 From: jrmaffeo at gmail.com (John-Reed Maffeo) Date: Tue, 27 Oct 2020 09:02:12 -0700 Subject: [squeak-dev] #installExtraPackages - fails on new install In-Reply-To: <7276F53A-FF78-49BD-A5BE-3E33B932C8C4@rowledge.org> References: <1754c230ba5.c68a703024213.9040368036096187468@zoho.com> <7276F53A-FF78-49BD-A5BE-3E33B932C8C4@rowledge.org> Message-ID: Tim, Thank you for your comprehensive reply. I will give it a try. My OS skills on any platform are pretty basic so it may take me some time to sort it out. I have one other application that I have to install on the pi and it is giving me fits as well. BTW, the phrase in your signature was most appropriate :-) On Mon, Oct 26, 2020 at 10:33 AM tim Rowledge wrote: > > > > On 2020-10-26, at 9:59 AM, John-Reed Maffeo wrote: > > > > I tried to update the image to see if that would help and a got a seg > fault. > > > > "Segmentation fault Mon Oct 26 09:36:22 2020 > > > > /usr/lib/squeak/5.0-201610101924/squeak > > Squeak VM version: 5.0-201610101924 Wed Oct 12 14:50:05 PDT 2016 gcc > 4.9.2 [Production Spur VM] > > Built from: CoInterpreter VMMaker.oscog-eem.1950 uuid: > b4089b49-1494-49d2-8966-57cba5c92194 Oct 12 2016 > > With: StackToRegisterMappingCogit VMMaker.oscog-eem.1950 uuid: > b4089b49-1494-49d2-8966-57cba5c92194 Oct 12 2016 > > Revision: VM: 201610101924 tim at Diziet.local:Documents/Squeak/Rasbian-VM/vm > $ Date: Mon Oct 10 12:24:25 2016 -0700 $ Plugins: 201610101924 > tim at Diziet.local:Documents/Squeak/Rasbian-VM/vm $ > > Build host: Linux Goldskin 4.4.21-v7+ #911 SMP Thu Sep 15 14:22:38 BST > 2016 armv7l GNU/Linux > > plugin path: /usr/lib/squeak/5.0-201610101924 [default: > /usr/lib/squeak/5.0-201610101924/]" > > OK, it looks like you somehow ended up running a *very* old VM that I > built (in 2016!) for the NuScratch install in Raspbian. That might explain > this. > > This is actually an artefact of the completely broken way we are bundling > and installing linux VM packages, exposded by the Pi having an already > installed VM in the 'proper' place but the package you downloaded relying > on a VM in a completely different place! > > There's a bunch of different ways to fix this, many of them far more > unix-expert than I can handle. The simplest I can think of *for Raspbian* > is to edit the file properties of an image file to pint to the newer vm. > > Start by opening the file browser and finding an image file. Select it and > r-click->Properties. In that dialog you should see (about halfway down) > 'open with' and a pulldown menu. At the bottom of that should be > 'Customize' - click on that. > > Next comes a 'Choose Application' dialog and you could slelct from a wide > variety of incorrect choices. Do not click on 'Games->Minecraft Pi' and try > running Squeak in Minecraft. It only leads to Fear, and Fear leads to > Eating Too Many Biscuits. > > Instead, click on the 'Custom Command Line' tab. Now you see a way to > enter an actual command line (duh!). I always use the 'Browse...' button to > open a file finder, locate the 'Squeak' shell script and choose that. The > shell script will be in some fairly deeply buried directory within the > package you downloaded. > > Once you have found it and selected it and clicked on the 'OK' button in > the file finder the path will appear back in the 'Choose Application' > dialog. Almost done! > > Now in that 'Command line to execute:' text field, add %f at the end (with > a space after the final bit of the filename!) so that the name of the image > file you click on will be passed to the squeak shell script. I always put > sometihng hopefully helpful in the 'Application name' text field as well. > Finally, click on the OK button. > > One last step I almost always have to do is to to set the permissions of > the image file(s) to have 'nobody' for the 'Execute:' permission. No idea > why. > > With all that done, you should find that a d-click on the image file will > run the latest VM for you. > > Like I said, broken. > > tim > -- > tim Rowledge; tim at rowledge.org; http://www.rowledge.org/tim > Programming is an art form that fights back. > > > > -- John-Reed Maffeo -------------- next part -------------- An HTML attachment was scrubbed... URL: From tim at rowledge.org Tue Oct 27 18:12:42 2020 From: tim at rowledge.org (tim Rowledge) Date: Tue, 27 Oct 2020 11:12:42 -0700 Subject: [squeak-dev] #installExtraPackages - fails on new install In-Reply-To: References: <1754c230ba5.c68a703024213.9040368036096187468@zoho.com> <7276F53A-FF78-49BD-A5BE-3E33B932C8C4@rowledge.org> Message-ID: > On 2020-10-27, at 9:02 AM, John-Reed Maffeo wrote: > > Tim, > Thank you for your comprehensive reply. I will give it a try. I hope it works ok - let me know if anytihng doesn't work out. One of the problems of trying to explain sometihng 'old news' to someone for whom it is 'new news' is forgetting sometihng important that just doesn't stand out any more. > > My OS skills on any platform are pretty basic so it may take me some time to sort it out. I have one other application that I have to install on the pi and it is giving me fits as well. > > BTW, the phrase in your signature was most appropriate :-) They almost always are. It's supposedly random but I reckon I have an instance of WinterMute running in my system somewhere. tim -- tim Rowledge; tim at rowledge.org; http://www.rowledge.org/tim Useful random insult:- If brains were taxed, he'd get a rebate. From gettimothy at zoho.com Tue Oct 27 17:51:07 2020 From: gettimothy at zoho.com (gettimothy) Date: Tue, 27 Oct 2020 13:51:07 -0400 Subject: [squeak-dev] Tom's Roassal3 now on squeaksource In-Reply-To: References: <17565cef29c.c892728240164.7052561839334924300@zoho.com> <38BC6925-F58D-4A0B-A765-AE690160D397@gmail.com> Message-ID: <1756b2f5e4e.ad1c094858515.993457765476696201@zoho.com> Hi Alexandre, I made you an admin on the project cordially, tty ---- On Tue, 27 Oct 2020 10:16:28 -0400 Alexandre Bergel wrote ---- Hi! I would be happy to offer advices, however, no problem if I am not admin. I am curious to see how the port goes.  Let me know please. Cheers, Alexandre --  _,.;:~^~:;._,.;:~^~:;._,.;:~^~:;._,.;:~^~:;._,.;: Alexandre Bergel  http://www.bergel.eu ^~:;._,.;:~^~:;._,.;:~^~:;._,.;:~^~:;._,.;:~^~:;. On 27-10-2020, at 11:01, Eliot Miranda wrote: On Oct 26, 2020, at 9:47 AM, gettimothy via Squeak-dev wrote: MCHttpRepository location: 'http://www.squeaksource.com/Roassal3' user: 'tty' password: '' Eliot and Tom, you are admins. Let me know if I screwed something up, or if I can make things better. cheers. I vote for making Alexandre an admin.  This is his baby.  Tom what do you think?  Alexandre, what to you think? -------------- next part -------------- An HTML attachment was scrubbed... URL: From gettimothy at zoho.com Tue Oct 27 17:53:38 2020 From: gettimothy at zoho.com (gettimothy) Date: Tue, 27 Oct 2020 13:53:38 -0400 Subject: [squeak-dev] FIGURED IT OUT: was Re: Roassal3 question for the morphic pros to get majority of Roassal3 examples working properly. How to center a RSBalloonMorph in the world? In-Reply-To: <1756a00bf1f.afef4a7353058.3243849966528828637@zoho.com> References: <1756a00bf1f.afef4a7353058.3243849966528828637@zoho.com> Message-ID: <1756b31a947.ccbc5d1058557.3706850103364290194@zoho.com> Hi Folks, I found the Morph >> position: aPoint method and then I modified the RSCanvas >> open method to set position:10 at 10. I also to the liberty to make the size 1000 at 1000  . cheers, t ---- On Tue, 27 Oct 2020 08:20:35 -0400 gettimothy wrote ---- Hi Folks, TL;DR; How do I get a RSBalloonMorph to open up inside the extents of The World?  If we fix this, then the majority of Roassal3 examples are working examples. For Roassal3 MCHttpRepository location: 'http://www.squeaksource.com/Roassal3' user: '' password: ''  I have a class named RSExampleDoits  which has class side methods that allow easy access to the various examples a healthy majority of which are "semi-working". For example: rsBasicAnimationExamples "working" "semi working" "the viewport for these is off-World on open." RSBasicAnimationExamples new  example01Basic  open. RSBasicAnimationExamples new example02Sequential   open. RSBasicAnimationExamples new  example03Ramp  open. RSBasicAnimationExamples new  example05LoopEvent  open. RSBasicAnimationExamples new   example06Parallel open. "not working" RSBasicAnimationExamples new  example04DashAnimation  open. RSBasicAnimationExamples new example07CornerRadius   open. The basic problem is that the example shows up mostly off-screen in the World off to the right and must be pulled in by the mouse to see it. the 'open' and 'createMorph' send are to RSCanvas ProtoObject #()       Object #()             RSObject #()                   RSObjectWithProperty #('announcer' 'properties')                         RSCanvas #('shapes' 'fixedShapes' 'camera' 'animations' 'extent' 'color' 'morph' 'clearBackground' 'showRectangles' 'nodes' 'edges') open | window | self createMorph. window := morph openInWindow. window extent: 500 at 500. morph privateOwner: window. ^ window createMorph "Create a Morph that contains myself." Smalltalk at: #AthensCanvas ifPresent: [morph := RSAthensMorph new renderer: RSAthensRenderer new; yourself] ifAbsent: [morph := RSBalloonMorph new renderer: RSBalloonRenderer new; yourself].     <<---THIS IS CALLED. morph canvas: self. ^ morph your insights are much appreciated. -------------- next part -------------- An HTML attachment was scrubbed... URL: From kirtai+st at gmail.com Tue Oct 27 18:31:12 2020 From: kirtai+st at gmail.com (Douglas Brebner) Date: Tue, 27 Oct 2020 18:31:12 +0000 Subject: [squeak-dev] SqueakSSL questions and problems Message-ID: <42662725-ba7a-9ff3-500b-15a07d4e868f@gmail.com> Hi, I've been playing around with SqueakSSL in Squeak and Cuis recently and found that most of the tests fail under Linux. It seems that the root of the problem is that the example test certificate in SqueakSSL>>#exampleCertFile is both expired (only valid from 2011->2012) and also using cyphers no longer supported in TLS 1.3. This breaks the tests using local connections. I am nowhere even close to being a crypto expert so I'm asking how should this be handled? I believe that the certificate was supposed to be replaced every year (or longer with longer valid dates) but don't want to do this without some advice. Should we just replace the old certificate with a new one with longer validity or should there be some kind of automatic infrastructure to generate them as appropriate? Maybe one that can be downloaded? Another problem I found is that WebClient/SqueakSSL apparently *does not verify* server certificates on MacOS. I don't know if this is just in the tests or if it's for all TLS/SSL connection but it should be clarified and/or fixed. In addition to this, I found that some of the SqueakSSL tests ping Google, Facebook and Yahoo urls. Changing these would be nice. Finally, is SqueakSSL an appropriate name for a *TLS* library used on both Squeak and Cuis? ;) Thanks P.S. Ordinary Squeak client to remote https servers connections work fine on my linux machine. Wireshark shows TLS 1.3 connections. From tim at rowledge.org Tue Oct 27 19:09:23 2020 From: tim at rowledge.org (tim Rowledge) Date: Tue, 27 Oct 2020 12:09:23 -0700 Subject: [squeak-dev] SqueakSSL questions and problems In-Reply-To: <42662725-ba7a-9ff3-500b-15a07d4e868f@gmail.com> References: <42662725-ba7a-9ff3-500b-15a07d4e868f@gmail.com> Message-ID: <97C1DDA6-AF67-460A-8416-3B2DD0320C7F@rowledge.org> Yah, you're right about the certificate. I actually mentioned it back in early May (about 300 years ago, amiright?) and we promptly did nothing about it. > On 2020-10-27, at 11:31 AM, Douglas Brebner wrote: > > Hi, > > I've been playing around with SqueakSSL in Squeak and Cuis recently and found that most of the tests fail under Linux. It seems that the root of the problem is that the example test certificate in SqueakSSL>>#exampleCertFile is both expired (only valid from 2011->2012) and also using cyphers no longer supported in TLS 1.3. This breaks the tests using local connections. > > > I am nowhere even close to being a crypto expert so I'm asking how should this be handled? > > I believe that the certificate was supposed to be replaced every year (or longer with longer valid dates) but don't want to do this without some advice. > > Should we just replace the old certificate with a new one with longer validity or should there be some kind of automatic infrastructure to generate them as appropriate? Maybe one that can be downloaded? > > Another problem I found is that WebClient/SqueakSSL apparently *does not verify* server certificates on MacOS. I don't know if this is just in the tests or if it's for all TLS/SSL connection but it should be clarified and/or fixed. > > In addition to this, I found that some of the SqueakSSL tests ping Google, Facebook and Yahoo urls. Changing these would be nice. > > Finally, is SqueakSSL an appropriate name for a *TLS* library used on both Squeak and Cuis? ;) > > Thanks > > P.S. Ordinary Squeak client to remote https servers connections work fine on my linux machine. Wireshark shows TLS 1.3 connections. > > tim -- tim Rowledge; tim at rowledge.org; http://www.rowledge.org/tim Strange OpCodes: PBF: Pay Bus Fare From kirtai+st at gmail.com Tue Oct 27 19:27:44 2020 From: kirtai+st at gmail.com (Douglas Brebner) Date: Tue, 27 Oct 2020 19:27:44 +0000 Subject: [squeak-dev] SqueakSSL questions and problems In-Reply-To: <97C1DDA6-AF67-460A-8416-3B2DD0320C7F@rowledge.org> References: <42662725-ba7a-9ff3-500b-15a07d4e868f@gmail.com> <97C1DDA6-AF67-460A-8416-3B2DD0320C7F@rowledge.org> Message-ID: <212ffa06-0ce0-7016-32ce-a14ea734ae71@gmail.com> On 27/10/2020 19:09, tim Rowledge wrote: > Yah, you're right about the certificate. I actually mentioned it back in early May (about 300 years ago, amiright?) and we promptly did nothing about it. Ah. I've only come back to Squeak/Cuis a few months ago so must have missed that. I would have saved me some digging. Replacing the old certificate would be just a matter of putting the ascii format version in the right method. Maybe I'll have a stab at it if no one skilled with crypto stuff does it. From gettimothy at zoho.com Tue Oct 27 19:27:50 2020 From: gettimothy at zoho.com (gettimothy) Date: Tue, 27 Oct 2020 15:27:50 -0400 Subject: [squeak-dev] State of Roassal3 on Squeak Message-ID: <1756b87e8cc.e8f9766b60383.3747487553447883139@zoho.com> Hi Folks Quick status report as I see it. The majority of RSExamples work or "semi-work" Of those that do not work, the errors fall into about 3 or 4 types. 1. Icon lookups 2. What appears to be a Color lookup using the Hue-Intensity?-? instead of RGB values. 3. Pie charts most throw the same error, it is in the guts of the Balloon engine and will require some graphics chops to solve correctly. 4. Some interactions will throw a million or two debuggers. The Semi-work are mostly layout issues or the canvas is blank. All the RSExamples can be run from RSExampleDoits class side methods, where the doits for all examples are grouped by "working" , "semi-working" or "not working" This is a really cool package, I think most squeakers will really enjoy it going forward. Cordially, t -------------- next part -------------- An HTML attachment was scrubbed... URL: From Das.Linux at gmx.de Tue Oct 27 20:00:56 2020 From: Das.Linux at gmx.de (Tobias Pape) Date: Tue, 27 Oct 2020 21:00:56 +0100 Subject: [squeak-dev] SqueakSSL questions and problems In-Reply-To: <42662725-ba7a-9ff3-500b-15a07d4e868f@gmail.com> References: <42662725-ba7a-9ff3-500b-15a07d4e868f@gmail.com> Message-ID: > On 27.10.2020, at 19:31, Douglas Brebner wrote: > > Hi, > > I've been playing around with SqueakSSL in Squeak and Cuis recently and found that most of the tests fail under Linux. It seems that the root of the problem is that the example test certificate in SqueakSSL>>#exampleCertFile is both expired (only valid from 2011->2012) and also using cyphers no longer supported in TLS 1.3. This breaks the tests using local connections. > > > I am nowhere even close to being a crypto expert so I'm asking how should this be handled? > > I believe that the certificate was supposed to be replaced every year (or longer with longer valid dates) but don't want to do this without some advice + > Should we just replace the old certificate with a new one with longer validity or should there be some kind of automatic infrastructure to generate them as appropriate? Maybe one that can be downloaded? > + > Another problem I found is that WebClient/SqueakSSL apparently *does not verify* server certificates on MacOS. + > I don't know if this is just in the tests or if it's for all TLS/SSL connection but it should be clarified and/or fixed. > ++> All in all, SqueakSSL _used_to_ only verify on Windows, because it did not work anywhere else. For Unix/openssl, I implemented Cert checking in so far that the hostname is ok, (maybe more? i cant remember), for libressl/libtls, it should validate most things. For Mac, things were meeeh. I even debugged into CommonCrypto and such just to find that it goes "should I verify here?" which was deeeply frustrating. In theory, things should validate, in practice, not so much. > In addition to this, I found that some of the SqueakSSL tests ping Google, Facebook and Yahoo urls. Changing these would be nice. Hmm. These ones are useful and maaaybe are not down so often. Anything we control is bound to have more downtime ¯\_(ツ)_/¯ > > Finally, is SqueakSSL an appropriate name for a *TLS* library used on both Squeak and Cuis? ;) History… > > Thanks > > P.S. Ordinary Squeak client to remote https servers connections work fine on my linux machine. Wireshark shows TLS 1.3 connections. Depends on your OpenSSL library version :) Best regards -Tobias From kirtai+st at gmail.com Tue Oct 27 20:25:50 2020 From: kirtai+st at gmail.com (Douglas Brebner) Date: Tue, 27 Oct 2020 20:25:50 +0000 Subject: [squeak-dev] SqueakSSL questions and problems In-Reply-To: References: <42662725-ba7a-9ff3-500b-15a07d4e868f@gmail.com> Message-ID: On 27/10/2020 20:00, Tobias Pape wrote: > >> On 27.10.2020, at 19:31, Douglas Brebner wrote: ++> All in all, SqueakSSL _used_to_ only verify on Windows, because it did not work anywhere else. For Unix/openssl, I implemented Cert checking in so far that the hostname is ok, (maybe more? i cant remember), for libressl/libtls, it should validate most things. Ok, something to take a look at then. > For Mac, things were meeeh. I even debugged into CommonCrypto and such just to find that it goes "should I verify here?" which was deeeply frustrating. Ouch, so Mac users just have to keep a close eye on things then. > In theory, things should validate, in practice, not so much. Wonderful. Something else to investigate. >> In addition to this, I found that some of the SqueakSSL tests ping Google, Facebook and Yahoo urls. Changing these would be nice. > > Hmm. These ones are useful and maaaybe are not down so often. > Anything we control is bound to have more downtime ¯\_(ツ)_/¯ Alright. I just don't like pinging them. Especially since the tests need fixed *anyway* due to various errors they're hiding. (The TLS connection works but the http layer returns errors due to site changes). >> Finally, is SqueakSSL an appropriate name for a *TLS* library used on both Squeak and Cuis? ;) > > History… Yeah, I just wondered if there was any interest in changing the name or not. I'm fine with leaving it as is. >> P.S. Ordinary Squeak client to remote https servers connections work fine on my linux machine. Wireshark shows TLS 1.3 connections. > > Depends on your OpenSSL library version :) I realised that :) I just meant that it support the latest TLS 1.3 without needing any changes. I was concerned that SqueakSSL would need updated for that and that's *definitely* something I don't want to touch. Thanks From commits at source.squeak.org Tue Oct 27 23:13:53 2020 From: commits at source.squeak.org (commits at source.squeak.org) Date: Tue, 27 Oct 2020 23:13:53 0000 Subject: [squeak-dev] The Trunk: Tools-eem.1009.mcz Message-ID: Eliot Miranda uploaded a new version of Tools to project The Trunk: http://source.squeak.org/trunk/Tools-eem.1009.mcz ==================== Summary ==================== Name: Tools-eem.1009 Author: eem Time: 27 October 2020, 4:13:50.404335 pm UUID: 68ca4cb6-ce96-47f0-a039-d760321e60cb Ancestors: Tools-tpr.1008 The debugger *must not* retain persistent references to objects, thereby preventing garbage colleciton. This is just asking for Heisenbugs. =============== Diff against Tools-tpr.1008 =============== Item was changed: ----- Method: Debugger>>saveContextVariablesInspectorState (in category 'user interface') ----- saveContextVariablesInspectorState "For the user's convenience. Save field selection and user-typed content in the context-variables inspector. See #restoreContextVariablesInspectorState." | stateToSave keyForState | self flag: #duplication. (keyForState := self keyForContextVariablesInspectorState) ifNil: [^ self]. contextVariablesInspectorState + ifNil: [contextVariablesInspectorState := WeakIdentityKeyDictionary new]. - ifNil: [contextVariablesInspectorState := IdentityDictionary new]. stateToSave := { self contextVariablesInspector selectedFieldName. self contextVariablesInspector contentsTyped }. contextVariablesInspectorState at: keyForState put: stateToSave.! Item was changed: ----- Method: Debugger>>saveReceiverInspectorState (in category 'user interface') ----- saveReceiverInspectorState "For the user's convenience. Save field selection and user-typed content in the receiver inspector. See #restoreReceiverInspectorState." | stateToSave keyForState | self flag: #duplication. (keyForState := self keyForReceiverInspectorState) ifNil: [^ self]. receiverInspectorState + ifNil: [receiverInspectorState := WeakIdentityKeyDictionary new]. - ifNil: [receiverInspectorState := IdentityDictionary new]. stateToSave := { self receiverInspector selectedFieldName. self receiverInspector contentsTyped }. receiverInspectorState at: keyForState put: stateToSave.! From commits at source.squeak.org Wed Oct 28 02:12:45 2020 From: commits at source.squeak.org (commits at source.squeak.org) Date: Wed, 28 Oct 2020 02:12:45 0000 Subject: [squeak-dev] The Trunk: Kernel-eem.1354.mcz Message-ID: Eliot Miranda uploaded a new version of Kernel to project The Trunk: http://source.squeak.org/trunk/Kernel-eem.1354.mcz ==================== Summary ==================== Name: Kernel-eem.1354 Author: eem Time: 27 October 2020, 7:12:42.644138 pm UUID: 0e8cc5f2-05b0-483a-9d7a-b06d376c1d00 Ancestors: Kernel-mt.1353 Have Cotext>>swapReceiver: do what it says it will (c.f. swapSender:). Change the one sender not to reply on it; Context>>restartWithNewReceiver: can simply assign to receiver directly with the new Context design. =============== Diff against Kernel-mt.1353 =============== Item was changed: ----- Method: Context>>restartWithNewReceiver: (in category 'private-exceptions') ----- restartWithNewReceiver: obj + receiver := obj. + self restart! - - self - swapReceiver: obj; - restart! Item was changed: ----- Method: Context>>swapReceiver: (in category 'private-exceptions') ----- swapReceiver: r + | oldReceiver | + oldReceiver := receiver. + receiver := r. + ^oldReceiver! - - receiver := r! From eliot.miranda at gmail.com Wed Oct 28 05:58:41 2020 From: eliot.miranda at gmail.com (Eliot Miranda) Date: Tue, 27 Oct 2020 22:58:41 -0700 Subject: [squeak-dev] translated considered harmful (in its current implementation) Message-ID: Hi All, I have occasion to simulate the simulator (chancing down a context manipulation bug). In doing so I notice that there seems to be some awful ) N^2 behaviour in doing things as straight-forward as setting up the world menu. Here's a back trace from the simulator of a current trunk image: 16r3061C8 M Dictionary>associationsDo: 16r16BC028: a(n) Dictionary 16r306200 M Dictionary>keysDo: 16r16BC028: a(n) Dictionary 16r306238 M [] in Dictionary>keys 16r16BC028: a(n) Dictionary 16r306280 M Array class(SequenceableCollection class)>new:streamContents: 16r16FA068: a(n) Array class 16r3062C0 M Dictionary>keys 16r16BC028: a(n) Dictionary 16r3062F0 M PackageOrganizer>packageNames 16r1540BE8: a(n) PackageOrganizer 16r306320 M TextDomainManager class>allKnownDomains 16r188A848: a(n) TextDomainManager class 16r306358 M ByteString(String)>translatedInAllDomains 16r3479FF8: a(n) ByteString 16r306390 M ByteString(String)>translated 16r3479FF8: a(n) ByteString 16r3063D8 M [] in TheWorldMenu>fillIn:from: 16r3C93C0: a(n) TheWorldMenu 16r303F38 M Array(SequenceableCollection)>do: 16rB681C8: a(n) Array 16r303F70 M TheWorldMenu>fillIn:from: 16r3C93C0: a(n) TheWorldMenu 16r303FC0 I TheWorldMenu>addSaveAndQuit: 16r3C93C0: a(n) TheWorldMenu I.e. for every item in the world menu we are enumerating over all packages. Shurely shome mistake, hic!, ed. _,,,^..^,,,_ best, Eliot -------------- next part -------------- An HTML attachment was scrubbed... URL: From marcel.taeumel at hpi.de Wed Oct 28 08:53:25 2020 From: marcel.taeumel at hpi.de (Marcel Taeumel) Date: Wed, 28 Oct 2020 09:53:25 +0100 Subject: [squeak-dev] translated considered harmful (in its current implementation) In-Reply-To: References: Message-ID: Hi Eliot. Hmm... in 2010 there was a change in String >> #translated to also include some kind of domain knowledge based on "thisContext sender method". (I suppose it got merged with all Etoys changes in Squeak 5.1). ['world' translated] bench. ---NO DOMAIN LOOKUP --- '847,000 per second. 1.18 microseconds per run. 3.69926 % GC time.' ---DO DOMAIN LOOKUP  --- '9,190 per second. 109 microseconds per run. 3.57928 % GC time.' Given that there are 1558 senders in a Trunk image, this might be worth improving. :-) I propose to change #translatedInAllDomains, which is kind of a "detect" looking desperately for some translation that has not the given form.... enumerating all package names along the way to be used as domain names. Domain names are for GetText support. Each .mo file can represent a different domain. Such a modular separation helps external tools (and humans) to better browse and understand the kind of translation that is needed. It's rather common practice, I suppose. Maybe we should just support a wildcard '*' as valid domain name and then let the GetTextTranslator figure out how to enumerate all the accessible .mo files? String >> translatedInAllDomains ^self translatedTo: LocaleID current inDomain: '*' ['world' translated] bench. ---WILDCARD---  '408,000 per second. 2.45 microseconds per run. 1.55938 % GC time.' Now somebody has to change GetTextTranslator. I hope it does not break any generic GetText support to enumerate all .mo files in a locale directory. Best, Marcel Am 28.10.2020 06:59:07 schrieb Eliot Miranda : Hi All,     I have occasion to simulate the simulator (chancing down a context manipulation bug).  In doing so I notice that there seems to be some awful ) N^2 behaviour in doing things as straight-forward as setting up the world menu.  Here's a back trace from the simulator of a current trunk image:   16r3061C8 M Dictionary>associationsDo: 16r16BC028: a(n) Dictionary   16r306200 M Dictionary>keysDo: 16r16BC028: a(n) Dictionary   16r306238 M [] in Dictionary>keys 16r16BC028: a(n) Dictionary   16r306280 M Array class(SequenceableCollection class)>new:streamContents: 16r16FA068: a(n) Array class   16r3062C0 M Dictionary>keys 16r16BC028: a(n) Dictionary   16r3062F0 M PackageOrganizer>packageNames 16r1540BE8: a(n) PackageOrganizer   16r306320 M TextDomainManager class>allKnownDomains 16r188A848: a(n) TextDomainManager class   16r306358 M ByteString(String)>translatedInAllDomains 16r3479FF8: a(n) ByteString   16r306390 M ByteString(String)>translated 16r3479FF8: a(n) ByteString   16r3063D8 M [] in TheWorldMenu>fillIn:from: 16r3C93C0: a(n) TheWorldMenu   16r303F38 M Array(SequenceableCollection)>do: 16rB681C8: a(n) Array   16r303F70 M TheWorldMenu>fillIn:from: 16r3C93C0: a(n) TheWorldMenu   16r303FC0 I TheWorldMenu>addSaveAndQuit: 16r3C93C0: a(n) TheWorldMenu I.e. for every item in the world menu we are enumerating over all packages.  Shurely shome mistake, hic!, ed. _,,,^..^,,,_ best, Eliot -------------- next part -------------- An HTML attachment was scrubbed... URL: From marcel.taeumel at hpi.de Wed Oct 28 09:12:50 2020 From: marcel.taeumel at hpi.de (Marcel Taeumel) Date: Wed, 28 Oct 2020 10:12:50 +0100 Subject: [squeak-dev] The Trunk: Tools-eem.1009.mcz In-Reply-To: References: Message-ID: Hi Eliot! Nice catch! How is that preserving-inspector-state working out so far for you? You had the idea for that feature. :-) Best, Marcel Am 28.10.2020 00:14:02 schrieb commits at source.squeak.org : Eliot Miranda uploaded a new version of Tools to project The Trunk: http://source.squeak.org/trunk/Tools-eem.1009.mcz ==================== Summary ==================== Name: Tools-eem.1009 Author: eem Time: 27 October 2020, 4:13:50.404335 pm UUID: 68ca4cb6-ce96-47f0-a039-d760321e60cb Ancestors: Tools-tpr.1008 The debugger *must not* retain persistent references to objects, thereby preventing garbage colleciton. This is just asking for Heisenbugs. =============== Diff against Tools-tpr.1008 =============== Item was changed: ----- Method: Debugger>>saveContextVariablesInspectorState (in category 'user interface') ----- saveContextVariablesInspectorState "For the user's convenience. Save field selection and user-typed content in the context-variables inspector. See #restoreContextVariablesInspectorState." | stateToSave keyForState | self flag: #duplication. (keyForState := self keyForContextVariablesInspectorState) ifNil: [^ self]. contextVariablesInspectorState + ifNil: [contextVariablesInspectorState := WeakIdentityKeyDictionary new]. - ifNil: [contextVariablesInspectorState := IdentityDictionary new]. stateToSave := { self contextVariablesInspector selectedFieldName. self contextVariablesInspector contentsTyped }. contextVariablesInspectorState at: keyForState put: stateToSave.! Item was changed: ----- Method: Debugger>>saveReceiverInspectorState (in category 'user interface') ----- saveReceiverInspectorState "For the user's convenience. Save field selection and user-typed content in the receiver inspector. See #restoreReceiverInspectorState." | stateToSave keyForState | self flag: #duplication. (keyForState := self keyForReceiverInspectorState) ifNil: [^ self]. receiverInspectorState + ifNil: [receiverInspectorState := WeakIdentityKeyDictionary new]. - ifNil: [receiverInspectorState := IdentityDictionary new]. stateToSave := { self receiverInspector selectedFieldName. self receiverInspector contentsTyped }. receiverInspectorState at: keyForState put: stateToSave.! -------------- next part -------------- An HTML attachment was scrubbed... URL: From marcel.taeumel at hpi.de Wed Oct 28 09:19:48 2020 From: marcel.taeumel at hpi.de (Marcel Taeumel) Date: Wed, 28 Oct 2020 10:19:48 +0100 Subject: [squeak-dev] State of Roassal3 on Squeak In-Reply-To: <1756b87e8cc.e8f9766b60383.3747487553447883139@zoho.com> References: <1756b87e8cc.e8f9766b60383.3747487553447883139@zoho.com> Message-ID: Hi Timothy. How does one load Roassal3 after loading Announcements? On squeaksource.com, I see that you committed both "Roassal3" and "Roassal3-" packages. Trying to load/merge "Roassal3-tty.18" fails with: This package depends on the following classes:   GPoint   GPolygon   LinearGradientPaint   AthensAffineTransform   NSInterpolator   GradientPaint   GEllipse Best, Marcel Am 27.10.2020 20:39:49 schrieb gettimothy via Squeak-dev : Hi Folks Quick status report as I see it. The majority of RSExamples work or "semi-work" Of those that do not work, the errors fall into about 3 or 4 types. 1. Icon lookups 2. What appears to be a Color lookup using the Hue-Intensity?-? instead of RGB values. 3. Pie charts most throw the same error, it is in the guts of the Balloon engine and will require some graphics chops to solve correctly. 4. Some interactions will throw a million or two debuggers. The Semi-work are mostly layout issues or the canvas is blank. All the RSExamples can be run from RSExampleDoits class side methods, where the doits for all examples are grouped by "working" , "semi-working" or "not working" This is a really cool package, I think most squeakers will really enjoy it going forward. Cordially, t -------------- next part -------------- An HTML attachment was scrubbed... URL: From marcel.taeumel at hpi.de Wed Oct 28 09:24:16 2020 From: marcel.taeumel at hpi.de (Marcel Taeumel) Date: Wed, 28 Oct 2020 10:24:16 +0100 Subject: [squeak-dev] FIGURED IT OUT: was Re: Roassal3 question for the morphic pros to get majority of Roassal3 examples working properly. How to center a RSBalloonMorph in the world? In-Reply-To: <1756b31a947.ccbc5d1058557.3706850103364290194@zoho.com> References: <1756a00bf1f.afef4a7353058.3243849966528828637@zoho.com> <1756b31a947.ccbc5d1058557.3706850103364290194@zoho.com> Message-ID: Hi Timothy. > How do I get a RSBalloonMorph to open up inside the extents of The World? morph bounds: (morph bounds translatedToBeWithin: self currentWorld bounds). morph openInWorld. Best, Marcel Am 27.10.2020 19:20:40 schrieb gettimothy via Squeak-dev : Hi Folks, I found the Morph >> position: aPoint method and then I modified the RSCanvas >> open method to set position:10 at 10. I also to the liberty to make the size 1000 at 1000  . cheers, t ---- On Tue, 27 Oct 2020 08:20:35 -0400 gettimothy wrote ---- Hi Folks, TL;DR; How do I get a RSBalloonMorph to open up inside the extents of The World?  If we fix this, then the majority of Roassal3 examples are working examples. For Roassal3 MCHttpRepository location: 'http://www.squeaksource.com/Roassal3 [http://www.squeaksource.com/Roassal3]' user: '' password: ''  I have a class named RSExampleDoits  which has class side methods that allow easy access to the various examples a healthy majority of which are "semi-working". For example: rsBasicAnimationExamples "working" "semi working" "the viewport for these is off-World on open." RSBasicAnimationExamples new  example01Basic  open. RSBasicAnimationExamples new example02Sequential   open. RSBasicAnimationExamples new  example03Ramp  open. RSBasicAnimationExamples new  example05LoopEvent  open. RSBasicAnimationExamples new   example06Parallel open. "not working" RSBasicAnimationExamples new  example04DashAnimation  open. RSBasicAnimationExamples new example07CornerRadius   open. The basic problem is that the example shows up mostly off-screen in the World off to the right and must be pulled in by the mouse to see it. the 'open' and 'createMorph' send are to RSCanvas ProtoObject #()       Object #()             RSObject #()                   RSObjectWithProperty #('announcer' 'properties')                         RSCanvas #('shapes' 'fixedShapes' 'camera' 'animations' 'extent' 'color' 'morph' 'clearBackground' 'showRectangles' 'nodes' 'edges') open | window | self createMorph. window := morph openInWindow. window extent: 500 at 500. morph privateOwner: window. ^ window createMorph "Create a Morph that contains myself." Smalltalk at: #AthensCanvas ifPresent: [morph := RSAthensMorph new renderer: RSAthensRenderer new; yourself] ifAbsent: [morph := RSBalloonMorph new renderer: RSBalloonRenderer new; yourself].     <<---THIS IS CALLED. morph canvas: self. ^ morph your insights are much appreciated. -------------- next part -------------- An HTML attachment was scrubbed... URL: From marcel.taeumel at hpi.de Wed Oct 28 09:28:07 2020 From: marcel.taeumel at hpi.de (Marcel Taeumel) Date: Wed, 28 Oct 2020 10:28:07 +0100 Subject: [squeak-dev] Squeak equivalent of pharo construct icons := Smalltalk ui icons icons associations sorted: [:a :b | a key < b key]. In-Reply-To: <175652ddf49.10cf8b5c636044.6664637434422878391@zoho.com> References: <175652ddf49.10cf8b5c636044.6664637434422878391@zoho.com> Message-ID: Hi Timothy, here are some pointers: MenuIcons perform: (aSymbol, #Icon) asSymbol. ToolIcons iconNamed: aSymbol. And of course: Form >> #scaleIconToDisplay :-) Best, Marcel Am 26.10.2020 14:51:58 schrieb gettimothy via Squeak-dev : Hi folks In the Roassal3, I am working through the RSSVGAnimationExamples and several of them get bitmaps via something named Smalltalk ui.... icons := Smalltalk ui icons icons associations sorted: [:a :b | a key < b key]. Another example is in   RSSVGAnimatioinExamples new  example03Boat open. pharo := RSBitmap new form: (self iconNamed: #pharo);  <---HERE yourself. which is a method in Object that does this: Object>>iconNamed: aSymbol ^ Smalltalk ui icons iconNamed: aSymbol Workarounds and hacks greatly appreciated. thx -------------- next part -------------- An HTML attachment was scrubbed... URL: From rssnow1 at gmail.com Wed Oct 28 09:56:24 2020 From: rssnow1 at gmail.com (Richard Snow) Date: Wed, 28 Oct 2020 04:56:24 -0500 Subject: [squeak-dev] State of Roassal3 on Squeak In-Reply-To: References: <1756b87e8cc.e8f9766b60383.3747487553447883139@zoho.com> Message-ID: Hello I am Richard Snow back in the land of the I have finally gotten UNLIMITED MOBIILE broadband. From dear old att Yes The same old nation monolpoly. You know. The first national digital network Slow but absolutey error free. Emcoding mehod Morse !#!!! Very cool. It kept the trains from being on the same track but having. Opposite signs on there compass travel vector Which means that if you were the trains drivers and a collision is about to happen The dispatch Office made a very bad decision on one of the trains switch setting And or either trains were not actually of any means of using that network. Until one. The train stopped out of the train staction would have to McGyver skills to hack the network. So that long story is I got here with I working raspberry pi and one working cell phone. All that is to say I am installing a cloud backed up lamp server for my own blog about next year's. Global standard device Riscv 5 pc. And it will bring squeak along for free Completely recodad in proper Kotlim. Rss Is Ian plummets please call me My number lis 918. 207 8041 Catch up on my war story. Bye. playmates. 'Piumarta' On Wed., Oct. 28, 2020, 4:20 a.m. Marcel Taeumel, wrote: > Hi Timothy. > > How does one load Roassal3 after loading Announcements? On > squeaksource.com, I see that you committed both "Roassal3" and > "Roassal3-" packages. Trying to load/merge "Roassal3-tty.18" fails with: > > This package depends on the following classes: > GPoint > GPolygon > LinearGradientPaint > AthensAffineTransform > NSInterpolator > GradientPaint > GEllipse > > Best, > Marcel > > Am 27.10.2020 20:39:49 schrieb gettimothy via Squeak-dev < > squeak-dev at lists.squeakfoundation.org>: > Hi Folks > > Quick status report as I see it. > > > The majority of RSExamples work or "semi-work" > > Of those that do not work, the errors fall into about 3 or 4 types. > > 1. Icon lookups > 2. What appears to be a Color lookup using the Hue-Intensity?-? instead of > RGB values. > 3. Pie charts most throw the same error, it is in the guts of the Balloon > engine and will require some graphics chops to solve correctly. > 4. Some interactions will throw a million or two debuggers. > > The Semi-work are mostly layout issues or the canvas is blank. > > All the RSExamples can be run from RSExampleDoits class side methods, > where the doits for all examples are grouped by "working" , "semi-working" > or "not working" > > > This is a really cool package, I think most squeakers will really enjoy it > going forward. > > Cordially, > > t > > > -------------- next part -------------- An HTML attachment was scrubbed... URL: From marcel.taeumel at hpi.de Wed Oct 28 11:27:47 2020 From: marcel.taeumel at hpi.de (Marcel Taeumel) Date: Wed, 28 Oct 2020 12:27:47 +0100 Subject: [squeak-dev] [ANN] New update on my current work In-Reply-To: <175171342b4.b23a75da58092.7269660584235877469@zoho.com> References: <175171342b4.b23a75da58092.7269660584235877469@zoho.com> Message-ID: It's on https://squeak.org/projects/ [https://squeak.org/projects/] now. Thanks! Best, Marcel Am 11.10.2020 11:52:31 schrieb gettimothy via Squeak-dev : ---- On Sun, 11 Oct 2020 05:50:06 -0400 Edgar J. De Cleene wrote ---- Very thanks. Runs smoothly and give a lot of things to learn. This .image should be on Squeak.org page as example of what people can do with Squeak. And lots of talent :=) Edgar @morplenauta +1 -------------- next part -------------- An HTML attachment was scrubbed... URL: From gettimothy at zoho.com Wed Oct 28 11:28:04 2020 From: gettimothy at zoho.com (gettimothy) Date: Wed, 28 Oct 2020 07:28:04 -0400 Subject: [squeak-dev] State of Roassal3 on Squeak In-Reply-To: References: <1756b87e8cc.e8f9766b60383.3747487553447883139@zoho.com> Message-ID: <1756ef708f3.12bb65b1068916.1481134116343936531@zoho.com> Hi Marcel. I have added the steps I took on the Wiki page for the project. Here they are... Here are the installation steps I used to get things working before I uploaded to this repo using monticello. pristine image Preference Wizard last page install git, refactor etc. Installer ensureRecentMetacello Manually unload all three tonel packages using the Monticello Browser MonticelloTonel-Core MonticelloTonel-FileSystem MonticelloTonel-Tests and then running: Metacello new repository: 'github://squeak-smalltalk/squeak-tonel:squeak'; baseline: 'Tonel'; load. TonelFileSystemUtils initialize TonelFileUtils current (inspect should show TonelFileSystemUtils) ==install Roassal3=== Transcript clear. Metacello new repository: 'github://tom95/Roassal3'; baseline: 'Roassal3'; load. click through all the warnings. verify announcements loaded with Tom's changes. (yes) Then, load this monticello package. NOTE: I am not a monticello guru. I just saved every package named Roassal3-FOO to here. For some reason there is some duplication. hth, t ---- On Wed, 28 Oct 2020 05:19:48 -0400 Marcel Taeumel wrote ---- Hi Timothy. How does one load Roassal3 after loading Announcements? On squeaksource.com, I see that you committed both "Roassal3" and "Roassal3-" packages. Trying to load/merge "Roassal3-tty.18" fails with: This package depends on the following classes:   GPoint   GPolygon   LinearGradientPaint   AthensAffineTransform   NSInterpolator   GradientPaint   GEllipse Best, Marcel Am 27.10.2020 20:39:49 schrieb gettimothy via Squeak-dev : Hi Folks Quick status report as I see it. The majority of RSExamples work or "semi-work" Of those that do not work, the errors fall into about 3 or 4 types. 1. Icon lookups 2. What appears to be a Color lookup using the Hue-Intensity?-? instead of RGB values. 3. Pie charts most throw the same error, it is in the guts of the Balloon engine and will require some graphics chops to solve correctly. 4. Some interactions will throw a million or two debuggers. The Semi-work are mostly layout issues or the canvas is blank. All the RSExamples can be run from RSExampleDoits class side methods, where the doits for all examples are grouped by "working" , "semi-working" or "not working" This is a really cool package, I think most squeakers will really enjoy it going forward. Cordially, t -------------- next part -------------- An HTML attachment was scrubbed... URL: From marcel.taeumel at hpi.de Wed Oct 28 11:57:31 2020 From: marcel.taeumel at hpi.de (Marcel Taeumel) Date: Wed, 28 Oct 2020 12:57:31 +0100 Subject: [squeak-dev] State of Roassal3 on Squeak In-Reply-To: <1756ef708f3.12bb65b1068916.1481134116343936531@zoho.com> References: <1756b87e8cc.e8f9766b60383.3747487553447883139@zoho.com> <1756ef708f3.12bb65b1068916.1481134116343936531@zoho.com> Message-ID: Hi Timothy. Thanks! This worked in a fresh Trunk image: [[Metacello new repository: 'github://tom95/Roassal3'; baseline: 'Roassal3'; load] valueSupplyingAnswer: true. Installer ss project: 'AXAnnouncements'; install: 'Announcements'. Installer ss project: 'Roassal3'; install: 'Roassal3'] on: Warning do: [:ex | ex resume]. I tried some of the examples. Looks nice! Maybe I find some time to look at the not working ones. Best, Marcel Am 28.10.2020 12:28:14 schrieb gettimothy : Hi Marcel. I have added the steps I took on the Wiki page for the project. Here they are... Here are the installation steps I used to get things working before I uploaded to this repo using monticello. pristine image Preference Wizard last page install git, refactor etc. Installer ensureRecentMetacello Manually unload all three tonel packages using the Monticello Browser MonticelloTonel-Core MonticelloTonel-FileSystem MonticelloTonel-Tests and then running: Metacello new repository: 'github://squeak-smalltalk/squeak-tonel:squeak'; baseline: 'Tonel'; load. TonelFileSystemUtils initialize TonelFileUtils current (inspect should show TonelFileSystemUtils) ==install Roassal3=== Transcript clear. Metacello new repository: 'github://tom95/Roassal3'; baseline: 'Roassal3'; load. click through all the warnings. verify announcements loaded with Tom's changes. (yes) Then, load this monticello package. NOTE: I am not a monticello guru. I just saved every package named Roassal3-FOO to here. For some reason there is some duplication. hth, t ---- On Wed, 28 Oct 2020 05:19:48 -0400 Marcel Taeumel wrote ---- Hi Timothy. How does one load Roassal3 after loading Announcements? On squeaksource.com, I see that you committed both "Roassal3" and "Roassal3-" packages. Trying to load/merge "Roassal3-tty.18" fails with: This package depends on the following classes:   GPoint   GPolygon   LinearGradientPaint   AthensAffineTransform   NSInterpolator   GradientPaint   GEllipse Best, Marcel Am 27.10.2020 20:39:49 schrieb gettimothy via Squeak-dev : Hi Folks Quick status report as I see it. The majority of RSExamples work or "semi-work" Of those that do not work, the errors fall into about 3 or 4 types. 1. Icon lookups 2. What appears to be a Color lookup using the Hue-Intensity?-? instead of RGB values. 3. Pie charts most throw the same error, it is in the guts of the Balloon engine and will require some graphics chops to solve correctly. 4. Some interactions will throw a million or two debuggers. The Semi-work are mostly layout issues or the canvas is blank. All the RSExamples can be run from RSExampleDoits class side methods, where the doits for all examples are grouped by "working" , "semi-working" or "not working" This is a really cool package, I think most squeakers will really enjoy it going forward. Cordially, t -------------- next part -------------- An HTML attachment was scrubbed... URL: From gettimothy at zoho.com Wed Oct 28 12:13:26 2020 From: gettimothy at zoho.com (gettimothy) Date: Wed, 28 Oct 2020 08:13:26 -0400 Subject: [squeak-dev] State of Roassal3 on Squeak In-Reply-To: References: <1756b87e8cc.e8f9766b60383.3747487553447883139@zoho.com> <1756ef708f3.12bb65b1068916.1481134116343936531@zoho.com> Message-ID: <1756f2090ac.ac15588069520.7097000527745201334@zoho.com> Marcel, Thank you. I have added you as a developer to the projectr. Your install script is at the top of the project (formatting bad, don't know how to fix it) and on the Wiki. cordially, t ---- On Wed, 28 Oct 2020 07:57:31 -0400 Marcel Taeumel wrote ---- Hi Timothy. Thanks! This worked in a fresh Trunk image: [[Metacello new repository: 'github://tom95/Roassal3'; baseline: 'Roassal3'; load] valueSupplyingAnswer: true. Installer ss project: 'AXAnnouncements'; install: 'Announcements'. Installer ss project: 'Roassal3'; install: 'Roassal3'] on: Warning do: [:ex | ex resume]. I tried some of the examples. Looks nice! Maybe I find some time to look at the not working ones. Best, Marcel Am 28.10.2020 12:28:14 schrieb gettimothy : Hi Marcel. I have added the steps I took on the Wiki page for the project. Here they are... Here are the installation steps I used to get things working before I uploaded to this repo using monticello. pristine image Preference Wizard last page install git, refactor etc. Installer ensureRecentMetacello Manually unload all three tonel packages using the Monticello Browser MonticelloTonel-Core MonticelloTonel-FileSystem MonticelloTonel-Tests and then running: Metacello new repository: 'github://squeak-smalltalk/squeak-tonel:squeak'; baseline: 'Tonel'; load. TonelFileSystemUtils initialize TonelFileUtils current (inspect should show TonelFileSystemUtils) ==install Roassal3=== Transcript clear. Metacello new repository: 'github://tom95/Roassal3'; baseline: 'Roassal3'; load. click through all the warnings. verify announcements loaded with Tom's changes. (yes) Then, load this monticello package. NOTE: I am not a monticello guru. I just saved every package named Roassal3-FOO to here. For some reason there is some duplication. hth, t ---- On Wed, 28 Oct 2020 05:19:48 -0400 Marcel Taeumel wrote ---- Hi Timothy. How does one load Roassal3 after loading Announcements? On squeaksource.com, I see that you committed both "Roassal3" and "Roassal3-" packages. Trying to load/merge "Roassal3-tty.18" fails with: This package depends on the following classes:   GPoint   GPolygon   LinearGradientPaint   AthensAffineTransform   NSInterpolator   GradientPaint   GEllipse Best, Marcel Am 27.10.2020 20:39:49 schrieb gettimothy via Squeak-dev : Hi Folks Quick status report as I see it. The majority of RSExamples work or "semi-work" Of those that do not work, the errors fall into about 3 or 4 types. 1. Icon lookups 2. What appears to be a Color lookup using the Hue-Intensity?-? instead of RGB values. 3. Pie charts most throw the same error, it is in the guts of the Balloon engine and will require some graphics chops to solve correctly. 4. Some interactions will throw a million or two debuggers. The Semi-work are mostly layout issues or the canvas is blank. All the RSExamples can be run from RSExampleDoits class side methods, where the doits for all examples are grouped by "working" , "semi-working" or "not working" This is a really cool package, I think most squeakers will really enjoy it going forward. Cordially, t -------------- next part -------------- An HTML attachment was scrubbed... URL: From eliot.miranda at gmail.com Wed Oct 28 12:16:21 2020 From: eliot.miranda at gmail.com (Eliot Miranda) Date: Wed, 28 Oct 2020 05:16:21 -0700 Subject: [squeak-dev] The Trunk: Tools-eem.1009.mcz In-Reply-To: References: Message-ID: <670C6CBB-19B4-4231-86E6-44893214B343@gmail.com> Hi Marcel, > On Oct 28, 2020, at 2:13 AM, Marcel Taeumel wrote: > >  > Hi Eliot! > > Nice catch! How is that preserving-inspector-state working out so far for you? You had the idea for that feature. :-) I like the functionality, but the slow down to stepping in the debugger is painful. Yesterday I was stepping in code in the Cogit (which has about 100 inst vars) and stepping slowed to about two sends per second. So it is painfully slow, and on balance I want to get rid of it. The performance issue is very very important. > > Best, > Marcel >> Am 28.10.2020 00:14:02 schrieb commits at source.squeak.org : >> >> Eliot Miranda uploaded a new version of Tools to project The Trunk: >> http://source.squeak.org/trunk/Tools-eem.1009.mcz >> >> ==================== Summary ==================== >> >> Name: Tools-eem.1009 >> Author: eem >> Time: 27 October 2020, 4:13:50.404335 pm >> UUID: 68ca4cb6-ce96-47f0-a039-d760321e60cb >> Ancestors: Tools-tpr.1008 >> >> The debugger *must not* retain persistent references to objects, thereby preventing garbage colleciton. This is just asking for Heisenbugs. >> >> =============== Diff against Tools-tpr.1008 =============== >> >> Item was changed: >> ----- Method: Debugger>>saveContextVariablesInspectorState (in category 'user interface') ----- >> saveContextVariablesInspectorState >> "For the user's convenience. Save field selection and user-typed content in the context-variables inspector. See #restoreContextVariablesInspectorState." >> >> | stateToSave keyForState | >> self flag: #duplication. >> (keyForState := self keyForContextVariablesInspectorState) >> ifNil: [^ self]. >> contextVariablesInspectorState >> + ifNil: [contextVariablesInspectorState := WeakIdentityKeyDictionary new]. >> - ifNil: [contextVariablesInspectorState := IdentityDictionary new]. >> stateToSave := { >> self contextVariablesInspector selectedFieldName. >> self contextVariablesInspector contentsTyped }. >> contextVariablesInspectorState >> at: keyForState >> put: stateToSave.! >> >> Item was changed: >> ----- Method: Debugger>>saveReceiverInspectorState (in category 'user interface') ----- >> saveReceiverInspectorState >> "For the user's convenience. Save field selection and user-typed content in the receiver inspector. See #restoreReceiverInspectorState." >> >> | stateToSave keyForState | >> self flag: #duplication. >> (keyForState := self keyForReceiverInspectorState) >> ifNil: [^ self]. >> receiverInspectorState >> + ifNil: [receiverInspectorState := WeakIdentityKeyDictionary new]. >> - ifNil: [receiverInspectorState := IdentityDictionary new]. >> stateToSave := { >> self receiverInspector selectedFieldName. >> self receiverInspector contentsTyped }. >> receiverInspectorState >> at: keyForState >> put: stateToSave.! >> >> > -------------- next part -------------- An HTML attachment was scrubbed... URL: From christoph.thiede at student.hpi.uni-potsdam.de Wed Oct 28 12:50:44 2020 From: christoph.thiede at student.hpi.uni-potsdam.de (Christoph Thiede) Date: Wed, 28 Oct 2020 07:50:44 -0500 (CDT) Subject: [squeak-dev] Fixing the infinite debugger chains? (was: Code simulation error (was Re: I broke the debugger?)) In-Reply-To: <44c04727494e43a6bb4d547499f908cf@student.hpi.uni-potsdam.de> References: <41241C67-67E8-4239-9748-856A7639851E@rowledge.org> <6e7277c4443740038f0a5b3667c5f25f@student.hpi.uni-potsdam.de> <7f6c15ae3dfe453993e550bfdda4338c@student.hpi.uni-potsdam.de> <393ca31eb79f431dbc7633e3f94ab747@student.hpi.uni-potsdam.de> <1582497902561-0.post@n4.nabble.com> <44c04727494e43a6bb4d547499f908cf@student.hpi.uni-potsdam.de> Message-ID: <1603889444900-0.post@n4.nabble.com> Hi all! :-) After a lot of time, I would like to give this issue another push. These bugs are really serious and we should finally fix them. Short summary for everyone who would not like to re-read the whole thread: / Over the last months, several issues have been reported about infinite chains of debuggers popping up in your image and, most of the time, eventually making it unusable. Some months ago, I traced these issues down to several simulation errors that occurred while pressing the Over button in the debugger. The simulation errors can be fixed separately, but the debugger chains are caused by a second phenomenon which I could break down in the following snippet: Processor activeProcess evaluate: [self error: #first. self inform: #second] onBehalfOf: [] newProcess You would expect to see first a debugger window for the #error, and second, after you resume this error, a dialog window for the #inform:. However, surprisingly, both windows appear at the same time. The opening debugger does not suspend the process correctly. / I also had a talk about it with Marcel and Patrick and we ended up with the finding that the semantics of Process >> #evaluate:onBehalfOf: are not 100% clear at the moment. Its method comment states: "Evaluate aBlock setting effectiveProcess to aProcess, and all other variables other than the scheduling ones to those of aProcess." However, the situation is unclear when an exception is raised from aBlock. Should it be handled still on behalf of the behalfOf process or rather on the original receiver process instead? At the moment, the former is the case, and this leads to the problem that the behalfOf process is debugged (i.e. interrupted) when an error is raised from aBlock while the - technically actually causing - receiver process keeps running, eventually ignoring the just-raised exception. See StandardToolSet class >> #handleError: for the place where "Processor activeProcess" is determined for debugging, which is redirected to the onBehalf process during the execution of aBlock. At this place, we actually would like to see something like this: thisContext process debug: anError signalerContext title: anError description Which, however, is not possible because a stack frame cannot know its containing process. So in my first changeset (fix-infinite-debuggers.2.cs below), I had proposed to rewrite that method like this: Processor basicActiveProcess debug: anError signalerContext title: anError description where basicActiveProcess would return the "true" active process neglecting the onBehalfOf redirection. However, *could there be any situation where you would like to respect the process redirection indeed in #handleError:?* (highlighting this as the open key question of this thread) We did not find a plausible example, the only case I could imagine is the following situation (which, admittedly, is not an every-day use case): Debug the expression "self halt", step down until in StandardToolSet class>>handleError:, step into #activeProcess and then step over repeatedly until #debug:title: is sent. In Trunk, this opens a second debugger on the same process. When using #basicActiveProcess, however, the first debugger stops working (dead process). So, your comments and thoughts are important: How would you think about the proposed #basicActiveProcess solution? Do you see any scenario where the onBehalfOf redirection needs to be perpetuated in ToolSet >> #handleError:? Or would you prefer another approach to fix the problem? Looking forward to an interesting discussion! :-) Best, Christoph -- Sent from: http://forum.world.st/Squeak-Dev-f45488.html From gettimothy at zoho.com Wed Oct 28 13:15:42 2020 From: gettimothy at zoho.com (gettimothy) Date: Wed, 28 Oct 2020 09:15:42 -0400 Subject: [squeak-dev] State of Roassal3 on Squeak In-Reply-To: References: <1756b87e8cc.e8f9766b60383.3747487553447883139@zoho.com> <1756ef708f3.12bb65b1068916.1481134116343936531@zoho.com> Message-ID: <1756f5990c7.c39f330d70425.7952277439085390978@zoho.com> Hi Marcel, You will probably find it useful to clone the pharo source with the Git stuff. https://github.com/pharo-project/pharo Using the Git Browser on the pharo-9 branch, I imported RadialGradientPaint class into the Roassal3 project as a subclass of GradientPaint (from Tom's work) To my eye, it looks like the errors in Pie Charts are because of methods that are in the Athens-Core-Foo classes, so importing from there to Squeak may prove useful. hth. ---- On Wed, 28 Oct 2020 07:57:31 -0400 Marcel Taeumel wrote ---- Hi Timothy. Thanks! This worked in a fresh Trunk image: [[Metacello new repository: 'github://tom95/Roassal3'; baseline: 'Roassal3'; load] valueSupplyingAnswer: true. Installer ss project: 'AXAnnouncements'; install: 'Announcements'. Installer ss project: 'Roassal3'; install: 'Roassal3'] on: Warning do: [:ex | ex resume]. I tried some of the examples. Looks nice! Maybe I find some time to look at the not working ones. Best, Marcel Am 28.10.2020 12:28:14 schrieb gettimothy : Hi Marcel. I have added the steps I took on the Wiki page for the project. Here they are... Here are the installation steps I used to get things working before I uploaded to this repo using monticello. pristine image Preference Wizard last page install git, refactor etc. Installer ensureRecentMetacello Manually unload all three tonel packages using the Monticello Browser MonticelloTonel-Core MonticelloTonel-FileSystem MonticelloTonel-Tests and then running: Metacello new repository: 'github://squeak-smalltalk/squeak-tonel:squeak'; baseline: 'Tonel'; load. TonelFileSystemUtils initialize TonelFileUtils current (inspect should show TonelFileSystemUtils) ==install Roassal3=== Transcript clear. Metacello new repository: 'github://tom95/Roassal3'; baseline: 'Roassal3'; load. click through all the warnings. verify announcements loaded with Tom's changes. (yes) Then, load this monticello package. NOTE: I am not a monticello guru. I just saved every package named Roassal3-FOO to here. For some reason there is some duplication. hth, t ---- On Wed, 28 Oct 2020 05:19:48 -0400 Marcel Taeumel wrote ---- Hi Timothy. How does one load Roassal3 after loading Announcements? On squeaksource.com, I see that you committed both "Roassal3" and "Roassal3-" packages. Trying to load/merge "Roassal3-tty.18" fails with: This package depends on the following classes:   GPoint   GPolygon   LinearGradientPaint   AthensAffineTransform   NSInterpolator   GradientPaint   GEllipse Best, Marcel Am 27.10.2020 20:39:49 schrieb gettimothy via Squeak-dev : Hi Folks Quick status report as I see it. The majority of RSExamples work or "semi-work" Of those that do not work, the errors fall into about 3 or 4 types. 1. Icon lookups 2. What appears to be a Color lookup using the Hue-Intensity?-? instead of RGB values. 3. Pie charts most throw the same error, it is in the guts of the Balloon engine and will require some graphics chops to solve correctly. 4. Some interactions will throw a million or two debuggers. The Semi-work are mostly layout issues or the canvas is blank. All the RSExamples can be run from RSExampleDoits class side methods, where the doits for all examples are grouped by "working" , "semi-working" or "not working" This is a really cool package, I think most squeakers will really enjoy it going forward. Cordially, t -------------- next part -------------- An HTML attachment was scrubbed... URL: From eliot.miranda at gmail.com Wed Oct 28 13:43:51 2020 From: eliot.miranda at gmail.com (Eliot Miranda) Date: Wed, 28 Oct 2020 06:43:51 -0700 Subject: [squeak-dev] Fixing the infinite debugger chains? (was: Code simulation error (was Re: I broke the debugger?)) In-Reply-To: <1603889444900-0.post@n4.nabble.com> References: <1603889444900-0.post@n4.nabble.com> Message-ID: <2CF36042-BD9A-426E-B12C-3C30D6AEF439@gmail.com> Hi all, > On Oct 28, 2020, at 5:50 AM, Christoph Thiede wrote: > > Hi all! :-) > > After a lot of time, I would like to give this issue another push. These > bugs are really serious and we should finally fix them. > > Short summary for everyone who would not like to re-read the whole thread: > / > Over the last months, several issues have been reported about infinite > chains of debuggers popping up in your image and, most of the time, > eventually making it unusable. Some months ago, I traced these issues down > to several simulation errors that occurred while pressing the Over button in > the debugger. The simulation errors can be fixed separately, but the > debugger chains are caused by a second phenomenon which I could break down > in the following snippet: > > Processor activeProcess > evaluate: [self error: #first. self inform: #second] > onBehalfOf: [] newProcess > > You would expect to see first a debugger window for the #error, and > second, after you resume this error, a dialog window for the #inform:. > However, surprisingly, both windows appear at the same time. The opening > debugger does not suspend the process correctly. > / > > > I also had a talk about it with Marcel and Patrick and we ended up with the > finding that the semantics of Process >> #evaluate:onBehalfOf: are not 100% > clear at the moment. Its method comment states: > > "Evaluate aBlock setting effectiveProcess to aProcess, and all other > variables other than the scheduling ones to those of aProcess." > > However, the situation is unclear when an exception is raised from aBlock. > Should it be handled still on behalf of the behalfOf process or rather on > the original receiver process instead? Conceptually Process >> #evaluate:onBehalfOf: is a private method if the debugger, which exists only to ensure that while simulating code on behalf of done process being debugged, the right process is found by the simulated code even though another process is actually executing the code. Therefore the block being evaluated within Process >> #evaluate:onBehalfOf: is always evaluating some simulation on behalf of the debugger. Therefore, *any* error which occurs during the block is not an error in the process being debugged (that error delivery should be simulated, and delivered within the process being debugged), but an error in the simulation, and should stop the simulation. Therefore, an error within the evaluate block of Process >> #evaluate:onBehalfOf: could be caught within Process >> #evaluate:onBehalfOf: but delivered outside. One could experiment with adding an exception handler around the evaluation block that would copy the stack of the exception, terminate the block, and then open a debugger on the copy of the stack once the effectiveProcess has been restored. [P.S. I think the right way to implement this is to use Context>>cut: to snip the section of the stack containing the simulation error and stitch this back in after the evaluate block, but I *think* I am seeing bugs in the context-to-stack mapping machinery in the VM which is causing the stitching back of the stack to fail, which is why I’m trying (successfully does far) to simulate the simulator. So hopefully in a few days the stitching approach will be viable, but did the moment the stack copying approach will work, even though it introduces unnecessary overhead.] I hope this helps, and I hope I’m understanding the issue correctly. If I’m not I thank you for your patience :-). > At the moment, the former is the case, and this leads to the problem that > the behalfOf process is debugged (i.e. interrupted) when an error is raised > from aBlock while the - technically actually causing - receiver process > keeps running, eventually ignoring the just-raised exception. See > StandardToolSet class >> #handleError: for the place where "Processor > activeProcess" is determined for debugging, which is redirected to the > onBehalf process during the execution of aBlock. > At this place, we actually would like to see something like this: > > thisContext process > debug: anError signalerContext > title: anError description > > Which, however, is not possible because a stack frame cannot know its > containing process. > So in my first changeset (fix-infinite-debuggers.2.cs below), I had proposed > to rewrite that method like this: > > Processor basicActiveProcess > debug: anError signalerContext > title: anError description > > where basicActiveProcess would return the "true" active process neglecting > the onBehalfOf redirection. > However, *could there be any situation where you would like to respect the > process redirection indeed in #handleError:?* (highlighting this as the open > key question of this thread) > We did not find a plausible example, the only case I could imagine is the > following situation (which, admittedly, is not an every-day use case): > > Debug the expression "self halt", step down until in StandardToolSet > class>>handleError:, step into #activeProcess and then step over repeatedly > until #debug:title: is sent. > In Trunk, this opens a second debugger on the same process. When using > #basicActiveProcess, however, the first debugger stops working (dead > process). > > > So, your comments and thoughts are important: How would you think about the > proposed #basicActiveProcess solution? Do you see any scenario where the > onBehalfOf redirection needs to be perpetuated in ToolSet >> #handleError:? > Or would you prefer another approach to fix the problem? > Looking forward to an interesting discussion! :-) > > Best, > Christoph Eliot _,,,^..^,,,_ (phone) From gettimothy at zoho.com Wed Oct 28 14:50:42 2020 From: gettimothy at zoho.com (gettimothy) Date: Wed, 28 Oct 2020 10:50:42 -0400 Subject: [squeak-dev] Another package in the Roassal3 that I missed earlier Message-ID: <1756fb08b48.fd01d34871887.5091136225791897649@zoho.com> Hi Marcel, http://www.squeaksource.com/Roassal3/Squeak-Roassal3-Base-tty.2.mcz   is part of Roassal3. I missed uploading it on the initial upload because I was just uploading everything that started with "Roassl3-". It contains pharo classes imported from git, maybe some other stuff. Sorry I am not fluent in monticello packages, its been years since I studied it. cheers, t -------------- next part -------------- An HTML attachment was scrubbed... URL: From commits at source.squeak.org Wed Oct 28 15:10:07 2020 From: commits at source.squeak.org (commits at source.squeak.org) Date: Wed, 28 Oct 2020 15:10:07 0000 Subject: [squeak-dev] The Trunk: Morphic-mt.1708.mcz Message-ID: Marcel Taeumel uploaded a new version of Morphic to project The Trunk: http://source.squeak.org/trunk/Morphic-mt.1708.mcz ==================== Summary ==================== Name: Morphic-mt.1708 Author: mt Time: 28 October 2020, 4:10:01.434689 pm UUID: 8ee48d82-9815-c34e-ac47-02b09c6cae25 Ancestors: Morphic-pre.1707 Fix typo. =============== Diff against Morphic-pre.1707 =============== Item was changed: ----- Method: ScrollPane>>mouseWheel: (in category 'event handling') ----- mouseWheel: evt evt isWheelUp ifTrue: [scrollBar scrollUp: (evt verticalScrollDelta: self class verticalScrollDeltaPerMouseWheelNotch)]. evt isWheelDown ifTrue: [scrollBar scrollDown: (evt verticalScrollDelta: self class verticalScrollDeltaPerMouseWheelNotch)]. + evt isWheelLeft ifTrue: [hScrollBar scrollUp: (evt horizontalScrollDelta: self class horizontalScrollDeltaPerMouseWheelNotch)]. + evt isWheelRight ifTrue: [hScrollBar scrollDown: (evt horizontalScrollDelta: self class horizontalScrollDeltaPerMouseWheelNotch)].! - evt isWheelLeft ifTrue: [hScrollBar scrollUp: (evt horizontalScrollDelta: self class verticalScrollDeltaPerMouseWheelNotch)]. - evt isWheelRight ifTrue: [hScrollBar scrollDown: (evt horizontalScrollDelta: self class verticalScrollDeltaPerMouseWheelNotch)].! From Christoph.Thiede at student.hpi.uni-potsdam.de Wed Oct 28 15:40:53 2020 From: Christoph.Thiede at student.hpi.uni-potsdam.de (Thiede, Christoph) Date: Wed, 28 Oct 2020 15:40:53 +0000 Subject: [squeak-dev] Fixing the infinite debugger chains? (was: Code simulation error (was Re: I broke the debugger?)) In-Reply-To: <2CF36042-BD9A-426E-B12C-3C30D6AEF439@gmail.com> References: <1603889444900-0.post@n4.nabble.com>, <2CF36042-BD9A-426E-B12C-3C30D6AEF439@gmail.com> Message-ID: <9ebe051dcbc64341a99ca4d5f4a79deb@student.hpi.uni-potsdam.de> Hi Eliot, thanks for your reply! > Therefore, an error within the evaluate block of Process >> #evaluate:onBehalfOf: could be caught within Process >> #evaluate:onBehalfOf: but delivered outside. One could experiment with adding an exception handler around the evaluation block that would copy the stack of the exception, terminate the block, and then open a debugger on the copy of the stack once the effectiveProcess has been restored. This sounds pretty much like what I proposed here: http://forum.world.st/I-broke-the-debugger-tp5110752p5111016.html This solution would also have the advantage of a lower footprint than any #basicActiveProcess solution. How would you think about it? :-) Best, Christoph ________________________________ Von: Squeak-dev im Auftrag von Eliot Miranda Gesendet: Mittwoch, 28. Oktober 2020 14:43:51 An: The general-purpose Squeak developers list Betreff: Re: [squeak-dev] Fixing the infinite debugger chains? (was: Code simulation error (was Re: I broke the debugger?)) Hi all, > On Oct 28, 2020, at 5:50 AM, Christoph Thiede wrote: > > Hi all! :-) > > After a lot of time, I would like to give this issue another push. These > bugs are really serious and we should finally fix them. > > Short summary for everyone who would not like to re-read the whole thread: > / > Over the last months, several issues have been reported about infinite > chains of debuggers popping up in your image and, most of the time, > eventually making it unusable. Some months ago, I traced these issues down > to several simulation errors that occurred while pressing the Over button in > the debugger. The simulation errors can be fixed separately, but the > debugger chains are caused by a second phenomenon which I could break down > in the following snippet: > > Processor activeProcess > evaluate: [self error: #first. self inform: #second] > onBehalfOf: [] newProcess > > You would expect to see first a debugger window for the #error, and > second, after you resume this error, a dialog window for the #inform:. > However, surprisingly, both windows appear at the same time. The opening > debugger does not suspend the process correctly. > / > > > I also had a talk about it with Marcel and Patrick and we ended up with the > finding that the semantics of Process >> #evaluate:onBehalfOf: are not 100% > clear at the moment. Its method comment states: > > "Evaluate aBlock setting effectiveProcess to aProcess, and all other > variables other than the scheduling ones to those of aProcess." > > However, the situation is unclear when an exception is raised from aBlock. > Should it be handled still on behalf of the behalfOf process or rather on > the original receiver process instead? Conceptually Process >> #evaluate:onBehalfOf: is a private method if the debugger, which exists only to ensure that while simulating code on behalf of done process being debugged, the right process is found by the simulated code even though another process is actually executing the code. Therefore the block being evaluated within Process >> #evaluate:onBehalfOf: is always evaluating some simulation on behalf of the debugger. Therefore, *any* error which occurs during the block is not an error in the process being debugged (that error delivery should be simulated, and delivered within the process being debugged), but an error in the simulation, and should stop the simulation. Therefore, an error within the evaluate block of Process >> #evaluate:onBehalfOf: could be caught within Process >> #evaluate:onBehalfOf: but delivered outside. One could experiment with adding an exception handler around the evaluation block that would copy the stack of the exception, terminate the block, and then open a debugger on the copy of the stack once the effectiveProcess has been restored. [P.S. I think the right way to implement this is to use Context>>cut: to snip the section of the stack containing the simulation error and stitch this back in after the evaluate block, but I *think* I am seeing bugs in the context-to-stack mapping machinery in the VM which is causing the stitching back of the stack to fail, which is why I’m trying (successfully does far) to simulate the simulator. So hopefully in a few days the stitching approach will be viable, but did the moment the stack copying approach will work, even though it introduces unnecessary overhead.] I hope this helps, and I hope I’m understanding the issue correctly. If I’m not I thank you for your patience :-). > At the moment, the former is the case, and this leads to the problem that > the behalfOf process is debugged (i.e. interrupted) when an error is raised > from aBlock while the - technically actually causing - receiver process > keeps running, eventually ignoring the just-raised exception. See > StandardToolSet class >> #handleError: for the place where "Processor > activeProcess" is determined for debugging, which is redirected to the > onBehalf process during the execution of aBlock. > At this place, we actually would like to see something like this: > > thisContext process > debug: anError signalerContext > title: anError description > > Which, however, is not possible because a stack frame cannot know its > containing process. > So in my first changeset (fix-infinite-debuggers.2.cs below), I had proposed > to rewrite that method like this: > > Processor basicActiveProcess > debug: anError signalerContext > title: anError description > > where basicActiveProcess would return the "true" active process neglecting > the onBehalfOf redirection. > However, *could there be any situation where you would like to respect the > process redirection indeed in #handleError:?* (highlighting this as the open > key question of this thread) > We did not find a plausible example, the only case I could imagine is the > following situation (which, admittedly, is not an every-day use case): > > Debug the expression "self halt", step down until in StandardToolSet > class>>handleError:, step into #activeProcess and then step over repeatedly > until #debug:title: is sent. > In Trunk, this opens a second debugger on the same process. When using > #basicActiveProcess, however, the first debugger stops working (dead > process). > > > So, your comments and thoughts are important: How would you think about the > proposed #basicActiveProcess solution? Do you see any scenario where the > onBehalfOf redirection needs to be perpetuated in ToolSet >> #handleError:? > Or would you prefer another approach to fix the problem? > Looking forward to an interesting discussion! :-) > > Best, > Christoph Eliot _,,,^..^,,,_ (phone) -------------- next part -------------- An HTML attachment was scrubbed... URL: From Christoph.Thiede at student.hpi.uni-potsdam.de Wed Oct 28 15:45:41 2020 From: Christoph.Thiede at student.hpi.uni-potsdam.de (Thiede, Christoph) Date: Wed, 28 Oct 2020 15:45:41 +0000 Subject: [squeak-dev] Horizontal MouseWheels are not delivered to the image on Windows Message-ID: <1948c0472a1c4f36b1448f99b5c19151@student.hpi.uni-potsdam.de> Hi all, short notice only. When I turn on #showEvents on HandMorph in Squeak under Windows, I can see MouseWheelEvents are delivered by the VM for vertical gestures, but not for horizontal gestures. Instead of horizontal wheel events, the gestures are mapped to arrow keyboard events. Maybe someone is familiar with this implementation and knows a simple way to fix it. :-) Best, Christoph -------------- next part -------------- An HTML attachment was scrubbed... URL: From hannes.hirzel at gmail.com Wed Oct 28 16:09:09 2020 From: hannes.hirzel at gmail.com (H. Hirzel) Date: Wed, 28 Oct 2020 16:09:09 +0000 Subject: [squeak-dev] Overriding #= in Graphics and Sounds In-Reply-To: <138288e315e742bc8e25e9e0578aeda5@student.hpi.uni-potsdam.de> References: <1112186c150f40a0acae92e746abb6fa@student.hpi.uni-potsdam.de> <138288e315e742bc8e25e9e0578aeda5@student.hpi.uni-potsdam.de> Message-ID: Hello Christoph I think implementing a method such as Form>>sameAs: you mentioned in the mail starting the thread to be a good solution. And the implementation is not complex http://wiki.squeak.org/squeak/2852 Regards Hannes On 10/1/20, Thiede, Christoph wrote: > Hi Marcel, > > > I am sending pictures and sounds to a server that only accepts mutually > different items. However, if multiple of these items are generated using the > same code, e.g. Morph new imageForm, there is no chance to identify this > duplicate at the moment. > > > > Thanks for the hints, this sounds indeed too complex for my use case. For > now, I decided to simply catch and ignore the server errors about the > duplicates. It's easier to ask for forgiveness than permission. :-) > > Best, > Christoph > ________________________________ > Von: Squeak-dev im Auftrag > von Taeumel, Marcel > Gesendet: Donnerstag, 1. Oktober 2020 14:43:38 > An: squeak-dev > Betreff: Re: [squeak-dev] Overriding #= in Graphics and Sounds > > Hi Christoph. > > Hmmm... maybe it is not straightforward to implement? Especially whether > #class (or #species) should match or not. Reminds me of > SequenceableCollection >> #= and #hasEqualElements:. I keep on using > #hasEqualElements: in tests because I don't care about > Array-vs-OrderedCollection in several places. > > [cid:aa12d832-9f5e-4b25-ba80-37b31d0c2dba] > > And Form has also a non-trivial hierarchy of variations: > > [cid:3ca1fe29-c01e-4821-91ee-d30a841a9712] > > For example, would you ignore the #depth if it is black and white anyway? > Or would you break uses of Dictionaries that are virtually > IdentityDictionaries because of their current keys and the missing #=? > > It can be hard. Maybe it needs to be maintined afterwards. So, YAGNI? :-) > > Best, > Marcel > > > Am 01.10.2020 14:23:37 schrieb Thiede, Christoph > : > > Hi all, > > > for a current project, I need to compare form or sound objects with each > other, but I found out that they do not override #=, so for example, we > get: > > > (ColorForm extent: 1 @ 1) = (ColorForm extent: 1 @ 1) --> false > > > Wasn't this implemented > > a) simply because it looked like YAGNI? > > b) for design reasons? For example, should (Form extent: 1 @ 1) be equal to > (ColorForm extent: 1 @ 1) or not? > > c) for performance reasons? I don't know if there any guidelines for > implement #= (except that you need to implement #hash as well), but is an > equality comparison generally allowed to be an expensive operation if two > objects are equal? If two large forms have a different resolution or a > different bitmap hash, comparison will be fast, but if they are equal, we > will need to compare every single bit. Would this be okay or a no-go? > > > If implementing #= as proposed is not possible, how would you think about > implementing it as a keyword message on Form, e.g. #sameAs:? > > > The same questions apply to the AbstractSound hierarchy, too, where I'm not > sure whether two sounds being played for different duration should equal or > not. > > For a similar discussion, see also this thread: [squeak-dev] FormInspector, > or also: Text>>#= and its > consequences. > > Best, > Christoph > From vanessa at codefrau.net Wed Oct 28 18:48:44 2020 From: vanessa at codefrau.net (Vanessa Freudenberg) Date: Wed, 28 Oct 2020 11:48:44 -0700 Subject: [squeak-dev] translated considered harmful (in its current implementation) In-Reply-To: References: Message-ID: The mechanism assumes that basically all translation files are loaded so a match is found quickly. There probably should be an early return if there are no translations (as is the case with trunk images, I think?). - Vanessa - On Wed, Oct 28, 2020 at 1:53 AM Marcel Taeumel wrote: > Hi Eliot. > > Hmm... in 2010 there was a change in String >> #translated to also include > some kind of domain knowledge based on "thisContext sender method". (I > suppose it got merged with all Etoys changes in Squeak 5.1). > > ['world' translated] bench. > ---NO DOMAIN LOOKUP --- '847,000 per second. 1.18 microseconds per run. > 3.69926 % GC time.' > ---DO DOMAIN LOOKUP --- '9,190 per second. 109 microseconds per run. > 3.57928 % GC time.' > > Given that there are 1558 senders in a Trunk image, this might be worth > improving. :-) > > I propose to change #translatedInAllDomains, which is kind of a "detect" > looking desperately for some translation that has not the given form.... > enumerating all package names along the way to be used as domain names. > > Domain names are for GetText support. Each .mo file can represent a > different domain. Such a modular separation helps external tools (and > humans) to better browse and understand the kind of translation that is > needed. It's rather common practice, I suppose. > > Maybe we should just support a wildcard '*' as valid domain name and then > let the GetTextTranslator figure out how to enumerate all the accessible > .mo files? > > String >> translatedInAllDomains > ^self translatedTo: LocaleID current inDomain: '*' > > ['world' translated] bench. > ---WILDCARD--- '408,000 per second. 2.45 microseconds per run. 1.55938 % > GC time.' > > Now somebody has to change GetTextTranslator. I hope it does not break any > generic GetText support to enumerate all .mo files in a locale directory. > > Best, > Marcel > > Am 28.10.2020 06:59:07 schrieb Eliot Miranda : > Hi All, > > I have occasion to simulate the simulator (chancing down a context > manipulation bug). In doing so I notice that there seems to be some awful > ) N^2 behaviour in doing things as straight-forward as setting up the world > menu. Here's a back trace from the simulator of a current trunk image: > > 16r3061C8 M Dictionary>associationsDo: 16r16BC028: a(n) Dictionary > 16r306200 M Dictionary>keysDo: 16r16BC028: a(n) Dictionary > 16r306238 M [] in Dictionary>keys 16r16BC028: a(n) Dictionary > 16r306280 M Array class(SequenceableCollection > class)>new:streamContents: 16r16FA068: a(n) Array class > 16r3062C0 M Dictionary>keys 16r16BC028: a(n) Dictionary > 16r3062F0 M PackageOrganizer>packageNames 16r1540BE8: a(n) > PackageOrganizer > 16r306320 M TextDomainManager class>allKnownDomains 16r188A848: a(n) > TextDomainManager class > 16r306358 M ByteString(String)>translatedInAllDomains 16r3479FF8: a(n) > ByteString > 16r306390 M ByteString(String)>translated 16r3479FF8: a(n) ByteString > 16r3063D8 M [] in TheWorldMenu>fillIn:from: 16r3C93C0: a(n) TheWorldMenu > 16r303F38 M Array(SequenceableCollection)>do: 16rB681C8: a(n) Array > 16r303F70 M TheWorldMenu>fillIn:from: 16r3C93C0: a(n) TheWorldMenu > 16r303FC0 I TheWorldMenu>addSaveAndQuit: 16r3C93C0: a(n) TheWorldMenu > > I.e. for every item in the world menu we are enumerating over all > packages. Shurely shome mistake, hic!, ed. > _,,,^..^,,,_ > best, Eliot > > > -------------- next part -------------- An HTML attachment was scrubbed... URL: From commits at source.squeak.org Wed Oct 28 20:05:27 2020 From: commits at source.squeak.org (commits at source.squeak.org) Date: Wed, 28 Oct 2020 20:05:27 0000 Subject: [squeak-dev] The Inbox: Kernel-ct.1356.mcz Message-ID: A new version of Kernel was added to project The Inbox: http://source.squeak.org/inbox/Kernel-ct.1356.mcz ==================== Summary ==================== Name: Kernel-ct.1356 Author: ct Time: 28 October 2020, 9:05:21.976652 pm UUID: 27e8ca85-1191-5b4b-aa8c-92b65e01af50 Ancestors: Kernel-eem.1354 Fixes and refactors ClassBuilder cleanupAndCheckClassHierarchy which was broken due to a missing #informUserDuring: implementation. Also adds progress bars during the operation. =============== Diff against Kernel-eem.1354 =============== Item was changed: ----- Method: ClassBuilder class>>checkClassHierarchyConsistency (in category 'cleanup obsolete classes') ----- checkClassHierarchyConsistency "Check the consistency of the class hierarchy. The class hierarchy is consistent if the following two logical equivalences hold for classes A and B: - B is obsolete and 'B superclass' yields A <--> 'A obsoleteSubclasses' contains B - B is not obsolete and 'B superclass' yields A <--> 'A subclasses' contains B" + + Transcript cr; show: 'Start checking the class hierarchy...'. + Smalltalk garbageCollect. + + Metaclass allInstances + do: [:meta | + meta allInstances do: [:each | self checkClassHierarchyConsistencyFor: each]. + self checkClassHierarchyConsistencyFor: meta] + displayingProgress: 'Validating class hierarchy' translated. + + Transcript show: 'OK'.! - self informUserDuring:[:bar| - self checkClassHierarchyConsistency: bar. - ].! Item was removed: - ----- Method: ClassBuilder class>>checkClassHierarchyConsistency: (in category 'cleanup obsolete classes') ----- - checkClassHierarchyConsistency: informer - "Check the consistency of the class hierarchy. The class hierarchy is consistent if the following - two logical equivalences hold for classes A and B: - - B is obsolete and 'B superclass' yields A <--> 'A obsoleteSubclasses' contains B - - B is not obsolete and 'B superclass' yields A <--> 'A subclasses' contains B" - | classes | - Transcript cr; show: 'Start checking the class hierarchy...'. - Smalltalk garbageCollect. - classes := Metaclass allInstances. - classes keysAndValuesDo: [:index :meta | - informer value:'Validating class hierarchy ', (index * 100 // classes size) printString,'%'. - meta allInstances do: [:each | self checkClassHierarchyConsistencyFor: each]. - self checkClassHierarchyConsistencyFor: meta. - ]. - Transcript show: 'OK'.! Item was changed: ----- Method: ClassBuilder class>>cleanupAndCheckClassHierarchy (in category 'cleanup obsolete classes') ----- cleanupAndCheckClassHierarchy "Makes the class hierarchy consistent and removes obsolete classes from the SystemDictionary. Afterwards it checks whether the hierarchy is really consistent." + + Project uiManager informUser: 'Cleaning up class hierarchy...' translated during: [ + Transcript cr; show: '*** Before cleaning up ***'. + self countReallyObsoleteClassesAndMetaclasses. + self cleanupClassHierarchy. + self checkClassHierarchyConsistency. + Transcript cr; cr; show: '*** After cleaning up ***'. + self countReallyObsoleteClassesAndMetaclasses].! - self informUserDuring:[:bar| - self cleanupAndCheckClassHierarchy: bar. - ]. - ! Item was removed: - ----- Method: ClassBuilder class>>cleanupAndCheckClassHierarchy: (in category 'cleanup obsolete classes') ----- - cleanupAndCheckClassHierarchy: informer - "Makes the class hierarchy consistent and removes obsolete classes from the SystemDictionary. - Afterwards it checks whether the hierarchy is really consistent." - - Transcript cr; show: '*** Before cleaning up ***'. - self countReallyObsoleteClassesAndMetaclasses. - self cleanupClassHierarchy: informer. - self checkClassHierarchyConsistency: informer. - Transcript cr; cr; show: '*** After cleaning up ***'. - self countReallyObsoleteClassesAndMetaclasses.! Item was changed: ----- Method: ClassBuilder class>>cleanupClassHierarchy (in category 'cleanup obsolete classes') ----- cleanupClassHierarchy "Makes the class hierarchy consistent and removes obsolete classes from the SystemDictionary." + + Transcript cr; show: 'Start fixing the class hierarchy and cleaning up...'. + Smalltalk garbageCollect. + + Metaclass allInstances + do: [:meta | + "Check classes before metaclasses (because Metaclass>>isObsolete checks whether the related class is obsolete)" + meta allInstances do: [:each | self cleanupClassHierarchyFor: each]. + self cleanupClassHierarchyFor: meta] + displayingProgress: 'Fixing class hierarchy' translated. + + Transcript show: 'DONE'.! - self informUserDuring:[:bar| - self cleanupClassHierarchy: bar. - ].! Item was removed: - ----- Method: ClassBuilder class>>cleanupClassHierarchy: (in category 'cleanup obsolete classes') ----- - cleanupClassHierarchy: informer - "Makes the class hierarchy consistent and removes obsolete classes from the SystemDictionary." - | classes | - Transcript cr; show: 'Start fixing the class hierarchy and cleaning up...'. - Smalltalk garbageCollect. - classes := Metaclass allInstances. - classes keysAndValuesDo: [:index :meta | - informer value:'Fixing class hierarchy ', (index * 100 // classes size) printString,'%'. - "Check classes before metaclasses (because Metaclass>>isObsolete - checks whether the related class is obsolete)" - meta allInstances do: [:each | self cleanupClassHierarchyFor: each]. - self cleanupClassHierarchyFor: meta. - ]. - Transcript show: 'DONE'.! From commits at source.squeak.org Wed Oct 28 20:19:59 2020 From: commits at source.squeak.org (commits at source.squeak.org) Date: Wed, 28 Oct 2020 20:19:59 0000 Subject: [squeak-dev] The Inbox: Morphic-ct.1709.mcz Message-ID: A new version of Morphic was added to project The Inbox: http://source.squeak.org/inbox/Morphic-ct.1709.mcz ==================== Summary ==================== Name: Morphic-ct.1709 Author: ct Time: 28 October 2020, 9:19:49.476652 pm UUID: 14a43f24-c7eb-1f4d-9928-48a4e9231bac Ancestors: Morphic-mt.1708 Make sure an obsolete progress bar does not remain on the screen after the operation has completed. Example: (1 to: 3) do: [:i | 1 second wait] displayingProgress: 'I should be visible for no longer than 3 seconds'. 2 seconds wait. =============== Diff against Morphic-mt.1708 =============== Item was changed: ----- Method: SystemProgressMorph>>freeSlot: (in category 'private') ----- freeSlot: number + number > 0 ifFalse: [^self]. lock critical: [| label | label := self labels at: number. (label isNil or: [label owner isNil]) ifTrue: [^self]. "Has been freed before" label delete. (self bars at: number) delete. self activeSlots: self activeSlots - 1. self activeSlots = 0 ifTrue: [self delete] + ifFalse: [self reposition]]. + self currentWorld displayWorld.! - ifFalse: [self reposition]]! From commits at source.squeak.org Wed Oct 28 20:30:41 2020 From: commits at source.squeak.org (commits at source.squeak.org) Date: Wed, 28 Oct 2020 20:30:41 0000 Subject: [squeak-dev] The Inbox: Kernel-ct.1357.mcz Message-ID: A new version of Kernel was added to project The Inbox: http://source.squeak.org/inbox/Kernel-ct.1357.mcz ==================== Summary ==================== Name: Kernel-ct.1357 Author: ct Time: 28 October 2020, 9:30:35.577652 pm UUID: efd94ae0-26ab-0c4f-b854-52f414ff2d3e Ancestors: Kernel-eem.1354 Implement missing simulation of objects as methods. In the past, it was not possible to debug/simulate code that used objects as methods properly. (Thanks to Marcel for the hint!) This very simple commit adds support of the OaM protocol [1] to the simulation machinery. Now you can debug all tests in TestObjectsAsMethods as you would expect, instead of crashing your image! Update: Uploaded a third time, this time with Kent Beck block formatting preserved. [1] "The [Objects as Methods] contract is that, when the VM encounters an ordinary object (rather than a compiled method) in the method dictionary during lookup, it sends it the special selector #run:with:in: providing the original selector, arguments, and receiver.". DOI: 10.1145/2991041.2991062. =============== Diff against Kernel-eem.1354 =============== Item was changed: ----- Method: Context>>send:to:with:lookupIn: (in category 'controlling') ----- send: selector to: rcvr with: arguments lookupIn: lookupClass + "Simulate the action of sending a message with selector and arguments to rcvr. The argument, lookupClass, is the class in which to lookup the message. This is the receiver's class for normal messages, but for super messages it will be some specific class related to the source method." - "Simulate the action of sending a message with selector and arguments - to rcvr. The argument, lookupClass, is the class in which to lookup the - message. This is the receiver's class for normal messages, but for super - messages it will be some specific class related to the source method." | meth primIndex val ctxt | (meth := lookupClass lookupSelector: selector) ifNil: [^self send: #doesNotUnderstand: to: rcvr with: {(Message selector: selector arguments: arguments) lookupClass: lookupClass} lookupIn: lookupClass]. + + meth isCompiledMethod ifFalse: + ["Object as Methods (OaM) protocol: 'The contract is that, when the VM encounters an ordinary object (rather than a compiled method) in the method dictionary during lookup, it sends it the special selector #run:with:in: providing the original selector, arguments, and receiver.'. DOI: 10.1145/2991041.2991062." + ^ self send: #run:with:in: + to: meth + with: {selector. arguments. rcvr}]. + + meth numArgs = arguments size ifFalse: + [^ self error: ('Wrong number of arguments in simulated message {1}' translated format: {selector})]. - meth numArgs ~= arguments size ifTrue: - [^self error: 'Wrong number of arguments in simulated message ', selector printString]. (primIndex := meth primitive) > 0 ifTrue: [val := self doPrimitive: primIndex method: meth receiver: rcvr args: arguments. + (self isPrimFailToken: val) ifFalse: - (self isPrimFailToken: val) ifFalse: [^val]]. + (selector == #doesNotUnderstand: and: [lookupClass == ProtoObject]) ifTrue: + [^ self error: ('Simulated message {1} not understood' translated format: {arguments first selector})]. + - [^self error: 'Simulated message ', arguments first selector, ' not understood']. ctxt := Context sender: self receiver: rcvr method: meth arguments: arguments. + (primIndex notNil and: [primIndex > 0]) ifTrue: - primIndex > 0 ifTrue: [ctxt failPrimitiveWith: val]. + ^ctxt! From christoph.thiede at student.hpi.uni-potsdam.de Wed Oct 28 20:33:15 2020 From: christoph.thiede at student.hpi.uni-potsdam.de (Christoph Thiede) Date: Wed, 28 Oct 2020 15:33:15 -0500 (CDT) Subject: [squeak-dev] The Inbox: Kernel-ct.1339.mcz In-Reply-To: References: Message-ID: <1603917195775-0.post@n4.nabble.com> Done, see Kernel-ct.1357. Sometimes I believe we should store MethodNodes on Monticello only, or have the code automatically formatted by the source.squeak.org servers right during uploading using a pretty printer ... :-) -- Sent from: http://forum.world.st/Squeak-Dev-f45488.html From tim at rowledge.org Wed Oct 28 21:56:52 2020 From: tim at rowledge.org (tim Rowledge) Date: Wed, 28 Oct 2020 14:56:52 -0700 Subject: [squeak-dev] State of Roassal3 on Squeak In-Reply-To: <1756f2090ac.ac15588069520.7097000527745201334@zoho.com> References: <1756b87e8cc.e8f9766b60383.3747487553447883139@zoho.com> <1756ef708f3.12bb65b1068916.1481134116343936531@zoho.com> <1756f2090ac.ac15588069520.7097000527745201334@zoho.com> Message-ID: Whilst listening to Alexandre's Smalltalk UK talk this afternoon I loaded your version of Roassal3 and ran many of the demos succesfully. Well done! Now make all the rest work ;-) tim -- tim Rowledge; tim at rowledge.org; http://www.rowledge.org/tim Oxymorons: Advanced BASIC From commits at source.squeak.org Wed Oct 28 22:36:40 2020 From: commits at source.squeak.org (commits at source.squeak.org) Date: Wed, 28 Oct 2020 22:36:40 0000 Subject: [squeak-dev] The Inbox: KernelTests-ct.388.mcz Message-ID: A new version of KernelTests was added to project The Inbox: http://source.squeak.org/inbox/KernelTests-ct.388.mcz ==================== Summary ==================== Name: KernelTests-ct.388 Author: ct Time: 28 October 2020, 11:36:38.237544 pm UUID: c611de6b-f83d-ac45-a83f-00082a8311b4 Ancestors: KernelTests-ul.386 Adds test for a simulation bug that occurs while executing ProtoObject >> #doesNotUnderstand:. =============== Diff against KernelTests-ul.386 =============== Item was added: + ----- Method: MethodContextTest>>testProtoObjectDoesNotUnderstand (in category 'tests') ----- + testProtoObjectDoesNotUnderstand + + self assert: + [Context runSimulated: + [self + executeShould: [Compiler evaluate: 'super foo' for: Object new] + inScopeOf: MessageNotUnderstood]].! From commits at source.squeak.org Wed Oct 28 22:37:29 2020 From: commits at source.squeak.org (commits at source.squeak.org) Date: Wed, 28 Oct 2020 22:37:29 0000 Subject: [squeak-dev] The Inbox: Kernel-ct.1358.mcz Message-ID: A new version of Kernel was added to project The Inbox: http://source.squeak.org/inbox/Kernel-ct.1358.mcz ==================== Summary ==================== Name: Kernel-ct.1358 Author: ct Time: 28 October 2020, 11:37:24.817544 pm UUID: c9af6acb-61cf-af42-b5fa-3afa8451bb24 Ancestors: Kernel-mt.1353 Fixes a simulation bug that occurs when executing ProtoObject >> #doesNotUnderstand:. See KernelTests-ct.388. =============== Diff against Kernel-mt.1353 =============== Item was changed: ----- Method: Context>>send:to:with:lookupIn: (in category 'controlling') ----- send: selector to: rcvr with: arguments lookupIn: lookupClass "Simulate the action of sending a message with selector and arguments to rcvr. The argument, lookupClass, is the class in which to lookup the message. This is the receiver's class for normal messages, but for super messages it will be some specific class related to the source method." | meth primIndex val ctxt | (meth := lookupClass lookupSelector: selector) ifNil: + [selector == #doesNotUnderstand: ifTrue: + [self error: ('Simulated message {1} not understood' translated format: {selector})]. + ^self send: #doesNotUnderstand: - [^self send: #doesNotUnderstand: to: rcvr with: {(Message selector: selector arguments: arguments) lookupClass: lookupClass} lookupIn: lookupClass]. meth numArgs ~= arguments size ifTrue: [^self error: 'Wrong number of arguments in simulated message ', selector printString]. (primIndex := meth primitive) > 0 ifTrue: [val := self doPrimitive: primIndex method: meth receiver: rcvr args: arguments. (self isPrimFailToken: val) ifFalse: [^val]]. - (selector == #doesNotUnderstand: and: [lookupClass == ProtoObject]) ifTrue: - [^self error: 'Simulated message ', arguments first selector, ' not understood']. ctxt := Context sender: self receiver: rcvr method: meth arguments: arguments. primIndex > 0 ifTrue: [ctxt failPrimitiveWith: val]. ^ctxt! From Christoph.Thiede at student.hpi.uni-potsdam.de Wed Oct 28 22:57:49 2020 From: Christoph.Thiede at student.hpi.uni-potsdam.de (Thiede, Christoph) Date: Wed, 28 Oct 2020 22:57:49 +0000 Subject: [squeak-dev] The Inbox: Morphic-ct.1709.mcz In-Reply-To: References: Message-ID: <75fdc3bd7db14f95b74e3483fa7604a6@student.hpi.uni-potsdam.de> Hm, this probably belongs to the category "tricky". I experienced some scenarios similar to the given snippet in which the remaining progress bar was definitively confusing. On the other hand, the usual Monticello workflow looks quite different with this change because the progress bars only pop up for a very short moment and most of the time no progress bar can be seen. However, conceptionally, I'd rather like to fix the latter observation in Monticello, i.e. move up the code that triggers the progress bars in the stack. Any objections? :-) Best, Christoph ________________________________ Von: Squeak-dev im Auftrag von commits at source.squeak.org Gesendet: Mittwoch, 28. Oktober 2020 21:19:59 An: squeak-dev at lists.squeakfoundation.org Betreff: [squeak-dev] The Inbox: Morphic-ct.1709.mcz A new version of Morphic was added to project The Inbox: http://source.squeak.org/inbox/Morphic-ct.1709.mcz ==================== Summary ==================== Name: Morphic-ct.1709 Author: ct Time: 28 October 2020, 9:19:49.476652 pm UUID: 14a43f24-c7eb-1f4d-9928-48a4e9231bac Ancestors: Morphic-mt.1708 Make sure an obsolete progress bar does not remain on the screen after the operation has completed. Example: (1 to: 3) do: [:i | 1 second wait] displayingProgress: 'I should be visible for no longer than 3 seconds'. 2 seconds wait. =============== Diff against Morphic-mt.1708 =============== Item was changed: ----- Method: SystemProgressMorph>>freeSlot: (in category 'private') ----- freeSlot: number + number > 0 ifFalse: [^self]. lock critical: [| label | label := self labels at: number. (label isNil or: [label owner isNil]) ifTrue: [^self]. "Has been freed before" label delete. (self bars at: number) delete. self activeSlots: self activeSlots - 1. self activeSlots = 0 ifTrue: [self delete] + ifFalse: [self reposition]]. + self currentWorld displayWorld.! - ifFalse: [self reposition]]! -------------- next part -------------- An HTML attachment was scrubbed... URL: From kirtai+st at gmail.com Wed Oct 28 23:19:02 2020 From: kirtai+st at gmail.com (Douglas Brebner) Date: Wed, 28 Oct 2020 23:19:02 +0000 Subject: [squeak-dev] Mime classes in URL package? Message-ID: <9d269712-e64f-3455-7e48-e691adc67bb5@gmail.com> Hi, Just wondering, but why are there mime and mail classes in the Network-Url package? Shouldn't they be somewhere else, e.g. Network-MIME? Thanks P.S. Also, URL, not Url? From commits at source.squeak.org Thu Oct 29 02:13:04 2020 From: commits at source.squeak.org (commits at source.squeak.org) Date: Thu, 29 Oct 2020 02:13:04 0000 Subject: [squeak-dev] The Trunk: Kernel-eem.1355.mcz Message-ID: Eliot Miranda uploaded a new version of Kernel to project The Trunk: http://source.squeak.org/trunk/Kernel-eem.1355.mcz ==================== Summary ==================== Name: Kernel-eem.1355 Author: eem Time: 28 October 2020, 6:16:21.972202 pm UUID: 14e40036-578b-4645-88e4-77be34a6d96b Ancestors: Kernel-eem.1354 Speed-up cull:[cull:*] by supplying the primitive to handle teh case where the number of block arguments matches the number of arguments to cull:[cull:]. Nuke the obsolete pre-closure simulation code for block closure activation. =============== Diff against Kernel-eem.1354 =============== Item was changed: ----- Method: BlockClosure>>cull: (in category 'evaluating') ----- cull: firstArg "Activate the receiver, with one or zero arguments." + "Handle the one argument case primitively" - numArgs >= 1 ifTrue: [ ^self value: firstArg ]. ^self value! Item was changed: ----- Method: BlockClosure>>cull:cull: (in category 'evaluating') ----- cull: firstArg cull: secondArg "Activate the receiver, with two or less arguments." + "Handle the two argument case primitively" - numArgs >= 2 ifTrue: [ ^self value: firstArg value: secondArg ]. numArgs = 1 ifTrue: [ ^self value: firstArg ]. ^self value! Item was changed: ----- Method: BlockClosure>>cull:cull:cull: (in category 'evaluating') ----- cull: firstArg cull: secondArg cull: thirdArg "Activate the receiver, with three or less arguments." + "Handle the two argument case primitively" - numArgs >= 2 ifTrue: [ numArgs >= 3 ifTrue: [ ^self value: firstArg value: secondArg value: thirdArg ]. ^self value: firstArg value: secondArg ]. numArgs = 1 ifTrue: [ ^self value: firstArg ]. ^self value! Item was changed: ----- Method: BlockClosure>>cull:cull:cull:cull: (in category 'evaluating') ----- cull: firstArg cull: secondArg cull: thirdArg cull: fourthArg "Activate the receiver, with four or less arguments." + "Handle the two argument case primitively" - numArgs >= 3 ifTrue: [ numArgs >= 4 ifTrue: [ ^self value: firstArg value: secondArg value: thirdArg value: fourthArg ]. ^self value: firstArg value: secondArg value: thirdArg ]. numArgs = 2 ifTrue: [ ^self value: firstArg value: secondArg ]. numArgs = 1 ifTrue: [ ^self value: firstArg ]. ^self value! Item was changed: ----- Method: BlockClosure>>value (in category 'evaluating') ----- value "Activate the receiver, creating a closure activation (Context) whose closure is the receiver and whose caller is the sender of this message. Supply the copied values to the activation as its copied temps. Primitive. Essential." - | newContext | numArgs ~= 0 ifTrue: [self numArgsError: 0]. + ^self primitiveFailed! - false - ifTrue: "Old code to simulate the closure value primitive on VMs that lack it." - [newContext := self asContextWithSender: thisContext sender. - thisContext privSender: newContext] - ifFalse: [self primitiveFailed]! Item was changed: ----- Method: BlockClosure>>value: (in category 'evaluating') ----- value: firstArg "Activate the receiver, creating a closure activation (Context) whose closure is the receiver and whose caller is the sender of this message. Supply the argument and copied values to the activation as its argument and copied temps. Primitive. Essential." - | newContext | numArgs ~= 1 ifTrue: [self numArgsError: 1]. + ^self primitiveFailed! - false - ifTrue: "Old code to simulate the closure value primitive on VMs that lack it." - [newContext := self asContextWithSender: thisContext sender. - newContext at: 1 put: firstArg. - thisContext privSender: newContext] - ifFalse: [self primitiveFailed]! Item was changed: ----- Method: BlockClosure>>value:value: (in category 'evaluating') ----- value: firstArg value: secondArg "Activate the receiver, creating a closure activation (Context) whose closure is the receiver and whose caller is the sender of this message. Supply the arguments and copied values to the activation as its arguments and copied temps. Primitive. Essential." - | newContext | numArgs ~= 2 ifTrue: [self numArgsError: 2]. + ^self primitiveFailed! - false - ifTrue: "Old code to simulate the closure value primitive on VMs that lack it." - [newContext := self asContextWithSender: thisContext sender. - newContext at: 1 put: firstArg. - newContext at: 2 put: secondArg. - thisContext privSender: newContext] - ifFalse: [self primitiveFailed]! Item was changed: ----- Method: BlockClosure>>value:value:value: (in category 'evaluating') ----- value: firstArg value: secondArg value: thirdArg "Activate the receiver, creating a closure activation (Context) whose closure is the receiver and whose caller is the sender of this message. Supply the arguments and copied values to the activation as its arguments and copied temps. Primitive. Essential." - | newContext | numArgs ~= 3 ifTrue: [self numArgsError: 3]. + ^self primitiveFailed! - false - ifTrue: "Old code to simulate the closure value primitive on VMs that lack it." - [newContext := self asContextWithSender: thisContext sender. - newContext at: 1 put: firstArg. - newContext at: 2 put: secondArg. - newContext at: 3 put: thirdArg. - thisContext privSender: newContext] - ifFalse: [self primitiveFailed]! Item was changed: ----- Method: BlockClosure>>value:value:value:value: (in category 'evaluating') ----- value: firstArg value: secondArg value: thirdArg value: fourthArg "Activate the receiver, creating a closure activation (Context) whose closure is the receiver and whose caller is the sender of this message. Supply the arguments and copied values to the activation as its arguments and copied temps. Primitive. Essential." - | newContext | numArgs ~= 4 ifTrue: [self numArgsError: 4]. + ^self primitiveFailed! - false - ifTrue: "Old code to simulate the closure value primitive on VMs that lack it." - [newContext := self asContextWithSender: thisContext sender. - newContext at: 1 put: firstArg. - newContext at: 2 put: secondArg. - newContext at: 3 put: thirdArg. - newContext at: 4 put: fourthArg. - thisContext privSender: newContext] - ifFalse: [self primitiveFailed]! Item was changed: ----- Method: BlockClosure>>value:value:value:value:value: (in category 'evaluating') ----- value: firstArg value: secondArg value: thirdArg value: fourthArg value: fifthArg "Activate the receiver, creating a closure activation (Context) whose closure is the receiver and whose caller is the sender of this message. Supply the arguments and copied values to the activation as its arguments and copied temps. Primitive. Essential." - | newContext | numArgs ~= 5 ifTrue: [self numArgsError: 5]. + ^self primitiveFailed! - false - ifTrue: "Old code to simulate the closure value primitive on VMs that lack it." - [newContext := self asContextWithSender: thisContext sender. - newContext at: 1 put: firstArg. - newContext at: 2 put: secondArg. - newContext at: 3 put: thirdArg. - newContext at: 4 put: fourthArg. - newContext at: 5 put: fifthArg. - thisContext privSender: newContext] - ifFalse: [self primitiveFailed]! Item was changed: ----- Method: BlockClosure>>valueWithArguments: (in category 'evaluating') ----- valueWithArguments: anArray "Activate the receiver, creating a closure activation (Context) whose closure is the receiver and whose caller is the sender of this message. Supply the arguments in an anArray and copied values to the activation as its arguments and copied temps. Primitive. Essential." - | newContext | numArgs ~= anArray size ifTrue: [self numArgsError: anArray size]. + ^self primitiveFailed! - false - ifTrue: "Old code to simulate the closure value primitive on VMs that lack it." - [newContext := self asContextWithSender: thisContext sender. - 1 to: numArgs do: - [:i| newContext at: i put: (anArray at: i)]. - thisContext privSender: newContext] - ifFalse: [self primitiveFailed]! Item was added: + ----- Method: FullBlockClosure>>cull: (in category 'evaluating') ----- + cull: firstArg + "Activate the receiver, with one or zero arguments." + "Handle the one argument case primitively" + numArgs >= 1 ifTrue: [ ^self value: firstArg ]. + ^self value! Item was added: + ----- Method: FullBlockClosure>>cull:cull: (in category 'evaluating') ----- + cull: firstArg cull: secondArg + "Activate the receiver, with two or less arguments." + "Handle the two argument case primitively" + numArgs >= 2 ifTrue: [ ^self value: firstArg value: secondArg ]. + numArgs = 1 ifTrue: [ ^self value: firstArg ]. + ^self value! Item was added: + ----- Method: FullBlockClosure>>cull:cull:cull: (in category 'evaluating') ----- + cull: firstArg cull: secondArg cull: thirdArg + "Activate the receiver, with three or less arguments." + "Handle the three argument case primitively" + numArgs >= 2 ifTrue: + [numArgs >= 3 ifTrue: + [^self value: firstArg value: secondArg value: thirdArg]. + ^self value: firstArg value: secondArg]. + numArgs = 1 ifTrue: + [^self value: firstArg]. + ^self value! Item was added: + ----- Method: FullBlockClosure>>cull:cull:cull:cull: (in category 'evaluating') ----- + cull: firstArg cull: secondArg cull: thirdArg cull: fourthArg + "Activate the receiver, with four or less arguments." + "Handle the four argument case primitively" + numArgs >= 3 ifTrue: + [numArgs >= 4 ifTrue: + [^self value: firstArg value: secondArg value: thirdArg value: fourthArg]. + ^self value: firstArg value: secondArg value: thirdArg]. + numArgs = 2 ifTrue: + [^self value: firstArg value: secondArg]. + numArgs = 1 ifTrue: + [^self value: firstArg]. + ^self value! Item was changed: ----- Method: FullBlockClosure>>value (in category 'evaluating') ----- value "Activate the receiver, creating a closure activation (MethodContext) whose closure is the receiver and whose caller is the sender of this message. Supply the copied values to the activation as its copied temps. Primitive. Essential." - | newContext | numArgs ~= 0 ifTrue: [self numArgsError: 0]. + ^self primitiveFailed! - false - ifTrue: "Old code to simulate the closure value primitive on VMs that lack it." - [newContext := self asContextWithSender: thisContext sender. - thisContext privSender: newContext] - ifFalse: [self primitiveFailed]! Item was changed: ----- Method: FullBlockClosure>>value: (in category 'evaluating') ----- value: firstArg "Activate the receiver, creating a closure activation (MethodContext) whose closure is the receiver and whose caller is the sender of this message. Supply the argument and copied values to the activation as its argument and copied temps. Primitive. Essential." - | newContext | numArgs ~= 1 ifTrue: [self numArgsError: 1]. + ^self primitiveFailed! - false - ifTrue: "Old code to simulate the closure value primitive on VMs that lack it." - [newContext := self asContextWithSender: thisContext sender. - newContext at: 1 put: firstArg. - thisContext privSender: newContext] - ifFalse: [self primitiveFailed]! Item was changed: ----- Method: FullBlockClosure>>value:value: (in category 'evaluating') ----- value: firstArg value: secondArg "Activate the receiver, creating a closure activation (MethodContext) whose closure is the receiver and whose caller is the sender of this message. Supply the arguments and copied values to the activation as its arguments and copied temps. Primitive. Essential." - | newContext | numArgs ~= 2 ifTrue: [self numArgsError: 2]. + ^self primitiveFailed! - false - ifTrue: "Old code to simulate the closure value primitive on VMs that lack it." - [newContext := self asContextWithSender: thisContext sender. - newContext at: 1 put: firstArg. - newContext at: 2 put: secondArg. - thisContext privSender: newContext] - ifFalse: [self primitiveFailed]! Item was changed: ----- Method: FullBlockClosure>>value:value:value: (in category 'evaluating') ----- value: firstArg value: secondArg value: thirdArg "Activate the receiver, creating a closure activation (MethodContext) whose closure is the receiver and whose caller is the sender of this message. Supply the arguments and copied values to the activation as its arguments and copied temps. Primitive. Essential." - | newContext | numArgs ~= 3 ifTrue: [self numArgsError: 3]. + ^self primitiveFailed! - false - ifTrue: "Old code to simulate the closure value primitive on VMs that lack it." - [newContext := self asContextWithSender: thisContext sender. - newContext at: 1 put: firstArg. - newContext at: 2 put: secondArg. - newContext at: 3 put: thirdArg. - thisContext privSender: newContext] - ifFalse: [self primitiveFailed]! Item was changed: ----- Method: FullBlockClosure>>value:value:value:value: (in category 'evaluating') ----- value: firstArg value: secondArg value: thirdArg value: fourthArg "Activate the receiver, creating a closure activation (MethodContext) whose closure is the receiver and whose caller is the sender of this message. Supply the arguments and copied values to the activation as its arguments and copied temps. Primitive. Essential." - | newContext | numArgs ~= 4 ifTrue: [self numArgsError: 4]. + ^self primitiveFailed! - false - ifTrue: "Old code to simulate the closure value primitive on VMs that lack it." - [newContext := self asContextWithSender: thisContext sender. - newContext at: 1 put: firstArg. - newContext at: 2 put: secondArg. - newContext at: 3 put: thirdArg. - newContext at: 4 put: fourthArg. - thisContext privSender: newContext] - ifFalse: [self primitiveFailed]! Item was changed: ----- Method: FullBlockClosure>>value:value:value:value:value: (in category 'evaluating') ----- value: firstArg value: secondArg value: thirdArg value: fourthArg value: fifthArg "Activate the receiver, creating a closure activation (MethodContext) whose closure is the receiver and whose caller is the sender of this message. Supply the arguments and copied values to the activation as its arguments and copied temps. Primitive. Essential." - | newContext | numArgs ~= 5 ifTrue: [self numArgsError: 5]. + ^self primitiveFailed! - false - ifTrue: "Old code to simulate the closure value primitive on VMs that lack it." - [newContext := self asContextWithSender: thisContext sender. - newContext at: 1 put: firstArg. - newContext at: 2 put: secondArg. - newContext at: 3 put: thirdArg. - newContext at: 4 put: fourthArg. - newContext at: 5 put: fifthArg. - thisContext privSender: newContext] - ifFalse: [self primitiveFailed]! Item was changed: ----- Method: FullBlockClosure>>valueWithArguments: (in category 'evaluating') ----- valueWithArguments: anArray "Activate the receiver, creating a closure activation (MethodContext) whose closure is the receiver and whose caller is the sender of this message. Supply the arguments in an anArray and copied values to the activation as its arguments and copied temps. Primitive. Essential." - | newContext | numArgs ~= anArray size ifTrue: [self numArgsError: anArray size]. + ^self primitiveFailed! - false - ifTrue: "Old code to simulate the closure value primitive on VMs that lack it." - [newContext := self asContextWithSender: thisContext sender. - 1 to: numArgs do: - [:i| newContext at: i put: (anArray at: i)]. - thisContext privSender: newContext] - ifFalse: [self primitiveFailed]! From Christoph.Thiede at student.hpi.uni-potsdam.de Thu Oct 29 07:02:25 2020 From: Christoph.Thiede at student.hpi.uni-potsdam.de (Thiede, Christoph) Date: Thu, 29 Oct 2020 07:02:25 +0000 Subject: [squeak-dev] The Trunk: Kernel-eem.1355.mcz In-Reply-To: References: Message-ID: <7a40768605124387a0d3de062c71bb65@student.hpi.uni-potsdam.de> Great idea! As a side-effect, there will also be less noise when debugging some block invocation. :-) Why did you choose numArgs = 2 for the fast lane, was this a random choice only, or did you do some measurements to find out which number of arguments is most commonly passed? Best, Christoph ________________________________ Von: Squeak-dev im Auftrag von commits at source.squeak.org Gesendet: Donnerstag, 29. Oktober 2020 03:13:04 An: squeak-dev at lists.squeakfoundation.org; packages at lists.squeakfoundation.org Betreff: [squeak-dev] The Trunk: Kernel-eem.1355.mcz Eliot Miranda uploaded a new version of Kernel to project The Trunk: http://source.squeak.org/trunk/Kernel-eem.1355.mcz ==================== Summary ==================== Name: Kernel-eem.1355 Author: eem Time: 28 October 2020, 6:16:21.972202 pm UUID: 14e40036-578b-4645-88e4-77be34a6d96b Ancestors: Kernel-eem.1354 Speed-up cull:[cull:*] by supplying the primitive to handle teh case where the number of block arguments matches the number of arguments to cull:[cull:]. Nuke the obsolete pre-closure simulation code for block closure activation. =============== Diff against Kernel-eem.1354 =============== Item was changed: ----- Method: BlockClosure>>cull: (in category 'evaluating') ----- cull: firstArg "Activate the receiver, with one or zero arguments." + "Handle the one argument case primitively" - numArgs >= 1 ifTrue: [ ^self value: firstArg ]. ^self value! Item was changed: ----- Method: BlockClosure>>cull:cull: (in category 'evaluating') ----- cull: firstArg cull: secondArg "Activate the receiver, with two or less arguments." + "Handle the two argument case primitively" - numArgs >= 2 ifTrue: [ ^self value: firstArg value: secondArg ]. numArgs = 1 ifTrue: [ ^self value: firstArg ]. ^self value! Item was changed: ----- Method: BlockClosure>>cull:cull:cull: (in category 'evaluating') ----- cull: firstArg cull: secondArg cull: thirdArg "Activate the receiver, with three or less arguments." + "Handle the two argument case primitively" - numArgs >= 2 ifTrue: [ numArgs >= 3 ifTrue: [ ^self value: firstArg value: secondArg value: thirdArg ]. ^self value: firstArg value: secondArg ]. numArgs = 1 ifTrue: [ ^self value: firstArg ]. ^self value! Item was changed: ----- Method: BlockClosure>>cull:cull:cull:cull: (in category 'evaluating') ----- cull: firstArg cull: secondArg cull: thirdArg cull: fourthArg "Activate the receiver, with four or less arguments." + "Handle the two argument case primitively" - numArgs >= 3 ifTrue: [ numArgs >= 4 ifTrue: [ ^self value: firstArg value: secondArg value: thirdArg value: fourthArg ]. ^self value: firstArg value: secondArg value: thirdArg ]. numArgs = 2 ifTrue: [ ^self value: firstArg value: secondArg ]. numArgs = 1 ifTrue: [ ^self value: firstArg ]. ^self value! Item was changed: ----- Method: BlockClosure>>value (in category 'evaluating') ----- value "Activate the receiver, creating a closure activation (Context) whose closure is the receiver and whose caller is the sender of this message. Supply the copied values to the activation as its copied temps. Primitive. Essential." - | newContext | numArgs ~= 0 ifTrue: [self numArgsError: 0]. + ^self primitiveFailed! - false - ifTrue: "Old code to simulate the closure value primitive on VMs that lack it." - [newContext := self asContextWithSender: thisContext sender. - thisContext privSender: newContext] - ifFalse: [self primitiveFailed]! Item was changed: ----- Method: BlockClosure>>value: (in category 'evaluating') ----- value: firstArg "Activate the receiver, creating a closure activation (Context) whose closure is the receiver and whose caller is the sender of this message. Supply the argument and copied values to the activation as its argument and copied temps. Primitive. Essential." - | newContext | numArgs ~= 1 ifTrue: [self numArgsError: 1]. + ^self primitiveFailed! - false - ifTrue: "Old code to simulate the closure value primitive on VMs that lack it." - [newContext := self asContextWithSender: thisContext sender. - newContext at: 1 put: firstArg. - thisContext privSender: newContext] - ifFalse: [self primitiveFailed]! Item was changed: ----- Method: BlockClosure>>value:value: (in category 'evaluating') ----- value: firstArg value: secondArg "Activate the receiver, creating a closure activation (Context) whose closure is the receiver and whose caller is the sender of this message. Supply the arguments and copied values to the activation as its arguments and copied temps. Primitive. Essential." - | newContext | numArgs ~= 2 ifTrue: [self numArgsError: 2]. + ^self primitiveFailed! - false - ifTrue: "Old code to simulate the closure value primitive on VMs that lack it." - [newContext := self asContextWithSender: thisContext sender. - newContext at: 1 put: firstArg. - newContext at: 2 put: secondArg. - thisContext privSender: newContext] - ifFalse: [self primitiveFailed]! Item was changed: ----- Method: BlockClosure>>value:value:value: (in category 'evaluating') ----- value: firstArg value: secondArg value: thirdArg "Activate the receiver, creating a closure activation (Context) whose closure is the receiver and whose caller is the sender of this message. Supply the arguments and copied values to the activation as its arguments and copied temps. Primitive. Essential." - | newContext | numArgs ~= 3 ifTrue: [self numArgsError: 3]. + ^self primitiveFailed! - false - ifTrue: "Old code to simulate the closure value primitive on VMs that lack it." - [newContext := self asContextWithSender: thisContext sender. - newContext at: 1 put: firstArg. - newContext at: 2 put: secondArg. - newContext at: 3 put: thirdArg. - thisContext privSender: newContext] - ifFalse: [self primitiveFailed]! Item was changed: ----- Method: BlockClosure>>value:value:value:value: (in category 'evaluating') ----- value: firstArg value: secondArg value: thirdArg value: fourthArg "Activate the receiver, creating a closure activation (Context) whose closure is the receiver and whose caller is the sender of this message. Supply the arguments and copied values to the activation as its arguments and copied temps. Primitive. Essential." - | newContext | numArgs ~= 4 ifTrue: [self numArgsError: 4]. + ^self primitiveFailed! - false - ifTrue: "Old code to simulate the closure value primitive on VMs that lack it." - [newContext := self asContextWithSender: thisContext sender. - newContext at: 1 put: firstArg. - newContext at: 2 put: secondArg. - newContext at: 3 put: thirdArg. - newContext at: 4 put: fourthArg. - thisContext privSender: newContext] - ifFalse: [self primitiveFailed]! Item was changed: ----- Method: BlockClosure>>value:value:value:value:value: (in category 'evaluating') ----- value: firstArg value: secondArg value: thirdArg value: fourthArg value: fifthArg "Activate the receiver, creating a closure activation (Context) whose closure is the receiver and whose caller is the sender of this message. Supply the arguments and copied values to the activation as its arguments and copied temps. Primitive. Essential." - | newContext | numArgs ~= 5 ifTrue: [self numArgsError: 5]. + ^self primitiveFailed! - false - ifTrue: "Old code to simulate the closure value primitive on VMs that lack it." - [newContext := self asContextWithSender: thisContext sender. - newContext at: 1 put: firstArg. - newContext at: 2 put: secondArg. - newContext at: 3 put: thirdArg. - newContext at: 4 put: fourthArg. - newContext at: 5 put: fifthArg. - thisContext privSender: newContext] - ifFalse: [self primitiveFailed]! Item was changed: ----- Method: BlockClosure>>valueWithArguments: (in category 'evaluating') ----- valueWithArguments: anArray "Activate the receiver, creating a closure activation (Context) whose closure is the receiver and whose caller is the sender of this message. Supply the arguments in an anArray and copied values to the activation as its arguments and copied temps. Primitive. Essential." - | newContext | numArgs ~= anArray size ifTrue: [self numArgsError: anArray size]. + ^self primitiveFailed! - false - ifTrue: "Old code to simulate the closure value primitive on VMs that lack it." - [newContext := self asContextWithSender: thisContext sender. - 1 to: numArgs do: - [:i| newContext at: i put: (anArray at: i)]. - thisContext privSender: newContext] - ifFalse: [self primitiveFailed]! Item was added: + ----- Method: FullBlockClosure>>cull: (in category 'evaluating') ----- + cull: firstArg + "Activate the receiver, with one or zero arguments." + "Handle the one argument case primitively" + numArgs >= 1 ifTrue: [ ^self value: firstArg ]. + ^self value! Item was added: + ----- Method: FullBlockClosure>>cull:cull: (in category 'evaluating') ----- + cull: firstArg cull: secondArg + "Activate the receiver, with two or less arguments." + "Handle the two argument case primitively" + numArgs >= 2 ifTrue: [ ^self value: firstArg value: secondArg ]. + numArgs = 1 ifTrue: [ ^self value: firstArg ]. + ^self value! Item was added: + ----- Method: FullBlockClosure>>cull:cull:cull: (in category 'evaluating') ----- + cull: firstArg cull: secondArg cull: thirdArg + "Activate the receiver, with three or less arguments." + "Handle the three argument case primitively" + numArgs >= 2 ifTrue: + [numArgs >= 3 ifTrue: + [^self value: firstArg value: secondArg value: thirdArg]. + ^self value: firstArg value: secondArg]. + numArgs = 1 ifTrue: + [^self value: firstArg]. + ^self value! Item was added: + ----- Method: FullBlockClosure>>cull:cull:cull:cull: (in category 'evaluating') ----- + cull: firstArg cull: secondArg cull: thirdArg cull: fourthArg + "Activate the receiver, with four or less arguments." + "Handle the four argument case primitively" + numArgs >= 3 ifTrue: + [numArgs >= 4 ifTrue: + [^self value: firstArg value: secondArg value: thirdArg value: fourthArg]. + ^self value: firstArg value: secondArg value: thirdArg]. + numArgs = 2 ifTrue: + [^self value: firstArg value: secondArg]. + numArgs = 1 ifTrue: + [^self value: firstArg]. + ^self value! Item was changed: ----- Method: FullBlockClosure>>value (in category 'evaluating') ----- value "Activate the receiver, creating a closure activation (MethodContext) whose closure is the receiver and whose caller is the sender of this message. Supply the copied values to the activation as its copied temps. Primitive. Essential." - | newContext | numArgs ~= 0 ifTrue: [self numArgsError: 0]. + ^self primitiveFailed! - false - ifTrue: "Old code to simulate the closure value primitive on VMs that lack it." - [newContext := self asContextWithSender: thisContext sender. - thisContext privSender: newContext] - ifFalse: [self primitiveFailed]! Item was changed: ----- Method: FullBlockClosure>>value: (in category 'evaluating') ----- value: firstArg "Activate the receiver, creating a closure activation (MethodContext) whose closure is the receiver and whose caller is the sender of this message. Supply the argument and copied values to the activation as its argument and copied temps. Primitive. Essential." - | newContext | numArgs ~= 1 ifTrue: [self numArgsError: 1]. + ^self primitiveFailed! - false - ifTrue: "Old code to simulate the closure value primitive on VMs that lack it." - [newContext := self asContextWithSender: thisContext sender. - newContext at: 1 put: firstArg. - thisContext privSender: newContext] - ifFalse: [self primitiveFailed]! Item was changed: ----- Method: FullBlockClosure>>value:value: (in category 'evaluating') ----- value: firstArg value: secondArg "Activate the receiver, creating a closure activation (MethodContext) whose closure is the receiver and whose caller is the sender of this message. Supply the arguments and copied values to the activation as its arguments and copied temps. Primitive. Essential." - | newContext | numArgs ~= 2 ifTrue: [self numArgsError: 2]. + ^self primitiveFailed! - false - ifTrue: "Old code to simulate the closure value primitive on VMs that lack it." - [newContext := self asContextWithSender: thisContext sender. - newContext at: 1 put: firstArg. - newContext at: 2 put: secondArg. - thisContext privSender: newContext] - ifFalse: [self primitiveFailed]! Item was changed: ----- Method: FullBlockClosure>>value:value:value: (in category 'evaluating') ----- value: firstArg value: secondArg value: thirdArg "Activate the receiver, creating a closure activation (MethodContext) whose closure is the receiver and whose caller is the sender of this message. Supply the arguments and copied values to the activation as its arguments and copied temps. Primitive. Essential." - | newContext | numArgs ~= 3 ifTrue: [self numArgsError: 3]. + ^self primitiveFailed! - false - ifTrue: "Old code to simulate the closure value primitive on VMs that lack it." - [newContext := self asContextWithSender: thisContext sender. - newContext at: 1 put: firstArg. - newContext at: 2 put: secondArg. - newContext at: 3 put: thirdArg. - thisContext privSender: newContext] - ifFalse: [self primitiveFailed]! Item was changed: ----- Method: FullBlockClosure>>value:value:value:value: (in category 'evaluating') ----- value: firstArg value: secondArg value: thirdArg value: fourthArg "Activate the receiver, creating a closure activation (MethodContext) whose closure is the receiver and whose caller is the sender of this message. Supply the arguments and copied values to the activation as its arguments and copied temps. Primitive. Essential." - | newContext | numArgs ~= 4 ifTrue: [self numArgsError: 4]. + ^self primitiveFailed! - false - ifTrue: "Old code to simulate the closure value primitive on VMs that lack it." - [newContext := self asContextWithSender: thisContext sender. - newContext at: 1 put: firstArg. - newContext at: 2 put: secondArg. - newContext at: 3 put: thirdArg. - newContext at: 4 put: fourthArg. - thisContext privSender: newContext] - ifFalse: [self primitiveFailed]! Item was changed: ----- Method: FullBlockClosure>>value:value:value:value:value: (in category 'evaluating') ----- value: firstArg value: secondArg value: thirdArg value: fourthArg value: fifthArg "Activate the receiver, creating a closure activation (MethodContext) whose closure is the receiver and whose caller is the sender of this message. Supply the arguments and copied values to the activation as its arguments and copied temps. Primitive. Essential." - | newContext | numArgs ~= 5 ifTrue: [self numArgsError: 5]. + ^self primitiveFailed! - false - ifTrue: "Old code to simulate the closure value primitive on VMs that lack it." - [newContext := self asContextWithSender: thisContext sender. - newContext at: 1 put: firstArg. - newContext at: 2 put: secondArg. - newContext at: 3 put: thirdArg. - newContext at: 4 put: fourthArg. - newContext at: 5 put: fifthArg. - thisContext privSender: newContext] - ifFalse: [self primitiveFailed]! Item was changed: ----- Method: FullBlockClosure>>valueWithArguments: (in category 'evaluating') ----- valueWithArguments: anArray "Activate the receiver, creating a closure activation (MethodContext) whose closure is the receiver and whose caller is the sender of this message. Supply the arguments in an anArray and copied values to the activation as its arguments and copied temps. Primitive. Essential." - | newContext | numArgs ~= anArray size ifTrue: [self numArgsError: anArray size]. + ^self primitiveFailed! - false - ifTrue: "Old code to simulate the closure value primitive on VMs that lack it." - [newContext := self asContextWithSender: thisContext sender. - 1 to: numArgs do: - [:i| newContext at: i put: (anArray at: i)]. - thisContext privSender: newContext] - ifFalse: [self primitiveFailed]! -------------- next part -------------- An HTML attachment was scrubbed... URL: From marcel.taeumel at hpi.de Thu Oct 29 08:16:05 2020 From: marcel.taeumel at hpi.de (Marcel Taeumel) Date: Thu, 29 Oct 2020 09:16:05 +0100 Subject: [squeak-dev] translated considered harmful (in its current implementation) In-Reply-To: References: Message-ID: Hi Vanessa. > There probably should be an early return if there are no translations (as is the case with trunk images, I think?). Last time the translations where updated (or merged from Etoys) was with the 5.1 release. Tim (tfel) also used some automation to do that. Since then, we have added more #translated calls and corrected existing ones as well. So, even in a 5.2 oder 5.3 release, there are likely to be a lot of misses and thus a lot of calls to #translatedInAllDomains. Well, instead of supporting the '*' domain, we could also just remove that behavior. Not optimal but a quick workaround. Not sure how often that helps anyway. For example, having a "Yes -> Ja" translation for one domain might as well apply to another domain. But that itself looks like a workaround for poor translation jobs. :-D Best, Marcel Am 28.10.2020 19:49:31 schrieb Vanessa Freudenberg : The mechanism assumes that basically all translation files are loaded so a match is found quickly. There probably should be an early return if there are no translations (as is the case with trunk images, I think?). - Vanessa - On Wed, Oct 28, 2020 at 1:53 AM Marcel Taeumel wrote: Hi Eliot. Hmm... in 2010 there was a change in String >> #translated to also include some kind of domain knowledge based on "thisContext sender method". (I suppose it got merged with all Etoys changes in Squeak 5.1). ['world' translated] bench. ---NO DOMAIN LOOKUP --- '847,000 per second. 1.18 microseconds per run. 3.69926 % GC time.' ---DO DOMAIN LOOKUP  --- '9,190 per second. 109 microseconds per run. 3.57928 % GC time.' Given that there are 1558 senders in a Trunk image, this might be worth improving. :-) I propose to change #translatedInAllDomains, which is kind of a "detect" looking desperately for some translation that has not the given form.... enumerating all package names along the way to be used as domain names. Domain names are for GetText support. Each .mo file can represent a different domain. Such a modular separation helps external tools (and humans) to better browse and understand the kind of translation that is needed. It's rather common practice, I suppose. Maybe we should just support a wildcard '*' as valid domain name and then let the GetTextTranslator figure out how to enumerate all the accessible .mo files? String >> translatedInAllDomains ^self translatedTo: LocaleID current inDomain: '*' ['world' translated] bench. ---WILDCARD---  '408,000 per second. 2.45 microseconds per run. 1.55938 % GC time.' Now somebody has to change GetTextTranslator. I hope it does not break any generic GetText support to enumerate all .mo files in a locale directory. Best, Marcel Am 28.10.2020 06:59:07 schrieb Eliot Miranda : Hi All,     I have occasion to simulate the simulator (chancing down a context manipulation bug).  In doing so I notice that there seems to be some awful ) N^2 behaviour in doing things as straight-forward as setting up the world menu.  Here's a back trace from the simulator of a current trunk image:   16r3061C8 M Dictionary>associationsDo: 16r16BC028: a(n) Dictionary   16r306200 M Dictionary>keysDo: 16r16BC028: a(n) Dictionary   16r306238 M [] in Dictionary>keys 16r16BC028: a(n) Dictionary   16r306280 M Array class(SequenceableCollection class)>new:streamContents: 16r16FA068: a(n) Array class   16r3062C0 M Dictionary>keys 16r16BC028: a(n) Dictionary   16r3062F0 M PackageOrganizer>packageNames 16r1540BE8: a(n) PackageOrganizer   16r306320 M TextDomainManager class>allKnownDomains 16r188A848: a(n) TextDomainManager class   16r306358 M ByteString(String)>translatedInAllDomains 16r3479FF8: a(n) ByteString   16r306390 M ByteString(String)>translated 16r3479FF8: a(n) ByteString   16r3063D8 M [] in TheWorldMenu>fillIn:from: 16r3C93C0: a(n) TheWorldMenu   16r303F38 M Array(SequenceableCollection)>do: 16rB681C8: a(n) Array   16r303F70 M TheWorldMenu>fillIn:from: 16r3C93C0: a(n) TheWorldMenu   16r303FC0 I TheWorldMenu>addSaveAndQuit: 16r3C93C0: a(n) TheWorldMenu I.e. for every item in the world menu we are enumerating over all packages.  Shurely shome mistake, hic!, ed. _,,,^..^,,,_ best, Eliot -------------- next part -------------- An HTML attachment was scrubbed... URL: From marcel.taeumel at hpi.de Thu Oct 29 08:35:07 2020 From: marcel.taeumel at hpi.de (Marcel Taeumel) Date: Thu, 29 Oct 2020 09:35:07 +0100 Subject: [squeak-dev] Some labels broke in a recent update Message-ID: Hi all! Is there a way to get back the number of implementors/senders in the window title? Also the message-search tool has no title: Best, Marcel -------------- next part -------------- An HTML attachment was scrubbed... URL: -------------- next part -------------- A non-text attachment was scrubbed... Name: image.png Type: image/png Size: 244129 bytes Desc: not available URL: From leves at caesar.elte.hu Thu Oct 29 13:24:49 2020 From: leves at caesar.elte.hu (Levente Uzonyi) Date: Thu, 29 Oct 2020 14:24:49 +0100 (CET) Subject: [squeak-dev] The Trunk: Kernel-eem.1355.mcz In-Reply-To: <7a40768605124387a0d3de062c71bb65@student.hpi.uni-potsdam.de> References: <7a40768605124387a0d3de062c71bb65@student.hpi.uni-potsdam.de> Message-ID: Hi Christoph, On Thu, 29 Oct 2020, Thiede, Christoph wrote: > > Great idea! As a side-effect, there will also be less noise when debugging some block invocation. :-) > > Why did you choose numArgs = 2 for the fast lane, was this a random choice only, or did you do some measurements to find out which number of arguments is most commonly passed? If you mean the comments for primitive 204 and 205 saying "Handle the two argument case primitively", "two" is just a copy-paste error. The correct words are "three" and "four", respectively. Levente > > > Best, > Christoph > > __________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________ > Von: Squeak-dev im Auftrag von commits at source.squeak.org > Gesendet: Donnerstag, 29. Oktober 2020 03:13:04 > An: squeak-dev at lists.squeakfoundation.org; packages at lists.squeakfoundation.org > Betreff: [squeak-dev] The Trunk: Kernel-eem.1355.mcz   > Eliot Miranda uploaded a new version of Kernel to project The Trunk: > http://source.squeak.org/trunk/Kernel-eem.1355.mcz > > ==================== Summary ==================== > > Name: Kernel-eem.1355 > Author: eem > Time: 28 October 2020, 6:16:21.972202 pm > UUID: 14e40036-578b-4645-88e4-77be34a6d96b > Ancestors: Kernel-eem.1354 > > Speed-up cull:[cull:*] by supplying the primitive to handle teh case where the number of block arguments matches the number of arguments to cull:[cull:]. > Nuke the obsolete pre-closure simulation code for block closure activation. > > =============== Diff against Kernel-eem.1354 =============== > > Item was changed: >   ----- Method: BlockClosure>>cull: (in category 'evaluating') ----- >   cull: firstArg >          "Activate the receiver, with one or zero arguments." > +        "Handle the one argument case primitively" > -        >          numArgs >= 1 ifTrue: [ ^self value: firstArg ]. >          ^self value! > > Item was changed: >   ----- Method: BlockClosure>>cull:cull: (in category 'evaluating') ----- >   cull: firstArg cull: secondArg >          "Activate the receiver, with two or less arguments." > +        "Handle the two argument case primitively" > -        >          numArgs >= 2 ifTrue: [ ^self value: firstArg value: secondArg ].        >          numArgs = 1 ifTrue: [ ^self value: firstArg ]. >          ^self value! > > Item was changed: >   ----- Method: BlockClosure>>cull:cull:cull: (in category 'evaluating') ----- >   cull: firstArg cull: secondArg cull: thirdArg >          "Activate the receiver, with three or less arguments." > +        "Handle the two argument case primitively" > -        >          numArgs >= 2 ifTrue: [ >                  numArgs >= 3 ifTrue: [ ^self value: firstArg value: secondArg value: thirdArg ]. >                  ^self value: firstArg value: secondArg ]. >          numArgs = 1 ifTrue: [ ^self value: firstArg ]. >          ^self value! > > Item was changed: >   ----- Method: BlockClosure>>cull:cull:cull:cull: (in category 'evaluating') ----- >   cull: firstArg cull: secondArg cull: thirdArg cull: fourthArg >          "Activate the receiver, with four or less arguments." > +        "Handle the two argument case primitively" > -        >          numArgs >= 3 ifTrue: [ >                  numArgs >= 4 ifTrue: [ >                          ^self value: firstArg value: secondArg value: thirdArg value: fourthArg ]. >                  ^self value: firstArg value: secondArg value: thirdArg ]. >          numArgs = 2 ifTrue: [ ^self value: firstArg value: secondArg ]. >          numArgs = 1 ifTrue: [ ^self value: firstArg ]. >          ^self value! > > Item was changed: >   ----- Method: BlockClosure>>value (in category 'evaluating') ----- >   value >          "Activate the receiver, creating a closure activation (Context) >           whose closure is the receiver and whose caller is the sender of this >           message. Supply the copied values to the activation as its copied >           temps. Primitive. Essential." >          > -        | newContext | >          numArgs ~= 0 ifTrue: >                  [self numArgsError: 0]. > +        ^self primitiveFailed! > -        false > -                ifTrue: "Old code to simulate the closure value primitive on VMs that lack it." > -                        [newContext := self asContextWithSender: thisContext sender. > -                        thisContext privSender: newContext] > -                ifFalse: [self primitiveFailed]! > > Item was changed: >   ----- Method: BlockClosure>>value: (in category 'evaluating') ----- >   value: firstArg >          "Activate the receiver, creating a closure activation (Context) >           whose closure is the receiver and whose caller is the sender of this >           message. Supply the argument and copied values to the activation >           as its argument and copied temps. Primitive. Essential." >          > -        | newContext | >          numArgs ~= 1 ifTrue: >                  [self numArgsError: 1]. > +        ^self primitiveFailed! > -        false > -                ifTrue: "Old code to simulate the closure value primitive on VMs that lack it." > -                        [newContext := self asContextWithSender: thisContext sender. > -                        newContext at: 1 put: firstArg. > -                        thisContext privSender: newContext] > -                ifFalse: [self primitiveFailed]! > > Item was changed: >   ----- Method: BlockClosure>>value:value: (in category 'evaluating') ----- >   value: firstArg value: secondArg >          "Activate the receiver, creating a closure activation (Context) >           whose closure is the receiver and whose caller is the sender of this >           message. Supply the arguments and copied values to the activation >           as its arguments and copied temps. Primitive. Essential." >          > -        | newContext | >          numArgs ~= 2 ifTrue: >                  [self numArgsError: 2]. > +        ^self primitiveFailed! > -        false > -                ifTrue: "Old code to simulate the closure value primitive on VMs that lack it." > -                        [newContext := self asContextWithSender: thisContext sender. > -                        newContext at: 1 put: firstArg. > -                        newContext at: 2 put: secondArg. > -                        thisContext privSender: newContext] > -                ifFalse: [self primitiveFailed]! > > Item was changed: >   ----- Method: BlockClosure>>value:value:value: (in category 'evaluating') ----- >   value: firstArg value: secondArg value: thirdArg >          "Activate the receiver, creating a closure activation (Context) >           whose closure is the receiver and whose caller is the sender of this >           message. Supply the arguments and copied values to the activation >           as its arguments and copied temps. Primitive. Essential." >          > -        | newContext | >          numArgs ~= 3 ifTrue: >                  [self numArgsError: 3]. > +        ^self primitiveFailed! > -        false > -                ifTrue: "Old code to simulate the closure value primitive on VMs that lack it." > -                        [newContext := self asContextWithSender: thisContext sender. > -                        newContext at: 1 put: firstArg. > -                        newContext at: 2 put: secondArg. > -                        newContext at: 3 put: thirdArg. > -                        thisContext privSender: newContext] > -                ifFalse: [self primitiveFailed]! > > Item was changed: >   ----- Method: BlockClosure>>value:value:value:value: (in category 'evaluating') ----- >   value: firstArg value: secondArg value: thirdArg value: fourthArg >          "Activate the receiver, creating a closure activation (Context) >           whose closure is the receiver and whose caller is the sender of this >           message. Supply the arguments and copied values to the activation >           as its arguments and copied temps. Primitive. Essential." >          > -        | newContext | >          numArgs ~= 4 ifTrue: >                  [self numArgsError: 4]. > +        ^self primitiveFailed! > -        false > -                ifTrue: "Old code to simulate the closure value primitive on VMs that lack it." > -                        [newContext := self asContextWithSender: thisContext sender. > -                        newContext at: 1 put: firstArg. > -                        newContext at: 2 put: secondArg. > -                        newContext at: 3 put: thirdArg. > -                        newContext at: 4 put: fourthArg. > -                        thisContext privSender: newContext] > -                ifFalse: [self primitiveFailed]! > > Item was changed: >   ----- Method: BlockClosure>>value:value:value:value:value: (in category 'evaluating') ----- >   value: firstArg value: secondArg value: thirdArg value: fourthArg value: fifthArg >          "Activate the receiver, creating a closure activation (Context) >           whose closure is the receiver and whose caller is the sender of this >           message. Supply the arguments and copied values to the activation >           as its arguments and copied temps. Primitive. Essential." >          > -        | newContext | >          numArgs ~= 5 ifTrue: >                  [self numArgsError: 5]. > +        ^self primitiveFailed! > -        false > -                ifTrue: "Old code to simulate the closure value primitive on VMs that lack it." > -                        [newContext := self asContextWithSender: thisContext sender. > -                        newContext at: 1 put: firstArg. > -                        newContext at: 2 put: secondArg. > -                        newContext at: 3 put: thirdArg. > -                        newContext at: 4 put: fourthArg. > -                        newContext at: 5 put: fifthArg. > -                        thisContext privSender: newContext] > -                ifFalse: [self primitiveFailed]! > > Item was changed: >   ----- Method: BlockClosure>>valueWithArguments: (in category 'evaluating') ----- >   valueWithArguments: anArray >          "Activate the receiver, creating a closure activation (Context) >           whose closure is the receiver and whose caller is the sender of this >           message. Supply the arguments in an anArray and copied values to >           the activation as its arguments and copied temps. Primitive. Essential." >          > -        | newContext | >          numArgs ~= anArray size ifTrue: >                  [self numArgsError: anArray size]. > +        ^self primitiveFailed! > -        false > -                ifTrue: "Old code to simulate the closure value primitive on VMs that lack it." > -                        [newContext := self asContextWithSender: thisContext sender. > -                        1 to: numArgs do: > -                                [:i| newContext at: i put: (anArray at: i)]. > -                        thisContext privSender: newContext] > -                ifFalse: [self primitiveFailed]! > > Item was added: > + ----- Method: FullBlockClosure>>cull: (in category 'evaluating') ----- > + cull: firstArg > +        "Activate the receiver, with one or zero arguments." > +        "Handle the one argument case primitively" > +        numArgs >= 1 ifTrue: [ ^self value: firstArg ]. > +        ^self value! > > Item was added: > + ----- Method: FullBlockClosure>>cull:cull: (in category 'evaluating') ----- > + cull: firstArg cull: secondArg > +        "Activate the receiver, with two or less arguments." > +        "Handle the two argument case primitively" > +        numArgs >= 2 ifTrue: [ ^self value: firstArg value: secondArg ].        > +        numArgs = 1 ifTrue: [ ^self value: firstArg ]. > +        ^self value! > > Item was added: > + ----- Method: FullBlockClosure>>cull:cull:cull: (in category 'evaluating') ----- > + cull: firstArg cull: secondArg cull: thirdArg > +        "Activate the receiver, with three or less arguments." > +        "Handle the three argument case primitively" > +        numArgs >= 2 ifTrue: > +                [numArgs >= 3 ifTrue: > +                        [^self value: firstArg value: secondArg value: thirdArg]. > +                ^self value: firstArg value: secondArg]. > +        numArgs = 1 ifTrue: > +                [^self value: firstArg]. > +        ^self value! > > Item was added: > + ----- Method: FullBlockClosure>>cull:cull:cull:cull: (in category 'evaluating') ----- > + cull: firstArg cull: secondArg cull: thirdArg cull: fourthArg > +        "Activate the receiver, with four or less arguments." > +        "Handle the four argument case primitively" > +        numArgs >= 3 ifTrue: > +                [numArgs >= 4 ifTrue: > +                        [^self value: firstArg value: secondArg value: thirdArg value: fourthArg]. > +                ^self value: firstArg value: secondArg value: thirdArg]. > +        numArgs = 2 ifTrue: > +                [^self value: firstArg value: secondArg]. > +        numArgs = 1 ifTrue: > +                [^self value: firstArg]. > +        ^self value! > > Item was changed: >   ----- Method: FullBlockClosure>>value (in category 'evaluating') ----- >   value >          "Activate the receiver, creating a closure activation (MethodContext) >           whose closure is the receiver and whose caller is the sender of this >           message. Supply the copied values to the activation as its copied >           temps. Primitive. Essential." >          > -        | newContext | >          numArgs ~= 0 ifTrue: >                  [self numArgsError: 0]. > +        ^self primitiveFailed! > -        false > -                ifTrue: "Old code to simulate the closure value primitive on VMs that lack it." > -                        [newContext := self asContextWithSender: thisContext sender. > -                        thisContext privSender: newContext] > -                ifFalse: [self primitiveFailed]! > > Item was changed: >   ----- Method: FullBlockClosure>>value: (in category 'evaluating') ----- >   value: firstArg >          "Activate the receiver, creating a closure activation (MethodContext) >           whose closure is the receiver and whose caller is the sender of this >           message. Supply the argument and copied values to the activation >           as its argument and copied temps. Primitive. Essential." >          > -        | newContext | >          numArgs ~= 1 ifTrue: >                  [self numArgsError: 1]. > +        ^self primitiveFailed! > -        false > -                ifTrue: "Old code to simulate the closure value primitive on VMs that lack it." > -                        [newContext := self asContextWithSender: thisContext sender. > -                        newContext at: 1 put: firstArg. > -                        thisContext privSender: newContext] > -                ifFalse: [self primitiveFailed]! > > Item was changed: >   ----- Method: FullBlockClosure>>value:value: (in category 'evaluating') ----- >   value: firstArg value: secondArg >          "Activate the receiver, creating a closure activation (MethodContext) >           whose closure is the receiver and whose caller is the sender of this >           message. Supply the arguments and copied values to the activation >           as its arguments and copied temps. Primitive. Essential." >          > -        | newContext | >          numArgs ~= 2 ifTrue: >                  [self numArgsError: 2]. > +        ^self primitiveFailed! > -        false > -                ifTrue: "Old code to simulate the closure value primitive on VMs that lack it." > -                        [newContext := self asContextWithSender: thisContext sender. > -                        newContext at: 1 put: firstArg. > -                        newContext at: 2 put: secondArg. > -                        thisContext privSender: newContext] > -                ifFalse: [self primitiveFailed]! > > Item was changed: >   ----- Method: FullBlockClosure>>value:value:value: (in category 'evaluating') ----- >   value: firstArg value: secondArg value: thirdArg >          "Activate the receiver, creating a closure activation (MethodContext) >           whose closure is the receiver and whose caller is the sender of this >           message. Supply the arguments and copied values to the activation >           as its arguments and copied temps. Primitive. Essential." >          > -        | newContext | >          numArgs ~= 3 ifTrue: >                  [self numArgsError: 3]. > +        ^self primitiveFailed! > -        false > -                ifTrue: "Old code to simulate the closure value primitive on VMs that lack it." > -                        [newContext := self asContextWithSender: thisContext sender. > -                        newContext at: 1 put: firstArg. > -                        newContext at: 2 put: secondArg. > -                        newContext at: 3 put: thirdArg. > -                        thisContext privSender: newContext] > -                ifFalse: [self primitiveFailed]! > > Item was changed: >   ----- Method: FullBlockClosure>>value:value:value:value: (in category 'evaluating') ----- >   value: firstArg value: secondArg value: thirdArg value: fourthArg >          "Activate the receiver, creating a closure activation (MethodContext) >           whose closure is the receiver and whose caller is the sender of this >           message. Supply the arguments and copied values to the activation >           as its arguments and copied temps. Primitive. Essential." >          > -        | newContext | >          numArgs ~= 4 ifTrue: >                  [self numArgsError: 4]. > +        ^self primitiveFailed! > -        false > -                ifTrue: "Old code to simulate the closure value primitive on VMs that lack it." > -                        [newContext := self asContextWithSender: thisContext sender. > -                        newContext at: 1 put: firstArg. > -                        newContext at: 2 put: secondArg. > -                        newContext at: 3 put: thirdArg. > -                        newContext at: 4 put: fourthArg. > -                        thisContext privSender: newContext] > -                ifFalse: [self primitiveFailed]! > > Item was changed: >   ----- Method: FullBlockClosure>>value:value:value:value:value: (in category 'evaluating') ----- >   value: firstArg value: secondArg value: thirdArg value: fourthArg value: fifthArg >          "Activate the receiver, creating a closure activation (MethodContext) >           whose closure is the receiver and whose caller is the sender of this >           message. Supply the arguments and copied values to the activation >           as its arguments and copied temps. Primitive. Essential." >          > -        | newContext | >          numArgs ~= 5 ifTrue: >                  [self numArgsError: 5]. > +        ^self primitiveFailed! > -        false > -                ifTrue: "Old code to simulate the closure value primitive on VMs that lack it." > -                        [newContext := self asContextWithSender: thisContext sender. > -                        newContext at: 1 put: firstArg. > -                        newContext at: 2 put: secondArg. > -                        newContext at: 3 put: thirdArg. > -                        newContext at: 4 put: fourthArg. > -                        newContext at: 5 put: fifthArg. > -                        thisContext privSender: newContext] > -                ifFalse: [self primitiveFailed]! > > Item was changed: >   ----- Method: FullBlockClosure>>valueWithArguments: (in category 'evaluating') ----- >   valueWithArguments: anArray >          "Activate the receiver, creating a closure activation (MethodContext) >           whose closure is the receiver and whose caller is the sender of this >           message. Supply the arguments in an anArray and copied values to >           the activation as its arguments and copied temps. Primitive. Essential." >          > -        | newContext | >          numArgs ~= anArray size ifTrue: >                  [self numArgsError: anArray size]. > +        ^self primitiveFailed! > -        false > -                ifTrue: "Old code to simulate the closure value primitive on VMs that lack it." > -                        [newContext := self asContextWithSender: thisContext sender. > -                        1 to: numArgs do: > -                                [:i| newContext at: i put: (anArray at: i)]. > -                        thisContext privSender: newContext] > -                ifFalse: [self primitiveFailed]! > > > > From Christoph.Thiede at student.hpi.uni-potsdam.de Thu Oct 29 13:34:59 2020 From: Christoph.Thiede at student.hpi.uni-potsdam.de (Thiede, Christoph) Date: Thu, 29 Oct 2020 13:34:59 +0000 Subject: [squeak-dev] The Trunk: Kernel-eem.1355.mcz In-Reply-To: References: <7a40768605124387a0d3de062c71bb65@student.hpi.uni-potsdam.de>, Message-ID: <5b59a98dd4a4412eb4d26a2250b05726@student.hpi.uni-potsdam.de> Alright. :-) Still, might it be an optimization to try with a smaller number of arguments first? I don't know which case occurs more commonly. Best, Christoph ________________________________ Von: Squeak-dev im Auftrag von Levente Uzonyi Gesendet: Donnerstag, 29. Oktober 2020 14:24:49 An: The general-purpose Squeak developers list Cc: packages at lists.squeakfoundation.org Betreff: Re: [squeak-dev] The Trunk: Kernel-eem.1355.mcz Hi Christoph, On Thu, 29 Oct 2020, Thiede, Christoph wrote: > > Great idea! As a side-effect, there will also be less noise when debugging some block invocation. :-) > > Why did you choose numArgs = 2 for the fast lane, was this a random choice only, or did you do some measurements to find out which number of arguments is most commonly passed? If you mean the comments for primitive 204 and 205 saying "Handle the two argument case primitively", "two" is just a copy-paste error. The correct words are "three" and "four", respectively. Levente > > > Best, > Christoph > > __________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________ > Von: Squeak-dev im Auftrag von commits at source.squeak.org > Gesendet: Donnerstag, 29. Oktober 2020 03:13:04 > An: squeak-dev at lists.squeakfoundation.org; packages at lists.squeakfoundation.org > Betreff: [squeak-dev] The Trunk: Kernel-eem.1355.mcz > Eliot Miranda uploaded a new version of Kernel to project The Trunk: > http://source.squeak.org/trunk/Kernel-eem.1355.mcz > > ==================== Summary ==================== > > Name: Kernel-eem.1355 > Author: eem > Time: 28 October 2020, 6:16:21.972202 pm > UUID: 14e40036-578b-4645-88e4-77be34a6d96b > Ancestors: Kernel-eem.1354 > > Speed-up cull:[cull:*] by supplying the primitive to handle teh case where the number of block arguments matches the number of arguments to cull:[cull:]. > Nuke the obsolete pre-closure simulation code for block closure activation. > > =============== Diff against Kernel-eem.1354 =============== > > Item was changed: > ----- Method: BlockClosure>>cull: (in category 'evaluating') ----- > cull: firstArg > "Activate the receiver, with one or zero arguments." > + "Handle the one argument case primitively" > - > numArgs >= 1 ifTrue: [ ^self value: firstArg ]. > ^self value! > > Item was changed: > ----- Method: BlockClosure>>cull:cull: (in category 'evaluating') ----- > cull: firstArg cull: secondArg > "Activate the receiver, with two or less arguments." > + "Handle the two argument case primitively" > - > numArgs >= 2 ifTrue: [ ^self value: firstArg value: secondArg ]. > numArgs = 1 ifTrue: [ ^self value: firstArg ]. > ^self value! > > Item was changed: > ----- Method: BlockClosure>>cull:cull:cull: (in category 'evaluating') ----- > cull: firstArg cull: secondArg cull: thirdArg > "Activate the receiver, with three or less arguments." > + "Handle the two argument case primitively" > - > numArgs >= 2 ifTrue: [ > numArgs >= 3 ifTrue: [ ^self value: firstArg value: secondArg value: thirdArg ]. > ^self value: firstArg value: secondArg ]. > numArgs = 1 ifTrue: [ ^self value: firstArg ]. > ^self value! > > Item was changed: > ----- Method: BlockClosure>>cull:cull:cull:cull: (in category 'evaluating') ----- > cull: firstArg cull: secondArg cull: thirdArg cull: fourthArg > "Activate the receiver, with four or less arguments." > + "Handle the two argument case primitively" > - > numArgs >= 3 ifTrue: [ > numArgs >= 4 ifTrue: [ > ^self value: firstArg value: secondArg value: thirdArg value: fourthArg ]. > ^self value: firstArg value: secondArg value: thirdArg ]. > numArgs = 2 ifTrue: [ ^self value: firstArg value: secondArg ]. > numArgs = 1 ifTrue: [ ^self value: firstArg ]. > ^self value! > > Item was changed: > ----- Method: BlockClosure>>value (in category 'evaluating') ----- > value > "Activate the receiver, creating a closure activation (Context) > whose closure is the receiver and whose caller is the sender of this > message. Supply the copied values to the activation as its copied > temps. Primitive. Essential." > > - | newContext | > numArgs ~= 0 ifTrue: > [self numArgsError: 0]. > + ^self primitiveFailed! > - false > - ifTrue: "Old code to simulate the closure value primitive on VMs that lack it." > - [newContext := self asContextWithSender: thisContext sender. > - thisContext privSender: newContext] > - ifFalse: [self primitiveFailed]! > > Item was changed: > ----- Method: BlockClosure>>value: (in category 'evaluating') ----- > value: firstArg > "Activate the receiver, creating a closure activation (Context) > whose closure is the receiver and whose caller is the sender of this > message. Supply the argument and copied values to the activation > as its argument and copied temps. Primitive. Essential." > > - | newContext | > numArgs ~= 1 ifTrue: > [self numArgsError: 1]. > + ^self primitiveFailed! > - false > - ifTrue: "Old code to simulate the closure value primitive on VMs that lack it." > - [newContext := self asContextWithSender: thisContext sender. > - newContext at: 1 put: firstArg. > - thisContext privSender: newContext] > - ifFalse: [self primitiveFailed]! > > Item was changed: > ----- Method: BlockClosure>>value:value: (in category 'evaluating') ----- > value: firstArg value: secondArg > "Activate the receiver, creating a closure activation (Context) > whose closure is the receiver and whose caller is the sender of this > message. Supply the arguments and copied values to the activation > as its arguments and copied temps. Primitive. Essential." > > - | newContext | > numArgs ~= 2 ifTrue: > [self numArgsError: 2]. > + ^self primitiveFailed! > - false > - ifTrue: "Old code to simulate the closure value primitive on VMs that lack it." > - [newContext := self asContextWithSender: thisContext sender. > - newContext at: 1 put: firstArg. > - newContext at: 2 put: secondArg. > - thisContext privSender: newContext] > - ifFalse: [self primitiveFailed]! > > Item was changed: > ----- Method: BlockClosure>>value:value:value: (in category 'evaluating') ----- > value: firstArg value: secondArg value: thirdArg > "Activate the receiver, creating a closure activation (Context) > whose closure is the receiver and whose caller is the sender of this > message. Supply the arguments and copied values to the activation > as its arguments and copied temps. Primitive. Essential." > > - | newContext | > numArgs ~= 3 ifTrue: > [self numArgsError: 3]. > + ^self primitiveFailed! > - false > - ifTrue: "Old code to simulate the closure value primitive on VMs that lack it." > - [newContext := self asContextWithSender: thisContext sender. > - newContext at: 1 put: firstArg. > - newContext at: 2 put: secondArg. > - newContext at: 3 put: thirdArg. > - thisContext privSender: newContext] > - ifFalse: [self primitiveFailed]! > > Item was changed: > ----- Method: BlockClosure>>value:value:value:value: (in category 'evaluating') ----- > value: firstArg value: secondArg value: thirdArg value: fourthArg > "Activate the receiver, creating a closure activation (Context) > whose closure is the receiver and whose caller is the sender of this > message. Supply the arguments and copied values to the activation > as its arguments and copied temps. Primitive. Essential." > > - | newContext | > numArgs ~= 4 ifTrue: > [self numArgsError: 4]. > + ^self primitiveFailed! > - false > - ifTrue: "Old code to simulate the closure value primitive on VMs that lack it." > - [newContext := self asContextWithSender: thisContext sender. > - newContext at: 1 put: firstArg. > - newContext at: 2 put: secondArg. > - newContext at: 3 put: thirdArg. > - newContext at: 4 put: fourthArg. > - thisContext privSender: newContext] > - ifFalse: [self primitiveFailed]! > > Item was changed: > ----- Method: BlockClosure>>value:value:value:value:value: (in category 'evaluating') ----- > value: firstArg value: secondArg value: thirdArg value: fourthArg value: fifthArg > "Activate the receiver, creating a closure activation (Context) > whose closure is the receiver and whose caller is the sender of this > message. Supply the arguments and copied values to the activation > as its arguments and copied temps. Primitive. Essential." > > - | newContext | > numArgs ~= 5 ifTrue: > [self numArgsError: 5]. > + ^self primitiveFailed! > - false > - ifTrue: "Old code to simulate the closure value primitive on VMs that lack it." > - [newContext := self asContextWithSender: thisContext sender. > - newContext at: 1 put: firstArg. > - newContext at: 2 put: secondArg. > - newContext at: 3 put: thirdArg. > - newContext at: 4 put: fourthArg. > - newContext at: 5 put: fifthArg. > - thisContext privSender: newContext] > - ifFalse: [self primitiveFailed]! > > Item was changed: > ----- Method: BlockClosure>>valueWithArguments: (in category 'evaluating') ----- > valueWithArguments: anArray > "Activate the receiver, creating a closure activation (Context) > whose closure is the receiver and whose caller is the sender of this > message. Supply the arguments in an anArray and copied values to > the activation as its arguments and copied temps. Primitive. Essential." > > - | newContext | > numArgs ~= anArray size ifTrue: > [self numArgsError: anArray size]. > + ^self primitiveFailed! > - false > - ifTrue: "Old code to simulate the closure value primitive on VMs that lack it." > - [newContext := self asContextWithSender: thisContext sender. > - 1 to: numArgs do: > - [:i| newContext at: i put: (anArray at: i)]. > - thisContext privSender: newContext] > - ifFalse: [self primitiveFailed]! > > Item was added: > + ----- Method: FullBlockClosure>>cull: (in category 'evaluating') ----- > + cull: firstArg > + "Activate the receiver, with one or zero arguments." > + "Handle the one argument case primitively" > + numArgs >= 1 ifTrue: [ ^self value: firstArg ]. > + ^self value! > > Item was added: > + ----- Method: FullBlockClosure>>cull:cull: (in category 'evaluating') ----- > + cull: firstArg cull: secondArg > + "Activate the receiver, with two or less arguments." > + "Handle the two argument case primitively" > + numArgs >= 2 ifTrue: [ ^self value: firstArg value: secondArg ]. > + numArgs = 1 ifTrue: [ ^self value: firstArg ]. > + ^self value! > > Item was added: > + ----- Method: FullBlockClosure>>cull:cull:cull: (in category 'evaluating') ----- > + cull: firstArg cull: secondArg cull: thirdArg > + "Activate the receiver, with three or less arguments." > + "Handle the three argument case primitively" > + numArgs >= 2 ifTrue: > + [numArgs >= 3 ifTrue: > + [^self value: firstArg value: secondArg value: thirdArg]. > + ^self value: firstArg value: secondArg]. > + numArgs = 1 ifTrue: > + [^self value: firstArg]. > + ^self value! > > Item was added: > + ----- Method: FullBlockClosure>>cull:cull:cull:cull: (in category 'evaluating') ----- > + cull: firstArg cull: secondArg cull: thirdArg cull: fourthArg > + "Activate the receiver, with four or less arguments." > + "Handle the four argument case primitively" > + numArgs >= 3 ifTrue: > + [numArgs >= 4 ifTrue: > + [^self value: firstArg value: secondArg value: thirdArg value: fourthArg]. > + ^self value: firstArg value: secondArg value: thirdArg]. > + numArgs = 2 ifTrue: > + [^self value: firstArg value: secondArg]. > + numArgs = 1 ifTrue: > + [^self value: firstArg]. > + ^self value! > > Item was changed: > ----- Method: FullBlockClosure>>value (in category 'evaluating') ----- > value > "Activate the receiver, creating a closure activation (MethodContext) > whose closure is the receiver and whose caller is the sender of this > message. Supply the copied values to the activation as its copied > temps. Primitive. Essential." > > - | newContext | > numArgs ~= 0 ifTrue: > [self numArgsError: 0]. > + ^self primitiveFailed! > - false > - ifTrue: "Old code to simulate the closure value primitive on VMs that lack it." > - [newContext := self asContextWithSender: thisContext sender. > - thisContext privSender: newContext] > - ifFalse: [self primitiveFailed]! > > Item was changed: > ----- Method: FullBlockClosure>>value: (in category 'evaluating') ----- > value: firstArg > "Activate the receiver, creating a closure activation (MethodContext) > whose closure is the receiver and whose caller is the sender of this > message. Supply the argument and copied values to the activation > as its argument and copied temps. Primitive. Essential." > > - | newContext | > numArgs ~= 1 ifTrue: > [self numArgsError: 1]. > + ^self primitiveFailed! > - false > - ifTrue: "Old code to simulate the closure value primitive on VMs that lack it." > - [newContext := self asContextWithSender: thisContext sender. > - newContext at: 1 put: firstArg. > - thisContext privSender: newContext] > - ifFalse: [self primitiveFailed]! > > Item was changed: > ----- Method: FullBlockClosure>>value:value: (in category 'evaluating') ----- > value: firstArg value: secondArg > "Activate the receiver, creating a closure activation (MethodContext) > whose closure is the receiver and whose caller is the sender of this > message. Supply the arguments and copied values to the activation > as its arguments and copied temps. Primitive. Essential." > > - | newContext | > numArgs ~= 2 ifTrue: > [self numArgsError: 2]. > + ^self primitiveFailed! > - false > - ifTrue: "Old code to simulate the closure value primitive on VMs that lack it." > - [newContext := self asContextWithSender: thisContext sender. > - newContext at: 1 put: firstArg. > - newContext at: 2 put: secondArg. > - thisContext privSender: newContext] > - ifFalse: [self primitiveFailed]! > > Item was changed: > ----- Method: FullBlockClosure>>value:value:value: (in category 'evaluating') ----- > value: firstArg value: secondArg value: thirdArg > "Activate the receiver, creating a closure activation (MethodContext) > whose closure is the receiver and whose caller is the sender of this > message. Supply the arguments and copied values to the activation > as its arguments and copied temps. Primitive. Essential." > > - | newContext | > numArgs ~= 3 ifTrue: > [self numArgsError: 3]. > + ^self primitiveFailed! > - false > - ifTrue: "Old code to simulate the closure value primitive on VMs that lack it." > - [newContext := self asContextWithSender: thisContext sender. > - newContext at: 1 put: firstArg. > - newContext at: 2 put: secondArg. > - newContext at: 3 put: thirdArg. > - thisContext privSender: newContext] > - ifFalse: [self primitiveFailed]! > > Item was changed: > ----- Method: FullBlockClosure>>value:value:value:value: (in category 'evaluating') ----- > value: firstArg value: secondArg value: thirdArg value: fourthArg > "Activate the receiver, creating a closure activation (MethodContext) > whose closure is the receiver and whose caller is the sender of this > message. Supply the arguments and copied values to the activation > as its arguments and copied temps. Primitive. Essential." > > - | newContext | > numArgs ~= 4 ifTrue: > [self numArgsError: 4]. > + ^self primitiveFailed! > - false > - ifTrue: "Old code to simulate the closure value primitive on VMs that lack it." > - [newContext := self asContextWithSender: thisContext sender. > - newContext at: 1 put: firstArg. > - newContext at: 2 put: secondArg. > - newContext at: 3 put: thirdArg. > - newContext at: 4 put: fourthArg. > - thisContext privSender: newContext] > - ifFalse: [self primitiveFailed]! > > Item was changed: > ----- Method: FullBlockClosure>>value:value:value:value:value: (in category 'evaluating') ----- > value: firstArg value: secondArg value: thirdArg value: fourthArg value: fifthArg > "Activate the receiver, creating a closure activation (MethodContext) > whose closure is the receiver and whose caller is the sender of this > message. Supply the arguments and copied values to the activation > as its arguments and copied temps. Primitive. Essential." > > - | newContext | > numArgs ~= 5 ifTrue: > [self numArgsError: 5]. > + ^self primitiveFailed! > - false > - ifTrue: "Old code to simulate the closure value primitive on VMs that lack it." > - [newContext := self asContextWithSender: thisContext sender. > - newContext at: 1 put: firstArg. > - newContext at: 2 put: secondArg. > - newContext at: 3 put: thirdArg. > - newContext at: 4 put: fourthArg. > - newContext at: 5 put: fifthArg. > - thisContext privSender: newContext] > - ifFalse: [self primitiveFailed]! > > Item was changed: > ----- Method: FullBlockClosure>>valueWithArguments: (in category 'evaluating') ----- > valueWithArguments: anArray > "Activate the receiver, creating a closure activation (MethodContext) > whose closure is the receiver and whose caller is the sender of this > message. Supply the arguments in an anArray and copied values to > the activation as its arguments and copied temps. Primitive. Essential." > > - | newContext | > numArgs ~= anArray size ifTrue: > [self numArgsError: anArray size]. > + ^self primitiveFailed! > - false > - ifTrue: "Old code to simulate the closure value primitive on VMs that lack it." > - [newContext := self asContextWithSender: thisContext sender. > - 1 to: numArgs do: > - [:i| newContext at: i put: (anArray at: i)]. > - thisContext privSender: newContext] > - ifFalse: [self primitiveFailed]! > > > > -------------- next part -------------- An HTML attachment was scrubbed... URL: From Christoph.Thiede at student.hpi.uni-potsdam.de Thu Oct 29 13:42:36 2020 From: Christoph.Thiede at student.hpi.uni-potsdam.de (Thiede, Christoph) Date: Thu, 29 Oct 2020 13:42:36 +0000 Subject: [squeak-dev] Some labels broke in a recent update In-Reply-To: References: Message-ID: Hi Marcel, this change was introduced via Tools-tpr.1008, but if you unselected and selected a message again, the number was hidden before already. See also: http://forum.world.st/Improving-the-SystemNavigation-browseMessageList-stuff-td5123574.html I guess we cannot show a reliable number if the message trace has multiple levels. Now the display is at least consistent. Hm, should we maybe introduce an edge case in MessageTrace>>windowTitle if the trace has only one level of items? Best, Christoph ________________________________ Von: Squeak-dev im Auftrag von Taeumel, Marcel Gesendet: Donnerstag, 29. Oktober 2020 09:35:07 An: squeak-dev Betreff: [squeak-dev] Some labels broke in a recent update Hi all! Is there a way to get back the number of implementors/senders in the window title? Also the message-search tool has no title: [cid:98b3868d-9439-4ec1-9e6f-332977393d4d] Best, Marcel -------------- next part -------------- An HTML attachment was scrubbed... URL: -------------- next part -------------- A non-text attachment was scrubbed... Name: image.png Type: image/png Size: 244129 bytes Desc: image.png URL: From marcel.taeumel at hpi.de Thu Oct 29 13:55:07 2020 From: marcel.taeumel at hpi.de (Marcel Taeumel) Date: Thu, 29 Oct 2020 14:55:07 +0100 Subject: [squeak-dev] Some labels broke in a recent update In-Reply-To: References: Message-ID: Hi Christoph. I don't use MessageTrace. Always MessageSet. ;-) Best, Marcel Am 29.10.2020 14:42:55 schrieb Thiede, Christoph : Hi Marcel, this change was introduced via Tools-tpr.1008, but if you unselected and selected a message again, the number was hidden before already. See also: http://forum.world.st/Improving-the-SystemNavigation-browseMessageList-stuff-td5123574.html [http://forum.world.st/Improving-the-SystemNavigation-browseMessageList-stuff-td5123574.html] I guess we cannot show a reliable number if the message trace has multiple levels. Now the display is at least consistent. Hm, should we maybe introduce an edge case in MessageTrace>>windowTitle if the trace has only one level of items? Best, Christoph Von: Squeak-dev im Auftrag von Taeumel, Marcel Gesendet: Donnerstag, 29. Oktober 2020 09:35:07 An: squeak-dev Betreff: [squeak-dev] Some labels broke in a recent update   Hi all! Is there a way to get back the number of implementors/senders in the window title? Also the message-search tool has no title: Best, Marcel -------------- next part -------------- An HTML attachment was scrubbed... URL: -------------- next part -------------- A non-text attachment was scrubbed... Name: image.png Type: image/png Size: 244129 bytes Desc: not available URL: From eliot.miranda at gmail.com Thu Oct 29 15:04:04 2020 From: eliot.miranda at gmail.com (Eliot Miranda) Date: Thu, 29 Oct 2020 08:04:04 -0700 Subject: [squeak-dev] Some labels broke in a recent update In-Reply-To: References: Message-ID: <130BDE56-7BAE-433A-AA7C-B9C22E4A959F@gmail.com> > On Oct 29, 2020, at 1:35 AM, Marcel Taeumel wrote: > >  > Hi all! > > Is there a way to get back the number of implementors/senders in the window title? +1 > Also the message-search tool has no title: +1 > Best, > Marcel -------------- next part -------------- An HTML attachment was scrubbed... URL: From commits at source.squeak.org Thu Oct 29 15:49:09 2020 From: commits at source.squeak.org (commits at source.squeak.org) Date: Thu, 29 Oct 2020 15:49:09 0000 Subject: [squeak-dev] The Trunk: EToys-mt.412.mcz Message-ID: Marcel Taeumel uploaded a new version of EToys to project The Trunk: http://source.squeak.org/trunk/EToys-mt.412.mcz ==================== Summary ==================== Name: EToys-mt.412 Author: mt Time: 29 October 2020, 4:49:01.956727 pm UUID: 5e245b54-2a93-154b-83da-9adc8593bac6 Ancestors: EToys-eem.411, EToys-kfr.380 Merges fixes for Mines game and SameGame. Thanks to Karl (kfr)! =============== Diff against EToys-eem.411 =============== Item was changed: AlignmentMorph subclass: #Mines + instanceVariableNames: 'board minesDisplay timeDisplay helpText level levelButton hiScoreDisplay' - instanceVariableNames: 'board minesDisplay timeDisplay helpText' classVariableNames: '' poolDictionaries: '' category: 'Etoys-Squeakland-Morphic-Games'! Item was added: + ----- Method: Mines class>>initialize (in category 'parts bin') ----- + initialize + super initialize. + "boardSizes are column, row, mines, highScore" + BoardSizes := Dictionary new. + BoardSizes at: 1 put:{8. 8. 10. 999. 'Beginner'}. + BoardSizes at: 2 put:{16. 16. 40. 999. 'Intermediate'}. + BoardSizes at: 3 put:{30. 16. 99. 999. 'Expert'}. + + ! Item was added: + ----- Method: Mines>>hiScoreDisplay (in category 'access') ----- + hiScoreDisplay + + ^ hiScoreDisplay! Item was changed: ----- Method: Mines>>initialize (in category 'initialization') ----- initialize "initialize the state of the receiver" + super initialize. + + level := 1. - "" self listDirection: #topToBottom; wrapCentering: #center; cellPositioning: #topCenter; vResizing: #shrinkWrap; hResizing: #shrinkWrap; layoutInset: 3; addMorph: self makeControls; addMorph: self board. helpText := nil. + self newGame! Item was added: + ----- Method: Mines>>level (in category 'access') ----- + level + ^level! Item was changed: ----- Method: Mines>>makeControls (in category 'initialize') ----- makeControls | row | row := AlignmentMorph newRow color: color; borderWidth: 2; layoutInset: 3. row borderStyle: BorderStyle inset. row hResizing: #spaceFill; vResizing: #shrinkWrap; wrapCentering: #center; cellPositioning: #leftCenter; extent: 5 @ 5. row addMorph: (self buildButton: SimpleSwitchMorph new target: self label: ' Help ' translated selector: #help:). row addMorph: (self + buildButton: (levelButton := SimpleButtonMorph new) + target: self + label: level asString translated + selector: #nextLevel). + row + addMorph: (self buildButton: SimpleButtonMorph new target: self label: ' Quit ' translated selector: #delete). "row addMorph: (self buildButton: SimpleButtonMorph new target: self label: ' Hint ' translated selector: #hint)." row addMorph: (self buildButton: SimpleButtonMorph new target: self label: ' New game ' translated selector: #newGame). minesDisplay := LedMorph new digits: 2; extent: 2 * 10 @ 15. row addMorph: (self wrapPanel: minesDisplay label: 'Mines:' translated). + timeDisplay := LedTimerMorph new digits: 3; extent: 3 * 10 @ 15. + - timeDisplay := LedTimerMorph new digits: 3; - extent: 3 * 10 @ 15. row addMorph: (self wrapPanel: timeDisplay label: 'Time:' translated). + hiScoreDisplay := LedMorph new digits: 3; extent: 3 * 10 @ 15. + row + addMorph: (self wrapPanel: hiScoreDisplay label: 'Hi Score:' translated). ^ row! Item was changed: ----- Method: Mines>>newGame (in category 'actions') ----- newGame + | boardSize | + boardSize := BoardSizes at: level. - timeDisplay value: 0; flash: false. timeDisplay stop. timeDisplay reset. + minesDisplay value: (boardSize at: 3). + hiScoreDisplay value: (boardSize at: 4). + levelButton label: (boardSize at: 5) asString. + self board resetBoard: level.! - minesDisplay value: 99. - self board resetBoard.! Item was added: + ----- Method: Mines>>nextLevel (in category 'actions') ----- + nextLevel + level := level + 1. + level = 4 ifTrue:[level := 1]. + self newGame + + ! Item was changed: AlignmentMorph subclass: #MinesBoard + instanceVariableNames: 'protoTile rows columns flashCount tileCount target actionSelector arguments gameStart gameOver boardSize' - instanceVariableNames: 'protoTile rows columns flashCount tileCount target actionSelector arguments gameStart gameOver' classVariableNames: '' poolDictionaries: '' category: 'Etoys-Squeakland-Morphic-Games'! Item was changed: ----- Method: MinesBoard>>initialize (in category 'initialization') ----- initialize "initialize the state of the receiver" super initialize. "" target := nil. actionSelector := #selection. arguments := #(). "" self layoutPolicy: nil; hResizing: #rigid; vResizing: #rigid. "" + boardSize := BoardSizes at: 1. + - rows := self preferredRows. columns := self preferredColumns. + rows := self preferredRows. flashCount := 0. "" self extent: self protoTile extent * (columns @ rows). self adjustTiles. + self resetBoard: 1.! - self resetBoard! Item was changed: ----- Method: MinesBoard>>preferredColumns (in category 'preferences') ----- preferredColumns + ^ boardSize at: 1! - ^ 30! Item was changed: ----- Method: MinesBoard>>preferredMines (in category 'preferences') ----- preferredMines + ^boardSize at:3! - ^ 99! Item was changed: ----- Method: MinesBoard>>preferredRows (in category 'preferences') ----- preferredRows + ^ boardSize at:2! - ^ 16! Item was removed: - ----- Method: MinesBoard>>resetBoard (in category 'initialization') ----- - resetBoard - - gameStart := false. - gameOver := false. - [flashCount = 0] whileFalse: [self step]. - flashCount := 0. - tileCount := 0. - Collection initialize. "randomize the Collection class" - self purgeAllCommands. - self submorphsDo: "set tiles to original state." - [:m | m privateOwner: nil. "Don't propagate all these changes..." - m mineFlag: false. - m disabled: false. - m switchState: false. - m isMine: false. - m privateOwner: self]. - self changed "Now note the change in bulk"! Item was added: + ----- Method: MinesBoard>>resetBoard: (in category 'initialization') ----- + resetBoard: aLevel + + boardSize := BoardSizes at: aLevel. + columns := self preferredColumns. + rows := self preferredRows. + flashCount := 0. + "" + self extent: self protoTile extent * (columns @ rows). + self adjustTiles. + + gameStart := false. + gameOver := false. + + flashCount := 0. + tileCount := 0. + Collection initialize. "randomize the Collection class" + self purgeAllCommands. + self submorphsDo: "set tiles to original state." + [:m | m privateOwner: nil. "Don't propagate all these changes..." + m mineFlag: false. + m disabled: false. + m switchState: false. + m isMine: false. + m privateOwner: self]. + self changed "Now note the change in bulk"! Item was changed: ----- Method: MinesBoard>>stepOnTile: (in category 'actions') ----- stepOnTile: location + | mines tile score | - | mines tile | tile := self tileAt: location. tile mineFlag ifFalse:[ tile isMine ifTrue: [tile color: Color gray darker darker. self blowUp. ^false.] ifFalse:[ mines := self findMines: location. tile switchState: true. tileCount := tileCount + 1. mines = 0 ifTrue: [self selectTilesAdjacentTo: location]]. + tileCount = ((columns*rows) - self preferredMines) ifTrue:[ gameOver := true. flashCount := 2. owner timeDisplay stop. + score := owner timeDisplay value. + ( score < (boardSize at:4)) + ifTrue:[(BoardSizes at: owner level ) at: 4 put: score. + owner hiScoreDisplay value: score]]. - tileCount = ((columns*rows) - self preferredMines) ifTrue:[ gameOver := true. flashCount := 2. owner timeDisplay stop.]. ^ true.] ifTrue: [^ false.] ! From commits at source.squeak.org Thu Oct 29 15:50:00 2020 From: commits at source.squeak.org (commits at source.squeak.org) Date: Thu, 29 Oct 2020 15:50:00 0000 Subject: [squeak-dev] The Trunk: EToys-kfr.380.mcz Message-ID: Marcel Taeumel uploaded a new version of EToys to project The Trunk: http://source.squeak.org/trunk/EToys-kfr.380.mcz ==================== Summary ==================== Name: EToys-kfr.380 Author: kfr Time: 19 January 2020, 7:55:13.092131 pm UUID: e7f6a586-f809-654b-8378-3f41e6d72a5b Ancestors: EToys-kfr.379 SameGameTile borderColor must be updated as well as main tile color. =============== Diff against EToys-dtl.376 =============== Item was changed: AlignmentMorph subclass: #Mines + instanceVariableNames: 'board minesDisplay timeDisplay helpText level levelButton hiScoreDisplay' - instanceVariableNames: 'board minesDisplay timeDisplay helpText' classVariableNames: '' poolDictionaries: '' category: 'Etoys-Squeakland-Morphic-Games'! Item was added: + ----- Method: Mines class>>initialize (in category 'parts bin') ----- + initialize + super initialize. + "boardSizes are column, row, mines, highScore" + BoardSizes := Dictionary new. + BoardSizes at: 1 put:{8. 8. 10. 999. 'Beginner'}. + BoardSizes at: 2 put:{16. 16. 40. 999. 'Intermediate'}. + BoardSizes at: 3 put:{30. 16. 99. 999. 'Expert'}. + + ! Item was added: + ----- Method: Mines>>hiScoreDisplay (in category 'access') ----- + hiScoreDisplay + + ^ hiScoreDisplay! Item was changed: ----- Method: Mines>>initialize (in category 'initialization') ----- initialize "initialize the state of the receiver" + super initialize. + + level := 1. - "" self listDirection: #topToBottom; wrapCentering: #center; cellPositioning: #topCenter; vResizing: #shrinkWrap; hResizing: #shrinkWrap; layoutInset: 3; addMorph: self makeControls; addMorph: self board. helpText := nil. + self newGame! Item was added: + ----- Method: Mines>>level (in category 'access') ----- + level + ^level! Item was changed: ----- Method: Mines>>makeControls (in category 'initialize') ----- makeControls | row | row := AlignmentMorph newRow color: color; borderWidth: 2; layoutInset: 3. row borderStyle: BorderStyle inset. row hResizing: #spaceFill; vResizing: #shrinkWrap; wrapCentering: #center; cellPositioning: #leftCenter; extent: 5 @ 5. row addMorph: (self buildButton: SimpleSwitchMorph new target: self label: ' Help ' translated selector: #help:). row addMorph: (self + buildButton: (levelButton := SimpleButtonMorph new) + target: self + label: level asString translated + selector: #nextLevel). + row + addMorph: (self buildButton: SimpleButtonMorph new target: self label: ' Quit ' translated selector: #delete). "row addMorph: (self buildButton: SimpleButtonMorph new target: self label: ' Hint ' translated selector: #hint)." row addMorph: (self buildButton: SimpleButtonMorph new target: self label: ' New game ' translated selector: #newGame). minesDisplay := LedMorph new digits: 2; extent: 2 * 10 @ 15. row addMorph: (self wrapPanel: minesDisplay label: 'Mines:' translated). + timeDisplay := LedTimerMorph new digits: 3; extent: 3 * 10 @ 15. + - timeDisplay := LedTimerMorph new digits: 3; - extent: 3 * 10 @ 15. row addMorph: (self wrapPanel: timeDisplay label: 'Time:' translated). + hiScoreDisplay := LedMorph new digits: 3; extent: 3 * 10 @ 15. + row + addMorph: (self wrapPanel: hiScoreDisplay label: 'Hi Score:' translated). ^ row! Item was changed: ----- Method: Mines>>newGame (in category 'actions') ----- newGame + | boardSize | + boardSize := BoardSizes at: level. - timeDisplay value: 0; flash: false. timeDisplay stop. timeDisplay reset. + minesDisplay value: (boardSize at: 3). + hiScoreDisplay value: (boardSize at: 4). + levelButton label: (boardSize at: 5) asString. + self board resetBoard: level.! - minesDisplay value: 99. - self board resetBoard.! Item was added: + ----- Method: Mines>>nextLevel (in category 'actions') ----- + nextLevel + level := level + 1. + level = 4 ifTrue:[level := 1]. + self newGame + + ! Item was changed: AlignmentMorph subclass: #MinesBoard + instanceVariableNames: 'protoTile rows columns flashCount tileCount target actionSelector arguments gameStart gameOver boardSize' - instanceVariableNames: 'protoTile rows columns flashCount tileCount target actionSelector arguments gameStart gameOver' classVariableNames: '' poolDictionaries: '' category: 'Etoys-Squeakland-Morphic-Games'! Item was changed: ----- Method: MinesBoard>>initialize (in category 'initialization') ----- initialize "initialize the state of the receiver" super initialize. "" target := nil. actionSelector := #selection. arguments := #(). "" self layoutPolicy: nil; hResizing: #rigid; vResizing: #rigid. "" + boardSize := BoardSizes at: 1. + - rows := self preferredRows. columns := self preferredColumns. + rows := self preferredRows. flashCount := 0. "" self extent: self protoTile extent * (columns @ rows). self adjustTiles. + self resetBoard: 1.! - self resetBoard! Item was changed: ----- Method: MinesBoard>>preferredColumns (in category 'preferences') ----- preferredColumns + ^ boardSize at: 1! - ^ 30! Item was changed: ----- Method: MinesBoard>>preferredMines (in category 'preferences') ----- preferredMines + ^boardSize at:3! - ^ 99! Item was changed: ----- Method: MinesBoard>>preferredRows (in category 'preferences') ----- preferredRows + ^ boardSize at:2! - ^ 16! Item was removed: - ----- Method: MinesBoard>>resetBoard (in category 'initialization') ----- - resetBoard - - gameStart := false. - gameOver := false. - [flashCount = 0] whileFalse: [self step]. - flashCount := 0. - tileCount := 0. - Collection initialize. "randomize the Collection class" - self purgeAllCommands. - self submorphsDo: "set tiles to original state." - [:m | m privateOwner: nil. "Don't propagate all these changes..." - m mineFlag: false. - m disabled: false. - m switchState: false. - m isMine: false. - m privateOwner: self]. - self changed "Now note the change in bulk"! Item was added: + ----- Method: MinesBoard>>resetBoard: (in category 'initialization') ----- + resetBoard: aLevel + + boardSize := BoardSizes at: aLevel. + columns := self preferredColumns. + rows := self preferredRows. + flashCount := 0. + "" + self extent: self protoTile extent * (columns @ rows). + self adjustTiles. + + gameStart := false. + gameOver := false. + + flashCount := 0. + tileCount := 0. + Collection initialize. "randomize the Collection class" + self purgeAllCommands. + self submorphsDo: "set tiles to original state." + [:m | m privateOwner: nil. "Don't propagate all these changes..." + m mineFlag: false. + m disabled: false. + m switchState: false. + m isMine: false. + m privateOwner: self]. + self changed "Now note the change in bulk"! Item was changed: ----- Method: MinesBoard>>stepOnTile: (in category 'actions') ----- stepOnTile: location + | mines tile score | - | mines tile | tile := self tileAt: location. tile mineFlag ifFalse:[ tile isMine ifTrue: [tile color: Color gray darker darker. self blowUp. ^false.] ifFalse:[ mines := self findMines: location. tile switchState: true. tileCount := tileCount + 1. mines = 0 ifTrue: [self selectTilesAdjacentTo: location]]. + tileCount = ((columns*rows) - self preferredMines) ifTrue:[ gameOver := true. flashCount := 2. owner timeDisplay stop. + score := owner timeDisplay value. + ( score < (boardSize at:4)) + ifTrue:[(BoardSizes at: owner level ) at: 4 put: score. + owner hiScoreDisplay value: score]]. - tileCount = ((columns*rows) - self preferredMines) ifTrue:[ gameOver := true. flashCount := 2. owner timeDisplay stop.]. ^ true.] ifTrue: [^ false.] ! Item was changed: ----- Method: SameGameBoard>>removeSelection (in category 'actions') ----- removeSelection selection ifNil: [^ self]. self rememberUndoableAction: [selection + do: [:loc | (self tileAt: loc) setSwitchState: false; disabled: true]. - do: [:loc | (self tileAt: loc) disabled: true; - setSwitchState: false]. self collapseColumns: (selection collect: [:loc | loc x] as: Set) sorted. selection := nil. flash := false. (target notNil and: [actionSelector notNil]) ifTrue: [target perform: actionSelector withArguments: arguments]] named: 'remove selection' translated! Item was changed: ----- Method: SameGameTile>>color: (in category 'accessing') ----- color: aColor super color: aColor. + self borderColor: aColor. onColor := aColor. offColor := aColor. self changed! From commits at source.squeak.org Thu Oct 29 15:50:08 2020 From: commits at source.squeak.org (commits at source.squeak.org) Date: Thu, 29 Oct 2020 15:50:08 0000 Subject: [squeak-dev] The Trunk: EToys-kfr.379.mcz Message-ID: Marcel Taeumel uploaded a new version of EToys to project The Trunk: http://source.squeak.org/trunk/EToys-kfr.379.mcz ==================== Summary ==================== Name: EToys-kfr.379 Author: kfr Time: 19 January 2020, 5:56:35.451611 pm UUID: 4b09cf66-2c5f-2141-a27c-0300ecbef7ae Ancestors: EToys-kfr.378 Fix longstanding visual bug in SameGame. Cascade had wrong order so deselection could not work. =============== Diff against EToys-dtl.376 =============== Item was changed: AlignmentMorph subclass: #Mines + instanceVariableNames: 'board minesDisplay timeDisplay helpText level levelButton hiScoreDisplay' - instanceVariableNames: 'board minesDisplay timeDisplay helpText' classVariableNames: '' poolDictionaries: '' category: 'Etoys-Squeakland-Morphic-Games'! Item was added: + ----- Method: Mines class>>initialize (in category 'parts bin') ----- + initialize + super initialize. + "boardSizes are column, row, mines, highScore" + BoardSizes := Dictionary new. + BoardSizes at: 1 put:{8. 8. 10. 999. 'Beginner'}. + BoardSizes at: 2 put:{16. 16. 40. 999. 'Intermediate'}. + BoardSizes at: 3 put:{30. 16. 99. 999. 'Expert'}. + + ! Item was added: + ----- Method: Mines>>hiScoreDisplay (in category 'access') ----- + hiScoreDisplay + + ^ hiScoreDisplay! Item was changed: ----- Method: Mines>>initialize (in category 'initialization') ----- initialize "initialize the state of the receiver" + super initialize. + + level := 1. - "" self listDirection: #topToBottom; wrapCentering: #center; cellPositioning: #topCenter; vResizing: #shrinkWrap; hResizing: #shrinkWrap; layoutInset: 3; addMorph: self makeControls; addMorph: self board. helpText := nil. + self newGame! Item was added: + ----- Method: Mines>>level (in category 'access') ----- + level + ^level! Item was changed: ----- Method: Mines>>makeControls (in category 'initialize') ----- makeControls | row | row := AlignmentMorph newRow color: color; borderWidth: 2; layoutInset: 3. row borderStyle: BorderStyle inset. row hResizing: #spaceFill; vResizing: #shrinkWrap; wrapCentering: #center; cellPositioning: #leftCenter; extent: 5 @ 5. row addMorph: (self buildButton: SimpleSwitchMorph new target: self label: ' Help ' translated selector: #help:). row addMorph: (self + buildButton: (levelButton := SimpleButtonMorph new) + target: self + label: level asString translated + selector: #nextLevel). + row + addMorph: (self buildButton: SimpleButtonMorph new target: self label: ' Quit ' translated selector: #delete). "row addMorph: (self buildButton: SimpleButtonMorph new target: self label: ' Hint ' translated selector: #hint)." row addMorph: (self buildButton: SimpleButtonMorph new target: self label: ' New game ' translated selector: #newGame). minesDisplay := LedMorph new digits: 2; extent: 2 * 10 @ 15. row addMorph: (self wrapPanel: minesDisplay label: 'Mines:' translated). + timeDisplay := LedTimerMorph new digits: 3; extent: 3 * 10 @ 15. + - timeDisplay := LedTimerMorph new digits: 3; - extent: 3 * 10 @ 15. row addMorph: (self wrapPanel: timeDisplay label: 'Time:' translated). + hiScoreDisplay := LedMorph new digits: 3; extent: 3 * 10 @ 15. + row + addMorph: (self wrapPanel: hiScoreDisplay label: 'Hi Score:' translated). ^ row! Item was changed: ----- Method: Mines>>newGame (in category 'actions') ----- newGame + | boardSize | + boardSize := BoardSizes at: level. - timeDisplay value: 0; flash: false. timeDisplay stop. timeDisplay reset. + minesDisplay value: (boardSize at: 3). + hiScoreDisplay value: (boardSize at: 4). + levelButton label: (boardSize at: 5) asString. + self board resetBoard: level.! - minesDisplay value: 99. - self board resetBoard.! Item was added: + ----- Method: Mines>>nextLevel (in category 'actions') ----- + nextLevel + level := level + 1. + level = 4 ifTrue:[level := 1]. + self newGame + + ! Item was changed: AlignmentMorph subclass: #MinesBoard + instanceVariableNames: 'protoTile rows columns flashCount tileCount target actionSelector arguments gameStart gameOver boardSize' - instanceVariableNames: 'protoTile rows columns flashCount tileCount target actionSelector arguments gameStart gameOver' classVariableNames: '' poolDictionaries: '' category: 'Etoys-Squeakland-Morphic-Games'! Item was changed: ----- Method: MinesBoard>>initialize (in category 'initialization') ----- initialize "initialize the state of the receiver" super initialize. "" target := nil. actionSelector := #selection. arguments := #(). "" self layoutPolicy: nil; hResizing: #rigid; vResizing: #rigid. "" + boardSize := BoardSizes at: 1. + - rows := self preferredRows. columns := self preferredColumns. + rows := self preferredRows. flashCount := 0. "" self extent: self protoTile extent * (columns @ rows). self adjustTiles. + self resetBoard: 1.! - self resetBoard! Item was changed: ----- Method: MinesBoard>>preferredColumns (in category 'preferences') ----- preferredColumns + ^ boardSize at: 1! - ^ 30! Item was changed: ----- Method: MinesBoard>>preferredMines (in category 'preferences') ----- preferredMines + ^boardSize at:3! - ^ 99! Item was changed: ----- Method: MinesBoard>>preferredRows (in category 'preferences') ----- preferredRows + ^ boardSize at:2! - ^ 16! Item was removed: - ----- Method: MinesBoard>>resetBoard (in category 'initialization') ----- - resetBoard - - gameStart := false. - gameOver := false. - [flashCount = 0] whileFalse: [self step]. - flashCount := 0. - tileCount := 0. - Collection initialize. "randomize the Collection class" - self purgeAllCommands. - self submorphsDo: "set tiles to original state." - [:m | m privateOwner: nil. "Don't propagate all these changes..." - m mineFlag: false. - m disabled: false. - m switchState: false. - m isMine: false. - m privateOwner: self]. - self changed "Now note the change in bulk"! Item was added: + ----- Method: MinesBoard>>resetBoard: (in category 'initialization') ----- + resetBoard: aLevel + + boardSize := BoardSizes at: aLevel. + columns := self preferredColumns. + rows := self preferredRows. + flashCount := 0. + "" + self extent: self protoTile extent * (columns @ rows). + self adjustTiles. + + gameStart := false. + gameOver := false. + + flashCount := 0. + tileCount := 0. + Collection initialize. "randomize the Collection class" + self purgeAllCommands. + self submorphsDo: "set tiles to original state." + [:m | m privateOwner: nil. "Don't propagate all these changes..." + m mineFlag: false. + m disabled: false. + m switchState: false. + m isMine: false. + m privateOwner: self]. + self changed "Now note the change in bulk"! Item was changed: ----- Method: MinesBoard>>stepOnTile: (in category 'actions') ----- stepOnTile: location + | mines tile score | - | mines tile | tile := self tileAt: location. tile mineFlag ifFalse:[ tile isMine ifTrue: [tile color: Color gray darker darker. self blowUp. ^false.] ifFalse:[ mines := self findMines: location. tile switchState: true. tileCount := tileCount + 1. mines = 0 ifTrue: [self selectTilesAdjacentTo: location]]. + tileCount = ((columns*rows) - self preferredMines) ifTrue:[ gameOver := true. flashCount := 2. owner timeDisplay stop. + score := owner timeDisplay value. + ( score < (boardSize at:4)) + ifTrue:[(BoardSizes at: owner level ) at: 4 put: score. + owner hiScoreDisplay value: score]]. - tileCount = ((columns*rows) - self preferredMines) ifTrue:[ gameOver := true. flashCount := 2. owner timeDisplay stop.]. ^ true.] ifTrue: [^ false.] ! Item was changed: ----- Method: SameGameBoard>>removeSelection (in category 'actions') ----- removeSelection selection ifNil: [^ self]. self rememberUndoableAction: [selection + do: [:loc | (self tileAt: loc) setSwitchState: false; disabled: true]. - do: [:loc | (self tileAt: loc) disabled: true; - setSwitchState: false]. self collapseColumns: (selection collect: [:loc | loc x] as: Set) sorted. selection := nil. flash := false. (target notNil and: [actionSelector notNil]) ifTrue: [target perform: actionSelector withArguments: arguments]] named: 'remove selection' translated! From commits at source.squeak.org Thu Oct 29 15:50:16 2020 From: commits at source.squeak.org (commits at source.squeak.org) Date: Thu, 29 Oct 2020 15:50:16 0000 Subject: [squeak-dev] The Trunk: EToys-kfr.378.mcz Message-ID: Marcel Taeumel uploaded a new version of EToys to project The Trunk: http://source.squeak.org/trunk/EToys-kfr.378.mcz ==================== Summary ==================== Name: EToys-kfr.378 Author: kfr Time: 18 January 2020, 7:45:20.675611 pm UUID: a01d56e9-8ac1-b544-aa6b-a594e325389e Ancestors: EToys-kfr.377 Refactoring Mines levels and hi score enhancement =============== Diff against EToys-dtl.376 =============== Item was changed: AlignmentMorph subclass: #Mines + instanceVariableNames: 'board minesDisplay timeDisplay helpText level levelButton hiScoreDisplay' - instanceVariableNames: 'board minesDisplay timeDisplay helpText' classVariableNames: '' poolDictionaries: '' category: 'Etoys-Squeakland-Morphic-Games'! Item was added: + ----- Method: Mines class>>initialize (in category 'parts bin') ----- + initialize + super initialize. + "boardSizes are column, row, mines, highScore" + BoardSizes := Dictionary new. + BoardSizes at: 1 put:{8. 8. 10. 999. 'Beginner'}. + BoardSizes at: 2 put:{16. 16. 40. 999. 'Intermediate'}. + BoardSizes at: 3 put:{30. 16. 99. 999. 'Expert'}. + + ! Item was added: + ----- Method: Mines>>hiScoreDisplay (in category 'access') ----- + hiScoreDisplay + + ^ hiScoreDisplay! Item was changed: ----- Method: Mines>>initialize (in category 'initialization') ----- initialize "initialize the state of the receiver" + super initialize. + + level := 1. - "" self listDirection: #topToBottom; wrapCentering: #center; cellPositioning: #topCenter; vResizing: #shrinkWrap; hResizing: #shrinkWrap; layoutInset: 3; addMorph: self makeControls; addMorph: self board. helpText := nil. + self newGame! Item was added: + ----- Method: Mines>>level (in category 'access') ----- + level + ^level! Item was changed: ----- Method: Mines>>makeControls (in category 'initialize') ----- makeControls | row | row := AlignmentMorph newRow color: color; borderWidth: 2; layoutInset: 3. row borderStyle: BorderStyle inset. row hResizing: #spaceFill; vResizing: #shrinkWrap; wrapCentering: #center; cellPositioning: #leftCenter; extent: 5 @ 5. row addMorph: (self buildButton: SimpleSwitchMorph new target: self label: ' Help ' translated selector: #help:). row addMorph: (self + buildButton: (levelButton := SimpleButtonMorph new) + target: self + label: level asString translated + selector: #nextLevel). + row + addMorph: (self buildButton: SimpleButtonMorph new target: self label: ' Quit ' translated selector: #delete). "row addMorph: (self buildButton: SimpleButtonMorph new target: self label: ' Hint ' translated selector: #hint)." row addMorph: (self buildButton: SimpleButtonMorph new target: self label: ' New game ' translated selector: #newGame). minesDisplay := LedMorph new digits: 2; extent: 2 * 10 @ 15. row addMorph: (self wrapPanel: minesDisplay label: 'Mines:' translated). + timeDisplay := LedTimerMorph new digits: 3; extent: 3 * 10 @ 15. + - timeDisplay := LedTimerMorph new digits: 3; - extent: 3 * 10 @ 15. row addMorph: (self wrapPanel: timeDisplay label: 'Time:' translated). + hiScoreDisplay := LedMorph new digits: 3; extent: 3 * 10 @ 15. + row + addMorph: (self wrapPanel: hiScoreDisplay label: 'Hi Score:' translated). ^ row! Item was changed: ----- Method: Mines>>newGame (in category 'actions') ----- newGame + | boardSize | + boardSize := BoardSizes at: level. - timeDisplay value: 0; flash: false. timeDisplay stop. timeDisplay reset. + minesDisplay value: (boardSize at: 3). + hiScoreDisplay value: (boardSize at: 4). + levelButton label: (boardSize at: 5) asString. + self board resetBoard: level.! - minesDisplay value: 99. - self board resetBoard.! Item was added: + ----- Method: Mines>>nextLevel (in category 'actions') ----- + nextLevel + level := level + 1. + level = 4 ifTrue:[level := 1]. + self newGame + + ! Item was changed: AlignmentMorph subclass: #MinesBoard + instanceVariableNames: 'protoTile rows columns flashCount tileCount target actionSelector arguments gameStart gameOver boardSize' - instanceVariableNames: 'protoTile rows columns flashCount tileCount target actionSelector arguments gameStart gameOver' classVariableNames: '' poolDictionaries: '' category: 'Etoys-Squeakland-Morphic-Games'! Item was changed: ----- Method: MinesBoard>>initialize (in category 'initialization') ----- initialize "initialize the state of the receiver" super initialize. "" target := nil. actionSelector := #selection. arguments := #(). "" self layoutPolicy: nil; hResizing: #rigid; vResizing: #rigid. "" + boardSize := BoardSizes at: 1. + - rows := self preferredRows. columns := self preferredColumns. + rows := self preferredRows. flashCount := 0. "" self extent: self protoTile extent * (columns @ rows). self adjustTiles. + self resetBoard: 1.! - self resetBoard! Item was changed: ----- Method: MinesBoard>>preferredColumns (in category 'preferences') ----- preferredColumns + ^ boardSize at: 1! - ^ 30! Item was changed: ----- Method: MinesBoard>>preferredMines (in category 'preferences') ----- preferredMines + ^boardSize at:3! - ^ 99! Item was changed: ----- Method: MinesBoard>>preferredRows (in category 'preferences') ----- preferredRows + ^ boardSize at:2! - ^ 16! Item was removed: - ----- Method: MinesBoard>>resetBoard (in category 'initialization') ----- - resetBoard - - gameStart := false. - gameOver := false. - [flashCount = 0] whileFalse: [self step]. - flashCount := 0. - tileCount := 0. - Collection initialize. "randomize the Collection class" - self purgeAllCommands. - self submorphsDo: "set tiles to original state." - [:m | m privateOwner: nil. "Don't propagate all these changes..." - m mineFlag: false. - m disabled: false. - m switchState: false. - m isMine: false. - m privateOwner: self]. - self changed "Now note the change in bulk"! Item was added: + ----- Method: MinesBoard>>resetBoard: (in category 'initialization') ----- + resetBoard: aLevel + + boardSize := BoardSizes at: aLevel. + columns := self preferredColumns. + rows := self preferredRows. + flashCount := 0. + "" + self extent: self protoTile extent * (columns @ rows). + self adjustTiles. + + gameStart := false. + gameOver := false. + + flashCount := 0. + tileCount := 0. + Collection initialize. "randomize the Collection class" + self purgeAllCommands. + self submorphsDo: "set tiles to original state." + [:m | m privateOwner: nil. "Don't propagate all these changes..." + m mineFlag: false. + m disabled: false. + m switchState: false. + m isMine: false. + m privateOwner: self]. + self changed "Now note the change in bulk"! Item was changed: ----- Method: MinesBoard>>stepOnTile: (in category 'actions') ----- stepOnTile: location + | mines tile score | - | mines tile | tile := self tileAt: location. tile mineFlag ifFalse:[ tile isMine ifTrue: [tile color: Color gray darker darker. self blowUp. ^false.] ifFalse:[ mines := self findMines: location. tile switchState: true. tileCount := tileCount + 1. mines = 0 ifTrue: [self selectTilesAdjacentTo: location]]. + tileCount = ((columns*rows) - self preferredMines) ifTrue:[ gameOver := true. flashCount := 2. owner timeDisplay stop. + score := owner timeDisplay value. + ( score < (boardSize at:4)) + ifTrue:[(BoardSizes at: owner level ) at: 4 put: score. + owner hiScoreDisplay value: score]]. - tileCount = ((columns*rows) - self preferredMines) ifTrue:[ gameOver := true. flashCount := 2. owner timeDisplay stop.]. ^ true.] ifTrue: [^ false.] ! From commits at source.squeak.org Thu Oct 29 15:50:23 2020 From: commits at source.squeak.org (commits at source.squeak.org) Date: Thu, 29 Oct 2020 15:50:23 0000 Subject: [squeak-dev] The Trunk: EToys-kfr.377.mcz Message-ID: Marcel Taeumel uploaded a new version of EToys to project The Trunk: http://source.squeak.org/trunk/EToys-kfr.377.mcz ==================== Summary ==================== Name: EToys-kfr.377 Author: kfr Time: 17 January 2020, 11:11:14.960611 pm UUID: ca9f5e38-21b2-7648-b98d-09fc2644d0c3 Ancestors: EToys-dtl.376 3 different levels and hi score for Mines =============== Diff against EToys-dtl.376 =============== Item was changed: AlignmentMorph subclass: #Mines + instanceVariableNames: 'board minesDisplay timeDisplay helpText level levels levelButton hiScoreDisplay' - instanceVariableNames: 'board minesDisplay timeDisplay helpText' classVariableNames: '' poolDictionaries: '' category: 'Etoys-Squeakland-Morphic-Games'! Item was added: + ----- Method: Mines class>>initialize (in category 'parts bin') ----- + initialize + super initialize. + "boardSizes are column, row, mines, highScore" + BoardSizes := Dictionary new. + BoardSizes at: 'Expert' put:{30. 16. 99. 999}. + BoardSizes at: 'Intermediate' put:{16. 16. 40. 999}. + BoardSizes at: 'Beginner' put:{8. 8. 10. 999}. + + ! Item was added: + ----- Method: Mines>>hiScoreDisplay (in category 'access') ----- + hiScoreDisplay + + ^ hiScoreDisplay! Item was changed: ----- Method: Mines>>initialize (in category 'initialization') ----- initialize "initialize the state of the receiver" + super initialize. + levels := {'Beginner'. 'Intermediate'. 'Expert'}. + level := levels first. - "" self listDirection: #topToBottom; wrapCentering: #center; cellPositioning: #topCenter; vResizing: #shrinkWrap; hResizing: #shrinkWrap; layoutInset: 3; addMorph: self makeControls; addMorph: self board. helpText := nil. + self newGame! Item was added: + ----- Method: Mines>>level (in category 'access') ----- + level + ^level! Item was changed: ----- Method: Mines>>makeControls (in category 'initialize') ----- makeControls | row | row := AlignmentMorph newRow color: color; borderWidth: 2; layoutInset: 3. row borderStyle: BorderStyle inset. row hResizing: #spaceFill; vResizing: #shrinkWrap; wrapCentering: #center; cellPositioning: #leftCenter; extent: 5 @ 5. row addMorph: (self buildButton: SimpleSwitchMorph new target: self label: ' Help ' translated selector: #help:). row addMorph: (self + buildButton: (levelButton := SimpleButtonMorph new) + target: self + label: level asString translated + selector: #nextLevel). + row + addMorph: (self buildButton: SimpleButtonMorph new target: self label: ' Quit ' translated selector: #delete). "row addMorph: (self buildButton: SimpleButtonMorph new target: self label: ' Hint ' translated selector: #hint)." row addMorph: (self buildButton: SimpleButtonMorph new target: self label: ' New game ' translated selector: #newGame). minesDisplay := LedMorph new digits: 2; extent: 2 * 10 @ 15. row addMorph: (self wrapPanel: minesDisplay label: 'Mines:' translated). + timeDisplay := LedTimerMorph new digits: 3; extent: 3 * 10 @ 15. + - timeDisplay := LedTimerMorph new digits: 3; - extent: 3 * 10 @ 15. row addMorph: (self wrapPanel: timeDisplay label: 'Time:' translated). + hiScoreDisplay := LedMorph new digits: 3; extent: 3 * 10 @ 15. + row + addMorph: (self wrapPanel: hiScoreDisplay label: 'Hi Score:' translated). ^ row! Item was changed: ----- Method: Mines>>newGame (in category 'actions') ----- newGame + | boardSize | + boardSize := BoardSizes at: level. - timeDisplay value: 0; flash: false. timeDisplay stop. timeDisplay reset. + minesDisplay value: (boardSize at: 3). + hiScoreDisplay value: (boardSize at: 4). + self board resetBoard: level.! - minesDisplay value: 99. - self board resetBoard.! Item was added: + ----- Method: Mines>>nextLevel (in category 'access') ----- + nextLevel + | nextLevel | + nextLevel := (levels indexOf:level) + 1. + nextLevel = 4 ifTrue:[nextLevel := 1]. + level := levels at:(nextLevel). + levelButton label: level asString. + self newGame + + ! Item was changed: AlignmentMorph subclass: #MinesBoard + instanceVariableNames: 'protoTile rows columns flashCount tileCount target actionSelector arguments gameStart gameOver boardSize' - instanceVariableNames: 'protoTile rows columns flashCount tileCount target actionSelector arguments gameStart gameOver' classVariableNames: '' poolDictionaries: '' category: 'Etoys-Squeakland-Morphic-Games'! Item was changed: ----- Method: MinesBoard>>initialize (in category 'initialization') ----- initialize "initialize the state of the receiver" super initialize. "" target := nil. actionSelector := #selection. arguments := #(). "" self layoutPolicy: nil; hResizing: #rigid; vResizing: #rigid. "" + boardSize := BoardSizes at:'Beginner'. + - rows := self preferredRows. columns := self preferredColumns. + rows := self preferredRows. flashCount := 0. "" self extent: self protoTile extent * (columns @ rows). self adjustTiles. + self resetBoard: 'Beginner'.! - self resetBoard! Item was changed: ----- Method: MinesBoard>>preferredColumns (in category 'preferences') ----- preferredColumns + ^ boardSize at: 1! - ^ 30! Item was changed: ----- Method: MinesBoard>>preferredMines (in category 'preferences') ----- preferredMines + ^boardSize at:3! - ^ 99! Item was changed: ----- Method: MinesBoard>>preferredRows (in category 'preferences') ----- preferredRows + ^ boardSize at:2! - ^ 16! Item was removed: - ----- Method: MinesBoard>>resetBoard (in category 'initialization') ----- - resetBoard - - gameStart := false. - gameOver := false. - [flashCount = 0] whileFalse: [self step]. - flashCount := 0. - tileCount := 0. - Collection initialize. "randomize the Collection class" - self purgeAllCommands. - self submorphsDo: "set tiles to original state." - [:m | m privateOwner: nil. "Don't propagate all these changes..." - m mineFlag: false. - m disabled: false. - m switchState: false. - m isMine: false. - m privateOwner: self]. - self changed "Now note the change in bulk"! Item was added: + ----- Method: MinesBoard>>resetBoard: (in category 'initialization') ----- + resetBoard: aLevel + + boardSize := BoardSizes at: aLevel. + columns := self preferredColumns. + rows := self preferredRows. + flashCount := 0. + "" + self extent: self protoTile extent * (columns @ rows). + self adjustTiles. + + gameStart := false. + gameOver := false. + + flashCount := 0. + tileCount := 0. + Collection initialize. "randomize the Collection class" + self purgeAllCommands. + self submorphsDo: "set tiles to original state." + [:m | m privateOwner: nil. "Don't propagate all these changes..." + m mineFlag: false. + m disabled: false. + m switchState: false. + m isMine: false. + m privateOwner: self]. + self changed "Now note the change in bulk"! Item was changed: ----- Method: MinesBoard>>stepOnTile: (in category 'actions') ----- stepOnTile: location + | mines tile score | - | mines tile | tile := self tileAt: location. tile mineFlag ifFalse:[ tile isMine ifTrue: [tile color: Color gray darker darker. self blowUp. ^false.] ifFalse:[ mines := self findMines: location. tile switchState: true. tileCount := tileCount + 1. mines = 0 ifTrue: [self selectTilesAdjacentTo: location]]. + tileCount = ((columns*rows) - self preferredMines) ifTrue:[ gameOver := true. flashCount := 2. owner timeDisplay stop. + score := owner timeDisplay value. + ( score < (boardSize at:4)) + ifTrue:[(BoardSizes at: owner level ) at: 4 put: score. + owner hiScoreDisplay value: score]]. - tileCount = ((columns*rows) - self preferredMines) ifTrue:[ gameOver := true. flashCount := 2. owner timeDisplay stop.]. ^ true.] ifTrue: [^ false.] ! From ron at usmedrec.com Thu Oct 29 15:50:33 2020 From: ron at usmedrec.com (Ron Teitelbaum) Date: Thu, 29 Oct 2020 11:50:33 -0400 Subject: [squeak-dev] Some labels broke in a recent update In-Reply-To: <130BDE56-7BAE-433A-AA7C-B9C22E4A959F@gmail.com> References: <130BDE56-7BAE-433A-AA7C-B9C22E4A959F@gmail.com> Message-ID: On Thu, Oct 29, 2020 at 11:04 AM Eliot Miranda wrote: > > On Oct 29, 2020, at 1:35 AM, Marcel Taeumel wrote: > >  > Hi all! > > Is there a way to get back the number of implementors/senders in the > window title? > > When "Multi-window browsers" is enabled, could we add a blank line to the window title so that we can drag the window without losing mouse control to the window menu? All the best, Ron Teitelbaum Doing my best to pretend to be a saying from Tim's list > > +1 > > Also the message-search tool has no title: > > > +1 > > Best, > Marcel > > > -------------- next part -------------- An HTML attachment was scrubbed... URL: From eliot.miranda at gmail.com Thu Oct 29 15:54:15 2020 From: eliot.miranda at gmail.com (Eliot Miranda) Date: Thu, 29 Oct 2020 08:54:15 -0700 Subject: [squeak-dev] The Inbox: Kernel-ct.1358.mcz In-Reply-To: References: Message-ID: Hi Christoph, On Wed, Oct 28, 2020 at 3:37 PM wrote: > A new version of Kernel was added to project The Inbox: > http://source.squeak.org/inbox/Kernel-ct.1358.mcz > > ==================== Summary ==================== > > Name: Kernel-ct.1358 > Author: ct > Time: 28 October 2020, 11:37:24.817544 pm > UUID: c9af6acb-61cf-af42-b5fa-3afa8451bb24 > Ancestors: Kernel-mt.1353 > > Fixes a simulation bug that occurs when executing ProtoObject >> > #doesNotUnderstand:. See KernelTests-ct.388. > > =============== Diff against Kernel-mt.1353 =============== > > Item was changed: > ----- Method: Context>>send:to:with:lookupIn: (in category > 'controlling') ----- > send: selector to: rcvr with: arguments lookupIn: lookupClass > "Simulate the action of sending a message with selector and > arguments > to rcvr. The argument, lookupClass, is the class in which to > lookup the > message. This is the receiver's class for normal messages, but > for super > messages it will be some specific class related to the source > method." > > | meth primIndex val ctxt | > (meth := lookupClass lookupSelector: selector) ifNil: > + [selector == #doesNotUnderstand: ifTrue: > + [self error: ('Simulated message {1} not > understood' translated format: {selector})]. > + ^self send: #doesNotUnderstand: > - [^self send: #doesNotUnderstand: > to: rcvr > with: {(Message selector: selector > arguments: arguments) lookupClass: lookupClass} > lookupIn: lookupClass]. > meth numArgs ~= arguments size ifTrue: > [^self error: 'Wrong number of arguments in simulated > message ', selector printString]. > (primIndex := meth primitive) > 0 ifTrue: > [val := self doPrimitive: primIndex method: meth receiver: > rcvr args: arguments. > (self isPrimFailToken: val) ifFalse: > [^val]]. > - (selector == #doesNotUnderstand: and: [lookupClass == > ProtoObject]) ifTrue: > - [^self error: 'Simulated message ', arguments first > selector, ' not understood']. > ctxt := Context sender: self receiver: rcvr method: meth > arguments: arguments. > primIndex > 0 ifTrue: > [ctxt failPrimitiveWith: val]. > ^ctxt! > What's the intent here? Tis seems completely wrong to me. The VM does not raise an error on looking up a message and finding none. It simply sends doesNotUnderstand:. The simulation machinery should mimic this. So raising an error before sending doesNotUnderstand: seems completely wrong to me. -- _,,,^..^,,,_ best, Eliot -------------- next part -------------- An HTML attachment was scrubbed... URL: From eliot.miranda at gmail.com Thu Oct 29 15:55:04 2020 From: eliot.miranda at gmail.com (Eliot Miranda) Date: Thu, 29 Oct 2020 08:55:04 -0700 Subject: [squeak-dev] The Inbox: Kernel-ct.1358.mcz In-Reply-To: References: Message-ID: On Thu, Oct 29, 2020 at 8:54 AM Eliot Miranda wrote: > Hi Christoph, > > On Wed, Oct 28, 2020 at 3:37 PM wrote: > >> A new version of Kernel was added to project The Inbox: >> http://source.squeak.org/inbox/Kernel-ct.1358.mcz >> >> ==================== Summary ==================== >> >> Name: Kernel-ct.1358 >> Author: ct >> Time: 28 October 2020, 11:37:24.817544 pm >> UUID: c9af6acb-61cf-af42-b5fa-3afa8451bb24 >> Ancestors: Kernel-mt.1353 >> >> Fixes a simulation bug that occurs when executing ProtoObject >> >> #doesNotUnderstand:. See KernelTests-ct.388. >> >> =============== Diff against Kernel-mt.1353 =============== >> >> Item was changed: >> ----- Method: Context>>send:to:with:lookupIn: (in category >> 'controlling') ----- >> send: selector to: rcvr with: arguments lookupIn: lookupClass >> "Simulate the action of sending a message with selector and >> arguments >> to rcvr. The argument, lookupClass, is the class in which to >> lookup the >> message. This is the receiver's class for normal messages, but >> for super >> messages it will be some specific class related to the source >> method." >> >> | meth primIndex val ctxt | >> (meth := lookupClass lookupSelector: selector) ifNil: >> + [selector == #doesNotUnderstand: ifTrue: >> + [self error: ('Simulated message {1} not >> understood' translated format: {selector})]. >> + ^self send: #doesNotUnderstand: >> - [^self send: #doesNotUnderstand: >> to: rcvr >> with: {(Message selector: selector >> arguments: arguments) lookupClass: lookupClass} >> lookupIn: lookupClass]. >> meth numArgs ~= arguments size ifTrue: >> [^self error: 'Wrong number of arguments in simulated >> message ', selector printString]. >> (primIndex := meth primitive) > 0 ifTrue: >> [val := self doPrimitive: primIndex method: meth >> receiver: rcvr args: arguments. >> (self isPrimFailToken: val) ifFalse: >> [^val]]. >> - (selector == #doesNotUnderstand: and: [lookupClass == >> ProtoObject]) ifTrue: >> - [^self error: 'Simulated message ', arguments first >> selector, ' not understood']. >> ctxt := Context sender: self receiver: rcvr method: meth >> arguments: arguments. >> primIndex > 0 ifTrue: >> [ctxt failPrimitiveWith: val]. >> ^ctxt! >> > > What's the intent here? Tis seems completely wrong to me. The VM does > not raise an error on looking up a message and finding none. It simply > sends doesNotUnderstand:. The simulation machinery should mimic this. So > raising an error before sending doesNotUnderstand: seems completely wrong > to me. > Oops. Ignore this. Let me try again... _,,,^..^,,,_ best, Eliot -------------- next part -------------- An HTML attachment was scrubbed... URL: From commits at source.squeak.org Thu Oct 29 15:56:03 2020 From: commits at source.squeak.org (commits at source.squeak.org) Date: Thu, 29 Oct 2020 15:56:03 0000 Subject: [squeak-dev] The Trunk: EToys-ct.389.mcz Message-ID: Marcel Taeumel uploaded a new version of EToys to project The Trunk: http://source.squeak.org/trunk/EToys-ct.389.mcz ==================== Summary ==================== Name: EToys-ct.389 Author: xyz Time: 5 April 2020, 9:12:49.970061 pm UUID: 843215f1-865c-2e4b-8c42-484a3f382840 Ancestors: EToys-eem.388 Removes extension methods in deprecated class TextMorphEditor. Complements Squeak-Version-mt.5252. Thanks to Subbu (kks) for the report! =============== Diff against EToys-eem.388 =============== Item was removed: - ----- Method: TextMorphEditor>>select (in category '*Etoys-Squeakland-current selection') ----- - select - "Ignore selection redraw requests."! Item was removed: - ----- Method: TextMorphEditor>>selectionInterval: (in category '*Etoys-Squeakland-private') ----- - selectionInterval: anInterval - "Make my selection span the indicated interval. If the interval extends outside the range of characters of the current text, force it within." - - | mySize | - mySize := paragraph text string size. - self selectFrom: (anInterval start min: mySize) - to: (anInterval stop min: mySize)! From commits at source.squeak.org Thu Oct 29 15:56:21 2020 From: commits at source.squeak.org (commits at source.squeak.org) Date: Thu, 29 Oct 2020 15:56:21 0000 Subject: [squeak-dev] The Trunk: EToys-ct.377.mcz Message-ID: Marcel Taeumel uploaded a new version of EToys to project The Trunk: http://source.squeak.org/trunk/EToys-ct.377.mcz ==================== Summary ==================== Name: EToys-ct.377 Author: ct Time: 13 February 2020, 12:27:22.215118 am UUID: 4d199888-b48f-c345-b111-301883c0ba91 Ancestors: EToys-dtl.376 Remove missspelled extension selector from FilePath. The thing is named #converter: and already located in Files with exactly the same implementation. =============== Diff against EToys-dtl.376 =============== Item was removed: - ----- Method: FilePath>>coverter: (in category '*Etoys-Squeakland-conversion') ----- - coverter: aTextConverter - - converter class ~= aTextConverter class ifTrue: [ - converter := aTextConverter. - vmPathName := squeakPathName convertToWithConverter: converter - ]. - ! From commits at source.squeak.org Thu Oct 29 15:56:33 2020 From: commits at source.squeak.org (commits at source.squeak.org) Date: Thu, 29 Oct 2020 15:56:33 0000 Subject: [squeak-dev] The Trunk: EToys-kks.389.mcz Message-ID: Marcel Taeumel uploaded a new version of EToys to project The Trunk: http://source.squeak.org/trunk/EToys-kks.389.mcz ==================== Summary ==================== Name: EToys-kks.389 Author: kks Time: 6 April 2020, 9:59:20.704434 am UUID: 52884b18-40df-44d6-a2b0-5a02a0ef7724 Ancestors: EToys-eem.388 Fixes error popups while using MonthMorph menu. =============== Diff against EToys-eem.388 =============== Item was changed: ----- Method: MonthMorph>>startMondayOrSundayString (in category 'controls') ----- startMondayOrSundayString + ^((Week startDay = #Monday) ifTrue: ['start Sunday'] ifFalse: ['start Monday']) - ^(Week startDay ifTrue: ['start Sunday'] ifFalse: ['start Monday']) translated! Item was changed: ----- Method: WeekMorph>>selectedDates (in category 'all') ----- selectedDates | answer | answer :=OrderedCollection new. self submorphsDo: [:each | ((each respondsTo: #onColor) and: [each color = each onColor]) ifTrue: [answer add: (Date newDay: each label asNumber + month: week start monthName + year: week start year)]]. - month: week firstDate monthName - year: week firstDate year)]]. ^ answer sort! From eliot.miranda at gmail.com Thu Oct 29 15:56:34 2020 From: eliot.miranda at gmail.com (Eliot Miranda) Date: Thu, 29 Oct 2020 08:56:34 -0700 Subject: [squeak-dev] The Inbox: Kernel-ct.1358.mcz In-Reply-To: References: Message-ID: Hi Christoph, On Wed, Oct 28, 2020 at 3:37 PM wrote: > A new version of Kernel was added to project The Inbox: > http://source.squeak.org/inbox/Kernel-ct.1358.mcz > > ==================== Summary ==================== > > Name: Kernel-ct.1358 > Author: ct > Time: 28 October 2020, 11:37:24.817544 pm > UUID: c9af6acb-61cf-af42-b5fa-3afa8451bb24 > Ancestors: Kernel-mt.1353 > > Fixes a simulation bug that occurs when executing ProtoObject >> > #doesNotUnderstand:. See KernelTests-ct.388. > > =============== Diff against Kernel-mt.1353 =============== > > Item was changed: > ----- Method: Context>>send:to:with:lookupIn: (in category > 'controlling') ----- > send: selector to: rcvr with: arguments lookupIn: lookupClass > "Simulate the action of sending a message with selector and > arguments > to rcvr. The argument, lookupClass, is the class in which to > lookup the > message. This is the receiver's class for normal messages, but > for super > messages it will be some specific class related to the source > method." > > | meth primIndex val ctxt | > (meth := lookupClass lookupSelector: selector) ifNil: > + [selector == #doesNotUnderstand: ifTrue: > + [self error: ('Simulated message {1} not > understood' translated format: {selector})]. > + ^self send: #doesNotUnderstand: > - [^self send: #doesNotUnderstand: > to: rcvr > with: {(Message selector: selector > arguments: arguments) lookupClass: lookupClass} > lookupIn: lookupClass]. > meth numArgs ~= arguments size ifTrue: > [^self error: 'Wrong number of arguments in simulated > message ', selector printString]. > (primIndex := meth primitive) > 0 ifTrue: > [val := self doPrimitive: primIndex method: meth receiver: > rcvr args: arguments. > (self isPrimFailToken: val) ifFalse: > [^val]]. > - (selector == #doesNotUnderstand: and: [lookupClass == > ProtoObject]) ifTrue: > - [^self error: 'Simulated message ', arguments first > selector, ' not understood']. > ctxt := Context sender: self receiver: rcvr method: meth > arguments: arguments. > primIndex > 0 ifTrue: > [ctxt failPrimitiveWith: val]. > ^ctxt! > I think the error should be self error: ('Recursive message not-understood {1}' translated format: {selector}) _,,,^..^,,,_ best, Eliot -------------- next part -------------- An HTML attachment was scrubbed... URL: From commits at source.squeak.org Thu Oct 29 15:57:56 2020 From: commits at source.squeak.org (commits at source.squeak.org) Date: Thu, 29 Oct 2020 15:57:56 0000 Subject: [squeak-dev] The Trunk: EToys-kfr.377.mcz Message-ID: Marcel Taeumel uploaded a new version of EToys to project The Trunk: http://source.squeak.org/trunk/EToys-kfr.377.mcz ==================== Summary ==================== Name: EToys-kfr.377 Author: kfr Time: 17 January 2020, 11:11:14.960611 pm UUID: ca9f5e38-21b2-7648-b98d-09fc2644d0c3 Ancestors: EToys-dtl.376 3 different levels and hi score for Mines =============== Diff against EToys-dtl.376 =============== Item was changed: AlignmentMorph subclass: #Mines + instanceVariableNames: 'board minesDisplay timeDisplay helpText level levels levelButton hiScoreDisplay' - instanceVariableNames: 'board minesDisplay timeDisplay helpText' classVariableNames: '' poolDictionaries: '' category: 'Etoys-Squeakland-Morphic-Games'! Item was added: + ----- Method: Mines class>>initialize (in category 'parts bin') ----- + initialize + super initialize. + "boardSizes are column, row, mines, highScore" + BoardSizes := Dictionary new. + BoardSizes at: 'Expert' put:{30. 16. 99. 999}. + BoardSizes at: 'Intermediate' put:{16. 16. 40. 999}. + BoardSizes at: 'Beginner' put:{8. 8. 10. 999}. + + ! Item was added: + ----- Method: Mines>>hiScoreDisplay (in category 'access') ----- + hiScoreDisplay + + ^ hiScoreDisplay! Item was changed: ----- Method: Mines>>initialize (in category 'initialization') ----- initialize "initialize the state of the receiver" + super initialize. + levels := {'Beginner'. 'Intermediate'. 'Expert'}. + level := levels first. - "" self listDirection: #topToBottom; wrapCentering: #center; cellPositioning: #topCenter; vResizing: #shrinkWrap; hResizing: #shrinkWrap; layoutInset: 3; addMorph: self makeControls; addMorph: self board. helpText := nil. + self newGame! Item was added: + ----- Method: Mines>>level (in category 'access') ----- + level + ^level! Item was changed: ----- Method: Mines>>makeControls (in category 'initialize') ----- makeControls | row | row := AlignmentMorph newRow color: color; borderWidth: 2; layoutInset: 3. row borderStyle: BorderStyle inset. row hResizing: #spaceFill; vResizing: #shrinkWrap; wrapCentering: #center; cellPositioning: #leftCenter; extent: 5 @ 5. row addMorph: (self buildButton: SimpleSwitchMorph new target: self label: ' Help ' translated selector: #help:). row addMorph: (self + buildButton: (levelButton := SimpleButtonMorph new) + target: self + label: level asString translated + selector: #nextLevel). + row + addMorph: (self buildButton: SimpleButtonMorph new target: self label: ' Quit ' translated selector: #delete). "row addMorph: (self buildButton: SimpleButtonMorph new target: self label: ' Hint ' translated selector: #hint)." row addMorph: (self buildButton: SimpleButtonMorph new target: self label: ' New game ' translated selector: #newGame). minesDisplay := LedMorph new digits: 2; extent: 2 * 10 @ 15. row addMorph: (self wrapPanel: minesDisplay label: 'Mines:' translated). + timeDisplay := LedTimerMorph new digits: 3; extent: 3 * 10 @ 15. + - timeDisplay := LedTimerMorph new digits: 3; - extent: 3 * 10 @ 15. row addMorph: (self wrapPanel: timeDisplay label: 'Time:' translated). + hiScoreDisplay := LedMorph new digits: 3; extent: 3 * 10 @ 15. + row + addMorph: (self wrapPanel: hiScoreDisplay label: 'Hi Score:' translated). ^ row! Item was changed: ----- Method: Mines>>newGame (in category 'actions') ----- newGame + | boardSize | + boardSize := BoardSizes at: level. - timeDisplay value: 0; flash: false. timeDisplay stop. timeDisplay reset. + minesDisplay value: (boardSize at: 3). + hiScoreDisplay value: (boardSize at: 4). + self board resetBoard: level.! - minesDisplay value: 99. - self board resetBoard.! Item was added: + ----- Method: Mines>>nextLevel (in category 'access') ----- + nextLevel + | nextLevel | + nextLevel := (levels indexOf:level) + 1. + nextLevel = 4 ifTrue:[nextLevel := 1]. + level := levels at:(nextLevel). + levelButton label: level asString. + self newGame + + ! Item was changed: AlignmentMorph subclass: #MinesBoard + instanceVariableNames: 'protoTile rows columns flashCount tileCount target actionSelector arguments gameStart gameOver boardSize' - instanceVariableNames: 'protoTile rows columns flashCount tileCount target actionSelector arguments gameStart gameOver' classVariableNames: '' poolDictionaries: '' category: 'Etoys-Squeakland-Morphic-Games'! Item was changed: ----- Method: MinesBoard>>initialize (in category 'initialization') ----- initialize "initialize the state of the receiver" super initialize. "" target := nil. actionSelector := #selection. arguments := #(). "" self layoutPolicy: nil; hResizing: #rigid; vResizing: #rigid. "" + boardSize := BoardSizes at:'Beginner'. + - rows := self preferredRows. columns := self preferredColumns. + rows := self preferredRows. flashCount := 0. "" self extent: self protoTile extent * (columns @ rows). self adjustTiles. + self resetBoard: 'Beginner'.! - self resetBoard! Item was changed: ----- Method: MinesBoard>>preferredColumns (in category 'preferences') ----- preferredColumns + ^ boardSize at: 1! - ^ 30! Item was changed: ----- Method: MinesBoard>>preferredMines (in category 'preferences') ----- preferredMines + ^boardSize at:3! - ^ 99! Item was changed: ----- Method: MinesBoard>>preferredRows (in category 'preferences') ----- preferredRows + ^ boardSize at:2! - ^ 16! Item was removed: - ----- Method: MinesBoard>>resetBoard (in category 'initialization') ----- - resetBoard - - gameStart := false. - gameOver := false. - [flashCount = 0] whileFalse: [self step]. - flashCount := 0. - tileCount := 0. - Collection initialize. "randomize the Collection class" - self purgeAllCommands. - self submorphsDo: "set tiles to original state." - [:m | m privateOwner: nil. "Don't propagate all these changes..." - m mineFlag: false. - m disabled: false. - m switchState: false. - m isMine: false. - m privateOwner: self]. - self changed "Now note the change in bulk"! Item was added: + ----- Method: MinesBoard>>resetBoard: (in category 'initialization') ----- + resetBoard: aLevel + + boardSize := BoardSizes at: aLevel. + columns := self preferredColumns. + rows := self preferredRows. + flashCount := 0. + "" + self extent: self protoTile extent * (columns @ rows). + self adjustTiles. + + gameStart := false. + gameOver := false. + + flashCount := 0. + tileCount := 0. + Collection initialize. "randomize the Collection class" + self purgeAllCommands. + self submorphsDo: "set tiles to original state." + [:m | m privateOwner: nil. "Don't propagate all these changes..." + m mineFlag: false. + m disabled: false. + m switchState: false. + m isMine: false. + m privateOwner: self]. + self changed "Now note the change in bulk"! Item was changed: ----- Method: MinesBoard>>stepOnTile: (in category 'actions') ----- stepOnTile: location + | mines tile score | - | mines tile | tile := self tileAt: location. tile mineFlag ifFalse:[ tile isMine ifTrue: [tile color: Color gray darker darker. self blowUp. ^false.] ifFalse:[ mines := self findMines: location. tile switchState: true. tileCount := tileCount + 1. mines = 0 ifTrue: [self selectTilesAdjacentTo: location]]. + tileCount = ((columns*rows) - self preferredMines) ifTrue:[ gameOver := true. flashCount := 2. owner timeDisplay stop. + score := owner timeDisplay value. + ( score < (boardSize at:4)) + ifTrue:[(BoardSizes at: owner level ) at: 4 put: score. + owner hiScoreDisplay value: score]]. - tileCount = ((columns*rows) - self preferredMines) ifTrue:[ gameOver := true. flashCount := 2. owner timeDisplay stop.]. ^ true.] ifTrue: [^ false.] ! From commits at source.squeak.org Thu Oct 29 15:58:14 2020 From: commits at source.squeak.org (commits at source.squeak.org) Date: Thu, 29 Oct 2020 15:58:14 0000 Subject: [squeak-dev] The Trunk: EToys-kfr.378.mcz Message-ID: Marcel Taeumel uploaded a new version of EToys to project The Trunk: http://source.squeak.org/trunk/EToys-kfr.378.mcz ==================== Summary ==================== Name: EToys-kfr.378 Author: kfr Time: 18 January 2020, 7:45:20.675611 pm UUID: a01d56e9-8ac1-b544-aa6b-a594e325389e Ancestors: EToys-kfr.377 Refactoring Mines levels and hi score enhancement =============== Diff against EToys-kfr.377 =============== Item was changed: AlignmentMorph subclass: #Mines + instanceVariableNames: 'board minesDisplay timeDisplay helpText level levelButton hiScoreDisplay' - instanceVariableNames: 'board minesDisplay timeDisplay helpText level levels levelButton hiScoreDisplay' classVariableNames: '' poolDictionaries: '' category: 'Etoys-Squeakland-Morphic-Games'! Item was changed: ----- Method: Mines class>>initialize (in category 'parts bin') ----- initialize super initialize. "boardSizes are column, row, mines, highScore" BoardSizes := Dictionary new. + BoardSizes at: 1 put:{8. 8. 10. 999. 'Beginner'}. + BoardSizes at: 2 put:{16. 16. 40. 999. 'Intermediate'}. + BoardSizes at: 3 put:{30. 16. 99. 999. 'Expert'}. - BoardSizes at: 'Expert' put:{30. 16. 99. 999}. - BoardSizes at: 'Intermediate' put:{16. 16. 40. 999}. - BoardSizes at: 'Beginner' put:{8. 8. 10. 999}. ! Item was changed: ----- Method: Mines>>initialize (in category 'initialization') ----- initialize "initialize the state of the receiver" super initialize. + + level := 1. - levels := {'Beginner'. 'Intermediate'. 'Expert'}. - level := levels first. self listDirection: #topToBottom; wrapCentering: #center; cellPositioning: #topCenter; vResizing: #shrinkWrap; hResizing: #shrinkWrap; layoutInset: 3; addMorph: self makeControls; addMorph: self board. helpText := nil. self newGame! Item was changed: ----- Method: Mines>>newGame (in category 'actions') ----- newGame | boardSize | boardSize := BoardSizes at: level. timeDisplay value: 0; flash: false. timeDisplay stop. timeDisplay reset. minesDisplay value: (boardSize at: 3). hiScoreDisplay value: (boardSize at: 4). + levelButton label: (boardSize at: 5) asString. self board resetBoard: level.! Item was changed: + ----- Method: Mines>>nextLevel (in category 'actions') ----- - ----- Method: Mines>>nextLevel (in category 'access') ----- nextLevel + level := level + 1. + level = 4 ifTrue:[level := 1]. - | nextLevel | - nextLevel := (levels indexOf:level) + 1. - nextLevel = 4 ifTrue:[nextLevel := 1]. - level := levels at:(nextLevel). - levelButton label: level asString. self newGame ! Item was changed: ----- Method: MinesBoard>>initialize (in category 'initialization') ----- initialize "initialize the state of the receiver" super initialize. "" target := nil. actionSelector := #selection. arguments := #(). "" self layoutPolicy: nil; hResizing: #rigid; vResizing: #rigid. "" + boardSize := BoardSizes at: 1. - boardSize := BoardSizes at:'Beginner'. columns := self preferredColumns. rows := self preferredRows. flashCount := 0. "" self extent: self protoTile extent * (columns @ rows). self adjustTiles. + self resetBoard: 1.! - self resetBoard: 'Beginner'.! From commits at source.squeak.org Thu Oct 29 15:58:33 2020 From: commits at source.squeak.org (commits at source.squeak.org) Date: Thu, 29 Oct 2020 15:58:33 0000 Subject: [squeak-dev] The Trunk: EToys-kfr.379.mcz Message-ID: Marcel Taeumel uploaded a new version of EToys to project The Trunk: http://source.squeak.org/trunk/EToys-kfr.379.mcz ==================== Summary ==================== Name: EToys-kfr.379 Author: kfr Time: 19 January 2020, 5:56:35.451611 pm UUID: 4b09cf66-2c5f-2141-a27c-0300ecbef7ae Ancestors: EToys-kfr.378 Fix longstanding visual bug in SameGame. Cascade had wrong order so deselection could not work. =============== Diff against EToys-kfr.378 =============== Item was changed: ----- Method: SameGameBoard>>removeSelection (in category 'actions') ----- removeSelection selection ifNil: [^ self]. self rememberUndoableAction: [selection + do: [:loc | (self tileAt: loc) setSwitchState: false; disabled: true]. - do: [:loc | (self tileAt: loc) disabled: true; - setSwitchState: false]. self collapseColumns: (selection collect: [:loc | loc x] as: Set) sorted. selection := nil. flash := false. (target notNil and: [actionSelector notNil]) ifTrue: [target perform: actionSelector withArguments: arguments]] named: 'remove selection' translated! From commits at source.squeak.org Thu Oct 29 15:58:48 2020 From: commits at source.squeak.org (commits at source.squeak.org) Date: Thu, 29 Oct 2020 15:58:48 0000 Subject: [squeak-dev] The Trunk: EToys-kfr.380.mcz Message-ID: Marcel Taeumel uploaded a new version of EToys to project The Trunk: http://source.squeak.org/trunk/EToys-kfr.380.mcz ==================== Summary ==================== Name: EToys-kfr.380 Author: kfr Time: 19 January 2020, 7:55:13.092131 pm UUID: e7f6a586-f809-654b-8378-3f41e6d72a5b Ancestors: EToys-kfr.379 SameGameTile borderColor must be updated as well as main tile color. =============== Diff against EToys-kfr.379 =============== Item was changed: ----- Method: SameGameTile>>color: (in category 'accessing') ----- color: aColor super color: aColor. + self borderColor: aColor. onColor := aColor. offColor := aColor. self changed! From eliot.miranda at gmail.com Thu Oct 29 15:59:22 2020 From: eliot.miranda at gmail.com (Eliot Miranda) Date: Thu, 29 Oct 2020 08:59:22 -0700 Subject: [squeak-dev] Some labels broke in a recent update In-Reply-To: References: <130BDE56-7BAE-433A-AA7C-B9C22E4A959F@gmail.com> Message-ID: Hi Ron, Hi Marcel, On Thu, Oct 29, 2020 at 8:50 AM Ron Teitelbaum wrote: > > > On Thu, Oct 29, 2020 at 11:04 AM Eliot Miranda > wrote: > >> >> On Oct 29, 2020, at 1:35 AM, Marcel Taeumel >> wrote: >> >>  >> Hi all! >> >> Is there a way to get back the number of implementors/senders in the >> window title? >> >> > When "Multi-window browsers" is enabled, could we add a blank line to the > window title so that we can drag the window without losing mouse control to > the window menu? > There are two things I'd like help with a) restricting the part of the title bar that opens the menu of browser windows/tabs, while keeping the full title string displayed. i.e. clip input but not clip output b) allowing keyboard input so that I can quickly delete entries, select windows with function keys, etc > All the best, > > Ron Teitelbaum > Doing my best to pretend to be a saying from Tim's list > >> >> +1 >> >> Also the message-search tool has no title: >> >> >> +1 >> >> Best, >> Marcel >> >> >> > -- _,,,^..^,,,_ best, Eliot -------------- next part -------------- An HTML attachment was scrubbed... URL: From marcel.taeumel at hpi.de Thu Oct 29 16:05:56 2020 From: marcel.taeumel at hpi.de (Marcel Taeumel) Date: Thu, 29 Oct 2020 17:05:56 +0100 Subject: [squeak-dev] The Inbox: EToys-kfr.412.mcz In-Reply-To: References: <1C318624-9DFB-44DE-A32C-AAB72F753F02@rowledge.org> Message-ID: Hi Karl. > Removed from inbox now Just meant that for contributions to come. ^.^' Sorry for the mix up.  Would you re-upload the contents from: EToys-kfr.413 EToys-kfr.412 EToys-kfr.392 (I managed to merge Etoys-kfr.377 up to 380 from my local package-cache.) Best, Marcel Am 21.10.2020 20:30:28 schrieb karl ramberg : Removed from inbox now Best, Karl On Wed, Oct 21, 2020 at 6:12 PM Marcel Taeumel wrote: Hi Karl, please do not chain unprocessed inbox items in the ancestry. This way, we can never copy over your versions but always have to re-commit your changes method-by-method. Instead, base your changes on the most recent Trunk version. EToys-kfr.413 (inbox) needs kfr.412 (inbox) but is unrelated EToys-kfr.412 (inbox) needs kfr.392 (inbox) and eem.411 (trunk) EToys-kfr.392 (inbox) needs kfr.378 (inbox) and mt.391 (trunk) ... Yes, we will see to merge your EToys contributions ASAP. Thanks! ^__^ Best, Marcel Am 17.10.2020 20:03:09 schrieb tim Rowledge : > On 2020-10-17, at 9:03 AM, commits at source.squeak.org [mailto:commits at source.squeak.org] wrote: > > self world can return nil That is somehow both deeply philosophical and sad tim -- tim Rowledge; tim at rowledge.org [mailto:tim at rowledge.org]; http://www.rowledge.org/tim [http://www.rowledge.org/tim] Useful random insult:- Settled some during shipping and handling. -------------- next part -------------- An HTML attachment was scrubbed... URL: From tim at rowledge.org Thu Oct 29 16:43:37 2020 From: tim at rowledge.org (tim Rowledge) Date: Thu, 29 Oct 2020 09:43:37 -0700 Subject: [squeak-dev] Some labels broke in a recent update In-Reply-To: References: Message-ID: <97A08151-9517-46DF-8431-2929D3F89EFE@rowledge.org> > On 2020-10-29, at 1:35 AM, Marcel Taeumel wrote: > > Hi all! > > Is there a way to get back the number of implementors/senders in the window title? Also the message-search tool has no title: I noted this artefact when I put the update in the inbox. Setting the default selection automatically changes the label to reflect the item selected and thus removes the number. The old code fudged the initial number with a terrible hack that also got the number wrong in some cases. Let's see. I guess in MessageSet one could add the size of the message list to the label and just leave it at that; you don't add items in a MessageSet. In the MessageTrace ... well, what do people want to see here? The total number of initial messages? The number connected to the current selected item? Part of the problem is that the use of a simple list isn't really optimal here, when one has effectively a tree of sends/implements entries. And using the window label to indicate status probably isn't optimal either. tim -- tim Rowledge; tim at rowledge.org; http://www.rowledge.org/tim Strange OpCodes: LINO: Last In, Never Out mode From tim at rowledge.org Thu Oct 29 16:50:28 2020 From: tim at rowledge.org (tim Rowledge) Date: Thu, 29 Oct 2020 09:50:28 -0700 Subject: [squeak-dev] Some labels broke in a recent update In-Reply-To: References: Message-ID: > On 2020-10-29, at 6:55 AM, Marcel Taeumel wrote: > > Hi Christoph. > > I don't use MessageTrace. Always MessageSet. ;-) What's your reason for that? They're less helpful as far as I can see and don't appear to offer any advantage... tim -- tim Rowledge; tim at rowledge.org; http://www.rowledge.org/tim Useful random insult:- Mind like a steel sieve. From javier_diaz_r at mac.com Thu Oct 29 17:32:14 2020 From: javier_diaz_r at mac.com (Javier Diaz-Reinoso) Date: Thu, 29 Oct 2020 12:32:14 -0500 Subject: [squeak-dev] Some labels broke in a recent update In-Reply-To: References: <130BDE56-7BAE-433A-AA7C-B9C22E4A959F@gmail.com> Message-ID: <4192CC1F-8E08-4107-A920-492A09D09B11@mac.com> I say already but repeat here: is better to add an extra visible button to the title bar, no depend of a invisible button, like this: i have a .cs who have a hack to detect the correct site, probably can be better if there was an instance variable who points to the buttons: > On 29 Oct 2020, at 10:59, Eliot Miranda wrote: > > Hi Ron, Hi Marcel, > > On Thu, Oct 29, 2020 at 8:50 AM Ron Teitelbaum > wrote: > > > On Thu, Oct 29, 2020 at 11:04 AM Eliot Miranda > wrote: > >> On Oct 29, 2020, at 1:35 AM, Marcel Taeumel > wrote: >> >>  >> Hi all! >> >> Is there a way to get back the number of implementors/senders in the window title? > > > When "Multi-window browsers" is enabled, could we add a blank line to the window title so that we can drag the window without losing mouse control to the window menu? > > There are two things I'd like help with > a) restricting the part of the title bar that opens the menu of browser windows/tabs, while keeping the full title string displayed. i.e. clip input but not clip output > b) allowing keyboard input so that I can quickly delete entries, select windows with function keys, etc > > > All the best, > > Ron Teitelbaum > Doing my best to pretend to be a saying from Tim's list > -------------- next part -------------- An HTML attachment was scrubbed... URL: -------------- next part -------------- A non-text attachment was scrubbed... Name: button.png Type: image/png Size: 22487 bytes Desc: not available URL: -------------- next part -------------- An HTML attachment was scrubbed... URL: -------------- next part -------------- A non-text attachment was scrubbed... Name: MWB-button.2.cs Type: application/octet-stream Size: 2715 bytes Desc: not available URL: -------------- next part -------------- An HTML attachment was scrubbed... URL: From commits at source.squeak.org Thu Oct 29 18:11:01 2020 From: commits at source.squeak.org (commits at source.squeak.org) Date: Thu, 29 Oct 2020 18:11:01 0000 Subject: [squeak-dev] The Trunk: Tools-tpr.1010.mcz Message-ID: tim Rowledge uploaded a new version of Tools to project The Trunk: http://source.squeak.org/trunk/Tools-tpr.1010.mcz ==================== Summary ==================== Name: Tools-tpr.1010 Author: tpr Time: 29 October 2020, 11:10:57.263788 am UUID: 1ef23108-8885-419e-ad82-66b42e985086 Ancestors: Tools-eem.1009 Fix a bug introduced in Tools-tpr.1008 that made window labels go away in a few cases. =============== Diff against Tools-eem.1009 =============== Item was changed: ----- Method: ChangedMessageSet class>>openMessageList:name:autoSelect:changeSet: (in category 'opening') ----- openMessageList: messageList name: labelString autoSelect: autoSelectString changeSet: aChangeSet | messageSet | messageSet := self messageList: messageList. messageSet changeSet: aChangeSet. + messageSet autoSelectString: autoSelectString; + setInitialLabel: labelString. + ToolBuilder open: messageSet! - messageSet autoSelectString: autoSelectString. - ToolBuilder open: messageSet label: labelString.! Item was changed: ----- Method: MessageNames class>>openMessageNames (in category 'instance creation') ----- openMessageNames "Open a new instance of the receiver in the active world" + ^(ToolBuilder open: self new) model - ^(ToolBuilder open: self new label: 'Message Names') model "MessageNames openMessageNames" ! Item was added: + ----- Method: MessageNames>>windowTitle (in category 'toolbuilder') ----- + windowTitle + + ^ 'Message Names'! Item was changed: ----- Method: MessageSet class>>openMessageList:name: (in category 'instance creation') ----- + openMessageList: messageList name: labelString - openMessageList: anArray name: aString "Create a standard system view for the message set on the list, anArray. The label of the view is aString." + self openMessageList: messageList name: labelString autoSelect: nil! - self open: (self messageList: anArray) name: aString! Item was changed: ----- Method: MessageSet>>windowTitle (in category 'user interface') ----- windowTitle "just return the basic label for now" + ^String streamContents: + [:str| str nextPutAll: windowLabel; + space; + nextPut: $[; + nextPutAll: messageList size asString; + nextPut: $] + ]! - ^windowLabel! From tim at rowledge.org Thu Oct 29 18:13:06 2020 From: tim at rowledge.org (tim Rowledge) Date: Thu, 29 Oct 2020 11:13:06 -0700 Subject: [squeak-dev] Some labels broke in a recent update In-Reply-To: <4192CC1F-8E08-4107-A920-492A09D09B11@mac.com> References: <130BDE56-7BAE-433A-AA7C-B9C22E4A959F@gmail.com> <4192CC1F-8E08-4107-A920-492A09D09B11@mac.com> Message-ID: <5B896E18-934D-47AA-B7B7-060F34DFF013@rowledge.org> Tools-tpr.1010 seems to solve that particular problem with labels disappearing. Or even 'disapproving' as autocorrect would like to put it. tim -- tim Rowledge; tim at rowledge.org; http://www.rowledge.org/tim 'Profanity: the universal programming language' From tim at rowledge.org Thu Oct 29 18:15:12 2020 From: tim at rowledge.org (tim Rowledge) Date: Thu, 29 Oct 2020 11:15:12 -0700 Subject: [squeak-dev] Some labels broke in a recent update In-Reply-To: <4192CC1F-8E08-4107-A920-492A09D09B11@mac.com> References: <130BDE56-7BAE-433A-AA7C-B9C22E4A959F@gmail.com> <4192CC1F-8E08-4107-A920-492A09D09B11@mac.com> Message-ID: <74E09547-5357-40E7-900B-EA5B65185EF0@rowledge.org> > On 2020-10-29, at 10:32 AM, Javier Diaz-Reinoso via Squeak-dev wrote: > > I say already but repeat here: is better to add an extra visible button to the title bar, no depend of a invisible button, like this: > > Given that we already have a window menu (the blue icon with the down arrow) I'm puzzled why that isn't used to handle the multi-window stuff. {Wow - the 'random' sigline machine is on a real tear today} tim -- tim Rowledge; tim at rowledge.org; http://www.rowledge.org/tim Dopeler effect (n): The tendency of stupid ideas to seem smarter when they come at you rapidly. From javier_diaz_r at mac.com Thu Oct 29 18:54:35 2020 From: javier_diaz_r at mac.com (Javier Diaz-Reinoso) Date: Thu, 29 Oct 2020 13:54:35 -0500 Subject: [squeak-dev] Some labels broke in a recent update In-Reply-To: <74E09547-5357-40E7-900B-EA5B65185EF0@rowledge.org> References: <130BDE56-7BAE-433A-AA7C-B9C22E4A959F@gmail.com> <4192CC1F-8E08-4107-A920-492A09D09B11@mac.com> <74E09547-5357-40E7-900B-EA5B65185EF0@rowledge.org> Message-ID: Sorry the correct .cs is: -------------- next part -------------- A non-text attachment was scrubbed... Name: MWB-button.3.cs Type: application/octet-stream Size: 2850 bytes Desc: not available URL: -------------- next part -------------- about the window menu, IMHO is better that this functionality have there own button so is a one click away, the '<=>' can be replace for a better icon, with the down arrow. > On 29 Oct 2020, at 13:15, tim Rowledge wrote: > > > >> On 2020-10-29, at 10:32 AM, Javier Diaz-Reinoso via Squeak-dev wrote: >> >> I say already but repeat here: is better to add an extra visible button to the title bar, no depend of a invisible button, like this: >> >> > > Given that we already have a window menu (the blue icon with the down arrow) I'm puzzled why that isn't used to handle the multi-window stuff. > > {Wow - the 'random' sigline machine is on a real tear today} > > tim > -- > tim Rowledge; tim at rowledge.org; http://www.rowledge.org/tim > Dopeler effect (n): The tendency of stupid ideas to seem smarter when they come at you rapidly. > > > From tim at rowledge.org Thu Oct 29 19:40:50 2020 From: tim at rowledge.org (tim Rowledge) Date: Thu, 29 Oct 2020 12:40:50 -0700 Subject: [squeak-dev] translated considered harmful (in its current implementation) In-Reply-To: References: Message-ID: <5EBF4F78-6BFD-4812-BB70-437A6987F1BD@rowledge.org> Wow. That's some expensive code. Dare I ask why it tries to set a property on a method? Is this a place where A Dreaded Preference might actually be sensible? tim -- tim Rowledge; tim at rowledge.org; http://www.rowledge.org/tim Strange OpCodes: D: Detonate From eliot.miranda at gmail.com Fri Oct 30 04:15:17 2020 From: eliot.miranda at gmail.com (Eliot Miranda) Date: Thu, 29 Oct 2020 21:15:17 -0700 Subject: [squeak-dev] The Trunk: Tools-tpr.1010.mcz In-Reply-To: References: Message-ID: Hi Tim, On Thu, Oct 29, 2020 at 11:11 AM wrote: > tim Rowledge uploaded a new version of Tools to project The Trunk: > http://source.squeak.org/trunk/Tools-tpr.1010.mcz > > ==================== Summary ==================== > > Name: Tools-tpr.1010 > Author: tpr > Time: 29 October 2020, 11:10:57.263788 am > UUID: 1ef23108-8885-419e-ad82-66b42e985086 > Ancestors: Tools-eem.1009 > > Fix a bug introduced in Tools-tpr.1008 that made window labels go away in > a few cases. > Your changes seem to also have broken Recent Changes (don't worry I also broke this at Qwaq before I was aware of it; but now I absolutely depend on it). Go to the changes submenu of the World menu, select "Browse Recent Submissions (R)", and you get a RecentMessageSet with the most recently defined N methods in it. When working properly every new method definition causes the RecentMessageSet to reformulate its list with the new method first most. This is most useful :-) However, after these recent changes it no longer works properly. The new method turns up but somewhere further down the lsut, obscuring it hopelessly. Please fix asap. > =============== Diff against Tools-eem.1009 =============== > > Item was changed: > ----- Method: ChangedMessageSet > class>>openMessageList:name:autoSelect:changeSet: (in category 'opening') > ----- > openMessageList: messageList name: labelString autoSelect: > autoSelectString changeSet: aChangeSet > | messageSet | > messageSet := self messageList: messageList. > messageSet changeSet: aChangeSet. > + messageSet autoSelectString: autoSelectString; > + setInitialLabel: labelString. > + ToolBuilder open: messageSet! > - messageSet autoSelectString: autoSelectString. > - ToolBuilder open: messageSet label: labelString.! > > Item was changed: > ----- Method: MessageNames class>>openMessageNames (in category > 'instance creation') ----- > openMessageNames > "Open a new instance of the receiver in the active world" > + ^(ToolBuilder open: self new) model > - ^(ToolBuilder open: self new label: 'Message Names') model > > "MessageNames openMessageNames" > ! > > Item was added: > + ----- Method: MessageNames>>windowTitle (in category 'toolbuilder') ----- > + windowTitle > + > + ^ 'Message Names'! > > Item was changed: > ----- Method: MessageSet class>>openMessageList:name: (in category > 'instance creation') ----- > + openMessageList: messageList name: labelString > - openMessageList: anArray name: aString > "Create a standard system view for the message set on the list, > anArray. > The label of the view is aString." > > + self openMessageList: messageList name: labelString autoSelect: > nil! > - self open: (self messageList: anArray) name: aString! > > Item was changed: > ----- Method: MessageSet>>windowTitle (in category 'user interface') > ----- > windowTitle > "just return the basic label for now" > > + ^String streamContents: > + [:str| str nextPutAll: windowLabel; > + space; > + nextPut: $[; > + nextPutAll: messageList size > asString; > + nextPut: $] > + ]! > - ^windowLabel! > > > -- _,,,^..^,,,_ best, Eliot -------------- next part -------------- An HTML attachment was scrubbed... URL: From commits at source.squeak.org Fri Oct 30 04:22:02 2020 From: commits at source.squeak.org (commits at source.squeak.org) Date: Fri, 30 Oct 2020 04:22:02 0000 Subject: [squeak-dev] The Trunk: Tools-eem.1011.mcz Message-ID: Eliot Miranda uploaded a new version of Tools to project The Trunk: http://source.squeak.org/trunk/Tools-eem.1011.mcz ==================== Summary ==================== Name: Tools-eem.1011 Author: eem Time: 29 October 2020, 9:22:00.000467 pm UUID: ffdfbc30-2976-4a66-bada-49278510b8ba Ancestors: Tools-tpr.1010 Fix the regression ot Recent Messages in Tools-tpr.1010 =============== Diff against Tools-tpr.1010 =============== Item was added: + ----- Method: RecentMessageSet>>initializeMessageList: (in category 'private') ----- + initializeMessageList: anArray + "Initialize my messageList from the given list of MethodReference or string objects. NB: special handling for uniclasses. + Do /not/ replace the elements of anArray if they are already MethodReferences, so as to allow users to construct richer systems, such as differencers between existing and edited versions of code." + messageList := OrderedCollection new. + anArray do: + [:each | each isMethodReference + ifTrue: [messageList addLast: each] + ifFalse: + [ MessageSet + parse: each + toClassAndSelector: + [ : class : sel | class ifNotNil: [ messageList addLast: (MethodReference class: class selector: sel) ] ] ] ]. + messageListIndex := messageList isEmpty ifTrue: [0] ifFalse: [1]. + contents := String empty! From eliot.miranda at gmail.com Fri Oct 30 04:23:07 2020 From: eliot.miranda at gmail.com (Eliot Miranda) Date: Thu, 29 Oct 2020 21:23:07 -0700 Subject: [squeak-dev] The Trunk: Tools-tpr.1010.mcz In-Reply-To: References: Message-ID: Hi Tim, no worries, fixed it. Your redefinition of initializeMessageList: broke the subclass. I used an older simpler definition in the subclass to restore things to normal. On Thu, Oct 29, 2020 at 9:15 PM Eliot Miranda wrote: > Hi Tim, > > On Thu, Oct 29, 2020 at 11:11 AM wrote: > >> tim Rowledge uploaded a new version of Tools to project The Trunk: >> http://source.squeak.org/trunk/Tools-tpr.1010.mcz >> >> ==================== Summary ==================== >> >> Name: Tools-tpr.1010 >> Author: tpr >> Time: 29 October 2020, 11:10:57.263788 am >> UUID: 1ef23108-8885-419e-ad82-66b42e985086 >> Ancestors: Tools-eem.1009 >> >> Fix a bug introduced in Tools-tpr.1008 that made window labels go away in >> a few cases. >> > > Your changes seem to also have broken Recent Changes (don't worry I also > broke this at Qwaq before I was aware of it; but now I absolutely depend on > it). Go to the changes submenu of the World menu, select "Browse Recent > Submissions (R)", and you get a RecentMessageSet with the most recently > defined N methods in it. When working properly every new method > definition causes the RecentMessageSet to reformulate its list with the new > method first most. This is most useful :-) However, after these recent > changes it no longer works properly. The new method turns up but somewhere > further down the lsut, obscuring it hopelessly. Please fix asap. > > >> =============== Diff against Tools-eem.1009 =============== >> >> Item was changed: >> ----- Method: ChangedMessageSet >> class>>openMessageList:name:autoSelect:changeSet: (in category 'opening') >> ----- >> openMessageList: messageList name: labelString autoSelect: >> autoSelectString changeSet: aChangeSet >> | messageSet | >> messageSet := self messageList: messageList. >> messageSet changeSet: aChangeSet. >> + messageSet autoSelectString: autoSelectString; >> + setInitialLabel: labelString. >> + ToolBuilder open: messageSet! >> - messageSet autoSelectString: autoSelectString. >> - ToolBuilder open: messageSet label: labelString.! >> >> Item was changed: >> ----- Method: MessageNames class>>openMessageNames (in category >> 'instance creation') ----- >> openMessageNames >> "Open a new instance of the receiver in the active world" >> + ^(ToolBuilder open: self new) model >> - ^(ToolBuilder open: self new label: 'Message Names') model >> >> "MessageNames openMessageNames" >> ! >> >> Item was added: >> + ----- Method: MessageNames>>windowTitle (in category 'toolbuilder') >> ----- >> + windowTitle >> + >> + ^ 'Message Names'! >> >> Item was changed: >> ----- Method: MessageSet class>>openMessageList:name: (in category >> 'instance creation') ----- >> + openMessageList: messageList name: labelString >> - openMessageList: anArray name: aString >> "Create a standard system view for the message set on the list, >> anArray. >> The label of the view is aString." >> >> + self openMessageList: messageList name: labelString autoSelect: >> nil! >> - self open: (self messageList: anArray) name: aString! >> >> Item was changed: >> ----- Method: MessageSet>>windowTitle (in category 'user interface') >> ----- >> windowTitle >> "just return the basic label for now" >> >> + ^String streamContents: >> + [:str| str nextPutAll: windowLabel; >> + space; >> + nextPut: $[; >> + nextPutAll: messageList size >> asString; >> + nextPut: $] >> + ]! >> - ^windowLabel! >> >> >> > > -- > _,,,^..^,,,_ > best, Eliot > -- _,,,^..^,,,_ best, Eliot -------------- next part -------------- An HTML attachment was scrubbed... URL: From commits at source.squeak.org Fri Oct 30 14:20:18 2020 From: commits at source.squeak.org (commits at source.squeak.org) Date: Fri, 30 Oct 2020 14:20:18 0000 Subject: [squeak-dev] The Inbox: Services-Base-cmfcmf.69.mcz Message-ID: A new version of Services-Base was added to project The Inbox: http://source.squeak.org/inbox/Services-Base-cmfcmf.69.mcz ==================== Summary ==================== Name: Services-Base-cmfcmf.69 Author: cmfcmf Time: 30 October 2020, 3:19:26.82353 pm UUID: 8f518c2e-77bb-cc40-a4ff-524c896eabc6 Ancestors: Services-Base-jr.68 Indicate instance messages when instance-side reference is browsed. Otherwise the browser may reach an invalid state, where the class button is still selected, even though an instance message is browsed: b := Browser open. b browseReference: (Color >> #asColor) asCodeReference. b browseReference: (Color class >> #green) asCodeReference. b browseReference: (Color >> #asColor) asCodeReference. =============== Diff against Services-Base-jr.68 =============== Item was changed: ----- Method: Browser>>browseReference: (in category '*services-base') ----- browseReference: ref + self okToChange ifTrue: [ self selectCategoryForClass: ref actualClass theNonMetaClass. self selectClass: ref actualClass theNonMetaClass . + ref actualClass isMeta ifTrue: [self indicateClassMessages] ifFalse: [self indicateInstanceMessages]. - ref actualClass isMeta ifTrue: [self indicateClassMessages]. self changed: #classSelectionChanged. self selectMessageCategoryNamed: ref category. self selectedMessageName: ref methodSymbol. ]! From commits at source.squeak.org Fri Oct 30 14:55:55 2020 From: commits at source.squeak.org (commits at source.squeak.org) Date: Fri, 30 Oct 2020 14:55:55 0000 Subject: [squeak-dev] The Trunk: Kernel-eem.1356.mcz Message-ID: Eliot Miranda uploaded a new version of Kernel to project The Trunk: http://source.squeak.org/trunk/Kernel-eem.1356.mcz ==================== Summary ==================== Name: Kernel-eem.1356 Author: eem Time: 30 October 2020, 7:55:52.516141 am UUID: 589e93d6-d597-46f2-a09c-9d646902f1e1 Ancestors: Kernel-eem.1355 selectorJustSentOrSelf (used in process termination) must be able to handle being at the start of a method. =============== Diff against Kernel-eem.1355 =============== Item was changed: ----- Method: InstructionStream>>selectorJustSentOrSelf (in category 'scanning') ----- selectorJustSentOrSelf "If this instruction follows a send, answer the send's selector, otherwise answer self." | method | method := self method. + ^method encoderClass selectorToSendOrItselfFor: self in: method at: (self previousPc ifNil: [^self])! - ^method encoderClass selectorToSendOrItselfFor: self in: method at: self previousPc! From tim at rowledge.org Fri Oct 30 15:09:58 2020 From: tim at rowledge.org (tim Rowledge) Date: Fri, 30 Oct 2020 08:09:58 -0700 Subject: [squeak-dev] The Trunk: Tools-tpr.1010.mcz In-Reply-To: References: Message-ID: <9ACDC418-357B-4D6B-AA18-C743A4CF5F87@rowledge.org> > On 2020-10-29, at 9:23 PM, Eliot Miranda wrote: > > Hi Tim, > > no worries, fixed it. Your redefinition of initializeMessageList: broke the subclass. I used an older simpler definition in the subclass to restore things to normal. OK, I guess that was a case where removing duplicates based on 'merely' the class/message wasn't appropriate. Interesting. And damn, that random sigline again... tim -- tim Rowledge; tim at rowledge.org; http://www.rowledge.org/tim A computer scientist is someone who fixes things that aren't broken. From builds at travis-ci.org Fri Oct 30 15:29:52 2020 From: builds at travis-ci.org (Travis CI) Date: Fri, 30 Oct 2020 15:29:52 +0000 Subject: [squeak-dev] [CRON] Errored: squeak-smalltalk/squeak-app#1875 (squeak-trunk - 25ebaf1) In-Reply-To: Message-ID: <5f9c316f1677e_13fdb9d8c9dcc126011@travis-tasks-5b8944c9b8-tddxr.mail> Build Update for squeak-smalltalk/squeak-app ------------------------------------- Build: #1875 Status: Errored Duration: 20 mins and 30 secs Commit: 25ebaf1 (squeak-trunk) Author: Marcel Taeumel Message: Hi all! The project "squeak-app" is part of the continuous build infrastructure (short: CI) for Squeak's bundles, which you can download at https://files.squeak.org/, followed by the version tag you are looking for. All bundles are updated on a regular basis, which is daily for Trunk (i.e. the current alpha version) and monthly for release versions. Note that there won't be new bundles if Squeak's build number, which reflects in-image code updates, did not change between CI jobs. -- The Squeak Oversight Board [ci skip] View the changeset: https://github.com/squeak-smalltalk/squeak-app/compare/fb55517f583fe544f9225413a23fe82a680200c2...25ebaf18249322227da1f7c767384cb35082fab7 View the full build log and details: https://travis-ci.org/github/squeak-smalltalk/squeak-app/builds/740213070?utm_medium=notification&utm_source=email -- You can unsubscribe from build emails from the squeak-smalltalk/squeak-app repository going to https://travis-ci.org/account/preferences/unsubscribe?repository=8901856&utm_medium=notification&utm_source=email. Or unsubscribe from *all* email updating your settings at https://travis-ci.org/account/preferences/unsubscribe?utm_medium=notification&utm_source=email. Or configure specific recipients for build notifications in your .travis.yml file. See https://docs.travis-ci.com/user/notifications. -------------- next part -------------- An HTML attachment was scrubbed... URL: From Christoph.Thiede at student.hpi.uni-potsdam.de Fri Oct 30 15:55:51 2020 From: Christoph.Thiede at student.hpi.uni-potsdam.de (Thiede, Christoph) Date: Fri, 30 Oct 2020 15:55:51 +0000 Subject: [squeak-dev] [CRON] Errored: squeak-smalltalk/squeak-app#1875 (squeak-trunk - 25ebaf1) In-Reply-To: <5f9c316f1677e_13fdb9d8c9dcc126011@travis-tasks-5b8944c9b8-tddxr.mail> References: , <5f9c316f1677e_13fdb9d8c9dcc126011@travis-tasks-5b8944c9b8-tddxr.mail> Message-ID: <96caa48a4152422e8230f9f450bd7f17@student.hpi.uni-potsdam.de> Interesting, this time the build hung up during the release building ... Can we use CommandLineToolSet for explaining these issues? Best, Christoph ________________________________ Von: Squeak-dev im Auftrag von Travis CI Gesendet: Freitag, 30. Oktober 2020 16:29:52 An: squeak-dev at lists.squeakfoundation.org Betreff: [squeak-dev] [CRON] Errored: squeak-smalltalk/squeak-app#1875 (squeak-trunk - 25ebaf1) squeak-smalltalk / squeak-app [branch icon]squeak-trunk [build has errored] Build #1875 has errored [arrow to build time] [clock icon]20 mins and 30 secs [Marcel Taeumel avatar]Marcel Taeumel 25ebaf1 CHANGESET → Hi all! The project "squeak-app" is part of the continuous build infrastructure (short: CI) for Squeak's bundles, which you can download at https://files.squeak.org/, followed by the version tag you are looking for. All bundles are updated on a regular basis, which is daily for Trunk (i.e. the current alpha version) and monthly for release versions. Note that there won't be new bundles if Squeak's build number, which reflects in-image code updates, did not change between CI jobs. -- The Squeak Oversight Board [ci skip] Want to know about upcoming build environment updates? Would you like to stay up-to-date with the upcoming Travis CI build environment updates? We set up a mailing list for you! SIGN UP HERE [book icon] Documentation about Travis CI Have any questions? We're here to help. Unsubscribe from build emails from the squeak-smalltalk/squeak-app repository. To unsubscribe from all build emails, please update your settings. [black and white travis ci logo] Travis CI GmbH, Rigaer Str. 8, 10427 Berlin, Germany | GF/CEO: Randy Jacops | Contact: contact at travis-ci.com | Amtsgericht Charlottenburg, Berlin, HRB 140133 B | Umsatzsteuer-ID gemäß §27 a Umsatzsteuergesetz: DE282002648 -------------- next part -------------- An HTML attachment was scrubbed... URL: From commits at source.squeak.org Fri Oct 30 16:43:58 2020 From: commits at source.squeak.org (commits at source.squeak.org) Date: Fri, 30 Oct 2020 16:43:58 0000 Subject: [squeak-dev] The Trunk: Tools-mt.1012.mcz Message-ID: Marcel Taeumel uploaded a new version of Tools to project The Trunk: http://source.squeak.org/trunk/Tools-mt.1012.mcz ==================== Summary ==================== Name: Tools-mt.1012 Author: mt Time: 30 October 2020, 5:43:57.205709 pm UUID: 4d5b840d-943d-2e4a-ba5d-35d6a4c3aaff Ancestors: Tools-eem.1011 Speed up updates in inspectors -- and thus debuggers --, which results in a quicker response when clicking "step into/over/through" many times in a row. Removes last traces of polling updates in debugger, which is not needed because of how #updateInspectors is used there. Also fixes a bug with "step through", which was not updating both inspectors correctly. =============== Diff against Tools-eem.1011 =============== Item was changed: ----- Method: BasicInspector>>streamInstanceVariablesOn: (in category 'fields - streaming') ----- streamInstanceVariablesOn: aStream + | attributesForInstVars | + attributesForInstVars := (UserInterfaceTheme current get: #instVar for: #SHTextStylerST80) ifNil: [#()]. + (thisContext objectClass: self object) allInstVarNames withIndexDo: [:name :index | aStream nextPut: ((self newFieldForType: #instVar key: name) + name: name; styleName: attributesForInstVars; - name: name asString; - shouldStyleName: true; valueGetter: [:object | thisContext object: object instVarAt: index]; valueGetterExpression: ('thisContext object: {1} instVarAt: {2}' format: { 'self'. index }); valueSetter: [:object :value | thisContext object: object instVarAt: index put: value]; yourself)].! Item was removed: - ----- Method: Debugger>>step (in category 'stepping - morphic') ----- - step - "Update the inspectors." - - receiverInspector ifNotNil: [receiverInspector step]. - contextVariablesInspector ifNotNil: [contextVariablesInspector step]. - ! Item was changed: ----- Method: Debugger>>stepIntoBlock (in category 'context stack menu') ----- stepIntoBlock "Send messages until you return to the present method context. Used to step into a block in the method." + | currentContext newContext | + self okToChange ifFalse: [^ self]. + self checkContextSelection. + currentContext := self selectedContext. self handleLabelUpdatesIn: + [interruptedProcess stepToHome: currentContext] - [interruptedProcess stepToHome: self selectedContext] whenExecuting: self selectedContext. + newContext := interruptedProcess stepToSendOrReturn. + self contextStackIndex > 1 + ifTrue: [self resetContext: newContext] + ifFalse: + [newContext == currentContext + ifTrue: [self changed: #contentsSelection. + self updateInspectors] + ifFalse: [self resetContext: newContext]].! - self resetContext: interruptedProcess stepToSendOrReturn! Item was removed: - ----- Method: Debugger>>updateCodePaneIfNeeded (in category 'self-updating') ----- - updateCodePaneIfNeeded - "Ignore. We must not update code but stick to particular compiled methods on the stack."! Item was changed: + ----- Method: Debugger>>updateInspectors (in category 'self-updating') ----- - ----- Method: Debugger>>updateInspectors (in category 'stepping - morphic') ----- updateInspectors "Update the inspectors on the receiver's variables." receiverInspector == nil ifFalse: [receiverInspector update]. contextVariablesInspector == nil ifFalse: [contextVariablesInspector update]! Item was removed: - ----- Method: Debugger>>wantsSteps (in category 'stepping - morphic') ----- - wantsSteps - - ^ true! Item was added: + ----- Method: Debugger>>wantsStepsIn: (in category 'self-updating') ----- + wantsStepsIn: aWindow + + ^ false! Item was changed: ----- Method: Inspector>>fieldSelf (in category 'fields') ----- fieldSelf ^ (self newFieldForType: #self key: #self) + name: 'self'; styleName: ((UserInterfaceTheme current get: #self for: #SHTextStylerST80) ifNil: [#()]); - shouldStyleName: true; valueGetter: [:object | object]; valueSetter: [:object :value | self object: value]; "Switch to another object-under-inspection." yourself! Item was changed: ----- Method: Inspector>>streamInstanceVariablesOn: (in category 'fields - streaming') ----- streamInstanceVariablesOn: aStream + | attributesForInstVars | + attributesForInstVars := (UserInterfaceTheme current get: #instVar for: #SHTextStylerST80) ifNil: [#()]. + (self object perform: #class "do not inline send of #class, receiver could be a proxy") allInstVarNames withIndexDo: [:name :index | aStream nextPut: ((self newFieldForType: #instVar key: name) + name: name; styleName: attributesForInstVars; - shouldStyleName: true; valueGetter: [:object | object instVarNamed: name]; valueSetter: [:object :value | object instVarNamed: name put: value]; yourself)].! Item was changed: ----- Method: Inspector>>textColorForError (in category 'user interface') ----- textColorForError + ^ TextColor color: ((UserInterfaceTheme current get: #errorColor for: #TestRunner) ifNil: [Color red])! - ^ TextColor color: ((self userInterfaceTheme get: #errorColor for: #TestRunner) ifNil: [Color red])! Item was changed: ----- Method: InspectorField>>deEmphasizeName (in category 'initialization') ----- deEmphasizeName self flag: #hardcoded. + self styleName: + {TextColor color: + ((UserInterfaceTheme current get: #balloonTextColor for: #PluggableTextMorphPlus) + ifNil: [Color gray])}.! - self name: (self name asText - addAttribute: (TextColor color: (self userInterfaceTheme get: #balloonTextColor for: #PluggableTextMorphPlus)); - yourself).! Item was changed: ----- Method: InspectorField>>emphasizeName (in category 'initialization') ----- emphasizeName - | regularEmphasis customEmphasis | - self flag: #hardcoded. + self styleName: { + self isCustom + ifFalse: [TextEmphasis italic] + ifTrue: [TextColor color: + ((UserInterfaceTheme current get: #highlightTextColor for: #SimpleHierarchicalListMorph) + ifNil: [Color red])]}! - regularEmphasis := TextEmphasis italic. - customEmphasis := TextColor color: ((self userInterfaceTheme get: #highlightTextColor for: #SimpleHierarchicalListMorph) ifNil: [Color red]). - - self name: (self name asText - addAttribute: (self isCustom ifTrue: [customEmphasis] ifFalse: [regularEmphasis]); - yourself).! Item was added: + ----- Method: InspectorField>>styleName: (in category 'initialization') ----- + styleName: someTextAttributesOrColors + + self name: (self name asText + addAllAttributes: (someTextAttributesOrColors + collect: [:ea | ea isColor ifTrue: [TextColor color: ea] ifFalse: [ea]]); + yourself).! From commits at source.squeak.org Fri Oct 30 17:39:03 2020 From: commits at source.squeak.org (commits at source.squeak.org) Date: Fri, 30 Oct 2020 17:39:03 0000 Subject: [squeak-dev] The Trunk: Tools-mt.1013.mcz Message-ID: Marcel Taeumel uploaded a new version of Tools to project The Trunk: http://source.squeak.org/trunk/Tools-mt.1013.mcz ==================== Summary ==================== Name: Tools-mt.1013 Author: mt Time: 30 October 2020, 6:39:01.425754 pm UUID: 3fca46e0-aeec-d443-a197-80a731362fdb Ancestors: Tools-mt.1012 Fixes strange init bug that was triggered through "ReleaseBuilder prepareEnvironment": windowLabel was nil for the RecentMessageSet. Might be related to that recent reset of all pragma preferences plus the changes in MessageSet labels. =============== Diff against Tools-mt.1012 =============== Item was changed: ----- Method: MessageSet>>initialize (in category 'initialize-release') ----- initialize + super initialize. + + messageList := OrderedCollection new. + windowLabel := ''.! - messageList := OrderedCollection new.! From marcel.taeumel at hpi.de Fri Oct 30 17:39:35 2020 From: marcel.taeumel at hpi.de (Marcel Taeumel) Date: Fri, 30 Oct 2020 18:39:35 +0100 Subject: [squeak-dev] [CRON] Errored: squeak-smalltalk/squeak-app#1875 (squeak-trunk - 25ebaf1) In-Reply-To: <96caa48a4152422e8230f9f450bd7f17@student.hpi.uni-potsdam.de> References: <,> <5f9c316f1677e_13fdb9d8c9dcc126011@travis-tasks-5b8944c9b8-tddxr.mail> <96caa48a4152422e8230f9f450bd7f17@student.hpi.uni-potsdam.de> Message-ID: "ReleaseBuilder prepareEnvironment" revealed the bug. Fixed in Tools-mt.1013. Best, Marcel Am 30.10.2020 16:56:04 schrieb Thiede, Christoph : Interesting, this time the build hung up during the release building ... Can we use CommandLineToolSet for explaining these issues? Best, Christoph [http://www.hpi.de/] Von: Squeak-dev im Auftrag von Travis CI Gesendet: Freitag, 30. Oktober 2020 16:29:52 An: squeak-dev at lists.squeakfoundation.org Betreff: [squeak-dev] [CRON] Errored: squeak-smalltalk/squeak-app#1875 (squeak-trunk - 25ebaf1)   squeak-smalltalk / squeak-app [https://travis-ci.org/github/squeak-smalltalk/squeak-app?utm_medium=notification&utm_source=email] [branch icon]squeak-trunk [https://github.com/squeak-smalltalk/squeak-app/tree/squeak-trunk] [build has errored] Build #1875 has errored [https://travis-ci.org/github/squeak-smalltalk/squeak-app/builds/740213070?utm_medium=notification&utm_source=email] [arrow to build time] [clock icon]20 mins and 30 secs [Marcel Taeumel avatar]Marcel Taeumel 25ebaf1 CHANGESET → [https://github.com/squeak-smalltalk/squeak-app/compare/fb55517f583fe544f9225413a23fe82a680200c2...25ebaf18249322227da1f7c767384cb35082fab7] Hi all! The project "squeak-app" is part of the continuous build infrastructure (short: CI) for Squeak's bundles, which you can download at https://files.squeak.org/, followed by the version tag you are looking for. All bundles are updated on a regular basis, which is daily for Trunk (i.e. the current alpha version) and monthly for release versions. Note that there won't be new bundles if Squeak's build number, which reflects in-image code updates, did not change between CI jobs. -- The Squeak Oversight Board [ci skip] Want to know about upcoming build environment updates? Would you like to stay up-to-date with the upcoming Travis CI build environment updates? We set up a mailing list for you! SIGN UP HERE [http://eepurl.com/9OCsP] [book icon] Documentation [https://docs.travis-ci.com/] about Travis CI Have any questions? We're here to help. [mailto:support at travis-ci.com] Unsubscribe [https://travis-ci.org/account/preferences/unsubscribe?repository=8901856&utm_medium=notification&utm_source=email] from build emails from the squeak-smalltalk/squeak-app repository. To unsubscribe from all build emails, please update your settings [https://travis-ci.org/account/preferences/unsubscribe?utm_medium=notification&utm_source=email]. [black and white travis ci logo] [https://travis-ci.com] Travis CI GmbH, Rigaer Str. 8, 10427 Berlin, Germany | GF/CEO: Randy Jacops | Contact: contact at travis-ci.com [mailto:contact at travis-ci.com] | Amtsgericht Charlottenburg, Berlin, HRB 140133 B | Umsatzsteuer-ID gemäß §27 a Umsatzsteuergesetz: DE282002648 -------------- next part -------------- An HTML attachment was scrubbed... URL: From builds at travis-ci.org Fri Oct 30 17:59:32 2020 From: builds at travis-ci.org (Travis CI) Date: Fri, 30 Oct 2020 17:59:32 +0000 Subject: [squeak-dev] Passed: squeak-smalltalk/squeak-app#1876 (squeak-trunk - 25ebaf1) In-Reply-To: Message-ID: <5f9c5483aa97f_13f947dab22e0739a8@travis-tasks-6fb9848fc6-9knhw.mail> Build Update for squeak-smalltalk/squeak-app ------------------------------------- Build: #1876 Status: Passed Duration: 15 mins and 4 secs Commit: 25ebaf1 (squeak-trunk) Author: Marcel Taeumel Message: Fixes bug in MessageSet windowLabel. View the changeset: https://github.com/squeak-smalltalk/squeak-app/compare/fb55517f583fe544f9225413a23fe82a680200c2...25ebaf18249322227da1f7c767384cb35082fab7 View the full build log and details: https://travis-ci.org/github/squeak-smalltalk/squeak-app/builds/740259380?utm_medium=notification&utm_source=email -- You can unsubscribe from build emails from the squeak-smalltalk/squeak-app repository going to https://travis-ci.org/account/preferences/unsubscribe?repository=8901856&utm_medium=notification&utm_source=email. Or unsubscribe from *all* email updating your settings at https://travis-ci.org/account/preferences/unsubscribe?utm_medium=notification&utm_source=email. Or configure specific recipients for build notifications in your .travis.yml file. See https://docs.travis-ci.com/user/notifications. -------------- next part -------------- An HTML attachment was scrubbed... URL: From karlramberg at gmail.com Fri Oct 30 18:04:02 2020 From: karlramberg at gmail.com (karl ramberg) Date: Fri, 30 Oct 2020 19:04:02 +0100 Subject: [squeak-dev] The Inbox: EToys-kfr.412.mcz In-Reply-To: References: <1C318624-9DFB-44DE-A32C-AAB72F753F02@rowledge.org> Message-ID: Cool. I'll revise the other changes once I have time. I'm not sure where in ReleaseBuilder to hook up the initialization of the Etoy icons. Any suggestions? Best, Karl On Thu, Oct 29, 2020 at 5:06 PM Marcel Taeumel wrote: > Hi Karl. > > > Removed from inbox now > > Just meant that for contributions to come. ^.^' Sorry for the mix up. > > Would you re-upload the contents from: > > EToys-kfr.413 > EToys-kfr.412 > EToys-kfr.392 > > (I managed to merge Etoys-kfr.377 up to 380 from my local package-cache.) > > Best, > Marcel > > Am 21.10.2020 20:30:28 schrieb karl ramberg : > Removed from inbox now > > Best, > Karl > > On Wed, Oct 21, 2020 at 6:12 PM Marcel Taeumel > wrote: > >> Hi Karl, >> >> please do not chain unprocessed inbox items in the ancestry. This way, we >> can never copy over your versions but always have to re-commit your changes >> method-by-method. Instead, base your changes on the most recent Trunk >> version. >> >> EToys-kfr.413 (inbox) needs kfr.412 (inbox) but is unrelated >> EToys-kfr.412 (inbox) needs kfr.392 (inbox) and eem.411 (trunk) >> EToys-kfr.392 (inbox) needs kfr.378 (inbox) and mt.391 (trunk) >> ... >> >> Yes, we will see to merge your EToys contributions ASAP. Thanks! ^__^ >> >> Best, >> Marcel >> >> Am 17.10.2020 20:03:09 schrieb tim Rowledge : >> >> >> > On 2020-10-17, at 9:03 AM, commits at source.squeak.org wrote: >> > >> > self world can return nil >> >> That is somehow both deeply philosophical and sad >> >> tim >> -- >> tim Rowledge; tim at rowledge.org; http://www.rowledge.org/tim >> Useful random insult:- Settled some during shipping and handling. >> >> >> >> >> > -------------- next part -------------- An HTML attachment was scrubbed... URL: From marcel.taeumel at hpi.de Fri Oct 30 18:07:26 2020 From: marcel.taeumel at hpi.de (Marcel Taeumel) Date: Fri, 30 Oct 2020 19:07:26 +0100 Subject: [squeak-dev] The Inbox: EToys-kfr.412.mcz In-Reply-To: References: <1C318624-9DFB-44DE-A32C-AAB72F753F02@rowledge.org> Message-ID: > I'm not sure where in ReleaseBuilder to hook up the initialization of the Etoy icons. Any suggestions? You mean after or even before calling "ReleaseBuilderSqueakland setEtoysMode"? Best, Marcel Am 30.10.2020 19:04:25 schrieb karl ramberg : Cool. I'll revise the other changes once I have time. I'm not sure where in ReleaseBuilder to hook up the initialization of the Etoy icons. Any suggestions? Best, Karl On Thu, Oct 29, 2020 at 5:06 PM Marcel Taeumel wrote: Hi Karl. > Removed from inbox now Just meant that for contributions to come. ^.^' Sorry for the mix up.  Would you re-upload the contents from: EToys-kfr.413 EToys-kfr.412 EToys-kfr.392 (I managed to merge Etoys-kfr.377 up to 380 from my local package-cache.) Best, Marcel Am 21.10.2020 20:30:28 schrieb karl ramberg : Removed from inbox now Best, Karl On Wed, Oct 21, 2020 at 6:12 PM Marcel Taeumel wrote: Hi Karl, please do not chain unprocessed inbox items in the ancestry. This way, we can never copy over your versions but always have to re-commit your changes method-by-method. Instead, base your changes on the most recent Trunk version. EToys-kfr.413 (inbox) needs kfr.412 (inbox) but is unrelated EToys-kfr.412 (inbox) needs kfr.392 (inbox) and eem.411 (trunk) EToys-kfr.392 (inbox) needs kfr.378 (inbox) and mt.391 (trunk) ... Yes, we will see to merge your EToys contributions ASAP. Thanks! ^__^ Best, Marcel Am 17.10.2020 20:03:09 schrieb tim Rowledge : > On 2020-10-17, at 9:03 AM, commits at source.squeak.org [mailto:commits at source.squeak.org] wrote: > > self world can return nil That is somehow both deeply philosophical and sad tim -- tim Rowledge; tim at rowledge.org [mailto:tim at rowledge.org]; http://www.rowledge.org/tim [http://www.rowledge.org/tim] Useful random insult:- Settled some during shipping and handling. -------------- next part -------------- An HTML attachment was scrubbed... URL: From karlramberg at gmail.com Fri Oct 30 18:13:38 2020 From: karlramberg at gmail.com (karl ramberg) Date: Fri, 30 Oct 2020 19:13:38 +0100 Subject: [squeak-dev] The Inbox: EToys-kfr.412.mcz In-Reply-To: References: <1C318624-9DFB-44DE-A32C-AAB72F753F02@rowledge.org> Message-ID: I made a method that load the most essential Etoy Icons so Etoys look ok even in standard Squeak. On Fri, Oct 30, 2020 at 7:07 PM Marcel Taeumel wrote: > > I'm not sure where in ReleaseBuilder to hook up the initialization of > the Etoy icons. Any suggestions? > > You mean after or even before calling "ReleaseBuilderSqueakland > setEtoysMode"? > > Best, > Marcel > > Am 30.10.2020 19:04:25 schrieb karl ramberg : > Cool. > I'll revise the other changes once I have time. > > I'm not sure where in ReleaseBuilder to hook up the initialization of the > Etoy icons. Any suggestions? > > Best, > Karl > > On Thu, Oct 29, 2020 at 5:06 PM Marcel Taeumel > wrote: > >> Hi Karl. >> >> > Removed from inbox now >> >> Just meant that for contributions to come. ^.^' Sorry for the mix up. >> >> Would you re-upload the contents from: >> >> EToys-kfr.413 >> EToys-kfr.412 >> EToys-kfr.392 >> >> (I managed to merge Etoys-kfr.377 up to 380 from my local package-cache.) >> >> Best, >> Marcel >> >> Am 21.10.2020 20:30:28 schrieb karl ramberg : >> Removed from inbox now >> >> Best, >> Karl >> >> On Wed, Oct 21, 2020 at 6:12 PM Marcel Taeumel >> wrote: >> >>> Hi Karl, >>> >>> please do not chain unprocessed inbox items in the ancestry. This way, >>> we can never copy over your versions but always have to re-commit your >>> changes method-by-method. Instead, base your changes on the most recent >>> Trunk version. >>> >>> EToys-kfr.413 (inbox) needs kfr.412 (inbox) but is unrelated >>> EToys-kfr.412 (inbox) needs kfr.392 (inbox) and eem.411 (trunk) >>> EToys-kfr.392 (inbox) needs kfr.378 (inbox) and mt.391 (trunk) >>> ... >>> >>> Yes, we will see to merge your EToys contributions ASAP. Thanks! ^__^ >>> >>> Best, >>> Marcel >>> >>> Am 17.10.2020 20:03:09 schrieb tim Rowledge : >>> >>> >>> > On 2020-10-17, at 9:03 AM, commits at source.squeak.org wrote: >>> > >>> > self world can return nil >>> >>> That is somehow both deeply philosophical and sad >>> >>> tim >>> -- >>> tim Rowledge; tim at rowledge.org; http://www.rowledge.org/tim >>> Useful random insult:- Settled some during shipping and handling. >>> >>> >>> >>> >>> >> > -------------- next part -------------- An HTML attachment was scrubbed... URL: From karlramberg at gmail.com Fri Oct 30 18:17:37 2020 From: karlramberg at gmail.com (karl ramberg) Date: Fri, 30 Oct 2020 19:17:37 +0100 Subject: [squeak-dev] The Inbox: EToys-kfr.412.mcz In-Reply-To: References: <1C318624-9DFB-44DE-A32C-AAB72F753F02@rowledge.org> Message-ID: It loads these just the most used forms and so it should be fine for standard image. It makes etoys and BookMorph look ok. It should be called from ReleaseBuilder. But I'm not sure where to trigger the loading. Here are a list of the forms: "RoundGoldBox, TryItPressed, TryIt, MenuIcon, AddCategoryViewer, AddInstanceVariable, TanOPressed, TanO, Gets, RightCaret, DownCaret, NextPage, NextPagePressed, PrevPage, PrevPagePressed" On Fri, Oct 30, 2020 at 7:13 PM karl ramberg wrote: > I made a method that load the most essential Etoy Icons so Etoys look ok > even in standard Squeak. > > > On Fri, Oct 30, 2020 at 7:07 PM Marcel Taeumel > wrote: > >> > I'm not sure where in ReleaseBuilder to hook up the initialization of >> the Etoy icons. Any suggestions? >> >> You mean after or even before calling "ReleaseBuilderSqueakland >> setEtoysMode"? >> >> Best, >> Marcel >> >> Am 30.10.2020 19:04:25 schrieb karl ramberg : >> Cool. >> I'll revise the other changes once I have time. >> >> I'm not sure where in ReleaseBuilder to hook up the initialization of the >> Etoy icons. Any suggestions? >> >> Best, >> Karl >> >> On Thu, Oct 29, 2020 at 5:06 PM Marcel Taeumel >> wrote: >> >>> Hi Karl. >>> >>> > Removed from inbox now >>> >>> Just meant that for contributions to come. ^.^' Sorry for the mix up. >>> >>> Would you re-upload the contents from: >>> >>> EToys-kfr.413 >>> EToys-kfr.412 >>> EToys-kfr.392 >>> >>> (I managed to merge Etoys-kfr.377 up to 380 from my local package-cache.) >>> >>> Best, >>> Marcel >>> >>> Am 21.10.2020 20:30:28 schrieb karl ramberg : >>> Removed from inbox now >>> >>> Best, >>> Karl >>> >>> On Wed, Oct 21, 2020 at 6:12 PM Marcel Taeumel >>> wrote: >>> >>>> Hi Karl, >>>> >>>> please do not chain unprocessed inbox items in the ancestry. This way, >>>> we can never copy over your versions but always have to re-commit your >>>> changes method-by-method. Instead, base your changes on the most recent >>>> Trunk version. >>>> >>>> EToys-kfr.413 (inbox) needs kfr.412 (inbox) but is unrelated >>>> EToys-kfr.412 (inbox) needs kfr.392 (inbox) and eem.411 (trunk) >>>> EToys-kfr.392 (inbox) needs kfr.378 (inbox) and mt.391 (trunk) >>>> ... >>>> >>>> Yes, we will see to merge your EToys contributions ASAP. Thanks! ^__^ >>>> >>>> Best, >>>> Marcel >>>> >>>> Am 17.10.2020 20:03:09 schrieb tim Rowledge : >>>> >>>> >>>> > On 2020-10-17, at 9:03 AM, commits at source.squeak.org wrote: >>>> > >>>> > self world can return nil >>>> >>>> That is somehow both deeply philosophical and sad >>>> >>>> tim >>>> -- >>>> tim Rowledge; tim at rowledge.org; http://www.rowledge.org/tim >>>> Useful random insult:- Settled some during shipping and handling. >>>> >>>> >>>> >>>> >>>> >>> >> -------------- next part -------------- An HTML attachment was scrubbed... URL: From commits at source.squeak.org Fri Oct 30 18:35:48 2020 From: commits at source.squeak.org (commits at source.squeak.org) Date: Fri, 30 Oct 2020 18:35:48 0000 Subject: [squeak-dev] The Trunk: Tools-tpr.1014.mcz Message-ID: tim Rowledge uploaded a new version of Tools to project The Trunk: http://source.squeak.org/trunk/Tools-tpr.1014.mcz ==================== Summary ==================== Name: Tools-tpr.1014 Author: tpr Time: 30 October 2020, 11:35:44.264054 am UUID: 5649c88a-0205-4ae7-abc7-f0b420348d4a Ancestors: Tools-mt.1013 Yet a nother tiny bit of collateral damage fro mwhacking the MessageSet classes - the flaps related build of the RecentMessageSet was not getting a window label. Somehow the odler version was simply dragging in the class name, which wasn't really very helpful anyway. This updates it to have the same name as the 'norammly opened variety. There is probably some more refactoring that could be done. =============== Diff against Tools-mt.1013 =============== Item was changed: ----- Method: Utilities class>>recentSubmissionsWindow (in category '*Tools') ----- recentSubmissionsWindow "Answer a SystemWindow holding recent submissions" | messageSet | messageSet := RecentMessageSet messageList: RecentMessages default methodReferences. + messageSet + autoSelectString: nil; + setInitialLabel: 'Recent Submissions'. - messageSet autoSelectString: nil. ^ ToolBuilder build: messageSet! From eliot.miranda at gmail.com Fri Oct 30 18:56:56 2020 From: eliot.miranda at gmail.com (Eliot Miranda) Date: Fri, 30 Oct 2020 11:56:56 -0700 Subject: [squeak-dev] The Inbox: Kernel-ct.1339.mcz In-Reply-To: <1603917195775-0.post@n4.nabble.com> References: <1603917195775-0.post@n4.nabble.com> Message-ID: On Wed, Oct 28, 2020 at 1:33 PM Christoph Thiede < christoph.thiede at student.hpi.uni-potsdam.de> wrote: > Done, see Kernel-ct.1357. > Thanks! > > Sometimes I believe we should store MethodNodes on Monticello only, or have > the code automatically formatted by the source.squeak.org servers right > during uploading using a pretty printer ... :-) > You're not alone in this thought. Until comments are part of the grammar it is likely a vain hope however. But another approach is to read Kent Beck's Smalltalk Best Practice Patterns and see if his arguments on formatting are persuasive. This is as good a style guide as it gets. IMO, Smalltalk is not a curly-brace language. [ & ] delimit an object, not some statements. But many of the original Smalltalkers formatted code as you do so I'm not right. It's just that I've rewritten lots of the Kernel code and so I'm overly possessive. I hope you're not offended. _,,,^..^,,,_ best, Eliot -------------- next part -------------- An HTML attachment was scrubbed... URL: From tim at rowledge.org Fri Oct 30 18:57:50 2020 From: tim at rowledge.org (tim Rowledge) Date: Fri, 30 Oct 2020 11:57:50 -0700 Subject: [squeak-dev] The Trunk: Tools-tpr.1014.mcz In-Reply-To: References: Message-ID: <11F20757-3B4A-459E-AB12-97EE31B3C2D6@rowledge.org> It *might* be that this requires the flaps get killed/restarted? > On 2020-10-30, at 11:35 AM, commits at source.squeak.org wrote: > > tim Rowledge uploaded a new version of Tools to project The Trunk: > http://source.squeak.org/trunk/Tools-tpr.1014.mcz > > ==================== Summary ==================== > > Name: Tools-tpr.1014 > Author: tpr > Time: 30 October 2020, 11:35:44.264054 am > UUID: 5649c88a-0205-4ae7-abc7-f0b420348d4a > Ancestors: Tools-mt.1013 > > Yet a nother tiny bit of collateral damage fro mwhacking the MessageSet classes - the flaps related build of the RecentMessageSet was not getting a window label. Somehow the odler version was simply dragging in the class name, which wasn't really very helpful anyway. > This updates it to have the same name as the 'norammly opened variety. > There is probably some more refactoring that could be done. tim -- tim Rowledge; tim at rowledge.org; http://www.rowledge.org/tim Strange OpCodes: BH: Branch and Hang From commits at source.squeak.org Fri Oct 30 19:01:11 2020 From: commits at source.squeak.org (commits at source.squeak.org) Date: Fri, 30 Oct 2020 19:01:11 0000 Subject: [squeak-dev] The Trunk: Compiler-eem.451.mcz Message-ID: Eliot Miranda uploaded a new version of Compiler to project The Trunk: http://source.squeak.org/trunk/Compiler-eem.451.mcz ==================== Summary ==================== Name: Compiler-eem.451 Author: eem Time: 30 October 2020, 12:01:09.305583 pm UUID: 30f155c7-a9c4-4cb8-bac6-f5089bbf7b36 Ancestors: Compiler-ct.450 just recategorizations. =============== Diff against Compiler-tobe.448 =============== Item was changed: + ----- Method: BytecodeEncoder>>generateBlockMethodOfClass:trailer:from: (in category 'method generation') ----- - ----- Method: BytecodeEncoder>>generateBlockMethodOfClass:trailer:from: (in category 'method encoding') ----- generateBlockMethodOfClass: aCompiledBlockClass trailer: trailer from: blockNode "Generate a CompiledBlock for the block whose parse tree is blockNode." "The closure analysis should already have been done." | blkSize header literals locals method nLits stack | self assert: blockNode blockExtent notNil. self assert: rootNode notNil. blkSize := blockNode sizeCodeForEvaluatedFullClosureValue: self. locals := blockNode localsNodes. self noteBlockExtent: blockNode blockExtent hasLocals: locals. header := self computeMethodHeaderForNumArgs: blockNode arguments size numTemps: locals size numLits: (nLits := (literals := self allLiteralsForBlockMethod) size) primitive: 0. method := trailer createMethod: blkSize class: aCompiledBlockClass header: header. 1 to: nLits do: [:lit | (method literalAt: lit put: (literals at: lit)) isCompiledCode ifTrue: [(literals at: lit) outerCode: method]]. self streamToMethod: method. stack := ParseStack new init. stack position: method numTemps. blockMethod := method. "For BytecodeEncoder>>pc & BytecodeEncoder>>nextPC" [blockNode emitCodeForEvaluatedFullClosureValue: stack encoder: self] on: Error "If an attempt is made to write too much code the method will be asked" do: [:ex| "to grow, and the grow attempt will fail in CompiledCode class>>#newMethodViaNewError" ex signalerContext sender method = (CompiledCode class>>#newMethodViaNewError) ifTrue: [^self error: 'Compiler code size discrepancy'] ifFalse: [ex pass]]. stack position ~= (method numTemps + 1) ifTrue: [^self error: 'Compiler stack discrepancy']. stream position ~= (method size - trailer size) ifTrue: [^self error: 'Compiler code size discrepancy']. method needsFrameSize: stack size - method numTemps. ^method! Item was changed: + ----- Method: BytecodeEncoder>>generateMethodOfClass:trailer:from: (in category 'method generation') ----- - ----- Method: BytecodeEncoder>>generateMethodOfClass:trailer:from: (in category 'method encoding') ----- generateMethodOfClass: aCompiledMethodClass trailer: trailer from: methodNode "The receiver is the root of a parse tree. Answer an instance of aCompiledMethodClass. The argument, trailer, is arbitrary but is typically either the reference to the source code that is stored with every CompiledMethod, or an encoding of the method's temporary names." | primErrNode blkSize nLits locals literals header method stack | primErrNode := methodNode primitiveErrorVariableName ifNotNil: [self fixTemp: methodNode primitiveErrorVariableName]. methodNode ensureClosureAnalysisDone. self rootNode: methodNode. "this is for BlockNode>>sizeCodeForClosureValue:" blkSize := (methodNode block sizeCodeForEvaluatedValue: self) + (methodNode primitive > 0 ifTrue: [self sizeCallPrimitive: methodNode primitive] ifFalse: [0]) + (primErrNode ifNil: [0] ifNotNil: [primErrNode index: methodNode arguments size + methodNode temporaries size; sizeCodeForStore: self "The VM relies on storeIntoTemp: (129)"]). locals := methodNode arguments, methodNode temporaries, (primErrNode ifNil: [#()] ifNotNil: [{primErrNode}]). self noteBlockExtent: methodNode block blockExtent hasLocals: locals. header := self computeMethodHeaderForNumArgs: methodNode arguments size numTemps: locals size numLits: (nLits := (literals := self allLiterals) size) primitive: methodNode primitive. method := trailer createMethod: blkSize class: aCompiledMethodClass header: header. 1 to: nLits do: [:lit | (method literalAt: lit put: (literals at: lit)) isCompiledCode ifTrue: [(literals at: lit) outerCode: method]]. self streamToMethod: method. stack := ParseStack new init. methodNode primitive > 0 ifTrue: [self genCallPrimitive: methodNode primitive]. primErrNode ifNotNil: [primErrNode emitCodeForStore: stack encoder: self]. stack position: method numTemps. [methodNode block emitCodeForEvaluatedValue: stack encoder: self] on: Error "If an attempt is made to write too much code the method will be asked" do: [:ex| "to grow, and the grow attempt will fail in CompiledCode class>>#newMethodViaNewError" ex signalerContext sender method = (CompiledCode class>>#newMethodViaNewError) ifTrue: [^self error: 'Compiler code size discrepancy'] ifFalse: [ex pass]]. stack position ~= (method numTemps + 1) ifTrue: [^self error: 'Compiler stack discrepancy']. stream position ~= (method size - trailer size) ifTrue: [^self error: 'Compiler code size discrepancy']. method needsFrameSize: stack size - method numTemps. ^method! Item was added: + ----- Method: CompilationCue>>source: (in category 'accessing') ----- + source: aString + + source := aString. + sourceStream := source readStream.! Item was changed: + ----- Method: EncoderForSistaV1>>computeMethodHeaderForNumArgs:numTemps:numLits:primitive: (in category 'method generation') ----- - ----- Method: EncoderForSistaV1>>computeMethodHeaderForNumArgs:numTemps:numLits:primitive: (in category 'method encoding') ----- computeMethodHeaderForNumArgs: numArgs numTemps: numTemps numLits: numLits primitive: primitiveIndex numTemps > 63 ifTrue: [^self error: 'Cannot compile -- too many temporary variables']. numLits > 65535 ifTrue: [^self error: 'Cannot compile -- too many literals']. ^SmallInteger minVal "sign bit is the flag for the alternative bytecode set" + (numArgs bitShift: 24) + (numTemps bitShift: 18) "+ (largeBit bitShift: 17)" "largeBit gets filled in later" + numLits + (primitiveIndex > 0 ifTrue: [1 bitShift: 16] ifFalse: [0])! Item was changed: + ----- Method: EncoderForSistaV1>>genCallInlinePrimitive: (in category 'bytecode generation') ----- - ----- Method: EncoderForSistaV1>>genCallInlinePrimitive: (in category 'extended bytecode generation') ----- genCallInlinePrimitive: primitiveIndex " 248 (2) 11111000 iiiiiiii mssjjjjj Call Primitive #iiiiiiii + (jjjjj * 256) m=1 means inlined primitive, no hard return after execution. ss defines the unsafe operation set used to encode the operations. (ss = 0 means sista unsafe operations, ss = 01 means lowcode operations, other numbers are not used)" "N.B. We could have made CallPrimitive a 2-byte code taking an extension, but that would complicate the VM's determination of the primitive number and the primitive error code store since the extension, being optional, would make the sequence variable length." (primitiveIndex < 1 or: [primitiveIndex > 32767]) ifTrue: [self outOfRangeError: 'primitive index' index: primitiveIndex range: 1 to: 32767]. stream nextPut: 248; nextPut: (primitiveIndex bitAnd: 255); nextPut: (primitiveIndex bitShift: -8) + 128! Item was changed: + ----- Method: EncoderForSistaV1>>genPushFullClosure:numCopied: (in category 'bytecode generation') ----- - ----- Method: EncoderForSistaV1>>genPushFullClosure:numCopied: (in category 'extended bytecode generation') ----- genPushFullClosure: compiledBlockLiteralIndex numCopied: numCopied "By default the closure will have an outer context and the receiver will be fetched from the current context" self genPushFullClosure: compiledBlockLiteralIndex numCopied: numCopied receiverOnStack: false ignoreOuterContext: false! Item was changed: + ----- Method: EncoderForSistaV1>>genPushFullClosure:numCopied:receiverOnStack:ignoreOuterContext: (in category 'bytecode generation') ----- - ----- Method: EncoderForSistaV1>>genPushFullClosure:numCopied:receiverOnStack:ignoreOuterContext: (in category 'extended bytecode generation') ----- genPushFullClosure: compiledBlockLiteralIndex numCopied: numCopied receiverOnStack: receiverOnStack ignoreOuterContext: ignoreOuterContext "* 249 11111001 xxxxxxxx siyyyyyy push Closure Compiled block literal index xxxxxxxx (+ Extend A * 256) numCopied yyyyyy receiverOnStack: s = 1 ignoreOuterContext: i = 1" | extendedIndex | (numCopied < 0 or: [numCopied > 64]) ifTrue: [self outOfRangeError: 'num copied' index: numCopied range: 1 to: 64]. (compiledBlockLiteralIndex < 0 or: [compiledBlockLiteralIndex > 32767]) ifTrue: [^self outOfRangeError: 'index' index: compiledBlockLiteralIndex range: 0 to: 32767]. (extendedIndex := compiledBlockLiteralIndex) > 255 ifTrue: [self genUnsignedSingleExtendA: extendedIndex // 256. extendedIndex := extendedIndex \\ 256]. stream nextPut: 249; nextPut: extendedIndex; nextPut: receiverOnStack asBit << 7 + (ignoreOuterContext asBit << 6) + numCopied! Item was changed: + ----- Method: EncoderForSistaV1>>genSendDirectedSuper:numArgs: (in category 'bytecode generation') ----- - ----- Method: EncoderForSistaV1>>genSendDirectedSuper:numArgs: (in category 'extended bytecode generation') ----- genSendDirectedSuper: selectorLiteralIndex numArgs: nArgs | extendedIndex | (selectorLiteralIndex < 0 or: [selectorLiteralIndex > 65535]) ifTrue: [^self outOfRangeError: 'selectorLiteralIndex' index: selectorLiteralIndex range: 0 to: 65535]. (nArgs < 0 or: [nArgs > 31]) ifTrue: [^self outOfRangeError: 'numArgs' index: nArgs range: 0 to: 31 "!!!!"]. (extendedIndex := selectorLiteralIndex) > 31 ifTrue: [self genUnsignedMultipleExtendA: extendedIndex // 32. extendedIndex := extendedIndex \\ 32]. "Bit 6 of the ExtB byte is the directed send flag. Bit 6 allows for future expansion to up to 255 args." self genUnsignedSingleExtendB: nArgs // 8 + 64. "235 11101011 iiiiijjj Send To Superclass Literal Selector #iiiii (+ Extend A * 32) with jjj (+ Extend B * 8) Arguments" stream nextPut: 235; nextPut: nArgs \\ 8 + (extendedIndex * 8)! Item was changed: ----- Method: Parser>>notify:at: (in category 'error handling') ----- notify: string at: location | messageText | messageText := '"' , string , ' ->"'. cue requestor isNil ifTrue: [ | notification | (encoder == self or: [encoder isNil]) ifTrue: [^ self fail "failure setting up syntax error"]. (notification := SyntaxErrorNotification + cue: (cue copy + source: (source contents asText + copyReplaceFrom: location + to: location - 1 + with: messageText); + yourself) - inClass: encoder classEncoding - withCode: (source contents asText - copyReplaceFrom: location - to: location - 1 - with: messageText) doitFlag: doitFlag errorMessage: string location: location) signal. notification tryNewSourceIfAvailable] ifFalse: [cue requestor notify: messageText at: location in: source]. ^ self fail! Item was changed: Error subclass: #SyntaxErrorNotification + instanceVariableNames: 'cue doitFlag errorMessage location newSource' - instanceVariableNames: 'inClass code doitFlag errorMessage location newSource' classVariableNames: '' poolDictionaries: '' category: 'Compiler-Exceptions'! + !SyntaxErrorNotification commentStamp: 'ct 10/24/2020 00:01' prior: 0! - !SyntaxErrorNotification commentStamp: 'nice 9/18/2013 22:16' prior: 0! A SyntaxErrorNotification is an Exception occuring when compiling a Smalltalk source code with incorrect syntax. Note that in interactive mode, this exception is not raised because the Compiler will interact directly with source code editor. The defaultAction is to raise a SyntaxError pop up window so as to enable interactive handling even in non interactive mode. Instance Variables + cue: - category: - code: doitFlag: errorMessage: - inClass: location: newSource: + cue + - the cue for compilation, including receiver class, optional context, and original source code - category - - the category in which the method will be classified - code - - the source code to be compiled or evaluated - doitFlag - true if this is a doIt (code to evaluate), false if this is a method (code of a method to be compiled) errorMessage - contains information about the syntax error - inClass - - target class in which to compile the method - location - position in the source code where the syntax error occured newSource + - eventually hold a source code replacement typically passed by the SyntaxError window! - - eventually hold a source code replacement typically passed by the SyntaxError window - ! Item was added: + ----- Method: SyntaxErrorNotification class>>cue:doitFlag:errorMessage:location: (in category 'instance creation') ----- + cue: aCue doitFlag: doitFlag errorMessage: errorString location: location + + ^ self new + setCue: aCue + doitFlag: doitFlag + errorMessage: errorString + location: location! Item was changed: + ----- Method: SyntaxErrorNotification class>>inClass:withCode:doitFlag:errorMessage:location: (in category 'instance creation') ----- - ----- Method: SyntaxErrorNotification class>>inClass:withCode:doitFlag:errorMessage:location: (in category 'exceptionInstantiator') ----- inClass: aClass withCode: codeString doitFlag: doitFlag errorMessage: errorString location: location + + self deprecated: 'ct: Use #cue:doitFlag:errorMessage:location:'. + ^ self + cue: (CompilationCue source: codeString class: aClass requestor: nil) - ^self new - setClass: aClass - code: codeString doitFlag: doitFlag errorMessage: errorString location: location! Item was added: + ----- Method: SyntaxErrorNotification>>context (in category 'accessing') ----- + context + + ^ cue context! Item was added: + ----- Method: SyntaxErrorNotification>>environment (in category 'accessing') ----- + environment + + ^ cue environment! Item was changed: ----- Method: SyntaxErrorNotification>>errorClass (in category 'accessing') ----- errorClass + + ^ cue getClass! - ^inClass! Item was changed: ----- Method: SyntaxErrorNotification>>errorCode (in category 'accessing') ----- errorCode + + ^ cue source! - ^code! Item was changed: ----- Method: SyntaxErrorNotification>>messageText (in category 'accessing') ----- messageText ^ super messageText + ifEmpty: [messageText := self errorCode]! - ifEmpty: [messageText := code]! Item was changed: ----- Method: SyntaxErrorNotification>>reparse:notifying:ifFail: (in category 'accessing') ----- reparse: aString notifying: aController ifFail: failBlock "Try to parse if aString has correct syntax, but do not evaluate/install any code. In case of incorrect syntax, execute failBlock and let a Compiler interact with the requestor. In case of correct syntax, set newSource." + + (doitFlag ifTrue: [nil class] ifFalse: [self errorClass]) newCompiler + compileCue: (cue copy + source: aString; + requestor: aController; + yourself) + noPattern: doitFlag + ifFail: failBlock. + newSource := aString.! - doitFlag - ifTrue: [nil class newCompiler compileNoPattern: aString in: nil class notifying: aController ifFail: failBlock] - ifFalse: [inClass newCompiler compile: aString in: inClass notifying: aController ifFail: failBlock]. - newSource := aString! Item was removed: - ----- Method: SyntaxErrorNotification>>setClass:code:doitFlag:errorMessage:location: (in category 'accessing') ----- - setClass: aClass code: codeString doitFlag: aBoolean errorMessage: errorString location: anInteger - inClass := aClass. - code := codeString. - doitFlag := aBoolean. - errorMessage := errorString. - location := anInteger! Item was added: + ----- Method: SyntaxErrorNotification>>setCue:doitFlag:errorMessage:location: (in category 'initialize-release') ----- + setCue: aCue doitFlag: aBoolean errorMessage: errorString location: anInteger + + cue := aCue. + doitFlag := aBoolean. + errorMessage := errorString. + location := anInteger! From commits at source.squeak.org Fri Oct 30 19:04:53 2020 From: commits at source.squeak.org (commits at source.squeak.org) Date: Fri, 30 Oct 2020 19:04:53 0000 Subject: [squeak-dev] The Trunk: Kernel-eem.1358.mcz Message-ID: Eliot Miranda uploaded a new version of Kernel to project The Trunk: http://source.squeak.org/trunk/Kernel-eem.1358.mcz ==================== Summary ==================== Name: Kernel-eem.1358 Author: eem Time: 30 October 2020, 12:04:50.705166 pm UUID: 9e6daea9-3c8f-4ffa-99ab-e76c50af41d0 Ancestors: Kernel-eem.1356, Kernel-ct.1357 Merge Kernel-ct.1357 Author: ct Time: 28 October 2020, 9:30:35.577652 pm UUID: efd94ae0-26ab-0c4f-b854-52f414ff2d3e Ancestors: Kernel-eem.1354 Implement missing simulation of objects as methods. In the past, it was not possible to debug/simulate code that used objects as methods properly. (Thanks to Marcel for the hint!) This very simple commit adds support of the OaM protocol [1] to the simulation machinery. Now you can debug all tests in TestObjectsAsMethods as you would expect, instead of crashing your image! Update: Uploaded a third time, this time with Kent Beck block formatting preserved. [1] "The [Objects as Methods] contract is that, when the VM encounters an ordinary object (rather than a compiled method) in the method dictionary during lookup, it sends it the special selector #run:with:in: providing the original selector, arguments, and receiver.". DOI: 10.1145/2991041.2991062. =============== Diff against Kernel-eem.1356 =============== Item was changed: ----- Method: Context>>send:to:with:lookupIn: (in category 'controlling') ----- send: selector to: rcvr with: arguments lookupIn: lookupClass + "Simulate the action of sending a message with selector and arguments to rcvr. The argument, lookupClass, is the class in which to lookup the message. This is the receiver's class for normal messages, but for super messages it will be some specific class related to the source method." - "Simulate the action of sending a message with selector and arguments - to rcvr. The argument, lookupClass, is the class in which to lookup the - message. This is the receiver's class for normal messages, but for super - messages it will be some specific class related to the source method." | meth primIndex val ctxt | (meth := lookupClass lookupSelector: selector) ifNil: [^self send: #doesNotUnderstand: to: rcvr with: {(Message selector: selector arguments: arguments) lookupClass: lookupClass} lookupIn: lookupClass]. + + meth isCompiledMethod ifFalse: + ["Object as Methods (OaM) protocol: 'The contract is that, when the VM encounters an ordinary object (rather than a compiled method) in the method dictionary during lookup, it sends it the special selector #run:with:in: providing the original selector, arguments, and receiver.'. DOI: 10.1145/2991041.2991062." + ^ self send: #run:with:in: + to: meth + with: {selector. arguments. rcvr}]. + + meth numArgs = arguments size ifFalse: + [^ self error: ('Wrong number of arguments in simulated message {1}' translated format: {selector})]. - meth numArgs ~= arguments size ifTrue: - [^self error: 'Wrong number of arguments in simulated message ', selector printString]. (primIndex := meth primitive) > 0 ifTrue: [val := self doPrimitive: primIndex method: meth receiver: rcvr args: arguments. + (self isPrimFailToken: val) ifFalse: - (self isPrimFailToken: val) ifFalse: [^val]]. + (selector == #doesNotUnderstand: and: [lookupClass == ProtoObject]) ifTrue: + [^ self error: ('Simulated message {1} not understood' translated format: {arguments first selector})]. + - [^self error: 'Simulated message ', arguments first selector, ' not understood']. ctxt := Context sender: self receiver: rcvr method: meth arguments: arguments. + (primIndex notNil and: [primIndex > 0]) ifTrue: - primIndex > 0 ifTrue: [ctxt failPrimitiveWith: val]. + ^ctxt! From commits at source.squeak.org Fri Oct 30 19:10:10 2020 From: commits at source.squeak.org (commits at source.squeak.org) Date: Fri, 30 Oct 2020 19:10:10 0000 Subject: [squeak-dev] The Trunk: Kernel-eem.1359.mcz Message-ID: Eliot Miranda uploaded a new version of Kernel to project The Trunk: http://source.squeak.org/trunk/Kernel-eem.1359.mcz ==================== Summary ==================== Name: Kernel-eem.1359 Author: eem Time: 30 October 2020, 12:10:07.699375 pm UUID: 1ec9a445-37fa-4256-84d8-9bdf8b52eb7d Ancestors: Kernel-eem.1358 Merge Kernel-ct.1358 Author: ct Time: 28 October 2020, 11:37:24.817544 pm UUID: c9af6acb-61cf-af42-b5fa-3afa8451bb24 Ancestors: Kernel-mt.1353 Fixes a simulation bug that occurs when executing ProtoObject >> #doesNotUnderstand:. See KernelTests-ct.388. =============== Diff against Kernel-eem.1358 =============== Item was changed: ----- Method: Context>>send:to:with:lookupIn: (in category 'controlling') ----- send: selector to: rcvr with: arguments lookupIn: lookupClass "Simulate the action of sending a message with selector and arguments to rcvr. The argument, lookupClass, is the class in which to lookup the message. This is the receiver's class for normal messages, but for super messages it will be some specific class related to the source method." | meth primIndex val ctxt | (meth := lookupClass lookupSelector: selector) ifNil: + [selector == #doesNotUnderstand: ifTrue: + [self error: 'Recursive message not understood!!' translated]. + ^self send: #doesNotUnderstand: - [^self send: #doesNotUnderstand: to: rcvr with: {(Message selector: selector arguments: arguments) lookupClass: lookupClass} lookupIn: lookupClass]. meth isCompiledMethod ifFalse: ["Object as Methods (OaM) protocol: 'The contract is that, when the VM encounters an ordinary object (rather than a compiled method) in the method dictionary during lookup, it sends it the special selector #run:with:in: providing the original selector, arguments, and receiver.'. DOI: 10.1145/2991041.2991062." + ^self send: #run:with:in: - ^ self send: #run:with:in: to: meth with: {selector. arguments. rcvr}]. meth numArgs = arguments size ifFalse: [^ self error: ('Wrong number of arguments in simulated message {1}' translated format: {selector})]. (primIndex := meth primitive) > 0 ifTrue: [val := self doPrimitive: primIndex method: meth receiver: rcvr args: arguments. (self isPrimFailToken: val) ifFalse: [^val]]. (selector == #doesNotUnderstand: and: [lookupClass == ProtoObject]) ifTrue: + [^self error: ('Simulated message {1} not understood' translated format: {arguments first selector})]. - [^ self error: ('Simulated message {1} not understood' translated format: {arguments first selector})]. ctxt := Context sender: self receiver: rcvr method: meth arguments: arguments. + (primIndex isInteger and: [primIndex > 0]) ifTrue: - (primIndex notNil and: [primIndex > 0]) ifTrue: [ctxt failPrimitiveWith: val]. ^ctxt! From Christoph.Thiede at student.hpi.uni-potsdam.de Fri Oct 30 21:17:12 2020 From: Christoph.Thiede at student.hpi.uni-potsdam.de (Thiede, Christoph) Date: Fri, 30 Oct 2020 21:17:12 +0000 Subject: [squeak-dev] The Trunk: Kernel-eem.1359.mcz In-Reply-To: References: Message-ID: <43ceaee2ed23407bb6af146378e1621a@student.hpi.uni-potsdam.de> Thanks for merging! :-) But I believe you copied the versions only, they are still in the inbox ... Best, Christoph ________________________________ Von: Squeak-dev im Auftrag von commits at source.squeak.org Gesendet: Freitag, 30. Oktober 2020 20:10:10 An: squeak-dev at lists.squeakfoundation.org; packages at lists.squeakfoundation.org Betreff: [squeak-dev] The Trunk: Kernel-eem.1359.mcz Eliot Miranda uploaded a new version of Kernel to project The Trunk: http://source.squeak.org/trunk/Kernel-eem.1359.mcz ==================== Summary ==================== Name: Kernel-eem.1359 Author: eem Time: 30 October 2020, 12:10:07.699375 pm UUID: 1ec9a445-37fa-4256-84d8-9bdf8b52eb7d Ancestors: Kernel-eem.1358 Merge Kernel-ct.1358 Author: ct Time: 28 October 2020, 11:37:24.817544 pm UUID: c9af6acb-61cf-af42-b5fa-3afa8451bb24 Ancestors: Kernel-mt.1353 Fixes a simulation bug that occurs when executing ProtoObject >> #doesNotUnderstand:. See KernelTests-ct.388. =============== Diff against Kernel-eem.1358 =============== Item was changed: ----- Method: Context>>send:to:with:lookupIn: (in category 'controlling') ----- send: selector to: rcvr with: arguments lookupIn: lookupClass "Simulate the action of sending a message with selector and arguments to rcvr. The argument, lookupClass, is the class in which to lookup the message. This is the receiver's class for normal messages, but for super messages it will be some specific class related to the source method." | meth primIndex val ctxt | (meth := lookupClass lookupSelector: selector) ifNil: + [selector == #doesNotUnderstand: ifTrue: + [self error: 'Recursive message not understood!!' translated]. + ^self send: #doesNotUnderstand: - [^self send: #doesNotUnderstand: to: rcvr with: {(Message selector: selector arguments: arguments) lookupClass: lookupClass} lookupIn: lookupClass]. meth isCompiledMethod ifFalse: ["Object as Methods (OaM) protocol: 'The contract is that, when the VM encounters an ordinary object (rather than a compiled method) in the method dictionary during lookup, it sends it the special selector #run:with:in: providing the original selector, arguments, and receiver.'. DOI: 10.1145/2991041.2991062." + ^self send: #run:with:in: - ^ self send: #run:with:in: to: meth with: {selector. arguments. rcvr}]. meth numArgs = arguments size ifFalse: [^ self error: ('Wrong number of arguments in simulated message {1}' translated format: {selector})]. (primIndex := meth primitive) > 0 ifTrue: [val := self doPrimitive: primIndex method: meth receiver: rcvr args: arguments. (self isPrimFailToken: val) ifFalse: [^val]]. (selector == #doesNotUnderstand: and: [lookupClass == ProtoObject]) ifTrue: + [^self error: ('Simulated message {1} not understood' translated format: {arguments first selector})]. - [^ self error: ('Simulated message {1} not understood' translated format: {arguments first selector})]. ctxt := Context sender: self receiver: rcvr method: meth arguments: arguments. + (primIndex isInteger and: [primIndex > 0]) ifTrue: - (primIndex notNil and: [primIndex > 0]) ifTrue: [ctxt failPrimitiveWith: val]. ^ctxt! -------------- next part -------------- An HTML attachment was scrubbed... URL: From commits at source.squeak.org Fri Oct 30 21:54:48 2020 From: commits at source.squeak.org (commits at source.squeak.org) Date: Fri, 30 Oct 2020 21:54:48 0000 Subject: [squeak-dev] The Trunk: EToys-eem.413.mcz Message-ID: Eliot Miranda uploaded a new version of EToys to project The Trunk: http://source.squeak.org/trunk/EToys-eem.413.mcz ==================== Summary ==================== Name: EToys-eem.413 Author: eem Time: 30 October 2020, 2:54:41.532789 pm UUID: a1c04088-006b-4fcb-b94b-4d208a3e42ff Ancestors: EToys-mt.412 Fix an Undeclared variable. =============== Diff against EToys-mt.412 =============== Item was removed: - ----- Method: Mines class>>initialize (in category 'parts bin') ----- - initialize - super initialize. - "boardSizes are column, row, mines, highScore" - BoardSizes := Dictionary new. - BoardSizes at: 1 put:{8. 8. 10. 999. 'Beginner'}. - BoardSizes at: 2 put:{16. 16. 40. 999. 'Intermediate'}. - BoardSizes at: 3 put:{30. 16. 99. 999. 'Expert'}. - - ! Item was changed: ----- Method: Mines>>newGame (in category 'actions') ----- newGame | boardSize | + boardSize := MinesBoard boardSizeAt: level. - boardSize := BoardSizes at: level. timeDisplay value: 0; flash: false. timeDisplay stop. timeDisplay reset. minesDisplay value: (boardSize at: 3). hiScoreDisplay value: (boardSize at: 4). levelButton label: (boardSize at: 5) asString. self board resetBoard: level.! Item was changed: AlignmentMorph subclass: #MinesBoard instanceVariableNames: 'protoTile rows columns flashCount tileCount target actionSelector arguments gameStart gameOver boardSize' + classVariableNames: 'BoardSizes' - classVariableNames: '' poolDictionaries: '' category: 'Etoys-Squeakland-Morphic-Games'! Item was added: + ----- Method: MinesBoard class>>boardSizeAt: (in category 'accessing') ----- + boardSizeAt: level + ^BoardSizes at: level! Item was added: + ----- Method: MinesBoard class>>initialize (in category 'class initialization') ----- + initialize + "boardSizes are column, row, mines, highScore" + BoardSizes := Dictionary new. + BoardSizes at: 1 put:{8. 8. 10. 999. 'Beginner'}. + BoardSizes at: 2 put:{16. 16. 40. 999. 'Intermediate'}. + BoardSizes at: 3 put:{30. 16. 99. 999. 'Expert'}! From eliot.miranda at gmail.com Fri Oct 30 22:24:34 2020 From: eliot.miranda at gmail.com (Eliot Miranda) Date: Fri, 30 Oct 2020 15:24:34 -0700 Subject: [squeak-dev] The Trunk: Kernel-eem.1359.mcz In-Reply-To: <43ceaee2ed23407bb6af146378e1621a@student.hpi.uni-potsdam.de> References: <43ceaee2ed23407bb6af146378e1621a@student.hpi.uni-potsdam.de> Message-ID: On Fri, Oct 30, 2020 at 2:17 PM Thiede, Christoph < Christoph.Thiede at student.hpi.uni-potsdam.de> wrote: > Thanks for merging! :-) But I believe you copied the versions only, they > are still in the inbox ... > You want these moving to treated inbox? Or...? If to treated do you have permissions or do I need to do it? I don't think they should go to trunk because the history is wrong. But that's just what I think. > > Best, > > Christoph > > ------------------------------ > *Von:* Squeak-dev im > Auftrag von commits at source.squeak.org > *Gesendet:* Freitag, 30. Oktober 2020 20:10:10 > *An:* squeak-dev at lists.squeakfoundation.org; > packages at lists.squeakfoundation.org > *Betreff:* [squeak-dev] The Trunk: Kernel-eem.1359.mcz > > Eliot Miranda uploaded a new version of Kernel to project The Trunk: > http://source.squeak.org/trunk/Kernel-eem.1359.mcz > > ==================== Summary ==================== > > Name: Kernel-eem.1359 > Author: eem > Time: 30 October 2020, 12:10:07.699375 pm > UUID: 1ec9a445-37fa-4256-84d8-9bdf8b52eb7d > Ancestors: Kernel-eem.1358 > > Merge Kernel-ct.1358 > Author: ct > Time: 28 October 2020, 11:37:24.817544 pm > UUID: c9af6acb-61cf-af42-b5fa-3afa8451bb24 > Ancestors: Kernel-mt.1353 > > Fixes a simulation bug that occurs when executing ProtoObject >> > #doesNotUnderstand:. See KernelTests-ct.388. > > =============== Diff against Kernel-eem.1358 =============== > > Item was changed: > ----- Method: Context>>send:to:with:lookupIn: (in category > 'controlling') ----- > send: selector to: rcvr with: arguments lookupIn: lookupClass > "Simulate the action of sending a message with selector and > arguments to rcvr. The argument, lookupClass, is the class in which to > lookup the message. This is the receiver's class for normal messages, but > for super messages it will be some specific class related to the source > method." > > | meth primIndex val ctxt | > (meth := lookupClass lookupSelector: selector) ifNil: > + [selector == #doesNotUnderstand: ifTrue: > + [self error: 'Recursive message not understood!!' > translated]. > + ^self send: #doesNotUnderstand: > - [^self send: #doesNotUnderstand: > to: rcvr > with: {(Message selector: selector > arguments: arguments) lookupClass: lookupClass} > lookupIn: lookupClass]. > > meth isCompiledMethod ifFalse: > ["Object as Methods (OaM) protocol: 'The contract is > that, when the VM encounters an ordinary object (rather than a compiled > method) in the method dictionary during lookup, it sends it the special > selector #run:with:in: providing the original selector, arguments, and > receiver.'. DOI: 10.1145/2991041.2991062." > + ^self send: #run:with:in: > - ^ self send: #run:with:in: > to: meth > with: {selector. arguments. rcvr}]. > > meth numArgs = arguments size ifFalse: > [^ self error: ('Wrong number of arguments in simulated > message {1}' translated format: {selector})]. > (primIndex := meth primitive) > 0 ifTrue: > [val := self doPrimitive: primIndex method: meth > receiver: rcvr args: arguments. > (self isPrimFailToken: val) ifFalse: > [^val]]. > > (selector == #doesNotUnderstand: and: [lookupClass == > ProtoObject]) ifTrue: > + [^self error: ('Simulated message {1} not understood' > translated format: {arguments first selector})]. > - [^ self error: ('Simulated message {1} not understood' > translated format: {arguments first selector})]. > > ctxt := Context sender: self receiver: rcvr method: meth > arguments: arguments. > + (primIndex isInteger and: [primIndex > 0]) ifTrue: > - (primIndex notNil and: [primIndex > 0]) ifTrue: > [ctxt failPrimitiveWith: val]. > > ^ctxt! > > > > -- _,,,^..^,,,_ best, Eliot -------------- next part -------------- An HTML attachment was scrubbed... URL: From eancaer at gmail.com Sat Oct 31 00:07:22 2020 From: eancaer at gmail.com (Edwin Ancaer) Date: Sat, 31 Oct 2020 01:07:22 +0100 Subject: [squeak-dev] Croquet Message-ID: With the situation around the Corona-virus, and schools that get partially closed again (at least in Belgium), Is it worth to consider Open Croquet to create educational content . I read about Croquet on Squeak 5.2/5.3, but I don't know i the current version is up to 'serious experiments' already. (I use the word serious experiments, because on our side (producing content) , 'professional is too high a level now. I send this to the developer list, because the open croquet maillist I found has a last post in may 2012. Kind regards, Edwin Ancaer -------------- next part -------------- An HTML attachment was scrubbed... URL: From ron at usmedrec.com Sat Oct 31 05:09:50 2020 From: ron at usmedrec.com (Ron Teitelbaum) Date: Sat, 31 Oct 2020 01:09:50 -0400 Subject: [squeak-dev] Croquet In-Reply-To: References: Message-ID: Hi Edwin, There are a few options for you to consider. There is a commercial version of Croquet called Immersive Terf (shameless plug www3dicc.com). We would be happy to work with you. There is an opensource version called OpenQwaq. There are a few offspring of that around like https://krestianstvo.org/docs/about/projects/ There is also a new version of croquet available at https://croquet.io/sdk/docs/ Hope that helps. Ron Teitelbaum ron at 3dicc.com CEO 3d Immersive Collaboration On Fri, Oct 30, 2020 at 8:07 PM Edwin Ancaer wrote: > With the situation around the Corona-virus, and schools that get partially > closed again (at least in Belgium), Is it worth to consider Open Croquet > to create educational content . I read about Croquet on Squeak 5.2/5.3, but > I don't know i the current version is up to 'serious experiments' already. > (I use the word serious experiments, because on our side (producing > content) , 'professional is too high a level now. > > I send this to the developer list, because the open croquet maillist I > found has a last post in may 2012. > > Kind regards, > > Edwin Ancaer > > -------------- next part -------------- An HTML attachment was scrubbed... URL: From commits at source.squeak.org Sat Oct 31 19:59:05 2020 From: commits at source.squeak.org (commits at source.squeak.org) Date: Sat, 31 Oct 2020 19:59:05 0000 Subject: [squeak-dev] The Inbox: EToys-kfr.414.mcz Message-ID: A new version of EToys was added to project The Inbox: http://source.squeak.org/inbox/EToys-kfr.414.mcz ==================== Summary ==================== Name: EToys-kfr.414 Author: kfr Time: 31 October 2020, 8:58:48.943742 pm UUID: 5e186cb9-67d7-124d-901e-ae50d4bacbe8 Ancestors: EToys-eem.413 self world returns nil when the morph is not visible/ opened yet =============== Diff against EToys-eem.413 =============== Item was changed: ----- Method: CategoryViewer>>assureCategoryFullyVisible (in category '*Etoys-Squeakland-categories') ----- assureCategoryFullyVisible "Keep deleting categoryviewers other than the receiver until the receiver is fully visible." | ready toDelete | ready := false. + [(self bounds bottom > Project current world bottom) and: [ready not]] whileTrue: [ - [(self bounds bottom > self world bottom) and: [ready not]] whileTrue: [ owner submorphs size > 2 ifTrue: [ toDelete := owner submorphs allButFirst reversed detect: [:cv | cv ~~ self] ifNone: [^ self]. toDelete delete. self world doOneCycleNow] ifFalse: [ ready := true]].!