Home
Welcome to my homepage. I became blind at birth from retinopathy of prematurity. I developed an early interest in computers and radio. I use Linux, MacOS, and iOS. I have an extra class amateur radio license. I practice Qigong daily. I consider myself a Taoist. I don't drink alcohol, eat meat, or gluten. It makes me feel optimal, and helps with migraines, which I also have to deal with. For the rest, you'll have to read my articles.
Motion-Accessibility
June 19, 2013I just released my second RubyMotion gem. I call it motion-accessibility. It makes it much easier to make your applications accessible by providing Ruby-like names to Apple’s accessibility APIs. I have some great plans for the future as well. It feels great to contribute to the RubyMotion and iOS community.
It all began at the RubyMotion conference. Colin gave me a little sneak peak at what would become motion-xray. We talked about accessibility, and I had the idea to make some sort of automated accessibility test. This way developers could get an idea of the accessibility of their views, with easily understood error messages telling them exactly what to do. I first thought of it in the context of Colin’s view inspector, but quickly realized the general application. I’d love it if in a spec file someone could just write:
view.should.be.accessible
And at that point I foresaw that I would write this gem, and call it motion-accessibility, and so help elevate the collective spirit of humanity.
I didn’t start work immediately, I needed some time to wind down. Instead I released another gem, golden-sections, but I knew I would have to do this. Then while on my Asbury Park adventure, someone asked if RubyMotion made it any easier to program accessibility. “Well…no…not really…but….” I knew I had to start work.
It took me two weeks to get the first version working. I kept thinking I had finished, but would then find one more thing that needed doing. First I realized that I couldn’t just alias the methods. Apple lets you define attributes in two ways: by using a setter or by overriding a method. Using a setter wouldn’t present a problem:
alias :accessibility_label= :setAccessibilityLabel
But what if someone wanted to override the method? I asked for help, and my friend Thomas from Germany suggested the method_added method. Now I had gotten into the interesting realm of metaprogramming. And it all worked. Now you can do:
def accessibility_label
“Hello”
end
and it will also override the original accessibilityLabel method. It works both ways. Ruby rocks!
I came up with some neat solutions to some things. For example, setting accessibility traits could take a lot of writing. Now instead of
accessibilityTraits=UIAccessibilityTraitImage | UIAccessibilityTraitLink |
you can write
accessibility_traits=[:image, :link]
Notifications also bothered me. Let’s say you have a view controller that at some point makes a change to the screen. You should tell VoiceOver of this by posting a screen changed notification. Before you would have to do
UIAccessibilityPostNotification(UIAccessibilityScreenChangedNotification)
Ouch! How about
Accessibility.post_notification(:screen_changed)
Much easier, don’t you think?
Apple has a bunch of protocols. At one point I swore if I read the word UIAccessibility again I would go mad. I kept finding new ones and new methods and figuring out the best ways to add them. I think I got them all.
Then came a real shocker, for me at least. I thought of these attributes and methods as relating to views or accessibility elements. I realized that they actually belong to the root NSObject class. As I explained in another post, in Ruby all objects have a parent. All objects go back to Object, or NSObject in RubyMotion. You can’t get any more “baked in” than that!
Now I can proudly say that yes, RubyMotion does make it easier to program accessibility. Enjoy more Ruby-like names and ways of doing things. I hope this will encourage developers to make their apps more accessible. I know it will help me. And the future looks bright, with thoughts of automated accessibility testing.
By the way I just got accepted to speak at the Nickel City Ruby conference in Buffalo, New York. I will demo this gem there. Just think how much more awesome motion-accessibility will make my speech!
Asbury Park Adventure
May 31, 2013While speaking at the RubyMotion conference in Belgium I met Bret Morgan, who runs a coworking space in New Jersey called Cowerks. Since we live near each other and both like coworking, we had a good conversation and I agreed to speak at the Jersey Shore Tech Meetup. Two months past quickly and before we knew it the time had come. He arranged everything, I gave my speech, and we had a great time. I really like Asbury Park.
RubyMotion lets you write iOS and Mac OS apps in Ruby. A bunch of us love it. At their first conference I gave a speech about RubyMotion and accessibility, discussing the tremendous benefit an iPhone has for a blind person, how developers could make their apps accessible, and some of my own observations learning how to write apps as a blind programmer. It went over well, and I agreed to give a similar speech at Cowerks. Bret said not to make it too technical, so I substituted the code examples with an introduction to RubyMotion. I also updated the speech to reflect the exciting new development which lets me use the REPL with VoiceOver. I thought I had everything prepared down to the letter. Of course, life rarely works that way.
Meanwhile we planned logistics. Bret’s friend Meghan would provide transportation. Sure enough at 03:00 on the dot she pulled up. We made the drive in an hour and a half, not bad at all.
I arrived at Cowerks and set up my computer. It felt weird to work with my luggage sitting next to me. It also felt weird to sit in a coworking space other than Indy Hall. I kept expecting one of my friends to come up and say hi. I made some final tweaks to my speech and emailed it to Bret so he could try to coordinate the slides which now differed. And of course I would like to thank Adriano Martino of Italian Label for doing such a tremendous job with them. Bret and I grabbed a bite to eat at the cafe downstairs. We have identical diets: vegetarian leaning towards vegan, no cheese, and lots of garlic.
We came back up and Bret asked if I’d like to say a few words about Indy Hall and coworking for a video project. I said sure and to my amazement stepped out onto their balcony, and I don’t mean a tiny little balcony with a few chairs either. They had the real deal, with benches, tables, and even a hammock. Coworking from a hammock sounds like a great idea to me. I met the guy doing video and said a few words, still marveling at my surroundings.
I heard that people here run on beach time. I didn’t fully understand. The meetup started at 07:00. I remember checking the time at 07:22, and they still calmly waited for people to show up and made no attempt to start it. I had an idea, and rigged up KoalaSAN to stream the speech live, something I really enjoyed and will do again. Finally at around 07:30 we started. I love beach time!
The speech went as well as it could have. You can listen to it here or use the links at the end of the article. Even though I didn’t include technical material, I kept getting interrupted with derailing technical questions. I began to wonder if I should work in the more technical material, but I soldiered through my notes and finish the speech I had prepared and practiced. At the end we decided to go for it, so I went back to my Belgium speech and went through the technical details of the UIAccessibility protocol and related code examples. In hindsight it would have worked better if I would have inserted them at the proper point, but everything worked out. Bret said you never know who will show up, and this time we happened to get more developers.
After some closing words we went out for drinks. Some things never change. Just like after Philly Cocoaheads, I found myself at a bar, but not National Mechanics. I had a Black Hat #9 to get things started, but then switched to a local brewery called Kane. I enjoying sampling local beers and comparing their tastes. I had a hoppy IPA and one which tasted lighter called Carton. Event hough it tasted lighter it still had plenty of alcohol. For this reason, they call it getting Kane’d.
I met some cool people. A fellow pipe smoker named Dave gave me a tin of vintage Dunhill Nightcap pipe tobacco from 1995. I understand its value. He must have given it to me for that reason. Wow!
A girl named Jess and I talked a bunch. I mentioned the Dreamz app which uses the iPhone’s sensors to monitor your sleep state, and deliver an audio cue to help you achieve a lucid dream. A girl had an iPhone with a broken home button. Oh dear.
As the night got on I found myself in an enthusiastic discussion with a surfing instructor. He really wanted to take me surfing and I really wanted to go. He wanted to get in the cold water at 08:00 in the morning. Somehow I knew that wouldn’t happen. “I wouldn’t worry about it.” someone said. “He will probably call you on the other side of noon.” He hasn’t called me yet. I keep picturing a surfer in Asbury Park waking up the next day with a hangover wondering why he has the business card of an iOS accessibility consultant. Oh well. I really would like to try surfing with him sometime.
We got home a little after midnight. Justine made me a quick snack of pita chips and almonds, and gave me plenty of water. This helped so much. Nevertheless, the next day I got Kane’d! I felt better after lots more water, aspirin, and cacao, which I had brought with me. Bret had to get up early – running a coworking space means constant work. Justine makes jewelry and showed some to me. I enjoyed the feel of the polished stone and intricate wiring. Eventually we got ready to go.
The night before I met a girl named Kara. The parallels with Indy Hall continued, there Kara cooks dinner for night owls. Here Kara runs a vegan restaurant called From Seed to Sprout. It sounded like the perfect cure for the previous night. I had their multi-vitamin juice, a raw taco, and kale marinated in olive oil and salt. I also got a raw margarita pizza for later. It all tasted exquisite! I felt 110% better.
Meghan met us at the restaurant and we went home from there. At 03:00 I had made it home. Now I sit here with a pipe of this wonderful tobacco, my memories dissipating like its smoke. I thoroughly enjoyed my twenty-four hours in Asbury Park. Justine called it “Bizarro Philly” and that pretty much sums it up. It has a strong local vibe, but it also has a beach. It feels more laid back than south Jersey where I’ve often vacationed. I would definitely like to return. And if you find yourself in Asbury Park, definitely check out Cowerks and From Seed to Sprout. And try not to get Kane’d!
Podcast: Play in new window | Download
Join the Ridesharing Revolution
May 23, 2013A few weeks ago I attended Open Access Philly. While there, I heard a presentation about a new service called SideCar, which does something called ridesharing. I felt immediately intrigued. As soon as I used it for the first time I knew it could revolutionize transportation, especially for the blind. The more I learned, the more intrigued I became. Now I want to tell everyone about SideCar.
I first met Yuriy at some event, I think the Drink Philly celebration. My friend Sonia introduced us but really didn’t get to talk. He runs Philly Startup Digest and works as a venture capitalist. He strongly encouraged me to come to an event called Open Access Philly. I said I’d check it out but sort of forgot about it.
Time passed, and SOnia and I did braille street art at the Philly Tech Week signature event. Yuriy acted as the carnival barker to use his own words. As things started winding down he came and sat down so we could talk. He got me a beer and we had a great conversation. He practically forced me to come to the next Open Access Philly. Civic-minded people meet and discuss their projects. It makes a great networking event, because the presenters actually get things done in their companies, they don’t just come there to get their name on a sheet. He wanted me to come for one or two meetings, then give a presentation myself. This excited me so of course I agreed to go.
While there I heard a presentation from Knick Knack Learning, an initiative to bring low-cost Android tablets to disadvantaged schools. I asked her about working with the blind and she wanted to know more. Apple products offer the best accessibility in comparison, but their higher price presents a challenge.
Then came the presentation about SideCar. Steve runs SideCar Philly. He introduced the company and the concept of ridesharing. Inspired by carpooling, SideCar uses an iPhone or Android app to connect drivers with riders. Riders enter their pick up and drop off locations, which gives drivers a way to only accept rides convenient for them. This makes it different from a taxi or limo service, or something like Uber.
Obviously people feel worried about safety. Their FAQ addresses this. A driver told me he had to give over practically every piece of information about himself to join: his name, SSN, driver’s license, insurance, and even his checking account. They go to great lengths to get the best drivers. A driver must also maintain a consistently high rating. Passengers rate drivers and drivers rate passengers. The company tracks the ride with GPS, and the passenger can even share this information with a friend.
A few days later I had a chance to download the app and try it out. I must say that the current version of the iPhone app lags horribly with VoiceOver, and I would like to work with the developers to resolve this. If you don’t mind battling with the lag then you can use the app. Sighted people won’t notice.
I entered my address as the pick up location, and Indy Hall’s as the drop off location. It displayed the estimated time of the nearest driver. I confirmed the ride and in a moment it dinged. The driver had accepted.
I still felt a little unsure. Would I get someone cool? Would I get someone mean? Would I get an axe-wielding maniac?
A few minutes later I got a notification that he had arrived. The button which says “Driver” calls him, so we talked and found each other. “So, you’re going to Indy Hall?” he asked. It turned out he worked with a database programming company which worked there. He knew exactly where to go, and we talked about programming the whole time. I felt amazed.
Every ride since then has seemed equally amazing. I have made friends with several drivers, and they accept my rides as soon as they see them. SideCar has revolutionized my life. It also has the potential to revolutionize Philadelphia.
And therein lies the problem. As of this writing, SideCar has entered into a battle with the Philadelphia Parking Authority. The PPA has their share of enemies. One restaurant will give you a free meal if you bring in a parking ticket. The cab companies have corrupted everything. This should not come as a surprise to anyone who has taken a taxi in Philadelphia.
The city of Austin, Texas undergoes a similar battle. I laughed when I read that article’s title: Austin Wants Sharing. Yes, I do! Similar situations happen in other cities.
Because of this unfortunate situation, SideCar cannot accept donations from riders in these cities. In response, the company has decided to make rides available for free. Yes you read that right, you don’t have to pay anything. The company pays their drivers themselves. Until they resolve this, you can get free rides in Philadelphia and some other cities as well!
Obviously this situation cannot last forever. They have had to cut down on the number of drivers. This decreased supply has met with an increased demand, making rides sometimes hard to find. This puts people off to the service, which could cause a vicious cycle. Have faith. The system works.
If they can resolve this battle, and I desperately hope they can, then they will shift to a donation-based model. Riders will make donations to drivers. Even when you do have to pay, it will cost less than a smelly cab. Donations will also give them the ability to expand the number of drivers. Then the system will begin to realize its full potential, and we can all get safe, comfortable and fun rides around the city.
Do what you can to defend ridesharing. Ridesharing means less cars on the road with less impact on the environment. Ridesharing means safe and easy transportation anywhere anytime. Ridesharing means something amazing for the blind and disabled. Ridesharing means the future.
I love it when technology makes an authority obsolete. Filesharing did it with music. Bitcoin has begun doing it with currency. Now SideCar has done it with public transportation. Join the ridesharing revolution.
Epilog: Today SideCar announced that they have discontinued service in Philadelphia. It really makes me angry. How will we evolve into an interstellar species with parasites like the PPA? Negotiations will continue, and they still hope for a resolution. I hope the story doesn’t end here.
Writing a Simple RubyMotion App with VoiceOver
May 18, 2013While publishing my Golden Sections gem for RubyMotion, a friend on Twitter had an idea. He suggested making a podcast demonstrating how to write a simple RubyMotion app. Apparently some blind people have started selling their Macs because they believe they cannot program on them. I believe I have disproved this. Sighted people also felt curious, so I hope they will find it valuable as well.
The app asks the user their name, then displays it in an alert. I have written this simple program in a dozen languages, starting with AppleSoft BASIC. Now I can add RubyMotion to the list. It makes an easy demonstration. I use Geomotion, SugarCube, and Bubble-Wrap to make life easier. I also highlight the recent improvements to SugarCube which help make the REPL accessible with VoiceOver.
I recorded a podcast going from start to finish. I create the app, write a spec, test the app in the simulator, and deploy it to an iPad. I recommend getting the code from GitHub to follow along. Have fun. Write in if you enjoyed it or have any questions. I hope it will encourage you to check out RubyMotion and start writing apps of your own.
Podcast: Play in new window | Download
Golden Sections
May 11, 2013I just released my first RubyMotion gem. I called it Golden Sections. It lets you create views based on the golden mean. I hope you enjoy it.
The idea started when making a view for a game. It occurred to me that I would have labels and values, a very common thing to do. Then I realized, instead of picking some arbitrary or round percentage, why not use the golden mean? This in theory would enable me, a blind developer, to make views that look more visually appealing.
Artists have known of the golden mean for thousands of years. The greeks wrote about it. Leonardo da Vinci used it in his works. Faces which conform closer to the golden mean look more beautiful. And the latest version of the Thesis WordPress theme employs it.
The README explains how to use the gem, so I won’t repeat it here. I find the implementation interesting, especially adding a golden_sections method to the Numeric class. I wrote a common handler for several of the methods, which cut down on duplicate code. I also wrote some nifty tests. Let me know if you use it in one of your apps. The concept of making visually appealing layouts purely with mathematics fascinates me. Give your apps the Midas touch with Golden Sections!