This article makes up the second part in a little trilogy about going to #inspect, the first RubyMotion conference. I expect a few updates as more content comes in, so you might like to check back. If you haven’t, you should read the first part to get acquainted with the cast of characters and events so far. Part one ended with my sister Ashley and I finding the group for the first time before the speaker’s dinner. And with that we continue.
It always feels a little strange to meet online friends in real life. I recognized a bunch of the people from the list. I met Laurent, who watched the Lord of the Rings on the way over, a fine choice. I would have watched the Hobbit. I fit in just fine.
They took a while to bring us our food at the restaurant, and didn’t quite know what to make a vegetarian. I settled on pasta, you can only eat so much salad. I didn’t mind, I felt glad enough to have found everyone. People gradually left, and we ended up back at Delirium. We had a wonderful time. I met a guy named Bret, who runs a coworking space in New Jersey. We hit it off and agreed to go to each other’s respective spaces. I also met one of the speakers named Rich who would talk about Bluetooth 4.0 technology, something I felt very excited about. And I got to meet Colin, who writes Teacup and other gems. We worked together on a number of things during the conference. We stayed out pretty late, and I wondered how we would pull this off.
I tried to wind down back in the room by listening to the new They Might be Giants album, but that didn’t happen. At around 03:00 in the morning, Adriano emailed me needing some feedback on the slides. Remember those? We ended up on FaceTime, me in my bed, Adriano and Bill at Indy Hall. Dana also said hi, and Kara laughed in the background. It felt like a connection to home. At around 04:30 we finally finished. I had the final presentation in Keynote and .pdf formats just in case. I thanked Adriano profusely and hung up for my two hours of sleep before giving my speech, one of the high points of my life. Whatever, somehow it would work out. I meditated and just let go. It would work out.
The goddamn alarm went off way too early. I didn’t even allow myself to feel tired. I got up, showered in the water with the fluctuating temperature, and got dressed in my fine new suit. Everyone says I look great in it. Before now I didn’t understand why most people just keep believing these politicians and other liars on television. Now I get it: because they have a nice suit. Nothing more.
Ashley found the venue, then left to go back to the hotel and sleep. One of the assistants named Mark went and bought a croissant for me from a nearby stand since they had run out of food. That, two cups of mint tea, and some amazing fresh juice provided a good breakfast. I waited in the speaker’s room for a break to come in.
I missed the first talk, but Nick Quaranto and I had a good chat later. Karl Krukow talked about behavior driven development with Calabash. I really want to learn more about this. It has a console where you can programmatically tap buttons and examine accessibility labels. Plus they make pipes out of calabash, which gives me a good association. Sherlock Holmes had one.
Rich Kilmer gave his talk about Bluetooth, which we had started discussing the previous night. The blind would love an indoor navigation solution, and this technology provides the way. It blue my mind, pardon the pun. Next, Matt Green spoke about his Elevate gem, which helps separate control logic and run things concurrently. He made a great joke: MVC stands for Massive View Controller. This tries to help with that. It really impressed me. As Matt’s speech ended I realized the time had come. I would give my speech next. It all came down to this.
We had a fifteen minute period to get ready. Laurent didn’t receive the email containing my slides, so we scrambled and someone gave me a USB thumb drive to put it on. Funnily enough, it had a pirated copy of the Hobbit on it. I downloaded that torrent! I put my slideshow on it and Laurent got it setup.
Sighted people can see the slides here. Ironically, this link to a presentation about accessibility does not work with screen readers. Do not go there if you use one! S o m e t h i n g b a d w i l l h a p p e n! Not really, but it reads out the slides letter by letter.
Meanwhile I had another problem. My sister had not arrived. We had talked about her running the slides, though I asked for volunteers in case she didn’t want to, since she hates computers, or as she says since computers hate her. Now I could not find or communicate with her. This annoyed me. I bought her for this express purpose.
I couldn’t let it bother me however. No way to go but forward, to quote Bilbo. Colin said he would run the slides. I felt confident, given he had developed countless gems and posts constantly on the list. So at the absolute last minute I had the slides and a person to run them. We definitely got down to the wire with this one!
The time had come. I stood in front of the podium and switched on my digital recorder. Colin had the slides ready. I had my notes open. And with two hours of sleep, a group of wonderful helpers thrown together at the last minute, and a good set of notes, I commenced to give an amazing speech. You can watch the video. I also made a medium quality recording.
I began with a little personal history to set the stage. I became blind at birth and started programming at young age. I used an Apple II/e, then moved to MSDOS, then Windows unfortunately, then Linux, and finally iOS and Mac OS. I told the events recounted in my article which went viral. I showed what a big difference the iPhone makes in the lives of the blind by showing a chart comparing the prices of an iPhone with apps and a Bluetooth keyboard versus lots of assistive technology. You save twelve times the amount, $300 vs. $3600! I mentioned a few apps, including Color Identifier, LookTell Money Reader, TapTapSee, Talking Scientific Calculator, BlindSquare, Fleksy, and of course Beer Buddy. I ended this part with a simple demonstration of VoiceOver.
Next, I moved to how to make apps accessible. I discussed the UIAccessibility Informal protocol, the UIAccessibilityContainer Informal Protocol, the UIAccessibilityElement attributes, and the UIAccessibilityAction Informal Protocol. I also showed some code examples. Basically I just ripped off Apple’s accessibility programming guide and ported the examples to RubyMotion. I covered setting attributes in the subclass implementation and in the instanciation code. I covered UIPickerViews, custom containers, UITableViews, making non-textual data accessible, and making dynamic content accessible.
Lastly, I talked a little about my own journey learning to write apps as a bind developer. Programmers have very personal preferences about their favorite languages, so I didn’t want to dwell too much on the subjective, but I get more done in Ruby, and to me it sounds better with speech. Speaking more objectively, XCode works horribly with VoiceOver. I have known blind developers who have given up learning how to write apps because they can’t deal with XCode. Give me Ruby and Emacs and the terminal any day!
I then covered some challenges a blind developer might have using RubyMotion. The iOS Simulator does not work well with VoiceOver. This also means that we cannot use the REPL, the amazing Read-Eval-Print-Loop which RubyMotion provides. We have to use the RubyMotion debugger, a version of gdb with some added features. It works well enough, but the experience could always use improving. The developers know and have some exciting things in the works for the future.
Interface Builder doesn’t work at all with VoiceOver. I expected this from a totally visual program. This means that the blind have no choice but to build views programmatically. Fortunately this has become the trend in the RubyMotion community, so that works itself out. Gems like Geomotion and Teacup help with this.
I saved the best for last. Functional testing improves accessibility, because the UIAutomation framework uses the accessibility label. This means if you write good tests and label your controls properly, you have gone a long way to making your app more accessible. What a bargain!
I closed with some upbeat statements. The future of RubyMotion looks very good. The iPhone allows the blind to do wonderful things. Developers can make their apps accessible very easily in most cases. I left everyone with this thought: if Apple wouldn’t have made the iPhone accessible, I would not stand here giving this talk. Everyone applauded. I had done it.
A question and answer period followed. Someone asked if I could name some of the most accessible apps. My head sort of went blank, since a lot of apps work well. It gets rather hard to quantify. I gave Tweetlist as an example of a good Twitter client. I directed them to Applevis, which has usability ratings.
Someone asked if I could think of anything Apple could improve about VoiceOver. I couldn’t think of anything major at the time, since it gives a pretty unparalleled experience. Since then I have come up with something: I wish they would add more keyboard navigation commands. On the Mac you can navigate by sentence and paragraph, and correct misspelled words easily. I would write more on the iPad if I could edit more effectively.
Then someone asked a wonderful question: if anyone had written anything to help automate accessibility testing for iOS. My mind raced. Not to my knowledge, but I immediately saw the potential, especially with RubyMotion’s unit testing framework. Ideally a spec file should just say “view.should.be.accessible” and have it run a series of appropriate tests. I plan to do this, and consider it a very exciting project. It will become yet another great RubyMotion-only feature.
I felt spent, but still had an afternoon of talks ahead. We had lunch, I had grilled and fresh vegetables. They promised me the next day I wouldn’t have to wait for a vegetarian meal. I didn’t mind. And they had excellent desserts, chocolate mousse and brownies and lots of other things. My blood sugar level rose.
Oh my goodness! The afternoon began with an intense talk by Jonathan Penn about CoreData. I can’t say I understand it enough to use it, but I understand more than I did, so feel good. I have much to learn. Josh Ballanco followed this up with a talk about gdb. Since I can use nothing else I really paid attention to it, and would love to get the notes from it. Writing ruby code in Objective C warped my brain. Something like [object instance_variable_get: @“@var”]; I don’t know. I have to see it written down. Mateus Armando gave a heavy talk about concurrency, and we had chatted a little the night before as well. I started to also understand the appeal of functional programming. The day ended with talks about two IDEs, RubyMine and Redcar. Since I can’t use either I sort of tuned out, but hope they’ll make a cocoa plugin for Redcar.
The talks had ended for the day, and my sister still had not turned up. I panicked, since as I wrote we could not communicate. A few of us went to a bar and left instruction should she show up. Colin guided me.
While there, I talked to some of the speakers. I talked to Jonathan about CoreData. Inspired by Sparkleshare, I came up with the idea to use a GIT repository as a data store. I really like this idea, and hope someone does it. Rich and I talked about Bluetooth 4.0 It b-l-u-e my mind! Josh and I talked about gdb. I need his notes!
And Colin and I talked about the automated accessibility idea. He also showed me an amazing little gem he worked on which would become Motion::Xray. Shaking the phone brings up a view inspector. It gives you information about each view and lets you edit it on the fly. You can email the results to yourself. He would debut it the next day and wanted my input on its accessibility. We found some problems and he fixed some, and I plan to help make it even better.
We ate some okay food and drank some wonderful Belgian beer. I still hadn’t found my sister, so figured I should go back to the hotel. Colin volunteered to take me back. Once there the receptionist called up to the room and my sister answered, much to my relief and annoyance. She had simply fallen asleep. Fair to note we both did have very weird schedules and she had a sinus cold, but I actually had work to do and I made it! Oh well, at least we found her safely there.
When I came back I found another surprise, our American friend Chris left us a box of Godiva chocolates with a long and friendly note of recommended things to do. Very cool! And yes, it really does taste different. We liked it better. The bitterness gives it more flavor.
I meditated and rested, and before I knew it the second day of the conference had arrived. Ashley and I bought croissants at the hotel, and found our way there. Mark helped me to the conference again. Today I actually had wifi, so could tweet and have a little more fun, not to mention get text messages, which would have helped the previous day.
The well-known Mattt Thompson started the day off with a bang talking about how the open source movement has shaped the Objective C community. He manages a set of world class command line utilities. He mentioned Conway’s Law, that software resembles the team which created it. I have always believed this and didn’t know someone had formulated it. I totally agree.
Following on that, Eloy Duran talked about the incredibly popular Cocoapods package management system. This gives an easy way for developers to include different features in their code. He named a number of popular pods, especially a command line interface to Apple’s developer center called Cupertino. It felt good to hear a talk about this essential resource.
Clay Allsopp followed this with a talk about wrapping Objective C in RubyMotion. Wrappers make programming less iOS-like and more Ruby-like. Objective C doesn’t have namespaces, soWeHaveTheseVeryLongConstantAndMethodNames. Wrapping also uses so-called snakecase like_this instead of camelcase likeThis. I have always preferred snakecase. The more wrappers we have the better, and we have a lot of low-hanging fruit. It made me appreciate RubyMotion all the more.
Collin T.A. Gray came next. I had to hold my tongue since I knew what he would demonstrate, and I had a pretty good idea of the reaction it would get. I predicted correctly. Motion::Xray impressed everyone. “Shit just got real.” tweeted someone.
He also talked about his very popular gem Teacup, a DSL for defining stylesheets. Lots of us love it and for good reason. It keeps the code clean and leaves the design crap in another place. Everyone enjoyed his talk, and consider Motion::Xray something special.
Marin Usalj finished the morning with a talk about Bubblewrap. Everyone uses this gem. It provides a lot of wrappers to make life easier. For example, you can just type
Bubblewrap::Alert(“All hail Discordia!”)
to get an alert message. It concluded a morning of hot talks perfectly.
For lunch I had fresh and grilled vegetables, bread, beer, chocolate mousse, a brownie, and a raspberry pastry thing. I figured if someone asks if you want a drink and hands you a beer you should just take it and enjoy. A Belgian explained to me that the english word Spa comes from an area in Belgium with naturally carbonated water. He said it always feels weird to see the word. I felt full and my blood sugar had spiked, putting me in an interesting frame of mind for the afternoon.
Next came a talk about building interactive data visualization charts with Amit Kumar. Since it involves something visual I gave my brain some more recharging time. I did wonder about adding the accessibility protocol to these charts to give the full experience. When I first got an iPhone I felt so impressed that I could read a stock chart. You never know.
Juan Karam followed this up with a talk entitled Cocos2D, an Easier Way. I figured I’d tune out again for this, after all why would I want to know about video games? Then he actually started talking and I perked up. First he described Cocos2D, the most popular game development engine. It lets you build a game like a movie with directors, scenes, layers, and sprites. A sprite contains a 2D image. The director handles the game logic.
Then he described Box2D, a physics engine. It takes all of the details for you. For instance, it handles a bullet hitting an enemy. He demonstrated the classic game where monkeys throw bananas at each other. The engine performed flawlessly.
Finally he brought it all together with JoyBox, a RubyMotion wrapper around Cocos2D and Box2D. This made a huge impression. A lot of people talked about using it afterward. Juan and I got to sit down and talk a little as well. We both feel intrigued about writing an accessible video game, and plan to work together. I honestly did not expect to take anything away from this talk, and got more than I bargained for.
The energy felt high. On came Akshat Paul and Abhishek Nalwaya with a fast-paced talk called Let’s Move with CoreMotion. Wow! These guys talked fast. Fortunately I feel accustomed to listening to fast speech. Apple introduced CoreMotion with iOS 4. The iPhone has three censors: the gyroscope, the accelerometer, and the magnetometer. CoreMotion takes the raw data and makes it usable, as well as removing any bias. You can do lots of cool things with CoreMotion. I thought of the Dreamz app which tracks your sleep cycle and delivers an audio cue when you enter REM sleep. Far out!
Laurent Sansonetti concluded the conference with his talk RubyMotion: Past, Present, and Future. He gave a heart-felt summary of the path which led him to this point. He sipped beer the whole time. I only have one line of notes, reproducing a diagram:
Work -> depression -> work -> fear -> …
The diagram implied a continuous cycle. Laurent made me feel very optimistic about the future. He has many exciting features planned. I especially look forward to the day when RubyMotion will detect invalid method or constant names. Apple has so many tediously long names, you can easily mess it up with a misplaced capitol letter or with a slightly different wording. But what about the debugger? I wanted to know.
While I attended the conference, Ashley spent the day sight-seeing with a girl named Karen. They had an interesting time, and returned just in time to hear Laurent discuss the location for the next #inspect. He considered New York and Cancun. He showed a slide of New York covered in snow, and Cancun looking beautiful. Of course, everyone laughed and the crowd seemed to prefer Cancun. I knew better.
As soon as the speech ended Ashley came up to me. She couldn’t contain herself about how much she hated Cancun. She went there during senior week, and had a miserable time. She described things to terrible to write in this article. I believe every word of it. She even came up with a very clever slogan.
Tan or tech: you decide.
New York has a much better tech scene. We do gather for this purpose after all. Our purpose gives us unity, and unity gives us strength. Actually if I could vote for any city, I would cast my vote for Philadelphia. It has a great tech scene, and a great beer scene as well.
I had met Ryan, the guy who said he’d help me out on the mailing list. He had his girlfriend Jane with him. We all agreed to go out for dinner, and a few others joined us as well. We said we’d get there at 06:50, and of course arrived somewhere closer to 07:20. By the grace of Goddess, Ryan had waited for us.
We proceeded to Spago and had a wonderful Italian meal. I had lemon pesto and a nice white wine. For dessert, I had ravioli filled with cacao and orange zest. I had never tasted anything like this in my life. The waiter suggested pairing that with a liquor that tasted exactly like Nutella. I went to heaven.
The night had started getting on, and we knew the time had come to confront the after party. They moved it to the Delirium Cafe. We already knew of this place. While wandering around we noticed that we would just kind of arrive there no matter what. “All roads lead to Delirium.” I said. That sounded profound.
We got there in the thick of things. It reminded me of the after party at BarCamp. I don’t like loud settings. They disorient me. Still, I feel glad I stuck it out.
I met some guys who run Terrible Labs out of Boston. They want me to come up there and give my talk. I also saw Bret again. We agreed that I would come there and see Cowerks and his meetup group, and he would come to Philadelphia to see Indy Hall. Coworking feels like such a magical trend.
The noise had really started getting to me, so my sister said she would try to flag down Laurent for a quick talk. A few minutes later he came and sat down beside me. First he asked if he could refill my beer. Delirium has the largest beer selection in the world, so I felt overwhelmed in many ways. I asked him his favorite beer, and he said Orval. I figured I’d just ask for that. And so I found myself sitting with Laurent, sharing his favorite beer.
I knew the time had come. I had to ask him about his future plans for the debugger. He said what I had hoped, that he wanted to run the REPL on a device. He made it clear that it would happen in the distant future, but that he has considered it. I really hope he does it. This would make life so much easier for me.
I sipped my Orval, a beer with sugar cane added to it. This gave it a very complex flavor. My sister regaled Laurent with some of her Cancun horror stories. Hearing us talk about debuggers also caused her to come up with a funny joke: It’s debugging the shit out of me. She doesn’t even know what a debugger does, but the joke works. After a few minutes of lighter talk Laurent excused himself. I felt glad we got to spend a little time together.
It had started getting late. I talked to Colin for the last time before leaving. We agreed to continue working on an automated accessibility testing solution. I also want to work on improving Motion::Xray as well. Rich also said bye, as well as a few others. Leaving felt tangible. The time had come for the journey home.