Friday, November 25, 2016

Greenshot - a screenshot tool

Greenshot is a handy Open Source screenshot tool.

Thursday, September 22, 2016

Run Android apps in Chrome

I might be late to the party but better late than never. That's two cliches at once.

Being late has an obvious benefit of not trying the stuff that does not work and/or screwing up the stuff that does. So, by now Google has released an official ARC Welder extension for Chrome browser ( The extension/app will convert an Android .apk into a Chrome app.

This is quite amazing from the user point of view. Technically, it is enabled by Chrome apps and Android using (more or less) the same underlying runtime.

The apps I tried were very responsive and much easier to use than on an emulator.

Saturday, September 17, 2016

Genymotion issues

The most common issue I experience with Genymotion is inability to start a virtual device. At least now I believe I've figured out how to fix this behaviour.

It seems that Genymotion waits for a short time for the device to get an IP address from the VirtualBox DHCP server that serves the Host-Only network adapter. To work around this issue, the virtual device can be started from VirtualBox directly. Then, once the IP is assigned, and this is visible on the screen, the device can be started in Genymotion. It will simply continue the already-running session and will display the graphical screen in the Genymotion window while the console output will remain in the VirtualBox screen. One could also run the VM headless, in which case there would be no VirtualBox screen open, I guess. That way it would be harder to figure out when the IP address has been assigned.

Another issue that may cause this behaviour seems to have to do with the configuration of the DHCP. The main reason here is the discrepancy between the DHCP address range and the virtual network adapter IP address.

Sometimes there are multiple adapters in the Host-Only section of the VirtualBox network configuration. Make sure there is only one. Remove the others.

Then, synchronize the IP range of the DHCP server to match the given IP address of the host-only adapter.

Example: if the host-only adapter has the IP settings, the DHCP server can be configured as such:

Server Address:

Server Mask:

Lower Address Bound:

Upper Address Bound:

On Windows 10 these issues seem to resolve automatically as Genymotion sets up the host-only adapter on its own.

Wednesday, September 14, 2016

Manually updating Avira Antivirus

Avira Antivirus supports a manual update option, which is great when automatic update fails with different errors but all the required files can be downloaded through a browser, for example.

The tool is fairly simple and effective.

Tuesday, August 23, 2016

Markdown Editors: Typora

It's that time again, searching for a quick editor for Markdown (.md) files. This time it is getting easier as it seems that a lot of people are using Markdown. There are also lot of people developing editors, it seems.

After a fairly quick search, I narrowed down to two options. Will see how it goes.

There are several important factors to consider, in order of preference:

  • startup speed
  • HTML preview
  • styles support (so I can make it dark)
  • extended Markdown support (strikethrough, for example)
Current favourites: Abricotine, which is Open Source, and Typora, which is free while in Beta.

Wednesday, July 20, 2016

Saturday, July 16, 2016

CloudRail and Crashlytics

In mobile apps, adding one thing leads to another and so I ended up using Twitter's Fabric / Crashlytics.

Prior to that, I was lucky to have the good guys from CloudRail introduce their fantastic library that communicates with four major cloud storage providers (Dropbox, Google Drive, OneDrive, and Box). This came about at the same time Dropbox announced the retirement of v1 of their APIs. As the most requested features for MoneyManagerEx for Android were the support for some of these services, this was a great match. A unified interface to different cloud providers was something I was expecting to create in order to provide multiple storage providers for data synchronization anyway, and architecturally this solution fit perfectly into the app's roadmap.

After adding this, of course, various issues appeared. This is almost a given on even the quietest releases. Just after Beta testing for at least a week does not produce any exceptions, rest assured that publishing an app to Production will result in a torrent of exception logs. Various devices, operating systems, and network environments, mixed with different user levels will invariably result in infinite number of possibilities for exceptions.

This torrent of exception reports is becoming an overkill for a custom default uncaught exception handler. Plus the custom solution depends heavily on users actually willing to submit the report via email. Over the past several months, this solution really shows its age and is becoming unmaintainable as the number of users constantly grows. And, as I've found out only later, the stack trace produced in this manner does not include all the useful information. With multithreading being used ever more for even the simplest tasks, the log covering the crashing thread does not produce the full picture of what exactly went wrong, especially if there are several layers of libraries. So, an issue with SSL parsing in OpenSSL might cause OneDrive part of CloudRail to fail, in turn resulting in an exception during the initialization of the sync service which is set up to use Dropbox as the provider!

This level of logging only becomes possible by introducing a specialized automated exception reporting solution.

This lead to dusting off my Fabric account and adding Crashlytics to the app. The results are simply stunning. Real-time reports show the exceptions as they happen. Now, without relying on users' submission, I do not need to bug users to send exception reports manually any longer.

Another great benefit is that the caught exceptions can now be reported, too. Adding a whole bunch of try/catch blocks muted these errors and prevented the app from crashing but in reality did nothing to handle the root cause. Now I can log any of these caught exceptions and report them. Then, whichever one tops the list, it will get addressed and the related code improved further. Specific cases, like missing files, DNS errors, and so on, can be specifically handled and the user notified. This way they can be properly handled and excluded from the exception logs.

So, overall, lots of fun introducing two new features/libraries - CloudRail and Crashlytics. It is one of those moments when one asks himself how the world existed before this. Should I mention that both are free to use, even though they are not Open Source? If they remain so, they will probably have a historic impact on technology implementation by improving outreach (CloudRail) and handling the user experience quality (Crashlytics). Thanks, guys!

Happy development to you all.

Monday, July 4, 2016

CloudRail: Unified Cloud Storage API

Just came across CloudRail library for Android and am adding it to MoneyManagerEx for Android. The library provides a unified API to several cloud storage (and other) services.

After Dropbox announced deprecation of v1 of their APIs and libraries, these needed to be replaced in the app. Now, for the same amount of effort in migration the app will get, for free, the ability to use four of the most common cloud storage providers. This is fantastic! Hope this stays a secret. :)

