Saturday, October 19, 2013
Saturday, June 15, 2013
Lost In Life...
Here comes the light of the day,
Day, a fresh start with many duties,
Duties, that decides prosperity of life,
Life, no one remembers or cares till they see death,
Death, what no one wants or expects but it comes like a light,
Light, But I see lights moving fast on the roads at night,
Night, I was thinking sitting aside while relaxing, what actually we are doing on our Life,
Life, here it comes again But still no one feels except the rivalry
Tuesday, February 28, 2012
Cast of Dynamic Server-Side Invocation
In this post it will just be a discussion on the topic mentioned.
Earlier it was simply client asks something from server and server returns it back. Only if client made a request, server processed it. This still exists in many web applications. But if consider many web applications like Facebook, Twitter & even Google apps, even without user interaction sometimes server makes notifications to user if any. 'If any' is much important otherwise constant checking on server-side update from apps in client-server architecture is not efficient as it consumes considerable system resources repeatedly and less scalable.
Few concepts and technologies for server-side invocation is listed and discussed below.
Ajax
If you intend to use ajax for server-side invocation, as a developer you have to think twice. Most occasionally think is this what you are really expecting.
Something to be alert
Ajax is a variation of java script. It dynamically pulls data from server side hiding in client side web apps. It also leverage asynchronous interaction as it runs in background without blocking client side. That is where it differs from typical java-script. Therefore be noted that AJAX does not define new kinds of HTTP requests or anything else. It just performs a HTTP request in the background by using
Therefore in Ajax as it does not help to pull data to client, but just polling data from server, in an application like web mail client, logic will be like constant checking on server-side update & poll the results. This polling approach causes an event latency which depends on the polling period. Increasing the polling rate reduces event latency. The downside of this is that frequent polling wastes system resources and scales poorly. Most of the time this result can be empty as no sense on real-time updates.
Comet
Comet (aka Comet programming) is a web application model in which a long-held HTTP request allows a web server to push data to a browser, without the browser explicitly requesting it. Comet attempts to deliver “push” communications by maintaining a persistent connection or long-lived HTTP request (long poll) between the server and the browser. Like AJAX, Comet is build on the top of the existing HTTP protocol without modifying it.
Two things to know about HTTP
As in general HTTP, client sends request to server, but server does not reply immediately. This is because of event driven process handling. Only if an event occurs in server-side, server will response including the event data. After receiving the response containing the event data, the client will send a request again, waiting for the next event. There is always a pending request which allows the server to send a response at any time.
HTTP Streaming (aka HTTP server push)
Server keeps the response message open. In contrast to long polling the HTTP response message (body) will not be closed after sending an event to the client. If an event occurs on the server-side, the server will write this event to the open response message body. The HTTP response message body represents a unidirectional event stream to the client.
Finally all these mechanisms run on top of existing HTTP. Only thing is they have been adapted to keep a live connections from server to client.
HTML5
Comet programming has been achieved in HTML5 by using Server-Sent Events (SSE). Browsers which support HTML5 & SSE open an HTTP connection for receiving data from server side push notifications. This implicitly managed by underling SSE API. Server-Sent Events includes the new HTML element
The
SSE are based on HTTP streaming. SSE has performance drawbacks with respect to some existing protocols but yet potential to be become the dominant protocol for use cases such as just a unidirectional server push channel is required. The Sever-Sent Events protocol is much simpler. No handshake protocols have to be implemented. Just send the HTTP
Earlier it was simply client asks something from server and server returns it back. Only if client made a request, server processed it. This still exists in many web applications. But if consider many web applications like Facebook, Twitter & even Google apps, even without user interaction sometimes server makes notifications to user if any. 'If any' is much important otherwise constant checking on server-side update from apps in client-server architecture is not efficient as it consumes considerable system resources repeatedly and less scalable.
Few concepts and technologies for server-side invocation is listed and discussed below.
Ajax
If you intend to use ajax for server-side invocation, as a developer you have to think twice. Most occasionally think is this what you are really expecting.
Something to be alert
Ajax is a variation of java script. It dynamically pulls data from server side hiding in client side web apps. It also leverage asynchronous interaction as it runs in background without blocking client side. That is where it differs from typical java-script. Therefore be noted that AJAX does not define new kinds of HTTP requests or anything else. It just performs a HTTP request in the background by using
XMLHttpRequest API.Therefore in Ajax as it does not help to pull data to client, but just polling data from server, in an application like web mail client, logic will be like constant checking on server-side update & poll the results. This polling approach causes an event latency which depends on the polling period. Increasing the polling rate reduces event latency. The downside of this is that frequent polling wastes system resources and scales poorly. Most of the time this result can be empty as no sense on real-time updates.
Comet
Comet (aka Comet programming) is a web application model in which a long-held HTTP request allows a web server to push data to a browser, without the browser explicitly requesting it. Comet attempts to deliver “push” communications by maintaining a persistent connection or long-lived HTTP request (long poll) between the server and the browser. Like AJAX, Comet is build on the top of the existing HTTP protocol without modifying it.
Two things to know about HTTP
- HTTP protocol is not designed to send unrequested responses from the server to the client.
- A HTTP response always requires a previous HTTP request initiated by the client.
Long Polling
As in general HTTP, client sends request to server, but server does not reply immediately. This is because of event driven process handling. Only if an event occurs in server-side, server will response including the event data. After receiving the response containing the event data, the client will send a request again, waiting for the next event. There is always a pending request which allows the server to send a response at any time.
HTTP Streaming (aka HTTP server push)
Server keeps the response message open. In contrast to long polling the HTTP response message (body) will not be closed after sending an event to the client. If an event occurs on the server-side, the server will write this event to the open response message body. The HTTP response message body represents a unidirectional event stream to the client.
Finally all these mechanisms run on top of existing HTTP. Only thing is they have been adapted to keep a live connections from server to client.
HTML5
Comet programming has been achieved in HTML5 by using Server-Sent Events (SSE). Browsers which support HTML5 & SSE open an HTTP connection for receiving data from server side push notifications. This implicitly managed by underling SSE API. Server-Sent Events includes the new HTML element
EventSource as well as a new mime type text/event-stream which defines an event framing format.
var source=new EventSource("EventGen.php");
source.onmessage=function(event) {
document.getElementById("result").innerHTML+=event.data;};
The
EventSource represents the client-side end point to receive events. The client opens
an event stream by creating an EventSource, which takes an event source URL as its
constructor argument. The onmessage event handler will be called each time new data is
received. The valid header defined by SSE spec is text/event . However a valid Server-Sent Events implementation has to support the mime type text/event-stream at minimum.Therefore from server-side explicitly define header type to text/event-stream. SSE are based on HTTP streaming. SSE has performance drawbacks with respect to some existing protocols but yet potential to be become the dominant protocol for use cases such as just a unidirectional server push channel is required. The Sever-Sent Events protocol is much simpler. No handshake protocols have to be implemented. Just send the HTTP
GET request and get the event stream. Furthermore Server-Sent Events will be supported natively by all HTML5-compatible browsers.Wednesday, December 14, 2011
MongoDB : Remote Access - Part 2
As stated in previous post on MongoDB, once installed, user can verify by opening shell & by typing mongo. It will by defualt connect with the table test (which is not a one you created obviously) like below if everything worked properly during installation.
MongoDB shell version: 1.4.3
Wed Nov 23 14:31:29 ***
connecting to: test
>
Wed Nov 23 14:31:29 ***
connecting to: test
>
Before moving on to remote access, better to know few very basic commands to check what you really wants to know. Type show dbs which will show what are the existing databases. Then if you want to use existing one or new one type use dbname which will not create a database at the exact moment but on the fly if it does not exist. In mongodb table is considered a collection. Actually here, this is not exact same as the table in RDBMS but for clarity consider it is so. For to view all the collections in used database type show collections & to use one, type use collectionname. To view all the data inside of selected collection, type db.collectionname.find(). Here in mongodb, once you selected a database, when querying with collection you always has to use the reference of the database with query. That is why you have to use db.$what_ever_the_bla_bla next. You can find sql to mongodb mapping relationship page here.
Now let's move to setting up a remote connection to a mongodb server. It is better to have two terminals. One to start server & listening on incoming requests. Second to locally execute & view whether remote calls have worked (optional).
To start server
1. Create a directory structure in root
sudo mkdir -p /data/db
sudo mkdir -p /data/db
2. Grant user permission to it
sudo chown `id -u` /data/db
3. Run mongo server to listen on incoming connections
mongod
sudo chown `id -u` /data/db
3. Run mongo server to listen on incoming connections
mongod
You will noticed that sever is starting & saying it is listening on port as indicated in below image.
Then do the following.
4. Find mongodb PID & kill it.
ps -eF | grep 'mongo\|PID'
ps -eF | grep 'mongo\|PID'
5. You can see in first shell image, I have executed this command & obtained the ID 1143. Next is to kill that process.
sudo kill “PID_VALUE”
Re-run the mongodb server: mongod
This is because if mongodb was installed using sudo apt get install, it will always run each time machine reboots. Therefore before server starts up, already running process has to be killed. Then server will start properly and keep on listening for incoming connections. To connect to a remote server simply type mongo remoteIPaddress after starting the mongodb server on both sides.To get mongodb execution status use sudo status mongodb
From now on there are plenty of enough resources available to continue with mongodb. Go after & enjoy the power of mongo.
Monday, December 12, 2011
MongoDB | Document Oriented, No SQL open source database - Part 1
OBJECTS. It is all about dealing with objects. That is, storing them, retrieving them back, updating them PLUS encoding, efficient indexing, replica managing etc. Typical object can have its own as well as inherited feature sets. These can be considered as key value pairs like below.
{ "username" : "bob", "address" : { "street" : "123 Main Street", "city" : "Springfield", "state" : "NY" } }
Above is an example of simple nested JSON object. When remote method invocation or
inter process communication happens, by using this kind of mechanism to send data
can be more convenient. When received, by querying, storing data back in SQL
databases is not needed if there exits a secure, storage effective document
oriented querying language. That is where MongoDB fits with BSON format. It is a cross language database system yet to come with more features. BSON helps to store JSON objects as binary objects which reduce size & increase indexing & retrieving performance.
In this post, a simple working scenario for successfully installing mongoDB
on Linux based operating system (basically on Ubuntu 10.10) will be discussed.
Installation
1. Add MongoDB repository into Ubuntu assuming installed ubuntu version is 10.10
Add below line any where of source.list file.
1. Add MongoDB repository into Ubuntu assuming installed ubuntu version is 10.10
Add below line any where of source.list file.
deb http://downloads.mongodb.org/distros/ubuntu 10.10 10gen into /etc/apt/source.list.
2. Create PGP key and Install MongoDB
We need to generate key to gain access into MongoDB repository.
Use sudo apt-key adv --keyserver keyserver.ubuntu.com --recv 7F0CEB10 to get keyserver
Then do sudo apt-get update to update your repository.
3. Do sudo apt-get install mongodb-stable to install mongoDB into your Ubuntu.
If that didnt work, use just sudo apt-get install mongodb instead of -stable
Test by run command mongo and you will get MongoDB shell version
Now we have to configure mongoDB with PHP Driver so that you can interact with mongoDB programetically via server-side scripting language.
4. Configure MongoDB PHP Driver
Before configure mongoDB PHP driver, first need to have build-essential, php5-dev and php-pear.
To install those:
sudo apt-get install build-essential php5-dev php-pear
**remember to tick on first two updates in software updates/updates in synaptic package manager. Otherwise system will not download all the packages needed & later steps will fail.
5. Then install pecl driver for mongo (For connecting with PHP)
sudo pecl install mongo
6. Add Mongo Extension into php.ini
In the end of line, add extension=mongo.so into /etc/php5/apache2/php.ini.
7. Restart apache by
sudo service apache2 restart
8. Check with phpinfo() to see if MongoDB already installed.
From next post, How to get remote accessibility by starting mongoDB server & checking it out via remote mongoDB terminal will be discussed.
Good Luck :)
2. Create PGP key and Install MongoDB
We need to generate key to gain access into MongoDB repository.
Use sudo apt-key adv --keyserver keyserver.ubuntu.com --recv 7F0CEB10 to get keyserver
Then do sudo apt-get update to update your repository.
3. Do sudo apt-get install mongodb-stable to install mongoDB into your Ubuntu.
If that didnt work, use just sudo apt-get install mongodb instead of -stable
Test by run command mongo and you will get MongoDB shell version
Now we have to configure mongoDB with PHP Driver so that you can interact with mongoDB programetically via server-side scripting language.
4. Configure MongoDB PHP Driver
Before configure mongoDB PHP driver, first need to have build-essential, php5-dev and php-pear.
To install those:
sudo apt-get install build-essential php5-dev php-pear
**remember to tick on first two updates in software updates/updates in synaptic package manager. Otherwise system will not download all the packages needed & later steps will fail.
5. Then install pecl driver for mongo (For connecting with PHP)
sudo pecl install mongo
6. Add Mongo Extension into php.ini
In the end of line, add extension=mongo.so into /etc/php5/apache2/php.ini.
7. Restart apache by
sudo service apache2 restart
8. Check with phpinfo() to see if MongoDB already installed.
From next post, How to get remote accessibility by starting mongoDB server & checking it out via remote mongoDB terminal will be discussed.
Good Luck :)
Friday, October 28, 2011
J2ME, Symbian C++, QT or Android :: Why & Where?
"Once upon a time there was a language called J2ME", you will not be surprise if you hear this few years later. But it should not be forgotten that each of these languages have its own context or domain which can vary according to the needs of the customer.
Why & Where...
A well known truth about J2ME is that it is a sandbox language. I.e. It always needs to stand on top of a another language stack (OS) & hence J2ME is always restricted to access some kernel level functionalities of limited devices because of this 3rd party behavior. For instances one can not write an app which can be auto-started in device boot up without using some other party interaction like push registry. Of course by using push registry one can write an app which will auto-start but via a timer, sms or http like interaction signaled by an outsider. Therefore without any interaction auto-start in boot up is impossible in J2ME. Another scenario is accessing device key pad for locking and unlocking purposes is also impossible as J2ME is not allowed to access locking API of the device. Actually J2ME does not even has such an API for locking. One more thing to notice is that every mobile device has a settings programme which is responsible for managing installed applications. In J2ME context you can never write an app to get the control of this settings app which is silently handled as a device kernel level programme.
As mentioned the primery reason for this is J2ME is a third party language pre-configured and installed on top of another core language stack of the device. For example simply consider Nokia mobile phone which claims to support for J2ME. But the fact is Nokia has its own language stack as the core of the device called Symbian. Symbian OS has its own rich APIs to directly interact with hardware level and other core functionalities of the device. Symbians S40, S60, Symbain 3 are examples for such Symbian OS APIs equipped with SDKs to leverage developers for developing apps. Both the carbide.C++ and the later added framework called QT C++ can be used for writing applications for Symbian OS. Above mentioned impossible scenarios in J2ME can be achieved via these two implementation frameworks.
But as J2ME hides internal complexities from developer, for developing some typical enterprise level apps, J2ME is apparently efficient and easier than using Carbide or QT. Hence language depends on requirements as always. Focusing on Android here is irrelevant because it is that big buzz word everybody talks about these days. To be it as this much of huge buzz, its complete OS stack has played an incredible role. Because of this perfect organization from ground level APIs to higher level APIs in its OS stack, developers have been able to develop apps without considering dependencies, hardware abstractions, library couplings etc. But there is an one little problem with Android. I.e. its fast growing development life cycle. Not like any other OS versions of other devices, Android does not provide long term service for once released version. They tend to grow fast and if earlier version can not tolerate with the later version, bad luck for the users those who have that earlier version of device. But generally people rarely open their mouths up on this.
Therefore Why and Where is a decision made by developers.
Why & Where...
A well known truth about J2ME is that it is a sandbox language. I.e. It always needs to stand on top of a another language stack (OS) & hence J2ME is always restricted to access some kernel level functionalities of limited devices because of this 3rd party behavior. For instances one can not write an app which can be auto-started in device boot up without using some other party interaction like push registry. Of course by using push registry one can write an app which will auto-start but via a timer, sms or http like interaction signaled by an outsider. Therefore without any interaction auto-start in boot up is impossible in J2ME. Another scenario is accessing device key pad for locking and unlocking purposes is also impossible as J2ME is not allowed to access locking API of the device. Actually J2ME does not even has such an API for locking. One more thing to notice is that every mobile device has a settings programme which is responsible for managing installed applications. In J2ME context you can never write an app to get the control of this settings app which is silently handled as a device kernel level programme.
As mentioned the primery reason for this is J2ME is a third party language pre-configured and installed on top of another core language stack of the device. For example simply consider Nokia mobile phone which claims to support for J2ME. But the fact is Nokia has its own language stack as the core of the device called Symbian. Symbian OS has its own rich APIs to directly interact with hardware level and other core functionalities of the device. Symbians S40, S60, Symbain 3 are examples for such Symbian OS APIs equipped with SDKs to leverage developers for developing apps. Both the carbide.C++ and the later added framework called QT C++ can be used for writing applications for Symbian OS. Above mentioned impossible scenarios in J2ME can be achieved via these two implementation frameworks.
But as J2ME hides internal complexities from developer, for developing some typical enterprise level apps, J2ME is apparently efficient and easier than using Carbide or QT. Hence language depends on requirements as always. Focusing on Android here is irrelevant because it is that big buzz word everybody talks about these days. To be it as this much of huge buzz, its complete OS stack has played an incredible role. Because of this perfect organization from ground level APIs to higher level APIs in its OS stack, developers have been able to develop apps without considering dependencies, hardware abstractions, library couplings etc. But there is an one little problem with Android. I.e. its fast growing development life cycle. Not like any other OS versions of other devices, Android does not provide long term service for once released version. They tend to grow fast and if earlier version can not tolerate with the later version, bad luck for the users those who have that earlier version of device. But generally people rarely open their mouths up on this.
Therefore Why and Where is a decision made by developers.
Sunday, October 9, 2011
Checking out and setting up QJSON for QT symbian
Generally JSON is simple data exchange format like xml but more simple and flexible than it. Specially when transferring data in XML format, it adds more weight to the actual information we want to transmit as information is overwhelmed by opening and closing tags. This can sometime be useful and sometime be an overhead. To avoid or reduce that overhead we can use JSON. It stands for Java Script Object Notations which can be used to transmit data over http as JSON object. There are many JSON related online references are availble in internet. Therefore What we are focusing is QJSON which is QT based library that maps JSON data to QVariant/QMap objects.
We will consider making qt lib and setting up the path properly via QT creator IDE. qjson library is not implicitly available with default libraries comes with QT. Therefore you have to checkout qjson project source separately and then build it and generate a qjson lib file. One thing to notice is do not try to download qjson source from source forge because due to some reasons it is not the complete project for one to develop lib file they need easily. That source hides some essential files like .pro file etc which are useful to generate lib file directly by using QT Creator IDE.
For checking out the latest version of qjson, first you shoul have a git client installed in your machine. Git is a FOS distributed version management system that can be downloaded from official git site. qjson repository is hosted here. For checking out this as online from downloaded git client, usegit clone git://gitorious.org/qjson/qjson.git command and import complete latest qjson version to your local disk space.
Then open this qjson project via QT Creator and build it. It will create
qjson.dll.a lib file under build/lib folder of qjson source. It is like your_disk_name:/qjson-0.7.1/qjson/build/lib/qjson.dll.a. Now all you have to do is to tell QMake in your .pro where is located your header files and lib file.
Ex: type as following in any where of your .pro file
INCLUDEPATH += "c:/qjson-0.7.1/include"
LIBS += "c:/qjson-0.7.1/qjson/build/lib/qjson.dll.a"
Subscribe to:
Posts (Atom)



