Category: Uncategorized


2010 in review

The stats helper monkeys at WordPress.com mulled over how this blog did in 2010, and here’s a high level summary of its overall blog health:

Healthy blog!

The Blog-Health-o-Meter™ reads This blog is on fire!.

Crunchy numbers

Featured image

A helper monkey made this abstract painting, inspired by your stats.

A Boeing 747-400 passenger jet can hold 416 passengers. This blog was viewed about 3,400 times in 2010. That’s about 8 full 747s.

In 2010, there were 7 new posts, growing the total archive of this blog to 65 posts.

The busiest day of the year was August 13th with 39 views. The most popular post that day was Bluetooth Programming in Python: Network Programming using RFCOMM.

Where did they come from?

The top referring sites in 2010 were note19.com, en.wordpress.com, yandex.ru, google.co.in, and packtpub.com.

Some visitors came searching, mostly for server_sock listen python, c# image memory intptr to bitmap, python bluetooth, steps for accessing camera using pys60, and operations on text in pys60.

Attractions in 2010

These are the posts and pages that got the most views in 2010.

1

Bluetooth Programming in Python: Network Programming using RFCOMM May 2010
2 comments

2

Image Manipulation using GDI+ – The C# Way: Thumbnails and Zooming July 2009
2 comments

3

Bluetooth Programming using Python April 2010
1 comment

4

Mobile Programming in Python using PyS60: UI Controls July 2009
3 comments

5

Mobile Programming using PyS60: Advanced UI Controls July 2009
1 comment

Introducing jQuery

It is JavaScript that brings an HTML page to ‘life’. Whether it is client-side validation, animating the page elements or calling the server in the background to get updated page, one can use JavaScript to achieve all this and much more. However, using JavaScript in its ‘raw’ state compels the developer to write multiple lines to implement each of the afore-mentioned functionality and for each application. The pit-fall in such an approach is that each application will have its own pattern and trying to reuse JavaScript code developed for one application, will ultimately result in re-factoring most of the code so that it meets the requirements of both the applications. This is where JavaScript libraries come into picture. These libraries encapsulate the ordinary yet oft used functionalities (e.g. validation, selection of elements etc.) and provide simplified API to access these functionalities. Among the JavaScript libraries, one of the most used is jQuery. In this discussion, the focus will be on the basics of jQuery. The first section will be about the whys and wherefores of the jQuery. The second section will provide details about using various functionalities of jQuery. That’s the agenda for this discussion.

jQuery – the Whys and Wherefores

To understand how jQuery can ease web client (JavaScript based) development, one has to understand two aspects of jQuery. They are:

1. Functionalities

2. Modules

Understanding the functionalities/services provided by jQuery will tell you what jQuery provides and understanding the modules that constitute jQuery will tell you how to access the services provided by jQuery. Here are the details.

1. Functionalities

The functionalities provided by jQuery can be classified into following

a. Selection

b. Attributes handling

c. Element manipulation

d. Ajax

e. Callbacks

f. Event Handling

Among the above listed functionalities, selection, element manipulation and event handling makes common tasks very easily implementable or trivial.

a. Selection

Using this functionality one can select one or multiple HTML elements. The raw JavaScript equivalent of the selection functionality is

document.getElementByID(‘<element id>’) or

document.getElementByTagName(‘<tag name>’)

b. Attributes handling

One of most required task in JavaScript is to change the value of an attribute of a tag. The conventional way is to use getElementByID to get the element and then use index to get to the required attribute. jQuery eases it by using selection and attributes handling functionality in conjunction.

c. Element handling

There are scenarios where the values of tags need to be modified. One of such scenarios is rewriting text of a <p> tag based on selection from combo box. That is where element handling functionality of jQuery comes handy. Using the element handling or DOM scripting, as it is popularly known, one can not only access a tag but also perform manipulation such as appending child tags to multiple occurrences of a specific tag without using for loop.

d. Ajax

