Wednesday, July 20, 2016

Microsoft VScode, new beast in town

Javascript has emerged as a non serious language, a client side language that was meant for just validating the client side and showing the errors as and when required. But from past few years it is emerging more of a serious language and also is getting more and more advanced as well as more matured.

While competing with already available, settled and matured languages like Java, Php and .Net the requirement for an IDE is must. Also its becoming a prominent factor for the success of any language that how good the support of it is available via IDE.

I still remember my old college days when people say that coding in .Net is so much fun then in Java since in my college using any IDE for Java is strictly prohibited. In a way or the other it was pretty good since using the text editor to code gives you more insight view of the language. But yeah when the language roars over newbie, IDE is the only saviour.

Some of the things that I feel for an IDE to provide includes better RAM management, ease of use and one of the most important being light in nature both in case of speed and weight, :D.

If you have worked on the IDE's like Eclipse, Netbeans, Webstorm and .Net Visual Studio you might have faced the issue where your whole PC gets slows down and not able to even play a simple song in VLC.

For all those guys who don't need hell lot of features rather just needs an editor that gives you features of an advanced editor with very few but important features like plugin, github and last but not the least lint support. For all those Microsoft VsCode editor is like a blessing.

It has almost everything that you thinks of.

Some of the most promising features are:
  1. It is very small in size, just 30-35 mb
  2. It is light in nature
  3. It supports github by default
  4. Supports plugins
  5. It supports linting, tested javascript linting via a plugin called jshint, can be found here
  6. Last but not the least, and most imoprtant it is FREE, yes you heard it right it is free.
I have been using this IDE and really found it quite fascinating to work with.

Here is the view that you get when you first open the VsCode after installation.


The support to github comes by default.

One more feature which I really liked is the ability to create snippets, that means you can create short hands that on being used expands itself and saves your lot of time. 

Let me tell you how a basic snippet in case of Javascript can be created. Lets think you want to create a snippet for :
  • console.log(""); with the shorthand of cl
that means when you type cl and press enter, it will be expanded in to console.log("|"); and your cursor is being blinking at |

For this you have to follow: 
  1. open File->Preferences->User Snippets->Select Javascript
  2. It will open a file named javascript.json. Add the following into that file.
    {
       "Print to console" : {
          "prefix" : "cl",
          "body" : [
              "console.log('$1');"
          ],
          "description" : "Logs output to console"
       }
       //more snippets can be added here
    }
  3. In the above Json, 
    • Print to console -> name of the snippet
    • prefix -> shortcut
    • body -> by what prefix is going to be replaced with
    • $1 is the first position of the cursor after the snippet is expanded, you can keep as many pointers and the cursor will follow them via ENTER or TAB
  4. One more feature is that code snippet in VsCode supports the placeholders as well like in case of:
    {
       "Print to console" : {
          "prefix" : "hello",
          "body" : [
              "Hello ${name:Enter your name}.",
              "Goodbye ${name}!"
          ],
          "description" : "Logs output to console"
       }
       //more snippets can be added here
    }
    when we type hello and press enter it gets changed to:
  5. As soon as you start typing a string the place holder in line number 3 starts updating, these helps a lot while you have to do the same stuff again and again as in case of loop this might be useful like:
    {
       "For Loop": {
             "prefix": "for",
             "body": [
                 "for (var ${index} = 0; ${index} < ${array}.length; ${index}++) {",
                   "\tvar ${element} = ${array}[${index}];",
                   "\t$0",
                 "}"
             ],
             "description": "For Loop"
         }
    }
I hope you all liked this post do share comment like and subscribe, happy coding and keep smiling, thank you.
:)

Tuesday, July 19, 2016

Alias Creation in Linux

We all uses commands to do the stuff in any OS. We often face situations where we have to issue the same commands again and again in order to do the stuff.

For instance we might face the situation in which we have to come to a particular directory and have to issue the commands. Also there might be case that the command issued have to be keep running and because of which we have to open another terminal and have to issue other command but in the same directory in which the last command is issued.

For those type of things there is a trick of creating the alias in Linux OS.

Now before going forward let me explain you what does ALIAS means?
    In simple language, Alias is a shortcut to do some specific stuff.

