Wednesday 24 December 2014

    Add Exchange account to Gmail 5.0 on older android versions

    I installed unofficial CM 12 with Android 5.0.2 today. Earlier I was using stock Android Lollipop and it had the option of adding Microsoft Exchange account. Unfortunately CM12 didn't seem to have it.

    After doing some research I figured out that only devices running stock Android 5.0+ are capable of having exchange accounts. And CM12 although runs on Android 5.0, doesn't have this feature. On doing further research I found out that Android 5.0+ have something called Exchange services which enables gmail 5.0 to handle exchange accounts.

    Download Exchange Services

    Then, install and restart your device. Walah! Gmail will be able to add exchange accounts!

    Note: This method is not just for CM

    Friday 5 December 2014

    How I fixed bootloop on my Nexus without loosing data

    I was playing around with framework-res.apk and SystemUI.apk to get Ambient Display on my Nexus 4. When I restarted my phone, it seemed to have stuck in a bootloop. I knew that factory reset might've worked. But I didn't want to lose any data.

    Fortunately adb was working. When I did adb logcat , it was logging an error saying:
     /system/framework/framework-res.apk is neither a file nor a folder (type=0)

    I realized that there was some problem with permissions of that file. I used adb shell and changed the permission of framework-res.apk and SystemUI.apk to 0644. But this was of no use. However I came to know that if I could somehow reset /system partition the problem would be solved.

    • So I downloaded the factory image of my phone. For nexus devices it is available here
    • Extract the contents of the to get the file system.img.
    • Then ran the following:
      adb reboot bootloader
      fastboot flash system system.img
    • This will wipe the /system partition and reset it without touching any other partitions. Hence you will not lose any data.
    • Restart. It took a while to start the phone completely. But it solved the problem!
    This is how I was able to reset my framework-res.apk and SystemUI.apk!

    Monday 24 November 2014

    Type checking in javascript has never been easier

    I love languages which aren't strongly typed. It makes software development process very fast and very easy as we need not write huge, complex, unreadable code like in our typed languages. However this can lead to developer's worst nightmare: Runtime errors! In languages such as javascript it is not easy to check for type mismatches while in development process. Hence flow was invented!

    Flow is one of Facebook's open source projects. It allows developers to check for programming errors in javascript code with very less effort. This is a sample code available on their site:

    function foo(x) {
      return x * 10;
    foo('Hello, world!');

    Note that a string is passed into the function foo and an arithmetic operation is performed on that string inside it. When flow is run on this code:

    01_HelloWorld/hello.js:7:5,17: string
    This type is incompatible with
      01_HelloWorld/hello.js:4:10,13: number

    It points out that the string is incompatible with number. Consider a much much complex code. An error like this can simply be unnoticed until a runtime error is raised.


    Sunday 23 November 2014

    Navigation Bar suddenly disappeared on Nexus

    This can happen on any phone with soft navigation keys.

    Yesterday, I was tweaking my Nexus 4 after updating to Lollipop. When I restarted my phone I found that the Navigation Bar had disappeared! Even to switch from one app to another I had to restart my phone! Then I found a way to fix it.

    Install Root explorer or ES Explorer. Open it and go to /system and mount it in R/W.

    Then open the file build.prop in the current folder using text editor.

    Then go to bottom of the file and change the value of "qemu.hw.mainkeys" from 1 to 0
    Reboot and you are done!

    Thursday 30 October 2014

    How to mount NTFS External Disk in write mode in OS X Yosemite

    This works for Mavericks also :)

    It is not possible by default to mount a NTFS External Drive in write mode on OS X since Mavericks. There is a complex way to do this. In order to make it simple for you, I wrote a script which does it.

    First you need to install Xcode and Homebrew. Google how to install them :P

    Download this script

    Then do this:
    chmod +x ntfs_write_mode_enabler

    Now connect the driveIn Mavericks you will get a warning “Kernel extension is not from an identified developer”. You are good to go if you click OK. However, if you are using Yosemite, you have to restart your system to load the kernel extension. For more on that read this.

    In Yosemite you might get the following error if you are updating old osxfuse. As we have enabled developer mode which allows you to run unsigned kext, it will not be a problem.

    osxfuse: OS X Mavericks or older is required for this package.

    OS X Yosemite introduced a strict unsigned kext ban which breaks this package.You should remove this package from your system and attempt to find upstream binaries to use instead.


    Execute the following command to replace the modified NTFS mounter with the original one

    sudo mv /sbin/mount_ntfs.old /sbin/mount_ntfs

    Loading unsigned kernel extensions on Yosemite

    Since Mavericks, OS X started checking signatures of kernel extensions. However unlike in Mavericks, loading unsigned code to kernel is disabled in Yosemite (in Mavericks only a warning, “Kernel extension is not from an identified developer” was displayed). It is required to sign kernel extensions using the Developer ID obtained after enrolling in Mac Developer program. With Yosemite still in beta, it is hard to find signed kernel extensions other than the ones officially released by Apple. 

    You will get this error when you try to load unsigned kext:

    Diagnostics for [unsigned kext]:
    Code Signing Failure: not code signed
    ERROR: invalid signature for [unsigned kext], will not load

    This being said, it is possible to sign all unsigned kext by doing this:

    sudo nvram boot-args="kext-dev-mode=1"
    Restart to get all the kext running!

    Wednesday 29 October 2014

    Porting from Eclipse to Android Studio on mac

    First download android studio from here.

    Install Android studio from the .dmg file as usual

    Now, before opening Android studio, open the terminal and delete the sdk which comes with it.

    cd /Applications/Android\
    rm -rf sdk

    Now create a link of your old sdk in that folder

    ln -s [absolute path to old sdk]  /Applications/Android\

    Now open Android studio like any other app and open your existing project. You are good to go!

    Or follow this to migrate your eclipse project to gradle!

    Monday 6 October 2014

    How to fix blurry windows on retina display on mac

    You might've observed that some third party apps have blurry windows on mac. This is due to the fact that those apps are not making use of the retina display introduced by Apple sometime back. I found a simple way to fix this using an app called Retinizer. Simply drag and drop the app (.app file from Applications folder) to its window to "Retinize" the app!


    Sunday 5 October 2014

    The curious case of deleting .nomedia file

    Deleting .nomedia file not enough to make a folder visible in android gallery

    TL;DR: After removing .nomedia file, add/delete some file in that folder.

    You might probably know that if you want to hide a folder from gallery all you have to do is create an empty file called .nomedia. This will make sure that the media scanner will skip that folder.

    Sometime back I did this when I wanted to hide the Whatsapp folder from gallery. Now I changed my mind and want Whatsapp folder to show up in the gallery. So I did like any other guy would do -- I deleted .nomedia file from that folder. But this didn't work.

    If I had any android version prior to Kitkat, I could've just run media scanner from some app. Unfortunately after Kitkat this wouldn't work (They changed how media scanner works to save battery).

    Then I tried renaming the folder (after deleting .nomedia file). Magically, all the images started displaying in the gallery. However, I couldn't afford changing the name of the folder.

    I realized that post jellybean, media scanner updates the media index only when there is a change in the folder. So, I just added a new image to that folder manually. It worked like a charm!

    NOTE: If the folder is on sdcard, you can just remove the sdcard and put it back (after removing .nomedia file) to run media scanner.

    Tuesday 30 September 2014

    How to open apps from terminal on mac

    I switched to mac from ubuntu recently. I noticed that apps installed from .dmg files are not accessible from terminal. In ubuntu to open say, gvim (MacVim in mac) I used to simply type gvim in the terminal. This doesn't work on mac :(

    After doing some analysis on how apps are maintained, I noticed that each application (.app) is stored in /Applications folder. And .app file is simply a directory holding contents of the app. Say I open firefox, the executable which launches the app (firefox), stored in /Applications/ is executed.

    So if I execute:
    from terminal, firefox is launched!

    However I do not want to type this huge path every time I want to launch firefox nor do I want to alias each and every app I install nor do I want to add all of them to $PATH. So I wrote a simple script to automatically open any app I want to.


    Download this gist


    Make it executable and move it to /usr/bin. You are done!

    $ chmod +x app

    $ sudo mv app /usr/bin/

    How to use it?

    Say you want to open chrome from terminal to open a html file

    $ app chrome index.html

    Say you want to launch vlc from terminal to open a file

    $ app vlc file.mp4

    Say you want to open MacVim from terminal and open a file. Note that it is case insensitive.

    $ app macvim file

    Thursday 25 September 2014

    ShellShock: Largest security bug ever in the computing world

    ​'Bigger than Heartbleed': Bash bug could leave IT systems in shellshock
    - CNET

    Shell Shock: Bash bug labelled largest ever to hit the internet
    - Sydney herald

    You might have heard about "ShellShock" bug in bash shell that everyone is talking about. You might ask what is the big deal about it? and say that you don't even use bash. It might astound you if I say that this bug exists in so many systems from your fancy smart watches to android phones to Macbooks to powerful web/email/DHCP servers. Basically, bash shell is used everywhere!
    "Heatbleed" bug, a vulnerability in OpenSSL servers, created a huge fuss few months back. Experts think that ShellShock is much more serious than that considering the number of systems being affected. Lot of military and government organizations are at risk.

    So what is Shell Shock?

    It is a vulnerability present in bash till 4.3. Because of this lot of applications using bash are not safe. This 22 yr old bug exists because of the way bash handles environment variables. It is common to assign a function to an environment variable in shell scripts. However it was noticed that the trailing code in the function definition is also executed. Hence it is possible to remotely execute malicious code in many websites by just injecting it at the end of function definition.

    To give more detail consider:

    env X="() { pwd; ls;}; echo hacked" bash -c "echo done"

    The result is:

    After function definition, malicious code echo hacked was also executed!

    Am I safe?

    Open terminal and execute this:

    env X="() { pwd; ls;}; echo hacked" bash -c "echo done"

    You have to worry if the result is:

    instead of

    In action!

    There are three files in the folder:

    after executing this all files get deleted!:

    env X="() { :;}; rm -rf *" bash -c "echo completed"

    Note that rm -rf * is injected (Here I have just typed :P) and it wipes the folder clean

    How to fix this?

    Considering the amount of legacy code which can't be modified, we need a patch in bash itself. Fortunately, a workaround is provided by RedHat here.
    Sysadmins make sure that you apply this patch if you don't want to get fired :P

    Worth Reading

    Bash 'shellshock' bug is wormable

    ​'Bigger than Heartbleed': Bash bug could leave IT systems in shellshock

    Wednesday 17 September 2014 - Zip Bomb!

    I was reading online sometime back and I came across this really interesting thing called also known as Zip Bomb, Zip of Death, Peta bomb or decompression bomb.

    The file is only 42,374 bytes (42KB). When unzipped it becomes 4,503,599,626,321,920 bytes (4.5 Peta Bytes)!!!

    The main use of it is to render useless the host reading the file, usually to disable antivirus. When you unzip it, the antivirus will be busy scanning the unzipped files, sucking up all the available resources and a malicious program injected can execute itself undetected!

    How it works? has 16 zipped files.
    Each of these 16 have 16 zipped files.
    Each of these have 16 zipped files.
    Each of these have 16 zipped files.
    Each of these have 16 zipped files.
    Each of these have 1 file, with the size 4.3GB

    Still. How is this level of compression achieved??
    It relies on repetition of identical files!! Think of it as same file being unzipped over and over again.
    Awesome isn't it?!

    Also read Fork Bomb.

    Tuesday 2 September 2014

    Convert Little-endian UTF-16 to ascii

    I took a csv export from mssql. I had to read this file in python. However there was a problem. Python was reading it in binary format.

    file.readlines read it like this:

    '\xff\xfe2\x000\x001\x003\x00-\x001\x000\x00-\x001\x000\x00 \x000\x000\x00:\x000\x002\x00:\x000\x000\x00,\x00i\x00n\x00s\x00t\x00a\x00l\x00l\x00 \x002\x000\x001\x003\x00,\x00t\x00o\x00o\x00k\x00 \x00r\x00a\x00\r\x00\n'

    When i used file command on that file I got:

    Little-endian UTF-16 Unicode text, with very long lines, with CRLF, CR line terminators

    When I tried to use dos2unix command I got this error:

    dos2unix: Binary symbol 0x000B found at line 9419305
    dos2unix: Skipping binary file calls.csv

    So I tried iconv command to convert the file to urf-8

    iconv -f utf-16 -t utf-8 input_file > output_file

    And it worked! Now python reads it properly.

    Open file in existing gvim in new tab

    We know that gvim -p can be used to open multiple files together in different tabs in gvim. However if you want to open a file in a new tab in the existing gvim session "gvim -p" wont do any good. For that we can use client server concept available in gvim. Add the following line in "~/.bashrc" file and you are good to go!

    alias gvim='gvim --servername gViM --remote-tab'

    Now you can simply give gvim [file(s)] to open in new tab in the existing gvim session!

    Friday 29 August 2014

    My tiny contribution for a prosperous digital age

    I got my first salary few days back. I could think of hundreds of ways to spend that money. But I wanted to do something else, something I've always wanted to do. I donated a tiny amount of my money to Wikipedia. I didn't stop there. I have contributed to open source earlier too, but only in the form of code. I felt that it is time for me to contribute monetarily. I made donations to Ubuntu foundation and Tor project. The amount of joy I got out of doing this was unfathomable and I am sure that nothing else would've made me more happy.

    I have decided to spend a tiny percentage of my salary to donate for such organizations every month. I believe that donating as little as $2 each can shape a better and prosperous digital age. And I think people like me who are in their early 20s with absolutely no responsibility to bear should step up and do this too. Here is a list of organizations which could use your donations:

    Wikimedia Foundation - Makers of Wikipedia and wikia. Providing free access to the sum of all human knowledge to every single person on the planet.

    Ubuntu foundation - On a mission to make linux desktop reach the common man.

    Tor project - Anonymity online.

    GNU Project - Father of the concept of free software.

    The Apache Software Foundation - There are no words to describe their contribution to free and open source software.

    The document foundation - makers of Libreoffice.

    NOTE: I will keep updating the list.

    Wednesday 27 August 2014

    Android L theme on Cyanogenmod 11

    After Google announced that the new Material Design is going to be adopted on Android's next release, currently codenamed Android L; lot of us have wanted to try it. Unfortunately it (dev version) is available only for nexus 5 and 7.  Thankfully there is Android L theme by tung91 on google play which brings near Android L experience to other users.

    You can try Android L or Android L Dark.
    This is how it looks like on my nexus 4:

    Decrease the size of navigation bar on Nexus

    I feel that the default size of navigation bar is too huge and it occupies a lot of space on the screen. There is a simple way in which you can change the size of it if your phone is rooted.


    Install Xposed Installer. Go to Framework and install neXus navbarz. Then select it and restart the device.


    Open neXus navbarz. Go to navbar options and set navbar height! Restart the phone to see the change!

    Tuesday 26 August 2014

    Google Calendar sync fails after deleting stock calendar app in CM11

    I installed CM11 on my Nexus 4. After I installed Google Calendar, I thought deleting stock AOSP calendar app and few other depending apps wont hurt. Unfortunately Google calendar sync stopped working after that. "Calendars to display" was empty and "Calendars to sync" never completed loading. When I searched for solution for this online, people suggested to do a reset; which I didn't want to do. So I tried reinstalling the default AOSP calendar app. It fixed the problem!!!

    Download the following apks and install them on your phone.


    Some people say that they face the following error while signing in.

    "Couldn't sign in. There was a problem communicating with Google servers. Try again later"

    After installing the above apks, if you open the calendar app directly you will get this error. You have to restart the phone to fix it.

    Thursday 21 August 2014

    Backspace doesn't work on vi in cygwin

    Unfortunately I am forced to use windows at work. So I installed cygwin to run linux commands. While editing using my favourite editor vim; I realized that backspace doesn't work at all! However I found out a simple way to fix it. Add the following line to .vimrc or .virc

    set backspace=indent,eol,start

    Now backspace magically works!

    Later I found out that this is not just in cygwin and is pretty common in unix based systems.

    Monday 18 August 2014

    Beauty of shopt

    shopt is a builtin command which can be used to customize the way you interact with terminal is several ways. Some of them are:

    Ignore typos in path while changing directory

    Say you want to go to /home/alse/path and you type /home/alse/paht instead, the following command will intelligently take you to /home/alse/path

    shopt -s cdspell

    Make commands case insensitive in linux

    To be frank I like case sensitiveness of commands in linux unlike in windows command prompt. It makes you more careful while writing scripts. However I know some people who would like case in-sensitiveness.
    It is possible to do this using shopt command.

    shopt -s  nocaseglob

    Remove the need of 'cd' while changing directory

    Tired of typing cd command before path? Try this

    shopt -s autocd

    Now you can simply type the path to go to that directory.

    Store Multi-line commands in history

    See this blog post

    shopt -s lithist

    Mail warn

    If set, and a file that Bash is checking for mail has been accessed since the last time it was checked, the message "The mail in mailfile has been read" is displayed.

    shopt -s mailwarn

    SIGHUP by default

    Bash will send SIGHUP to all jobs when an interactive login shell exits.

    shopt -s huponexit

    Storing Multi-line commands in history using shopt

    It is hard to reuse multi-line commands as the newlines are replaced by semicolon and the many line command is converted to a single line. For example:

    for i in $( ls *.txt)
    echo $i
    cp $i /bin

    After executing it, when you press up button to reuse it, the command becomes:

    for i in $( ls *.txt); do pwd; echo $i; cp $i /bin; done

    Forget about reusing, I cant even understand what it does when so many things are stuffed in one line!
    I found a way using which it is possible to retain the newlines in history using shopt.

    shopt -s lithist

    Now when you press up button you will see the command in multiple lines! win!

    If you want this to be enabled by default add "shopt -s lithist" at the end of file ~/.bashrc

    Also multi-line commands are screwed up when you add comments. For example

    for i in $(ls)
    echo "a"
    #echo $i

    becomes for i in $(ls); do echo "a" done (note that there is no semicolon after echo "a". Hence it takes echo "a" done as one command). Hence you will end up scratching your head to figure out what went wrong :P

    Can't safely remove USB drive. Device busy!

    We have seen cases where we are not allowed to safely remove or eject USB drive because of the fact that some process is using resources on the drive. The easy way to get out of this is to kill the process which is doing this. For example if the problem is the result of stalled file copying (say, using nautilus) then killall nautilus should do the trick. However it happens that sometimes it is not possible to figure out which process is accessing the USB drive. So how do we find the rogue process(es)?

    fuser to the rescue!

    fuser -k -15 -m  /dev/sdb1

    The above command will kill all the processes accessing your device! Replace /dev/sdb1 with the device file corresponding to your USB device.

    Now try ejecting/ safely removing. It will mostly work! 

    Monday 11 August 2014

    Dry-run package installation without installing them

    Sometimes we might want to perform a 'dry-run' of package installations without actually installing them in order to prevent unwanted changes from happening. It is very much possible and is highly recommended specially while installing packages from untrusted sources. So do this before installing anything:

    $ apt-get install --dry-run [package]

    If you have a debian (.deb) package already and would like to see what changes it is going to make, do this:

    $ dpkg --dry-run -i package.deb

    This will definitely save you someday!

    Friday 8 August 2014

    Send exe files through gmail using steganography

    Mails used to be the easiest way to spread malware. So obviously Gmail doesn't allow users to attach windows executables (.exe) to mails in order to protect it's users from screwing up their windows machines. However, we may have to send .exe files which are not malware via mail. Before, you could've just renamed the extension from .exe to something else or made a zip/rar archive and gmail would simply allow you to attach it. Sadly, it doesn't work anymore as gmail started reading file headers of attachments and started reading files inside zip/rar archives.

    So I figured out a simple way to do this using steganography. The idea here is to embed the exe file inside any image and attach it to the mail. Gmail will think that it is just an image and will be oblivious to the fact that there is an exe file hidden inside that. Later the other user can simply extract the exe file from the image and use it .


    Download mailexe (Don't forget to make it executable).


    $ ./mailexe -e  [exe file] [image file]

    A file called image.png will be created. This image file has exe file hidden in it. Send this via gmail.


    $ ./mailexe -d [original image] [duplicate image]

    A file called output.exe will be created. This is exe file which had to be sent!!!!! Congrats!

    How it works?



    Convert the image and the executable to base64 and save it in a file

    $ base64 [image file] > temp
    $ base64 [exe file] >> temp


    Decode base64 file and save it as image

    $ base64 -d temp > image.png


    Send image.png and the original image file via gmail


    Step 1 

    Download both the images and convert both of them to base64 and extract that base64 part of exe file.

    $ base64 [original image] >original
    $ base64 [duplicate image] >duplicate
    $ diff -ed original duplicate >diffed
    $ tail -n +2 diffed |head -n -1 >exe.64


    Now convert extracted base64 to exe

    $ base64 -d exe.64 > output.exe

    Now you can simply run the exe file.

    Friday 23 May 2014

    Password protect files on fly using crypt-editor

    I always wanted an editor which can help me edit text securely with password protection using which I can easily create, save, edit files on fly. I am sure that there are some editors which can do it. However I felt that instead of an editor, it is better to have an interface which will allow me to edit files using my favorite editor while password protecting it. So I wrote a script called crypt-editor which uses gpg/mcrypt to encrypt and decrypt files enabling users to edit files using any editor.

    Fork me on Github


    Say you want to create/open a file using gedit:
    crypt-editor gedit [filename]
    You will be asked to enter the passphrase. Then gpg/mcrypt decrypts the file (if already exists) and opens it with gedit. On closing the file gpg/mcrypt encrypts it back and deletes the decrypted file.
    If you do not specify the editor, the file is opened in vi editor (my favorite so it is default :P)
    crypt-editor [filename]
    Complete option list of crypt-editor:
    crypt-editor -help
    crypt-editor [filename]
    crypt-editor [editor] [filename]
    crypt-editor [-k key] [filename]
    crypt-editor [-k key] [editor] [filename]
    To create new file with mcrypt instead of gpg use -m option
    crypt-editor -m [filename]
    crypt-editor passwords
    crypt-editor gedit passwords
    crypt-editor -k pa$$word passwords
    crypt-editor -k pa$$word gvim passwords


    Setting up crypt-editor is simple and straight forward.
    git clone
    cp crypt-editor/crypt-editor /usr/bin
    If you want to use mcrypt instead of gpg, you have to install mcrypt.
    apt-get install mcrypt

    Say Thanks to birthday wishes on Facebook automatically

    One of the main reasons why people turn into computer geeks is because they are lazy :P Yesterday was my birthday. Again, thanks for all the wishes :) However I was lazy to manually thank each and every post on my Facebook wall. So I wrote a simple python script using Facebook graph API to say thanks to each of them. I didn't stop there. I am aware that many people think that thanking people manually is something that has always been very tiring. So I searched for all the simpler alternatives available to do this task and found that there was a Facebook app called "Say Thank You". It is simple and neat. However, it requires people to give access to post, like, get friend list..etc. Well, that is a mini privacy invasion :P. So it is a not a good alternative. Also in future Facebook might think that it is doing something against their policies..blah blah blah and bring it down. So not a permanent solution either.
    Hence I decided to rewrite the script I had written in python to javascript to make it accessible online. Well, here it is:

    For this you will need to get the access token. Getting access token is simple:

    • Go to
    • Under Tools in the menu, go to Graph explorer.
    • Click on Get Access Token if access token isn't there already.

    Note that as this runs completely on the client side, users can safely use it without giving access to anybody (Although it requires you to give access token, it is not stored anywhere. See source ). And access tokens expire after sometime.

    Sunday 27 April 2014

    Enable Tree View in Ubuntu 14.04

    I updated to ubuntu 14.04 recently. I was very disappointed when I came to know that the awesome "tree view" was not available in nautilus. I searched online to find if there was any way to get it back. Most suggested to switch to older version of nautilus, which is simply absurd. So I decided to figure out a way myself and I did.
    To switch to tree view first install dconf-editor.

    sudo apt-get install dconf-editor

    Then open dconf-editor. Go to org -> gnome -> nautilus -> list-view and check use-tree-view.

     Now your list view is tree view.

    Friday 14 March 2014

    Unbuffer to the rescue

    Today I was running a c program which had to print lot of text on the terminal. However after some time it execution used to halt which seemed to be for no reason. This happens because whenever you write something to stdout, it stores it into a buffer till the process gets executed completely. To prevent buffering we can use unbuffer. This did the trick for me:

    unbuffer ./a.out 

    Whenever you redirect some command's output to a file, the output is first stored in buffer and then it s written to the file. Sometimes you may want to avoid this. Specially when the command is generating output continuously.

    unbuffer [command] > [file]

    In order to install it on debian or Ubuntu:

    sudo apt-get install unbuffer