Crazy Fiverr customer service

So this is an interesting thing which happened to me today. I thought it is well worth describing here so other people may not feel too bad when this happens to them.

For those who don’t know Fiverr, it is a site which allows you to purchase small gigs from users, such as a custom image for your YouTube channel, Marketing gigs for your products, support etc. It is basically a VPA ( Virtual Personal Assistant ) platform to outsource certain tasks.

I have been on Fiverr for the past 3 years as a buyer where I bought some gigs for help with my YouTube channel, and with my blogs, and Android apps. Today I decided to also offer a service to test an Android app and write a blog post about it.

About 30 seconds after I submitted the gig to Fiverr I received the following mail :

So I thought that is interesting, I did certainly not think I violated any TOS and after reading through their section about “Suspicion of Fraud and Spam” I thought that this must have been a mistake or a keyword triggered this rejection. So I sent the following email

Standard response followed with

Okay so far, let’s wait until I hear back so I can fix it.
However Fiverr had other plans for me

So there are so many things wrong with this response that it borders on the comical side.
First off the “dedicated team” disabled my account for asking a question after they rejected the gig in the first place.

Second another link to the “Terms Of Service” page without any reason as to what I did violate in there in the first place. At this time of the day my ability to read a support team person’s mind thousands of miles away is a bit rusty. Which leaves me with another head scratcher.

However a few minutes later I received this email, which is a bit more helpful though honestly does not explain why the TOS does not make any mention of this forbidden-fruit “Reviews”

You can have a look at their 9600 word Terms and Services and let me know if you can find an explanation of what “Illegal and Fraudulent Service” ( line 80, and Line 325 ).

Fiverr’s Terms Of Service – Here

A day later and I receive this email

My fatal offering was to write an honest blog-post app review. In my head it is the same as asking a someone to take a look at your app and write about your experience ( I.e. write for a magazine or a web site like Crunchbase or for a friend or a payed-for AdWords campaign or … ) Apparently somewhere in this Internet world there is some company which has a rule in their TOS which does not allow for such an offering.

I also think that Fiverr’s handling of the situation is rather bad. I would have expected an explanation, a slap on the wrist and a second chance.

Oh well Bye bye Fiverr, now that I can’t be either seller or buyer. I got kicked off from this platform for trying to become a better user and supporter of this platform …

Blackhat / Whitehat / Greyhat … Let me know in the comments below if you think that offering to write a blog post about an app is a bad thing.

Posted in Uncategorized | Leave a comment

Google Play Store Stats

Any app developer has noticed by now ( August 2018 ) that Google is changing the stats displayed in the developer console and in the app store.

One of the largest changes has been the removal of the “Total Installs” metric from the console. A move which is causing a lot of trouble to me because I relied on it for my growth goals. Google’s reasoning behind this is that it wants quality apps and as such the number of active installs is what Google wants developers to focus on.

I used to look at both numbers together and determine what the rate of adoption was ( E.g. 22% of people installing my app would retain it ). Now however I have to gobble these numbers together through a few more mouse clicks, by choosing “Number Of Installs” for the period “Lifetime” of the app.

Google Play Console Total Downloads

Another unfortunate change that I have just noticed is the elimination of the displayed download tiers in the Play Store. I have a fairly new app n the app store which has just crossed the 5k download mark. The Play store used to honor this by displaying Installs 5000+. However, as of today, with a total install of 5,535 I do see this in the Play Store:
Google Play Store Total Installs

I also noticed that frequently the displayed metrics are distorted after Google changes ( Aka tweaks ) the formula behind the metric. For example the number of active devices would unexpectedly drop from one day to another by a few hundred while the difference between installed and uninstalled apps would be in the positive.

The number of active devices is “Number of Android devices that have been active in the previous 30 days that your app is installed on.” If that’s the case and Google’s number would be accurate it would mean a hell of a coincidence that a few hundred users of my app stopped using their phone at the same day.

Stats Madness at Google

I wonder how many more changes there will be in the future for app developer. After all if I can not rely on the metric displayed in the app store, what are the chances that the numbers in Google Ads are accurate ? I guess there is really no way to tell.

Below is the link to Reverse Video Magic. Can you see how many installs ?
Get it on Google Play

Posted in Uncategorized | Leave a comment

Androids external SD-Card mess

As mentioned in my previous post, I wrote a video app which allows you to reverse a video and I uploaded it onto the Google app store.

After some time on the app store, I received a bass rating because the app would not allow you to store the resulting videos on a secondary SD Card.

It took me about one hour to adjust the code to search for and display files on the secondary drive. However things then turned pretty dark.


Android has a very hard way to use and integrate external storage media. As a matter of fact, I spent 3 days trying to make things right for the Reverse Video Magic app.

