Tuesday, March 25, 2014

Being comfortable while seated at your workstation

I've seen many people carrying the strict discipline they learnt in school to office too. In an environment where they have to be seated for hours at an end, they try their best to not complain and adjust. Many end up seriously damaging their health. A friend's sister ended up requiring spinal surgery because she tried her best to sit straight and stiff while working; ignoring her back pain all the while.

Some chairs are designed for people with long thighs. People with short thighs won't be able to adjust to it (and vice versa). Good news is, chairs can be adjusted. But I rarely see people doing it. I did.


Got the armrests removed and the back of the chair tightened and phew! It was such a relief to be able to sit comfortably!

More on adjustments: http://www.ccohs.ca/oshanswers/ergonomics/office/chair_adjusting.html

Sunday, March 23, 2014

What I learnt as a professional



At Applied Fiction Interaction Lab (now named Pors & Rao):


Applied Fiction is an Interaction Design company primarily specializing in innovation of electromechanical interactive devices and installations. The company is also involved in a broad spectrum of identity-design for prominent clients.

Working with people who have done their masters from Ivrea, Italy, is an experience in itself. Right from the first of my multiple informal interviews with them, I saw a passion for design and quality. The devices they made, the ambiance in which they worked, the way they spoke of the work they did; it felt different from anything I had been exposed to prior. Two years, I worked with them; a Danish and Indian designer pair who founded the company, created amazing interactive products and made me fall in love with their passion for quality.