Wednesday, June 29, 2016

Monday, June 27, 2016

Deploy SQL Migrations with Octopus

Here is a brief summary and a to-do list for packing and deploying SQL migrations in combination with Octopus. The prerequisites are: .NET project, Fluent Migrator, Octopus Deploy.

The first step is to set-up database migrations using code (C#). For this,

- create a library project in the solution,

- add Fluent Migrator (eventually FluentMigrator.Tools and/or FluentMigrator.Runner but these are not required) NuGet package to it,

- create the first migration class containing the change (schema and/or data).

This will produce the migration binary .dll file on build operation. To get the SQL commands for the actual change, one needs to run the Migrator tool to generate the change commands based on the current version of the database. If this is the first migration it will also generate the commands for creation of the Migration_Info table.

- Create SQL generation script(s). There are a few useful scripts for checking the SQL output.

  - Script for previewing the current migration (just runs -preview),

  - Script for manually generating the SQL output, and

  - PowerShell script for automatic generation of the SQL file output during the automatic build process.

The PowerShell script will be executed after the build completes on an integration server. It will generate the SQL file from the built migrations .dll binary. To do that,

- add the post-build script that runs the Migrator and generates the output SQL file (this is the automatic script from above).

After this, it is time to generate the NuGet package.

-  create .nuspec file that includes the generated .sql file.

- adjust this script to create the NuGet package with the generated output.

- set the script to upload the NuGet package to a NuGet repository. This is the Octopus Library.

Once this is done, the only remaining step is the deployment.

- create the Deploy.ps1 script and include it in the generated NuGet package. This script should either execute the SQL file or copy/send it to the DBAs for examination and scheduled execution.

This solution provides the history of database changes (both schema and data). It is automatic and does not require developers to manipulate or send SQL commands. Besides the code migrations, it also creates an archive of all the migration packages, which is useful for the database administrators and possibly other parties. These packages can be safely stored along with the other binary packages for deployment.

Thursday, June 23, 2016

Process Hacker

Process Hacker is an Open Source version of Process Explorer. Some say it has more functionality, too. To be tested.

Project page

Friday, June 17, 2016

Thursday, June 9, 2016

Sublime Text 3 - save on blur

Sublime Text 3 has a built-in option to save a file when the editor loses focus. It just requires a switch to enable it. Add the following option to User Preferences:

"save_on_focus_lost": true

Simple HTTP Server with Node.js

Looking for a quick web-server set-up? Mongoose is a good choice but there's also an option to run an HTTP server on Node.js:

Thursday, May 26, 2016

Maximum line length for source code

Does the length of a line of code matter? And what would a common measure be? Interesting overview with a conclusion of 125 characters per line:


Monday, May 23, 2016

JS Clojures

Friday, May 20, 2016

Firefox tops Microsoft browser market share for first time

Wow, Firefox has surpassed Internet Explorer in terms of usage. The measures come from StatCounter.

Source: link

And here are the current stats: Top 5 browsers

Tuesday, April 26, 2016

Issues with Reinstalling Internet Explorer 11

Just had some weird issues with IE11 that I tried to fix by reinstalling. However, I could not find an entry to uninstall in Windows components nor in Programs and Features. I could also not install the latest version via installer because it reported that a newer version was already installed. Bump.

Fortunately, there are logs that can be used to trace what is going on.The Internet Explorer installation log is at C:\Windows\IE11_main.log. Once the installer starts, it creates a temporary folder in C:\Windows\Temp\IExxxx.tmp. This folder contains the installation files and things can be manually adjusted there.

Customizing Android Location

The paths for Android SDK and related tools can be customized through environment variables
Android_Home is the location of the SDK folder (android-sdk), and Android_SDK_Home is the location where the .android folder will be stored. This folder (.android) contains your settings and virtual machine files.

Sunday, April 17, 2016

Must-Have Libraries for Android

It is always good to see a confirmation of one's choices. The same goes for this list. I've already used most of the libraries on this list and have made them a part of the Android development arsenal.

The only sad part about reading this article is finding out that it's not a "treasure map" and has not provided some yet-undiscovered miracle-library that makes things simpler.

However, any article that puts Parceler, Retrofit, and EventBus together is always a good read.


And if that is not enough here is another list for 2015.

Thursday, April 14, 2016

Quick Firefox Restart

Sometimes it is useful to restart Firefox but keep all the previously-open tabs and windows.

Unfortunately, simply closing the browser will not do as the next time it is started, it will simply show your default start settings. This is blank page in my case.

To assist with this, there was a couple of extensions, like Restartless Restart or the Restart Button, but they all stop working after some time due to Firefox updates.

The solution is available in Firefox by opening the Developer Toolbar (link) using Shift+F2 and typing "restart" as the command.

Monday, April 11, 2016

Customize your ProgramFiles variable

If you are running short on space on C: drive, you can customize some variables that tell programs where to install by default.

Such are

  • ProgramFiles
  • ProgramData
  • CommonFiles
  • ProgramW6432
All are located at  HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion.


Saturday, April 9, 2016

Thursday, April 7, 2016

SQLite encryption support on Windows

SQLite Manager seems to be the only tool that supports encrypted SQLite database files on Windows.

Read more

Saturday, April 2, 2016

Sunday, March 20, 2016

Root NVidia Shield K1 Tablet

# Root NVidia Shield K1

Follow the article for K1 and use the files listed in the article!

## Marshmallow; Nvidia Shield Zone

- [Article: Root K1](
- [Article: Tutorial: Root Shield Tablet (Marshmallow)](

# My Instructions

- Enable Developer Mode and USB Debugging on the device.
- Install drivers
- unlock device
- Enable Developer Mode and USB Debugging on the device.

"adb reboot bootloader" will reboot into fastboot. PC needs to be authorized for access the first time ADB accesses it.

## Install drivers

Find the device in the Device Manager, click Update Drivers, select the folder with the drivers.
After this, the device is visible through "fastboot devices".

## Unlock device

Reboot into fastboot.
"fastboot oem unlock"
Confirm on the device and wait for it to finish. Then choose Continue to boot the device.


Experimental build for Android 6 Marshmallow

The official builds are for Android 5 Lollipop only! (below)

Reboot into fastboot.

"fastboot flash recovery twrp.img"
"fastboot boot twrp.img"

## Recovery

Switch off tablet. Wait 20 sec. Now press vol down + power. Now from menu find recovery and press power button. Or if you have root download quick reboot from market.

Dead Android IS the door to recovery. Press "Pwr + Vol Up" to enter

# Non-TWRP Root


Friday, March 18, 2016

Publishing Beta as a separate app on Play Store

The article below will help you set up either a Flavour or a Build Type, which can be useful if you decide to publish an unstable (Beta) version of an app as a separate app, instead of using the Beta channel.

I find the separate-app approach to be much more convenient for the testers as it always leaves them a fallback option to the stable app, which is a whole separate app on their device. That way they will never be blocked out of using the app and might be more likely to try out the unstable version and help out with testing.

Build Type is the correct setting for this and it is enough to add the line

applicationIdSuffix ".beta"
to the build type definition, which will modify the application id. This is required for publishing the effectively same app to the Play Store.


Thursday, March 17, 2016

Streaming video to Android device

There are several options for streaming videos to, or rather through, an Android device.

VLC Direct

VLC Direct is an Android app that links directly to your VLC player on a PC. Never managed to make this work.


AirStream contains two applications: one for PC and one for Android. It will serve files from a PC, making them available on Android. The solution is fairly stable and reliable.

Plex Server 

This option will use media server on a PC and UPnP client on Android.

Source: article

Remove other users' pending changes in TFS

Using "tf /lock" and "tf /undo" will remove other users' locks or pending changes in TFS source control.


SVG 2 Vector Drawable converter

Thursday, March 10, 2016

Examples of Design Patterns

OO Design site has a nice collection of examples for the design patterns, along with the description on when to use them.

Source: link

Wednesday, March 9, 2016

Service-like behaviour in a Web Application

Whether the time of (Windows) Service executables is going away and the execution moves completely into the web server (sand-)box remains to be seen. One step in that direction is Hangfire, a library for scheduling tasks running under ASP.Net.
When one can get a "heartbeat" going in the context of a web application then the rest remains relatively easy to accomplish.

Thursday, March 3, 2016

Troubleshooting MSDTC

Basically, use DTC Ping to check a few things, like network connectivity, firewall issues, etc.

Source: DTCPing: Troubleshooting MSDTC Connectivity Issues (link)

Tuesday, March 1, 2016

QA Browser Tools

Here's a handy Chrome extension from Microsoft that significantly helps with development and, more particularly, testing of web applications:

Exploratory Testing

Thursday, February 18, 2016

Choosing Vanilla JavaScript in 2016

Interesting post, listing advances in core JavaScript that make some frameworks and add-ons redundant.

Choosing Vanilla JavaScript in 2016

Some key points:

Saturday, January 23, 2016

Finally got Cortana working

After all the fiddling, I've finally got Cortana working on Windows 10. Yay. :S

Thanks to these instructions, I guess the missing bit was installing the speech files for the selected language. I have to say that I still find it strange that English (US) is considered a completely different language to English (UK) or English (Australia). Balkanization all over the place, it seems.

So, anyway, installing English (Australia) speech files made Cortana finally work with Australia as the selected region and English (Australia) as the default language.

Now let's see what it can do. So far not impressive.

Tuesday, January 19, 2016

Free Vector Graphics

Here is my list of free vector-based graphics on the Web. In addition, there are Open Source tools for working with them.

Font Icons

Vector Icons

Clip Art


Wednesday, January 13, 2016

Monday, January 11, 2016

Firefox Restart button

Here's an extension that adds a Restart button to Firefox: Restart Button.

Considering that Firefox instance sometimes gets dumb and does not display the newly-created tabs, this is absolutely necessary. There is also a Restartless Restart extension but that does not seem to work any longer.

Friday, January 8, 2016

Sign of things to come - 3D - Project Tango

It seems that this year is shaping to be the year of mobile 3D. There are more 3D-enabled phones coming out and software is catching up with 3D recognition and overlay. Microsoft's HoloLens looks pretty interesting (at least in the pictures) and Google's Project Tango is being developed for mobile devices.

Sources: Bloomberg,
List of 3D-enabled phones, Wikipedia