Here I wonder why this is so hard, after all Android is using Linux as the core OS. It boggles my mind why the security scheme is not based off the virtualization framework, like containers or security groups.

Instead the Android Java framework requires some convoluted way of sharing files between apps and to access files on external SD cards.

I have seen these types of convolution complexity-for-no-reason on many places before and the root cause has always been a power struggle where the engineer with the loudest voice or the most influence would shape technology for no other reason than self aggrandizement for the detriment of everyone else.

But I digress.

As a result of these convoluted and ever changing API calls from Google the overall use experience suffers and the created apps differ vastly in available features.

I released a version of my app which will work as expected on the only two devices I have available to me, my trusted Nexus 6, and a Samsung S5.

What I have not been able to do is to find a way to have the resolution videos properly scanned using the MediaScanner framework. Here it seems to fail due to the external framework not being able to read the file on the external SD card.

I had similar issues with the integration of the File manager app which is also a external app. Though Android provides a way to pass files between apps there does not currently exist a way to have a external app scan a whole for at once.


so what is next ? I want to look into Google new cross platform development framework Flutter and see if this too is as kaput as the Java development framework.

I have come to find Google lacking in usability for some of the developer facing interfaces and certainly think that this is a big reason as to why iOS is still ruling the roost when it comes to app development, unless of course you switch over to a third party cross platform development toolset for Android.

ASO A/B testing

One final note for any app developers out there. I spent quite some time to look into ASO for this app and what to do to improve organic downloads. One suggestio which came up was to change the screenshots, which I did.

I setup A/B testing between the original version and the new ones. Lets wait and see if there is a measurable impact to downloads.

Get it on Google Play

Posted in Android, Uncategorized | Tagged , , , , | Leave a comment

Reverse Video Magic

After returning from vacation this year I wanted to edit and send some videos to my family which should highlight some of the more outstanding experiences in a funny but interesting way.

So I was looking to take a piece of a video, and revert parts of it and then replace this part with a sequence of forward, backward, forward action all abound.

Here is the resulting video to better explain the effect I was after.

I looked around but could not quite find an app on the google play market which would offer me this functionality so I set out to build my own app

The below images are screenshots of the main screens for Revert Video Magic for Android

Revert Video Magic Main Screen

Main Screen

Revert Video magic settings screen

Revert Video Settings screen

Revert Video Magic Share Screen

Share Screen

The Main Screen is where you select the source video from, that is you can either browse through the media library of your phone or you open a File Browser which allows you to browse the file system of your phone. You can even use your video camera and shoot the video from within the app.

Once you have selected the source video you would like to use, you arrive at the settings page. The Revert Video Magic Settings page allows you to modify the resulting video resolution, the speed of the reverted part, as well as cutting the start and end points of the target video.

Once these settings are set, you will see the Post Processing screen of the revert Video Magic app. This page allows you to actually replace the selected part in-place of where the original video part was. None of the other revert video apps on the google play store do allow for this to happen.

Using the -SHARE- button on the top right corner allows to finally send the video to your friends or share it on social media like YouTube, FaceBook etc.

This app is focused on doing one thing but doing it right. The built in video player, Camera functionality, File Browser, and Share functionality are all part of making reversing part of your video as much fun as the final video.

Feel free to download the app for free from the link below.

Get it on Google Play

Posted in Uncategorized | Leave a comment

Videos on Vacation

I have not updated this blog in a long time. The reasons for this are plentiful but do do not include laziness. To the contrary I have been super busy the past few months / years.

Among other things, I have started to develop Android apps and added to my repertoire of apps I wrote. Since I have been into ffmpeg, video, and 360 video rendering I utilized my know-how to build one great app to help you save space on your phone, and bandwidth when you want to send videos to your friends and/or relatives.

The below images are screenshots of the main screens for MP4 Video Converter for Android

MP4 Video Converter Main Screen

Main Screen

MP4 Video Converter settings screen

Convert Settings screen

MP4 Video Converter Share Screen

Share Screen

The Main Screen is where you select the source video from, that is you can either browse through the media library of your phone or you open a File Browser which allows you to browse the file system of your phone.

Once you have selected the source video you would like to convert or resize or both, you arrive at the settings page. The MP4 Video Converter Settings page allows you to modify the resulting video resolution, the video codec you want to convert it to, as well as cutting the start and end points of the target video.

Especially when you are on vacation and you want to send a short clip to your friends you may need to find the right position in the video you want to send over. The Settings page is perfectly tailored towards this functionality.

After you have the right settings all you have to do is to click on [CREATE] and wait for the video to be rendered. The Share Video Screen will open with the final result and you can use this screen to preview the resulting video.

Using the -SHARE- button on the top right corner allows to finally send the video to your friends or share it on social media like YouTube, FaceBook etc.