Ajax is of the concept and implementation that brought the usefulness of JavaScript to the fore. However, it also brought the complexities and the boilerplate code required for using Ajax to its full potential. The Ajax related functionalities of jQuery encapsulates away the boilerplate code and lets one concentrate on the result of the Ajax call. The main point to keep in mind is that encapsulation of the setup code does not mean that one cannot access the Ajax related events. jQuery takes care of that too and one can register to the Ajax events and handle them.

e. Callbacks

There are many scenarios in web development, where you want to initiate another task on the basis of completion of one task. An example of such a scenario involves animation. If you want to execute a task after completion of an animation, you will need callback function. The core of jQuery is implemented in such a way that most of the API supports callbacks.

f. Event handling

One of the main aspects of JavaScript and its relationship with HTML is the events triggered by the form elements can be handled using JavaScript. However, when multiple elements and multiple events come into picture, the code complexity becomes very hard to handle. The core of jQuery is geared towards handling the events in such a way that complexity can be maintained at manageable levels.

Now that we have discussed the main functionalities of jQuery, let us move onto the main modules of jQuery and how the functionalities map onto the functionalities.

2. Modules

The modules contain APIs that have one-to-one mapping with the functionalities (most of the time). The main modules of jQuery are

a. Selectors

b. Attributes/CSS

c. Manipulation

d. Ajax

e. Callback

f. Event Handling

The names are indicators as to which functionalities they map to. Here are the details

a. Selectors

As the name indicates, selectors provide the functionality to select elements.  As mentioned earlier, selectors are denoted by dollar ($) sign. Some of the commonly used selectors are

  • all selector – selects all the elements
  • :first and :last selectors – select the first and last occurrence of a recurring element/tag.
  • :eq (index) – selects the element with the index having the  value passed as argument.
  • #id – selects the element whose id is passed.

Following statements show how selectors are commonly used

$(“p”)

The above statement selects all <p> elements.

$(“p.start”)

It selects all <p> elements with class whose name is “start”.

$(“p#demo”)

It selects the first <p> element with “demo” as id.

b. Attributes/CSS:

The attribute handling functionality can be found in the API of this module. It also provides manipulation of CSS classes attached to the elements or attributes. Some of the most commonly used API is

·         .attr( attributeName ) – gets the value of an attribute for the first element having the attribute with name equal to the passed attribute name

  • .addClass (classname) – sets the CSS class of a particular element.
  • .val() – gets the current value of the first element in the set of matched elements. It is primarily used to get the values from form elements.
  • .css(name, value)  – sets the style property that matches the name of the style passed to the value passed for style

Following is an example of css() API

$(“p”).css(“background-color”,”yellow”);

It will set the style of all the <p> elements. In this case the style is background color. Its value is set to yellow.

c. Manipulation

The API related to DOM scripting can be found in this module. In other words, the API in this module is used to manipulate DOM in one way or other. One point to keep in mind is that many of the API in this module overlaps with API in Attributes/CSS module. Some of the most commonly used API is:

  • .after(content) – adds the specified content after each of the elements from a set of matched elements.
  • clone() – duplicates the elements in a set o matched elements.
  • replaceWith(newContent) – replaces each element from a set of matched elements with the specified content.

The term “set of matched elements” means that these APIs need to be used along with selectors. A selector may return more than one element. Hence, the returned values are collectively termed as set. For example, the following statement appends “This is appended” to all the <p> elements

$(“p”).append(“This is appended “);

And the following replaced all the values between <p> and <

d. Ajax

The Ajax related functionality can be found in this module. Following are the most commonly used APIs

  • get() – retrieve data from the server specified by the URL, with the data passed.
  • Post() – same as get but uses POST HTTP method to retrieve the data.

For example, the following statements depict the use of get() API

$.get(

“http://mysite.org/test.php”,

function(data) { alert(data); },

);

In the above example, get takes two parameters – URL of the remote site and the callback that performs some operation on the data passed into the callback by get API. Here the URL is “http://mysite.org/test.php” and the operation performed is alerting the user.

e. Callbacks

One of the aspects of jQuery that is heavily used is callbacks. A callback is a function that is registered with another method and gets called when a specific condition, such as response from the server is fulfilled. Following statements display callback in its simplest form

$(“p#test”).hide(1000,function(){

alert(“The paragraph is now hidden”);

});

