David T. Lewis uploaded a new version of NetworkTests to project The Trunk:
http://source.squeak.org/trunk/NetworkTests-dtl.31.mcz
==================== Summary ====================
Name: NetworkTests-dtl.31
Author: dtl
Time: 17 July 2012, 8:28:15.3 am
UUID: 3aa39e19-695e-4d09-a022-6d659641a6c0
Ancestors: NetworkTests-dtl.30
Add SocketTest>>testStringFromAddress to ensure that NetNameResolver class>>stringFromAddress: works for SocketAddress as well as for old style ByteArray addresses.
=============== Diff against NetworkTests-dtl.30 ===============
Item was added:
+ ----- Method: SocketTest>>testStringFromAddress (in category 'tests') -----
+ testStringFromAddress
+ "Addresses are represented by a ByteArray if NetNameResolver useOldNetwork
+ is true, or by by SocketAddress otherwise. Ensure the #stringFromAddress: works
+ in either case. Older versions of SocketPlugin in the VM do not provide support
+ for SocketAddress, and ByteArray addresses are used in that case."
+
+ | localAddress localAddressBytes localName1 localName2 |
+ localAddress := NetNameResolver localHostAddress. "ByteArray or SocketAddress"
+ localAddressBytes := localAddress asByteArray.
+ localName1 := NetNameResolver stringFromAddress: localAddress.
+ localName2 := NetNameResolver stringFromAddress: localAddressBytes.
+ self assert: localName1 = localName2
+ !
Hi,
Reminder: 29 days to deadline
Have you written innovative Smalltalk? The developers of any Smalltalk-based
software can enter by submitting a 3-5min video of their software. Entrants
demo their systems in a session at the end of Monday August 27th 2012, after
which the conference attendees vote. (A vote consists in providing a sorted
list of 3 preferred pieces of software.)
The top 3 teams with the most innovative software will receive,
respectively, 500 Euros, 300 Euros and 200 Euros. The results are announced
in the Awards ceremony that is held during the social event.
Applicants should provide the following information on the conference
registration server. Once you have registered your personal info, an
'Awards' menu allows submitting your software. You can provide this
information when you first register, or login again later and update your
details. The registration server will open soon. You can start preparing
your software right now though.
Info to provide:
Name of the software
Licence information (free, shareware, or commercial)
Name of the Smalltalk dialect used
Name, Affiliation and Country of developers
Besides, it would be great if the submission could include:
URL for a video (3-5 min) showing a screencast / demo of the software
URL for downloading the software or at least a runnable demo
Deadline: August 15
Any Smalltalker can apply (students, companies, ...). The presented piece of
code/software should be written in Smalltalk or directly support Smalltalk
(e.g. Smalltalk VM). All Smalltalk dialects are accepted. The applicant
should be "strongly related" to the presented code, be it as an author, as
owner of the copyright/copyleft, or as an official representative of the
copyright/copyleft owner.
Bests
Jordi
--
View this message in context: http://forum.world.st/9th-Innovation-Technology-Awards-Reminder-tp4640276.h…
Sent from the Squeak - Dev mailing list archive at Nabble.com.
Eliot Miranda uploaded a new version of System to project The Trunk:
http://source.squeak.org/trunk/System-eem.491.mcz
==================== Summary ====================
Name: System-eem.491
Author: eem
Time: 16 July 2012, 5:15:37.638 pm
UUID: 36631b36-5c57-4173-af46-59e4697db35b
Ancestors: System-eem.490
Make MessageTally able to profile across a snapshot.
See MessageTally's class comment for an example.
=============== Diff against System-eem.490 ===============
Item was changed:
Magnitude subclass: #MessageTally
+ instanceVariableNames: 'class method process tally receivers senders time gcStats maxClassNameSize maxClassPlusSelectorSize maxTabs reportOtherProcesses time0 startTime endTime preHibernationCopy'
- instanceVariableNames: 'class method process tally receivers senders time gcStats maxClassNameSize maxClassPlusSelectorSize maxTabs reportOtherProcesses'
classVariableNames: 'DefaultPollPeriod ShowProcesses Timer'
poolDictionaries: ''
category: 'System-Tools'!
+ !MessageTally commentStamp: 'eem 7/16/2012 17:10' prior: 0!
- !MessageTally commentStamp: 'StephaneDucasse 9/27/2009 10:42' prior: 0!
My instances observe and report the amount of time spent in methods.
NOTE: a higher-level user interface (combining the MessageTally result tree with a method browser) is available from TimeProfileBrowser. Note that TimeProfileBrowser was not fancy with the different setting possibilities.
TimeProfileBrowser spyOn: [20 timesRepeat:
[Transcript show: 100 factorial printString]]
Strategies
-----------
MessageTally provides two different strategies available for profiling:
* spyOn: and friends use a high-priority Process to interrupt the block or process being spied on at periodic intervals. The interrupted call stack is then examined for caller information. See below for an example showing different settings
* tallySends: and friends use the interpreter simulator to run the block, recording every method call.
The two give you different results:
* spyOn: gives you a view of where the time is being spent in your program, at least on a rough statistical level (assuming you've run the block for long enough and have a high enough poll rate). If you're trying to optimize your code, start here and optimize the methods where most of the time is being spent first.
* tallySends: gives you accurate counts of how many times methods get called, and by exactly which route. If you're debugging, or trying to figure out if a given method is getting called too many times, this is your tool.
Q: How do you interpret MessageTally>>tallySends
A: The methods #tallySends and #spyOn: measure two very different quantities, but broken down in the same who-called-who format. #spyOn: is approximate, but more indicative of real time spent, whereas #tallySends is exact and a precise record of how many times each method got executed.
Examples
----------
Here you can see all the processes computation time
[1000 timesRepeat: [3.14159 printString. Processor yield]] fork.
[1000 timesRepeat: [30 factorial. Processor yield]] fork.
[1000 timesRepeat: [30 factorial. Processor yield]] fork.
MessageTally spyAllOn: [ (Delay forMilliseconds: 100) wait]
+ This profiles across a snapshot, writing the output to {imageName}.N.profile
+ | fn |
+ fn := (FileDirectory baseNameFor: Smalltalk image imageName), '.profile'.
+ [MessageTally
+ spyOn: [Smalltalk image snapshot: true andQuit: true]
+ toFileNamed: fn
+ reportOtherProcesses: true]
+ on: FileExistsException
+ do: [:ex|
+ ex resume:
+ (FileStream forceNewFileNamed:
+ (FileDirectory default
+ nextNameFor:
+ (FileDirectory localNameFor:
+ (FileDirectory baseNameFor: fn))
+ extension: 'profile'))]
Settings
---------
You can change the printing format (that is, the whitespace and string compression) by using these instance methods:
maxClassNameSize:
maxClassPlusSelectorSize:
maxTabs:
You can change the default polling period (initially set to 1) by calling
MessageTally defaultPollPeriod: numberOfMilliseconds
To understand the difference
----------------------------------
Here we see all the processes
[1000 timesRepeat: [
100 timesRepeat: [120 factorial].
(Delay forMilliseconds: 10) wait
]] forkAt: 45 named: '45'.
MessageTally spyAllOn: [10000 timesRepeat: [1.23 printString]]
Here we only see the execution of the expression [10000 timesRepeat: [1.23 printString]
[1000 timesRepeat: [
100 timesRepeat: [120 factorial].
(Delay forMilliseconds: 10) wait
]] forkAt: 45 named: '45'.
MessageTally spyOn: [10000 timesRepeat: [1.23 printString]]
Here we only check the exact message sends: this is not a pc-sampling approach
[1000 timesRepeat: [
100 timesRepeat: [120 factorial].
(Delay forMilliseconds: 10) wait
]] forkAt: 45 named: '45'.
MessageTally tallySends: [10000 timesRepeat: [1.23 printString]]
!
Item was changed:
----- Method: MessageTally class>>initialize (in category 'class initialization') -----
initialize
"MessageTally initialize"
"By default, show each process separately"
+ ShowProcesses ifNil: [ShowProcesses := true].
+ Smalltalk
+ addToShutDownList: self after: Delay; "i.e. convert to relative times & stats after Delay sleeps."
+ addToStartUpList: self before: Delay "i.e. convert back to absolute stats before Delay wakes."!
- ShowProcesses := true!
Item was added:
+ ----- Method: MessageTally class>>runningInstance (in category 'system startup') -----
+ runningInstance
+ "Answer the running instance if the Timer is running."
+ ^Timer ifNotNil:
+ [((Processor activeProcess == Timer
+ ifTrue: [thisContext]
+ ifFalse: [Timer suspendedContext]) findContextSuchThat:
+ [:ctxt| ctxt receiver isKindOf: self]) ifNotNil:
+ [:ctxt| ctxt receiver]]!
Item was added:
+ ----- Method: MessageTally class>>shutDown: (in category 'system startup') -----
+ shutDown: quitting
+ "This message is sent on system shutdown to registered classes"
+ self runningInstance ifNotNil: [:runningInstance| runningInstance hibernate]!
Item was added:
+ ----- Method: MessageTally class>>startUp: (in category 'system startup') -----
+ startUp: resuming
+ "This message is sent to registered classes when the system is coming up."
+ self runningInstance ifNotNil: [:runningInstance| runningInstance unhibernate: resuming]!
Item was added:
+ ----- Method: MessageTally>>computeGCStats (in category 'private') -----
+ computeGCStats
+ "Compute the deltas in the GC stats. Serves for reporting, hibernating and unhibernating."
+ SmalltalkImage current getVMParameters keysAndValuesDo:
+ [ :idx :gcVal |
+ gcVal ifNotNil: [gcStats at: idx put: (gcVal - (gcStats at: idx))]]!
Item was added:
+ ----- Method: MessageTally>>convertToOrFromDeltaForHibernation (in category 'private') -----
+ convertToOrFromDeltaForHibernation
+ "Convert between absolute and relative times and stats (and back!!)."
+ | now |
+ now := Time millisecondClockValue.
+ startTime ifNotNil: [startTime := now - startTime].
+ time0 ifNotNil: [time0 := now - time0].
+ endTime ifNotNil: [endTime := now - endTime].
+ self computeGCStats!
Item was added:
+ ----- Method: MessageTally>>hibernate (in category 'private') -----
+ hibernate
+ "Sent before snapshot. Convert absolute times and stats into relative times and stats
+ Also copy the receiver for the non-snapshot path."
+ preHibernationCopy := self shallowCopy.
+ gcStats := gcStats copy. "So as to leave preHibernationCopy's alone."
+ self convertToOrFromDeltaForHibernation!
Item was changed:
----- Method: MessageTally>>spyAllEvery:on: (in category 'initialize-release') -----
spyAllEvery: millisecs on: aBlock
"Create a spy and spy on the given block at the specified rate."
"Spy all the system processes"
+ | myDelay |
- | myDelay time0 |
aBlock isBlock
ifFalse: [ self error: 'spy needs a block here' ].
self class: aBlock receiver class method: aBlock method.
"set up the probe"
myDelay := Delay forMilliseconds: millisecs.
time0 := Time millisecondClockValue.
gcStats := SmalltalkImage current getVMParameters.
Timer ifNotNil: [ self error: 'it seems a tally is already running' ].
Timer := [
+ [true] whileTrue: [
+ | observedProcess |
- [
- | observedProcess startTime |
startTime := Time millisecondClockValue.
myDelay wait.
observedProcess := Processor preemptedProcess.
self
tally: observedProcess suspendedContext
in: observedProcess
"tally can be > 1 if ran a long primitive"
+ by: (Time millisecondClockValue - startTime) // millisecs].
- by: (Time millisecondClockValue - startTime) // millisecs] repeat.
nil] newProcess.
Timer priority: Processor timingPriority-1.
"activate the probe and evaluate the block"
Timer resume.
^ aBlock ensure: [
"cancel the probe and return the value"
"Could have already been terminated. See #terminateTimerProcess"
+ self class terminateTimerProcess.
+ self computeGCStats.
- Timer ifNotNil: [
- Timer terminate.
- Timer := nil ].
- "Collect gc statistics"
- SmalltalkImage current getVMParameters keysAndValuesDo: [ :idx :gcVal |
- gcVal ifNotNil: [ gcStats at: idx put: (gcVal - (gcStats at: idx)) ] ].
time := Time millisecondClockValue - time0]!
Item was changed:
----- Method: MessageTally>>spyEvery:on: (in category 'initialize-release') -----
spyEvery: millisecs on: aBlock
"Create a spy and spy on the given block at the specified rate."
"Spy only on the active process (in which aBlock is run)"
+ | myDelay observedProcess |
- | myDelay time0 observedProcess |
aBlock isBlock
ifFalse: [ self error: 'spy needs a block here' ].
self class: aBlock receiver class method: aBlock method.
"set up the probe"
observedProcess := Processor activeProcess.
myDelay := Delay forMilliseconds: millisecs.
- time0 := Time millisecondClockValue.
gcStats := SmalltalkImage current getVMParameters.
Timer ifNotNil: [ self error: 'it seems a tally is already running' ].
+ time0 := Time millisecondClockValue.
Timer := [
+ [ true ] whileTrue: [
- [
- | startTime |
startTime := Time millisecondClockValue.
myDelay wait.
self
tally: Processor preemptedProcess suspendedContext
in: (observedProcess == Processor preemptedProcess ifTrue: [observedProcess] ifFalse: [nil])
"tally can be > 1 if ran a long primitive"
+ by: (Time millisecondClockValue - startTime) // millisecs].
- by: (Time millisecondClockValue - startTime) // millisecs] repeat.
nil] newProcess.
Timer priority: Processor timingPriority-1.
"activate the probe and evaluate the block"
Timer resume.
^ aBlock ensure: [
"cancel the probe and return the value"
"Could have already been terminated. See #terminateTimerProcess"
+ self class terminateTimerProcess.
+ self computeGCStats.
+ time := Time millisecondClockValue - time0]!
- Timer ifNotNil: [
- Timer terminate.
- Timer := nil ].
- "Collect gc statistics"
- SmalltalkImage current getVMParameters keysAndValuesDo: [ :idx :gcVal |
- gcVal ifNotNil: [ gcStats at: idx put: (gcVal - (gcStats at: idx)) ] ].
- time := Time millisecondClockValue - time0 ]!
Item was changed:
----- Method: MessageTally>>spyEvery:onProcess:forMilliseconds: (in category 'initialize-release') -----
spyEvery: millisecs onProcess: aProcess forMilliseconds: msecDuration
"Create a spy and spy on the given process at the specified rate."
+ | myDelay observedProcess sem |
- | myDelay time0 endTime observedProcess sem |
(aProcess isKindOf: Process)
ifFalse: [self error: 'spy needs a Process here'].
self class: aProcess suspendedContext receiver class method: aProcess suspendedContext method.
"set up the probe"
observedProcess := aProcess.
myDelay := Delay forMilliseconds: millisecs.
time0 := Time millisecondClockValue.
endTime := time0 + msecDuration.
sem := Semaphore new.
gcStats := SmalltalkImage current getVMParameters.
Timer ifNotNil: [ self error: 'it seems a tally is already running' ].
Timer := [
[
- | startTime |
startTime := Time millisecondClockValue.
myDelay wait.
self
tally: Processor preemptedProcess suspendedContext
in: (observedProcess == Processor preemptedProcess
ifTrue: [ observedProcess ]
ifFalse: [ nil ])
"tally can be > 1 if ran a long primitive"
by: (Time millisecondClockValue - startTime) // millisecs.
startTime < endTime
] whileTrue.
sem signal.
] newProcess.
Timer priority: Processor timingPriority-1.
"activate the probe and evaluate the block"
Timer resume.
"activate the probe and wait for it to finish"
sem wait.
+ self computeGCStats.
- "Collect gc statistics"
- SmalltalkImage current getVMParameters keysAndValuesDo: [ :idx :gcVal |
- gcVal ifNotNil: [ gcStats at: idx put: (gcVal - (gcStats at: idx)) ] ].
time := Time millisecondClockValue - time0!
Item was added:
+ ----- Method: MessageTally>>unhibernate: (in category 'private') -----
+ unhibernate: resuming
+ "Sent after snapshot. If resuming (starting a shapshot), then convert relative
+ times back into absolute times. If not, revert to pre-hibernation state."
+ resuming
+ ifTrue: [self convertToOrFromDeltaForHibernation]
+ ifFalse: [self copyFrom: preHibernationCopy]!
Eliot Miranda uploaded a new version of System to project The Trunk:
http://source.squeak.org/trunk/System-eem.490.mcz
==================== Summary ====================
Name: System-eem.490
Author: eem
Time: 16 July 2012, 5:02:11.416 pm
UUID: 01bb33e7-ec31-4459-8785-fc8b5e63372b
Ancestors: System-laza.489
Pharo/Marcus Denker's shutdown/startup list refactoring
that provides add before, not just add after, and makes
clear the adding direction when no ancestor is given.
=============== Diff against System-laza.489 ===============
Item was changed:
+ ----- Method: SmalltalkImage>>add:toList:after: (in category 'startup list') -----
- ----- Method: SmalltalkImage>>add:toList:after: (in category 'snapshot and quit') -----
add: aClass toList: startUpOrShutDownList after: predecessor
"Add the name of aClass to the startUp or shutDown list.
+ Add it after the name of predecessor"
- Add it after the name of predecessor, or at the end if predecessor is nil."
+ (Smalltalk globals includes: aClass)
+ ifFalse: [self error: aClass name , ' cannot be found in Smalltalk dictionary.'].
+
+ "Add after predecessor, moving it if already there."
+ (Smalltalk globals includes: predecessor)
+ ifFalse: [self error: predecessor name , ' cannot be found in Smalltalk dictionary.'].
+ (startUpOrShutDownList includes: predecessor name)
+ ifFalse: [self error: predecessor name , ' cannot be found in the list.'].
+ startUpOrShutDownList remove: aClass name ifAbsent:[].
+ startUpOrShutDownList add: aClass name after: predecessor name!
- | name earlierName |
- name := aClass name.
- (self at: name ifAbsent: [nil]) == aClass ifFalse:
- [self error: name , ' cannot be found in Smalltalk dictionary.'].
- predecessor == nil
- ifTrue: ["No-op if alredy in the list."
- (startUpOrShutDownList includes: name) ifFalse:
- [startUpOrShutDownList == StartUpList
- ifTrue: ["Add to end of startUp list"
- startUpOrShutDownList addLast: name]
- ifFalse: ["Add to front of shutDown list"
- startUpOrShutDownList addFirst: name]]]
- ifFalse: ["Add after predecessor, moving it if already there."
- earlierName := predecessor name.
- (self at: earlierName) == predecessor ifFalse:
- [self error: earlierName , ' cannot be found in Smalltalk dictionary.'].
- (startUpOrShutDownList includes: earlierName) ifFalse:
- [self error: earlierName , ' cannot be found in the list.'].
- startUpOrShutDownList remove: name ifAbsent:[].
- startUpOrShutDownList add: name after: earlierName]!
Item was added:
+ ----- Method: SmalltalkImage>>add:toList:before: (in category 'startup list') -----
+ add: aClass toList: startUpOrShutDownList before: successor
+ "Add the name of aClass to the startUp or shutDown list.
+ Add it before the name of successor"
+
+ (Smalltalk globals includes: aClass)
+ ifFalse: [self error: aClass name , ' cannot be found in Smalltalk dictionary.'].
+
+ "Add before successor, moving it if already there."
+ (Smalltalk globals includes: successor)
+ ifFalse: [self error: successor name , ' cannot be found in Smalltalk dictionary.'].
+ (startUpOrShutDownList includes: successor name)
+ ifFalse: [self error: successor name , ' cannot be found in the list.'].
+ startUpOrShutDownList remove: aClass name ifAbsent: [].
+ startUpOrShutDownList add: aClass name before: successor name.!
Item was changed:
+ ----- Method: SmalltalkImage>>addToShutDownList: (in category 'startup list') -----
- ----- Method: SmalltalkImage>>addToShutDownList: (in category 'snapshot and quit') -----
addToShutDownList: aClass
"This will add a ref to this class at the BEGINNING of the shutDown list."
+ "No-op if already in the list."
+
+ (ShutDownList includes: aClass name) ifFalse: [ShutDownList addFirst: aClass name]!
-
- self addToShutDownList: aClass after: nil!
Item was added:
+ ----- Method: SmalltalkImage>>addToShutDownList:before: (in category 'startup list') -----
+ addToShutDownList: aClass before: predecessor
+
+ self add: aClass toList: ShutDownList before: predecessor!
Item was changed:
+ ----- Method: SmalltalkImage>>addToStartUpList: (in category 'startup list') -----
- ----- Method: SmalltalkImage>>addToStartUpList: (in category 'snapshot and quit') -----
addToStartUpList: aClass
"This will add a ref to this class at the END of the startUp list."
+ "No-op if already in the list."
+ (StartUpList includes: aClass name) ifFalse: [StartUpList addLast: aClass name]!
- self addToStartUpList: aClass after: nil!
Item was added:
+ ----- Method: SmalltalkImage>>addToStartUpList:before: (in category 'startup list') -----
+ addToStartUpList: aClass before: predecessor
+
+ self add: aClass toList: StartUpList before: predecessor!
Hi folks
I posted this bug on the Mantis system
http://bugs.squeak.org/view.php?id=7694
and Ken Causey helpfully suggested that I might post it here:
OSX 10.7.4
Squeak 3.4 update#11860 <http://bugs.squeak.org/view.php?id=11860>
Display restoreAfter:
[Pen new squareNib: 2; color: Color red; turn: 45;
print: 'The owl and the pussycat went to sea in a beautiful pea
green boat.' withFont: TextStyle defaultFont]
draws text at the correct angle, but the text is patterned
same for defaultNib:1
screen shot at
http://imgur.com/lK949
any help appreciated!
thanks
Chris
--
A/Prof Chris Wright
MBBS, FRACP, FCICM
Academic Coordinator, Years III - V Central MBBS
Intensive Care Specialist
Faculty of Medicine, Nursing and Health Sciences,
Monash University
Clayton VIC
As I knew nothing about the release process while releasing 4.3, I made
a lot of lists on the Squeak Board for other, wiser people to vet. Here
are 10 posts shooting details of that process in all directions. If
you'd like to collate this material, you have my respect. I'm not mad
keen to relive the experience by reading this stuff over and over. All
the names are removed, so I hope I'm not exposing the privacy of any of
my fellow Board members.
Chris
Post #1:
/source43 needs to be created
ReleaseBuilderTrunk class #transferCurrentPackages needs to be executed to populate that repository
#prepareNewBuild needs to be executed on an alpha image to produce the final image
#prepareNewBuild has several related selectors that I need to update changing 2s to 3s and such. It also points to TheWorldMainDockingBar, where my work really is. I need to make it produce two Workspaces as a result of #prepareNewBuild.
The two workspaces contain: what's new in this image; what's the future plan for Squeak.
XXX hasn't seen the swatch that I chose, which has been vetted, and approved, and we're going with:
http://www.16r.ca/ricepaper.jpg
I've been using Form openAsBackground: to put the image in the world. This produces an InfiniteForm. If you take any alpha image and execute InfiniteForm allInstances you will find one, the one Andreas used for 4.1. It's still in there. RBT class #setBackground may need to be jettisoned or World color: InfiniteForm added or something.
Contents of Workspace #2:
Package Management
- This image is currently 16M. If you execute - Smalltalk unloadAllKnownPackages - it will quickly become ~10M
- The SqueakCore image is available athttp://ftp.squeak.org/4.3
- A reasonable target for a core image is 5M, so a drop of ~5M from the smallest image is a task before the community
- A place to explore where to make reductions is likely the removal/replacement of GUIs
- Once we have a smaller core image, we can enact the Andreas Raab memo [1] on how to load code back into the smaller image. This will be based on tests which will clearly delineate the responsibilities of core developers and application developers.
[1]http://lists.squeakfoundation.org/pipermail/squeak-dev/2010-May/150658.ht…
and Workspace #1:
Workspace are Squeak 4.3 - Rice Paper
Changes in this release:
- better control of socket connection timeouts
- blocks and MessageSends are exchangeable in more situations
- added support for threaded VMs
- rejection of literals with superfluous # at the beginning, like #$a #123 ##foo ##(1 2 3), etc
- specify packages either with or without a version-number in Installer
- corrected Complex so arcSin and arcCos let (1 arTanh) return inf
- extend support for MCConfigurations to regular MCDirectoryRepositorys
- full-screen toggle option has been moved out from the menu and onto the bar directly just to the right of the clock for one-click access
- TextEditor is event driven; sensor usage is banned from it
- ancient behavior of selecting whole text when clicking twice before first, or twice after last character is restored
- drag/drop between inspectors; drag a field onto another field to replace the object in it.
- Compiler changed to create subclasses of CompiledMethod
- updated button for "what to show" on CodeHolder similar to Squeak 3.8
- changes enabling both Yellow and Blue buttons from a two-button mouse in Cog VM
- SMxMorphicProject now able to host a SimpleMorphic World
- when present, a SMxMorphicProject is made available in the world menu
Those are the broad strokes. I figure that after this email my only real job will be to submit changes to ReleaseBuilderTrunk and TheWorldMainDockingBar to the Inbox. I will do that early next week. After that, I figure my duty is discharged.
It is to be hoped that we will release the Squeak 4.3 image immediately after the 20th SOB meeting.
If there is anything I have missed in the changes to this release list, please add it.
Post #2:
It's almost perfect, but I'd like to see three changes. The most important
is to save the image from a non-Cog VM, otherwise it cannot be opened on
Windows (and IIRC on Mac) with the interpreter VM.
The other two things are about packaging, so they may be irrelevant (in
case this zip file is not the one which will be available for download):
- the sources file should not be in the zip
- the mac specific files and directories (_MACOSX, ._.DSTORE,
etc) also shouldn't be in the zip
Post #3:
Well, you can delete them on the command line:
zip -d /Users/bert/Downloads/Squeak4.3.zip __MACOSX/\*
For the release itself, I noticed these issues:
- window is too small (784x548). Not even the world menu fits. I'd make it 1024x768 at least.
- shouldn't all Welcome Workspaces be open (or at least minimized)?
- default change set not empty
- Exceptions package is marked dirty
- changes file not empty
(Smalltalk appendChangesTo: 'SqueakV43.sources')
(we didn't do this for 4.2, but it would save 2 MB)
- no update map that matches released packages yet
Non of these are really showstoppers, but maybe having a decent window size and the workspaces open would be nicer to newcomers? At the very least, the license thing?
Post #4:
<process>
trim names of folder, image and changes
ChangeSet allChangeSets: OrderedCollection new
Form openAsBackground:
Smalltalk appendChangesTo: 'SqueakV43.sources'
ReleaseBuilderTrunk prepareNewBuild
open shell to delete .DS_Store from folder
compress
check with Stuffit Archive Manager that there are no artifacts
</process>
<left undone>
pushing changes to ReleaseBuilderTrunk into inbox
update map
?
</left undone>
Post #5:
<process>
take Squeak4.3gamma-11793.zip
update from trunk
now 11852
trim names of folder, image and changes
pull open to ~1024x768 and save (explore World to check)
Form openAsBackground: '/Users/chriscunnington/Desktop/ricepaper.jpg'
Smalltalk appendChangesTo: 'SqueakV43.sources'
ReleaseBuilderTrunk prepareNewBuild
ChangeSet cleanUp: true
compress with Zip Files 4 PC
</process>
<left undone>
update map
SmalltalkImage unloadAllKnownPackages is broken
</left undone>
Post #6:
I was sort of dancing around it, but yea, the RBTrunk doesn't seem to have a direct control of the screen size in my Mac. I've been doing it by hand and checking it by exploring World.
I'lll ensure it's ~800 at 600 <http://lists.squeakfoundation.org/mailman/listinfo/board> or a tad bigger depending on the steadiness of my hand. I'll return the size in #prepareNewBuild to what it was initially. At this point I'd prefer to forego the Etoys code you added this time around and do it by hand. I suppose this means I should upload a change to the Trunk to return things to what they we're. I'm not keen to keep putting things into the trunk just to change them, so I'll hold off on that.
As far as I can see, there are only two things left to do:
<left undone>
update map
as per XXX's email, figure out why the sources file is built corrupted
(Yea, the AbstractSound>>+ message will throw the warning about corrupted sources.)
</left undone>
In a pinch I could abandon both and package an image and changes file to work with 41sources.
Owing to an email from XXX., it seems I needn't think I've run out of time.
That being the case I'll pursue these things today.
Post #7:
I agree with your reasoning. There is one problem: shrinkage. It starts at800 at 600. <http://lists.squeakfoundation.org/mailman/listinfo/board>
And it says that, and has for a long time,800 at 600 <http://lists.squeakfoundation.org/mailman/listinfo/board> in #prepareNewBuild.
Then I execute #prepareNewBuild and it shrinks to something like786 at 548. <http://lists.squeakfoundation.org/mailman/listinfo/board>
I kid thee not.
I figure I'll just drag it back to shape and test it with World extent before saving afterward.
FWIW, #prepareNewBuild is always a weird experience on my Mac. My screen resolution
changes to something much lower. So everything becomes huge. I save and quit the
image and the resolution returns to normal. Odd.
Post #8:
<process>
using Squeak4.3gamma-11860
trim names of folder, image and changes
Form openAsBackground: '/Users/chriscunnington/Desktop/ricepaper.jpg'
ReleaseBuilderTrunk prepareNewBuild
ChangeSet cleanUp: true
check the size with World extent; ensure it's800 at 600 <http://lists.squeakfoundation.org/mailman/listinfo/board>
compress with Zip Files 4 PC
</process>
<left undone>
Smalltalk appendChangesTo: 'SqueakV43.sources'
</left undone>
I think this may be the one. I moved the update-the-map task to a post-image-build list of release related tasks. That list is below. The reason is once you do that the image you used is polluted and is not the one to be distributed. That task can happen the second we have a final image to distribute, it seems to me.
I moved #appendChangesTo: to the left undone category, where I think it should stay until 4.4. Something is creating a compromised source file. I'm not the one to know why. If anybody wants to add to the Trunk to fix this problem, I'll jump at making another image, because I think the result is cool: new sources file; changes file under 1K (which makes me laugh).
As such this packaging has no sources file, as it's assumed we'd use SqueakV41.sources.
If this is the one, then please put it in the box, and post a url, so I can announce on Squeak-dev.
Thanks,
< release related tasks>
- update the map
- a ftp.squeak.org/4.3 folder
- a SqueakCore image at ftp.squeak.org/4.3
- link from squeak.org homepage
- announcement on Squeak News, G+ etc.
</release related tasks>
Post #9:
I've updated the map. I took a Squeak4.3gamma-11793 and updated from /squeak43. It took longer than I'd suppose, but it did update from the map.
It would be good if somebody could try that as well. And perhaps look athttp://source.squeak.org/squeak43 to see if things look right.
On the surface of it, I should be using ReleaseBuilderTrunk>>#transferCurrentPackages, but that did not pan out, so I did it manually in a Workspace. My rant on that is below.
If the things I've done recently are in order, then we only need to do two things: upload two zipped files to the 4.3 ftp folder, and change the link on the homepage of squeak.org to the All-In-One application.
Thanks,
<rant>
transferCurrentPackages
| trunkRep releaseRep |
trunkRep := self trunkRepository.
releaseRep := self releaseRepository.
MCWorkingCopy allManagers
do: [:eachWorkingCopy | eachWorkingCopy ancestors
do: [:eachVersionInfo | (releaseRep includesVersionNamed: eachVersionInfo versionName)
ifFalse: [releaseRep
storeVersion: (trunkRep VERSIONNAMED: eachVersionInfo versionName)]]]
This is a nice sorting method. The problem is that it cannot tell the difference between these two things:
GraphicsTests-ar.29
GraphicsTests-ar.29.mcz
as one is a version name and the next a file name. #transferCurrentPackages winnows a collection of MCWorkingCopy instances
down to a collection of MCVersionInfo instances and then down to a list of version names. Just strings. At this point they need '.mcz'
appended to them. If not, when you feed them one at a time, #versionNamed: will return nil. Then you try to execute this:
releaseRep storeVersion: nil
and nothing happens. Insuring the '.mcz' suffix is added produces a collection of MCVersion instances, which can then be fed into
#storeVersion:.
I followed what #transferCurrentPackages was saying in a Workspace, debugging as I went.
</rant>
Post #10:
I just uploaded the initial 4.4 image. It's 4.3 final without welcome
windows and now pointing to trunk for updates.
We're back to just one directory for 4.4 and I dropped the "alpha"
from the naming convention. This is not only more tidy and neat, it's
more precise since it leaves just the update-number as the sole
indicator about the image.
We will not be troubling ourselves to post any "alpha" images with
major known bugs, but if we are really concerned about someone
downloading the latest alpha trunk image and slamming it into a
mission-critical production app prematurely only because they didn't
know it was alpha -- (yeah, right) then we could have a "disclaimer"
workspace. But since the disclaimer is already spelled out in the
license, even that seems unnecessary.
"Sure there should, but I can't add a new tag nor do I know who (is left
who) can."
That's an interesting thing for you to take upon yourself to say, Laza.
Chris
Squeak Oversight Board