Hi All,
I propose that we add an Applications tab on squek.org and in that page
we have a brief description of, the logo/iconography of, and URL of any and
all commercial projects currently built with Squeak. Tim's company Sage
Tea is perhaps transitioning a part of its solution to Squeak from
VisualWorks. 3D ICC's Terf is all built on Squeak. Who else is building
commercial applications on Squeak? I bet there are a few. We should not
keep the commercial success of Squeak in stealth mode, We should broadcast
it far and wide.
If you are, then please, if you're part of the Squeak.org design team,
start building this tab, if you're an application developer and/or owner,
please mention your project here, and/or add it to the Applications tab as
soon as it goes live.
Fabio Neiphaus and others have built a very nice process for updating the
website. One clones https://github.com/squeak-smalltalk/squeak.org.git,
edits the checkout of the clone, commits to one's clone, and submits a pull
request.
Who's with me?
_,,,^..^,,,_
best, Eliot
Levente Uzonyi uploaded a new version of Collections to project The Inbox:
http://source.squeak.org/inbox/Collections-ul.914.mcz
==================== Summary ====================
Name: Collections-ul.914
Author: ul
Time: 28 September 2020, 11:50:07.373304 pm
UUID: eb80ed0e-d5ed-4ff5-9206-18cc75e54990
Ancestors: Collections-eem.912
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.912 ===============
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 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 class arrayType new: self capacity!
- order := self class arrayType new: n + 1 * 3 // 4!
Levente Uzonyi uploaded a new version of Collections to project The Inbox:
http://source.squeak.org/inbox/Collections-ul.913.mcz
==================== Summary ====================
Name: Collections-ul.913
Author: ul
Time: 28 September 2020, 1:19:09.686632 am
UUID: 03eb89d7-ea1f-4116-99eb-0181542610f7
Ancestors: Collections-eem.912
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.
- introduce #arraySize to return the size of the internal array
- 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.912 ===============
Item was added:
+ ----- Method: HashedCollection>>arraySize (in category 'accessing') -----
+ arraySize
+ "Answer the size of the internal array of the receiver."
+
+ ^array size!
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: self arraySize!
- 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 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 class arrayType new: self capacity!
- order := self class arrayType new: n + 1 * 3 // 4!
A new version of System was added to project The Inbox:
http://source.squeak.org/inbox/System-ct.1175.mcz
==================== Summary ====================
Name: System-ct.1175
Author: ct
Time: 28 September 2020, 1:44:09.091219 pm
UUID: 9b5c7784-f99d-6a4e-8980-42b8046fa7b9
Ancestors: System-topa.1174
Fixes hi-dpi images after resetting UI theme in System-topa.1174. See http://forum.world.st/The-Trunk-System-topa-1174-mcz-tp5122421p5122455.html. Thanks to Marcel for the hint!
=============== Diff against System-topa.1174 ===============
Item was changed:
+ (PackageInfo named: 'System') postscript: '| delta |
+ "Reset hi-dpi mode after resetting UI them in System-topa.1174. See http://forum.world.st/The-Trunk-System-topa-1174-mcz-tp5122421p5122455.html."
+ delta := Preferences standardSystemFont pointSize - 9.
+ delta isZero ifFalse: [
+ [Preferences restoreDefaultFonts] valueSuppressingMessages: #(''Do you want to apply*'').
+ Preferences changeFontSize: delta].'!
- (PackageInfo named: 'System') postscript: 'UserInterfaceTheme cleanUpAndReset.'!
Patrick Rein uploaded a new version of Graphics to project The Trunk:
http://source.squeak.org/trunk/Graphics-pre.439.mcz
==================== Summary ====================
Name: Graphics-pre.439
Author: pre
Time: 25 September 2020, 9:48:35.481674 am
UUID: e6d3328b-645a-e846-a3a9-c3c61b479c23
Ancestors: Graphics-tonyg.438
Adds code to handle the case in which a text anchor attribute is used on more than the SoH character AND another SoH character is within the range where the text anchor was applied. Without this, the first morph would be put at the location of the second SoH character.
=============== Diff against Graphics-tonyg.438 ===============
Item was changed:
----- Method: CharacterScanner>>embeddedObject (in category 'stop conditions') -----
embeddedObject
+ | previousAttributes newAttributes |
pendingKernX := 0.
+ "If a text anchor was already at the previous index, it was already dealt with"
+ previousAttributes := lastIndex > 1 ifTrue: [text attributesAt: lastIndex - 1] ifFalse: [#()].
+ newAttributes := (text attributesAt: lastIndex) copyWithoutAll: previousAttributes.
+ (newAttributes reject: [:each | each anchoredMorph isNil])
- ((text attributesAt: lastIndex) reject: [:each | each anchoredMorph isNil])
ifNotEmpty: [:attributes | (self placeEmbeddedObjectsFrom: attributes) ifTrue: [^ true]].
self setFont.
"Note: if ever several objects are embedded on same character, only indent lastIndex once"
lastIndex := lastIndex + 1.
+ ^ false!
- ^false!
I've been pontificating about unity between dialects, convinced more than ever that we need each other and have more of a simple (not easy) communication problem than anything else, and pestering the principals of various communities, so I decided to put some concrete action behind it - some "skin in the game" as we say in the U.S.
After reading Trygve's frustration with Squeak image/VM management, and Eliot's mention of Pharo's solution, I've extended PharoLauncher to manage and run Squeak (and GToolkit) VMs/images.
The current limitation vs. launching standard Pharo images is that you have to download the VMs and images and manually install them due to differences in URL and other conventions. However once the files are in place, you can create templates allowing images to be created at will from different Squeak versions and automatically run with the correct VM. Auto-installation could probably be done if someone cares enough but it scratched my itch for the moment to manage GT images. I’m sure Cuis support could be added, but the hooks are now available and someone more familiar with its VM/image installation might have an easier time.
Until my latest PR [1] is merged, brave souls can play with it and give feedback by loading my issue branch [2] into the latest Launcher release [3]. NB only tested on Mac.
It seemed Trygve was at his wits' end, but maybe this and other small gestures will let him know how important he is to our community if not motivate him to resume his important work.
I challenge you, as a member of our wider Squeak/Pharo/Cuis family: what small action can you take today that unites us rather than divides us? We can be each others' supporters even if technical, vision and other differences keep our codebases somewhat distinct. I believe the seeds of wars are planted when I lack the grace to give those around me the benefit of the doubt that they mean well and are trying their best. There is more than enough of that already in the world. Let’s invent a *better* future…
Your brother,
Sean
1. https://github.com/pharo-project/pharo-launcher/pull/503
2. https://github.com/seandenigris/pharo-launcher/tree/enh_vm-image-custom-hoo…
3. https://pharo.org/download