We wanted an online programming course for our 9 year old this summer. Because we had done the iD Tech summer camp, Tech Rocket seemed like an obvious choice. The price was reasonable ($29 per month) and it had really a lot of variety including: Unity, Python, C++, Minecraft modding, and even Photoshop tutorials. It seemed perfect.
My son ran into some trouble on the Python lectures so I helped him. What I saw in the curriculum was very disappointing. Some of problems I could overlook, like the use of non-standard English (like saying "aks you a question" instead of "ask you a question") and the non-standard spelling (like spelling "lasers" with a 'z' - "lazers"). One of the bigger problems is that the videos aren't well suited to anyone with a laptop screen - you have to zoom the video to full screen and its still hard to see the text. Perhaps the biggest flaw are the exercises themselves. The students are meant to type the commands exactly - including the typos - in the system. If they don't type it correctly they are shown a cryptic error message. When they do type it right, they don't even get to run their program, it just moves to the next exercise. The real fun in programming comes from being able to explore your own solutions, and in seeing how your 'mistakes' can subtly effect the outcome of the program. Since it never allows you to run the program, you never get any of benefit of this experimental play. Finally the courses don't let you repeat any exercises. Once the system evaluates it as correct response it moves on with no way to redo it. Until they fix these issues I can't recommend iD Tech's "Tech Rocket" program to anyone. Thankfully there are other choices available.
Since my son had started with Python at Tech Rocket, I looked at other Python offerings. The first I found was Code Academy. I didn't do a full evaluation, but from the evaluation I did do, I could already tell it didn't suffer from the worst offense of Tech Rocket. You can actually run your code (imagine that!). And if your code doesn't match their expected input exactly, it seems to still work. Code Academy doesn't have kid friendly themes (not that that is bad), and looks like it might be better suited for high school or higher. Since I was looking for something for my nine year old son, I kept looking. If I were trying to learn Python as an adult, I might try Code Academy. Bonus: It appears to be free.
Having my nine year old learn Python wasn't the goal, the goal was for him to learn programming. What about Khan Academy (KA)? I tried it before and was very impressed. They had a good and fun teaching style mixed with a great interactive environment. The videos were easy to follow and easy to see, and are given by a well spoken enthusiastic teacher who's examples are silly enough to engross a nine year old. Whenever you stop the video you can edit the code she has written and explore what effects that has on the program's outcome. It resets the code if you start the video again reducing the risk of experimentation. Although KA's curriculum requires typing, there are a number of convenient sliders you can use to change the code without typing. The language KA uses is Javascript which is great too, since it's currently used all over the web and many jobs require it. The amazing thing is, KA is committed to always being free. I originally tried KA in 2012 with all three of my kids. My only gripe about KA in 2012 was that there wasn't that much programming content. They've added much more recently so this is no longer a concern for me. If your kid is comfortable with typing this is a great choice. If typing is still an issue, you may want to save KA for later. One more thing: How independent is your child? I found that KA was not as structured as my then 7 year old needed and he never completed the series, at 9 years old, he won't have a problem.
Tynker was another choice that I looked at. Tynker costs money, It's actually quite a bit more expensive than Tech Rocket. Instead of $29 a month it's $50 for each course (it looks like a motivated student could get through a course in as little as 3 days). I'm more than happy to pay for good things, so this isn't a show-stopper for me, but you should know what you are getting into. Tynker uses a drag-and-drop programming language that doesn't require any typing (very similar to MIT's Scratch). Their lessons are geared towards kids (bonus), and allows kids to eventually transition to Javascript (great!). They can target mobile devices with their code, and even do the lessons on an iPad. This long list of features almost had me convinced this was the best option, but the execution wasn't as perfect. It's not a big deal, but the intro "video" is almost completely silent. Like I said, not a show-stopper (unless your child can't read), but it had less polish than KA and Code Studio (we'll discuss that one below) and both of those options are free. The first lesson also didn't include enough instruction for many kids to finish it successfully (some options were available that weren't explained). Tynker did allow kids to see the results of their mistakes (excellent) but sometimes would jump over important points. In short, the curriculum was far better than Tech Rocket, but could really use more polish.
Finally I'd like to discuss Code Studio. Their curriculum is excellent and free! Not only is it geared towards kids, it includes art from big names in the industry like Disney's Frozen, Angry Birds, and Plants vs. Zombies (great for 9 year olds). It uses a drag-and-drop language like Tynker and has all of it's advantages for students who struggle with typing. It's also great for beginning programmers who can type, because they don't need to worry about syntax errors and can just focus on the code. I was very pleased to see their video content is professional quality. No sound quality issues, no issues whatsoever. I was even happier to see that like Tynker, the lessons are structured so that there is no fixed way to complete an exercise, any solution that reaches the stated goal is acceptable (fabulous!). In a nutshell, Code Studio really knows how to make a quality well polished product that will appeal to kids. They also know how to teach programming.
For my money, I would pick either Code Studio and/or Khan Academy (ok, I know, they are actually free - put I'd still pick them if they weren't). In fact we are going to do both with my nine year old. Once he finishes Code Studio (which he loves), we'll start back on Khan Academy.
Sunday, July 05, 2015
Teaching Your Kid Computer Programming
My wife and I want our kids to learn programming. We think it's a great skill that everyone should have (it's also a great career choice). To that end I've been on the look out for years for the best way to teach this. Since I'm a professional programmer, with a real passion for the subject, I tried first teaching them myself. The challenge here was answering these questions: "What language do I teach them?", "What development environment should I introduce them to?" and "How do I structure the teaching?" (lesson plans, free-form, something in between).
The first two question were so much simpler when I was a kid. The answer was obviously the language called BASIC (Beginner's All-Purpose Symbolic Instruction Code). Every computer used to come with a BASIC interpreter built-in (and little else). My brother and I used to go to the computer department at our local K-mart and write a simple basic program on their Commodore-64's and Vic-20's that would cover the display with "Don't Buy K-mart Junk!" (When K-mart filed for bankruptcy in 2002 I felt a huge pang of regret). We would get computer magazines monthly with pages and pages of computer programs ready for you type in.
It wasn't so simple anymore. Computer's don't automatically start-up to a command prompt ready for you to enter your programs. There are now so many to choose from, but they all so much more complicated for the beginner. Because of my own experience with BASIC I thought it might be nice to start with a command line language. I thought "maybe I should teach them Perl on the unix command line?" If you try this you may run into some of the same challenges I did. I wanted something where they could use a modern text editor to edit the code, but then you need to make the file executable for them, and you need to add the ever cryptic #!/usr/bin/perl to the first line, not the simplicity I was looking for and that isn't even touching the language. Another thought was to teach them a language that they could create something that resembled a game. Since I'm an Apple fan Objective-C and Swift came to mind.
I ended up trying to teach Perl along with Python, Javascript, Swift, Objective-C, and Logo over the course of about 9 years. Some of these worked better than others, but mostly they failed. This was for a number of reasons: in some cases I started too early (before they could read well), they typed too slow (it was painful for both of us), they struggled with the environment (there are a lot of assumptions in the modern IDE), and the languages had a lot of terms that needed explaining (like why do I write int and float for numbers). Honestly though, the biggest problem was that I didn't have enough consistent time to spend with them on it. As much as it pained me to admit, they needed something they could do mostly on their own (or for someone else to be their teacher). I could definitely supplement their learning, or help them get unstuck, but I wasn't going to be able to teach them everything.
Programming summer camps are a great for this. In the San Francisco bay area where we live, we have several different organizations that offer these. One of the biggest is iD Tech. We've had mixed success with them. Our daughter got really a lot out of their Alexa Café. The camp was well organized and lots of fun. Most importantly she came home truly energized about programming! Before the camp she had declared that she didn't have an interest in the subject and didn't think she could learn it (so much for all of my education attempts). Afterwards she was spending lots of her free time writing code including using it to complete creative assignments at school. Here's a really cool thing she made for her English class in 8th grade. This summer we sent her to another iD Tech camp (Game programming in Unity). This camp had a lot more problems. The online curriculum they had developed in-house was so buggy that they had to scrap it and go to a fall-back plan. It's nice that they had a fallback, not great that they had to use it. The instructors although very nice and friendly couldn't help my daughter get unstuck on her projects. I spent my nights that week helping her get unstuck. Don't get me wrong, this was great bonding time with my daughter that I wouldn't trade, I just think that since we paid them more than $1000 for the week, they should be able to help an absolute beginner get unstuck. Later this summer our oldest son is going to a camp to learn Arduino, I'm hoping they do a better job at his camp.
What about online resources to help learn programming? Well, it turns out there are a bunch of options here. Many more than were available in 2006 when I first started this with my kids. My next blog post will compare some of the ones we looked at for our 9 year old son. I hope it helps you.
Programming - A Great Career Choice
My favorite hobby is programming computers - because it's really fun! I have been very fortunate to get paid to do my hobby for the past 20 years. During that time I've worked for about a dozen different companies, sometimes as a contractor, sometimes as a full time employee, and for about 7 years I ran my own company. Each change was by my choice, and on my terms. Although I'd like to think of my skills as amazing, the truth is you don't have to be amazing to get work in this field. The world, as a whole, needs more programmers, many more programmers! You may be worried about the coming robocalypse and what that will do to your job prospects (as you should), but this is one of the few jobs that should fair reasonably well. Jobs in this field are extremely flexible about where you live, and what hours you keep. And it's really easy to get started - all you need is access to a computer and the internet (or a good book). To sum up, programming is fun, and you can make a good living from it. If you aren't sure what you want to be when you grow up (or are interested in changing that choice), I'd give computer programming a serious look.
BTW: You'll often hear a lot of different names for computer programmer, here's a short list: Computer Programmer, Coder, Hacker, Software Engineer, Computer Scientist
Wednesday, July 06, 2011
Crossword Forge QuickLook Plugin
While at WWDC there was a lab helping people develop QuickLook plugins. I had often felt that Crossword Forge would really benefit from this plugin. Users would be able to simply press the spacebar and get a look at their puzzle. I attended the lab and got started on my plugin. A relatively short time later I had a plugin that would display the title and puzzle grid. It took into account styling of the title, backdrop pictures, right to left languages, puzzle masks and a lot of other small but important details of the file format. It wasn't 100% complete but it was complete enough to work on the next step. I needed to make sure it worked in the real world. Up to now I had been running the plugin directly in Xcode using the command line tool "qlmanage". I needed it to run, just like a user expects, when I pressed the space bar in the finder on any .cwz document.
It turns out there are 3 ways (at least) to install a QuickLook plugin. I could install it in /System/Library/QuickLook/, ~/Library/QuickLook/, or I could install it directly in my app itself in the subdirectory /Contents/Library/QuickLook/. For me the last option was the best since Crossword Forge did not have a separate installer, I didn't need to worry about adding the plugin to the above mentioned directories. I didn't have to worry about authentication, and it also meant that the end user wouldn't be asked to install it (another option but a tech support nightmare).
With the plugin installed, in my app, I figured it would just work, unfortunately it did not. It turns out I was missing 2 very important steps. First I had to update my info.plist file in 2 places. I had to add a LSItemContentTypes item to my CFBundleDocumentTypes. This has to match the plugins value for this. In my case it equals com.solrobots.crosswordforge.cwz. I also had to add a separate entry for UTExportedTypeDeclarations in my info.plist. (One gotcha here is in relation to the UTTypeTagSpecification, Apple's docs say to use the com.apple.ostype tag but Apple's own Garage Band has a hyphen in that same key. Its written as com.apple.os-type . I'm not certain which is correct, but I'm going with the hyphen version for now, which seems to work).
After all of this, it still wasn't working. I had all the pieces in place, I just had to debug it.
My first check was to make sure that QuickLook manager knew about my plugin. I called "qlmanage -m plugins" and sure enough my new plugin was loaded into the system. Next I tried to find out what the system thought was the file type. I used the tool "mdls" for this. Unfortunately it was not assigning the right UTI to my file. I checked and re-checked my info.plist, restarted the finder, restarted the system, nothing seemed to work. Finally I found "lsregister -dump" (you'll have to specify the full path to this tool), which gave me a few clues. Launch Services was getting the UTI but it was a duplicate entry and it wasn't trusted. I needed a way to update the Launch Services database. The easiest way to do this is to change the applications mod date "touch appName.app", and then duplicate one of my .cwz files in the Finder. One more thing: before you change the mod date of your app, don't forget to put it in your Applications Folder. It won't update properly unless it's there.
Wednesday, June 08, 2011
Apple's New Campus - Coming 2015

When I saw the news about Apple's new campus, I thought wow! That looks awesome. The folks that get to work there are going to have the best office space in the world. I also thought that it looked a lot like a giant iPod click wheel. So I couldn't help myself - I had to mock it up in Photoshop. I call it iPod Jumbo. What do you think?
Friday, October 15, 2010
Boost C++ Threads - MinGW & Mac OS X Universal Binaries
I ran across a cool set of C++ frameworks called Boost. They provide loads of stuff that you just take for granted in other languages like RegEx and thread support, but is not part of the C++ standard (at least not yet - apparently large parts of the Boost libraries are on track for adding to the official standard). My current interest in Boost is for its more advanced threading (I had a working implementation using pthreads but those have an inelegant interface which makes the code harder to maintain). Although much of Boost doesn't need to be compiled into a separate libraries (their magic uses C++ templates that are defined in header files), the threads implementation does need to be compiled to a binary. This is where I ran into some trouble (and some hair pulling).
Turns out there are unique problems with the Mac and Windows build, so I will detail them separately. I hope that some of this will help someone else (or help me in the future, if I forget :)
Mac Challenges:
To get Boost there are two main options. Download pre-compiled binaries or compile them yourself. The pre-compiled route is really only available for Windows, so for the Mac I had to compile it myself. This wasn't too hard. The documentation has nice step by step directions that will, if followed correctly, produce library files (two for each library - one ending in .a and one ending in .dylib -.a is a static library that will compile into your code, where-as the dylib is meant to a stand-alone file that is linked at runtime (although this can be hidden by including it in the final app package). I needed the static variant for my project). The directions tell you to change your search paths and libraries paths to include the headers for boost and the new libraries that you just created. From there it should just work. But it didn't for me. Instead I got cryptic linker errors (linker errors are always cryptic) that I eventually figured out meant that the libraries I built didn't include a PowerPC variant. Since this particular project was setup to run on PowerPC and Intel macs, it won't compile. Now Boost will compile for PowerPC the problem is that the compile scripts are automatically only configured for the system that you are currently running. So I suppose I could have dug up an old Mac (PowerPC), installed the developer tools on it, re-installed boost which would have produced the PowerPC binary I was looking for, that didn't occur to me (even it did I would have avoided it at all costs - what a mess). I knew that my machine could compile to both architectures, in fact it does it all the time. So it was just a matter of setting the scripts up correctly. Unfortunately, there were no easy to use instructions for this. Instead I was left trying to piece together different blog posts that were tangentially related. One I came across mentioned using MacPorts to get the Boost libraries. I was heartened to see that MacPorts had a "Universal" variant (Universal is the term used by Apple to indicate multiple architectures in one library.) It usually means PowerPC and Intel, exactly what I needed. MacPorts unfortunately had its own learning curve, it took hours too build Boost (mostly because I couldn't specify that I just needed threads), and turned out their "Universal" option meant includes 32bit and 64bit Intel. Although technically correct use of the term "Universal" in Apple parlance, it isn't what I needed. Further including the MacPort binaries caused conflicts with other libraries that are provided by the OS and were building just fine. In the end I had to purge my project of all external references to the MacPorts build (probably going to do an uninstall of MacPorts later). Back to the drawing board. I finally ran across an excellent script online that was doing mostly the same thing that I wanted. It was designed to build 4 binary variants of Boost (32 & 64 bit variants of the Intel and PowerPC libraries) and then stitch them together using "lipo" (an Apple developed command line tool designed for creating "universal" aka "fat" binaries - hence the name lipo). The script did the first part beautifully but didn't quite work for the second part (the file names had changed slightly from boost version 1.4 and 1.44 and it caused it to choke). No matter "lipo" is pretty easy to use manually (and in my case preferrable, because I didn't want all four parts). The command I used was.
to find out if it got all the right architectures (this is how I know why the MacPorts universal wasn't working). I then just dragged the newly created "Universal" library into Xcode and it worked!!! Now I only had to get the windows version working.
Windows:
My windows compiler is MinGW. I use it because it gets the job done and its free. Its a nice little compiler but not terribly easy to use (I guess I can't complain, it's free after-all). The cool thing about MinGW is that Boost comes included. No compilation necessary. Unfortunately every time I tried to use Boost I would get very cryptic linker errors (those linker errors again :) like the following:
Everything I tried to fix this failed (and I tried a lot of stuff, and was at it for hours). Finally I had to ask someone for help (I don't like asking for help until I've exhausted my resources - I guess I don't want to waste other people's time, and I don't want to look stupid - ah Vanity). Truth is, there are very few people I can ask for stuff like this, and expect to get an answer. I found a great website of a "Stephan T. Lavavej' who looked like he just might be able to help. He had built his own distribution of MinGW which included the latest version of Boost (just the sort of guy that would at least know what I was talking about). Indeed! He was most helpful. He sent me the following:
Do I really understand it? Heck No! But adding both of these unmangled the namespace. Now I was getting much more manageable linker errors like this:
It was now just a simple matter of adding the right library to my make file to resolve these (I had done this earlier as well but it had no effect until the name mangling was resolved). I added:
the library itself is called libboost_thread.a but you drop the "lib" and the ".a" . The -l is a flag to the compiler to link against that library.
Thanks again to Stephen Lavavej of nuwen.net for his insightful email and helpful website and to Manfred Schwind of mani.de for his excellent script for building PPC versions of Boost. I would also like to thank anyone that has ever asked a question about Boost or responded to one, It feels like I read just about every one ;) and they all helped to improve my understanding and push me a little further along.
Now that I've got it compiling I just need to build something useful with it. I guess that is what next week is for :).
Turns out there are unique problems with the Mac and Windows build, so I will detail them separately. I hope that some of this will help someone else (or help me in the future, if I forget :)
Mac Challenges:
To get Boost there are two main options. Download pre-compiled binaries or compile them yourself. The pre-compiled route is really only available for Windows, so for the Mac I had to compile it myself. This wasn't too hard. The documentation has nice step by step directions that will, if followed correctly, produce library files (two for each library - one ending in .a and one ending in .dylib -.a is a static library that will compile into your code, where-as the dylib is meant to a stand-alone file that is linked at runtime (although this can be hidden by including it in the final app package). I needed the static variant for my project). The directions tell you to change your search paths and libraries paths to include the headers for boost and the new libraries that you just created. From there it should just work. But it didn't for me. Instead I got cryptic linker errors (linker errors are always cryptic) that I eventually figured out meant that the libraries I built didn't include a PowerPC variant. Since this particular project was setup to run on PowerPC and Intel macs, it won't compile. Now Boost will compile for PowerPC the problem is that the compile scripts are automatically only configured for the system that you are currently running. So I suppose I could have dug up an old Mac (PowerPC), installed the developer tools on it, re-installed boost which would have produced the PowerPC binary I was looking for, that didn't occur to me (even it did I would have avoided it at all costs - what a mess). I knew that my machine could compile to both architectures, in fact it does it all the time. So it was just a matter of setting the scripts up correctly. Unfortunately, there were no easy to use instructions for this. Instead I was left trying to piece together different blog posts that were tangentially related. One I came across mentioned using MacPorts to get the Boost libraries. I was heartened to see that MacPorts had a "Universal" variant (Universal is the term used by Apple to indicate multiple architectures in one library.) It usually means PowerPC and Intel, exactly what I needed. MacPorts unfortunately had its own learning curve, it took hours too build Boost (mostly because I couldn't specify that I just needed threads), and turned out their "Universal" option meant includes 32bit and 64bit Intel. Although technically correct use of the term "Universal" in Apple parlance, it isn't what I needed. Further including the MacPort binaries caused conflicts with other libraries that are provided by the OS and were building just fine. In the end I had to purge my project of all external references to the MacPorts build (probably going to do an uninstall of MacPorts later). Back to the drawing board. I finally ran across an excellent script online that was doing mostly the same thing that I wanted. It was designed to build 4 binary variants of Boost (32 & 64 bit variants of the Intel and PowerPC libraries) and then stitch them together using "lipo" (an Apple developed command line tool designed for creating "universal" aka "fat" binaries - hence the name lipo). The script did the first part beautifully but didn't quite work for the second part (the file names had changed slightly from boost version 1.4 and 1.44 and it caused it to choke). No matter "lipo" is pretty easy to use manually (and in my case preferrable, because I didn't want all four parts). The command I used was.
lipo -create build/libPPC32/libboost_thread-xgcc40-mt.a build/libIntel32/libboost_thread-xgcc40-mt.a -output build/lib/libboost_thread.a. You can use man lipo to get an idea of how to use it. After you are done you can use lipo -info
Windows:
My windows compiler is MinGW. I use it because it gets the job done and its free. Its a nice little compiler but not terribly easy to use (I guess I can't complain, it's free after-all). The cool thing about MinGW is that Boost comes included. No compilation necessary. Unfortunately every time I tried to use Boost I would get very cryptic linker errors (those linker errors again :) like the following:
undefined reference to '_imp___ZN5boost6thread20hardware_concurrencyEv'
Everything I tried to fix this failed (and I tried a lot of stuff, and was at it for hours). Finally I had to ask someone for help (I don't like asking for help until I've exhausted my resources - I guess I don't want to waste other people's time, and I don't want to look stupid - ah Vanity). Truth is, there are very few people I can ask for stuff like this, and expect to get an answer. I found a great website of a "Stephan T. Lavavej' who looked like he just might be able to help. He had built his own distribution of MinGW which included the latest version of Boost (just the sort of guy that would at least know what I was talking about). Indeed! He was most helpful. He sent me the following:
Due to changes in Boost 1.44.0 and mingw-runtime 3.18, you'll need to pass
-DBOOST_THREAD_USE_LIB to g++ and define
namespace boost {
void tss_cleanup_implemented() { }
}
in one of your source files.
Do I really understand it? Heck No! But adding both of these unmangled the namespace. Now I was getting much more manageable linker errors like this:
undefined reference to 'boost::thread::hardware_concurrency()'
It was now just a simple matter of adding the right library to my make file to resolve these (I had done this earlier as well but it had no effect until the name mangling was resolved). I added:
-lboost_thread
the library itself is called libboost_thread.a but you drop the "lib" and the ".a" . The -l is a flag to the compiler to link against that library.
Thanks again to Stephen Lavavej of nuwen.net for his insightful email and helpful website and to Manfred Schwind of mani.de for his excellent script for building PPC versions of Boost. I would also like to thank anyone that has ever asked a question about Boost or responded to one, It feels like I read just about every one ;) and they all helped to improve my understanding and push me a little further along.
Now that I've got it compiling I just need to build something useful with it. I guess that is what next week is for :).
Saturday, March 07, 2009
Bad design for Apple Online Store
I apologize in advance for ranting, but maybe, just maybe it can help in some small way. Yesterday I tried to buy a Developer membership at Apple.com. I have an account at the Apple Online store, it is the same account I use for iTunes, iChat etc. Apple calls this login an AppleID, and in theory it's a great idea. It means that I don't have to remember a different name and password for each Apple related account, they are all tied together. Parts of the system are even designed intelligently so that your email address doesn't have to be the same as your login id. This is actually essential since your AppleID may have been set up with an email address that you no longer have. Unfortunately all of Apple's systems aren't designed this intelligently. The Apple online store requires that your AppleID and your email address be the exact same thing. This means that either you need to create a new AppleID just for use with the Apple Store or you need to forgo getting email confirmations for purchases at the store. You may be able to live without email confirmations, but the real trouble comes when the product itself is shipped by email, as is the case for developer memberships. My developer program activation code was sent to an email address that doesn't exist.
Have I lost my $540? I hope not. I called Apple about the problem and although they weren't able to help me, they assured me that I would get the email within 24 hours. They didn't know what they were talking about since I still have not received the email. Unfortunately it's the weekend so all of the developer support people are at home, and everyone else is apparently not qualified to help.
Hopefully they will sort it out on Monday. Until then, I'm fit to be tied.
Have I lost my $540? I hope not. I called Apple about the problem and although they weren't able to help me, they assured me that I would get the email within 24 hours. They didn't know what they were talking about since I still have not received the email. Unfortunately it's the weekend so all of the developer support people are at home, and everyone else is apparently not qualified to help.
Hopefully they will sort it out on Monday. Until then, I'm fit to be tied.
Saturday, November 15, 2008
Adam's Game
I recently tried my hand at building a game for my two and a half year old son. The idea came to me when at the hospital, and it looked like he might have pneumonia yet again (he's had it several times this year). While sitting with him on the hospital bed, I wanted to keep his mind off all the poking doctors (and to keep him busy), and so downloaded Preschool Adventure for 99ç to my iPhone. It's a great game for his age group. I was impressed by how easy it was for my 2 and a half year old to play. Because it just involved pointing (no mouse involved on the iPhone).
Before trying it, I honestly didn't think that I would ever feel comfortable letting him play with my phone. Afterwards I couldn't help but think about games I could make for his age group. Although designed for grown-ups, Apple has managed to build an almost perfect toy for two year olds (Perhaps they can make the next version with drool guards :) ). My first venture into this arena is Adam's Game. The game simply presents three panels and vocally asks the child to touch one of them e.g. "touch the hat". The game rewards you if you get it right by cheering, and getting several right in a row, gives an even better reward. The game lets you customize with your own pictures and sounds as well. Adam likes the game, and frequently asks to play it when I'm doing testing (He hears me playing it). Several other parents have written good reviews for it on iTunes, so it appears to have broad appeal. If you want to try it, and you have an iPhone, or an iPod Touch, here's a link to Adam's Game on the iTunes store.
Friday, September 05, 2008
Working on iTunes store integration for Save Benjis
Are you wondering what is happening here at Sol Robots? Among other things we are working on iTunes integration with Save Benjis. So you can compare the price of music at the store to what you would get on iTunes. At least that's the idea. I don't have anything to show you yet, but while playing with the technology I made this easy way to see the top 100 albums on iTunes.
Friday, July 25, 2008
iPhone App Store Experience
It's been two week since Apple released the iPhone App Store. I'm happy to report that my program Save Benjis has been there from the start. I'm also very happy that it has stayed in the top 100 free apps, and has had great reviews, both in the store and in the world at large (I post some of these in the lower left of my main page). As of last Wednesday we had over 40,000 downloads.
Though everything has not gone perfectly. I've had some serious challenges with "Save Benjis" in these last two weeks as well. Probably the hardest was losing Amazon content. It looked for a while like "Save Benjis" would have to shut down for lack of pictures, reviews, feature lists etc, but Jim (at FindersCheapers) figured out a way to keep us up and running. For the time being we've lost review content and our product details have gotten anemic, but Jim thinks we can improve this soon.
Another set back has been a couple of small issues in "Save Benjis" that are causing us not to get credit for all purchases made with the program. I have fixed the problems and submitted them for update on July 14th. They've been "In Review" for 11 days. The waiting is quite difficult for me, I must say. Particularly hard is waiting without an idea of how long I have to wait. Apparently I'm not alone though, several discussion groups have focused on this, here is one.
I guess the lesson for me is patience, this too shall pass.
Though everything has not gone perfectly. I've had some serious challenges with "Save Benjis" in these last two weeks as well. Probably the hardest was losing Amazon content. It looked for a while like "Save Benjis" would have to shut down for lack of pictures, reviews, feature lists etc, but Jim (at FindersCheapers) figured out a way to keep us up and running. For the time being we've lost review content and our product details have gotten anemic, but Jim thinks we can improve this soon.
Another set back has been a couple of small issues in "Save Benjis" that are causing us not to get credit for all purchases made with the program. I have fixed the problems and submitted them for update on July 14th. They've been "In Review" for 11 days. The waiting is quite difficult for me, I must say. Particularly hard is waiting without an idea of how long I have to wait. Apparently I'm not alone though, several discussion groups have focused on this, here is one.
I guess the lesson for me is patience, this too shall pass.
Tuesday, July 08, 2008
I made my first T-shirts last night
In preparation for the launch of Save Benjis on Friday, I designed and bought some T-shirts. I used Zazzle.com's excellent website to do it. Here is a link to the shirt design, in case you are curious. It was quite easy, and very rewarding. We should get the T-shirts by Friday.
Monday, July 07, 2008
Maybe it's starting to work
Ok. Save Benjis has been indexed by google now, but for some reason it only shows up in the results when I type site:savebenjis.com but not when I just do a regular search for savebenjis.com and not when I look at links:savebenjis.com (not even in cache:savebenjis.com). Also it is not finding the first page and only some of the secondary pages.
Here a few things that I've done since last time to hopefully improve the results.
- Validated my html. Previously I had 3 errors that might have been causing problems.
- Added a sitemap to Google Webmaster tools for the site.
- Tweaked various Joomla settings (but I think I turned them all back).
I decided to use Joomla for the Save Benjis site because I thought it would make things easier. Certain things seem much harder (like getting indexed in Google), than writing the html by hand. I hope that as time goes on, the benefits of Joomla will outweigh the initial pain.
Here a few things that I've done since last time to hopefully improve the results.
- Validated my html. Previously I had 3 errors that might have been causing problems.
- Added a sitemap to Google Webmaster tools for the site.
- Tweaked various Joomla settings (but I think I turned them all back).
I decided to use Joomla for the Save Benjis site because I thought it would make things easier. Certain things seem much harder (like getting indexed in Google), than writing the html by hand. I hope that as time goes on, the benefits of Joomla will outweigh the initial pain.
Friday, July 04, 2008
Weird stuff
Ok that is weird -- Solar Core has been re-indexed but no change to Save Benjis. What if I give it a clue that it needs to find the index.php file. Here goes -- Google can you find this www.savebenjis.com/index.php?
Save Benjis -- Having trouble getting in Google's search index
Getting indexed by Google has always been easy and automatic for me. For some reason my new website www.savebenjis.com has been having a harder time of it. Several websites had links to the new site as early as June 21. Google indexed those sites but failed to follow the links through to Save Benjis (at least as of July 4, 2008). The Save Benjis site is using a CMS called Joomla, and perhaps I configured it incorrectly for indexing. I've since changed a few settings so perhaps now it will work. I guess I just have to wait for a site that links to it to be re-indexed.
As an interesting point of reference, Yahoo and MSN have both indexed the Save Benjis site already.
Tuesday, October 11, 2005
Multi-Lingual Spell Checking in Crossword Forge
Crossword Forge has had an English spell checker for the last six months. Still I've found that I've wanted it to do more. Since Crossword Forge is a natural fit for foreign language teachers, I've always thought it would be great if it could bring multi-lingual spell checking to its users as well.
The question on how to proceed with that was a tough one. Do I add additional dictionaries to the current spell checker, or do I try to leverage the spell checker built-in into Mac OS X (which is already multi-lingual). There were pros and cons to both approaches. By adding my own dictionaries, I could ensure that the feature would be available to all my customers at the same time and in the same way (i.e. Windows users would get the feature as well). But it would mean that I was responsible for the reliability of the free dictionaries I found, and I would have to produce a phonetic variant of those dictionaries for each of the languages I wanted to support. It would also mean that Crossword Forge was going to get bigger (the built-in dictionaries take up space), or more complicated (I could have the user download the additional dictionaries separately).
In the end I decided that I would probably eventually want to do both, but should start with the approach that would have the biggest impact in the shortest amount of time. Since most of my current customers were on the Mac, and I could leverage 13 dictionaries in about the same amount of time that it would take to add 1 more dictionary for all the platforms, I decided to go with the OS X integration approach.
A big factor in that decision was Charles Yeomans excellent online book I Declare. The book takes a programmer through the process of integrating Mac OS X spell checker into RB program's step by step. It also gave me a firm enough grasp of the subject, that I felt comfortable going beyond what was presented in the book. Which brings me to a slightly less technical topic "spell checker interface design".
For reasons not entirely clear to me, Apple decided to implement the Mac OS X spell checker window as a non-modal window. This means that, unlike most spell checkers you may have used, Mac OS X's spell checker allows you to modify your document in ways independent of your spell checker, while you are in the process of checking its spelling! For example you could add a paragraph to your document while it is complaining about a misspelled word. The misspelled word in question may not be there any more, or it may no longer be misspelled. Because most other spell checkers are modal (you can't change the document in other ways while you are spell checking) they avoid this situation entirely. The question is, how should the UI respond in those situations.
I was hoping since Apple designed the spell checker this way, they might have a good way of handling it for their apps that use it. Unfortunately Apple seems to have ignored the problem, or at least handled it in what to me seems an unintuitive experience for the end user. For example, If you press the correct button, even when everything about the document has changed, the spell checker will replace the contents of the current selection with the button. This isn't helpful, and could be quite harmful (what if you had performed a select all, operation right before you pressed the correct button. (all of your documents text would be replaced by the corrected word.))
I deviated from Apple's approach in Crossword Forge. The first thing I do differently, is ignore the selection. I instead, store the misspelled word's position in a way that the user can't directly manipulate it (like they can with the selection). If the text itself changes, I look to see if it has effected the position of the misspelled word in question. If so I re-analyze that piece of text (possibly backtracking if necessary) to see if there are new misspelled words in that vicinity. If not, I can safely proceed to replace the corrected word.
Another mistake made by Apple's spell checker is that it doesn't re-consider the current misspelled word when the dictionary is changed. The word may not be misspelled in the new dictionary, and certainly the suggestions should be different. Crossword Forge's implementation corrects this issue.
Despite the rough road, adding multi-lingual spell checking to Crossword Forge was a great experience, and lots of fun. I hope users will enjoy having a multi-lingual spell checker built into their crossword puzzle and word search puzzle generator, as well. If you are interested in trying it out, you can go here: crossword forge download page. If you are on Windows and want multi-lingual spell checking, send me a note. I still plan on tackling the problem myself, but a friendly reminder may help me prioritize it.
The question on how to proceed with that was a tough one. Do I add additional dictionaries to the current spell checker, or do I try to leverage the spell checker built-in into Mac OS X (which is already multi-lingual). There were pros and cons to both approaches. By adding my own dictionaries, I could ensure that the feature would be available to all my customers at the same time and in the same way (i.e. Windows users would get the feature as well). But it would mean that I was responsible for the reliability of the free dictionaries I found, and I would have to produce a phonetic variant of those dictionaries for each of the languages I wanted to support. It would also mean that Crossword Forge was going to get bigger (the built-in dictionaries take up space), or more complicated (I could have the user download the additional dictionaries separately).
In the end I decided that I would probably eventually want to do both, but should start with the approach that would have the biggest impact in the shortest amount of time. Since most of my current customers were on the Mac, and I could leverage 13 dictionaries in about the same amount of time that it would take to add 1 more dictionary for all the platforms, I decided to go with the OS X integration approach.
A big factor in that decision was Charles Yeomans excellent online book I Declare. The book takes a programmer through the process of integrating Mac OS X spell checker into RB program's step by step. It also gave me a firm enough grasp of the subject, that I felt comfortable going beyond what was presented in the book. Which brings me to a slightly less technical topic "spell checker interface design".
For reasons not entirely clear to me, Apple decided to implement the Mac OS X spell checker window as a non-modal window. This means that, unlike most spell checkers you may have used, Mac OS X's spell checker allows you to modify your document in ways independent of your spell checker, while you are in the process of checking its spelling! For example you could add a paragraph to your document while it is complaining about a misspelled word. The misspelled word in question may not be there any more, or it may no longer be misspelled. Because most other spell checkers are modal (you can't change the document in other ways while you are spell checking) they avoid this situation entirely. The question is, how should the UI respond in those situations.
I was hoping since Apple designed the spell checker this way, they might have a good way of handling it for their apps that use it. Unfortunately Apple seems to have ignored the problem, or at least handled it in what to me seems an unintuitive experience for the end user. For example, If you press the correct button, even when everything about the document has changed, the spell checker will replace the contents of the current selection with the button. This isn't helpful, and could be quite harmful (what if you had performed a select all, operation right before you pressed the correct button. (all of your documents text would be replaced by the corrected word.))
I deviated from Apple's approach in Crossword Forge. The first thing I do differently, is ignore the selection. I instead, store the misspelled word's position in a way that the user can't directly manipulate it (like they can with the selection). If the text itself changes, I look to see if it has effected the position of the misspelled word in question. If so I re-analyze that piece of text (possibly backtracking if necessary) to see if there are new misspelled words in that vicinity. If not, I can safely proceed to replace the corrected word.
Another mistake made by Apple's spell checker is that it doesn't re-consider the current misspelled word when the dictionary is changed. The word may not be misspelled in the new dictionary, and certainly the suggestions should be different. Crossword Forge's implementation corrects this issue.
Despite the rough road, adding multi-lingual spell checking to Crossword Forge was a great experience, and lots of fun. I hope users will enjoy having a multi-lingual spell checker built into their crossword puzzle and word search puzzle generator, as well. If you are interested in trying it out, you can go here: crossword forge download page. If you are on Windows and want multi-lingual spell checking, send me a note. I still plan on tackling the problem myself, but a friendly reminder may help me prioritize it.
Thursday, September 29, 2005
ABC's "Lost" had an unusual format last night
I'm big fan of ABC's television show "Lost". I was quite surprised by the format last night. The episode started where last week's episode started and included lots of the same scenes as last week. Each of those scenes were extended, so that we could see more of what was going on, or so that we could see the scene from someone else's perspective. The episode roughly ended in the same spot the first one ended.
I'm not sure, but it feels like they originally planned for a 2 hour opener, and were later told that they needed to show it over the course of 2 weeks. In any case, the wacky format actually added to the mystique. I liked it, but hopefully next week we get to move on. I am anxious to find out what happens next.
I'm not sure, but it feels like they originally planned for a 2 hour opener, and were later told that they needed to show it over the course of 2 weeks. In any case, the wacky format actually added to the mystique. I liked it, but hopefully next week we get to move on. I am anxious to find out what happens next.
Saturday, September 24, 2005
Vonage finally comes through
Vonage finally transferred our business number to our other account. They originally told us that they could get it done in 2 hours, 1 1/2 days later it was finally transferred. They also said the messages would go to voicemail, instead callers at that number would get "this number has been disconnected". Hopefully we didn't lose too much business during that period.
Helping with hurricane Rita
I got to help out with the effort to evacuate southern Texas this week, as a Red Cross volunteer. I was surprised and quite pleased by the amount of responsibility they gave me. It was a great experience, and if you can help out with the red cross (especially during an emergency), I urge you to do so.
On Thursday I got an email from Ryan Nord asking if I wanted to help out at the Red Cross that evening. I did, and I went down at 5 PM to the Austin Red Cross Chapter. Luckily I was going south because the roads were just packed going North. Everyone was getting out of southern Texas in preparation for hurricane Rita. Once at the Red Cross I filled out some paperwork to sign up as a volunteer, and they immediately put me to work (along with a bunch of other friends that had all come down from the church: Ryan Nord, Larry Webster, Ben Winzenz, David Eckholdt, Jayson Wilkinson and Stuart Bontrager).
My first assignment was filing various Katrina refugee files. There were thousand of records that needed to be consolidated. This was important work, but I was glad to see that it was just a temporary assignment.
Soon after we got started filing, we were wanted to do a new task. The local red cross needed rental cars to get some of their work done. 5 of us piled in the back of a minivan (driven by Ben (not Winzenz)) and went to the Airport. Each of us picked up a different car from Avis and drove it back to local chapter. Mine was a Chevy Malibu. I never thought I'd say this about an American made rental car, but it was fun to drive.
Back at the chapter office, we continued to file, while we waited on our next assignment. I was asked to help with the paperwork, to process all of the rental cars.
Then came my next big assignment. Larry Webster and I were asked to deliver hundreds of blankets to two different evacuee shelters. First we loaded the back of the truck with quite a few blankets (135?) Then we went to the Goodwill to buy more blankets. We delivered 10 blankets to a school in north central Austin, and rest went to Artie Henry Middle School in Cedar Park. While at Artie Henry we heard about a dialysis patient that needed to be transferred, but we couldn't help because our truck only had room for 2.
We went back to headquarters (it was now 11:30 pm), and told them about the dialysis patient. They asked if one of us could still help? Since I didn't have anything critical on Friday, I told Larry that I'd be happy to take this one. (Larry had some meetings on Friday morning, and needed to eventually get home.) I was given a van and asked to pick the dialysis patient up and 3 mentally challenged individuals at Cedar Park High and bring them to Reagan High School. Reagan High School was setup as a center for evacuees with special medical needs. When I finished that task, I was quite tired and ready to go home. It was 2:30 AM. The command center was still quite busy however. I offered to spend the evening helping them.
They were quite happy, and were going to have me help open up a new evacuee shelter in Westlake (because of the bad traffic, evacuees were still pouring in from southern Texas, even though it was 3 AM). In a last minute change of plans I was asked to relieve the Shelter Manager for the evening (again at Artie Henry Middle School.) I stayed on duty until 9AM Friday morning, as the acting Shelter Manager.
All I can say is WOW! What an experience. I would have never imagined that I would be given such interesting and rewarding work. I especially didn't think I would be helping in the capacity as Shelter manager when I volunteered on Thursday. It was lots of fun, I look forward to helping them again.
On Thursday I got an email from Ryan Nord asking if I wanted to help out at the Red Cross that evening. I did, and I went down at 5 PM to the Austin Red Cross Chapter. Luckily I was going south because the roads were just packed going North. Everyone was getting out of southern Texas in preparation for hurricane Rita. Once at the Red Cross I filled out some paperwork to sign up as a volunteer, and they immediately put me to work (along with a bunch of other friends that had all come down from the church: Ryan Nord, Larry Webster, Ben Winzenz, David Eckholdt, Jayson Wilkinson and Stuart Bontrager).
My first assignment was filing various Katrina refugee files. There were thousand of records that needed to be consolidated. This was important work, but I was glad to see that it was just a temporary assignment.
Soon after we got started filing, we were wanted to do a new task. The local red cross needed rental cars to get some of their work done. 5 of us piled in the back of a minivan (driven by Ben (not Winzenz)) and went to the Airport. Each of us picked up a different car from Avis and drove it back to local chapter. Mine was a Chevy Malibu. I never thought I'd say this about an American made rental car, but it was fun to drive.
Back at the chapter office, we continued to file, while we waited on our next assignment. I was asked to help with the paperwork, to process all of the rental cars.
Then came my next big assignment. Larry Webster and I were asked to deliver hundreds of blankets to two different evacuee shelters. First we loaded the back of the truck with quite a few blankets (135?) Then we went to the Goodwill to buy more blankets. We delivered 10 blankets to a school in north central Austin, and rest went to Artie Henry Middle School in Cedar Park. While at Artie Henry we heard about a dialysis patient that needed to be transferred, but we couldn't help because our truck only had room for 2.
We went back to headquarters (it was now 11:30 pm), and told them about the dialysis patient. They asked if one of us could still help? Since I didn't have anything critical on Friday, I told Larry that I'd be happy to take this one. (Larry had some meetings on Friday morning, and needed to eventually get home.) I was given a van and asked to pick the dialysis patient up and 3 mentally challenged individuals at Cedar Park High and bring them to Reagan High School. Reagan High School was setup as a center for evacuees with special medical needs. When I finished that task, I was quite tired and ready to go home. It was 2:30 AM. The command center was still quite busy however. I offered to spend the evening helping them.
They were quite happy, and were going to have me help open up a new evacuee shelter in Westlake (because of the bad traffic, evacuees were still pouring in from southern Texas, even though it was 3 AM). In a last minute change of plans I was asked to relieve the Shelter Manager for the evening (again at Artie Henry Middle School.) I stayed on duty until 9AM Friday morning, as the acting Shelter Manager.
All I can say is WOW! What an experience. I would have never imagined that I would be given such interesting and rewarding work. I especially didn't think I would be helping in the capacity as Shelter manager when I volunteered on Thursday. It was lots of fun, I look forward to helping them again.
iota-calc 1.6 released
I finally got iota-calc 1.6 out the door. I had been sitting on the release for a few days, because of some volunteer work I was doing (more on that later). Also, Selene found a problem with one of the conversions (bits to bytes), which has now been fixed. If you want to try the new version, you can go here iota-calc download page.
Thursday, September 22, 2005
Customer Service
I am currently on the phone with Vonage, the broadband phone company. I've called to have them transfer my business line over to an extra phone jack on my regular phone account (also with Vonage). I'm doing this because the Fax line on my business account doesn't work correctly, and never has (often we would get partial faxes or none at all). This is the second time I've called to get them to transfer the account. The first time, was about one month ago. They were supposed to get it all taken care of by that evening. Now its a month later, nothing happened with the account, and we just got another bill for $44.19. This time they are telling me that they will get it right, oh but if they don't, here is a phone number that I can call to bug them about getting it right. Its nice that they give me a name and a phone number, but I really don't want to spend my time making sure they get their act together.
If they could only get it right, without multiple one hour conversations, and without being transferred to new people every ten minutes, it wouldn't be so frustrating. I believe that explaining the same problem to several people is the crux of why customer service often fails. In the process of being transferred all of the progress you made in the communications effort is lost and you have to start at ground zero.
To be fair to Vonage, this isn't a problem that is unique to them. In fact Vonage's customer support has a few things going for it. Their phone personnel are very polite and helpful, and they sound empowered to fix my problem (very unlike SBC's phone support, but that is an entirely different story).
If they could only get it right, without multiple one hour conversations, and without being transferred to new people every ten minutes, it wouldn't be so frustrating. I believe that explaining the same problem to several people is the crux of why customer service often fails. In the process of being transferred all of the progress you made in the communications effort is lost and you have to start at ground zero.
To be fair to Vonage, this isn't a problem that is unique to them. In fact Vonage's customer support has a few things going for it. Their phone personnel are very polite and helpful, and they sound empowered to fix my problem (very unlike SBC's phone support, but that is an entirely different story).
Subscribe to:
Posts (Atom)