Friday, March 4, 2016

ES6 and Babeljs

Introduction

In the implementation of control tool kit we will be using ES6 or ECMAScript6. As the code developed using ES6 is not compilable in browser, we need babeljs to compile it and run it in browser. The development stack discussed below.

What is ES6?

ES6 is ECMAScript 6. It is a scripting language specification created by a committee called TC39. Currently the JavaScript we use for development is basically following ES5. All the modern browsers has support for it with different JavaScript engines, like - V8 (in google chrome). For ES6, the browsers dose not has full support. So if we do code in ES6, browser compilers will through compile time (Syntax) error, as this version of ECMAScript has many new syntactical and implementation level changes, which we will discuss shortly. So, to overcome this and to use new features of ES6, we need some compiler which will take ES6 code as input and give us something browser compliable.

What is Transcompiler or Transpiler?

Transpiler is a tool or engine to compile one source code to another source code. To use ES6 now , we need to use some kind of transpiler to convert ES6 to something browser compliable(e.g ES5). There are several transpiler is market now, which facilitates us to use ES6 now . Babeljs is one such transpiler, which we will be focusing now.

What is Babel?

Babeljs is a transpiler to convert ES6 code to ES5. Babel supports pre and run time compilation. Pre compilation is for compiling our ES6 code to ES5 in the time of project build. For production environment pre compilation is preferable. Runtime compilation is straight forward process to compile your ES6 code to ES5 in the browser itself, which is time consuming for sure and not preferable for practical implementations.

How to convert ES6 to ES5-

As discussed above there are two ways to do it. Lets discuss preferable way first-

Per- compilation of ES6 code using Babeljs.

There is a npm module called babel, which we need to install in our app.

npm install babel

Then it's pretty straight forward to compile the ES6 code to current javasctipt code.

babel script.js

Babeljs also has gulp support. We can use gulp-babel to do the same using gulp build process.

First install it-

npm install --save-dev gulp-babel

In gulp file-

var gulp = require('gulp'); var babel = require('gulp-babel'); gulp.task('default', function () { return gulp.src('src/app.js') .pipe(babel()) .pipe(gulp.dest('dist')); });

It will compile app.js ES6 code files to vanilla JavaScript and put it in dist folder.

Now let's see, how the runtime compilation works. We need to add reference of browser.js in our web page from babel-code folder after npm installation of babel. This will basically convert all the scripts with type text/babel from ES6 to JavaScript (ES5).

<script src="node_modules/babel-core/browser.js"></script> <script type="text/babel"> class Test { test() { return "test"; } } var test = new Test; test.test(); </script>

But as discussed previously, it will make the application perform slowly.
That's all we need to know about babeljs for now.

ES6 Feature

ES6 gives us a true programming language flavor in javascript just like Java, C# and so on. We can utilize all the features like - class, inheritance, anonymous function, scoped variable, string template, destructuring, itaitarator, etc.

Class

More oop type approach than using prototype.

class Rectangle extends Shape {
constructor (id, x, y, width, height) {
super(id, x, y)
this.width = width
this.height = height
}
}
class Circle extends Shape {
constructor (id, x, y, radius) {
super(id, x, y)
this.radius = radius
}
}

Constant

Const variable declaration support

const PI = 3.141593

Arrows

Simplified anonymous function declaration

nums.forEach(v => {
if (v % 5 === 0)
fives.push(v)
})

Get-Set

Like modern language seter and geter method for properties.

class Rectangle {
constructor (width, height) {
this.width = width
this.height = height
}
set width (width) { this._width = width }
get width () { return this._width }
set height (height) { this._height = height }
get height () { return this._height }
get area () { return this.width * this.height }
}
var r = new Rectangle(50, 20)

Block-scoped variables

Variables are now scoped within a code block using let key word.

for (let i = 0; i < a.length; i++) {
let x = a[i]
�
}
for (let i = 0; i < b.length; i++) {
let y = b[i]
�
}

Default Parameter

function f (x, y = 7, z = 42) {
return x + y + z
}

Rest Parameter

'a' can take n number of params and keep it in array of params ,can be accessed by index.

function f (x, y, ...a) {
return (x + y) * a.length
}

New Built-In Methods

Helper methods to do searching , validation , verification with lesser code.

Object.assign(dst, src1, src2)
[ 1, 3, 4, 2 ].find(x => x > 3)
"hello".startsWith("ello", 1) // true
"hello".endsWith("hell", 4) // true
"hello".includes("ell") // true
"hello".includes("ell", 1) // true
"hello".includes("ell", 2) // false
Number.isNaN(42) === false
Number.isNaN(NaN) === true
Number.isFinite(Infinity) === false
Number.isFinite(-Infinity) === false
Number.isFinite(NaN) === false
Number.isFinite(123) === true
Number.isSafeInteger(42) === true
Number.isSafeInteger(9007199254740992) === false

String Interpolation

In build String tinplating. No more - str + val

var customer = { name: "Foo" }
message = `Hello ${customer.name}`

Property Shorthand

Smart way to declare {x:'x',y:'y'}

obj = { x, y }

Method notation

Smart way to declare {x:function(){}} as shown below

obj = {
foo (a, b) {
...
},
bar (x, y) {
...
},
*quux (x, y) {
...
}
}

Modules

Import and export modules just as importing name space.

// lib/math.js
export function sum (x, y) { return x + y }
export var pi = 3.141593

// someApp.js
import * as math from "lib/math"
console.log("2p = " + math.sum(math.pi, math.pi))

Map & Set

