TimesX – Released on the App Store

This past weekend was dedicated to getting my first app store submission in order. I was overjoyed that it was accepted on the first review!

Music: Pacific Sun by Nicolai Heidlas

Originally made as a learning tool  for my son who was always on his iPad, I wanted him to get more multiplication practice for grade 2. I downloaded several apps which were entertaining and gave him practice, but I wanted more. I wanted to see if he was making progress, which questions he was getting wrong the most often, and how long it took him to do a test today vs last week. So, being a programmer, I made my own app for his iPad.


  • Tests are saved on your device with letter grade, percent score, test time and more
  • With more use, ‘Error Counts’ shows you where your child needs help
  • Choose which times tables will be on the test
  • Limit for selected tables x10 for younger students or x12 for older
  • Live timer display optional


At first, I made the app in Xamarin Forms. This was going to be the quick and easy way to put it together for him to start using it. Also later,  if I decided to port it, it would be 95% ready for Android as well as iOS. When I started transitioning the app from “my son’s learning tool” to “TimesX”, I ran into issues displaying it on ALL iOS devices from the same layout. That’s when I decided to leave “forms” and move on to Xamarin iOS. The constraints system implemented by Apple for XCode was made for this, and Xamarin carried that through in it’s iOS implementation. A bit of a learning curve but it’s second nature now – constraints were a great solution that allows this app to display on every iOS device from an iPhone 4s to an iPad Pro 12″, in both Portrait and Landscape.

If the app makes any money I might make the Android version. The Data model and the assets are all there ready to re-use. Xamarin is great for this and a real joy to develop in.

Facebook Promo Page: https://www.facebook.com/timesxmultiplicationtester


Digital Privacy, Security, and How I’m Safer on the Internet Now.

Earlier this year I watched the documentary “Citizen Four” about Edward Snowden’s revelations on government spying. Unlike any other documentary I’ve seen, this one had me on the edge of my seat, feeling tense, shocked, and violated all at the same time. Though I have no illegal activities to hide, I can not be comfortable with the level of access the spying agencies have to our computers, cellphones, and other connected devices. Also, the increase of private spying (hacking) is so rampant, it seemed that protection from agency spying might also be increased protection from hacking.

I decided to step up my game and see if I could maintain privacy in this Orwellian environment. A month of research later, I came up with a solution – VPN. A VPN, or Virtual Private Network – encrypts all your traffic between your device and the VPN server. Here is an example scenario of a regular connection vs a VPN connection:

Scenario: Regular Connection VS VPN

-You and I are at a mom and pop ice cream store
-We are both on our iPhones using the FREE WiFi
-mom and pop have a son with ambitions to be the next “Mr Robot” super hacker
-son set up the FREE WiFi network we are using
-son has taught himself enough Linux and Network Administrator skills to Port Scan, Traffic Sniff, and see everything you are doing on his network (urls, IMs, emails, and more)
-son can NOT see what I’m doing. All he can see is encrypted chunks of data going back and forth to one location, which he can not decrypt

This is VPN. All my data – including URLS, requests, responses, etc – flow through a server in an encrypted connection. When I visit a web page, the url is part of the encrypted data between me and the VPN server, which handles the request to that web page. “Son”, or anyone between me and the VPN (like my internet provider) can not see what pages I visit or what is in my data.

Not All VPN’s are Safe

So what if the VPN provider decides to spy on me? Or logs all my traffic and uploads it to the N.S.A. ? This was something I dug deeper into in my research. My wish list for a VPN service provider evolved into this:

– no logging of my data
– good encryption
– good performance ( bandwidth )
– useable on my computers, phones, tablets (and all at the same time)
– decent price
– good reputation for privacy and reliability

I had VPN connections before with my work, but real privacy is something you have to pay for. On a company VPN, the company can still see your unencrypted traffic, because they operate the VPN server.


My final choice was Private Internet Access ( which I’ll refer to as PIA ). I have it set up on my Mac, PC, iPhone, Android, and Linux box. You can see PIA’s supported clients here. When not using VPN, I can download up to 12 Megabytes per second on my 100 Megabit connection. On the VPN I’ve reached up to 4 Megabytes per second, but typically cap around 2. These are good speeds considering that the VPN provider has to service many other individuals simultaneously. This is also more than fast enough for YouTube and other video streaming.

