00:00:10.690
Well, good morning everyone. Thank you for coming. My name is Jason Clark, and I work at New Relic, although that has nothing to do with this talk today.
00:00:16.759
This is something entirely different. Before I get started, I have a quick little story and a request for you all.
00:00:25.880
Back in college, one of my best friends, whom I have known since I was five years old, and I had one class together. It was a software engineering class.
00:00:39.860
My friend Mike is a funny guy, a bit quirky, and fun to be around. One funny thing he did in this software engineering class was introduce a concept he called the "learning chicken."
00:00:52.460
Anytime the professor said something particularly profound, he would balk like a chicken. It was so much fun; it transformed a software engineering class that could have been dry into something engaging.
00:01:08.300
I want to bring that forward today. During this talk, if at any point you feel like you've learned something, I want you to yell out "Give me a chicken!" Let's practice that. If you don't do it, I might find a couple of moments to put it in myself. But call on me and let me know when you're feeling inspired.
00:01:32.900
So, we're here today to talk about Shoes, and the motivation behind this talk, and this piece of software, is to answer a question I hear from beginning programmers a lot: "Where do I start?"
00:01:44.869
There are so many different ways to approach computing today. A common recommendation is web development, since everybody has a browser on their computer, and anyone can write some HTML and JavaScript.
00:02:01.160
That's a great starting place, but man, taking a step past that into servers, HTTP, and other complexities can be daunting for a beginner trying to learn the basic structure of programming.
00:02:23.110
It's even worse when it comes to mobile. You might feel inclined to create something for the phone you spend all your time staring at, but the challenges multiply with IDEs, statically typed languages, and more.
00:02:36.230
So today, I want to propose a radical idea—perhaps a bit too radical. There is another place we can write computer programs that run on our desktops.
00:02:55.360
The immediacy of feedback we get from running programs on our desktops is quite valuable. If you've ever tried GUI programming on the desktop, you know that many frameworks can be complex and cumbersome.
00:03:09.400
This is not to pick on Java; I've seen equally complex code in C++ and C#. Even some Ruby libraries that bind low-level GUI pieces can be quite hard to read and write.
00:03:22.910
This brings us to Shoes, a GUI toolkit for Ruby. It's essentially a Domain Specific Language (DSL) designed to make it pleasant and easy to write GUI applications that run on Windows, Mac, and Linux.
00:03:40.480
It's cross-platform because we want everyone with any sort of computer to be able to write these programs. To get the current version of Shoes, you'll need JRuby.
00:03:57.260
You can use your Ruby manager of choice to install it, then simply run "gem install shoes." Currently, it's still in a pre-release state. After that, you can say "shoes" and point it at a Ruby file with a Shoes application.
00:04:09.640
Let’s take a look at what Shoes applications actually look like and compare them to the older GUI programming examples. Here's the minimal Shoes application.
00:04:20.630
You say "shoes app" to start the application and give it a block. We make heavy use of the block construct in Ruby, which runs whatever is inside, creating your application. Right now, it's empty, but this is a Shoes application.
00:04:41.170
I can run this code live for you, and that's what it looks like—an empty window. I don't know about the rest of you, but I feel like that's a chicken moment: two lines of code to get a window!
00:04:54.889
Empty windows are nice, but they won't keep someone entertained for long, so we want to put something into that window. One of the basic elements in GUI applications is text.
00:05:13.200
Shoes provides various helpers to let you show text at different sizes, and there are styling controls we can look at later. For now, if we run this application, we'll see three pieces of text—one in title size, another in tagline size, and one in paragraph size.
00:05:30.780
But putting text into a window will only entertain users for so long; eventually, they will want to interact with their program.
00:05:42.440
This is where Shoes beautifully uses Ruby's block construct. Instead of setting up anonymous functions and doing complicated setups, you just call the button method, give it the button text, and use the block to specify what happens when the button gets clicked.
00:06:07.100
Shoes also provides an alert method to bring up an alert box. Let's see this in action. Here’s our click button. I click it, and when we do, we see the alert. Now that's excellent!
00:06:20.630
Eventually, you want input from the outside world, which is where the basic form elements come into play. In Shoes, we use the EditLine for a single-line text box. We assign that to a variable, and we can use that input later inside our block.
00:06:44.000
When we click this button, it alerts us with the text we put into that box. Let's say something. When we click it, we get the expected alert.
00:07:03.420
This sort of setup usually requires a lot of wiring in other GUI frameworks, but Shoes keeps it simple. If you're building an application, you’ll eventually care about how things are laid out.
00:07:29.990
While you can position elements explicitly by pixel value, Shoes provides stacks and flows to control how elements are laid out. Stacks arrange elements vertically, while flows arrange them horizontally.
00:07:49.640
If we have enough room in the window, the elements will display all the way across. However, if we resize the window, the elements will adjust and move down accordingly.
00:08:14.150
This presents a natural flow, similar to how HTML behaves, without needing to write complicated div tags or CSS styles.
00:08:31.500
Shoes is also driven by many styling properties. You can access these properties easily using Ruby's hash syntax. You can set the font, color, size—many elements have well-documented properties.
00:08:47.300
These properties will continue to improve with better documentation before the final release.
00:09:05.000
Those features are lovely, but I have found that doing programming with my kids using Shoes is really fruitful. Text boxes, buttons, and similar features are fun, but many kids enjoy drawing and creating pictures on the screen.
00:09:20.100
Shoes has basic support for drawing shapes with simple methods. You can create rectangles, ovals, stars, and more, specifying fill color for the shapes.
00:09:37.500
My daughter has spent countless hours choosing colors for her shapes in Shoes programs. She often enjoys the drawing aspect even more than programming itself.
00:09:54.700
This application can illustrate how shapes can overlap, and the order in which they are drawn affects how they are displayed. It's a great way for kids to learn procedural thinking.
00:10:06.640
One of my favorite contributions to open-source comes from a project my daughter and I worked on together. She helped figure out the shapes to put this together as an exercise in decomposing the drawing into parts.
00:10:30.700
This chicken picture is for my daughter Cora, who unfortunately is not on the live stream today. However, she'll get to see the video later.
00:10:44.260
That concludes a brief tour of the essential features in the Shoes DSL. There’s much more to explore, including ways to create widgets, animations, and other form elements.
00:11:01.390
This is one of my favorite examples. The simple act of drawing ovals with some opacity creates a fascinating effect. Remarkably, this entire visual can be produced with just six or seven lines of Shoes code.
00:11:22.610
Games are also a massive motivator. Many sophisticated Shoes samples are games. For example, we have a tic-tac-toe program, though I might not be great at it.
00:11:36.740
Another favorite of mine, which I rigorously test while working on, is Tetris. Yet, I often find myself getting sidetracked and playing the game instead of conducting tests.
00:11:55.950
There are ample possibilities with the basic features we've discussed, but another remarkable aspect of Shoes is its packaging capabilities.
00:12:08.260
For a beginner, getting your program into someone else's hands can be challenging. However, Shoes provides a streamlined way to package applications.
00:12:26.070
With the Shoes gem, you can use the "package" command and specify whether it’s a Mac, Windows, or Linux app. Point it at your Shoes application file, and it will generate the appropriate application bundle.
00:12:45.300
This cross-platform support is significant. You can create a Windows version while using a Mac; you don’t need to compile on the specific operating system.
00:12:56.809
The resulting packages are compressed files—either .tar.gz or .zip, depending on the operating system. For example, here's one generated for Mac that looks just like an application.
00:13:13.350
Making the Mac version polished is a significant achievement, but there's still work to do for Windows and Linux to make them as native as we’d like.
00:13:27.380
At the heart of Shoes is the simple DSL and the packaging system, which makes it easy to share your work.
00:13:45.070
Part of my interest in Shoes also stems from its history. It was originally created by the talented Wai ‘the lucky stiff.’ How many of you have heard of him?
00:14:02.060
I'm glad to see a mix of awareness. For those unfamiliar, he was a notable figure within the Ruby community who eventually vanished. It’s worth discussing his contributions.
00:14:16.389
One of his major projects was Hackety Hack, a programming environment designed for kids to start GUI programming. Hackety Hack was built with Shoes to enable users to run Shoes programs.
00:14:34.790
Unfortunately, Wai disappeared in 2009, deleting his website and code. Though some of his projects had copies preserved, many fell into disrepair.
00:14:53.260
Many folks assumed that Shoes would die with him, but something interesting happened; Shoes remained alive. People loved the DSL and the simplicity it offered.
00:15:11.300
After Wai's disappearance, several attempts were made to maintain the project. Green Shoes rewrote the GUI using GTK, Blue Shoes did the same with QT, and another version was created on the JVM.
00:15:29.660
Other versions emerged, including those using HTML and JavaScript, CoffeeScript, and more, as the community worked to replicate Shoes' functionality in a more maintainable way.
00:15:47.860
Eventually, the Shoes community consolidated into the Shoes4 project. Rewrites can be perilous, but this one was vital for creating a future-proof solution.
00:16:09.500
Part of that was ensuring cross-platform support. Java emerged as a suitable option due to its built-in features for creating applications that work across Mac, Windows, and Linux.
00:16:27.150
With JRuby, these capabilities became highly accessible for us. This allowed Shoes4 to build on a robust cross-platform UI system while remaining entirely in Ruby.
00:16:45.599
I'm excited to share that Shoes4 started in 2012 and only recently released its first candidate version!
00:17:01.879
It's been a long time coming, and I'm thrilled! Please install JRuby, file reports on our issues, and help us hit a full release by the new year. Exciting times ahead for Shoes.
00:17:16.700
As this project was progressing, many folks from the Shoes community tried to maintain Wise's original code, but they had difficulties compiling it.
00:17:31.689
Yet people loved Shoes, and the Shoes3 team kept it alive and stable, introducing new features while remaining predominantly in C.
00:17:47.710
Shoes4, in contrast, offers a more manageable development environment. It's important to mention that it can run on Raspberry Pi, as it’s based on MRI.
00:18:04.690
Both Shoes3 and Shoes4 are viable codebases that continue to offer this wonderful DSL that we all admire.
00:18:20.679
Let's briefly discuss Shoes4's structure; it functions similarly to Rails, where multiple gems reside in a single repository. The primary gem, called Shoes, mainly serves as a meta gem.
00:18:35.540
It installs dependencies and provides executable files, while the core mechanics exist in two packages: Shoes Core and Shoes SWT. This separation is intentional.
00:18:50.600
Shoes4’s architectural goal was to establish a clear distinction between the DSL (the user interface) and the underlying GUI code. This design aids the community in potentially creating other rendering methods.
00:19:08.080
Thanks to prior efforts, there exists an SWT gem that wraps low-level Java primitives nicely. We’re grateful for that foundation.
00:19:21.570
Packaging support has its dedicated gem called ShoesPackage, built on Warbler—enabling us to create a single Java JAR file of our Ruby code.
00:19:38.080
However, while Warbler generates a JAR file, it doesn't offer the appearance of native applications on various operating systems.
00:19:52.690
To address this, Shoes features another project called Furoshiki, which manages OS-specific packaging, meaning it can convert a JAR file into a Mac application, for example.
00:20:12.300
Additionally, our manual is separated into its own gem, which enables us to share content efficiently between our website and interactive manuals.
00:20:27.480
We certainly have much to discuss regarding Shoes, but I also want to encourage you all to contribute back. The Ruby community offers countless benefits, providing easy access to software that would have been unimaginable a decade ago.
00:20:45.450
If you have the opportunity, consider getting involved with these projects. It’s an enjoyable way to learn new skills and improve your coding ability.
00:21:01.700
Shoes is an excellent candidate for engagement. We have a 'newcomer-friendly' tag on our issues, making it easier for those looking to contribute.
00:21:14.309
If you primarily write Rails or web applications, working with desktop GUI software will offer a new perspective. Finally, I'm excited to announce we have shoes stickers for the new release.
00:21:29.179
We have a new logo design, and I have stickers featuring the classic Shoes logo for anyone nostalgic. Please come see me if you'd like one.
00:21:47.360
Thank you!
00:22:11.000
It could run on any Ruby version. The DSL interacts through a specific namespace, with all JVM-specific elements behind the scenes.
00:22:26.100
Discussing Shoes3, it's unlikely they will implement this method due to substantial investments in how native code interacts.
00:22:42.300
However, we have talked about sharing some spec suites and testing across projects. We just rejoined under the same organization, so moving forward is feasible.
00:22:56.830
The question regarding Shoes4 downloading dependencies is affirmative. It attempts to utilize a locally installed JVM.
00:23:11.860
If it cannot find one, we do have a version for use locally in the package. As for native libraries, Ruby-related libraries are supported within the package.
00:23:27.780
However, native libraries connected via FFI might not be fully integrated. That’s a pertinent question.
00:23:43.890
Regarding Shoes and Electron, I can't detail much on Electron's functionality as I haven’t engaged in its development. Shoes is more opinionated; it's simpler for those getting started.
00:24:00.050
Should you require a precise layout, Shoes may not be the ideal choice, but it's a Ruby framework that caters to new learners, making it accessible.
00:24:16.530
As for whether the presentation was made using Shoes, indeed, this session utilizes Wingtips, a presentation library built on Shoes.
00:24:34.120
While it runs as a Shoes application, it allows for flexibility in code execution across Ruby files.
00:24:49.610
The question asked is whether we have developed screen capture functionality. I think it could work well with native OS elements.
00:25:04.830
We haven't developed a method for easy screen captures yet, but it’s something that would be beneficial.
00:25:23.540
The question pertains to whether Shoes is utilized in any learning curriculums. I'm not aware of any extensive educational frameworks, only tutorials derived from Hackety Hack.
00:25:39.720
If anyone is informed about learning resources, please do reach out to me. I think we are almost out of time.
00:25:52.560
Thank you very much for your attention!