Tuesday, June 8, 2010

Writing Code on Handhelds

I was emailling recently with someone about doing development on handheld devices. Not just writing software for handheld devices, but what it is like to actually write code using a handheld device as the development platform.

What follows is a description of my mobile development environment, and the ups and downs of using current generation phones for software development.


I've wanted a decent, portable Linux machine to do hacking on for a long time... dating back to the days when I was messing around with trying to get a cut-down version of Linux running on a HP 100 LX palmtop. And now I'm finally there.

My current mobile phone is a HTC Dream (a.k.a. the T-Mobile G1). I actually bought the unlocked ADP1 version directly from Google. It is currently running a custom Android 1.5 firmware (cupcake). Since everything basically works (like phone calls), I haven't been on the upgrade treadmill... though I'll definitely upgrade to CyanogenMod CM6 when Android 2.2 (froyo) is released.

For doing code development on this device, I'm using the excellent ConnectBot as a local terminal program. This is far superior to the Google terminal.

After partitioning an 8GB micro-SD card (2GB for FAT32, 6GB for ext2), I was then able to install Ubuntu Jaunty userland using Paolo Sammicheli’s instructions. So that gets you: Python and Lua, VIM, screen, ssh, rsync and GCC. A decent browser, always-on (if slow) Internet, WiFi, Bluetooth, expandable storage... and it makes phone calls too! How cool is that?

I've been using Mercurial for my DVCS, but the Ubuntu packages weren't available. However, I was able to just download the source and run it on the G1 as well.

For the code I write, I'm not accessing any of the phone's features, nor am I trying to make regular Android applications. If I were, though, there is the Android Scripting Environment available, through which you can also use Lua.

As far as editing code on a small mobile device, the major pain points are exactly what you'd expect: screen size, keyboard, overall speed and storage.

With ConnectBot, I can get a 80x22 terminal window... using a tiny font. So that's kinda OK. And using GNU screen here helps a lot by just being able to flip between my edit window and the compile / run window.

But not having a browser window open on a 2nd monitor slows me down a lot. Sometimes I can get by with Lynx in another console window, but that isn't too fun.

As far as the keyboard goes, the G1 is completely superior to any other phone keyboard I've ever seen. For starters, it has dedicated number keys, and the brackets, parens, and other ASCII symbols are all available with a single Fn button push. This is in marked contrast to other phone keyboards which would make typing code in any programming language much more painful.

That said, the keyboard does slow me down. I don't type real fast (maybe 60 wpm normally), but the phone's keyboard slows me down enough to interfere with my thought processes.

As far as speed goes, it is not too bad really. I don't do heavy number-crunching or work with large data sets, and Lua is one of the fastest scripting languages anyway. But if I do start dealing with large data sets, the phone will be unacceptably slow compared to a desktop.