I have a choice of servers all over the country and all over the world. This gives me better connections where ever I am, but also allows me to “be” in other places when I need to be. For example, when in Canada, certain web sites re-direct you to the Canadian .ca versions of the page. Your IP location is used for redirection behind the scenes. On PIA, I simply connect to a US VPN server and the problem is solved. This could also hold true for people in countries with censorship and other restrictions, as the agencies blocking certain URLs and IP addresses would never see them in the encrypted VPN traffic.



Hacker Proof?
Other than being digitally safe in the ice cream shop, and being able to spoof my location, VPN has other advantages. My true IP address is never revealed when I surf the internet on VPN. If a hacker was trying to get to my computer via internet, my IP address would appear as one of PIA’s VPN servers. Getting back to my computer via internet should technically be impossible. Although there may be other ways hackers can get to your computer, blocking the passage through the internet is a big step toward safety.

iOS Map App Tutorial in C# using Xamarin


Xamarin is a powerful development environment for creating apps for multiple platforms, using the same C# code base. The new Xamarin Forms technology will even allow you to use most of your UI code between different mobile platforms. Just have to say I LOVE this technology because I can make Android & iOS apps from the same code, rather than using 2 or 3 other languages.

Onto our app.. This example is meant to be simple and quick, and give you a taste of Xamarin development. We are going to make an app that shows a map, and then zooms into your current location when you click a button.


You can deploy this app to the iOS Simulator or a real iOS device if you have that set up on your Mac already. Oh yeah, you’ll need a Mac, otherwise you’d have to do this somewhat differently on a PC using Visual Studio with Xamarin plugins. The app may be too big to deploy using the Xamarin Starter edition on its own. If you try to publish for iOS and get messages about the app size, take the option to start a free trial.

Create an iPhone App
  1. First thing we want to do is create an iPhone app project in Xamarin. Choose File > New Solution
  2. Give this solution the Name Locator. Xamarin will generate a project that should look like this:
  3. Visually Build the Screen
  4. Next, we visually build our app screen with some standard iOS components. To do that, go to the Solution pane on the left and double click the file MainStoryboard.storyboard. You should get a blank storyboard like this:
  5. Note the Toolbox and Properties panes. We are going to drag components from the Toolbox onto the storyboard, size and position them, and then customize them in the Properties. Drag these components from the Toolbox onto the storyboard so it looks like the image below:

    a) Label

    b) Button

    c) Map Kit View

  6. Customize Components and Add Hooks for the Code
  7. To resize components, just grab an edge and drag. Let’s start with the Label first. Click on it and then go to the Properties pane in the Widgets. Change the Text property from “Label” to “Locator”
  8. Next, lets give the Map Kit View a hook so we can access it in code. Click on it and set the Name property to “myMap”.
  9. Finally, click on the Button and change the Title text to “Find Me”
  10. Set the Name property to “findMeButton”
  11. To detect the user pressing the button, we could set up the Events tab and write functions or we could let Xamarin generate this code for us. Double-Click the Button on the storyboard and Xamarin should switch you to the LocatorViewController.cs tab, where you’ll see this yellow code hint:
  12. Press Enter and Xamarin should generate this code:
  13. partial void findMeButton_TouchUpInside (UIButton sender)
        throw new NotImplementedException ();
    Start Coding
  14. Lets save our work at this time using File>Save All
  15. Now, lets replace the code in the findMeButton_TouchUpInside function. Add the line:
  16. partial void findMeButton_TouchUpInside (UIButton sender)
        MKCoordinateRegion region;
  17. Notice the variable type is red, which means that the class you are editing doesn’t know what a MKCoordinateRegion is. To fix, right click on it, and choose Resolve>Using MonoTouch.MapKit. If you scroll to the top of the class, you’ll see the MapKit class was imported. Now lets enter the rest of the code. The function should look like this:
  18. partial void findMeButton_TouchUpInside (UIButton sender)
        MKCoordinateRegion region;
        MKCoordinateSpan span;
        myMap.SetRegion( region, true );
  19. You’ll notice as you type that Xamarin is suggesting code for you. This is similar to the IntelliSense feature in Visual Studio on the PC, and also several other programming IDEs. Next we need to add one more line of code to a different function. Scroll up to the ViewDidLoad function, and add the myMap line:
  20. public override void ViewDidLoad ()
        base.ViewDidLoad ();
        // Perform any additional setup after loading the view
  21. Save your work and lets try this app out. Assuming you have the iOS simulator installed on your system, or have published to your iPhone before, press the Debug Button