Some skills I picked up here:
  • Using internet forums: As a person who had hardly used the internet at that time, I didn't actually believe that people in some other country would actually answer my question on Processing. But they did, and that encouraged me to contribute too, on the forums I joined. Interacting with developers world-over gives a person a lot of experience and exposure.
  • Attention to detail. Pixel perfect work: Over a period of time, I learnt to match up with their expectations of quality of an interface. Every pixel had to be perfectly positioned. Every colour had to be just right. Every movement on the screen had to be smooth. Once you get used to this level of quality, you won't accept anything that's below this quality. I learnt to communicate motion the way they did (it's fun): A fluttery animation of text would be described as "Frrrrrrr...stop".
  • Storyboarding: When proposing a design to a client, you don't just make a single design and thrust it down their throat. You understand the client, their style and preferences and create multiple designs (the process of storyboarding), so that they can choose what they like. I had to make my software prototypes that way. Extremely flexible to be able to create storyboards.
  • Interaction design in general: Nobody teaches an engineer how to design. We end up using colours and designs that a designer would consider "ugly" and would barely be able to look at it. At Applied Fiction, even I acquired the "feeling" that a designer gets, when they see something that has been poorly designed. I know what to change to make the colours better, the positioning better, the interface more intuitive and to refine the interface, so that it receives a better emotional response from the user. I have a lot more respect for designers and their work, after having worked in Applied Fiction.
  • Learning and implementing new languages: Ok this was a skill I already had, but  Applied Fiction gave me the chance to put this to the test. While I was still learning Flash, the company was consulting with another company where a developer with 8 years experience in Flash said a certain animation which my bosses wanted, could not be accomplished with Flash. My bosses asked me, and in 3 hours I created it better than even what they expected. Learnt PHP, MySQL, JavaScript, Actionscript, Processing and was also going to learn assembly language on my own. I enjoyed the time I spent at Applied Fiction. Absolutely loved the products I had the opportunity to create.
On my last day at Applied Fiction, just before I left, I was given an envelope with a surprise recommendation. I recently requested Aparna to put the same recommendation on LinkedIn, and she kindly obliged. Here's the screenshot of it (To view 100%, open in a new tab and zoom in):



At Tata Power Strategic Engineering Division:


Tata Power SED is a CMMI Level 5 defence company involved in indigenous design, development, production and supply of state-of-the-art defence systems (hardware & software) to the Indian Army, Air-Force and Navy.

Walking into the campus for my interview, I saw an army tank parked inside. "Wow", I thought. Next, a missile launcher. "Whoa! Would I get to program the trajectory of one of those?". Five years of working here taught me a lot, and there's something about the culture here that made me a better person too.

Some skills I picked up here:

  • A focus on efficiency: It wasn't just enough to get a program working. It had to perform well under load. No memory leaks. I went through the entire volumes of Effective C++ and Effective STL by Scott Meyers to familiarize myself with what was required, asked all kinds of questions on Stackoverflow to learn more. Achieved what I wanted too.
  • Studying algorithms from research papers and corresponding with researchers when stuck: I never knew scientists were such a helpful and friendly lot. They actually took the time to respond to my emails about their published algorithms. I was pleasantly surprised (and encouraged) when a very eminent scientist actually replied. Of course, the emails had to be well structured and concise, so as to not waste their time, and that was something I was extremely good at! :)
  • Going through open source code and building it: This is a skill I acquired both with my own ability and by seeing my seniors do it. Taking the source code of an open source project, downloading all related libraries and building it from source is not a joke. That too, to be able to do it in both Windows and Linux. I've been able to do it. When I joined the company itself, I learnt to build GCC from source. Since then, I've been able to build a lot of other softwares from source. Including OGRE and OSG. I've also learnt to go through other people's open source code, understand it, extract it and use it in my code.
  • Evaluating licenses: Going through the legal terms of licenses and evaluating whether we could safely use the library has been a regular job for me. Proprietary licenses and the GPL, LGPL, BSD licenses etc. There was one occasion I spotted a legal no-go for the use of a software which could have saved the project two months of evaluation if my word was heeded on time.
  • Evaluating and selecting technologies to use in a project: This was the reason I had to evaluate licenses. I've been responsible for the evaluation and selection of libraries and tools by performing a careful decision analysis and review involving weighted averages.
  • Having a mature approach to working with co-workers: I know places where people yell at each other and have fights. That's not the environment we have at the software division in SED. We patiently evaluate situations, understand problems and solve them together; putting aside differences to ensure the best for the project.
  • Trying our best to get the work done right the first time around: By clarifying things with the boss and co-workers before completing the work. The big advantage here, is it avoids the time lost on re-work.
  • Dealing with the outside world: Having initiated and led the volunteering team at SED, and being a novice at something like that, I've taken initiative to contact and obtain the help of eminent persons in the field of volunteering and social work. Also taking the guidance of volunteers of Tata Power and in interacting with authorities in SED, to formally introduce organizational processes for the volunteering team to be able to function in the company; running a team, making a lot of mistakes and learning from it in the process. Authorities in the company have been very supportive inspite of all the mistakes I made. Am grateful for that.

Thursday, March 20, 2014

My Creations

My story of being a programmer has the elements of a movie to it :)
My initial struggle to understand syntax; doing very badly in my computer science tests; my dear teacher motivating me; my uncle sharing a computer for me to work on; me programming games on it (because the computer didn't have any games); me falling in love with programming; creating and learning much more than my peers and eventually being one of the top programmers in class (in 9th grade, during a predicting game at my prefects picnic, writing on a sheet of paper that 10 years later I'd be in the company of software engineers); my parents not understanding my interest in programming (2002 was a panic year when software people were losing jobs) and pushing me to do Mech engineering; me continuing to do programming even during my engineering (winning a state level hobby project in the process and surprising my Mech seniors when they found me reading computer science books in the library); landing my first job as software developer even before I stepped out of college; going ahead to do my post-graduation in software technology and exactly in the 10th year following my prefects picnic, joining a new company and having my aim fulfilled.

Some of my hobby projects

Most of my initial programs were created on a 286 computer which didn't have Windows installed. Only MS-DOS. Max speed of the computer: 20MHz. Hard disk capacity: 30MB. Yikes! :-) It was only after my engineering that I got an internet connection at home, so the below programs are a result of hard-work and self-study of API's and documentation.

