I've been thinking about blogging about movies and other stuff for a long time but now I'm gonna think no more. Here it is, my first non-technical post on this blog, hopefully not the last. Today I'll blog about the movie Good Will Hunting. If you've not seen the movie yet, I suggest you think about it once. Just read the movie title. What do you think it is about? Something related to hunting? Good will? Will? Good? Mercy killing? :) So just before I start my review, I'll tell my rating:
Good Will Hunting: 7.5/10
Verdict: Superb, you can watch it even twice!
Good Will Hunting is a story about a cocky, respect-for-none, mathematical-genius called Will Hunting played by Matt Damon (Ha ha, it's a name). It's a story about a man who doesn't know what he wants to do in his life. I'm sure many of us have the same problem. Anyway, he works as a janitor at MIT where he secretly solves difficult math problems which only a few in the world could do. (My dear fellow Indians: It's not Maths, it's just Math.) As a typical dude, he hangs out with his friends doing all kinds of bullshit like beating up people, hitting girls, etc.
Then he meets a guy called Sean which eventually changes Hunting's life forever. Sean is played by Robin Williams who won an Oscar for this excellent role. Undoubtebly, he's the best actor in this film and one of the finest performances I've ever seen on screen. The best parts of the movie are the scenes where Matt Damon and Robin Williams sit in a room and chat with each other telling their stories.
This movie also has some funny dialogues, like this little conversation between Matt Damon and Ben Affleck:
Affleck: Hey asshole?
Damon: What bitch?
Affleck: Happy birthday.
But my favorite funny dialogue was when Matt Damon gets the phone number of a girl which another guy he argued with in the restaurant was trying so hard. After getting the phone number, he goes to the guy he argued with and says:
Damon: Do you like Apples?
The other guy: Hmm.. Yeah.
Damon: Well guess what? I got her phone number, now, how do you like them apples?
I don't want to give away the dialogues between Matt Damon and Robin Williams because that's the best part. They are funny, they are intellectual, they'll make you think about your life, and most of all, they'll have an impact on you. The film will not fail to ask the question of what is that you want to do in your life. I promised I won't give away any of the other dialogues, but I'll just use one of them now to end this post: Time's up.
Monday, October 27, 2008
Thursday, October 16, 2008
trim() for C
I was very surprised when I found out that there's no trim(char *) function in standard C library. Anyways, I wrote my own by stealing, er, looking at java.lang.String.trim() method (and reinvented the wheel just for my silly pleasure), and here it is if you should ever need. Take it, it's for you, *free of charge 'cause I like you so much :)
The main() is just for testing the function, let's see how it went.
This function doesn't create a new char[] for the trimmed string, it modifies the original. Let me know if you've got an optimized version than this, I'll be interested to learn.
(Edit: Thanks to my colleague Hiren for catching a nasty bug. The memset at the end,
That's it, see you later, I've gotta go trim.
#include <stdio.h>
#include <string.h>
void trim(char *s, const int len)
{
int end = len - 1;
int start = 0;
int i = 0;
while ((start < len) && (s[start] <= ' '))
{
start++;
}
while ((start < end) && (s[end] <= ' '))
{
end--;
}
if (start > end)
{
memset(s, '\0', len);
return;
}
for (i = 0; (i + start) <= end; i++)
{
s[i] = s[start + i];
}
memset((s + i), '\0', len - i);
}
int main()
{
char s[] = " srikanth s \n";
char empty[] = "";
char newline[] = "\n";
char double_newline[] = "\n\n";
char single_char[] = " s ";
trim(s, strlen(s));
printf("s = '%s'\n", s);
trim(empty, strlen(empty));
printf("empty = '%s'\n", empty);
trim(newline, strlen(newline));
printf("newline = '%s'\n", newline);
trim(double_newline, strlen(double_newline));
printf("double_newline = '%s'\n", double_newline);
trim(single_char, strlen(single_char));
printf("single_char = '%s'\n", single_char);
return 0;
}
The main() is just for testing the function, let's see how it went.
$ gcc -Wall -o go trim.c $ ./go s = 'srikanth s' empty = '' newline = '' double_newline = '' single_char = 's'
This function doesn't create a new char[] for the trimmed string, it modifies the original. Let me know if you've got an optimized version than this, I'll be interested to learn.
(Edit: Thanks to my colleague Hiren for catching a nasty bug. The memset at the end,
memset((s + i), '\0', len) had a bug. It should've been memset((s + i), '\0', len - i). *So, that brings us to the disclaimer. Take the code at your own risk. I'm not responsible if it formats your hard drive or if it kills your cat.)That's it, see you later, I've gotta go trim.
Monday, September 8, 2008
Calling C++ Functions in C
<skippable>
I'd to call a few C++ class's methods from a C program recently, and I didn't know how to do it. I found a way that suits my situation and here it is.
The fact as I found out is that you cannot create an instance of a C++ object in your C program and obviously that means you can't call its methods. So, we need a workaround. In general, we need to be able to do these things from our C code:
But I've already told you that we can't create an instance of this class directly, so we've to provide wrapper functions that our C program can call. The disadvantage with this workaround is, for every public function we want to use we need a wrapper function. Anyway, let's write them.
(Add the following lines to cppclass.cpp file)
A few things should be noticed here.
Now, I'll use g++ to compile:
-o indicates the executable output file name which is "go" here. Write the code and try out for yourself. It should print "Hello" (Duh!)
That's it.
I'm currently working on some code written in C, I've never done C programming before; only Java and a little bit of Python. I'm currently in the process of learning C, so whatever I write may not be the best way to do "that" thing. But as I keep learning new things, I'll blog them when I find time. So if you're interested in learning C, follow my posts; especially if you're a Java programmer who doesn't know C but you're interested just for the heck of it. You may find these posts useful.</skippable>
I'd to call a few C++ class's methods from a C program recently, and I didn't know how to do it. I found a way that suits my situation and here it is.
The fact as I found out is that you cannot create an instance of a C++ object in your C program and obviously that means you can't call its methods. So, we need a workaround. In general, we need to be able to do these things from our C code:
- Create an instance of a C++ class
- Call its methods, pass arguments, etc.
- Destroy the created instance.
(Instance == Object). Just thought I should let you know!
I'll demonstrate the process with an example. So up first, let's create a C++ class which we'll call from a C program.
// cppclass.cpp
class CppClass
{
public:
char *returnHello()
{
char *ret_val = "Hello";
return ret_val;
}
};
But I've already told you that we can't create an instance of this class directly, so we've to provide wrapper functions that our C program can call. The disadvantage with this workaround is, for every public function we want to use we need a wrapper function. Anyway, let's write them.
(Add the following lines to cppclass.cpp file)
extern "C" void *create_cppclass()
{
return new CppClass();
}
extern "C" char *call_return_hello(void *obj)
{
return reinterpret_cast<CppClass*>(obj)->returnHello();
}
extern "C" void *free_cppclass(void *obj)
{
delete reinterpret_cast<CppClass*>(obj);
}
A few things should be noticed here.
- All these wrapper functions are preceded with extern "C" (uppercase C)
- In create_cppclass() wrapper function, the newly created object of CppClass is returned as a void pointer (void *). Void pointers can be used to point to any type. So when we return the instance as a pointer to void in this function, it can stored it in our C program. That's the whole point here.
- In call_return_hello() and free_cppclass() wrapper functions, we use reinterpret_cast to convert the void pointer back to CppClass pointer type. The -> operator is used for dereferencing the pointers instead of the . (dot) operator.
Now, let's call these functions from our C program. We should declare these functions first in our C program before we can use them.
// cfile.c
#include <stdio.h>
extern "C" void *create_cppclass();
extern "C" char *call_return_hello(void *obj);
extern "C" void *free_cppclass(void *obj);
main()
{
void *obj = create_cppclass();
char *hello = call_return_hello(obj);
free_cppclass(obj);
printf("%s\n", hello);
}
Now, I'll use g++ to compile:
g++ -o go cfile.c cppclass.cpp
./go
-o indicates the executable output file name which is "go" here. Write the code and try out for yourself. It should print "Hello" (Duh!)
That's it.
Tuesday, June 24, 2008
Java One Liner - Reading a Text File at Once
Java is not meant or known for any one-liners, but who said we can't try? There you go:
Cool, eh?
Hmm, may be not. Of course, you still have to deal with the checked exceptions + 3 import statements, etc. The so called one-liner by me has 113 characters (could be more or could be less if you consider the file path's length). I'm not sure if I would consider anything more than 80 chars as "one-liner" but hey, this is Java and this is as close as you can get.
Just for fun. Do you have anything better than this in Java? How about in Java 1.4? Now, don't write a separate method, call it, and say it's a one-liner for Perl sakes!
String contents = new Scanner(new File("filepath")).findWithinHorizon(Pattern.compile(".*", Pattern.DOTALL), 0);
Cool, eh?
Hmm, may be not. Of course, you still have to deal with the checked exceptions + 3 import statements, etc. The so called one-liner by me has 113 characters (could be more or could be less if you consider the file path's length). I'm not sure if I would consider anything more than 80 chars as "one-liner" but hey, this is Java and this is as close as you can get.
Just for fun. Do you have anything better than this in Java? How about in Java 1.4? Now, don't write a separate method, call it, and say it's a one-liner for Perl sakes!
Sunday, May 18, 2008
Clipboard PingPong
What is it?
Clipboard PingPong can send your clipboard contents to other computers and receive the other computers' published clipboard contents. Currently, it has been restricted to transfer only string data. It runs on top of the JVM and that's the only prerequisite. It's also very tiny. (Version 0.1's size is roughly 58KB of which 35KB is GNU GPL v3 license text.)
Wanna try? Download from here.
The Development Lesson
I learned one thing: release early. I wrote the first working version almost a month ago for my personal use in about 1 hour. I just wanted to exchange the clipboard contents between 2 machines I was using. It had to be platform independent because I was using both Linux and Windows. Then I decided to share the code and had all these plans like having a configuration utility, adding a logging module, etc. But I kept procrastinating and didn't have the time to finish it. So now, I didn't add any graphical configuration utility. Instead, I added some instructions in README which should explain the configuration process which is frankly very trivial. I also have the startup and shutdown scripts. This software should really run as a service but I am releasing it early. May be the suggestions from you can steer me in the right direction.
What do I need?
Testing. And lots of it. I tested with 2 machines; it did fine. Bug reports will be really helpful to enhance and decide the future development activities. Report the bugs here.
Decisions
Before writing the code, I had a few things in my mind on how the software must be written which I would like to share here. I called them "requirements." These are they:
The other thing I made sure was not to use any libraries (no dependent jars). I had to parse command line arguments, but I wrote my own helper class to do it. That's the same reason why I didn't use XML for configuration files apart from plain text being easy to edit manually than XML.
Note: It also requires a desktop environment.
Clipboard PingPong can send your clipboard contents to other computers and receive the other computers' published clipboard contents. Currently, it has been restricted to transfer only string data. It runs on top of the JVM and that's the only prerequisite. It's also very tiny. (Version 0.1's size is roughly 58KB of which 35KB is GNU GPL v3 license text.)
Wanna try? Download from here.
The Development Lesson
I learned one thing: release early. I wrote the first working version almost a month ago for my personal use in about 1 hour. I just wanted to exchange the clipboard contents between 2 machines I was using. It had to be platform independent because I was using both Linux and Windows. Then I decided to share the code and had all these plans like having a configuration utility, adding a logging module, etc. But I kept procrastinating and didn't have the time to finish it. So now, I didn't add any graphical configuration utility. Instead, I added some instructions in README which should explain the configuration process which is frankly very trivial. I also have the startup and shutdown scripts. This software should really run as a service but I am releasing it early. May be the suggestions from you can steer me in the right direction.
What do I need?
Testing. And lots of it. I tested with 2 machines; it did fine. Bug reports will be really helpful to enhance and decide the future development activities. Report the bugs here.
Decisions
Before writing the code, I had a few things in my mind on how the software must be written which I would like to share here. I called them "requirements." These are they:
- Should be platform independent
- Should have no library dependencies
- Should use a simple text file for configuration (no XML)
The other thing I made sure was not to use any libraries (no dependent jars). I had to parse command line arguments, but I wrote my own helper class to do it. That's the same reason why I didn't use XML for configuration files apart from plain text being easy to edit manually than XML.
Note: It also requires a desktop environment.
Labels:
pingpong
Thursday, April 24, 2008
How to Debug a Remote Java Application?
A Little Story
Recently I was working with a Java application that was bugging me when it was running in another country (USA) but it works fine when I run it on my desktop here in India. Of course, there is no connection with the geography except that the connection is slower. Every time I had a problem which is time consuming to reproduce on my desktop, I would login to that computer remotely through VNC client, reproduce the problem, get the logs, diagnose, and test it again there. You may ask, "Why don't you create a similar setup of that remote machine next to your desktop?" Trust me, there's a reason why I can't do it and I won't have a setup anytime sooner. Don't let that distract you about what I am trying to say, just forget it and assume I have to test it on a remote machine that resides in the same Intranet.
I was a having a conversation with one of my coworkers on phone about a particular problem and he said, "It will be slow but why don't you debug and see it?" My face turned red and I felt a little ashamed, I knew what he was talking about. He is a smart guy, I knew for sure he was not asking me to switch my whole development environment to some remote machine sitting on the other side of the globe. I hung up the phone, I walked to his desk and asked him. "Did you say debug?" He generously showed me how to do it. In fact, he thought that I don't know what is debugging and he explained me everything -- all that Step-Into, Step-Over, Step-Out stuff with it's shortcuts.
It was easy for me to jump and say, "Dude! I know how to debug" but that would have been a wrong thing to do at that time. I know many people who come for help to me do this. So I quietly listened to him and gently said, "Yep, I'm familiar with that."
In case you have never done this before --here is how you do it. I will show how to do this using the Eclipse IDE, and I am very sure you are smart enough to figure out for your development setup.
Let's say you have your application compiled into a jar called myapp.jar and this will be running remotely on a machine called myremote.mycompany.com (or some IP). Your development machine is mydevel.mycompany.com. Now to debug the myapp.jar that is running remotely from your desktop machine, there are two steps you have to follow:
Other than address, server, and transport there are other sub options available for -Xrunjdwp option -- for example: suspend. I will leave that for you. Let's move on to step 2, that is configuring Eclipse.
Configuring Eclipse to Debug a Remotely Running Application
I will just show the screenshots without writing much, it's just intuitive that way.
1. Start Eclipse
2. Go to Run -> Debug Configurations

3. Create a new Remote Java Application configuration

4. Configure the remote application's details

5. If you would like to have this launch configuration in your favorites menu

6. Don't forget to click Apply
Cool, isn't it?
That it. Happy remote debugging! :)
Recently I was working with a Java application that was bugging me when it was running in another country (USA) but it works fine when I run it on my desktop here in India. Of course, there is no connection with the geography except that the connection is slower. Every time I had a problem which is time consuming to reproduce on my desktop, I would login to that computer remotely through VNC client, reproduce the problem, get the logs, diagnose, and test it again there. You may ask, "Why don't you create a similar setup of that remote machine next to your desktop?" Trust me, there's a reason why I can't do it and I won't have a setup anytime sooner. Don't let that distract you about what I am trying to say, just forget it and assume I have to test it on a remote machine that resides in the same Intranet.
I was a having a conversation with one of my coworkers on phone about a particular problem and he said, "It will be slow but why don't you debug and see it?" My face turned red and I felt a little ashamed, I knew what he was talking about. He is a smart guy, I knew for sure he was not asking me to switch my whole development environment to some remote machine sitting on the other side of the globe. I hung up the phone, I walked to his desk and asked him. "Did you say debug?" He generously showed me how to do it. In fact, he thought that I don't know what is debugging and he explained me everything -- all that Step-Into, Step-Over, Step-Out stuff with it's shortcuts.
It was easy for me to jump and say, "Dude! I know how to debug" but that would have been a wrong thing to do at that time. I know many people who come for help to me do this. So I quietly listened to him and gently said, "Yep, I'm familiar with that."
In case you have never done this before --here is how you do it. I will show how to do this using the Eclipse IDE, and I am very sure you are smart enough to figure out for your development setup.
Let's say you have your application compiled into a jar called myapp.jar and this will be running remotely on a machine called myremote.mycompany.com (or some IP). Your development machine is mydevel.mycompany.com. Now to debug the myapp.jar that is running remotely from your desktop machine, there are two steps you have to follow:
- Start the application and tell the JVM that it will be debugged remotely
- Configure your IDE on your desktop to be able to debug that remote application
java -Xdebug -Xrunjdwp:transport=dt_socket,address=8998,server=y -jar myapp.jarThe above command says: start myapp.jar + start a server socket at port 8998 and publish the debugging messages using the Java Debug Wire Protocol (jdwp) there.
Other than address, server, and transport there are other sub options available for -Xrunjdwp option -- for example: suspend. I will leave that for you. Let's move on to step 2, that is configuring Eclipse.
Configuring Eclipse to Debug a Remotely Running Application
I will just show the screenshots without writing much, it's just intuitive that way.
1. Start Eclipse
2. Go to Run -> Debug Configurations

3. Create a new Remote Java Application configuration

4. Configure the remote application's details
5. If you would like to have this launch configuration in your favorites menu

6. Don't forget to click Apply
Cool, isn't it?
That it. Happy remote debugging! :)
Labels:
Java
Saturday, April 12, 2008
What Is Your TO-LEARN List for This Year?
Face ISN'T the Index of Mind
I love reading interesting blogs. One of my very favorite blogs is BetterExplained by Kalid Azad. I was reading one of his posts which was about "Building a site you (and your readers) will love" and in that blog post he recommends a famous blog which I knew from a very long time but never read because they were monstrous (too long). It's none other than Steve Yegge's blog. I admire Kalid's writing and a recommendation coming from him is highly regarded by me. So, I went ahead and read a few blogs of Steve Yegge. Before reading his blog, I had a prejudice about Stevey and I thought he was just a guy who rants about things endlessly and the articles are boring and controversial (like VI vs EMACS). I never completed the first paragraph of any of his posts cause I was too scared and too tired to read due to the scroll bar's length. But this time around, I scheduled some time and read some of his writings.
I loved his blog. I missed them all these days, but that's OK. Yes, he writes BIG articles, but they are worth reading for a programmer. In one of Stevey's posts, he talks about Practicing Programming (isn't that my blog's name?) and he gives a few drills for us. That made me think about "What do I want to learn this year?" I will list them here now. This will make you aware or motivate you in learning the things you have planned but never did. That's what you can take from reading this post. You can also give me suggestions if you think I am wrong somewhere with my choice. The following is the list that I made to answer that question. All the suggestions are highly appreciated.
(X)HTML + CSS
I learned HTML & CSS just by looking at the source of a few sites, and to customize my blog just to a point where I will be done with what I wanted. I know "what" makes it work but I don't know "how" it works. And XHTML being the language spoken by the web server to the web browser, it is my necessity to learn it well. In my honest opinion, every developer must know XHTML in today's world. (Don't you want to have your own site?)
Book: Head First HTML & CSS
Shell Scripting
Don't I know? Yes, I do. Again, it is exactly like how I know about HTML & CSS. I want to learn stuffs thoroughly. I love Unix, I like to work on the command line. It makes me feel like I'm a rocket scientist doing complicated stuffs :). But that's not the point. Unix is tougher to use than MS Windows and both their philosophies are completely different. Learning Unix and Shell Scripting should be one of the top priorities for a developer who doesn't work on MS technologies. And we all the know the benefits of scripting.
Books: Any recommendations?
Regular Expressions
This should be fun. Regex is very powerful and great. But with great power comes greater responsibility. So, I should really be knowing what I am doing with it. I have written a few regexes, but I am just an ordinary user. I want to elevate to the power user category in regular expressions.
Python
My favorite scripting language. I love the syntax though I seriously hope that it's source code documentation gets improved (the one that we get with the help() function). Again, I know, I can write scripts, I can figure out things. But I would like to learn more here. Probably, I need to spend more time or write an Open Source module that is missing. This will surely be a good exercise to learn more.
Book: Python in a Nutshell by Alex Martelli (O'Reilly)
Online: Tech talks about Python on Google Videos by Google's employees (Alex has one too)
C
I'm ashamed to say that I not proficient with the mother of modern programming languages. Yeah, I know what you are saying, I learned in school. I also learned rocket science in school, does it count at NASA?
Books: Any recommendations here?
J2EE
I will be working on real J2EE applications now, not the ones we try out for learning it. I learned a lot of Servlets, JSP, EJB and so on. But never implemented them or got a chance to do these things at work so far. But now, I have to. I will learn all the buzzwords like JMS, WAS, Web Services, EJB, etc. that you "cool J2EE" dudes talk about. (Am I sounding like Stevey now? Whatever!)
Books: No idea, just Google.
VI/VIM
Now this will be really hard. I use Eclipse for everything and working on something tougher than notepad should be real fun. I know how to use it, I am not a complete stranger to VIM. I even know how to enable syntax highlighting, and stuff. But I want more than that. I would like to do find/replace without searching vim.org for tips (regex again). I would like to find out the total number of lines/words/characters while I am in the editor (not using grep on shell). I would like to do copy pasting very freely. I want all this to be done and more without my conscious mind getting disturbed while it's doing some other task. VIM should become the extension of my hand.
Books: Any suggestions?
Subversion (SVN)
I love Subversion (do you know Linus Torvalds hates it?). I love Subversion because it is free, easy to use, has excellent support for IDEs and has a huge community. I have used Subversion before at my workplace, I use it currently for my Open Source project hosted at Google Code. But I want to learn more about it. I want to know how to setup an SVN server that supports http and https connections. I want to know how the authentication and authorization need to be configured. I want to know how to work with SVN just by using the command line interface (for fun). I want to collect the useful commands, tips, and best practices.
Book: Version Control with Subversion (O'Reilly)
Release Version 1.0 of Clipboard PingPong
That's the first open source software that I created which can be used to transfer clipboard contents across computers. It's at version "0.0.2" at present. I want to bring it to the general audience. Learning some of the things mentioned above will help me bring it in a better shape. It's really exciting, though it's very very small (I would like to keep it that way). Hopefully I will learn a lot from this experience and I can start contributing to other bigger and useful Open Source projects in future.
Blogging
Of course. This doesn't belong in "TO-LEARN" category but it's more of a TODO. Well, blogging about blogging is generally hated. So I won't go any further, it's boring too. But I would like to quote one thing from Stevey's blog post:
What If I Don't Complete Everything I Mentioned?
I will be very disappointed. If I don't finish the mentioned things with *satisfaction*, I will push it to next year. But life is so short and knowing these things are necessary for anyone who wants to become a good software developer. Just knowing Java, using Eclipse and developing on Windows totally sucks! Life is much bigger and better than that. I will be working very hard and pushing a lot to complete these things. But quality matters more than quantity. I would rather learn half the things mentioned here thoroughly than just skimming through everything. In fact, I know most of the things mentioned here. I just want to know them better than an average developer in the streets. My quest is understanding better than just knowing them.
Next Year
It's too early but I left out a lot of things that were there in my head. These are the things I plan to do next year:
References
I love reading interesting blogs. One of my very favorite blogs is BetterExplained by Kalid Azad. I was reading one of his posts which was about "Building a site you (and your readers) will love" and in that blog post he recommends a famous blog which I knew from a very long time but never read because they were monstrous (too long). It's none other than Steve Yegge's blog. I admire Kalid's writing and a recommendation coming from him is highly regarded by me. So, I went ahead and read a few blogs of Steve Yegge. Before reading his blog, I had a prejudice about Stevey and I thought he was just a guy who rants about things endlessly and the articles are boring and controversial (like VI vs EMACS). I never completed the first paragraph of any of his posts cause I was too scared and too tired to read due to the scroll bar's length. But this time around, I scheduled some time and read some of his writings.
I loved his blog. I missed them all these days, but that's OK. Yes, he writes BIG articles, but they are worth reading for a programmer. In one of Stevey's posts, he talks about Practicing Programming (isn't that my blog's name?) and he gives a few drills for us. That made me think about "What do I want to learn this year?" I will list them here now. This will make you aware or motivate you in learning the things you have planned but never did. That's what you can take from reading this post. You can also give me suggestions if you think I am wrong somewhere with my choice. The following is the list that I made to answer that question. All the suggestions are highly appreciated.
(X)HTML + CSS
I learned HTML & CSS just by looking at the source of a few sites, and to customize my blog just to a point where I will be done with what I wanted. I know "what" makes it work but I don't know "how" it works. And XHTML being the language spoken by the web server to the web browser, it is my necessity to learn it well. In my honest opinion, every developer must know XHTML in today's world. (Don't you want to have your own site?)
Book: Head First HTML & CSS
Shell Scripting
Don't I know? Yes, I do. Again, it is exactly like how I know about HTML & CSS. I want to learn stuffs thoroughly. I love Unix, I like to work on the command line. It makes me feel like I'm a rocket scientist doing complicated stuffs :). But that's not the point. Unix is tougher to use than MS Windows and both their philosophies are completely different. Learning Unix and Shell Scripting should be one of the top priorities for a developer who doesn't work on MS technologies. And we all the know the benefits of scripting.
Books: Any recommendations?
Regular Expressions
This should be fun. Regex is very powerful and great. But with great power comes greater responsibility. So, I should really be knowing what I am doing with it. I have written a few regexes, but I am just an ordinary user. I want to elevate to the power user category in regular expressions.
Some people, when confronted with a problem, think “I know, I’ll use regular expressions.” Now they have two problems. --Jamie ZawinskiBook: Mastering Regular Expressions by Jeffrey E. F. Friedl (O'Reilly)
Python
My favorite scripting language. I love the syntax though I seriously hope that it's source code documentation gets improved (the one that we get with the help() function). Again, I know, I can write scripts, I can figure out things. But I would like to learn more here. Probably, I need to spend more time or write an Open Source module that is missing. This will surely be a good exercise to learn more.
Book: Python in a Nutshell by Alex Martelli (O'Reilly)
Online: Tech talks about Python on Google Videos by Google's employees (Alex has one too)
C
I'm ashamed to say that I not proficient with the mother of modern programming languages. Yeah, I know what you are saying, I learned in school. I also learned rocket science in school, does it count at NASA?
Books: Any recommendations here?
J2EE
I will be working on real J2EE applications now, not the ones we try out for learning it. I learned a lot of Servlets, JSP, EJB and so on. But never implemented them or got a chance to do these things at work so far. But now, I have to. I will learn all the buzzwords like JMS, WAS, Web Services, EJB, etc. that you "cool J2EE" dudes talk about. (Am I sounding like Stevey now? Whatever!)
Books: No idea, just Google.
VI/VIM
Now this will be really hard. I use Eclipse for everything and working on something tougher than notepad should be real fun. I know how to use it, I am not a complete stranger to VIM. I even know how to enable syntax highlighting, and stuff. But I want more than that. I would like to do find/replace without searching vim.org for tips (regex again). I would like to find out the total number of lines/words/characters while I am in the editor (not using grep on shell). I would like to do copy pasting very freely. I want all this to be done and more without my conscious mind getting disturbed while it's doing some other task. VIM should become the extension of my hand.
Books: Any suggestions?
Subversion (SVN)
I love Subversion (do you know Linus Torvalds hates it?). I love Subversion because it is free, easy to use, has excellent support for IDEs and has a huge community. I have used Subversion before at my workplace, I use it currently for my Open Source project hosted at Google Code. But I want to learn more about it. I want to know how to setup an SVN server that supports http and https connections. I want to know how the authentication and authorization need to be configured. I want to know how to work with SVN just by using the command line interface (for fun). I want to collect the useful commands, tips, and best practices.
Book: Version Control with Subversion (O'Reilly)
Release Version 1.0 of Clipboard PingPong
That's the first open source software that I created which can be used to transfer clipboard contents across computers. It's at version "0.0.2" at present. I want to bring it to the general audience. Learning some of the things mentioned above will help me bring it in a better shape. It's really exciting, though it's very very small (I would like to keep it that way). Hopefully I will learn a lot from this experience and I can start contributing to other bigger and useful Open Source projects in future.
Blogging
Of course. This doesn't belong in "TO-LEARN" category but it's more of a TODO. Well, blogging about blogging is generally hated. So I won't go any further, it's boring too. But I would like to quote one thing from Stevey's blog post:
Even if nobody reads them, you should write them. It's become pretty clear to me that blogging is a source of both innovation and clarity. I have many of my best ideas and insights while blogging. Struggling to express things that you're thinking or feeling helps you understand them better.The last line is so true.
What If I Don't Complete Everything I Mentioned?
I will be very disappointed. If I don't finish the mentioned things with *satisfaction*, I will push it to next year. But life is so short and knowing these things are necessary for anyone who wants to become a good software developer. Just knowing Java, using Eclipse and developing on Windows totally sucks! Life is much bigger and better than that. I will be working very hard and pushing a lot to complete these things. But quality matters more than quantity. I would rather learn half the things mentioned here thoroughly than just skimming through everything. In fact, I know most of the things mentioned here. I just want to know them better than an average developer in the streets. My quest is understanding better than just knowing them.
Next Year
It's too early but I left out a lot of things that were there in my head. These are the things I plan to do next year:
- Algorithms & Data Structures
- Algorithms & Data Structures (yes, I would like to do it twice)
- SQL in detail
- Unix Operating System in detail
- EMACS
- Ruby (could be replaced by Scala)
- JDK 7 new features (with a fresh mind after learning the other things)
References
Labels:
General
Subscribe to:
Posts (Atom)