The hide() API takes two arguments, speed with which the element has to be hidden and the method that needs to be called when the task of hiding is done. In the above example, when the <p> element with id as test is hidden an alert is displayed. In this case callback function is directly defined within hide().

f. Event handling

As stated before, event handling is part of the core functionalities of jQuery. However, to use it, one point needs to be understood. It is the place (within the HTML document) where event and its handler will be attached. The answer to this question is the correct place is the section which gets called before body section is called and it is the head section.

To attach a handler with an event, the statements need to be place within the ready() function of document DOM element. For example, following statements attach the click event of button to its handler

$(document).ready(function(){

$(“button#test”).click(function(){

$(“p”).hide();

});

});

The click event button with id ‘test’ is attached to the handler using callback functionality which in turn is defined inside the callback for ready(). One point to keep in mind is that any kind event handling code must be defined inside ready() and read() itself must be a part of the head section (<head></head>).

This completes the bird’s eye view of the APIs of jQuery. Next section will deal with the steps in using jQuery and some its APIs. It will also cover how to use some of the APIs discussed in this section.

Developing with jQuery – Step-by-Step:

The steps to use jQuery  include downloading and installing (in some cases), referencing the jQuery library and calling the API. Following are the details

1. Downloading and installing jQuery

This step is not mandatory. The reason for this step being optional is that there are alternative ways to reference jQuery library which will be discussed as a part of next step. To download jQuery, one has to download it from the following URL

http://docs.jquery.com/Downloading_jQuery#Current_Release

Unzip it to the local folder from where it will be referenced. That completes the step for downloading and installing.

2. Referencing the Library

There are two ways to reference jQuery. They are

a. Local reference

c. Remote reference

Both use src attribute of //

a. Local reference

When the library (JS files of jQuery) resides within the application directory structure, then the files are locally referenced. Following statement references files stored in the scripts folder of the application

// <![CDATA[
src="../script/jquery-1.4.2.js">
// ]]>

</script>

b. Remote reference

When the library is hosted on another site ( e.g. code.google.com) and the URL is used to access the functionalities of the library, it is known as remote referencing. The steps to remotely refer jQuery hosted at code.google.com are as follows

i. Refer to the jQuery hosted on code.google.com using the src attribute of the //
statement does the same

// <![CDATA[
javascript"
// ]]>

src=”http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js”>

</script>

The main point to remember is that the URL for the jQuery library may change based on the version of jQuery.

ii. Call the initialization function i.e. ready() after the referencing statement. The following example shows both the steps together

<script

src=”http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js”>

</script>

<script>

$(document).ready(function() {

// provide the initialization such as event handling here

});

</script>

3. Calling the API

To call the API, one can use one of the following ways

a. Fully qualified name

When calling the API with fully qualified name, the statement starts with jQuery. The following statement calls the selector using fully qualified name

jQuery(‘:first’)

b. Using Dollar sign

The dollar sign ($) can be used to call the APIs, instead of using ‘jQuery’. The following statement uses dollar sign to call the selector instead of jQuery

$(‘:first’)

4. Putting it all Together:

Let’s put all the steps together.  The following example will implement  a simple time server. There are two files –one that sits at the server and the one executed at the client. They are

1. SimpleTimeServer.php – it will reside at the server and respond with the current server time.

2. Client.html – it will send request to the server for current server  time via Ajax and display the response it
receives.

First is the SimpleTimeServer.php.  It will have the following code

<?php

$time_now=mktime(date(‘h’)+5,date(‘i’)+30,date(‘s’));