let m = new Map()
m.set("hello", 42)
m.set(s, 34)
m.get(s) === 34
m.size === 2
for (let [ key, val ] of m.entries())
console.log(key + " = " + val)

let s = new Set()
s.add("hello").add("goodbye").add("hello")
s.size === 2
s.has("hello") === true
for (let key of s.values()) // insertion order
console.log(key)

Promise

function msgAfterTimeout (msg, who, timeout) {
return new Promise((resolve, reject) => {
setTimeout(() => resolve(`${msg} Hello ${who}!`), timeout)
})
}
msgAfterTimeout("", "Foo", 100).then((msg) =>
msgAfterTimeout(msg, "Bar", 200)
).then((msg) => {
console.log(`done after 300ms:${msg}`)
})

Tuesday, August 26, 2014

How to stop double tap or multi tap problem in android Xamarin

It is a common problem for android or any mobile developer, to stop unwanted multi tap in a button or view. This may cause blockers and crashes also. So, it’s a kind of serious and common issue. To fix this there are multiple solutions you can approach to. You can use timer or you can track down view event or even you can use a flag also. But again you have to change the flag after the button click occurrence. You can assign a different handler after first click. But also again you have to assign the real handler after the click occurs. All these may not give you 100% solution; as well it can be another piece of code for a new error.
Here I found a solution which may solve this issue in much secure and smart way.

Note: Same idea will work for Android Java developers.

Let get in to it-

Step 1: Create SingleClickListener class, with following code.

public  class SingleClickListener
    {
        public SingleClickListener(Action<object, EventArgs> setOnClick)
        {
            _setOnClick = setOnClick;
        }
        private bool hasClicked;

        private Action<object, EventArgs> _setOnClick;

        public void OnClick(object v, EventArgs e)
        {
            if (!hasClicked)
            {
                _setOnClick(v, e);
                hasClicked = true;
            }
            reset();
        }
      
        private void reset()
        {
            Android.OS.Handler mHandler = new Android.OS.Handler();
            mHandler.PostDelayed(new Action(() => { hasClicked = false; }), 500);
        }
    }

Step2: Use it everywhere you need it, in following way-

Button myButton= FindViewById<Button> (Resource.Id.myButton);
myButton.Click += new SingleClickListener( myButtonClickEvent).OnClick;
void myButtonClickEvent (object sender, EventArgs e)
{
//your button click code goes here.
}


That’s it. :)

Friday, August 22, 2014

Android app development start up with Xamarin + C#



When I get to know the about Xamarin , following questions are popping up in my mind. I believe, right now in your mind, same questions are floating in gray cell area. Let’s try to have a brief over view.

Why?
Android app development industry is booming now. That means the market requirement is getting very high. When a development industry grows, it needs more developer. To fill the gap experienced developer need to shift their technical domain. It’s a very challenging situation when a set of developer need to develop a new skill quick and do it efficiently. After working years with a development environment and language, it takes some time span to do the shift. As an example, when a c# developer need to shift from c# and visual studio to Eclipse and java for android development , it is definitely not a smooth transition for them and also require some time. Xamarin is basically is the answer to it.

How it is helpful?
Xamarin provides a development environment which is just same as c# development environment for android app development. Not only android but also iPhone, and windows app can be developed using Xamarin. And the best thing is reusable code. The same code can be used in iPhone, android, windows phone, as we are using Xamarin.
Basically normal c# code is running on its own Mono (.net) framework on the top of android os and talking with hardware. Mono framework officially release in 2004 for linux. Mono is nothing but .net for the environment other than windows.
Java libraries or existing code also can be imported using c# binding. It is really awesome to have this feature. We can use any existing java library created for Android native environment.  Java code will be wrapped by c# code to use in c# Xamarin development. To build android app, we may need access to java widget and sdk. We can expose those using bindings. It will expose any java class or library as per needed. We can use these classes in c# code just as in c# itself. Awesome. J

How it works?
It acts like almost desktop app development for c#.  The compiler is producing IL (Intermediate Language), then package that IL in apk. The apk is running on top of .net mono framework which runs over Andrid os. There is no java involvement in deployment. It runs over Mono and Delvik runtime, which runs parallel in android os. Other things like- view, resources, manifest are maintained as in android native development. These are the simple self explanatory xml files. I will not talk about android development here. Please refer to android development tutorial blogs- http://www.xoriant.com/blog/?s=android+basics

Ok, enough. Now give it a try.

Setting up development environment
Download latest Xamarin from http://xamarin.com and install it.  After you finish, you will get free GUI xamarin studio and visual studio integrated development environment. You can use any of them. Xamarin studio is free, almost feels like visual studio and has intellisense also. If you have visual studio licence, you can use visual studio flawlessly. To run & test the app in simulator you need to use ADT. You can create a virtual device using Android virtual device manager. But it is slower than you can imagine. You can also use third parties, like- Genymotion (faster, but not freeL )

 
Let’s create a project using following instruction-

Open Xamarin studio.


Fellow these steps: File -> New -> Solution
Select Android Application as shown bellow. Provide suitable name to the project and path to save.


 





After saving project, you will get a first view of code, which is basically associated with the views

in xml in “resource/layout” folder. It (MainActivity.cs) is inherited from activity which acts like view controller, just as in android. 
Now as you can see, the code is pretty simple. It is basically associating a click event to a button on view creation time, and printing the number of clicks on the button itself. Run the above code by clicking Run (>) button to see the actual effect on simulator. 

The stage is set for you to play around.  

So you are ready to go further. Create your own native apps using Xamarin.

Further study & ref: 
·         http://api.xamarin.com/
·         http://developer.xamarin.com/samples/android/all/
·         http://www.genymotion.com/