download source

Test and Debug

Since the iOS simulator does not have a real location service like your iPhone, it will simulate one. You can change the current simulated location in the iOS Simulator using Debug > Location > Custom Location and setting the longitude and latitude. You can also simulate a moving location as demonstrated in this video:

Update for iOS 8

Just finished this post a week before iOS 8 officially rolled out and the update caused the application to break. I started getting this error message:
Trying to start MapKit location updates without prompting for location authorization. Must call -[CLLocationManager requestWhenInUseAuthorization] or -[CLLocationManager requestAlwaysAuthorization] first.

A few extra steps are required to make this work in iOS 8 now:

    Edit the Property List File (plist)
  1. In the Solution pane on the left, look for the file Info.plist.
  2. Double click it to open the tab for it
  3. At the bottom of the window, click on the Source tab
  4. Click on the green plus symbol to add a new entry
  5. Change the text Custom Property to NSLocationWhenInUseUsageDescription
  6. Click on the Value field for this entry and enter a message to prompt the user for location access such as Please allow this app to access your location.
  7. Add some C#
  8. Add this locationManager variable under the class definition. If the CCLocationManager is red, right click and choose Resolve>Using MonoTouch.CoreLocation
  9. public partial class LocatorViewController : UIViewController
    	CLLocationManager locationManager;
  10. Update the ViewDidLoad function to look like this:
  11. public override void ViewDidLoad ()
    	base.ViewDidLoad ();
    	// Perform any additional setup after loading the view, typically from a nib.
    	locationManager = new CLLocationManager();

    Again, this last section is only for iOS 8, so you would not need to do this for iOS 7.

Video List Using Angular JS

Something I’ve been meaning to do is add a video gallery or list of videos contained in this blog. Rather than install a WordPress plugin, I decided to build one on my own using the popular JavaScript library, Angular JS, along with HTML, CSS, JavaScript, and a Lightbox library for showing videos. What I like about Angular for my Video List is that it has some functionality I would normally use PHP for, like dynamically drawing rows for each record of data. In this code screen shot below, the top half is the header row that contains the list filter and sortable title, while the bottom half is where all the other rows repeat for the data in the model.

<!-- this row has the filter input text and sortable title -->

    <td>filter: <input type="text"  ng-model="searchText" /> </td>
    <td>blog link  <a href="" ng-click="predicate = 'title'; 
        <a href="" ng-click="predicate = '-title'; reverse=false">(z-a)</a></td>
    <td>dimensions width x height</td>
    <td>video link</td>
<!-- this is where the rows repeat according to the data -->

<tr  ng-repeat="vid in video_list | filter:searchText | orderBy:predicate:reverse">

    <td><img src="{{video_thumb_prefix+vid.url_thumb}}"/> </td>
    <td><a href="{{vid.blog}}"
    <td>{{vid.vid_width + ' x ' +vid.vid_height}}</td>
        <a href="{{video_media_prefix+vid.url_media}}"

Notice the ng-repeat – thats the magic right there for looping through data. The other great feature is that the data is live. As you enter text in the filter, the rows render to match what you typed. Using Angular instead of a server side language enabled me to host it on my CDN as a static set of files (vs dynamic). It’s all .html, .css, .js, and .mp4 videos – no PHP. Download the source to see how it all ties together with the data:

    $scope.predicate = '-title';

            title:'Radio Disney Next Best Thing',
            title:'The Jonas Brothers',
            title:'Pepsi Super Bowl',
            title:'Panda Jam Ads',



MookieData C#


In 2012 when I was trying to make my game, SlotFriendzy profitable, I felt the need for an Admin tool to analyze the game’s usage and performance. I didn’t want it to be hosted on the web and decided to build it as a Windows Desktop App. I chose Visual Studio and built it on the .NET 4.5 Framework, along with a MySQL C# Connector I downloaded from the MySQL web site.

For security reasons, I normally would not put a database connector directly in a client-side application, but in this case, the intended audience was very a specific population – me. Designing a Form based app in Visual Studio was easy, and this simple layout made it easy to add commands every time I thought of something I wanted to query on a regular basis.

I named it MookieData because the game belonged to my company, Mookie Games Inc.

High Performance WordPress on the Cheap

Shared Hosting

