Saturday 1 January 2022

Cannonballs from the Stratosphere

This article is a redraft of the very first article I'd posted on this blog seven years ago. Hope y'all enjoy it!

Peace.

Solitude.

A delightful spring afternoon. The glass window overlooking the city presented the usual - the old blanket of haze across the horizon, the occasional bird on the lookout for lunch, the distant rumble of the highway, and partly cloudy skies.

Tranquility.

Upon completing my inspection of the city and diagnosing it with excellent health, I believe I proceeded with my day, doing this and that. There’s a decent chance that I sat down to draw a multicellular organism, likely a pigeon, for my biology homework.

This afternoon surely isn’t a recent one, as I believe my city wouldn’t have received an ‘excellent health’ diagnosis from me on any of the afternoons over the past two years of our two-week lockdown.

I’d just given my pigeon wings when an all-too-familiar wooo made itself heard. The balcony door was slightly ajar, and the breeze succeeded at pulling off a flawless impression of a lost soul, whistling through the narrow gap between the door and the frame. A welcome change to the windless afternoon. I got up to meet the breeze, perhaps with the intention of asking it to help my pigeon fly.

I opened the door and walked straight into a wall of dust.

This was no breeze. Not just my pigeon, in all practicality, I could’ve gained flight had I stepped further into the balcony. I promptly closed the door and sprinted around the house, closing all doors and windows I could find.

This absolute hurricane of a wind no longer needed gaps between doors and frames for making its presence known. Plants and trees rustled at full capacity, clenching the ground with their roots for dear life. About a minute later, raindrops started slamming against the windows. A minute earlier, we were talking tranquility and meditation.

Upon securing the perimeter of the house, I proceeded to the window overlooking the city.

It would be a ludicrous understatement to say that the window presented a sight to behold.

Some fifty feet away, I saw something that I can only describe as a giant walking whirlpool. The air and rain swirled in perfect unison, forming a portal connecting the ground to the massive raincloud above. And anything that could be airborne, was airborne. Leaves, twigs, dirt, branches, clothes, plastic bags, the tin roof of the compost shed, all of these effortlessly entered the portal, reached the cloud, and rained back down.

The rain really started to pick up. The wind wasn’t far behind, and was in fact, in the lead. It was no longer raining down. For a solid half-minute, droplets of water appeared to be moving up, back towards the cloud.

In the middle of this clement weather, a distinctive hoy resounded through the environment. I saw a small group of people run and take shelter under an adjacent building. The exclamation felt a little out of place. These storm chasers had managed to keep their feet on the ground despite the initial gust, the water tornado, and the cloudburst-enhanced version of the latter. Why the sudden run for the hills?

At this point, something banged against the window. A few more of these somethings crashed against the glass pane. Clack. Thud. Bang. I couldn’t immediately figure out the identity of these little things bombarding the window. A few of these accumulated on the window sill.

Smaller than marbles, these pearly white spheroids were perhaps what raindrops yearned to become. I’d never seen a hailstorm before, so it took me a while to arrive at the conclusion that these mini cannonballs from the stratosphere were, as a matter of fact, hailstones.

A terrific boom of thunder served as the perfect beat drop on The Hailstones’ newest single.

I don’t think my brain’s imagination department could possibly conjure up a more spectacular scene. Hailstones and raindrops were being flung in all directions. Leaves, tin roofs, clothes, and bags were being scattered all over. A brilliant flash of lightning illuminated everything in sight. It was like peering through a kaleidoscope, only one that was much larger and more vivid. Scintillating pieces of ice, along with gleaming drops of rain, in harmony with various components of the surroundings, continued swishing around in the natural lightning-powered tornado mixer.

And just like how the once-vivacious elderly slowly transition into their twilight years, the storm gradually transformed into a normal thundershower. It wasn't long before the city regained its original state of serenity. The earthy after-rain smell wafted through the neighborhood. The drab colors of the sun-dried city were now replaced by deeper, brighter hues. Even the horizon's haze blanket seemed to have dissipated, revealing a bluer sky. I collected the hailstones from the window sill and watched as they melted into oblivion.


Tuesday 29 September 2020

Java One-Oh-One

Java is a high-level programming language that has been around for two decades and is still going strong. It is object-oriented, is platform independent, has wonderful documentation and community support, is free, and is everywhere – the moment you install Java, a screen generally comes up which states ‘3 billion devices run Java’.

Java and coffee - the ultimate combination

Yes, you must find the ancient scriptures of Sun Microsystems to learn a language, a language which, unknown to many, continues to flourish in the twenty-first century, a language so precious its priceless (in more ways than one), a language not lost in the sands of time.

Or, instead of finding those scriptures, you may read this blog post, which shall unravel the deep, dark mysteries which surround this language, the language called Java.

