Quiz App for Transfinder

I’m graduating soon and have been busy the past few weeks applying and interviewing for a handful of positions. One of these positions is with a fairly small company, Transfinder. Transfinder provides tools for school districts and parents to enhance safety and track a variety of factors for report generation. After a successful phone interview I was given a programming project for the next stage of the interview process. Transfinder gave me access to their API for three days and I was tasked with developing a program utilizing the API in some way.

The assignment was very open ended – there were no requirements on a programming language or specific functions. In the past year or so my personal projects have shifted mainly to iOS and Objective-C so an iPhone app was the clear choice. I developed an app that pulls data on students and schools from Transfinder’s API. The user is then presented with a simple quiz on students’ association with schools. This is a fairly simple description but the project also involved multithreading and custom draw routines. I’m very happy with the end result and it landed me a second, in-person interview. Check it out!

Campus Key for Foothill College

I took an iOS development class at Foothill College a little over a year ago and ended up developing a small app for them. It’s a system to generate “key request forms” – a form that faculty and staff have to fill out for each and every office/building they need access to. I learned some neat tricks making it and am pretty happy with how it turned out.

 

Batch Download iOS App Icons

This site has been in serious need of a redesign for years and a graphic designer friend of mine had the idea of spelling my domain using app icons! I loved this idea but I had a slight lack of letter based app icons to play around with (read: none).

It turns out Apple provides an iTunes Search API which I could use to programmatically access search results for any terms/categories/etc. The major limitation of this API is that it will only return 200 results for a single search term and has no way to specify pagination (so I can’t, for example, get results 200-400 in my request). The only way around this would be to download and parse the entire Enterprise Partner Feed which contains all metadata in the iTunes store. Regrettably, I am not an enterprise partner (yet) so I don’t have access to that data.

The JSON search results specify locations for both 60×60 and 512×512 app icon images. The script I’ve written prompts the user for a comma separated string containing a list of search results. The script will then query the Search API for each of the terms and download the 200 results into a subfolder named by the associated search term. There’s no support for searching in specific categories only or searching the top charts but that functionality would be trivial to add using the API documentation as reference.

Here is a link to all of the “letter icons” I’ve accumulated: letterIcons.zip (sorry, I only cared about SIDEAP)

I’ve also included the first draft of the new site logo (currently using the 2nd draft as of 8/29/14). If anyone wants to try their hand at another design I’ll give them two million dollars. Don’t forget to grab the source below as well! My apologies for the lack of comments in the code… I’m better than that.

Website Header Prototype A

 

Introducing Rise

I’m an avid biker currently living on the slope of what could be considered a plateau. Downtown elevation is ~5-10 meters, I live at ~60 meters and the top of my campus is ~100-120 meters. Suffice to say, I’ve been doing some hill training. I’ve used MapMyRide to track my workouts in the past but I’d like a workout tracker centered around elevation. Now entering the ring: Rise.

Rise aspires to be a simple, straightforward application geared entirely around elevation data (leaving the possibility for almost endless expansion). So far, response has been mixed – many people don’t see a need for this app and it’s been brought to my attention that Strava provides similar elevation graphing options. However, I believe by focusing mainly on elevation that my app will be able to match my high standards of simplistic UX and beautiful UI. Also I want it so I’m doing it.

I’ve been developing Rise in my free time for a little over a month and I’m very pleased at the progress I’ve made. I’m still in the experimental stages and have put no thought or time into UI or UX. I’m confident I’ll be able to get the elevation graph to display just the way I want it but I need some guidance/assistance in coming up with a “workflow” for the app. I haven’t reached the point where I’m ready to dedicate my own focus toward UX design and it would be wonderful to find someone interested in working on this with me.

Here are the features I’ve got working:

  • Local GPS lat/long/elevation logging
  • Google elevation API queries using lat/long from the GPS
  • Data upload functionality for data to aid with a best-fit algorithm for the elevation chart
  • Local viewing of uploaded data in CSV or TXT with the ability to export the data
  • Graph support – about halfway to where I’d like it to be but fully functional in its current state
    • Zoom and pan within proper bounds
    • Logic implemented for gradients under slopes of varying strength
    • Dynamic axes that update automatically upon pan or zoom

Here’s what I’ve got on the docket before an initial release:

  • Theming support
  • Ability to select slopes of the plot in order to view additional data like min/max/average speed
  • More chart data animations
  • Chart export options
  • Data unification algorithm
  • UI + UX

Well, that about does it for this introductory post… here are a few links for you guys and a look at the current graph:

Rise on Github
Uploaded Data


Rise App

CatSpam: An Innovative Approach to Spam

I often come up with programming ideas as I’m trying to fall asleep and, more often than not, this forces me out of bed to start some silly work. About a year ago I had an idea: Would it be possible to create a script to text friends, family and/or strangers with some form of spam. For some reason I landed on the innocuous topic of feline facts and got right to work.

