About this book
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
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 Ruby on Rails: the Whitehall case study
Analyzing feature toggles from a Python project: the Open edX case study
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
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
A tour through Pharo
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
Querying Pharo code
Rewriting Pharo code
Drawing graphs with Mondrian by example
Example-driven development by example
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
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
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
The Moldable Development Environment
Mapping Moldable Development
What is the difference between Moldable Development and ...
Moldable Development patterns
Viewable data wrapper
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
Class comments as live documents
Python Debugger Setup & Example
Wardley Map snippet
Extending Lepiter with custom snippets and annotations
Announcements for changes in a Lepiter knowledgebase
Programmatic code evaluation
Debugging exceptions in Spotter processors
Converting old Spotter searches to use new Spotter
Extending the debugger through moldable exceptions
Configuring moldable exceptions
Examples of moldable exceptions
Usages of moldable exceptions in Glamorous Toolkit
Running checks as part of the development cycle
How to test phlow views
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
Remote Runner - checks, examples and tests
Inspecting remote objects using Remote Phlow
Using a simulation for inspecting objects
List Views in Remote Phlow
Profiling the execution of a release
Example of parsing a Releaser log for Glamorous Toolkit
Bloc Visual Properties
Asynchronous widgets & futures
Playing with label aptitudes for buttons
Learning how button model works
Building a custom button appearance
Futures, Promises & Streams
Promise then:, asyncThen:, and then:otherwise: usage
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
GemStone session registry and manager user interface
How to define a Magritte form field
How to build a Magritte form
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
Language Server Protocol (LSP)