glamorous
toolkit
v1.0.298
Glamorous Toolkit
About this book
Get started
A short history of Glamorous Toolkit
How to give feedback
About this version of Glamorous Toolkit
A tour of the environment
GT in 7' videos
Getting started with GT in 7'
Exploring the GitHub REST API in 7'
Inspecting objects with custom views in 7'
Understanding Lepiter in 7'
How to find stuff in GT in 7'
Smalltalk Syntax in 7'
How to set up a GT GitHub repo in 7'
Scripting, linking, documenting: Lepiter overview
Handling objects: Inspector overview
Managing code: Coder overview
Basic shortcuts
Case studies of Moldable Development
Working with a REST API: the GitHub case study
Browsing the OpenAPI description of GitHub
Exploring GitHub through GraphQL
Exploring your Twitter data
Working with AT Protocol
Editing Rust sources through the Language Server Protocol
Analyzing JavaScript React Native: the Zooniverse case study
Analyzing Ruby on Rails: the Whitehall case study
Analyzing feature toggles from a Python project: the Open edX case study
Visualizing yarn.lock files using JavaScript and Pharo
Documenting the domain: the Ludo game case study
Glamorous Toolkit as a case study
Quantifying the need for custom tools
Explaining the squarified treemap algorithm
Explaining the text editor's selection mechanism
Optimizing the links in the book for first time readers
Testing user interactions: the Spotter case study
Detecting the correct positioning of a dropdown
Identifying an editor bug by inspecting wrapped Rust objects
PetitParser SPL case study
PetitParser SPL case study slideshow
SPL
Parsing SPL tokens
Debugging SPL grammar rules
Extracting a class from a PetitParser script
Testing a PetitParser class
Using PetitParser to build an AST
Implementing an SPL interpreter
SPL Facade
Tutorials
A tour through Pharo
Pharo architecture
A gentle introduction to Pharo Smalltalk
Smalltalk method syntax on a postcard
Understanding Smalltalk message syntax
Understanding Smalltalk method syntax
Understanding Pharo built-in data types
Understanding Smalltalk control structures
Working with collections in Pharo
Implementing a stack machine
A gentle introduction to classes and methods in Smalltalk
Introducing test examples and code cleaning
Understanding self and super
Understanding Smalltalk classes and metaclasses
Understanding reflection
Smalltalk history
Querying Pharo code
Rewriting Pharo code
Drawing graphs with Mondrian by example
Building treemaps
Example-driven development by example
Memory Game
Implementing the Memory Game model
Implementing the Memory Game model logic
Building the Memory Game graphical elements with Bloc
Playing the Memory Game
Building the Memory Game graphics directly with the Sparta canvas
Ludo Game
Implementing a Ludo Game as a moldable development exercise
Smalltalk Introductory lecture
Ludo Exercise 5
Ludo Exercise 6
Creating the basic Ludo Board model
Adding simple list views for Ludo Players and Squares
Placing tokens on the Ludo Board
Creating the Ludo Board view
Implementing the Ludo Die in the Playground
Introducing rules to the Ludo Board Game
Adding a feedback region to the Ludo Board
Tracking the state of the Ludo game play
Testing the Ludo corner cases
Ludo Refactoring — merge Game and Board
Refactoring scenario with Ludo
Ludo Game with first-class moves
Fixing Ludo autoplay and storeStrings
Parsing with PetitParser2
Logging with Beacon
Traversing graphs with DeepTraverser
Explanations
Moldable Development
Explainable software
Developers spend most of their time figuring systems out
The contextual nature of software and the importance of tools
Moldable Development roles: Facilitator and Stakeholder
Facilitator
Stakeholder
The Moldable Development Environment
Mapping Moldable Development
Example-driven
What is the difference between Moldable Development and ...
Moldable Development patterns
Moldable object
Viewable data wrapper
Contextual playground
Viewable entity
Custom action
Project diary
Example object
Simple view
Collection wrapper
Landscape picture
Narrative picture
Glamorous Toolkit and Pharo
A code size analysis
One rendering tree
Geometry, visual and layout bounds explained
How Mondrian relates to Bloc
Moldable Development Exercises
Implementing a moldable Stack Machine
Exploring IMDB movie lists
Exploring a publications database
Implementing a Sudoku solver (open-ended)
How to ...
How to get started with Moldable Development
How to troubleshoot GT
What to do when GT hangs?
How do I recover my work after a crash?
What to do if GT is becomes slow and unresponsive?
I can't load or commit to repos. What's wrong?
What can I do if my repository is detached and I cannot commit my changes?
What should I do if I get an error during Lepiter reload?
How do I add a Lepiter database to an existing repo?
How to work with Lepiter
How to get started with Lepiter (FAQ)
How to create a Lepiter page?
Where are my pages stored?
How do I add new snippets?
How do I move snippets around within a Lepiter page?
How to format text in Lepiter pages?
How do I rename a Note?
How do I find my pages?
How do I move a page to a different database?
How do I search within a Lepiter page?
How do I create a Table of Contents for a Lepiter database?
How do I move a bunch of snippets from one page to another?
How to measure the size of the current knowledge base
How to visualize the current knowledge base
How to snippets for managing the default logical database
How to compute the local sync database status for the default database
How to reload the content of the default logical database
How to programatically register a new database to a logical database
How to load another properties file in the default logical database
How to replace the default logical database instance
How to fix Lepiter loading errors
How to get started with Coder (FAQ)
How to create a new class?
How to add a method to a class?
How to add a slot to a class?
How to change the package or subpackage of a class?
How to rename a class or method?
How to evaluate some code?
How to search for methods?
How to work with GitHub
How to configure Git username and email address
How to deal with "Detached Working Copy" message
How to configure GitHub credentials
How to configure GitHub SSH key authentication
How to configure GitHub token authentication
How to make GitHub credentials persistent
How to set up a new GitHub repo
How to set up a baseline
How to set up a home section
How to ... graphics related
How to change the default fonts in GT
How to scale the UI
How to take a screenshot
How to set the extent of the current window
How to create a standalone app
How to show a picture from a URL
How to parse and manipulate other languages
How to parse sources in different languages
How to translate an ANTLr parser into SmaCC
How to rewrite code in other languages
How to work with the file system
How to work with a remote code synced image
How to work with external child processes
How to execute external commands
How to extract meta information using ExifTool
How to display MacOS native notifications
How to log Zinc events using Beacon
How to snippets for Glamorous Toolkit development
How to update the content of all opened GtWorld instances
How to find where a database is stored on disk
How to measure the performance of delivering remote announcements
How to profile PharoLink remote calls
How to clone, load and release GlamorousToolkit from sources for development
How to clone GlamorousToolkit repositories for development
How to load Glamorous Toolkit code for development
How to create a Glamorous Toolkit release for development
How to create a new GT Vm from a new release of the Pharo Vm
How to install Glamorous Toolkit
How to use gt-installer
How to build a development version of Glamorous Toolkit
How to install Glamorous Toolkit with Nix
How to view the startup and shutdown lists
How to parse Loader and Cloner logs
Components
Lepiter
Class comments as live documents
Snippets
Text snippet
Pharo snippet
Example snippet
Element snippet
PharoLink snippet
JavaScript snippet
JavaScript debugger setup & example
Python snippet
Python Debugger Setup & Example
GraphQL snippet
Wardley Map snippet
Rewrite snippet
Multilanguage notebook
Extending Lepiter with custom snippets and annotations
Announcements for changes in a Lepiter knowledgebase
Inspector
Inspector views
Coder
Programmatic code evaluation
Spotter
Debugging exceptions in Spotter processors
Converting old Spotter searches to use new Spotter
Debugger
Extending the debugger through moldable exceptions
Configuring moldable exceptions
Examples of moldable exceptions
Usages of moldable exceptions in Glamorous Toolkit
Transcript
Presenter
Examples
Running checks as part of the development cycle
Visualizer
Mondrian
Treemap
Plotter
Connector
Phlow
How to test phlow views
SmaCC
SmaCC scopes
PetitParser
Famix
Beacon
Logging VM messages using Beacon
Accessing VM log messages using Beacon
Printing VM log messages to the console
An example of moldable logging using Beacon
DeepTraverser
Remote
JSLink
PharoLink
PythonBridge
RemoteRunner
Remote Runner - checks, examples and tests
Inspecting remote objects using Remote Phlow
Using a simulation for inspecting objects
List Views in Remote Phlow
Releaser
Profiling the execution of a release
Example of parsing a Releaser log for Glamorous Toolkit
Completer
Graphical stack
Driller
Sparta
Bloc
Bloc Elements
Bloc Visual Properties
Element Border
Layouts explained
Layout constraints
Layout resizers
Brick
Asynchronous widgets & futures
Widgets
Accordion
Text editor
Lists
Button
Playing with label aptitudes for buttons
Learning how button model works
Building a custom button appearance
Breadcrumb
Checkbox
Dropdown
Pager
Scripter
Scripter creation
Scripter actions
Futures, Promises & Streams
Futures
Promises
Promise then:, asyncThen:, and then:otherwise: usage
Streams
gt4gemstone
Connecting to the Gemstone repository
Setting up the Gt4Gemstone connection
Managing the Gt4Gemstone server connection
Using Gt4Gemstone to inspect objects
Installing a gt4gemstone release into GemStone
Downloading the gt4gemstone release
Checking the loaded gt4gemstone version inside a GemStone extent
Loading gt4gemstone inside a GemStone extent
Directly installing GemStone and loading gt4gemstone for development
Directly loading gt4gemstone into a Rowan stone for development
Configuring GemStone on MacOS
Manually installing gt4gemstone into a GemStone extent
Loading GT server code into a Rowan stone
Loading GT server code into a non-Rowan stone
Exporting GT server code for loading in a non-Rowan stone
Programatically evaluating code in GemStone
GemStone code synchronisation
Geolife GPS trajectory dataset example
gt4gemstone development
GemStone session registry and manager user interface
gt4magritte
How to define a Magritte form field
How to build a Magritte form
Technical Aspects
Architectural report
Managing dependencies constraint
Ensuring repositories have a Jenkins file
Pages containing missing references - allowed failures
Analysing the size of code-related entities
Analysing the image size and its evolution
Exploring Undeclared Variables
Exploring repositories used when loading GT
Managing forked projects in GT
Changes to the base Pharo image
Exploring extension methods to the base image
Patches/changes to the base Pharo Image
Issues related to patches to the base image
Exploring deprecated Glamorous Toolkit classes
Glossary of Terms
baseline
Example
feenk
Java
JavaScript
JSON
GitHub
Language Server Protocol (LSP)
Markdown
Nix
OpenAPI
Pharo
React
React Native
Rust
Software Assessment
Smalltalk
Wardley Map
XML
x86_64
Remote
TODO