Typical shared web hosting plans can be a cheap and easy way to host a WordPress blog, but I’ve found performance on all the ones I tried to be abysmal. WordPress.com may also be an alternative, but this cloud approach I’m going to detail should give you better performance and still be cost-effective. Another approach not discussed here is dedicated hosting, which can also perform, but is usually expensive.


When I created this blog, I knew I would be hosting a lot of videos and images and wanted good performance. My previous experiences with Amazon Web Services showed me that clouds and CDNs (Content Delivery Network) make a very noticeable difference. When I say “high performance”, this should perform well for a few concurrent users. Compared to shared hosting, it should be easy to see the difference in load times. If you have a lot of traffic on your WordPress site, you may need to pay for more powerful virtual servers ( RAM, CPU ) and more of them in order to keep up (you’ll see options for this later). In any case this approach is better than shared hosting, as well as a shared / CDN combo.

What’s Best for WordPress

Normally with AWS, I would create Elastic Beanstalk PHP applications and update them with Git every time I made changes, like in my game. In this case, I wanted a server where I could log in from the blog site, make updates, preview, and publish. That gets a bit more complicated with Beanstalk since you can’t make changes to the server’s “ephemeral” disk the way you would on a shared hosting plan. Thats because virtual servers (EC2s) lose their changes every time they are terminated, and in Elastic Beanstalk they are created and terminated on the fly to accommodate traffic. See this article if you want to get more technical.

I did find a good solution which is basically free for 1 year, and about $15/mo after that. It’s a combination of these parts:

  1. An Amazon Web Services account (free tier for 1 year)
  2. Bitnami Cloud Hosting, with their WordPress app installed
  3. Access to the zone records for your domain (optional, if you want to assign domain names to your blog and your CDN)

Amazon Web Services

If you haven’t signed up for AWS you can take advantage of their free tier. If your site isn’t wildly popular and doesn’t have a ton of traffic, it should cost between nothing and under $1 per month in the free tier. After signing up, look for AWS Management Console or Services  and Security Credentials.  You’ll need these for Bitnami and the CDN we are going to create. In the image above, we are going to use S3 and CloudFront for the next section.

Make Your CDN

Your CDN is where you will put all your images, video, sounds, etc that slow down loading. In your blog posts you should insert media with full http urls to their CDN locations, rather than on the server that contains WordPress. This will make a huge difference in wait times for loading content and media.

There are other ways to do this but I will detail the steps I used.

  1. Create an S3 Bucket
    1. In the Service menu, go to S3
    2. Click on Create Bucket and give it a name, then click Create
    3. Upload a file or some files into the bucket. Select your uploaded files and choose Actions > Make Public. This is necessary to make the files accessible
  2. Create a CloudFront distribution from your bucket
    1. In the Service menu, go to CloudFront
    2. click Create Distribution and choose Web and then continue
    3. click in the Origin Domain Name and you should see a pulldown. Choose the S3 bucket we just created
    4. If you want to add a custom domain name, like “cdn.arnoldbiffna.com”, you can do it in  the Alternate Domain Names (CNAMEs) field. You’ll need access to your domain’s zone records to point to the domain about to be created from this form
    5. scroll down to Default Root Object and type in “index.html” or “index.htm” if you have folders of static html content you’d like to put on the CDN
    6. click on Create Distribution
    7. In the list of CloudFront distributions, you should see a domain name like d123xyz213987iu.cloudfront.net. The first of three parts “d123xyz213987iu” will be something unique to your CDN. If you uploaded a file say, “logo.jpg”, you’d now be able to access it as d123xyz213987iu.cloudfront.net/logo.jpg.
    8. If you want to use a custom domain name like “cdn.arnoldbiffna.com”, map a cName to the one we just created in your domain’s zone records. Then you could access your files like cdn.arnoldbiffna.com/logo.jpg. You might have access to this in the settings for your web hosing or domain management.

What you’ve now done is created a CDN. What ever you put in your S3 bucket will get copied to several “Edge” locations around the world for faster access to all your users. Keep in mind with CDNs, you should not update your files, simply upload new versions with different names.

 Create a Cloud Hosted Server with WordPress on Bitnami