Jump-up: 
https://github.com/nav9/JumpUp
 Kids of 3rd and 4th grade seem to LOVE this game. I guess it's because of the simplicity and the funny sounds I programmed into it. This was the first game I programmed (in GW-BASIC) when I was in 9th grade, and my little brother was crazy after it. He even beat my highscore!




Bricks
https://github.com/nav9/Bricks
A game with ten levels of increasing difficulty and challenges. Created in 10th grade. Was introduced to the term "cheat codes" at this point of time, and introduced this into the game.



Maze
https://github.com/nav9/Maze
I used to create mazes on paper, and decided to program one too. Was a daunting task setting up the arrays on large sheets of paper I stuck together and then replicating the same on the computer. The maze was programmed with portals and wells (which you might fall into and die). It was also divided into 4 sections which made it very difficult to solve, because you had to remember the previous screens to find your way. My best friend tried for three hours, and said he couldn't solve it (to date, I'm the only one who has solved it).








Digger
https://github.com/nav9/Digger
This was one game I really wanted to program. Had played it many years back on a cousin's computer, and wanted to play it at home too, so just created it myself. Wasn't familiar with Q-BASIC graphics at that time, so used ASCII characters. It's a game with a digger machine digging through mud, collecting diamonds, monsters trying to destroy the machine and the machine being able to shoot at the monsters or drop sacks of money on them to kill them. Then collecting the destroyed sacks to get more ammo.
Had created an initial version and then improved upon it.





Calculator program
https://github.com/nav9/Calculator
Okay, this one was too simple, but it was programmed to be user friendly by allowing the user to navigate from one key to another using the arrow keys and by providing a square root option (which I'm surprised that many calculators strangely still don't provide).





Mock antivirus program
https://github.com/nav9/MockAntiviruses
Well you'd recollect I was using my uncle's computer, and I wanted to pull a prank on him. I created an antivirus interface which was pretty similar to the real MSAV antivirus interface of those days. The program pretends to scan the computer and pops up an alert that it found a boot sector virus which can't be removed. Uncle actually believed it! :)



Vein: An MS-DOS OS interface, like Windows
https://github.com/nav9/Vein---MS-DOS-OS-Interface
Navigating through the commandline is difficult for people. My family found it tough to use the PC because it didn't have Windows and the MS-DOS interface was too geeky for them. So I created an interface (while in 11th grade) for interacting with MS-DOS. Pretty much like how the Windows graphical interface was created by Microsoft.
Also, the PC was infected with a virus which randomly wrote ASCII characters on the screen. Vein's user interface was designed to refresh the screen at the press of a spacebar, temporarily solving the virus problem.




Digger forever
https://github.com/nav9/Digger
Had wanted to make my Digger game closer to the actual game I had played at my cousin's house, so while doing my engineering, when the ISTE student chapter organized a state level hobby project competition, I borrowed my room-mate's computer for two weeks and created Digger with BASIC graphics (presented it along with my other games). And guess what? I won the competition with a Rs.2000 cash prize! Roommate got a generous treat and seniors were all-praise :) The Mechanical engineering student who won a competition by programming games!
[update] Just found the original of the printout my very-happy-seniors had put up on the college and hostel notice board after I won the prize.









Message decoder program
https://github.com/nav9/Decoder
Converting text from English to a coded language and vice versa being slow, I wrote a program for it. Also kept it flexible for it to be able to accept a new code sequence too.