There are some new chips on the horizon (like Nvidia's dual-core Tegra 2) that should improve things considerably. I'd like to see that in somethine like the OpenPandora form factor (though I have issues with that particular product).



So how good is this platform really? Is the environment good enough for short edits, like fixing a bug?

Yes, it definitely works fine for stuff like that. I do write short segments of code on it too, when I don't feel like breaking out the netbook.

Do note that I only use VIM for code editing, which works way better for this handheld device.

For instance, since I don't use 'find letter' commands in VIM, I've mapped 'f' to page down and 't' to page up. So I'm not hitting control key combinations very often. That is a two step process in the ConnectBot terminal program... you have to press the trackball button, and then 'f' for Ctrl-F. There is no dedicated ESC key either, that is mapped to a double press of the trackball button, which isn't too bad.

If I was using Emacs or any other non-modal editor, code editing would be a lot more painful, and I'd have to rely on using the trackball to move the cursor around. And that would be very slow.

Code editing in general is going to be a problem for any mass-market handheld device I'd expect. I've never seen one with a dedicated ESC key, Ctrl key, or (hah!) an Alt key (in the desktop keyboard sense). These devices are optimized for typing in plain text, not editing. And definitely not code editing.

ConnectBot has other nifty features. For GNU Screen you can map the phone's camera button to 'Ctrl-A Space', to switch to the next terminal window. You can also map a short press of the right ALT key to be '/', and a short press of the right shift key to be Tab. So typing in paths and autocomplete are easy.



I've looked at some of the other Android phones that have keyboards, but most don't have dedicated number keys. Many also don't have some important symbols mapped to the alt-keys. Typically these symbols are missing: { } < > [ ] ~ _ \ Whereas the G1 has all of these as Fn-keys. It is probably possible to type in those symbols on other phones, but it may require a three key press combination. :-(

The Motorola Android phones are examples of the ones that have less keys on their keyboards. And my co-workers tell me that typing on the Droid isn't that fun anyway, the keys are too close together.

Other phones with possibly acceptable keyboards include the LG GW620 and the Samsung SPH-M900 'Moment'. I'm not sure what it takes to get root on those phones though. I bought the developer version of the G1, so it was easy to load custom firmware and get root.



So, in summary, if you're satisfied with the tools I normally use: GNU Screen, VIM, ctags, and command-line everything else, the G1 phone is about as good as it gets for ultra-portable hacking right now. With some practice, I've been about to get up to about 30wpm on the G1's keyboard for English text.

My dream phone would have a slightly larger screen, about 4.2in. We don't have to go crazy-high resolution, WVGA would be fine. The keyboard could be a little bigger, with the keys spaced out a little more. But not too much! I still want to use just my thumbs, without having to stretch.

More important though would be dedicated ESC, Tab, '/', Control and Alt keys. I can live with the symbols being Fn-key combinations. Other minor touches would include re-programmable shoulder buttons.

More speed and storage would of course be welcome. Qualcomm has talked about dual-core 1+ GHz Snapdragons, so that would be excellent. I'd also want at least 512MB of RAM. Full support (and APIs) for OpenGL ES and OpenVG would make GUI applications real zippy.

Designing that sort of thing is actually my day job too. But I can't justify the hundreds of thousands of dollars to just make one for myself. :-)

5 comments:

randomnut said...

For people locked on Symbian, try the Python console and a good text editor.

John Stracke said...

I use the Nokia N810. Not a phone, but it's got a good keyboard, good enough to run emacs. I don't just use it as a terminal, either; I work right on the device. I've got emacs, gcc, hugs, python, python3, ocaml, mosml, clisp, guile...maybe others. Most interesting languages aren't easily available for ARM; but almost anything that's a pure interpreter will work fine.

math0ne said...

Cool! I use emacs on my G1 pretty regularly, I have a custom keymap, but I don't find it too difficult to use.

Calvin Spealman said...

I use my G1 a bit like this, but not often. I always keep a screen session open that I can ssh into, with an alias on any of my machines to access it quickly. So, I can jump from desktop to laptop to phone and work on the same thing. I don't have to worry about a slow compile on the phone cpu, and I only have ConnectBot to worry about having installed. I've even built and deployed hotfixes from the road using this setup.

Personally, I'm interested in developing systems specifically with this in mind. I know it sounds like an old cliche, but typing will only take us so far and work in so many situations. At least, as the main interface.

Lee said...

I think that it's possible to directly compile Python via the NDK and write a bootloader in C so that you write native python apps. The problem with this is that you will still have to write wrappers around android so that python can actually interact with the phone. The first part is easy enough though:

#include "Python.h"

PyObject* pyeval(char* code)
{
int eval = 1;

PyObject* main = PyImport_AddModule("__main__");
PyObject* globals = PyModule_GetDict(m);

PyCodeObject* c = Py_CompileString(code, "code.py",Py_eval_input);
if (!c){
PyErr_Clear();
eval = 0;
}
PyObject* result = PyRun_String(code, eval ? Py_eval_input:Py_single_input, globals, globals);
if (!result){
PyErr_Print();
PyErr_Clear();
return Py_None;
}

return eval;
}

Bare skeleton code that I stole from another one of my project, you just have to push the python file into pyeval. (Be sure to call Py_Initialize(); first)