Categories
Posts in this category
- A shiny perl6.org site
- Creating an entry point for newcomers
- Sprixel, a 6 compiler powered by JavaScript
- Another perl6.org iteration
- Blackjack and Perl 6
- Why I commit Crud to the Perl 6 Test Suite
- Report from the Perl 6 Hackathon in Copenhagen
- Custom operators in Rakudo
- Defined Behaviour with Undefined Values
- Dissecting the "Starry obfu"
- Perl 6: Failing Softly with Unthrown Exceptions
- The first Perl 6 module on CPAN
- Google Summer of Code Mentor Recap
- Building a Huffman Tree With Rakudo
- Immutable Sigils and Context
- Is Perl 6 really Perl?
- Perl 6: Lost in Wonderland
- Lots of momentum in the Perl 6 community
- Musing and the future of feather and the Pugs repository
- Musings on Rakudo's spectest chart
- My first executable from Perl 6
- Trying to implement new operators - failed
- Let's build an object
- Perl 6 is optimized for fun
- How to get a parse tree for a Perl 6 Program
- Perl 6 in 2009
- Perl 6 ticket life cycle
- The Perl 6 Advent Calendar
- How to Plot a Segment of a Circle with SVG
- Publicity for Perl 6
- Rakudo architectural overview
- Rakudo Rocks
- Rakudo "star" announced
- Rakudo's rough edges
- Rats and other pets
- Releasing Rakudo made easy
- Set Phasers to Stun!
- Starry Perl 6 obfu
- Recent Perl 6 Developments August 2008
- Strings and Buffers
- Subroutines vs. Methods - Differences and Commonalities
- A SVG plotting adventure
- A Syntax Highlighter for Perl 6
- Test Suite Reorganization: How to move tests
- The Happiness of Design Convergence
- Perl 6 Tidings from September and October 2008
- Perl 6 Tidings for November 2008
- Perl 6 Tidings from December 2008
- Perl 6 Tidings from January 2009
- Perl 6 Tidings from February 2009
- Perl 6 Tidings from March 2009
- Perl 6 Tidings from April 2009
- Perl 6 Tidings from May 2009
- Perl 6 Tidings from May 2009 (second iteration)
- Perl 6 Tidings from June 2009
- Perl 6 Tidings from August 2009
- Perl 6 Tidings from October 2009
- Timeline for a syntax change in Perl 6
- Visualizing match trees
- We write a Perl 6 book for you
- When we reach 100% we did something wrong
- Where Rakudo Lives Now
- Why was the Perl 6 Advent Calendar such a Success?
- What you can write in Perl 6 today
- Why you don't need the Y combinator in Perl 6
Thu, 17 Sep 2009
The Happiness of Design Convergence
Permanent link
Recently I've been having fun writing a plotting module for Perl 6. It's been really fun because adding new shiny things (titles, new chart types, whatever) has been relatively easy, and there was fast visual feedback.
However it's really just a toy module, lacking proper design. When I added legend boxes to one of the chart types (the lines plots), I noticed how much hassle it was, and that I needed code changes in many places to incorporate that feature into other chart types too - that's what you call "design smell".
So I thought about how to improve it, and the answer was quite obvious. Currently each thing that I plot (the data representation, the axis, ticks, labels, title, legend box) know where to place itself, so if I need more space for the legend box every piece has to adapt. Which is ugly.
Instead, I should just make each of them plot itself on to coordinates
(0, 0), record their width and height, and later move (and
possibly scale) them to fit onto the canvas (Note that I only planned that so
far, I implemented the boxing only for a single component so far).
Flashback to the past: Shortly after announcing my very early SVG::Plot module masak pointed me to Scruffy, a small ruby based SVG plotting library that produces beautiful graphs. I looked into the source and found that it was spread into about 50 classes, all of which were short and sweet. I didn't really understand the code, mostly due to lack of Ruby reading skills, and lack of effort.
So I and others decided to port scruffy to Perl 6, the Perl 6 version will
be called Tufte. And after
re-reading the Scruffy source code I noticed that it was doing just what I
planned for SVG::Plot: it encapsulates each graphical element into components
(called Scruffy::Components::*). On top of that it allows
multiple plots per canvas (the plots are called
Scruffy::Layers::*), and allows arranging of them too.
So I was happy to come up with the same idea as the Scruffy hackers, independently, reassuring me that I actually port a nicely designed library ;-)