Next, you’ll want to create a free account at Bitnami. What we are going to do is use your Security Credentials from AWS to launch a pre-built server with WordPress added on.

  1. To begin, click on Console
  2. click Create a Server
  3. Next, enter in your AWS Security credentials: your Access Key ID and Secret Access Key. You can find these in your AWS account in the main menu under Security Credentials
  4. Choose a Default Location closest to the majority of your audience. The default choice (U.S. East Coast Virginia) is free but the others may cost more. The N California location is closest to Los Angeles, but I chose Oregon as it was much cheaper, and relatively close.
  5. Make a password and continue.
  6. In the New Server dialog, begin by giving it a Name. It should match the Domain Name that will be yourName.bitnamiapp.com
  7. The first option I changed is the default Operating System, Ubuntu. I switched to a 64 bit Amazon Linux, because I think Ubuntu has a lot of extra services and features I won’t be using. My theory is that the  Amazon Linux should perform slightly better.
  8. Next, I clicked on Add New Application and searched for wordpress. Click the checkbox and OK.
  9. Now, click on Application Options and fill out the information in both tabs. The Email Configuration is important since WordPress will use this for notifying you of comments, as well as using contact forms and other communications. I used the SMTP info for Yahoo for my email.
  10. Optional – the options under Micro will allow you to add more power ( and costs ) to your server. This would be useful if you will be redirecting heavy web traffic here
  11. Click on Build and Launch
Server Management

In a few minutes you should be able to access your blog. Bitnami’s Dashboard has several options for managing your server afterwards, such as adding a custom domain, adding other apps than WordPress, and making backups.

I recommend backups. They may incur a small cost ( under $1), but if you are putting hard work into your blog, it would be nice to restore not only the content, but all your server and app settings, plugins, etc as well. If you want to map a custom domain like I did in the image above, you will need to access your domain zone records. Notice I also made a subdomain for the CDN, which comes in handy if you want to switch CDN providers in the future.

Now the images and videos in my blog posts can come from cdn.arnoldbiffna.com/someimage.jpg instead of the default, cryptic domain names. Also, in the future, I can use a different CDN provider and not have to change my blog urls.

Form Creator


In late 2013, I started working at Deluxe Entertainment in Burbank and was debugging several versions of a LAMP stack application with Linux, Apache, MySQL, PHP as well as AMFPHP and Flex. The project was Media Recall, a digital media storage and cataloging system for several major clients including Harpo (Oprah Winfrey), Johnny Carson, Martha Stewart Online, and more. Later on I moved into tools development for the Operations team and created this application. Several of the tools being developed by the team had an XML format for the forms, and creating that XML was becoming a large task. My project was to simplify that by creating a visual tool to create and modify the XML. This tool was also a LAMP stack application, in which my focus was mainly the Flex and PHP.



In 2011, I joined the team at MindJolt Inc., now SGN. The founders of MySpace had created this game company who’s main product was the MindJolt App on Facebook. It’s a game portal with thousands of Flash based games, and runs in Facebook as well as a stand-alone site. At one point I believe it had over 13 Million users, and chances are if you play games on Facebook, you’ve seen it.

Flash API
To allow the Flash games to communicate with the MindJolt  App,  they all load another  Flash file,  which is a bridge to the back end and other non-Flash code. The MindJolt Flash API was my main project for quite some time. It dealt with Ads, tracking, user information, settings, and much more. As the MindJolt stack was constantly being improved, changes to the Flash API were always in need.

Games on Mindjolt
I also updated the source code for several of the Flash Games. As new features were introduced in the API , some of the games were modified to take advantage of them. The games you see in the video above are some of the ones I worked on.

Big Games
Later on, I worked on several other games outside of the Mindjolt app such as Panda Jam, Jewels of the Amazon, Bubble Atlantis, as well several enhancements via the Facebook and PlayerIO APIs.

Some other projects included C# work as well. One was to convert a Flash tracking API swf to a C# DLL for Unity projects. Another was to process user information and statistics data for PlayerIO (now the Yahoo Games Network). The PlayerIO SDK has both an ActionScript and C# API.

Jonas Brothers


In 2009, I worked on some fun sites for Disney over at Midnight Oil Creative. This Jonas Brother’s site was an all Flash page rendering system, with content externalized in XML. The task at hand was to retrofit a Hannah Montana site into the Jonas Brother’s site. The engine had a navigation bar at the top, and several panels of content in a page – used to make fluid, animated, lively sites. Using that system, I added several specialized panel widgets and an animation delay system in as3 and xml. This made it easy for graphics designers to add and update assets, as well as control the timing. As I added more capabilities and features, it was easier to build sites in XML by re-using the engine. This engine became the base code for other projects I worked on, were it evolved even further.