My first idea was to use the email system that has been in place for some time now to send the text messages. However, this requires me to know what network the phone is on and that’s a problem I wasn’t interested in dealing with. Then I remembered Google Voice… For the uninitiated, anyone with a Google account can now get an additional phone number, free of charge. You can configure Google Voice to forward your calls to whichever phones you chose while keeping your primary phone number concealed.

Python, being one of my favorite languages was the clear choice for this task. It turns out that Google has no public API for their Google Voice service. Thankfully, some pro programmers have created Google Voice libraries for a handful of languages, including Python. I used pygooglevoice which ended up being a pleasure to work with. The program prompts the user for their Google login (which is securely handed off to Google for verification) and then asks the user for the phone number they would like to send spam to. Also configurable is a time interval in which the texts will be sent. The cat facts are read from a file located in the same directory and, in theory, could be replaced with any text file in the same format.

Enough about the program – here it is:

If you’re interested in the actual catfacts.txt file you can check it out here: catfacts.txt

Here are packaged executables for Windows and OSX – make sure you have a catfacts.txt file in the same directory as the executable or the app will crash!

Add Markers to Google Map from CSV

I was recently asked to create an HTML page that would access a CSV file containing a list of latitude/longitude values and generate a map with markers for each location. This project was a proof-of-concept challenge for me so I’ve really just made a barebones implementation. That said, it should be very easy to expand using only Google’s API documentation for reference. Google Maps were the clear choice as they’ve become a bit of a de facto standard. Enough – let’s dig into the code!

This block of Javascript converts a local CSV file to a multidimensional array that can be easily accessed and manipulated within memory:

This initialization function is all it takes to generate a Google Map and add all of our markers:

Using these two functions, all it takes to generate the actual map is a single line of code:

You can see this code in action right here: http://sideapps.com/smart911/

If you’re interested in the CSV file it can be downloaded here: http://sideapps.com/smart911/zip-lat-long.csv

I must admit, I am a bit prejudiced toward web applications… However, I found Google’s API and the small amount of Javascript I had to learn very pleasant. I anticipated a much longer process and was very happy to be able to complete the task so logically and directly. Hopefully this helps someone out!

 

FlowReader: A Revolutionary Way of Speed-Reading

Boston-based tech company, Spritz, has recently introduced a new speed-reading method. This technology utilizes a previously existing presentation method, known as RSVP (Rapid Serial Visual Presentation). A single letter is highlighted to focus attention to a natural center of the word. The brain processes the rest of the word through your peripheral vision. By keeping the highlighted word in the same place, Spritz is able to eliminate minute eye movements that make up a large part of our natural reading process.

My friend Julia Hlavacik and I were discussing this new technology when we realized we might be onto something interesting. Not only does this kind of program have potential for everyday uses such as e-readers, mobile web pages, and all forms of articles; it also circumvents a lot of the problems faced by dyslexic readers.

Dyslexic readers generally have trouble scanning lines of text, finding the next line of text, staying focused on a word in a line, reading on certain colors of paper/background along with some impairment of spatial awareness. This isn’t an exhaustive list, but all of these issues are either alleviated or circumvented through RSVP. Although normal readers may not experience these problems to the same acute degree as most dyslexic readers, this speed-reading program can still significantly boost the average person’s reading. This is particularly useful on small, digital screens where text can be difficult to adjust.

The video below demonstrates a brief proof-of-concept. The text you see is being presented at 250 WPM; the reading speed of an average adult. To many of you, this text will likely appear somewhat sluggish – most readers can easily adapt to 500 WPM or more. I chose to use an open source API called OpenSpritz as the Spritz API has limited customization options and forces users to create an account and sign in. Two examples of customization that would be impossible with Spritz’s API are the color theme and the ability to adjust the WPM on the fly to account for longer words or punctuation.

How to Attach an Image to an Email Using PHP

I recently wrote a small data acquisition system using PHP. I’m not a fan of web-based development and know very little but I had some financial incentive for this project and took it upon myself to learn along the way. By far the biggest headache I ran into was dealing with PHP’s mail() function. There’s obviously a reason so many third party libraries exist that tackle this issue but, being stubborn, I wanted to do it from scratch.

My goal was to generate and send an email consisting of an HTML body with an image attached. Embedding the image within the HTML turned out to be fairly trivial (in comparison) but an attachment was preferred. After MUCH ado I came up with the following function which does just that.

NOTE: This function doesn’t go to any extremes to validate itself and doesn’t make it past very many junk filters. This was fine for my use case as the email will be going to a single administrator who can easily whitelist the domain. However, if this is a concern I would highly recommend using one of the third party libraries as considerable configuration is required both in the PHP and on the delivering server itself.

Remotely Control iPhone via SSH and VNC

This is an issue I spent far too much time time on. I stumbled upon a great new game, Threes, and had become consumed with the internal workings – how the game chooses what card to produce, where to place it, etc. In order to get some real data to work with I needed to complete a multitude of games, all while keeping track of which cards were produced and where. This is the type of menial task I have no patience for and I quickly began to seek a method to do this automatically.

I had a jailbroken phone – something you will need to do have if you are interested in any of the methods I am about to describe. This method is 99.9% effective and, if something goes wrong, you can completely fix it by restoring through iTunes. Unlocking your phone is dangerous – it has the possibility of leading to a “bricked” iPhone. Jailbreaking is not unlocking. If you’re interested in jailbreaking check out evasi0n – the latest version of their tool is working on iOS 7.0.6.

With that out of the way, here’s what you’ll need and why:

  • OpenSSH: SSH is ubiquitous method of remotely accessing another system through the command line. This is how we’ll interact with the iPhone and send it the commands we want.
  • SimulateTouch: This package allows you to (you guessed it) send touch events to your iPhone using command line tools.
  • Optional - Veency: This is a VNC server that runs on the iPhone. VNC is another tool that allows you to remotely access devices. However, unlike SSH, it allows you to see the screen of the remote device and send things like touch and keyboard events. But I thought we were using SimulateTouch to send touch events? Yes, that’s right. Though Veency can be used this way as well I’ve found it to be far less reliable than the SimulateTouch library. Sometimes the commands I send are just lost in the ether.
  • Optional - Activator: This allows you to set up a handful (read: a ton) of custom gestures and actions that can do anything from launch applications to disable WiFi to restart your iPhone. It also, conveniently, has a command line interface which can be used to activate any of its abilities via SSH – no gestures needed.

That’s it for the software! Everything I just listed can be downloaded, for free, through Cydia. Cydia is installed automatically when you jailbreak and is the de facto way of installing 3rd party software.

So, now that we have all these tools – how do we use them?! I’m a big python buff so all of my examples are going to be in python. You can use any language you like, but you’ll have to interpret the mysterious code I provide you.

Before I start with examples, here’s the biggest pitfall of our setup:

We don’t have a way to view the current screen in applications that run at 30 FPS or more. Veency simply can’t keep up and provides a distorted display. I’ll explain how I’ve been getting around this in my examples below.

Connecting via SSH:

I’m using Spur as my SSH interface. You can use whatever you want. We use the username ‘root’ because we want full access to the iPhone filesystem. The default SSH_PASSWORD is ‘alpine’ (and has been forever) – I recommend you change this as it is somewhat of a security issue.

Connecting via VNC:

Here I’m using the vncDoTool. Again, use what you want. You can set up the VNC_PASSWORD in the Veency settings.

Sending Touch Events:

The SimulateTouch library makes this dead simple. My example above shows how to make a swipe in any direction. You provide the X,Y coordinates of the start position and the end position. The last two commands are the duration of the swipe and the orientation of the device (1 = portrait).

Taking a ScreenShot:

My first example instructs Activator to take a screenshot. My second example uses VNC to hold down the power button, press the home button, and release the power button – all in quick succession. As you probably know, this is the built in way to take screenshots in iOS. These screenshots will be stored in your camera roll.

Accessing the ScreenShot:

This is a little more complicated. What we’re doing is listing the files in our screenshot directory by their creation time (yours may not be 108APPLE but it will be in the same DCIM directory). We grab the first of these files and assume (correctly) that it’s the screenshot we just took. We then open this file with SSH – this effectively stores the image in memory. Then we use python to open a file for writing – this is where we’ll store the screenshot. We use shutil to copy the screenshot from memory to the file location we opened. Finally, we close out both of our file streams.

In the second to last command I delete the screenshot file. Unfortunately, Apple has made their screenshot system ridiculously complicated. If you navigate to your Camera Roll you’ll find your image is still there. Click on it and a blank screen will be loaded. We’ve deleted the image file it’s trying to load but haven’t gotten rid of the image reference or the associated thumbnail that was created. I haven’t found a way around this.

The final command stores our image into the program memory so I can use it elsewhere without having to read the file from disk each time.

Well, this concludes this fairly verbose tutorial. If you have any questions I’ll do my best to answer them in the comments. I’ll leave you with close to 1000 lines of Python code for you to peruse. This is the code I came up with for automating the gameplay of the addictive and beautiful new game Threes.

 

Programmatically Add Default UITextField

I haven’t posted anything in a while, but I’ve been programming much more often and figured I’d share some answers to questions that had me stuck for a while. Now, if you’ve ever tried to add a UITextField purely through code you’ve probably noticed that what you get is a blank area that you can double-tap and add text to. When you add it using Interface Builder you get this pretty rectangle with rounded edges – what gives?

Well, I have no idea what gives. But what I do know is how to use a whole bunch of extra code to fix it. Here’s some nicely commented code that shows what I’m talking about:

That method will return a nicely formatted UITextField. It may not look precisely like the one you get from IB, but I challenge you to get it closer. If you don’t want any placeholder text just send nil or edit the method to take no instance variables.