Ad Revenue for A Small Free WebOS App

March 10th, 2010

When I first considered submitting an app (Where’s My Car?) for the Palm Pre / Palm Pixi, I was somewhat turned off by the $50 app submission fee  (even for free apps).  This is a hobby for me, and I don’t really like the idea of paying money to give my work away for free.

So I looked into putting an ad on my app to potentially recoup the submission fee, but I was unable to find any meaningful data regarding how long it would take, which left me on the fence as to whether or not it was worth the hassle.  Of course, this lack of public data is not that unexpected, as most companies doing this for profit would consider this a trade secret, but it was still disappointing.  So I justified to myself paying it as the cost of an experiment with a civil benefit:  Hopefully by publishing these numbers I can help either encourage or discourage future hobby developers as to whether or not it’s worth it to them to submit their own hobby apps.

Anyway, here are the numbers from ~24 hours after release: (AdMob is the advertiser)

  • Downloads: 7687
  • Ad Requests: 11,491
  • Ad Impressions: 11,456
  • Fill Rate: 99.70%
  • Click Through Rate (CTR): 3.26%
  • Estimated Revenue Per Thousand Impressions (eCPM): $1.11
  • Total Revenue: $12.68

This completely shocked me, as it’s almost an order of magnitude higher than my most optimistic expectations.   (I was hoping for, and figured I would have considered it worth the submission fee, if I received on average ~$0.50/day in revenue)

I will post updates to this entry as I pass other timeline milestones.  (one week and one month, at least)  I’m very curious as to if this will be a sustained daily trend, will grow, or if this is a one-day newness peak that will drop off a cliff tomorrow.  :)

BTW, I strongly encourage other hobby developers to publish their numbers as well.  (or even share with me privately or anonymously)  I would love to compare against a larger data set.

Daily total download counts: (recorded here because I don’t yet know how detailed Palm’s monthly reports are) 3/10/2010:7687, 3/11/2010:10242

Where’s My Car? for Palm Pre/Pixi

March 4th, 2010

I’ve submitted my first WebOS application to their App Store!

Where’s My Car? helps you find your car in a crowded parking lot. When you leave your car, simply open the application. (It will automatically get your current GPS location) Leave the application open, and when you’re done doing whatever it is you have to do, click “Take Me To It!” An arrow will show up (as well as a distance measurement). Simply walk in the direction of the arrow, and you’ll be quickly guided back to your car! BTW, I originally wrote this app as a present for my wife. :) I’ve decided to place it on the App Store as a FREE app because I don’t see why the other apps that do the same thing charge $5 for such a simple feature. Let me know if you like it! :)

UPDATE: It has been approved/published!  To download, open the App Catalog.  Search for “car”.  Click the coins icon in the lower-right to show only FREE apps, and “Where’s My Car?” should be the first in the list!  :)

UPDATE 2: Click here to download:  Where’s My Car?

Screenshots after the break…

Read the rest of this entry »

Dependency Injection: Coke with Lime

January 29th, 2010

I have in the past expressed skepticism regarding the utility of Spring’s XML-based dependency injection configuration files. A bit ago, in one of these conversations, I was pointed to Martin Fowler’s article on dependency injection. I found it hilarious.

Read the rest of this entry »

Brain-Dead

December 21st, 2009

Java is somewhat brain-dead at times. For instance:

while(c=System.in.read()>-1){
  System.out.print(backspaceChar);
}

Doesn’t do what you’d expect. (hide console input) It appears that System.in is being silently buffered.

So a little googling: http://java.sun.com/developer/technicalArticles/Security/pwordmask/

Sun’s recommendation is a busy-wait loop in a separate thread that constantly rewrites the previous character?!? I mean, seriously, WTF?!?

Edit: It looks like Sun implemented a new API for non-echoing prompts in v1.6: http://java.sun.com/javase/6/docs/api/java/io/Console.html

But this is still crappy. Introducing a new API to partially work around the broken functionality of an old API is how you get bloated monstrosities to begin with.

Food, Inc.

December 4th, 2009

I watched Food, Inc. last night. Was not impressed. Yes, we mass-produce food. Yes, it’s gross in parts. But so was the small-scale chicken slaughtering the film touted. Why is a smaller, open-air assembly line better than a larger, more environmentally controlled one?

Plus they played with the stats too much. “There used to be X thousand meat processing plants, but now 13 produce 80% of the meat in this country.” This doesn’t tell me anything. That last 20%, is that 2,000 smaller plants? Or 3 other really huge ones? What percentage did the top 13 used to produce? Apples-to-oranges statistical comparisons make me distrust the source.

Not to say it was all bad. The patenting of GMOs and the strong-arm tactics of their producers are definitively abusive, which I have ranted about before.

But overall, it seemed more anti-corporate, anti-science and hippy-ish than anything resembling a reasonable collection of recommendations on how to better our food production system.

XiMpLode

July 29th, 2009

It has been said before, but it deserves repeating: XML is overused. And often, made unnecessarily over-complicated for the task. Take for instance the example “A Simple Soap Client“.

Here is the request:

<?xml version="1.0"?>
<SOAP-ENV:Envelope
 xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" >
  <SOAP-ENV:Body>
    <calculateFibonacci
      xmlns="http://namespaces.cafeconleche.org/xmljava/ch3/"
      type="xsi:positiveInteger">10</calculateFibonacci>
  </SOAP-ENV:Body>
