• Text messages are unreliable and insecure
  • Apple iMessage and Google+ Hangouts suffice in most situations
  • Off-the-Record messaging provides personal encryption on top of Google and Facebook services

Many of us use SMS for text messaging, but have had some trouble with delayed or lost messages. Text messages are inherently unreliable and insecure. Because our work often involves confidential information, we need to consider the limitations of our favorite communication channel. Many of you know that I’m technically oriented. As a software developer with mobile technology experience, I’d like to start by explaining how text messages work.

Read on »

Knowing that it could be difficult to get printers and scanners working with Linux, I did quite a bit of research before settling on the Brother DCP-7065DN. Because I use Ubuntu, I did not have much trouble installing Brother’s proprietary debs. The scanner worked nicely; but the printer test page was shifted up and right, such that the output was clipped on the top and right borders, with the correct paper size setting.

Enabling Job Options > Scale to fit fixed the clipping, but the image was still off-center. I played around with the PPD file a bit, and achieved favorable results by shifting the ImageableArea values a bit in the opposite direction:
Read on »

The recent donglegate debacle brings to light a poignant issue relevant to the programming community, the medical community, and the human community in general — that misunderstanding and miscommunication could easily cause a small problem to escalate out of control:

A male conference participant makes a silly joke to his friend. A female participant overhears this and finds it offensive. She publicly criticizes the behavior, posting his photograph to some 10000+ Twitter followers. The male participant is fired from his job. Commenters make hateful statements about the female participant, and anons threaten to attack her company. She is fired as well.

This is not about men, women, or anons; nor is it about sexism or dongle size. Because of inappropriate reactions to what began as an inappropriate joke, two people are out of jobs and there is much outrage in the community. There are better ways to handle situations like this. Let’s always try to be tactful, give each other the benefit of the doubt, and treat fellow humans with respect.

I wiped my Galaxy Nexus last night and reinstalled ClockworkMod+CyanogenMod. This morning, I woke up to a SMS from at&t:

AT&T Free Msg: Did you know a data plan is required for your Smartphone? We have added an appropriate data plan. Learn more at

This is funny, because I had no idea that a data plan was required for my phone. Thanks, at&t, for preemptively adding services that I don’t need. They do this once in a while, and it’s getting ridiculous.

I was able to have a customer service representative remove the data plan.

I stepped out this afternoon planning to paint the town as if it were St. Patrick’s Day, but I was disappointed to find a bleak landscape mostly devoid of portals. I did manage to capture a couple of unoccupied portals, submit a few portal candidates, and top off my XM meter.

Ostensibly, Ingress is an augmented reality MMOG by Google for Android devices. Players join one of two factions, collect “exotic matter” (XM) for energy, and capture portals associated with physical locations. Three or more portals may be linked into a polygon, and the population covered by the polygon is added to the “mind score” of the player’s faction. Since the game involves publicly-accessible landmarks, it is best played in more densely-populated areas. As a side effect of playing Ingress, players submit landmarks, GPS coordinates, and other mapping data to improve Google’s mapping service.

Ingress is currently in closed beta. To get an invitation, you could either lodge a request at or, or hang out on #invites at Details regarding Ingress lore could be found at the unofficial Niantic Project Wiki, and a list of in-game passcodes is on Google Docs. Good luck and enjoy!

My younger cousin was enrolled in a persuasive writing class, and this was one of his prompts. The prevailing answer was no, because they present distractions and enable users to look up answers without thinking. A handful of students answered yes, because they are useful learning aids and provide points of contact in emergency situations. On a more fundamental level, the question heralds a technological revolution so pervasive, even among children, that we need to re-imagine the role of education.

Read on »

I started growing an avocado today. What secrets lie dormant within the oversized seed? Since the seed had already cracked down the middle by the time I dug it out of the avocado, I guess I have a few weeks’ head start. Join me for a guacamole party in a few years, maybe.

My table at the Flushing Library was missing a chair, and a rather disgruntled-looking lady was looking for somewhere to sit. When she saw that the next table had an extra seat, she decided to confront its occupant.

Angry Lady: That’s my seat.
Occupant [disengaging earbuds]: What?
Angry Lady: You took that chair from my table.
Occupant: I don’t understand. You’re saying that my seat belongs somewhere else?
Angry Lady [pointing at her table]: It’s obvious! Now put it back, please.
Occupant: Oh… if it would make you feel better, I could move over.
Angry Lady:
Occupant: I don’t really mind where I’m sitting, but I don’t know why you’re upset about it.
Angry Lady:

Fortunately, a library employee brought another chair, and everyone was satisfied.

I am delighted to announce the immediate availability of BotBrew on Google Play. This first release brings cross-compiled command line software to Android, along with a package manager based on opkg and a service manager based on runit. Some highlights include:

  • an almost-complete busybox with 327 applets
    have more of your favorite commands without the bloat
  • python and ruby
    script on-the-go, or run django- and rails-powered servers
  • subversion and git
    access source code using two popular version control systems
  • tcpdump and nmap
    analyze network traffic and query remote hosts
  • lynx and w3m
    go retro with lightweight text-based Web browsers

BotBrew could be used with any terminal app that provides a local shell, but Hacker’s Keyboard and Script Manager might be helpful, too. Spread the word if you like BotBrew! If you have trouble with BotBrew or have bugs to report, feel free to email us at or chat with us at #botbrew on And we’d love to hear from you if you want to distribute your own software using BotBrew.

I return to school at noon, but before then, I’d like to share my evening project: agcc.bash, a rewrite of agcc and that works with revisions 6 and 7 of the Android NDK.

The NDK is a GCC-based cross-compiler that lets you embed object code in a traditional Android app. It also works as a standalone cross-compiler, though it is not advertised as such. It is quite rough when used by itself, and agcc wraps the complexity in a little script. While agcc and are written in Perl, agcc.bash is a Bash script. It also supports the latest revisions of the NDK, though r7 is slightly buggy.

With agcc.bash, building native Android software feels almost like working with GCC. As a quick example, let’s try the classic hello world:

AGCC_NDK=~/android-ndk-r6 ./agcc.bash hello.c -o hello

That wasn’t too exciting… but what happened there? I have the NDK installed at ~/android-ndk-r6 and I told agcc.bash where to look for it, using the AGCC_NDK environment variable. I then invoked agcc.bash as if it were GCC. Let’s see what agcc.bash did behind the scenes:

AGCC_NDK=~/android-ndk-r6 AGCC_ECHO=yes ./agcc.bash hello.c -o hello

=> ./agcc.bash hello.c -o hello
<= /home/jyio/android-ndk-r6/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/arm-linux-androideabi-gcc -o hello -I/home/jyio/android-ndk-r6/platforms/android-8/arch-arm/usr/include -D__ARM_ARCH_5__ -D__ARM_ARCH_5T__ -D__ARM_ARCH_5E__ -D__ARM_ARCH_5TE__ -DANDROID -DSK_RELEASE -DNDEBUG -UDEBUG -march=armv5te -mtune=xscale -msoft-float -mthumb-interwork -fpic -fno-exceptions -ffunction-sections -funwind-tables -fmessage-length=0 -march=armv5te -mtune=xscale -msoft-float -mthumb-interwork -fpic -fno-exceptions -ffunction-sections -funwind-tables -fmessage-length=0 hello.c -Bdynamic -Wl,-T,/home/jyio/android-ndk-r6/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/arm-linux-androideabi/lib/ldscripts/armelf_linux_eabi.x -Wl,-dynamic-linker,/system/bin/linker -Wl,–gc-sections -Wl,-z,nocopyreloc -Wl,–no-undefined -Wl,-rpath-link=/home/jyio/android-ndk-r6/platforms/android-8/arch-arm -L/home/jyio/android-ndk-r6/platforms/android-8/arch-arm/usr/lib -nostdlib /home/jyio/android-ndk-r6/platforms/android-8/arch-arm/usr/lib/crtend_android.o /home/jyio/android-ndk-r6/platforms/android-8/arch-arm/usr/lib/crtbegin_dynamic.o -lc /home/jyio/android-ndk-r6/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/lib/gcc/arm-linux-androideabi/4.4.3/libgcc.a -lm -ldl

See how it transformed our innocent little command into a monster! This might be overkill for a hello world program, but it provides pretty good support for more complex software such as OpenSSL, cURL, and Python. It would be a good idea to add the NDK toolchain and agcc.bash to $PATH before trying to build a big program. In my case, the toolchain resides in ~/android-ndk-r6/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin. If you want to build some software that come with configure scripts, you might start with:

CC=agcc.bash ./configure

Do try this at home! Relevant links: