Posted by alex on Aug 7th, 2017


This is a replica of a Milky Way's style Stargate and the SGC ramp. My goal was to design something that is both easy to print and easy to assemble. Some trade-offs had to be made, for example the symbols and textures are all simplified so they can print correctly on smaller printers. Initially I wanted to post this project on thingiverse, and I still might, but I have yet to write detailed assembly instructions and for the time being I still wanted to showcase this project. This post includes all the design files, the stl, the arduino code, a few photos, and some notes on assembly but it is by no means a step-by-step guide.


Conception, Printing, and Assembly

The 3D models have been designed in 123D Design which, in retrospect, was a poor choice for this project. It is extremely slow on complex sketches such as the symbols ring. On top of that it was recently discontinued! I am unaware of any method to export to Fusion 360 in a format that is editable but you can still download 123D for free if you wish to edit my designs.


Cura 2.5 was used to generate the GCode with the following settings:

  • Layer height: 0.1
  • Infill: 100%
  • Temperature: 210C/60C
  • Speed: 60mm/s
  • Support: Only "gate - back" and "gate - front" (I strongly recommend "Support Interface" for easy removal)

The printer used was a Monoprice Select Mini and the material was Hatchbox grey PLA (white for the chevrons). I designed everything with a 120x120mm printer in mind and the STL will give you a 117mm(4.6") gate diameter. If you decide to resize it, special attention might be needed for the motor gear.

To assemble the project you will only need glue and I recommend Loctite 401 or low temperature hot glue. The starting friction of PLA on PLA is quite high and your stepper might have an issue starting. I suggest using a paper ring that sits between the symbols ring and the back rail so that it's not PLA against PLA. Grease or oil might also work.



(7.74 MB)



(14.26 MB)


Posted by alex on Nov 24th, 2014

Android reserves a certain percentage of the data partition for itself to make sure apps won't run out of working space (Receiving SMS, emails, call logs, etc). On phones with no external storage it means that when you are down to 10% free OR 500MB (whichever is smaller) you won't be able to update/install anything, even if it's only a couple kilobytes. It's really annoying for devices with 4-8GB to lose 500MB like that.

IMPORTANT: If you have plenty of space available and yet have the insufficient storage error, you should look elsewhere to fix your issue. The following guide is only to reclaim the 10% remaining, not fix Play Store issues. The procedure should work with any Android 4.x, but it was tested only on stock Moto G and LG G1.

How to

Before starting you need to choose how much space you wish to reserve for Android. You can choose a percentage, a size, or both (the system will pick the smallest value). This guide uses 100MB and 2%, change values accordingly. You need to be rooted. Procedure overview (step-by-step below):

Database Path: /data/data/com.android.providers.settings/databases/settings.db

Insert rows in table: global

name value
sys_storage_threshold_percentage 2



Note: In older Android the table might be named secure. If that is the case please replace global by secure in the following instructions. Thanks to Patrick in the comments!


Using a sqlite3 editor:
  1. Get a rooted sqlite3 editor from the play store. I tested this procedure successfully with SQLite Debugger and aSQLiteManager. SQLite Master Pro is easier to use but not free.
  2. Open the aforementioned database.
  3. Navigate to the table named global.
  4. Insert the rows as specified. (when inserting only fill name/value, leave the remaining fields empty)
  5. reboot!
Using the command line:
  1. You will need a rooted phone with sqlite3. If you do not have the sqlite3 command installed, try this one or try the Sqlite3 installer.
  2. Connect to your phone via adb shell or use a root terminal emulator.
  3. # sqlite3 /data/data/com.android.providers.settings/databases/settings.db
    SQLite version 3.8.6 2014-08-15 11:46:33
    Enter ".help" for usage hints.
    sqlite> replace into global (name, value) values('sys_storage_threshold_percentage', '2');
    sqlite> replace into global (name, value) values('sys_storage_threshold_max_bytes', '104857600');
    sqlite> .quit
    # reboot


You should be able to install more apps now :)


Look further

A quick note about the table name first: I instructed you to insert lines in the "global" table. I believe the proper place for all Android is the "secure" table and "global" has the ability to override settings from "secure". I have not tested recent Android 4+ with "secure" instead of "global", that's why I kept "global" above.

Here's some technical info if you want to patch at the rom level or write an xposed mod or whatever:

I tracked the check down to getMemThreshold() in DeviceStorageMonitorService.java.

