glamorous
toolkit
v1.0.1390
Glamorous Toolkit
About this book
Get started
A short history of Glamorous Toolkit
How to give feedback and contribute
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'
A single starting point for scripting, linking and documenting
Handling objects through custom views
Managing code with Coder
Searching for code, documents and objects in general
Molding the environment
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
Explaining Andrej Karpathy's tokenization explanation
Editing Rust sources through the Language Server Protocol
Editing Python sources through the Language Server Protocol
Inspecting Python objects with custom inspectors
Movies Collection demo in GT
Movies Collection demo in GemStone
Adding gtViews to the existing Python pandas DataFrame and Series class
Exploring the execution of a Python LampSort algorithm
Working with Python Bridge objects
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
Analyzing Spring Boot RESTful web services
Visualizing yarn.lock files using JavaScript and Pharo
Working with the PostgreSQL relational database
Executable domain-driven design: the Ludo game case study
Executable domain-driven design: documenting a price model
Rewriting Rust code
Using d3 to create views for local objects
Glamorous Toolkit as a case study
Quantifying the need for custom tools
Explaining the squarified treemap algorithm
Explaining the text editor's selection mechanism
Scripting an elaborate user interface scenario
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
What is Reflection?
What is Introspection?
Querying objects
Querying classes and methods
Querying the runtime
What is Intercession?
Compiling and performing code
Understanding object pointers
Overriding doesNotUnderstand:
Anonymous classes
Method wrappers
Smalltalk history
Querying Pharo code with GT filters
Rewriting Pharo code
Drawing graphs with Mondrian by example
Building treemaps
Example-driven development by example
Example-driven development tutorial
Warmup: understanding the Money classes
Modeling a Concrete Price
Modeling discounted prices
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
Loading and managing code configurations with Metacello
Querying SmaCC abstract syntax trees (ASTs)
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
Explainable System
Tooling patterns
Moldable Tool
Contextual Playground
Custom View
Custom Search
Custom Action
Composed Narrative
Modeling patterns
Moldable Object
Example Object
Moldable Data Wrapper
Moldable Collection Wrapper
Process patterns
Project Diary
Tooling Buildup
Blind Spot
Simple View
Throwaway Analysis Tool
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 guard against inifinte loops?
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 duplicate a class
How to close all open debugger windows
How to browse examples
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 create a GitLab project
How to set up a home section
Using Libgit-CLI as an alternative to Libgit2 FFI in Iceberg
How to contribute to Glamorous Toolkit through a GitHub pull request
Another way to contribute to Glamorous Toolkit through a GitHub pull request
How to produce signed and verified GitHub commits
How to use the Pure Git tool
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 properly initialize context menus, dropdowns, and tooltips
How to open the Morphic World
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 explore objects pinned in memory
How to get the default finalization registry
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 debug issues related to the code index
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 release for the 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 use a startup script
How to view the startup and shutdown lists
How to parse Loader and Cloner logs
How to use an ICP callback in a web view
How to pages related to the virtual machine
How to get the operating system name
How to limit the old space size in the VM
Components
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
Coder
Programmatic code evaluation
Completer
Examples
Running checks as part of the development cycle
Famix
Filters
Futures, Promises & Streams
Futures
Promises
Promise then:, asyncThen:, and then:otherwise: usage
Streams
Debugger
Extending the debugger through moldable exceptions
How to implement a moldable exception
Configuring moldable exceptions
Examples of moldable exceptions
Examples of assertion failures comparing objects
Usages of moldable exceptions in Glamorous Toolkit
Zinc debugging extensions
DeepTraverser
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
gt4gemstone
gt4gemstone server
gt4gemstone server installation
Downloading the gt4gemstone release
Directly installing GemStone and loading gt4gemstone for development
Directly loading gt4gemstone into a Rowan stone for development
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
Configuring GemStone on MacOS
Checking the loaded gt4gemstone version inside a GemStone extent
Connecting to the Gemstone repository
Setting up the Gt4Gemstone connection
Managing the Gt4Gemstone server connection
Using Gt4Gemstone to inspect objects
GemStone code synchronisation
Geolife GPS trajectory dataset example
How to profile GemStone remote calls
Investigating GemStone operation performance
How to pages related to GemStone
How to programatically evaluate code in GemStone
How to work with styled text in GemStone
How to reset the GemStone connectors in default registry
How to get the content of the current gem log file
How to for gt4gemstone development
How to - snippets with multiple halts for resume in the GemStoneDebugger
How to - managing remote bindings in a GemStone snippets
gt4gemstone development
GemStone session registry and manager user interface
Debugging remote GemStone views
Improving the performance of the GemStone inspector
gt4magritte
How to define a Magritte form field
How to build a Magritte form
Inspector
Inspector views
Inspector actions
Lepiter
Lepiter 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
Shell snippet
Wardley Map snippet
Rewrite snippet
Class comments as live documents
Multilanguage notebook
Extending Lepiter with custom snippets and annotations
Announcements for changes in a Lepiter knowledgebase
Loader
Example of parsing a Cloner and Loading log for Glamorous Toolkit
Phlow
How to test phlow views
PetitParser
Presenter
Releaser
Profiling the execution of a release
Example of parsing a Releaser log for Glamorous Toolkit
Remote
JSLink
PharoLink
PythonBridge
Getting started with the Python Bridge
Basic usage of the Python Bridge
Python Bridge troubleshooting
Using an independent Python Bridge instance
Running the PythonBridge in another directory
Using an externally started, already running Python Bridge instance
Connecting to a remote Python Bridge instance
Using an alternative Python Bridge controller process
Python Bridge cleanup
Debugging remote Python views
PythonBridge custom views for pandas DataFrame and Series
Working with Python source files
RemoteRunner
Remote Runner: start manual runner and workers
Remote Runner: checks, examples and tests
Inspecting remote objects using Remote Phlow
Using a simulation for inspecting objects
Specifications and Views in Remote Phlow
SmaCC
SmaCC scopes
Spotter
Molding Spotter searches
Debugging exceptions in Spotter processors
Converting old Spotter searches to use new Spotter
Transcript
Visualizer
Mondrian
Treemap
Plotter
Connector
World
Technical Aspects
Architectural report
Architectural report for Glamorous Toolkit development
Managing dependencies constraint
Ensuring repositories have a Jenkins file
Ensuring repositories have a .gitattributes file
Pages containing missing references - allowed failures
Analysing the size of code-related entities
Analysing the size of the code index
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
Overrides of the base image using #gtPharoPatch:
Patches/changes to the base Pharo Image
Issues related to patches to the base image
Changes in GT for supporting in Pharo 12
Exploring deprecated Glamorous Toolkit classes
Lepiter Iceberg Integration Model
Iceberg model and inner workings
Using Parallels to run GT on other platforms
Experemental Development
Strict Symbol Comparison
Strict Symbol Comparison with literals
Strict Symbol Comparison with variables
Strict Symbol Comparison in Collections
Strict Symbol Comparison in HashedCollections
Strict Symbol Comparison logging offline
Strict Symbol Comparison logging during development
Strict Symbol Comparison - Enabling
Glossary of Terms
AST
Bash
Example
feenk
Java
JavaScript
JSON
GitHub
Language Server Protocol (LSP)
Markdown
Metacello
Metacello baseline
Nix
OpenAPI
OpenGL
pandas
Pharo
Powershell
Python
React
React Native
Reflection
Rust
Software Assessment
Smalltalk
Wardley Map
XML
x86_64
Tooling patterns
These are patterns that enable the cheap creation of custom tools.