Mechanical force visualization software
https://github.com/nav9/Unipar
A Civil engineering lecturer at my college asked me if I could create for him, a program which would show a 2D representation of the normal and tangential forces on a beam. He also wanted a simple graph to show the force distribution. By this time, I had derived the 3D projection equations on my own (I didn't know this would be available on the internet, so I had actually drawn projections on paper and derived the equation by using whatever I learnt in trigonometry), so I completely took him by surprise by using the graphics of C (using the Turbo C compiler) and created the beam in 3D, as an application with full-fledged menus and an interactive graph. You can actually rotate the beam in 3D using arrow keys, feed in various values using textfields (these were tough to program) and also load/save the values. When I look at the program today, I find it hard to believe that I actually programmed it when I was at that age!



Ben
https://github.com/nav9/Ben
Had wanted to make a Dangerous Dave kind of game, and I began with Ben. But this program was left incomplete, as I couldn't use threading in BASIC. So when I added a monster in the second screen, it became too slow. Was able to get over the tough part of programming multi-key input to make Ben jump around.




Those were my student days. As a professional, I've learnt a lot more.
I've also engaged in creating a few scripts here and there to ease my work:


Greasemonkey for auto-clicking a web-page

A certain page required clicking a link every time I visited the page. So I thought I'd automate the process with this code snippet. 

var element = document.getElementsByTagName("a"); // get element by tag namevar theEvent = document.createEvent("MouseEvent");
theEvent.initMouseEvent("click", true, true, window, 0, 0, 0, 30, 79, false, false, false, false, 0, null);
//var element = document.getElementById('link');
element[0].dispatchEvent(theEvent);

Recursing directories
https://github.com/nav9/recursor

  
Wanted to  be able to move recursively through directories to accomplish what I wanted to, so wrote a small python script for it:

After writing it, I discovered that the functionality was already available in Python via the walk command ... *sigh* ... anyway at least there's the joy of creating a program on my own and being able to tweak it as I wish!

Resting my eyes
https://github.com/nav9/System-Tray-Program


 
What's the point of knowing VC++ if you aren't using it to your advantage? I borrowed some open source code for a program which sits in the system tray in Windows, and modified it to start at logon and pop up a message at a specified interval of time, alerting a person to rest their eyes for 5 min. Strained-eyed friends and I found this program to be a boon. Of course when I found Eye Leo, I switched to it immediately.

Popup Destroyer
https://github.com/nav9/PopupDestroyer



A certain security setting created by a certain someone, made an "Authentication required" popup appear whenever I opened a new page on my browser. The user just had to press Esc to make the popup go away and it was very annoying. So I wrote a sentinel program in VC++ to run in the background, scanning all window titles for the "Authentication required" string. When it found one, it'd immediately issue the Esc keypress command to the window automatically and the window would get closed. I used to enjoy watching those windows disappear while I continued with my work happily :)



Volunteering website
https://github.com/nav9/crteam.git
 
Our volunteering team in Tata Power SED needed a website and we decided to create it. I created an interactive prototype in 3 days. Made good use of free and open source code available on the internet. More about it in this blog post.




Monday, March 10, 2014

Setting the fastdial page as your homepage

I've always found it more productive to have the fastdial (it's a Firefox addon like speeddial of Opera) page open for me whenever I open my browser.

The latest version though, didn't show fastdial as the homepage. So a bit of digging up got me this:

chrome://fastdial/content/fastdial.html

Use the above link as your homepage, set Firefox to open the homepage when you open the browser and set Fastdial to show up when you open a new tab, and you'll have your most-used websites at your fingertips with fastdial.



Sunday, March 2, 2014

A minimalist interface

Downloaded and started using the GitHub client for Windows today and noticed that they had designed the application to have a minimalist interface. So beautifully designed!

Creating a minimalist interface isn't easy though. Takes a lot of planning and guts to put on the screen nothing more than what is actually required. I'm a fan already :)

Here's Martin Fowler's views on it and the KISS principle which support it. GitHub client's interface also reminded me of the clever no-click interface created by the institute for interactive research.



Unite. A hobby project

Unite, is a project I began working on, when I wanted to re-learn web app programming. The project is designed to have a highly customizable front-end, a robust back-end and either a relational or a graph database. The project is hosted on GitHub under GPL v3. This is also meant to serve as a project that will give me a deeper understanding of using Git, continuous integration (Jenkins), Issue tracking (Trac), automated testing, automated code coverage checking, build scripting (Gradle), automated bug finding and deployment (Phew! Big target to achieve with the limited time I get everyday). This page captures the progress of the project.

