Tuesday, February 7, 2017

New Blog Website

After nearly six years, it is time to retire this blog. All my posts from now on will be put up at:

There are many improvements coming up on that site in the near future. Thanks for reading :)

Monday, December 19, 2016

What I've been upto

This semester has gone a little too fast for my liking. Though there were plenty of good memories and takeaways from this semester, it has been by far my most stressful time in this college yet. Between taking on a number of technical projects and trying to rescue a sharply falling SG due to a poor T1, there has been very little free time this sem. Above all, this sem has shown me just how limited of a resource brain power is. Thinking about solving problems wears me out much more easily than it used to.

That's not to say what I've been doing is all drudgery. Some interesting projects that I've been working on:

GSoC 2016 Project - kio-stash

Yup, this project has been in the pipeline for months. While it (mostly) works on a clean install of KDE, it has some bugs with copying with mtp:/ device slaves and isn't very well integrated with Dolphin yet. It is in my best interest to have this shipped with KDE Frameworks as soon as possible, so I'm looking into patching Dolphin with better, more specific action support for my project.


IEEE Signal Processing Cup 2017 - Real-Time Beat Tracking Challenge

The premise of this project doesn't seem very complicated - a team just needs to submit an algorithm which can successfully detect the beats in a song in real-time on an embedded device. Heck, I had already implemented the same on an Arduino with a microphone for rather fancy lighting in my hostel room. Unfortunately, as I've learned the hard way, anything that looks simple is deceptive and this project is a perfect example. For one thing, a song by itself in the amplitude-time domain is nearly impossible to extract any data from, so it requires a (Fast) Fourier Transform to extract frequency bin amplitudes to get anything useful from it. Next, obtaining beat onset and detection requires generating a tempogram to find the BPM of a song to find the approximate beat positions. There are many interesting approaches and different algorithms to solve this problem. Fortunately, I'm not doing this alone and the seniors I'm working with have a better understanding of the more difficult mathematical components of this project, leaving me free to code in C++ and deploy it on actual hardware.