</SOAP-ENV:Envelope>

Here is the response:

<?xml version="1.0"?>
<SOAP-ENV:Envelope
 xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" />
  <SOAP-ENV:Body>
    <Fibonacci_Numbers
      xmlns="http://namespaces.cafeconleche.org/xmljava/ch3/">
      <fibonacci index="1">1</fibonacci>
      <fibonacci index="2">1</fibonacci>
      <fibonacci index="3">2</fibonacci>
      <fibonacci index="4">3</fibonacci>
      <fibonacci index="5">5</fibonacci>
      <fibonacci index="6">8</fibonacci>
      <fibonacci index="7">13</fibonacci>
      <fibonacci index="8">21</fibonacci>
      <fibonacci index="9">34</fibonacci>
      <fibonacci index="10">55</fibonacci>
    </Fibonacci_Numbers>
  </SOAP-ENV:Body>
</SOAP-ENV:Envelope>

Dear $DEITY, why do we need to define a new data type to hold a list of integers? And what in the world is that “index” attribute doing there? IT’S A FUCKING LIST. This is like a real-life example of the old XML binary encoding joke:

<data>
  <binary>
    <bit index="0">0</bit>
    <bit index="1">0</bit>
    <bit index="2">1</bit>
    ...
    <bit index="n">1</bit>
  </binary>
</data>

It’s just sad…

For the sake of it, let’s compare to a JSON-RPC version: (not the epitome of efficiency mind you, but an order of magnitude better)

--> { "method": "calculateFibonacci", "params": [10,], "id": 1}
<-- { "result": [1,1,2,3,5,8,13,21,34,55], "error": null, "id": 1}

Which would you rather use? :)

Touchstone

July 21st, 2009

I was originally quite sceptical about the value of the Palm Pre’s Touchstone wireless charger accessory, esp. at its ridiculously high advertised price. However, now that I’ve had it for a week, I’m a total convert. It’s so nice to be able to just plunk the thing down at night and pick it up again in the morning without having to fumble with cords or those crappy plastic covers every cell phone manufacturer seems to love these days. Thanks Palm for coming back from the dead and giving Apple a good run for their money. :)

Tent Stakes in Sand

July 2nd, 2009

My bivy tent is so low profile, I’ve never had a problem with wind when beach camping as long as I’ve had some oversized steel stakes ($2 for 4 at Walmart). But my dome tent is more problematic, as Lingyan and I learned in South Padre over memorial day.

So a little googling led me to “deadman anchors”, which are basically anything buried in the ground. A basic design is some angle iron and steel cable. So a trip to Lowes and a few minutes assembly, and I have the following:

deadman anchors

1 4ft piece of aluminium angle iron, cut into 4 6″ sections. 4 3ft sections of 1/16″ steel braded cable. 4 eye loops, and 4 pairs of cable crimps. <$15 total.

We’re beaching camping again this weekend at Mustang Island. Will update with how well they worked.

Ubuntu 9.04 finally supports the UTDALLAS network!

April 17th, 2009

Well, Ubuntu has supported it for a while via the wpa_supplicant tool, but finally the GUI network manager works without a hitch. Here’s what you need to select from the GUI:

Security: Dynamic WEP (802.1x)
Authentication: Protected EAP (PEAP)
PEAP Version: Automatic
Inner Authentication: MSCHAPv2

Plus your UTD username/password.

To upgrade, hit Alt-F2 and type in “update-manager -d”.

Easy Python/Numpy CUDA/CUBLAS Integration

April 13th, 2009

CUDA is Nvidia’s C-like API for non-graphic number crunching on their 8xxx level and above video cards. For certain operations, it is amazingly fast. Unfortunately, it is painful in the extreme to use, especially when compared to Numpy, Python’s wonderful scientific computing package.

So, to marry the two, I wrote for myself some wrapper code. It’s pretty much only good for one thing: multiplying large matrices together really fast. But it’s really good at it. (and it’s really easy to use) For example:

import numpy
from pycublas import CUBLASMatrix
A = CUBLASMatrix( numpy.mat([[1,2,3],[4,5,6]],numpy.float32) )
B = CUBLASMatrix( numpy.mat([[2,3],[4,5],[6,7]],numpy.float32) )
C = A*B
print C.np_mat()

All CUBLAS alloc and free calls are mapped to the CUBLASMatrix object’s life in Python, so you don’t have to worry about memory management. (other than filling up the card, or course)

Here are some performance numbers: (includes memory transfer times)
(4160×4160)*(4160×4160) = 43.0X faster than numpy
(4096×4096)*(4096×4096) = 34.0X
(3900×3900)*(3900×3900) = 47.3X
(2048×2048)*(2048×2048) = 28.2X
(1024×1024)*(1024×1024) = 58.8X
(512×512)*(512×512) = 24.1X
(256×256)*(256×256) = 6.3X
(128×128)*(128×128) = 1.1X
CPU: Intel(R) Core(TM)2 Duo CPU E8400 @ 3.00GHz stepping 06
GPU: nVidia Corporation GeForce 8800 GT (rev a2)

Note: This version only supports float32.
Note: CUBLAS limits matrix dims to (65536×65536).

Source code available here: pycublas.py (rename download to pycublas.py to use)


<Kered.org>   © Copyright 2000-2005 by Derek Anderson
Get Firefox