Setting up the basics

Setting up a new project on GitHub was a breeze. Once done, I cloned the repository onto my local machine and using SmartGit, created an authentication token, the folder structures, spent an awful lot of time learning Gradle by myself and decided to use Gradle with Netbeans (which has Gradle support built-in) because the Eclipse plugin ended up giving me some errors during build. Setting up a continuous integration build right from the start was a practice I wanted to follow, so after installing Jenkins (tried Hudson too. It's good, but I liked Jenkins' interface better), it's plugins and successfully figuring out how to trigger a build on Git commit (this is a better approach than making Jenkins poll to check for code changes), the project was ready for some real coding.

D3.js as a general purpose data visualization library on the web

What would one do when one wants to use JavaScript to graphically display some data or statistics on a web-page? Use a library of course. I saw a lot of libraries, but was shocked at what d3.js had to offer. Just have a look at these:



Amazing! The initiators are Michael Bostock, Jeffrey Heer, Vadim Ogievetsky, who created d3.js (BSD license) based on the experience they had from the stepping stones of other similar projects that didn't work out very well.

It takes a while to figure out how to use d3. If you have a good understanding of JavaScript, you can start off right away. If not, the concepts of anonymous functions and closures will help you learn. Most of the impressive functionality can be implemented with just the d3.js file (319kB). A more compressed version of the file d3.min.js (144kB) is also available. More advanced functions are available in the supporting script files of d3.

A novice would find it surprising, the way d3.js works. By selecting elements of the DOM before they're even created. By passing variables like "d" and "i" internally, which don't seem to be declared anywhere.

But that's the challenge that makes it worth learning! D3 is a tool with which you can use on any area of the DOM. You can create any kind of visualization you want.

To make d3.js simpler, there are encapsulating libraries like nvd3, c3, cubism and rickshaw.

Went through the source code of d3 as usual, and was completely taken aback when I saw they've used the actual pi, phi and lambda symbols as variable names! Decided to ask my community, and here's what they had to say about it. Although it looks fancy, it's better to stick to variable names rather than symbols. Psst...if you want to generate pi on your screen, make sure the num lock on your keyboard is on; then keep the alt key pressed and type 227 on the num pad and you'll get the pi symbol like this ( π ). I pasted it in notepad, and it didn't turn into a junk character. Cool, isn't it?!
Jeff Atwood had an article on the use of unicode too (the 'entity' word is to be replaced by a heart symbol).

After dabbling with d3.js for about a week, I created an ajax program to query a servlet for data and display the retrieved data on a d3 graph. Worked like a charm!

A nice source for learning are the tutorials from the main website, practically trying it out a little, a free book and if that isn't enough, more than a thousand examples with sources, for you to refer. Definitely a work of art!

Saturday, March 1, 2014

Keeping those wires all neatly wrapped up (and a point on wireless electricity)

Well, as software people, we also have to deal with hardware issues :)
One of them, is getting wires in place. While there are various clever ways to do it, the one that solves the problem of keeping earphones nicely and inexpensively wrapped up, is this one.

This could have been a time and age where we would not have had to deal with wires. It'd have been a reality if Tesla's Tower of Power wasn't pulled down by economic problems and a short-cut, cost-effective solution to communication by Marconi.
More on the Wardenclyffe Tower here: http://en.wikipedia.org/wiki/Wardenclyffe_Tower
Same story told in a damn-interesting way :-)  http://www.damninteresting.com/teslas-tower-of-power/

It intrigues me, the way some people develop an intuitive understanding of a subject. Tesla understanding the working of electricity, in this case. Einstein, understanding the concept of relativity. Newton and gravity.

What also intrigues me is the way commerce isn't designed to produce the best possible outcome. Corporates always go for the short-term approach which makes money (and hence sustains life), rather than the long-term approach which could have sustained life in a much better way. A concept called Hyperbolic Discounting.

Looking forward to a truly wireless future.