Older blog entries for rbp (starting at number 6)

Pushing up Python on Android

A few days ago, I put on the manliest voice I could muster and made an announcement to my wife: "Stand aside, woman! I am going to the gym!"

Needless to say, she was thoroughly unimpressed but somewhat amused when, half an hour later, she found me at the computer, programming.

Despite what she might tell you, I hadn't given up on exercising. You see, I had recently taken up the One Hundred Pushups, Two Hundred Situps and Two Hundred Squats programs. These involve a few sets of a varying number of repetitions each, with timed pauses between each one. So, for instance, on my first day I'd do 10 pushups, rest for 60 seconds, do 12 pushups, rest, 7 pushups, rest, 7 pushups, rest, and finally as many pushups as I can (but at least 9). These numbers of repetitions vary as you progress. My problem was keeping track of how many repetitions of which exercise to perform on any given day.

Now, there are nice PDFs with the whole exercise program on each site, but they're supposed to be printed. On paper. How low tech! Some people use spreadsheets, but... Meh. So I decided I should turn to my Android phone for help.

There is an iPhone app for One Hundred Pushups et al, and at first I considered writing an Android app to match. And I still do, but, of course, that's a full-on project, one that would definitely not be usable in time for me to exercise that night. So: pragmatic program, must be running in a very short time (my wife was laughing out loud, by then) and improve as need arises. This looks like a job for... Python!

Python is not (yet?) a first-class citizen on the Android, but it's a respectable second-class one, thanks to Damon Kohler and his Android Scripting Environment. ASE lets you run several interpreted languages on the Android, amongst them Python, Lua, Perl and JRuby. However, these are limited on what they can access on the Android API. More specifically, you can't build arbitrary user interfaces or create new activities (though you can invoke existing ones).

Still, having a Python interpreter on your mobile can be handy. I needed to input three sets of repetitions (one for each exercise program), and have Android let me know how many repetitions to do next, and for how long to rest between them. I'm still meddling with this code (trying to weigh making it better versus building a proper app versus actually, you know, exercising), this is just a quick hack I cooked up to get going, but it's growing on me. Anyway, here it is:

from time import sleep
import android

droid = android.Android()

# How long to rest between repetitions
rest = 60
# Warning before starting next round
wake = 10

# One line per exercise set, each number of repetitions separated by spaces
# For instance (pushups, situps, squats):
# 10 12 7 7 >=9
# 9 9 6 6 >=8
# 19 24 19 19 >=27
user_input = droid.getInput("Series", "Describe all repetition sets in your series:")
series = [i for i in user_input["result"].splitlines() if i.strip()]

def interval(theres_more=True, rest=rest, wake=wake):
    droid.makeToast("Rest for %d seconds..." % rest)
    sleep(rest - wake)

    if theres_more:
        droid.makeToast("Ready? %d seconds to start!" % wake)
        droid.vibrate(500)
    sleep(wake)

    if theres_more:
        droid.makeToast("Go!")
    droid.vibrate(3000)

for s in series:
    droid.getInput("New series!", "Ready?")
    sets = s.split()
    l = len(sets)
    for n, repetitions in enumerate(sets):
        droid.getInput(repetitions, '(press Ok when finished)')
        interval(theres_more=(n+1<l))

droid.makeToast("w00t! Congratulations!")

(you can also download it here)

As explained in the comments, it initially expects lines containing the number of repetitions on each set. So, if I'm undertaking pushups, situps and squats (respectively), I might input:

10 12 7 7 >=9
9 9 6 6 >=8
19 24 19 19 >=27

Of course, ">=9" is not a number, but the script will use whatever you input there as labels for prompting you to perform your repetitions.

You'll notice that the script uses getInput for displaying messages when it expects the user to press "Ok" (even though it doesn't expect any typed input at all). That's because, currently, getInput is the only graphical widget provided by the the Python proxy for the Android API. But more on that later.

So, try it out (if you're willing to exercise at all, or if you're just curious), and let me know what you think! Did it help you exercise?

Syndicated 2009-10-07 19:08:31 from Bits of rbp - isnomore.net

Bleeding hell, it's been a long time (more specifically, since a time when advogato didn't have password recovery)... "Update advogato" >> GTD.Inbox

Four posts, all from 2000. Ok, we can all see where this is heading. I officially pronounce this advogato blog dead. There should be more frequent posts at http://isnomore.net/blog

Ok, a bit late for that, but oh well...

Everything happened at Comdex: I lost my luggage on the plane to Chicago, the booth wasn't ready, the other girl from Conectiva that went there had trouble with her reservation at the hotel... But, when we finally got things ready, it went ok. All that trouble kept me busy with solving problems and less with enjoying he show, but I think it was a positive experience...

I'm almost on my way to Comdex Sprint (Chicago - USA)!
Last week I was asked on wednesday if I'd be available to go to the US the next saturday, for CA World and stay there until Comdex. Wow! Can I pack first? ;)
Then they (Conectiva HQ) told me someone else would go to CA, but I'd still go to Comdex. Cool :)
It seems I'm going tomorrow night. Yes, I still don't know.

See you at Comdex :)

Well, LinuxSP once again rises from the dead. But this time I've made it clear that I don't currently have time to organize events. And some people seem to have taken it to their responsability! That's great. It's the same people that usually help, but it's still something. Let's see how things go. Personally, I'll help as much as I can (it wasn't an excuse, I really don't have the time) and hope everything works out. If the event (probably a demo day) fades and doesn't happen, some action will have to be taken or no one will take us seriously...

Ah, isn't it good to be publicly accused of misusing trust of others in other to obtain personal gain....
http://pontobr.org/noticia.php3m?nid=594. Anyway, I've been unable to write a long message on LinuxSP and now seems to be the time (actually, long after the time). I'll finish it and post it today or tomorrow....

New Advogato Features

New HTML Parser: The long-awaited libxml2 based HTML parser code is live. It needs further work but already handles most markup better than the original parser.

Keep up with the latest Advogato features by reading the Advogato status blog.

If you're a C programmer with some spare time, take a look at the mod_virgule project page and help us with one of the tasks on the ToDo list!