Lets try to create one alias that takes you to the specific directory. For example, your working directory is ~/user/work. And you have to issue all the commands in this specific directory. In that you have to open a terminal and always have to issue a command that looks like this:
  • cd /home/user/work
For this we will create an alias named cdw (change directory to work, for instance).
  • Open the bashrc file for the user to whom you have to provide alias for.
    • vi ~/.bashrc
  • Come to insert mode and add the following line at the end of the file with following syntax.
    • press i to come to insert mode
    • Add following at the end:
      • alias cdw='cd /home/user/work'
  • Save and exit the vi editor.
    • press ESC, then :wq then ENTER 
  • Exit the terminal and reopen new terminal to get the new settings.
The commands used are self explanatory and tells that the name of the alias would be cdw which will redirect you to the /home/user/work directory.

Using above steps will create an alias and makes your life a bit easier.

Happy coding to you all.  :)

Tuesday, May 24, 2016

Getting MotoG active display without Root

Hey guys, I am starting a new series of introducing some of the very cool apps of Android.

Today I am going to review an app that will emulate MotoG Active Display feature. The app is ACDisplay.

Here are steps to install ACDisplay and make it look alike Active Display.
  1. Install it using the play store, link.
  2. After installation open it.

  3. Clicking the yellow mark will tell you what all permissions you have to give AcDisplay.


  4. Give all the permissions to it, namely Device Administrators and Notification Access.

      
  5. Device Administrators is required to lock the Device and Notification Access is required so that you can read all the notifications(although you can configure it, which Apps you don't need).
  6. You are almost done (yellow mark is also gone), after you give the permissions your basic setup is ready to use.
  7. Enable the global button on the top right hand corner.

  8. This will enable the app. Now lets change some config. 
  9. Settings will have 2 sections:
    1. Features
      1. LockScreen
        1. Go to this and enable it on the top right hand corner, this will make this as the lock screen
        2. Check Enable when no notifications if you want to show it irrespective of whether there are 0 notifications or more than that.
      2. Active Mode
        1. Go to this and enable it on top right hand corner, this will give you options for the behavior of the AcDisplay, wave to wake, disable on low battery etc.
    2. Settings
      1. Notifications
        1. This will give you the option what to do with the notification, like wake up or not on arrrival of new notification, to show always on notifications or not etc.
      2. Interface
        1. This will give you the option to use the desktop wallpaper as background for this lock screen, animation, colors etc.
      3. Apps
        1. This will be useful to blacklisting the app, that means app which you don't want to show the notifications for.
      4. More
        1. This gives you the option when to make this app active, only on charging or everytime, inactive hours (for which app will be in sleep), shortcuts like lower left hand shortcut, lower right hand shortcut etc.
  10. After then when you lock the device and wake it up, AcDisplay will spread its magic, but the main problem is that it just disappears if you press the home button, and comes to home screen, so in order to solve that we will pattern protect our phone via default locker. 
  11. For that go to Settings->Lock Screen->Screen Lock->Pattern and give the pattern, confirm it.
  12. Enable :
    1. Directly Show pattern view, 
    2. make pattern visible
    3. show pattern error
    4. show pattern dots
  13. Set automatically lock to immediately, enable power button instantly locks
  14. At last we will disable notifications in lock screen, since our notifications will come at AcDisplay, for that Settings->Notifications->When device is locked->Don't show notifications at all
  15. Now lock the screen, and whenever notification come, depending on the wake up setting of the AcDisplay, mobile will lighten up, and show the notification very similar to the Moto Active Display, tap the small icon and read the notification, tapping after selecting the notification will take you to the app itself, but before that you have to give correct pattern.

Notes:

  1. The AcDisplay best works with default lockscreen, do not use with other lock screens.
  2. Don't forget to set the pattern or pin or password lock for default lock since pressing the menu button bypasses the AcDisplay screen.
  3. It acts as a module of Xposed as well, which is an optional setting, you can enable it in Xposed Module, modules section, if your Xposed module is setup, that means both rooted and Xposed installed and configured.

Monday, May 16, 2016

Remove duplicates from sorted array.

There are a number of approaches when it comes to remove the duplicates, from the array. Here are some of them:

  1. Make a Set out of the array so that you have only the unique elements out of it, also considering the further point if you want to keep track of the order of the elements you can use LinkedHashSet that guarantees the uniqueness as well as order of the Collection.
  2. Next approach is bit granular and we traverse the array and keeps on pushing the pointers till I am getting the same element:
    1. Start with 2 pointers first marked at 0 (since it is an array, lets name it as f) and second marked at 1(lets name it as s).
    2. Keep incrementing the second pointer till the elements at ARRAY[f] and ARRAY[s] are equal.
    3. When above condition is false make ARRAY[f] = ARRAY[s] and increment both f and s since the position of f and s are traversed.
Coming to the implementation, here is the working code.

This is the code you can find the running code here.

import java.util.*;
import java.lang.*;
import java.io.*;
 
class Ideone
{
      public static int[] duplicatesRemoval(int[] input){
 
        int f = 0;
        int s = 1;
        //RETURN IF THE ARRAY LENGTH IS LESS THAN 2;
        if(input.length < 2){
            return input;
        }
        while(s < input.length){
            if(input[s] == input[f]){
                s++;//
            }else{
             /*
             **THIS PART CAN BE SHORTENED BY input[++f] = input[s++];
             */
             f++;//SINCE LAST POSITION IS 1 BACK TO CURRENT ONE
                input[f] = input[s];
                s++;//SINCE s POSITION IS ALREADY TRAVERSED SO INCREMENT IT
            }   
        }
        //reassigning to new array element
        int[] result = new int[f+1];
        for(int k=0; k<result.length; k++){
            result[k] = input[k];
        }
 
        return result;
    }
    public static void main(String a[]){
        int[] input = {2,3,6,6,8,9,10,10,10,12,12};
        int[] output = duplicatesRemoval(input);
        for(int i:output){
            System.out.print(i+" ");
        }
    }
}

Wednesday, May 11, 2016

Next greater number with same set of digits

This is pretty interesting question I came across when facing an interview.

The question was pretty straight forward, you have given a number and you have to find the next greater number with the same set of digits as in the given number. So for an instance if Number is:
  1. 1234 then output should be 1243
  2. 4321 then output should be not possible since its the largest among all the possible numbers with the same digits as in 1234
  3. For other cases we have to develop the algorithm (:D).
Now coming to the solution of this problem, one straight forward algorithm would be:
  1. Find all the possible combination of the string (given number) and collect it in a Sortable Collection like TreeSet and take the next element after the given number. This is pretty straight forward approach but it is waste since we have to calculate the full set of numbers that are possible to get generated and then find the next number in the TreeSet. This is simple to understand but memory wise, order wise and space wise pretty heavy.
    Although I have given this answer only :D, but the interviewer was happy with it at all. Since there are better approaches to this.
  2. Next approach is pretty simple but a bit difficult to understand. Here it goes:
    1. First 2 condition will be same as the ascending and descending one.
    2. If the case is different then we will :
      1. take pair of digits from right where right digit is greater then left digit, and mark the index to be right digit index - 1.
      2. Then we have to take the smallest digit from the right hand side digits of the marked index which is greater then the indexed digit
      3. Then sort the right side of the index digit in ascending order.
      4. What, what what :D
    3. Lets take an example: 54362
      1. In this example start from the right in pair, (2,6) [we will ignore since 2<6] and move to next pair that is (6,3). This is correct pair since 6>3.
      2. So our marking index would be 2 and the number to be updated is 3.
      3. Now taking the number which appears in right side of index number(ie 2) and is smallest among them but larger then 3.
      4. In this case it is 6 only since 2 is smallest but 2>3 is false.
      5. So we swap 3 and 6 which will make the number as 54632 and sort the right hand of index(2) that means numbers 3,2 have to be sorted which is true in this case.
Lets make the program of this. Here it goes:

MyData.java
import java.util.Arrays;

/**
 * @author ankur
 *
 */
public class MyData {

 private int n;
 private int nAsc;
 private int nDesc;
 private int[] nIntArr;
 private int length;
 
 private String sAsc;
 private String sDesc;
 
 
 public MyData(int n){
  this.n = n;
  
  process();
 }
 
 private void process(){
  String s = "" + this.n;
  char [] sArr = s.toCharArray();
  
  nIntArr = new int[sArr.length];
  for(int i=0, len=sArr.length; i<len; i++){
   nIntArr[i] = Integer.parseInt("" + sArr[i]);
  }
  Arrays.sort(sArr);
  sAsc =  new String(sArr);
  sDesc = new StringBuffer(sAsc).reverse().toString();
  nAsc = Integer.parseInt(sAsc);
  nDesc = Integer.parseInt(sDesc);
  length = this.sAsc.length();
 }
 
 public int getN() {
  return n;
 }
 public void setN(int n) {
  this.n = n;
 }

 public int getnAsc() {
  return nAsc;
 }

 public void setnAsc(int nAsc) {
  this.nAsc = nAsc;
 }

 public int getnDesc() {
  return nDesc;
 }

 public void setnDesc(int nDesc) {
  this.nDesc = nDesc;
 }

 public String getsAsc() {
  return sAsc;
 }

 public void setsAsc(String sAsc) {
  this.sAsc = sAsc;
 }

 public String getsDesc() {
  return sDesc;
 }

 public void setsDesc(String sDesc) {
  this.sDesc = sDesc;
 }

 public int[] getnIntArr() {
  return nIntArr;
 }

 public void setnIntArr(int[] nIntArr) {
  this.nIntArr = nIntArr;
 }

 public int getLength() {
  return length;
 }

 public void setLength(int length) {
  this.length = length;
 }
 
 
}

Main.java
package com.av.ngnsd;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class Main {

 public static void main(String[] args) {
  MyData myData = new MyData(54362);
  try{
   int nextNum = process(myData);
   System.out.println("Next number is " + nextNum);
  }catch(Exception ex){
   //ex.printStackTrace();
   System.out.println(ex.getMessage());
  }
 }
 public static int process(final MyData n) throws Exception{
  int result = 0;
  int nDesc = n.getnDesc();
  int nAsc = n.getnAsc();
  if(nDesc == n.getN()){
   throw new Exception("Not possible");
  }else if(nAsc == n.getN()){
   String s = "" + nAsc;
   result = Integer.parseInt(s.substring(0, s.length()-2) + "" + s.charAt(s.length()-1) + s.charAt(s.length()-2));  
  }else{
   //TODO the main code
   int []nCharArr = n.getnIntArr();
   int indexOfChange = -1;
   for(int i=n.getLength()-1; i>0; i--){
    if(nCharArr[i]>nCharArr[i-1]){
     indexOfChange = i;
     break;
    }
   }
   
   if(indexOfChange <= 0){
    throw new Exception("Not possible");
   }
   else{
    int numberToBeSwapped = nCharArr[indexOfChange-1], smallestIndex = indexOfChange;
    //getting the smallest among the right side of the index which is greater then index digit
    for(int i=indexOfChange+1; i<n.getLength(); i++){
     if(numberToBeSwapped < nCharArr[i] && nCharArr[i] < nCharArr[smallestIndex] ){
      smallestIndex = i;
     }
    }
    
    //swapping the 2 digits
    int temp = numberToBeSwapped;
    nCharArr[indexOfChange-1] = nCharArr[smallestIndex];
    nCharArr[smallestIndex] = temp;
    
    //for sorting the right hand side of the index
    List<Integer> nArrayList = new ArrayList<Integer>();
    for(int i=indexOfChange+1; i<n.getLength(); i++){
     nArrayList.add(nCharArr[i]);
    }
    
    //int indexOfChangeCopy = indexOfChange;
    Collections.sort(nArrayList);
    for(int num:nArrayList){
     nCharArr[++indexOfChange] = num;
    }
    StringBuilder strNum = new StringBuilder();
    for (int num : nCharArr) 
    {
         strNum.append(num);
    }
    result = Integer.parseInt(strNum.toString());
   }
  }
  
  return result;
 }
 
}


Sunday, April 17, 2016

Installing gnome and enabling all windows in top bar

Ubuntu comes with the default launcher as Unity Launcher that looks like this:


Now this launcher is pretty but if you want the Gnome desktop you can continue or else press the (X) button :D .
  1. For installing the Gnome desktop, we first install tasksel, that is pretty useful in order to install many packages.
  2. For that go to Ubuntu Software Center and type tasksel
  3. Install the package and run using sudo tasksel 
  4. Pressing arrows you can navigate and pressing space bar can check/uncheck the package
  5. Go to Ubuntu Gnome desktop and press space bar to select it and pressing tab will take you to ok at the bottom.
  6. Press space bar being at OK
  7. Wait till the package is installed and after that restart the system using either command or either via UI.
  8. When you restart the system you will find out that now your desktop is changed to Gnome.
Now the problem with gnome (or feature) is that it only shows the active window in the top bar and not all the windows that are opened. In this pic although there are 3 windows opened but only one is showing in the top bar in left corner which is active one:

In order to do get all the windows we have to install the extension and enable it to work with GNOME desktop.

Extensions are very useful in extending the functionality of the Gnome desktop. 

The extension we need for showing all the opened windows in the top bar is YAWL, which you can get here
  1. sudo apt-get install gnome-common autoconf autogen automake intltool libglib2.0-dev
  2. cd /path/to/where/you/want/subdir/with/yawl
  3. git clone https://github.com/dbfin/gnome-shell-extension-yawl
  4. cd gnome-shell-extension-yawl
  5. ./install-extension yawl
Once this is done, this means that you have installed the extension but till now didn't enabled it. For enabling the extension we have to install the gnome-tweak-tool, which is capable of tweaking the settings of Gnome desktop. For installing gnome-tweak-tool use:
  1. sudo apt-get install unity-tweak-tool gnome-tweak-tool
Once this is done you can start it using sudo gnome-tweak-tool .
Go to extensions, scroll to Yawl and enable it once that is enabled you have all the windows and favorites available at the top bar


This will give you all the opened windows at the top bar including the favorites.

Also in some cases you might see the message that the extension is not compatible with shell version, this is because as the shell is updated their might be the chance that extension might not support that change in that cases we have to switch off the default feature of the gnome that checks for the compatibility of the extension by the command:

gsettings set org.gnome.shell disable-extension-version-validation "true"


Phew this was a pain in my case since I have actually searched a lot in order to all these things. Hope this helped you all :) .