All right, enough adventure talk, let’s begin already.

We’re going to go through some basic programming concepts in Java, namely variables, operators, selection, iteration and jump statements. If you’re new to programming, you’d want to read this post with hardcore determination, while if you’ve already done some non-Java programming in the past, I’d recommend you quickly skim through this post to get a feel of the language. And if you’re a Java developer, how about you go through this post and let me know about errors, if any? :) Email manasdtrivedi@gmail.com

I’ve used the idea of ‘learning by example’ in this post. If you don’t understand the theory of a section, say, increment/decrement operators, then go through the example code for it, look at the output, and try to figure out the reasons for said output. Since Java is quite close to the way we speak in English, the code is generally pretty clear. But yes, if you indeed have queries, you’re free to email me :)

Variables

Variables are named ‘boxes’ of a certain type, which hold values of that type. For example, a fruit box called fruitBox1 will hold a fruit in it, say a mango, or a jackfruit. Similarly, an integer variable called num will store an integer in it, say 7 or -9 or 0 or 17395.

The way we declare and initialize variables in Java is as shown:

datatype variableName = value;

So, an integer variable called ‘num’ is declared and initialized with the value 3 as:

int num = 3;

Here, ‘int’ is the datatype (i.e. the type of the variable), ‘num’ is the name of the variable, and ‘3’ is the value put into variable ‘num’. In simple terms, int num = 3 means we’re putting the value 3 into an integer box (integer variable) called ‘num’.

Note that the ‘=’ sign doesn’t mean equality i.e. int num = 3 doesn’t mean ‘num is equal to 3’. Rather, we’re inserting 3 into the box called ‘num’. You can perhaps imagine replacing the ‘=’ sign with a ‘<-’ (leftward arrow) to reinforce this idea.

A variable in Java can have any name, as long as it isn’t a keyword, doesn’t begin with a digit, and is composed of only alphabets, digits, underscore and/or dollar sign.

There are 9 types of variables in Java:

1.      Byte variables can store values from -128 to 127.

byte var1 = 25;

2.      Short variables can store values from -32768 to 32767.

short var_2 = 5678;

3.      Integer variables can store values from -2147483648 to 2147483647.

int var$3 = 9999999;

4.      Long variables can store values from -9223372036854775808 to 9223372036854775807.

long _var4 = 112233445566778899.

5.      Float variables can store values from ± 1.4E-45 to ± 3.4028235E+38.

float principal = 10.0F;

Note the ‘F’ at the end of 10.0. That denotes a float.

6.      Double variables can store values from ± 4.9E-324 to ± 1.7976931348623157E+308.

double d = 20.0;

Note that this doesn’t need a ‘D’ or similar, as was used for floats.

7.      Character variables store characters.

char ch = ‘A’;

8.      Boolean variables can store either ‘true’ or ‘false’.

boolean b = true;

9.      String variables can store zero or more characters, like the name of an institute.

String institute = “NIT Karnataka, Surathkal”;

Sometimes, we may want the String variable to be empty. In that case, we can either initialize it with null, or with “” (i.e. empty string).

String username = null;

String str = “”;

 

Operators

Java has a wide variety of operators, but we’ll be looking at only a few of them.

1.      Arithmetic operators:

 

+ is used for adding two operands.

double total = 100.0, tax = 10.0;

double grandTotal = total + tax;

Here, grandTotal will be assigned value 110.0.

+ is also used for concatenating strings.

String str1 = ‘IE’, str2 = ‘NITK’;

String str3 = str1 + “-” + str2;

Here, str3 will hold the string “IE-NITK”.

 

- is used for subtracting two operands.

int x = 1, y = 2;

int z = x - y;

Here, z will store 1 - 2 i.e. -1.

 

* is used for multiplying two operands.

short s1 = 3, s2 = 4;

short s3 = s1 * s2;

Here, s3 will store 3 * 4 i.e. 12.

 

/ is used for dividing two operands.

double z1 = 5.0 / 2.0;

Here, z1 will store 5.0 / 2.0 i.e. 2.5.

 

% is used for finding the remainder upon dividing two operands.

int op1 = 10;

int op2 = 3;

int remainder = op1 % op2;

Here, remainder will store the remainder upon dividing 10 by 3, i.e. 1.

 

Little note: ‘returns’ in this blog post means ‘is replaced by’.

For example,

int a = 3 + 4;

Here, we say 3 + 4 ‘returns’ 7. This means you can effectively ‘replace’ 3 + 4 in the above line of code with 7. So,

int a = 7;

‘returns’ actually means something else in programming, but for now, this will do.

 

2.      Increment/Decrement operators:

 