$time_now_str = date(‘l M dS, Y, h:i:s A’,$time_now)

print $time_now_str;

?>

It uses the mktime function to get the current date time and the date function to convert it to human readable string.

Next is Client.html. Following is the code

xmlns=”http://www.w3.org/1999/xhtml” xml:lang=”en” lang=”en”>

<head>

<title>Current Date and Time</title>

<script src=”jquery-1.2.6.js”></script>

<script>

function  getTime()

{

$.ajax({

url : “SimpleTimeServer.php”,

success : function (data) {

$(“#contentArea”).html(data);

}

});

setTimeout(“getTime()”, 1000);

}

</script>

</head>

<body onload=”getTime();”>

<table width=”100%”>

<tr>

<td  width=”100%” align=”center”>

14px arial;padding-top:140px;”>

</div>

</td>

</tr>

</table>

</body>

</html>

The core of the client is the getTime function. It make call to the server using the get API and displays the received value using the manipulator html(). Then the function uses setTimeOut() to call itself at specified interval. The getTime() is called when the body section loads, thus once the body is loaded the time is displayed at a specific interval.

That completes the example. What I discussed here is just the tip of the ice-berg. In the next article, the selectors will be covered in details. Till then…

The chasm between the Object Oriented approach followed by almost all the language or platforms on which applications are developed and the language used by database servers (SQL) is considerably big. This divide exists because the application development languages/platforms deals with objects, attributes and classes whereas SQL deals with rows, columns and tables. There are many frameworks that provide the means to bridge this gap. These frameworks do so by mapping the database artefacts to their object-oriented counterparts. Such frameworks are called Object Relational Mapping or ORM frameworks. In the world of Java, Hibernate is one of the widely used ORM frameworks. In its 2.x version, Hibernate depended on XML files to map Java artefacts to Database artefacts. However, in 3.0 and above, Hibernate provides annotations as an alternative to the XML based mapping. Use of annotations in Hibernate will be the focus of this discussion. The first section will be about the whys and wherefores of annotations in Hibernate. In the second section, the focus will be on the steps required to use the annotations for relational-object mapping. The third section will be about a real world example that makes use of Hibernate 3 and annotations.

Annotations in Hibernate – the Whys and Wherefores

To understand annotation used in Hibernate, two aspects need to be understood. They are

1. Annotations in Java

2. Annotations in Hibernate

Between these two aspects, former of the deals with annotations in general and  later  deals with annotations specific to Hibernate. Here are the details.

1. Annotations in Java
Before we move onto how Hibernate makes use of annotations, let us take a bird’s eye view of what
annotations are. By definition Annotations are “is a special form of syntactic metadata that can be added to
Java source code. Classes, methods, variables, parameters and packages may be annotated. Unlike Javadoc
tags, Java annotations can be reflective in that they can be embedded in class files generated by the
compiler and may be retained by the Java VM to be made retrievable at run-time”. From the definition it is
clear that Annotations in Java have two components. They are:

a. The Metadata

It is of the form “@” where is the name of the metadata. Annotations are metadata of
this form. They can be used to decorate classes, methods, variables, parameters and packages. For
example, the following statements tell the metadata processor that the method is overriding the method
of the base class

@override

Public void display(String name)

{

System.out.println(“Hello “+ name);

}

One important point to keep in mind is that annotations are not discarded after compilation to byte code.
By applying certain policies, they can be retained during runtime. This is not the case with Javadoc tags.
Once compiled, they are lost. In other words, the byte code does not contain the Javadoc tags.

b. The Metadata Processor

It comes into picture during compilation. Metadata Processors or Annotation Processors, as they are
commonly called, are plug-ins to the compiler. A Processor can do a variety of things for the annotated
code including generation of source code files. One important point about Processors is that cannot do
any modification to the annotated code.

That completes the bird’s eye view of Annotations. Let us move onto Annotations in Hibernate.

2. Annotations in Hibernate

Any ORM does four basic mapping. They are:

a. Table mapping

b. Column mapping

c. Key mapping

d. Relationship mapping

How each framework performs the mapping is what makes them different or unique, so is how each
framework wants mapping to be described. Hibernate allows the mapping to be described using either XML
file or Annotations. These two options cannot be mixed and matched. Let us see how Hibernate uses
Annotations for describing the mappings. However, among the four mappings mentioned above, Relationship
mapping will not be a part of this discussion as it is out scope.

a. Table mapping

To map a table, @Table is used. It takes the name of the table that is passed using the name property of the
@Table annotation. For example, the following statements map a table named ‘Products’ to a class named
Product

@Table (name=”Products”)

public class Products {

//…other declarations

}

b. Column mapping

The annotation used to map a column of a table to an attribute of a class is @Column. The name of the
column of the table to be mapped is passed to the annotation using the name property of the @Column.
Following statements map ‘Product_name’ column of ‘Products’ table to ‘name’ field of ‘Products’ class.

@Table (name=”Products”)

public class Products {

//…other declarations

@Column (name=”Product_name”)

String name;

}

c. Key mapping:

Key, in this context, means Primary key of the table being mapped. The @Id annotation is used to map a
field of a class to the Primary key column of the table. @Id is used along with @Column. More specifically,
@Id is used for a field that is already decorated with @Column. The reason is that unless a field is mapped to
a column, the field cannot be considered for Primary key mapping. For example, the following statements
map a field named ‘productId’ to the primary key of the table ‘Products’

@Table (name=”Products”)

public class Products {

//…other declarations

@Id

@Column (name=”Product_id”)

long productId;

}

That completes the whys and wherefores of Annotations in general and how annotations are used in
Hibernate. Let’s move on to the steps for using annotations for mapping.

GUI changed the way a program communicates with the user. It made applications interactive. Interactivity is the norm of the day. Mobiles are no exceptions. PyS60 makes creating GUI based applications easy. It can be termed as on of the RAD environment for Symbian OS. In this discussion I will focus on the basics of using UI library provided by PyS60. The first section will focus on the types of the controls. The second section will be about three basic controls – note and query. In the third section, a simple application will be developed that uses the controls discussed in second section. That’s the agenda for this discussion.

Types of Controls:

PyS60 provides controls or widgets (including dialogs) in two forms. They are:

1. Functions

2. Python types

Controls or widgets under the former mostly are methods where as those in latter category are Python objects implemented in C. Here are the details.

1. Functions:

Many of the dialogs are implemented as functions. In PyS60, dialogs take precedence over the other controls such as textboxes, list-boxes etc. This means if a control and a dialog needs to be shown, then dialog will be shown on top of the control, thus hiding the control. The examples of dialogs implemented as functions are note, query, multi_query etc.

2. Python types

The controls such as textboxes are implemented in C and directly accessed in PyS60. Their precedence is lower than UI implemented as Functions. Text, Listbox and Canvas are examples of Python types. These controls are displayed the instant they are set as the part of the application’s body. In other words, these controls are not displayed until they have been registered as the part of the application.

One of the controls is a dialog that has been implemented as a Python type. It is the Form control. That completes the discussion about the types of UI controls lets move onto next section.

UI Controls – Entry and Notes:

Query and Notes controls are the most commonly used of all the controls. They are used to take input and display messages. Here are the details:

1. Query:

Query is a dialog type. It is used to gather input from the user. It presents a single line text box with a label to the user. Since query is a dialog, so it is implemented as a function. There are three parameters to the function. They are:

i. label

ii. type

iii. initial value

The first two are mandatory parameters whereas the third is optional. Here are the details

i. label

It is the question or prompt that is shown to the user when the dialog box is displayed. The value for this argument is an Unicode string. For example, to show the “Enter name” as the prompt, one will use the following as the value of the argument:

U”Enter name”

ii. type

One can compare it with standard input dialog box that is common on PC. Since it is a dialog, it can be of different dialog types. The type is decided by the type parameter of the query function. The different types are:

a. text – it is a simple text. The text is of Unicode type.

b. code -

c. number – in this case, the input box will accept only numbers and not

decimals

d. date – the input is just date

e. time – to take time as input type needs to be set to time.

f. float – to accept only decimals, this type can be used

All these values are string type. For example to set the type to number, the value passed will be

‘number’

iii. initial value

This is an optional parameter. It sets the initial value shown to the user. However, for the type float, setting this value does not have any effect. For text fields i.e. type having value either ‘text’ or ‘code’, the value for this argument is Unicode. If the type is ‘number’, the value that can be passes is numeric values only. If the type is date, then initial value will be seconds since epoch rounded to the nearest local midnight. For example, to set the initial value to 3, the value passed will be

3

The return value of query is the value provided by the user and the type of the input box. Therefore, to display a query with “Enter any number between 1 and 9” as message, with number as the only acceptable data and 0 as initial value, the statement will be

guess=query(u“Enter any number between 1 and 9”, ‘number’,0)

2. note

note is another control implemented as a dialog. It is used to display messages to the user. This is, again, one of the most common controls in the toolkit of PyS60 as it can be used to display different messages. These messages can be anything from simple message such as information about the size of current file or critical messages such as low battery. The note function takes three arguments. They are

a. text

b. type

c. global

Of these, only text is mandatory argument. The other two are optional. Here are the details.

a. text

It is the message to be shown. It is a Unicode string. For example, to show a message stating that the memory is full, the text argument will be of following format

u”Memory is full”

The u at the starting indicates that it is a Unicode text.

b. type

As stated earlier, the note function can be used to display different kinds of messages. The kind of the message is determined by the value passed for ‘type’ parameter. This parameter can accept the following string values:

i. info – it is the default value, if no value is passed. When type is set to info,

the message shown will be of simple kind. Hence, the icon will have

‘i’ as symbol.

ii. error – to show error messages, one can use this string as the value. If the

type is set to ‘error’, the icon will have ‘e’ as the symbol.

iii. conf – set the type to ‘conf’ when the message to be shown is related to

configuration. An example of configuration is selecting and setting

the fonts. Once a font has been set, a message whose type conf can

be shown to the user informing him/her the name of the new font.

c. global

The value of global argument decides whether, the note displayed is global or not. Global note is a note that will be displayed even if the application calling the note function is not in foreground. The global argument takes an integer value. Any value other than zero is used to make a note or the displayed message global. The default value for this argument is zero. For example, to show a non-global message to the user, the value passed to the global argument will be

0

For example to display a global error message stating that memory is full, the statement will be

note(u”Memory is full”, error, 1)

That brings us to the end of second section. Next section will be about an application using whatever has been discussed until now.

PyS60 in Real World

Lets now see how these controls can be used within an application. The application going to be developed is a simple guessing game. It will perform following tasks

1. Choose a random number

2. Ask the user to enter his or her guess

3. Compare and show the result

4. Ask if he or she will like to continue

So lets start. First the imports

from appuifw import *

As you already know the above statement imports all the classess within appuifw module. Next the application has to choose a random number. However, since this will be a repeating process until the user chooses to stop, choosing the random number will be within a loop. The loop will terminate only when user says he or she will like to stop. The code is as follows

from appuifw import *

continue_guess=true

while continue_guess:

guess_no=random()

The loop will continue till continue_guess becomes false. Next, the application needs to accept user’s guess. To accept the value, query function will be used. The message will be “Enter your guess”, the type will be number (since decimals will not be allowed) and no initial value will be displayed. The value will be saved in user_guess variable. Here is the code

from appuifw import *

continue_guess=true

while continue_guess:

guess_no=random()

user_guess=query(u”Enter your guess”, ‘number’)

Next comes the comparison and displaying the result functionality. First, the user_guess will be checked for validity i.e. if user clicked cancel, it will be null. If it is not null, then it will be compare with the guess_no and appropriate no. will be displayed. If user pressed cancel, a “You opted out” will be shown and the continue_guess will be set to false. Here is the code

from appuifw import *

continue_guess=true

while continue_guess:

guess_no=random()

user_guess=query(u”Enter your guess”, ‘number’)

if user_guess is Null:

note(u”You have opted out”)

continue_guess=false

elif user_guess<guess_no:

note(u”Your guess is lesser than the goal”)

elif user_guess>guess_no:

note(u”Your guess is higher than the goal”)

else:

note(u”Congrats for excellent guess”)

Next comes the code that asks user whether to continue or not. The query box is shown to the user with “Enter Y to continue and N quit”. If Y is entered, the loop is continued else the application is exited.

from appuifw import *

continue_guess=true

while continue_guess:

guess_no=random()

user_guess=query(u”Enter your guess”, ‘number’)

if user_guess is Null:

note(u”You have opted out”)

continue_guess=false

elif user_guess<guess_no:

note(u”Your guess is lesser than the goal”)

elif user_guess>guess_no:

note(u”Your guess is higher than the goal”)

else:

note(u”Congrats for excellent guess”)

user_choice=query(u”Enter Y to continue or N to quit”)

if user_choice is Null or user_choice==’N’:

continue_guess=false

else:

continue_guess=true

That completes the application. In this discussion, the focus was on simple UI controls. From the next part, complex UI controls such as forms. Till then…

An Oblique Approach : Belisarius Series

If you are a fan of Alternate Universe (AU), then you will surely like this one. It is first in the series of 6 books. The series deals with the fight between ‘The New Gods’ and ‘The Great Ones’ in the far far future spilled into the far far past (era of Roman empire). The New Gods are using Malwa empire of India to weed out any genetic pollution that gave raise to ‘The Great Ones’. And ‘The Great Ones’ have sent an aide calling upon the help of one of the greatest generals of all the time – Belisarius. The beauty of the series is that the weapons, though from concepts in future, are made indigenous with the materials available in that era.

The first book introduces the reader to almost all the players of this series. This book justifies making Belisarius the protagonist of the story. From the battle field of Mindous to the heartland of India – the story tells us why Belisarius is considered one of the greatest generals. The second aspect of the story that will catch immediate attention is how each character has his or her part in the whole strategy planned out by Belisarius. From the prince of Auxum to the Majarashtra rebel leader Raghunath Rao – everyone shines brightly. Though Belisarius is the protagonist, his allies are not cannon fodder. Each is a legend in his (her) own right, be it Valentinian, Sittas, Maurice, Antonina from Rome or Eon, Wahsi from Auxum or Raghunath Rao, Kungas from India. The third aspect is the humour prevailing throughout the series. Most of the time the humour comes from the veterans’ thoughts about their general’s schemes. It has got the classic touch of Eric Flint.

So all-in-all its a good read. For me it was one sitting read. I came across this while searching for AU fictions. You can get it free of cost from this link

http://www.baen.com/library/0671878654/0671878654.htm

So go ahead, read it and give your comments. Thats it for now.

Hello world!

Welcome to WordPress.com. This is your first post. Edit or delete it and start blogging!

KOBI

Kobi – the wolf part of wolfman Bhediya. This series was a great take on the supernatural that can exist in the jungles. However, after the issue about the wolf and human part of Bhediya separating, the story lost its serious nature. This image is my imagining of Kobi in fury.

Mr India


This one is one of my earliest sketches. Its from a series of the same name. It was an interesting but short lived series. I had started the sketch with the idea of having a blast as the background. However, it never came to be as the blast would have overshadowed Mr. India. Hence, the sketch doesnt have any background.

Sorry For No Post

I am extremely sorry as my schedule is not allowing to make any new posts. Once I am through the schedule I will start again.

Follow

Get every new post delivered to your Inbox.