Creating a node module and using it

As you all knows, Node is getting better day by day and also there is an option of using node modules that are generated by other developers and are available to use.

Also, there is no good in making a Node project without user defined modules or in other words I can say that there is not possible (all though you can create a single module project but that is of no use) to generate the project in which you do not create the modules.

So, going forward Node modules are just the way of exposing a functionality from a Node file so that you can use that in other functions. For instance you want to create a calculator in Node js and for that you have decided that there would be four different modules namely add, subtract, division and multiply so that you can control them very gracefully and also tracing bugs would be easy since there are individual modules so when the bug got traced you can easily go to specific module in order to debug it.

So in order to do that, follow the steps:
  1. lets create a folder named node-calculator, for that browse to your docs and create a new folder either through right click and new folder or from shell using
    $ mkdir node-calculator 
  2. Go inside the folder using cd node-calculator and create one more directory named my_modules using :
    $ mkdir my_modules
  3. Now our basic setup is ready so we will code the things.
  4. Let us first create a module named add. 
  5. For that we will create a directory inside my_modules named add
  6. We will create a file inside add folder named index.js with following contents:
    var addition = function(a,b){
      return a+b;
    }
    
    module.exports = {
      addition_two_numbers  : addition 
    }
  7. In this the function addition is pretty simple and in order to expose that function to be useful in other files we have exported it with the name, addition_two_numbers
  8. Now create a file in node_calculator directory named calc.js with following contents:
    var add_module = require("./my_modules/add");
    console.log("Add module ", add_module.addition_two_numbers(2,2));
    
  9. Similarly create other modules named div, sub and mul. 
  10. Now the tree node-calculator command to see the contents and you will see something like this :
For your information:
  1. Code is available here
  2. The output shown at step 10 is of the command tree node_calculator
  3. If you don't have the tree command you can get it by:
    apt-get install tree
  4. In order to run the file use the node filename.js .
So for us it would be node calc.js and you will get the answer 4.