Prefix form: Follows ‘change-then-use’ rule, i.e. ++operand or --operand first increments/decrements the value of operand, and then returns the changed value of operand.

 

Example:

int a = 2, b = 2;

int c = ++a;

int d = --b;

 

After execution of above statements, a will store value 3, c will store value 3, b will store value 1, d will store value 1.

 

Postfix form: Follows ‘use-then-change’ rule, i.e. operand++ or operand-- returns the current value of operand and then increments/decrements operand. Note that the ‘changed’ value isn’t returned, the value before changing is.

 

Example:

int a = 2, b = 2;

int c = a++;

int d = b--;

 

After execution of the above statements, a will store value 3, c will store value 2, b will store value 1, d will store value 2.

 

3.      Relational operators:

 

Here and beyond, op1 means first operand, and op2 means second operand.

op1 > op2 returns true if op1 is greater than op2, else returns false.

op1 >= op2 returns true if op1 is greater than or equal to op2, else returns false.

op1 < op2 returns true if op1 is lesser than op2, else returns false.

op1 <= op2 returns true if op1 is lesser than or equal to op2, else returns false.

op1 == op2 returns true if op1 is equal to op2, else returns false.

op1 != op2 returns true if op1 is not equal to op2, else returns false.

 

Example:

int x = 3, y = 2, z = 2;

boolean b1 = x > y;

boolean b2 = 20 < 15;

boolean b3 = y >= z;

boolean b4 = 12 <= 10;

boolean b5 = y == z;

boolean b6 = 10 != 10;

 

Here, variables b1, b3 and b5 will hold value true, while b2, b4 and b6 will hold value false.

 

4.      Logical/Conditional operators:

 

op1 && op2 returns true if both op1 and op2 are true, else returns false, checks op2’s value only if op1 is true.

op1 || op2 returns true if any of op1 or op2 is true, else returns false, checks op2’s value only if op1 is false.

op1 & op2 returns true if both op1 and op2 are true, else returns false, always checks both op1 and op2’s values.

op1 | op2 returns true if any of op1 or op2 is true, else returns false, always checks both op1 and op2’s values.

op1 ^ op2 returns true if either op1 or op2 is true, but not both, else returns false.

!op1 returns true if op1’s value is false, else returns false.

 

Example:

boolean b1 = (3 > 2) && (2 < 1);

boolean b2 = !b1;

boolean b3 = b1 || b2;

boolean b4 = b1 ^ b2;

 

Here, b1 stores false, b2 stores true, b3 stores true, b4 stores true.

 

Selection statements

Selection statements allow us to choose a set of instructions for execution based on an expression’s truth value.

1.      if statement: Statements inside the if block get executed only if the condition evaluates to true. A ‘block’ is denoted by curly brackets i.e. ‘{’ and ‘}’. All statements present inside the curly brackets are a part of one ‘block’ of statements.

if…else statement: Statements inside the if block get executed if the condition evaluates to true, else the statements inside the else block get executed.

 

Example:

int x = 5, y = 5, z = 4;

if (3 > 2) {

      System.out.println(“3 is greater than 2.”);

}

if (x  > y) {

      System.out.println(“x is greater than y.”);

}

else if (x < y) {

      System.out.println(“x is less than y.”);

}

else {

      System.out.println(“x is equal to y.”);

}

if (y >= z) {

      if (y > z) {

            System.out.println(“y is greater than z.”);

      }

      else {

            System.out.println(“y is equal to z.”);

      }

}

else {

      System.out.println(“y is less than z.”);

}

 

Here, the output window displays the following output:

3 is greater than 2.

x is equal to y.

y is greater than z.

 

2.      switch statement: This statement tests the value of an expression against a list of integers or characters. Upon finding a match, the statements associated with that integer or character is executed. If no match is found, the statements associated with the default label (if exists) is executed. It is generally a good idea to have a default label.

 

Example:

int dayOfWeek = 8;

char language = ‘J’;

switch (dayOfWeek) {

      case 1: System.out.println(“Monday”);

            break;

      case 2: System.out.println(“Tuesday”);

            break;

      case 3: System.out.println(“Wednesday”);

            break;

      case 4: System.out.println(“Thursday”);

            break;

      case 5: System.out.println(“Friday”);

            break;

      case 6: System.out.println(“Saturday”);

            break;

      case 7: System.out.println(“Sunday”);

            break;

      default: System.out.println(“Invalid day of week.”);

}

switch (language) {

      case ‘C’: System.out.println(“Language selected is C.”);

            break;

      case ‘+’: System.out.println(“Language selected is C++.”);

            break;

      case ‘J’: System.out.println(“Language selected is Java.”);

            break;

      case ‘P’: System.out.println(“Language selected is Python.”);

            break;

      default: System.out.println(“Invalid language selected.”);

}

 