This project is a society on campus I started with three programmers (https://github.com/Nischay-Pro/)[far] more competent than myself. It all started in September this year when we had the two-day long Wikimedia Hackathon on campus. Though my contribution to Wikimedia was small, I got a lot out of the hackathon by meeting the people from Amrita University who came for organising the event. Listening to what Tony and Srijan had to say about how much working for foss@amrita had benefited them made me realise how much room for improvement there was in BPHC. As far as this society goes, things are still in their infancy, yet I feel there is just enough critical mass of talent and enthusiasm in open source development to push this society forward. We even have our own Constitution!


Making a personal website?

While Blogspot has been a faithful home for this blog for over half a decade, it is time to move to a modern solution for hosting. Plus setting up a website will teach me a bit about web development too, and I've needed an excuse to learn it for a while. Surely it can't be all that hard, right?



While the slew of all these technical projects seemed like a good idea at the time, it has pushed me closer to burning out. It is the same feeling as what I felt the same time last year, albeit for different reasons.

Some of it has carried over from studying harder at the end of this sem than I had done so before. To my surprise, studying under pressure was actually more effective than it was without. In some ways, it was a throwback to studying for the number of exams nearly a couple of years ago. It has made me question whether any of my education was as much for the knowledge as it was for the desperation of avoiding failure. I still haven't figured it out, but at least I feel like I'm not as adverse to putting in the hours for getting a decent CGPA as I had been last semester.

There have been compromises in other spheres of college life as well, investing so much time in studying or doing projects has made me cut down my participation in other clubs and I've quit nearly all the non-technical clubs I joined last year. There's more than that too - I feel it's much harder to be fully immersed in anything anymore.

Maybe it's just something else which requires more soul searching.

Tuesday, August 30, 2016

GSoC Report - Wrapping up GSoC 2016

That’s it. After a combined total of 217 git commits, 6,202 lines of code added, and 4,167 lines of code deleted, GSoC 2016 is finally over.

These twelve weeks of programming have been a very enriching experience for me and making this project has taught me a lot about production quality software development. Little did I know that a small project I had put together in a 6 hour session of messing around with Qt would lead to something as big as this!

There have been many memorable moments throughout my coding period for the GSoC - such as the first time I got an ioslave to install correctly, to writing its “Hello World” equivalent, and getting a basic implementation of the project up and running by doing a series of dirty hacks with Dolphin’s code. There were also times when I was so frustrated with debugging for this project, that I wanted to do nothing but smash my laptop’s progressively failing display panel with the largest hammer I could find. The great mentorship from my GSoC mentor and the premise of the GSoC program itself kept me going. This also taught me an important lesson with regards to software development - no one starting out gets it right on their first try. It feels like after a long run of not quite getting the results I wanted, the GSoC is the thing which worked out for me as everything just fell into place.

There’s a technical digression here, which you can feel free to skip through if you don’t want to get into the details of the project.

Following up from the previous blog post, with the core features of the application complete, I had moved on to unit testing my project. For this project, unit testing involved writing test cases for each and every component of the application to find and fix any bugs. Despite the innocuous name, unit testing this project was a much bigger challenge than I expected. As for one thing, the ioslave in my project is merely a controller in the MVC system of the virtual Stash File System, the Dolphin file manager, and the KIO Slave itself. Besides, most of the ioslave’s functions have a void return type, so feeding the slave’s functions’ arguments to get an output for checking was not an option either.

This led me to use an approach, which my mentor aptly called “black box testing”.

In this approach, one writes unit tests testing for a specific action and then checking for whether the effects of the said action are as expected. In this case, the ioslave was tested by giving it a test file and then apply some of the ioslave’s functions such as copy, rename, delete, and stat. From there, through a bunch of QVERIFY calls is to check whether the ioslave has completed the operation successfully. Needless to say, this approach is far more convoluted to write unit tests for as it required checking each and every test file for its properties in every test case. Fortunately, the QTestLib API is pretty well documented so it wasn’t difficult to get started with writing unit tests. I also had a template of what a good test suite should look like thanks to David Faure’s excellent work on implementing automated unit testing for the Trash ioslave. With these two tools in hand, I started off with writing unit tests shortly before the second year of college started.

As expected, writing black box unit tests was a PITA in its own right. The first time I ran my unit test I came up with a dismal score of 6 unit tests passed out of the 17 I had written. This lead me to go back and check whether my unit tests were testing correctly at all. It turned out that I had made so many mistakes with writing the unit tests that an entire rewrite of the test suite wasn’t unwarranted.

With a rewrite of the test cases completed, I ran the test suite again. The results were a bit better - 13 out of the 17 test cases passed, but 4 failed test cases - enough reason for the project to be unshippable. Looking into the issue a bit deeper, I found out that all the D-Bus calls to my ioslave for copy and move operations were not working correctly! Given that I had spent so much time on making sure the ioslave was robust enough, this was a mixed surprise. Finally, after a week of rewriting and to an extent, refactoring the rename and copy functions of the ioslave, I got the best terminal output I ever wanted from this project.

Definitely the highest point of the GSoC for me. From there on out, it was a matter of putting the code on the slow burner for cleaning up any leftover debug statements and for writing documentation for other obscure sections. With a net total of nearly 2000 lines of code, it far surpasses any other project I’ve done in terms of size and quality of code written.

At some points in the project, I felt that the stipend was far too generous, for many people working on KDE voluntarily produce projects much larger thann mine. In the end, I feel the best way to repay the generosity is to continue with open source development - just as the GSoC intended. Prior to the GSoC, open source was simply an interesting concept to me, but contributing a couple of thousands of lines of code to an open source codebase has made me realise just how powerful open source is. There were no restrictions on when I had to work (usually my productivity was at its peak at outlandish late night hours), on the machine I used for coding (a trusty IdeaPad, replaced with a much nicer ThinkPad), or on the place where I felt most comfortable coding from (a toss up between my much used study table or the living room). In many ways, working from home was probably the best environment I could ask for when it came to working on this project. Hacking on an open source project gave me a sense of gratification solving a problem in competitive programming never could have.

The Google Summer of Code may be over, but my journey with open source development has just begun. Here’s to even bigger and better projects in the future!

Thursday, July 21, 2016

GSoC Update: Tinkering with KIO

I'm a lot closer to finishing the project now. Thanks to some great support from my GSoC mentor, my project has turned out better than what I had written about in my proposal! Working together, we've made a lot of changes to the project.

For starters, we've changed the name of the ioslave from "File Tray" to "staging" to "stash". I wasn't a big fan of the name change, but I see the utility in shaving off a couple of characters in the name of what I hope will be a widely used feature.

Secondly, the ioslave is now completely independent from Dolphin, or any KIO application for that matter. This means it works exactly the same way across the entire suite of KIO apps. Given that at one point we were planning to make the ioslave fully functional only with Dolphin, this is a major plus point for the project.

Next, the backend for storing stashed files and folders has undergone a complete overhaul. The first iteration of the project stored files and folders by saving the URLs of stashed items in a QList in a custom "stash" daemon running on top of kded5. Although this was a neat little solution which worked well for most intents and purposes, it had some disadvantages. For one, you couldn't delete and move files around on the ioslave without affecting the source because they were all linked to their original directories. Moreover, with the way 'mkdir' works in KIO, this solution would never work without each application being specially configured to use the ioslave which would entail a lot of groundwork laying out QDBus calls to the stash daemon. With these problems looming large, somewhere around the midterm evaluation week, I got a message from my mentor about ramping up the project using a "StashFileSystem", a virtual file system in Qt that he had written just for this project.

The virtual file system is a clever way to approach this - as it solved both of the problems with the previous approach right off the bat - mkdir could be mapped to virtual directory and now making volatile edits to folders is possible without touching the source directory. It did have its drawbacks too - as it needed to stage every file in the source directory, it would require a lot more memory than the previous approach. Plus, it would still be at the whims of kded5 if a contained process went bad and crashed the daemon.

Nevertheless, the benefits in this case far outweighed the potential cons and I got to implementing it in my ioslave and stash daemon. Using this virtual file system also meant remapping all the SlaveBase functions to corresponding calls to the stash daemon which was a complete rewrite of my code. For instance, my GitHub log for the week of implementing the virtual file system showed a sombre 449++/419--. This isn't to say it wasn't productive though - to my surprise the virtual file system actually worked better than I hoped it would! Memory utilisation is low at a nominal ~300 bytes per stashed file and the performance in my manual testing has been looking pretty good.

With the ioslave and other modules of the application largely completed, the current phase of the project involves integrating the feature neatly with Dolphin and for writing a couple of unit tests along the way. I'm looking forward to a good finish with this project.

You can find the source for it here: https://github.com/KDE/kio-stash (did I mention it's now hosted on a KDE repo? ;) )

Tuesday, June 21, 2016

GSoC Update(?): Writing a KIO slave 101!

This project has been going well. Though it was expectedly difficult in the beginning, I feel like I am on the other side of the learning curve now. I will probably make a proper update post sometime later this month. My repo for this project can be found here: https://github.com/shortstheory/staging-kioslave

For now, this is a small tutorial for writing KDE I/O slaves (KIO slaves) which can be used for a variety of KDE applications. KIO slaves are a great way for accessing files from different filesystems and protocols in a neat, uniform way across many KDE applications. Their versatility makes them integral to the KIO library. KIO slaves have changed in their structure the transition to KF5 and this tutorial highlights some of these differences from preceding iterations of it.

Project Structure

For the purpose of this tutorial, your project source directory needs to have the following files.
  • kio_hello.h
  • kio_hello.cpp
  • hello.json
  • CMakeLists.txt
If you don't feel like creating these yourself, just clone it from here: https://github.com/shortstheory/kioslave-tutorial




The .json file replaces the .protocol files used in KIO slaves pre KF5. The .json file for the KIO slave specifies the properties the KIO slave will have such as the executable path to the KIO slave on installation. The .json file also includes properties of the slave such as being able to read from, write to, delete from, among many others. Fields in this .json file are specified from the KProtocolManager class. For creating a KIO slave capable of showing a directory in a file manager such as Dolphin, the listing property must be set to true. As an example, the .json file for the Hello KIO slave described in this tutorial looks like this:

    "KDE-KIO-Protocols" : {
        "hello": {
            "Class": ":local",
            "X-DocPath": "kioslave5/kio_hello.html",
            "exec": "kf5/kio/hello",
            "input": "none",
            "output": "filesystem",
            "protocol": "hello",
            "reading": true

As for the CMakeLists.txt, you will need to link your KIO slave module with KF5::KIOCore. This can be seen in the project directory.



#ifndef HELLO_H
#define HELLO_H

#include <kio/slavebase.h>

  This class implements a Hello World kioslave
class Hello : public QObject, public KIO::SlaveBase
    Hello(const QByteArray &pool, const QByteArray &app);
    void get(const QUrl &url) Q_DECL_OVERRIDE;


The Hello KIO slave is derived from KIO::SlaveBase. The SlaveBase class has some basic functions already implemented for the KIO slave. This can be found in the documentation. However, most of the functions of SlaveBase are virtual functions and have to be re-implemented for the KIO slave. In this case, we are re-implementing the get function to print a QString when it is called by kioclient5.

In case you don't need special handling of the KIO slave's functions, you can derive your KIO slave class directly from KIO::ForwardingSlaveBase. Here, you would only need to re-implement the rewriteUrl function to get your KIO slave working.


#include "hello.h"
#include <QDebug>

class KIOPluginForMetaData : public QObject
    Q_PLUGIN_METADATA(IID "org.kde.kio.slave.hello" FILE "hello.json")

extern "C"
    int Q_DECL_EXPORT kdemain(int argc, char **argv)
        qDebug() << "Launching KIO slave.";
        if (argc != 4) {
            fprintf(stderr, "Usage: kio_hello protocol domain-socket1 domain-socket2\n");
        Hello slave(argv[2], argv[3]);
        return 0;

void Hello::get(const QUrl &url)
    qDebug() << "Entering function.";
    QByteArray str("Hello world!\n");
    qDebug() << "Leaving function";

Hello::Hello(const QByteArray &pool, const QByteArray &app)
    : SlaveBase("hello", pool, app) {}

#include "hello.moc"

The .moc file is, of course, auto-generated at compilation time.

As mentioned earlier, the KIO Slave's .cpp file will also require a new KIOPluginForMetaData class to add the .json file. The following is used for the hello KIO slave and can be used as an example:
class KIOPluginForMetaData : public QObject
    Q_PLUGIN_METADATA(IID "org.kde.kio.slave.hello" FILE "hello.json")


cmake_minimum_required(VERSION 3.5)
set(QT_MIN_VERSION "5.4.0")
set(KF5_MIN_VERSION "5.16.0")


include(KDECompilerSettings NO_POLICY_SCOPE)
add_library(kio_hello MODULE hello.cpp)
target_link_libraries(kio_hello KF5::KIOCore)
set_target_properties(kio_hello PROPERTIES OUTPUT_NAME "hello")



Simply run the following commands in the source folder:

mkdir build
cd build
sudo make install

As shown above, we have to run kdeinit5 again so the new KIO slave is discovered by KLauncher and can be loaded when we run a command through an application such as kioclient5.


kioclient5 'cat' 'hello:/'

And the output should be:


Monday, May 30, 2016

GSoC Update 1: The Beginning

I have officially started my GSoC project under the mentorship of Boudhayan Gupta and Pinak Ahuja.

The project idea's implementation has undergone some changes from what I proposed. While the essence of the project is the same, it will now no longer be dependent on Baloo and xattr. Instead, it will use a QList to hold a list of staged files with a plugin to kiod. My next milestone before the mid-term evaluation is to implement this in a KIO slave which will be compatible with the whole suite of KDE applications. 

For the last two weeks, I've been busy with going through hundreds of lines of source code to understand the concept of a KIO slave. The KIO API is a very neat feature of KDE - it provides a single, consistent way to access remote and local filesystems. This is further expanded to KIO slaves which are programs based on the KIO API which allow for a filesystem to be expressed in a particular way. For instance, there is a KIO slave for displaying xattr file tags as a directory under which each file marked to a tag would be displayed. KIO slaves even expand to network protocols allowing for remote access using slaves such as http:/, ftp:/, smb:/ (for Windows samba shares), fish:/, sftp:/, nfs:/, and webdav:/. My project requires virtual folder constructed of URLs stored in a QList - an ideal fit for KIO slaves.

However, hacking on KIO slaves was not exactly straightforward. Prior to my GSoC selection, I had no idea on how to edit CMakeLists.txt files and it was a task to learn to make one by hand. Initially, it felt like installing the dependencies for building KIO slaves would almost certainly lead to me destroying my KDE installation, and sure enough, I did manage to ruin my installation. Most annoying. Fortunately, I managed to recover my data and with a fresh install of Kubuntu 16.04 with all the required KDE packages, I got back to working on getting the technical equivalent of a Hello World to work with a KIO slave.

This too, was more than a matter of just copying and pasting lines of code from the KDE tutorial. KIO slaves had dropped the use of .protocol files in the KF5 transition, instead opting for JSON files to store the properties of the KIO slave. Thankfully, I had the assistance of the legendary David Faure. Under his guidance, I managed to port the KIO slave in the tutorial to a KF5 compatible KIO slave and after a full week of frustration of dealing with dependency hell, I saw the best Hello World I could ever hope for:

Baby steps. The next step was to make the KIO slave capable of displaying the contents of a specified QUrl in a file manager. The documentation for KProtocolManager made it seem like a pretty straightforward task - apparently that all I needed to do was to add a "listing" entry in my JSON protocol file and I would have to re-implement the listDir method inherited from SlaveBase using a call to SlaveBase::listDir(&QUrl). Unbeknownst to me, the SlaveBase class actually didn't have any code for displaying a directory! The SlaveBase class was only for reimplementing its member functions in a derived class as I found out by going through the source code of the core of kio/core. Learning from my mistake here I switched to using a ForwardingSlaveBase class for my KIO slave which instantly solved my problems of displaying a directory.


According to my timeline, the next steps in the project are
  1. Finishing off the KIO slave by the end of this month
  2. Making GUI modifications in Dolphin to accommodate the staging area
  3. Thinking of a better name for this feature? 
So far, it's been a great experience to get so much support from the KDE community. Here's to another two and a half months of KDE development!

Saturday, April 23, 2016

It has happened - GSoC 2016 Selection!


I have been selected for the Google Summer of Code!

For the better part of the summer vacation, I will now be committing myself to write code for KDE to implement my project idea of implementing a virtual folder in Dolphin to make it easier to select files.

As a primer, the Google Summer of Code (GSoC) is an annual event organized by Google for drawing students to work on open source projects with a nice stipend, goodies, and fame. The GSoC is a term one would hear pretty frequently when talking about the technical prowess and coding culture of a college.

This year, BITS Pilani - Hyderabad Campus had a record number of a total of 7 selections! This is more than double of our previous record. This in some ways, might be the start of the technical culture wave this campus was looking for so long.

The File Tray idea for the GSoC came at a difficult time, hardly a month after the entrance exams in 2015. It was at a time I was frustrated with everything I had done and I didn't have any energy to pursue anything at all having been completely drained out by the entrance exams prior to it. From there, the project sat on the list of "Things I Might Do In The Distant Future". The project idea was known only to a few close friends and my tiny programming diary.

It was only till November 2015 when I stumbled across the GSoC. I began looking at open source file managers for which I could implement my project idea. I had been using Linux with various desktop environments for about 4 years at that point, so I had a pretty decent idea of what to look for. Writing this feature for GNOME's Nautilus was the first thing I looked into as I had been using Nautilus for a while and I was a big fan of Nautilus's simple to use interface. But, the problem was that Nautilus was a C/GTK+ project and I had no desire to move on to using C after having C++ in my comfort zone for a very long time. Fortunately, Dolphin, one of the best file managers I had used since my days of using KDE, used C++/Qt, a toolset I am much better with. I felt my project idea was a natural fit for Dolphin's Split view mode. KDE also had an excellent record in the GSoC with a very good number of slots and a high percentage of successful projects. This began my tryst with Open Source development.

From there on, I taught myself Qt and during a Diwali vacation on campus, I managed to make a very rough prototype application of my project after coding for 6 hours straight from 11pm to 5am the next day. Following this, I subscribed to KDE's mailing lists and after lurking around for a while, I started asking for feedback on my GSoC idea. With surprisingly positive feedback from numerous KDE developers, I realized that there might just be a non-zero chance of getting selected.

Things quickly began falling into place and I then moved on to the next step of hunting around for bugs I could fix and new features I could implement for Dolphin. The bug-fixing was as enjoyable as it was occasionally frustrating. Reading over 20000 lines of code certainly took its toll when I had no idea when how different parts of the application meshed together. In the end, thanks to the guidance of Dolphin maintainer, Emmanuel Pescosta, I managed to fix a couple of things for Dolphin and moved on to the next step of making a proposal for my GSoC application.

Starting off with making a competent proposal was like launching off ground zero as there were very few people who had successfully completed the GSoC from our campus and most of these people had graduated well before this time. I started digging around for proposals accepted by KDE in previous GSoC's. What I couldn't get from all the proposals was some sound advice from seniors. In particular, Naveen Jafer bhaiya (who also went on to achieve a GSoC project of his own!) helped me with making my proposal as good as possible. In the end, after painstakingly checking every word in my proposal for what felt like the fiftieth time I submitted it on 25 March, only to spend an anxious month waiting for the results which came out at 1230am IST on April 23. While it still hasn't sunk in yet (!), I am sure that this will make for an awesome summer vacation!

Thursday, April 14, 2016

What do I do now?

I spend a lot of time thinking since I've joined college.

I had postponed a lot of introspection during the two years I spent slogging away for the JEE. But now, with ample free time and practically no requirement to go for classes, I've finally got some time to look back and see how things have turned out. Things started off on the back foot, and while 1-1 had its charms, I wasn't exactly happy about how things had turned out at the time due to a bad time with the entrance exams for all the wrong reasons.

But I digress, as time has passed, I have learned to live with my failure a little better every day, though it still sticks out like a sore thumb on an otherwise decent academic profile. What has turned out to be an interesting exercise is to compare what I expected from college a year ago and reality.

To be fair, BITS Pilani (this applies to all campuses, but in this case, Hyderabad Campus) has some of best internal systems among all Indian colleges. Optional attendance, good grading system, decent infrastructure, and a lot of freedom is more than what can be asked for a lot of other colleges. Despite some glaring flaws such as a lack of a solid technical culture, this college has punched above its weight for such a new institution.

But as an engineering utopia? I feel like we are way short of the mark Aaron Swartz mentioned in his blog:

"Perhaps it’s natural, when doing something so greedy and practical as a startup, to pine for the idealized world of academia. Its image as a place in an idyllic location filled with smart people has always been attractive; even more so with the sense that by being there one can get smarter simply through osmosis. People describe a place of continual geekiness, of throwing chemicals into the river and building robots in free time. A magical place for hackers to just enjoy themselves."

This aside, I am of the opinion that the version of me a year ago would have been sorely disappointed by the version of me today. I feel that I was much more hardworking and efficient back at that time. The two years in JEE preparation were undoubtedly the worst years of my school life but now looking back, it was the time which did bring out the best of me in the briefest of moments. I would have had no idea just how driven and hard-working I could be for a goal that would always be just a touch out of view.

Despite my frustrations with life during JEE preparation, the epiphanies I used to have on weekly basis with studying physics during JEE kept me going. It was a positive feedback loop with no goading required. On the other hand I can't remember the last time I actually enjoyed learning something in class in this college. I hope it isn't a sign of things to come when I start "engineering" coursework in my 2nd year but I have pretty much lost all motivation to study.  The unbridled enthusiasm I used to have when studying for entrance exams and the giddy thoughts of making batshit crazy projects in college has dwindled. In my first semester, it was a convenient excuse to blame this on burnout after pushing my limits for two years but I've come to realize that the reason is probably shallower than that. It's not just with academics though - wasting time still feels painful but I have nothing I want to do to fill in the gaps. Is there a cause for this? Probably. Have I figured it out? Absolutely not.

It feels like an artificial conflict of time between these misguided academic pursuits and to actually work on something worthwhile. I could put up with it in school with the thought that there would be enough free time to pursue this in college - and while there is - it begs the question why such artificial restraints on time in the form of exams are always looming in the first place.

At this point of time, I don't know what to do. With compre in half a month but a GSoC project and a couple other projects I've planned in the pipeline, it's a pretty easy decision to make the choice of which one of these two things I would want to work on. For a CGPA for which I cannot care for anymore, it might be one of the worst decisions I can make.

Monday, February 15, 2016

GSoC 2016 Project Survey, help me make Dolphin a better File Manager!

Hey everyone!

I am a first year computer science undergraduate from BITS Pilani, Hyderabad Campus. I am looking forward to working for KDE for the GSoC.

My project idea is based on solving a problem all file managers have had for years - the lack of an easy to use file selection tool. My project aims to simplify selecting files from multiple directory trees.

I am running a survey to gauge community feedback on my idea and to finalize the user interface and features list.

The link to my idea proposal can be found here: https://goo.gl/1Nj4SY

And the link to my survey can be found here: https://goo.gl/forms/5JSZXNganX

TIA for the feedback : )

Sunday, January 31, 2016

Composite Photography

Ever since I got my new Canon 700D, I've been looking more into photography as an art than ever before. Thanks to internet photography guides, less light pollution in uni campus than urban Bangalore, and some more proficiency with editing software, I've been able to produce more interesting photos than before. Another thing which I've changed is my stance on editing. Until recently, I was of the opinion that my photos should be as virgin as possible, with editing restricted to nothing more than cropping or watermarking. Now, I subscribe to the more accepting (but still conservative) school of thought: that editing should be used to bring out the best of an image while keeping its basic elements intact.

However, contradictory to the above, one photography art form I've really enjoyed doing is photography using composite pictures. In composite photography, the photographer takes several frames of a scene and then combines all the frames together using special software. I guess my favorite part about it is the surprise element of the final image - I have no idea what the output is going to be till I've post-processed the images on my laptop computer. It's been very early days for me when it comes to composite photography, but here are a few photos I've felt are worth sharing:

Star trails! I've always wanted to try my hand at astrophotography, but never could due to Bangalore light pollution and due to not having a camera with good noise reduction.

These two images take advantage of the comparatively lower light pollution in the campus. These photos are a stacked result of multiple exposures - the first one combines fifty frames and the second one combines nearly a hundred. Each frame uses identical settings for the best stacking results.

We shot these from midnight till 2am using  laptops for camera tethering and intervalometer settings. I can't stress on how important having a tripod is for this - the slightest shift between frames would've given us terrible discontinuity in the final image. The final images were composited using StarStaX.

360 degree panorama image of BITS Pilani, Hyderabad Campus! Taken from the middle of the football field, it is a panorama of 33 images stitched using hugin for Linux. I set up the camera in a portrait orientation with the tripod and tried to make a composite by overlapping 30-40% of each image. Post processing felt like it took forever due to the gigantic images and the final image was a whopping 70.2MP (30000x2404) and is 130 MB large. Although a couple of frames were shot using the wrong exposure settings, hugin managed to do a really good job in keeping the differences minimal though there still are a couple of splotches due to my ineptitude. The uncompressed, full size version is here: https://goo.gl/iY5v14

This little planet picture uses the same panorama as the previous image. It's a much simpler to post process this with a panorama than it appears. It was created by resizing the image to a square following a polar coordinate filter transformation in GIMP to roll the image and to line up the ends. If I had to do this image again, I would redo it at night with long exposures to give it a more spacey flavor.

As closing remarks, I'm overall pretty satisfied with how easy it is to make simple composite pictures using software. I will probably get back into making more of this again, but probably after I work on another project ;)

Wednesday, June 17, 2015

T+2 Years And Counting: My IIT-JEE preparation story

As the title indicates, it's been a while since I've written anything here. I don't know if anyone still reads this blog, but I sure appreciate if you do!

So, I guess some explanation is due here - it's been a combination of my lack of cohesive thought and lack of motivation to publish anything. Part of the reason is also that I've given a shot at the IIT-JEE which is something that I've wanted to write about for a while.

For the uninitiated, the IIT-JEE is an entrance exam for the IITs which are regarded by some as the best engineering colleges in India. The exam is held at the end of 12th grade annually. Hundreds of thousands attempt the exam. Tens of thousands slog away countless hours of their last few years in high school preparing for it. Only a few hundred actually succeed.

Like many with some strong aspirations of becoming an engineer, I stumbled upon this path a couple of years ago. I loved making/breaking things and had (what I felt) a keen interest in science, so it was a natural option for me to take some engineering related field over other options. I loved airplanes too and I would spend many happy hours on Wikipedia reading up about the Concorde (gorgeous plane), the XB-70, their engines, their airframe designs, and the engineers behind it all. I was fiercely determined to enter the aviation industry as an aerospace engineer to create a revolutionary aircraft on the lines of the Concorde.

It's an unspoken reality that one's chances at IIT-JEE significantly decrease without the assistance of extra classes outside school, also known as coaching classes. I joined one at the start of the summer vacation prior to 11th called FIITJEE after getting a decent fee waiver via their admission test. I was no stranger to horror stories of 11th and 12th grade for school students, but I felt things would change for the better after the brain-numbing syllabus of 10th grade.

And it did. To an extent. Things passed very quickly through the first few months of FIITJEE where I was tirelessly trying to understand every fragment of information that would probably help in making it through with a good rank in IIT Advance. My math wasn't strongest to begin with and I trudged along with chem with ambivalence to the subject material. Studying physics, both in class and at home was amazing. Thanks to our FIITJEE physics teacher, one of the best teachers I've ever had, physics by acompared long shot became my favorite subject for the next two years. It always just clicked and moreover studying physics and learning something new to solve an interesting problem was just fun. I remember physics and chemistry (primarily physics) passing along with relative smoothness but it felt like I was banging my head on a brick wall with math. This led to the vicious cycle of frustration, studying to remedy my weaknesses followed by more frustration when things didn't seem to be getting better. Despite all the apathy towards math I still managed to get through reasonably well with a consistent 2nd place in the phase tests and three digit ranks in the FIITJEE AIiTS. Unfortunately my reckless, unplanned approach towards studying in the first few months cost me greatly in other spheres of life and I was not a happy person to be around.

It was around this point in time when I felt things slipping - yes, decent ranks in the phase tests were welcome but did it actually mean anything in such a sample set? There was also a storm brewing on the horizon - in the form of organic chemistry. Hard as I tried, I could never commit the material to memory. My woes with organic chem were exemplified with a jaw-dropping 11/25 in a school UT...which meant I had spent about 2 hours studying for every mark earned in that test :P

Fortunately things slowly shaped up to look better right after 11th grade. Thanks to some quality teaching at FIITJEE and a lot time with chem textbooks organic chem started to become clearer for me. Shortly thereafter I managed to top Bangalore in FIITJEE's classroom program in the organic chem phase test. Of all the times I've had to bounce back from a tight situation in those 2 years, this was probably my highest point. Suddenly, exactly a year before IIT Advance 2015, the metaphorical glass was half full and no longer half empty. There was a calm feeling of conviction of a good possibility of me making it all the way for a 3 digit rank in IIT. Yes, my math was still well behind physics and chem but I had a year to work on it, right?

Well not exactly. It just so happened that 12th grade started in full flow at this point and the constant neglect I had given to the school syllabus in 11th grade was no longer feasible. I couldn't continue just scraping by the school exams with minimal preparation as I had done in 11th. It dawned on me that I would have to manage both school and FIITJEE a lot more efficiently if I had to have a chance with making it to a good college. While physics was chugging along well, math severely needed a shot in the arm and chem got a whole lot uglier with 4 (or was it 5?) full organic chapters hastily finished off in FIITJEE just days before phase test 4. The neglect with the other two subjects was all too visible with me scoring 20 marks more in physics than chem and math combined (no I'm not a savant in physics, just an idiot with math :P). In the middle of all this, a few competitive programming experiences realigned my goals with respect to computer science and I started liking it almost as much as I used to obsess with aerospace engineering in the past.

For me, this turned into the beginning of a massive decline. For whatever reason, I succeeded in trashing both the KVPY and the NSEP - my biggest targets for 12th grade. School marks were about okay, but still less than ideal. Not in a great shape right now, huh? It proceeded to get worse when on one day in December 2014 I heard the news that because of my US citizenship, I was essentially out of the race for NITs, IIITs (note I was still in the running for IITs though) and a bunch of local colleges in Karnataka as well.


My passion for physics notwithstanding I might as well not have studied at all for IIT till then. It was a pretty big blow. Fortunately, what the government taketh, they giveth. I could make it to NITs through their international program (DASA) solely through subject SAT scores which shouldn't be to big of a deal given all the study towards JEE. If you've been reading this closely, you would have probably guessed that even that wasn't exactly straightforward since the only available day to attempt the subject SAT before the deadline was December 6, exactly a week after I heard about this scheme. The subject SATs themselves were uneventful - 2400. Incidentally, at this time math finally seemed to be shaping up for the first time since I chanced upon this business with FIITJEE. I could reasonably solve problems when in the mood which was a big change from how I used to dawdle with the subject earlier.

Little did I know that is was the beginning of the biggest low I experienced - school pre-boards in January 2015 was an unmitigated disaster. 55% in math and about the same in chem with similarly bad marks across the board in CSc, physics, and English made for some very unpleasant conversations with my parents. Forget about JEE, at that point, even making the 80% in boards for qualifying cutoff was looking distant. Intertwined in this was the new BITS Hyderabad international admissions program which also made use of the good subject SAT score! But the twist was that they needed SAT reasoning scores too - which left me (yet again) with no option to attempt it within a week's time after the pre-boards to make the deadline. Gave it my all - 2220 overall or 1580/1600 CR+Math. With some assurance of BITS Hyderabad, college entrance exams totally took a backseat from the beginning of this year, the primary focus from then on being the board exams.

It took a lot of effort to get started - those pre-board marks were not going to fix themselves and I had to make up almost the full year's syllabus in a bit more than a month to stand a chance. Eventually, the rote-learning mode grew on me and the board exams came and went in March without too much drama. Just the day before my last board exam, BITS Hyderabad sent an offer letter for taking up CSc at an 80% scholarship! For a few sweet minutes the pressure of the last two years was off.                

If you haven't slept off yet reading through all that, here's where it started to get interesting. Board exams done and dusted left me free to attempt the set of entrance exams at will - the main ones being JEE Mains/Advance and the BITSAT. With BITS Hyderabad CSc, I was of the opinion things could only get better as I could attempt all the exams with a free mind. This went on to be reasonably true - I picked up 206 in JEE Mains with a solid 88 in physics, 83 in chem, and 35 (:P) in math. Though I would've hoped for it bit more, it turned out to be a better score than I thought it would be as the cutoffs had dropped by 10 marks from the previous year and that very few in my batch had scored higher. Much later on, it transpired that this JEE Mains score with my 95+% in CBSE would give me a decent shot at getting CSc at NIT, Surathkal campus, Aerospace Engineering at IISt, and hell, even decent choices at IIIT-H had it not been for my US citizenship. With this Mains result in hand, it led me to a crucial decision - study for the BITSAT and go for it all to get CSc at Pilani campus? Study for JEE Advance instead to salvage a decent rank especially since BITS unifies their curriculum across campuses? I decided to go for the BITSAT - after all my math was in no condition for the brunt of JEE Advance but I had a good shot of making up to a respectable level for the BITSAT, which is an objectively much easier exam.

This quickly turned into an obsession - with a BITSAT textbook by my side I started optimising and gaming the whole test to the minute with well divided time sections for all the subjects and strategies for almost all the possible outcomes at each stage. Math felt like it was finally on par with the other two subjects. With strong 350-370 scores after attempting all the questions in all the mock tests without the bonus 12 questions, it looked like that the dream of two years was finally within my grasp.

But, for some inexplicable reason, I felt tremendous pressure just hours before the exam when I should have been getting a sound sleep. It was awful and I only managed to catch a few hours of sleep after finally going to sleep at 2am on the day of the exam scheduled at 830am.

The sleep deprivation didn't augur well but that only partially sealed my fate. The invigilator gave me more rough paper than I was supposed to be given before the exam (the two rough booklets were somehow glued back to back), only to realize his mistake when I started the math section.

This can't be happening, I thought. This isn't how it's supposed to all end.

My extra rough sheets were confiscated by the proctor and then it hit me that this really was the final nail in the coffin. At that very moment the blood drained from my face realising that my chances were slipping by the second. With 90 minutes left to go but with no rough paper I was very much on the verge of giving up knowing that it really couldn't be worse. Math was never my strongest subject but attempting it without any rough paper was completely out of the question. Despite all this, I realized that I couldn't just let a dream of 2 years fall apart for such a pathetic issue and still went on with the test - guessing everything I could on the math section.

I went for the extra 12 questions which were fine but the I knew the damage done from fluking most of math was irreparable. With the most anxiety I've ever experienced, I clicked the "Submit Test" button to see how I had done.

Your score: 307*
*It was later revised to 311; 118/43


Surely it was just my sleep deprived brain that was seeing things, right? I rubbed my eyes, half expecting the last two digits of the score to reverse.

I opened my eyes again. No change. Then I glanced towards the bottom of the screen and then I knew I had truly screwed the pooch.

Correct: 117
Incorrect: 44

(Correctly marked answers are worth 3 marks and incorrectly marked answers lose 1 mark from the total)    

I stumbled out of the exam room/computer lab feeling absolutely numb. Speech was difficult without a torrent of tears.

BITS Pilani CSc, heck, CSc at any BITS campus through BITSAT was an impossibility. It felt crushing and terrible to work so hard and to get so close only to ruin everything on the day of the exam for some issue that I had no control over. That day was not the first time I cried myself to sleep in those two years, but at least there was a silver lining in getting another chance to do well in some other exam. There was none this time.

Strangely the only solace at the time was that I had to give JEE Advance (is it spelled Advanced? My bad if it's wrong) with absolutely no preparation due to preparing for the BITSAT instead. So, I ended up with only three days to prepare for JEE Advance and did nothing more than three previous year's papers to make sure I wasn't wasting time on any particular section and to ensure I hadn't lost too much touch.

24 May 2015 was the day. I knew I was going to be in serious trouble before even opening the question paper - the cover page of the question paper itself indicated that the next three hours were going to be pure torture with a ridiculous +4/-2 marking scheme on multiple correct option questions (this means more than one of the given MCQ options could be correct and failing to mark all the correct options would make one lose 2 marks), +4/0 integer type (think: a free response question with values from 0-9), and +2/-1 match the following (which is a whole lot more sinister than it sounds when you realise that MORE than one option in a column can be mapped to the other and all the correct options are required to be marked). It was a blur - all I remember was being completely deflated and slightly relieved that my ordeal only had another three hours with Paper 2 which followed a very similarly brutal marking scheme. I felt like I was in with a chance after doing the 2014 and 2012 question papers but there was no way I could squeeze out a good score with this. It was a bittersweet feeling after the those long 6 hours - sweet to think that the sweat and toil of the last two years was finally over and bitter to see how everything concerning my given entrance exams had fallen apart in the last week. The first thing I did on getting home from the exam was to sit down in the garden, on the grass and slowly piece together what exactly had happened. There were no tears as there had been for making a mess of the BITSAT - just a quiet resignation and mild shock that dreams had been shattered for good.

Currently, I'm stuck at the difficult decision with taking BITS Hyderabad CSc BE or trying for a dual degree program at BITS Goa, taking physics and eventually CSc.

Wow, that's easily been the longest single piece of writing I've ever done. I typed most of it on my phone on the plane, so apologies if it doesn't make too much sense. If you've made it all the way here, thanks for reading!

Tuesday, April 23, 2013

Midnight Photography!

Hey guys! I haven't been able to get too many scenic shots of late, so I've invested some of my photography time in taking photos at night. Here are some of the shots that I've recently taken with my camera.

I really like employing this technique. You need to get someone to hold a torch while the camera is mounted on a tripod. The shutter was open for 15 seconds, ample time to draw the chosen letters. It works great for pseudo stop motion too!

Wow, I honestly admit that I didn't expect a shot like this! It was a simple matter to shoot it by mounting the camera and leaving the shutter open for a few seconds. The depth of field is stellar and I think the purple backdrop gives a nice setting to the scene. My only gripe with this photo is that there are too many buildings in between and that it would've looked much better if I had shot it from around 50m above ground level.

The other pictures you see are of the moon (if you haven't realized already :) ) These photos were taken over different days in the span of a few months and hence, the lighting changes considerably. My camera isn't a champion performer under low light conditions and the digital noise at high ISOs is evident. But I'll leave that to you to judge. I tried my best in obtaining relatively clear images (which is a pretty difficult feat when the camera's digital focal length is 2240 mm!)

I hope you enjoyed this edition. Please feel free to drop comments!

Thursday, October 25, 2012

Photography: Volume 4

Hi guys! Recently bought myself some free time to publish a brand new blog post, centred on my photography work! 

I guess I also owe all of my avid readers an apology: it's been a really long time since my last photography post, so I hope I can make it up to you in this one!

My previous photography posts:

As usual, just click to enlarge!

Starting off:

I'm really in need of an anthropologist here. I found this insect whilst walking down the road when a speck of orange caught my eye. Turns out that that speck of orange is one of the finest six-legged creatures I've ever seen. From a photography stand-point, I used a wide aperture, and a large zoom to capture this.

This is probably one of the most comical insect/bug pictures that I've ever taken. The DoF worked excellently over here; it only puts the subject in focus. The first thing that came to my mind after I shot this was "suicide". Definitely one of my favourite shots. 

Yay, another bug! I'm really scared of wasps, but that's the good thing about a superzoom camera: you can stand far away and still get a crisp shot. Pretty much the same ingredients were used to make this shot as the previous two. 

I should really call this post "Bugs and Insects Special Album!" or something. Poor jokes aside, I love the way the insect was climbing on the stigma/anthers (not too sure) of the flower. The background is sublimely blurred, but there's still enough detail to keep the background interesting. Top shot.

This is one picture I really like, but sometimes I feel remorseful seeing it. Although the reptile is in excellent focus, the handle of the water tap to the right distracts attention from it. Just goes to show that you can't always expect perfect conditions for photography. 

No photography album is complete without a good flower. This is easily one of the prettiest flowers I've ever shot. Although I'm not too happy with the background, the foreground more than makes up for it.

You're probably sick of seeing close-ups now, so I thought I'd throw in this picture that I took at sunset.  Everything worked in this photo, the orange clouds, the lovely Tyndall effect coming from the sun, and the coconut trees below. 

Another close-up! If I had to pass any comment about this, I would point out the robin's leisurely stride. It seems so relaxed, almost as if in a dream-like trance. Never mind my comments, post your own!

I really like this one. It's a very personified shot, the way the bird on the left is trying to say something, and the one on the right is taciturn and unwilling to respond. Their seating on the rocks is perfect and I also like the way they chose to pose right in front of the water-body.

I'm sorry if I've made you wince by showing you another insect picture (it has been enough of those!). Nevertheless, I'm really proud about taking these shots. They're both images of the same dragonfly from different angles. The first one has a nice background and excellent detail, while the second one exhibits a minimalistic appearance, with little to distract from the dragonfly itself.

That's all for now! Please criticize, praise, and comment! 

Sunday, September 9, 2012

Photography Protips!

Gosh, does time fly. It's been months since my last blog post, owing quite a bit to 10th grade and other activities. However, I'm back with a new, special post on what makes me tick behind the lens!

Take this as my guide to hobbyist digital photography. I hope you enjoy it!

  1. Find something interesting to photograph: While this might sound obvious, this is probably one of the most difficult things to accomplish in photography. A photo is a work of art: it needs to convey feelings, emotions, and beauty. If you don't have anything which can capture any of those three important guidelines, chances are you will end up with a dull photo. Photography isn't all about luscious landscapes or crafted close-ups. If you have a good degree of imagination, you can make anything look like a professional grade photograph, which brings me to my second point.

  2. Be imaginative: It's good to have a hard drive worth of photos shot at landmarks all over the world, but to be honest, you don't need that to be a good photographer. Imagination is probably the best thing that can change a common photo into a modern masterpiece. Just look outside your window. If you look closely and carefully for long enough, you'll definitely find something that can make an excellent photograph. Mess around with perspectives and your camera's settings and shutter times, and see what you get!
  3. You don't need the best camera to take good photos: Don't get me wrong here, you're never going to get a high-grade photo from your 5-year old smartphone's camera. However, while it is no myth that a Canon 5D Mark III will consistently outperform your handy digital point-and-shoot camera, there's so much more to photography than just the camera and lens. Photographers need to have a good eye for detail and if you're not blessed with that, you can say farewell to all the awesome photos you thought you were going to shoot with your new DSLR. Having an eye for detail results in some wonderful photographs even with the most mediocre of cameras. I wouldn't call my Canon SX1-IS PowerShot (the camera which I've used to photograph all the photos posted on this blog) mediocre: it's actually a pretty good digital prosumer, but it's true that there are a huge bunch of DSLRs which exceed it in image quality.

    However, if you are fortunate enough to own a high-end camera and you have a passion for photography, chances are that you will be shooting like a pro in no time. A lower end camera won't offer you all the advanced features a prosumer/DSLR offers, but it'll do just fine for capturing most photos. Don't forget to keep lighting in mind, lighting conditions are very detrimental to taking good photos.

  4. Learn about your camera: This is very important. You might say, "Hey, my camera's got a brilliant Automatic mode, I don't need to learn about nerdy photography terms!" While it is true to an extent that camera nowadays are getting smarter and are able to deliver quality pictures even with minimal adjustment, you should learn about photography lingo right after you get comfortable with your camera. Why do you need to get comfortable first? That's because getting swamped with all the things you need to know to photograph with reasonable quality, isn't really the best way to start off your career in photography.

    Just to give you a quick example, learn about terms such as: f-stops for Aperture, Shutter Speed (both are very important), ISO Film, digital noise, chromatic aberration, focal lengths, light metering, and the golden combination of all these things that make a good photo! A good photographer needs to thoroughly understand and know all these things to figure out how each one affects one another. Although it may seem daunting at first, I can tell you from personal experience that all it needs is just a few rounds of taking photos for one hour and a little bit of reading.

  5. Get out there!: Photos are never going to shoot themselves You need to be behind the camera and you need to be ready to experiment a lot to have a collection of quality photographs. It can seem impossible to take a good photo at times, but not everything can be photographed just the way you might want it to be. Learn from your own experiences and read up on how you can improve. I can safely bet with you that your experience will teach you more about photography than I, or any book can!
If you've been patient enough to read all this, I wish you the best of luck in diving into the wonderful world of digital photography!

Comments are much appreciated Thanks for reading!

Tuesday, May 8, 2012

Photography: Volume 3

This is probably the shortest duration between two meaningful posts on this blog: just eight days! Today also represents the 1st anniversary of this blog, and hence, I present my new photography album.

Most of you would have already seen Volume 2 and Volume 1, so you probably have an idea of my photography skills. I can only say that my skills have improved since then, as you will see in these photos.

All of these photos were shot in either Aperture Priority (Av) or Shutter Speed Priority (Tv) modes, a step forward from shooting in  Program (P) mode. I like exercising full control over the camera, though the camera does a better job than me in choosing shutter speeds for apertures, so Av is the mode of choice.

Technical chatter aside; the photos (click to enlarge):

Let's start off with this. A rare shot with two animals. I can't offer any opinion as to why the squirrel didn't run away from there or why the bird landed there in the first place, but using a wide aperture and high zoom did wonders here.

Another squirrel? Well, actually it's the same one as in the previous picture. I'm at the risk of repeating photos over here, but this shot was way too good to pass up. The dark area which you see to the right of the image actually gives this photo a subtle effect and the squirrel's pose is fantastic. Using a digital camera gave me a wide choice of focal lengths without much adjustment. This one is 929 mm equivalent on a 35 mm film. Used f-stop 5.7 here, because wider apertures are beyond the camera's potential at these focal lengths.

Pretty nice shot here as well. It looks like a macro shot, but this one was shot from afar. The sunflower looks great here, and the tiny ladybug on the petals is the icing on the cake (or should I say flower?). The background was perfectly suited for this shot, and gives a nice empty space for this photo.

I won't lie to you by saying that this picture was taken at a different location from the previous one. I like the bee's placement in the flower and the flower itself. The flies and the varieties of insects that adorn the flower also look good over here. The background is one of my favourite parts of this photo, with details blurred to put emphasis on the main flower, but visible at the same time. It's a hard balance to maintain, but I'm glad that it worked over here.

Nothing special about the photography techniques over here, but photographing another creature, and a reptile at that was too good to pass up.

I suppose the colour over here is the main part of the photo. Clarity and contrast are also impressive. The flower itself looks exotic enough, though I have no idea what it is. Flowers are probably the best subjects in photography. They are quite beautiful, move very little and you can try a hundred different exposures to get the right shot.

While I'll be mean to call this an ugly butterfly (I'm sure it's not a moth!), I think it looks magnificent over here. Although eye-pleasing colours are practically non-existent in this photo, you should look at the contrast of the ground to the insect. It looks pretty good, and the other insects around the butterfly provide a level of detail, without which, this photo would look much plainer.

Probably one of the best shots I took on that day. The coconut as a subject may make you raise eyebrows, but it's totally unlike anything else I've shot. The focusing was perfect here, giving the photo a very small depth of field. Less can be more and this shot exemplifies it.

You might've seen that I've only done close-up shots. This is one of the very few landscape shots I've taken. Excellent scenery and I really don't have much more to say about this.

The mynah had a nice stance and perching position for this. The background is suitably blurred over here and the foreground falls into focus nicely. The background is great for this and the bird's details are captured with some success.

It might look odd to photograph only the head of a peacock without its resplendent body. But the head itself actually has fantastic detail. The blue colour stands out superbly and there is a generous amount of empty space in the photo which is essential for greater emphasis on the bird. An unorthodox, but great shot.

That's it folks! (I have no idea why I quoted that)

Comment, criticize, and praise at your own will.