It took me some time to get this app developed, debugged, and functionality wis to the point where I have not seen it crash in a long time and if you have a need to save some local storage space on your android phone you can download the app for free from the link below.

Get it on Google Play

Posted in Android, Uncategorized | Tagged , , , | Leave a comment

DyGraphs Pie Chart Plotter

DyGraphs is a decent Javascript library to plot time series.

I chose this library long time ago mainly due to its small footprint of 123530 for dygraph.2.0.0.min.js

One of the things it allows you to do now is to add a different plotter algorithm to plot data. One such example can be found on the demo page is that of a BarChart plotter. If you look at the code it is a fairly small addition.

One of the possible plots missing though is a PieChart. It happened that I needed a PieChart for my project and I did not want to switch to E.g. ChartJS [ Release 2.5.0 ] so I wrote my own little PieChart function for DyGraph.

      function pieChartPlotter ( e ) {
        var ctx  = e.drawingContext;
        var self = e.dygraph.user_attrs_.myCtx;
        var itm, nme, data = self._pieData;
        if ( ! data )  {
          var t, i, y, all, total = 0;
          data = {};
          all = e.allSeriesPoints; // array of array
          for ( t=0; t<all.length ; t++ )  {
            y = 0;
            itm  = all[t];
            nme  = itm[0].name;
            for ( i=0; i<itm.length; i++ )
              y += itm[i].yval;
            total += y;
            data[nme] = { color : null, y : y };
 = total;
          self._pieData = data;
        if ( data[e.setName] )
             data[e.setName].color = e.color;
        var delta = ctx.canvas.width > ctx.canvas.height ? ctx.canvas.height : ctx.canvas.width;
        var center= parseInt ( delta / 2, 10 );
        var lastend = 0;
        ctx.clearRect ( 0, 0, ctx.canvas.width, ctx.canvas.height );
        for ( var name in data )  {
          itm = data[name];
          if ( self._highlighted === name )
            ctx.fillStyle = "#FF8844";
            ctx.fillStyle = itm.color === null ? "#888888" : itm.color;
          ctx.beginPath ( );
          ctx.moveTo ( ctx.canvas.width/2, ctx.canvas.height/2 );
          ctx.arc ( ctx.canvas.width/2, ctx.canvas.height/2, center/2, lastend, lastend + ( Math.PI * 2 * ( itm.y / ) ), false );
          ctx.lineTo ( ctx.canvas.width/2, ctx.canvas.height/2 );
          ctx.fill ( );
          lastend += Math.PI * 2 * ( itm.y / );

The one thing you will see in this code is that I calculate the required PieChart data once and then check for its existance each time I enter this function. This is requried beause DyGraph does currently not call the plotter function in a context but rather in the global browser context ( I.e. the this object is the browser Window ).

So instead I ‘added’ ( read hacked ) myCtx to the dygraph – plotter options to gain accss to my local JavaScript object where I buffer the _pieData.

While this may not be the nicest pie chart around, it is a small, basic function which can be expanded on fairly easily.

Posted in Uncategorized | 2 Comments

Amazing Tech, Stupid Copyright Application

About 8 months ago I created a video with my son walking through a shopping center somewhere in virginia. I just received my 220 degree fisheye camera, and played with it recording our walk along the isles.

This was uploaded before I had 360Tube to properly convert the video into a equi-rectangular video. So I looked at my video collection and I found a copyright notice on this video, which surprised me.

She Says - Howie Day
Sound recording
0:35 - 2:28

So the amazing thing is how accurate Googles’ technology can pick up background sound from our stroll through the mall with our voices in the foreground, some additional speaker announcements, and the overall poor quality of the pieces of music which I can barely hear in the background.

A marvel of technology.

Now think about this for a second thought. If we can auto-detect music in the background noise through this amazing technology, then why don’t we have flying cars by now ?

Also think about the ridiculousness of copyright enforcement in this case.

I am all about protecting one’s IP through copyrights  ( not patents ) however would you think that someone would actually watch this video only to enjoy the song playing in the background while we walk through a mall ?

I don’t think so. As a matter of fact, I believe the music industry should pay me product placement fees, and we could use the same technology to get them to pony up.

Posted in Uncategorized | Leave a comment

Android getContentResolver or the developer-crossword-puzzle

So I have a question to whoever though that the Android API getContentResolver is a good idea and easily usable by developers.

What the heck were you thinking dude ?

I have spent two full days trying to figure this one out and it still escapes mas as to how I can share files between applications.

I have clicked and read all of the first two pages of my google searches in various forms to no avail. and thus I conclude that this thing that should be as simple as

  String mimeType = MimeTypes.getMimeType ( file.getName ( ) );
  Uri uri = FileProvider.shareFile ( file );
  intent.setDataAndType ( uri, mimeType );
  startActivity ( intent );

and on the receiving side

  String path = context.getContentResolver ( ).getFilePath ( uri );

is marred in a lot of confusing obstructions and hard to understand reasoning. Take for example the code you will find everywhere online

 cursor = context.getContentResolver().query(uri, projection, selection, selectionArgs, null);

Then you find references to query, tables records rows, and columns. That may be great for sharing a DB however it does not resolve file sharing, however that is the code you have to fight with.

Of course cursor is mostly null and in cases it is not null it will throw an exception when you try to execute the above query.

Now lets assume you get through this and you have a valid cursor object. now this piece of code fails you

  if ( cursor.moveToFirst ( ) )
    path = cursor.getString ( 0 );

So what does this all mean ? For me it resulted in two very frustrating days of lost productivity and head-scratching why such a simple task is so unnecessarily complex.
Google: There is no excuse for this complexity.

Here is the final code to retrieve the file

  if ( "content".equalsIgnoreCase ( uri.getScheme ( ) ) ) {
    Cursor cursor = null;
    try {
      String[] proj = { MediaStore.Images.Media.DATA };
      try {
        cursor = context.getContentResolver().query ( uri, proj, null, null, null );
        if ( cursor != null ) {
          try {
            int column_index = cursor.getColumnIndexOrThrow ( MediaStore.Images.Media.DATA );
            if (cursor.moveToFirst ( ) )
              path = cursor.getString ( column_index );
          catch ( IllegalArgumentException e )  {
            e.printStackTrace ( );
      catch ( Exception e )  {
        e.printStackTrace ( );
    finally {
      if ( cursor != null ) {
           cursor.close ( );
    String str = path;
    if (str.indexOf("/file/") == 0)
        str = str.replace("/file", "");
    return str;
Posted in Uncategorized | Leave a comment

EleCam 360 vs PanoView 360

I thought I share my expertise using both cameras on our family trip to Florida.


There is definitely a huge advantage to using the EleCam 360 because of its two lenses and the coverage of the full 360 degrees of view.


The PanoView sports only one lense which covers a range of 220 degrees visible range. However it delivers a higher resolution than the EleCams sensor at 2448×2448 video and 4096×4096 still image resolution.


The EleCam has a combined resolution of 1920×960 for video and 308×1504 for image resolution.

You have to keep in mind though that the resolution is that of a rectangle with the round image in it and that this tradition is the actual radius of the image for the PanoView and two times the radius for the EleCam. The final resolution you will see on YouTube depends on you rendering settings.

Utilizing 360Tube you have three possible resolutions to choose from.


512×256 can be thought of as a quick preview rendering and should not be used as the final resolution for YouTube. The results would look very grainy and not sharp.

1024×512 is a nice medium if you actually render the video on your phone. While the final result will still be fuzzy, it allows you to upload the video shortly after you create it using your 360 camera.

2048×1024 is the high res version which looks much nicer on YouTube but will take a long time to render on your phone.

Higher resolutions will be available on the pro version which will allow you to process the video on your computer instead of your phone. Using for example the Gear 360 will give you much higher source resolution and you will want to retain the quality all the way through to the YouTube video.

I have encountered multiple times a frozen EleCam where the only way to recover is to push the reset button which can only be achieved using a small metal pin you will need to stick into the tint pin hole. This has been impossible at times when your are it and about trying to shoot action videos.

The other way to reset is to let the battery drain but then you’re out of options anyways.

The PanoView seems much more mature in its stability as well as in its feature set. You can for example choose a time lapse video which is a lot of fun. It also came with a waterproof case which I have used to a large degree during our Beach vacations and during our visits to Aquatia.

Posted in Uncategorized | Tagged | Leave a comment

360Tube phase Aplha-Aplha

I have submitted the very first usable alpha version of 360Tube and I am now in the process to spiffy it up, work on usability, remove clutter, and try to avoid crashes.

One positive sign is that I am actually using the app myself quite frequent, when I have a new video recorded with my EleCam 360 which I want to upload to YouTube.

However the FileSelector was kind of sucky, so I thought I take a few hours to replace it with a better version. That was about two days ago. I have spend a lo of time trying the available open source FileSelector libraries from github. Unfortunately most of those offered little additional benefit over my current implementation and in a lot of cases I had to spend time to work on making it compile.

I finally came across the super-fine-nice-cool UltraExplorer.


It took me a couple of hours to compile it and made it work inside AndroidStudio however I am now at the point where I can add things together and integrate this into 360Tube. Unfortunately it does not currently support previews for videos so I will have to spend some more time adding this in.

Overall though I am happy with the progress. You can find a sample video from 360Tube here:

Posted in Uncategorized | Leave a comment