Here, the output window displays the following output:

Invalid day of week.

Language selected is Java.

 

Iteration statements

These statements (called ‘loops’) are used to execute a set of instructions (the body) repeatedly as long as the value of an expression is true. These statements generally have four parts: the initialization (where the control variable is initialized), the expression (whose truth value decides whether the body will be executed), the updation (which updates the control variable), and the body of the loop.

1.      for loop: The first three elements of the loop (initialization, expression, updation) are gathered at the top of the loop (generally). The expression is first checked, then the body is executed if the expression is true.

 

Example:

for (int x = 1; x <= 2; x++) {

      System.out.println(“Value of x is ” + x + “.”);

}

 

Here, x is first initialized as 1. The expression x <= 2 is checked. It is true, so the body is executed. Now, the updation x++ takes place. x is now 2. The expression x <= 2 is checked. It is true, so the body is executed. Updation x++ takes place once again. x is now 3. The expression x <= 2 is checked. It is false. So, the loop is exited.

 

The output window displays the following output:

Value of x is 1.

Value of x is 2.

 

We can also skip one or more of the three elements at the top of the for loop. For example, for(; x <= 2; x++) {…} is perfectly legal, as long as x is declared and initialized somewhere above the loop. Note that although the initialization expression was removed, the semicolon wasn’t!

 

2.      while loop: It is pretty similar to an if statement in the sense that the body of the loop is executed if the expression evaluates to true. The initialization of the loop control variable (if any) is somewhere above the loop, and the updation (if any) is generally a part of the body.

 

Example:

int k = 2;

while (k > 0) {

      System.out.println(“k is greater than zero”.);

      k--;

}

System.out.println(“k is now zero.”);

 

Here, k is initialized to 2. The condition k > 0 is checked. It is true, so the body is executed. In the body, the updation k-- occurs. k becomes 1. The condition k > 0 is checked again. It is true, so the body is executed. k-- occurs, k becomes 0. Now the condition k > 0 is checked, which returns false. So, the loop is exited.

 

The output window displays the following output:

k is greater than 0.

k is greater than 0.

k is now 0.

 

3.      do-while loop: Here, the loop control expression is evaluated after the body is run, and its truth then determines whether the body is to be executed again. The initialization (if any) is above the loop, and the updation (if any) is generally a part of the body.

 

Example:

int x = 0;

do {

      System.out.println(“Saluton Mondo!”);

      x--;

} while (x > 0);

 

Here, x is initialized with the value 0. The body is run. The updation x-- takes place, x becomes -1. Then the expression x > 0 is tested. It is false. So, the loop is exited.

 

The output window displays the following output:

Saluton Mondo!

Loops can also be nested, i.e. a loop can be written inside a loop.

 

Jump statements

They are used for unconditional ‘jumping’ i.e. going to a certain part of the code without any condition. We’ll look at two of these: break and continue.

1.      break statement: It is used to terminate the execution of the loop. The control immediately jumps to the code after the loop.

 

Example:

int x = 1;

while (x < 5) {

      System.out.println(“Incoming break statement!”);

      break;

      x++;

}

System.out.println(“We’re now outside the loop.”);

 

After entering the loop, the break statement is encountered, and we directly go to the statement after the loop. The updation x++ never occurs.

 

The output window displays the following output:

Incoming break statement!

We’re now outside the loop.

 

2.      continue statement: It is used to directly go to the next iteration of the loop, skipping any statements left to be executed in the body.

 

Example:

for (int x = 1; x <= 3; x++) {

      if (x == 2) {

      continue;

}

System.out.println(“x is now ” + x + “.”);

}

 

Here, x is initialized to 1. The condition x <= 3 is evaluated to be true. Hence, we enter the body. x is not 2, hence the continue statement isn’t executed. ‘x is now 1.’ is printed. Updation takes place, x becomes 2. The condition x <= 3 is evaluated. It is true. So, we enter the body again. This time x is indeed 2, hence the continue statement is executed. The rest of the body isn’t executed, we directly jump to the next iteration. Updation takes place, x becomes 3. Condition x <= 3 is yet again true. We enter the body once again. Since x isn’t 2, the continue statement isn’t executed. “x is now 3” is printed. Updation: x becomes 4. Now the condition x <= 3 is false, hence we exit the loop.

 

The output window shows the following output:

x is now 1.

x is now 3.

 

Reached this far? Congratulations! You now have a very sound knowledge of the basics of Java, which we’ll require soon.

Soon?

Yes, I’m going to write another blog post with deals with creating interactive Java applications which have components like buttons, textfields, and checkboxes.

Stay tuned for Episode 2 of the Intellicenter Java series!