Welcome to my home page. I became blind at birth. I started programming computers at a young age. I also earned my general class amateur radio license, KA3TTT, a hobby to which I have returned with great joy. I practice Qigong and consider myself a Taoist. I use Linux as my desktop and Android as my mobile OS. I eat gluten-free vegan meals. For the rest you'll have to read my blog.
Asbury Park AdventureMay 31, 2013
While 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 RevolutionMay 23, 2013
A 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 VoiceOverMay 18, 2013
While 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 SectionsMay 11, 2013
I 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!
Using the RubyMotion REPL with VoiceOverMay 05, 2013
The Ruby programming language has a cool feature called the REPL, or Read Eval Print Loop. It allows entering expressions and seeing their results in real time. This can help test a program. If something doesn’t work you can enter expressions to try to narrow down the problem. You can also just have fun and tinker.
RubyMotion brings this same great capability to the iOS world. This lets you modify aspects of your application while it runs in a simulator. You can change the properties of a view and do any number of cool things. Many people consider it one of RubyMotion’s strongest advantages over Objective C.
In my talk at #inspect, I stated that the blind cannot use the REPL. Technically speaking, we can use the REPL, we can’t use the iOS simulator. This basically made it useless, since the simulator made it possible to navigate the app… or so I thought.
After I came back from Belgium I felt inspired to dive into RubyMotion, of course. I explored a lot of gems, including SugarCube. I had already started using it, but ignored the part about the REPL. Now I had another look and discovered the “tree” method. It lists all the current subviews in the current view. The “adjust” or “a” method selects a subview by number. And “a” by itself returns the currently selected subview.
Now I just needed to figure out a way to tap a button. I asked on the mailing list, and someone replied and suggested using the UIButton.sendActionsForControlEvents: method. Sure enough, typing
worked. I whipped up a quick test method and it also worked. SugarCube also allows :touch.uibutton for easier reference.
I posted about my progress, and to my delight Colin added this feature to SugarCube. Now after selecting a view you can just type
and like magic it will tap the button in the REPL. This makes it possible for me to use it, something I thought impossible only a month ago. I feel ecstatic.
This rapid feedback loop shows the strength of the RubyMotion community. In a very short time we added a great feature to a gem which will help everyone. It also totally opens the door to greater productivity for any blind developers. I said it in my talk and I’ll say it again here: the future looks very good for RubyMotion!