private long getMemThreshold() {
     long value = Settings.Secure.getInt(
         if(localLOGV) Slog.v(TAG, "Threshold Percentage="+value);
         value *= mTotalMemory;
         long maxValue = Settings.Secure.getInt(
    //evaluate threshold value
    return value < maxValue ? value : maxValue;

The default value is specified earlier in the same file:

private static final int DEFAULT_THRESHOLD_PERCENTAGE = 10;
private static final int DEFAULT_THRESHOLD_MAX_BYTES = 500*1024*1024; // 500MB

The setting key can be found in frameworks/base/core/java/android/provider/Settings.java

The installer calls it from PackageManagerService.java in checkFreeStorage()


Method with Tasker:

(From Daniel in the comments.)

For those having tasker it is even easier:

Task with this 2 actions:

  1. Run shell (under code) - enter the following values
    1. Command: sqlite3 /data/data/com.android.providers.settings/databases/settings.db "replace into global (name, value) values('sys_storage_threshold_percentage', '2')";
    2. Tick "use root"
    3. If you want you can save the error output and display it with a notify action
  2.  2nd action same but put this command:
    1. sqlite3 /data/data/com.android.providers.settings/databases/settings.db "replace into global (name, value) values('sys_storage_threshold_max_bytes', '104857600')";

Run the task and reboot ...

Posted by alex on Oct 9th, 2014

As of 2016, this post is outdated and may no longer apply.


Updating Chrome on Android is always a gamble. If I were to pick a game to best describe the experience I'd choose Russian roulette. Sometimes everything is fine, improved even. But too often things fall apart, up to the point you may reluctantly have to revert to the factory version. You may choose, like me, to preemptively remain on an older version. It works fine, if you can live with chrome prompting you to update to a "newer, greater version" at each start...

But you like your current version and you don't want to be prompted to update each time you tap the Chrome icon... There is no setting that I could find to disable this behavior.

Luckily if you are rooted you can manually edit one of Chrome's config file, the one concerning Omaha aka Google Update. You will need a root text editor or file manager, I use ES File Explorer
with root enabled (swipe the left pane).L93.png

Note: This will not disable the Play Store auto-update or manual update. It will only hide the annoying "Chrome just got better" prompts when you start Chrome.


Before starting make sure to swipe Chrome away from the activity view , it will avoid having Chrome overwriting your changes.

I've added a second (non-tested) method, scroll down to see it. It is actually much simpler, maybe it's worth trying first.


Editing the config file

The file to edit is:

You need to set the latest version to a number less than your current version and change a few timestamps:

  1. latestVersion => lower version than yours
  2. delay => just bump that number
  3. timestampForNextPostAttempt => set in the far future
  4. timestampForNewRequest => set in the far future
  5. timestampOfInstall => set in the far future

. Here's an example file with modifications highlighted:


<?xml version='1.0' encoding='utf-8' standalone='yes' ?>
    <int name="backoffFailedAttempts" value="0" />
    <string name="latestVersion">32.0.2125.102</string>
    <string name="installSource">system_image</string>
    <string name="marketURL">market://details?id=com.android.chrome</string>
    <long name="delay" value="7200000000" />
    <long name="timestampOfInstall" value="2012905877353" />
    <long name="timestampForNextPostAttempt" value="2012905877353" />
    <long name="timestampOfRequest" value="-1" />
    <string name="persistedRequestID">invalid</string>
    <boolean name="sendInstallEvent" value="false" />
    <long name="timestampForNewRequest" value="2012920277663" />


And for reference here's the stock one:

<?xml version='1.0' encoding='utf-8' standalone='yes' ?>
    <int name="backoffFailedAttempts" value="0" />
    <string name="installSource">system_image</string>
    <string name="latestVersion">38.0.2125.102</string>
    <string name="marketURL">market://details?id=com.android.chrome</string>
    <string name="persistedRequestID">invalid</string>
    <long name="timestampOfRequest" value="-1" />
    <long name="timestampForNextPostAttempt" value="1412907273247" />
    <long name="timestampOfInstall" value="1412903606751" />
    <long name="timestampForNewRequest" value="1412921673585" />
    <boolean name="sendInstallEvent" value="false" />


Changing Permissions

Once the changes are made you need to do some permission changes:

  1. Change the permissions to 444 (Read: User, Group, Global / Write: none)
  2. Change the owner and group of the file for any other user, root for example
  3. Set the sticky bit so that Chrome can't change back the permissions or delete and recreate the file

Recap: Change owner/group to group and set permissions to 1444 (sticky bit + read user + read group + read world). It may seem overzealous but trust me, Chrome is very tenacious when it comes to its config files.


If at this point Chrome still somehow fix the file, it's worth looking for very good alternatives such as lightning or tint!


I hope this post will be helpful to some people! :)


Edit, alternate method - NON TESTED:

Disabling the Omaha Service

This is a method I have not tested, I'm merely guesstimating it has a fair chance of working.

Disclaimer: I did test the procedure myself and Chrome still works fine afterward, what isn't tested is the anti-update/banner/prompt/annoyance itself (long story short I do not have access to old enough Chrome right now). Why am I posting untested root tricks? Because it is safe if you don't play around the app I'm linking too much (don't touch what you don't understand, although you can revert at any time) and someone might be desperate. Because seriously I didn't find anyone else trying to stop this Chrome behavior without (or even with, for that matter) patching chrome but I receive quite a bit of traffic from google search and even got a friendly commenter! So I assume there is some interest.

  1. Download Disable Service from the play store (or elsewhere).
  2. Open and go to Chrome
  3. Uncheck OmahaClient

My logic: Disable Service will stop the service from running, ever. OmahaClient is the name of Chrome's updater.


If this new attempt doesn't work then I guess... It's time to patch the apk or make an Xposed module! The module is likely a better option because it won't cause signature conflicts, should work across chrome versions, and be easier for people to install.

But at this point it's worth wondering if we really want Chrome that bad, don't you think?

Posted by alex on Jul 1st, 2014

(11.71 KB)
PbCounter is a small Windows utility that counts how many times each mouse button and each keyboard key is pressed. With these statistics it does three things:

  • Display the counters, obviously :)
  • Create an heat map to put in evidence the most used keys on your keyboard
  • Upload the statistics at regular interval to a web page of your choice (an example PHP script here)

It is purposely compatible with scripts made for Mousotron. It takes less than 3MB of ram and uses very little CPU. Configuration can be done by editing the INI file, more information included in the help file. Important: While it tracks how many times each key is pressed, it doesn't record what you type (it is not a keylogger).

(22.49 KB)

The program is free to use and modify under the MIT license. If you want to compile it you will need PureBasic 5+ (The demo won't work as PbCounter uses the win32 API).


Tags: Click counter, Mouse Spy, Keyboard activity, Statistics

Go to Top