Monday, November 12, 2012

Android accelerometer sampling rates

An app I'm working on relies on quick spikes in accelerometer activity, like fractions of a second, so I have to have a pretty fast accelerometer. Android lets you specify accelerometer sampling rate, kind of: you can choose SENSOR_DELAY_NORMAL, SENSOR_DELAY_UI, SENSOR_DELAY_GAME, or SENSOR_DELAY_FASTEST. Then the phone will try to give you samples at a rate that works for your app.

On NORMAL, my Nexus S gives me about 7Hz. Not at all fast enough. On UI, GAME, or FASTEST, I get about 49Hz, which is almost fast enough. So I gave some friends a little test app which determined their phone's FASTEST sample rate and here's what I found (readings in Hz):

Motorola Droid X: 5.19
Motorola Droid X2: 6.23
ZTE Blade: 9.11
HTC Nexus One: 24.86
HTC Evo 4G: 37.54
HTC Wildfire: 38.40*
HTC Desire: 47.27*
LG Nexus S: 49.44
Samsung Galaxy S3: 93.98
Motorola Atrix: 94.32
Sony Ericsson x10 Mini: 94.77**
Samsung Galaxy S2: 96.03, 97.5
Samsung Galaxy Nexus: 99.8
Samsung Note II: 100.0
Samsung Galaxy S3: 100
Samsung Galaxy Teos: 109.42*
LG Nexus 4: 198

(* from this stack overflow post)
(** from this slideshow, slide 13)

Want to add a reading? Here's how:
1. Enable installation of apps from unknown sources (Settings -> Security -> Unknown Sources)
2. Download this app
3. Tap "start", wait 5 seconds, and post (in a comment) which phone you have and what reading you get.
Edit: thanks all for adding to this! If you're looking for some other phones, check out the comments below.

Sunday, May 20, 2012

vim: using the system clipboard

It annoyed me that I couldn't yank (copy) something in vim using y and then paste it in something else with ctrl-v, or vice versa. I found that the following line (linux, x11, vim 7.3), makes it just work:

:set clipboard=unnamedplus

What's going on here?
vim has "registers." Each register is like its own clipboard. You can choose your register with ". So for example:
means "using the a register ("a), copy/yank the current line (yy)". But most of the registers only live within vim. Vim has two special registers though: * and +. On Windows and Mac, they are both the system clipboard. On X11 they are different and only the + is the system clipboard. So in vim on either system, you should be able to type:
to copy the current line into the system clipboard, and then ctrl-v in a windowed application to paste it. Then the "set clipboard=unnamedplus" line just makes the + register the default one.

More info from vim tips here and here.

Side note: I think that by saying "system clipboard" I am being a little vague because there are actually three system clipboards in X11, but the ctrl-c ctrl-v one is the one I always want. I think this is called, amusingly, the CLIPBOARD clipboard. More here.

Another side note: on my older Macbook (OS X 10.6.8 Snow Leopard), I couldn't easily get Vim 7.3.74+ (where clipboard=unnamedplus is introduced). The MacVim version available is 7.3.53. However, as mentioned above, * and + are both the system clipboard on a Mac, so set clipboard=unnamed works. (be careful if using tmux.) You can check if unnamedplus is available, so my .vimrc now looks like:
if has('unnamedplus')

  set clipboard=unnamedplus
  set clipboard=unnamed

Thursday, March 22, 2012

Nook Rooting and Mounting Drives in Unix

I got a Nook Simple Touch, because you can put Android on it and then use the Nook app, the Kindle app, or whatever pdf reader you want to read all of the ebooks, not just Amazon's or B&N's. To put Android on it, I used this guide. (this is for Nooks with firmware 1.1; here's the one for 1.0 or 1.0.1. Find your firmware version in Settings->Device Info->About Your Nook)

The process works as follows: download a disk image, put it onto a microSD card, put that card in the Nook, boot up the nook, and then do a bunch of things on the software to sign in to the Android Market and download apps. The tricky part for me was putting the image onto the SD card.

The command to put the image on the SDcard (where touchnooter-2-1-31.img is the name of the disk image file) is:
sudo dd if=touchnooter-2-1-31.img of=/dev/
The tricky part is that you have to replace "/dev/" with the name of your SD card. (this site clarifies: "where is your sdcard (for example /dev/sdc or /dev/mmcblk0, not the mount point of the sdcard or an existing partition like sdc1 or mmcblk0p1)." What does this mean?

If a volume (aka a partition of a drive) is "mounted", then it's got an alias in the big unix filesystem tree and you can access files on it. Usually, when you plug in an SD card or USB drive, the system mounts it automatically. You can just run the command "mount" to see what's already mounted; most of it didn't mean anything to me when I ran it, but at least I saw this:

/dev/sda1 on / type ext4 (rw,errors=remount-ro,commit=0)
which is my main hard drive's main partition, so that's interesting. You can also (in Ubuntu) use the "Disk Utility" to see what's mounted.

In Disk Utility, click on your card reader on the left, and you'll see in the top right "Drive" and in the bottom right "Volumes". Look for "Device:", which will tell you the name of the drive in the filesystem. For example, right now I've got a card in there that has one partition and a bunch of free space; the Drive is /dev/sdd and the Volumes are /dev/sdd1 (the existing partition) and /dev/sdd (the free space).

When you're running that sudo dd command above, you want to write to the drive, not a partition of that drive. I kept trying to dd the image to /dev/sdb1 (which was a partition of my SD card) instead of /dev/sdb (which represented the card itself). Once I wrote the file to /dev/sdb, it worked.

Note that playing around with dd is dangerous: if you accidentally write files to the wrong drive (like /dev/sda in my case), you can erase your hard drive. So make sure (via Disk Utility) that you're writing to the SD card.

Outstanding questions in my mind:
- what's the command-line tool that will tell me the same things that Disk Utility tells me?
- what is "/dev/sdb" and how does it get there? I guess it's just an identifier that refers to my SD card when I put it in, but why /dev/sdb? And what is it, is it a file descriptor or what? I think /etc/fstab and /etc/mtab are involved, but I'm not sure how; and who puts those two files there?
- is "unmounting" exactly the same as "ejecting" your SD card/USB drive?
- what does dd do that just moving the disk image file to the SD card doesn't do? According to wikipedia, dd is just a lower-level way to move raw data. So it can... cause some file to be run when you boot or something?