Tuesday, April 13, 2010

Eclipse - code formatting for Beginner!

First things first! Eclipse is a Open source IDE, an Integrated Development Environment for development using languages like C, C++, PHP (both dynamic and static) for different platforms like mobile, embedded, thick and thin servers!

Two Myths broken!
1. It doesn't come with the development kit unlike Visual studio!
2. It is not for just Java.

So, with the SDK pre-installed on your machine, run your copy of eclipse that you can download for free at the eclipse project website.

This post will hence discuss about the Eclipse for J2SE although most features are same in J2EE version too!

One most important issue most developers like me spend time on is not on the code-logic but the alignment of the code! :)

So here's what you hate when you write your code in Eclipse - The alignment of the braces!

class HelloWorld{
   public static void main(String[] args){
       System.out.println("Hello World");
   }
}

which we always like to see as,


class HelloWorld
{
   public static void main(String[] args)
   {
       System.out.println("Hello World");
   }
}


Eclipse says YES to you! Go to the preferences dialog (Cmd + , in the mac) and search for 'formatter' in the filter text-box or browse your way through Java > Code Style > Formatter.




There you have it! Click edit and you can change EVERY aspect of code formatting from indentation to how your comments appear in your code window!

You might be interested in setting your braces as shown below: (The changes your make are immediately reflected on the preview pane on the right. This comes real handy!)

Also for beginners, this might be useful!

Unlike Visual studio, the code that you type in Eclipse is not auto formatted when you type the code, letting the choice to be yours!

If you want a section formatted properly, after typing in a hurry, you can at anytime select just the section  and hit cmd+shift+f to format it or without a select, if you perform the same command, the entire code is formatted.

You can also correct indentations alone with cmd + i. You can find these under the source menu in Eclipse!

Sunday, April 11, 2010

Some handy vi args!

Say you compiled a program called test.cpp and the compiler spitted the error
"test.cpp:97: error: ‘itoa’ was not declared in this scope
at you!

Mostly, you do one of the following!
Open the file and 
a) Scroll through it!  (See line numbers with :set number  or   :set nu )
b) Jump to line 97 which you can achieve by 
i) 97G   (vi command itself)
ii) :97 enter  (ex editor command inside vi)

You can achieve this easily with the command line args itself (those that are supplied when you open vi. The file name itself is one such arg)!

vi +97 test.cpp will open file with cursor at the 97th line!

Now what if you are like me and are bad with numbers? Can't remember 97?

vi +/itoa test.cpp will perform a pattern matching and will open the file at the first match. You can then use n or N to skim through the matches until you land on your line! 


Bonus tip! :) 

Ever wished vi has alt+tab (on windows/linux) or cmd+tab (on mac) to switch between two files? It has it too! :D

Just open two or more files with all the names as args to the command!

vi file1 file2 file3 file4 file5

You will be editing file1 initially!
Check which file you are editing with ex command :args or :ar 
Vi will print
[file1] file2 file3 file4 file5 
showing the current file in brackets and the entire list that you supplied!

Move around the list with :n and :N. To jump to the first file on list use :rewind or :rew and :last for the last file!

Ooops! Now to issue of concern alt+tab! 
Once you have at least once switched between the 2 files that you need to edit alternatively, use :e # to switch between files!
or simply ^^ (Ctrl + caret)
What if you have find that you need to edit file1 and file7 alternatively but forgot to open file7??? Wait! Don't quit vi!
When you are editing file1 just call in file7 with :e file7 (e for edit) and there you have it! Now use ^^!  

As mentioned in an earlier post, you can use the clipboard to move text around the files!

Though the y (yank) and p(put/paste) commands are handy you can't easily do that for multiple lines!
use :line1,line2ya  c for copying/yanking multiple lines (where line1 = starting line number; line2 = ending line number; cn = a-z one letter clipboard name)

Switch to your file you want now without exiting vi and

then :pu c will put that clipboard c's content into the new file!
(A word of caution! The switching between files can happen only if the file you are editing is saved)

Now that's why vi is a Very Interactive editor!

Saturday, April 3, 2010

vi has a clipboard too!


The very interactive(vi) editor has all that your GUI based editor has! Actually, it has more! Adding to all the basics, here are some key-taps that can help u tap the power of VI.

When you hit 'd' based delete commands like 'dd', 'nd' ... or 'y' based yank commands all that's is deleted or yanked is stored in a buffer. (Ssh! Deleting with d is not delete, it's actually 'cut'. Try 'p'-ing to paste after 'd' :) )

So where does it actually get stored? It's not one but 2 buffers!

Deleted lines are stored in a numbered buffer, named from 1 to 9. (stack like. recent entry is 1, oldest being 9)
You can yank/delete into alphabetically named buffers too (a-z).

"(double quote) is used to access this a-z buffer.

" is the simple syntax

Eg: "c5dd will delete/cut 5 lines in to buffer named 'c'

(simply 5dd will not cut into the buffer)

Interesting part is "C3dd will append your now-deleted 3 lines to your previously present contents of buffer 'c'. (Note the upper case.) You can't do this even in MS word!!!

Paste the buffer using "cp     ( "c for accessing buffer and p for paste/put )


Same works for yanking too!

To access the numbered, deletion buffer, use "np where n is number 0-9 similar to a-z.

Ain't that something!!!!

Tuesday, March 23, 2010

Algorithm to convert given SQL Query to Relational Algebra

For the benefit of those who were looking for a logic on how to go ahead and implement this for lab exercise.

- My program will take a SQL Query as one whole string in the command line.
- splitInputQuery will split the SQL Query based on space.
- parseSQLQuery will take one word at a time from the SQL Query and set some global flags.
- decideRelAlgebra will make a decision on what could be the Relational Algebra equivalent based on the flags set in parseSQLQuery.

Eg:
SQL: "select * from E"
RA: PROJECT E

SQL: "select name from student"
RA: PROJECT name student

SQL: "select * from student where name=neo"
RA: SELECT name=neo student

SQL: "select name,roll_no from student where name=neo"
RA: PROJECT name,roll_no(SELECT name=neo student)

Having shown the examples above, I am giving the algorithm(in the form of pseudocode) below. Hope its useful. Questions are welcome.

/Algorithm/
Algorithm used to convert simple SQL query to Relation Algebra:

/**********************************************************************************
* Description: This program is intended to take simple SQL queries and
* convert them to equivalent Relational Algebra
*
* Input: SQL Query as a single string Eg: "select emp_name from E"
*
* Output: Equivalent Relational Algebra Eg: PROJECT emp_name E
*
*********************************************************************************/
main(String[] args)
if (args.length <0)
return 0;
else {
/* args[0] will have the SQL Query */
if (splitSQLQuery(args[0]) == 0) {
call parseSQLQuery()
}
call decideRelAlgebra()
}

/**********************************************************************************
* Description: This procedure takes a simple SQL queries and split it based on space
* and stores them as a array of string
*
* Input: SQL Query as a single string Eg: "select emp_name from E"
*
* Output: split SQL Query as a array of Strings Eg: {"select" ,"emp_name","from","E"}
*
*********************************************************************************/

splitSQLQuery(inputSQLQuery) {
if (inputSQLQuery != null) {
/* if input is valid then split based on " " and save it in global array splittedInputQuery
splittedInputQuery = inputSQLQuery.split(" ");
} else {
return 1; /* return non-zero on error */
}
return 0;
}

/**********************************************************************************
* Description: This procedure takes split SQL Query array and parse them to find the
* equivalent Relational Algebra
*
* Input: Splitted SQL Query array
*
* Output: global flags are set to make a decision
*
*********************************************************************************/

parseSQLQuery() {
/* for all the strings in the splitedInputQuery do this */
for(int i 0 to no_of_strings in query) {
/* querystring is the current string form the splittedinputquery array */
if (querystring matches "select") {
/*then it could be select or it could be project in RA*/
set maybeProject to 1
continue to get next string;
}
if(querystring matches "*") {
set selectall to 1;
continue to next string;
}

if (querystring is of the pattern [a-zA-Z_]*) and (selectall != 0) {
set maybeAttribs to 1;
attribs = querystring;
continue to next string;
}
if (querystring matches "from") {
set maybeFrom to 1;
continue to next string;
}

if(querystring is of pattern [a-zA-Z-]*) and (maybeFrom is set) {
set maybeTable to 1;
tableName = queryString;
continue to next string;
}

if(querystring matches "where") {
set maybeSelect to 1
set gotWhere to 1
continue to next string;
}
/* to match with where patterns like Eg: name=N or roll_no=100 and so on
if(queryString is of pattern [a-zA-z_< > = <= >= !=0-9*]*) and (where is set to 1) {
set maybeConditions to 1
conditions = queryString;
continue to next string;
}
}
}

/**********************************************************************************
* Description: This procedure decides on the equivalent relational algebra for the given
* SQL Query based on the flags set by parseSQLQuery
*
* Input: SQL Query as a single string Eg: "select emp_name from E"
*
* Output: Equivalent Relational Algebra Eg: PROJECT emp_name E
*
*********************************************************************************/

decideRelAlgebra() {
if (gotWhere is not 1) {
set confirmedProject to 1
set relAlg to PROJECT
}
if (selectAll is 1) and (gotWhere is not 1) {
set confirmedProject to 1
set relAlg to PROJECT
}
if (gotWhere is 1) and (attribs is not null) {
set projectwithselect to 1
set relAlg to PROJECT (SELECT )
}

if (gotWhere is 1) and (selectall is 1) {
set confirmedproject to 1
set relAlg to SELECT
}
}

Friday, March 19, 2010

Very Interactive(VI) editor commands

This has been a request from couple of people, putting it down for them and for everyone who is looking for frequently used vi editor commands.

Edit commands:
-------------------
x - delete one character at a time
nx - delete n characters at a time, replace n with number you want
dd - delete/cut a line
ndd - delete/cut x lines (replace n with number you want Eg: 10dd would delete 10 lines)
yy - yank a line(copy to clipboard)
nyy - yank n lines(replace n with number you want Eg: 10yy would yank 10 lines)
p - paste from the clipboard(deleted lines are like copy too, they will be in clipboard, so p after dd or yy will paste whats there in the clipboard)

*Remember: All the above commands are relative to the current cursor position. i.e. If you are at line 20 and performing dd, line at that position will be deleted/cut. Similarly p operation will paste after 20th line.

More Edit commands:
--------------------------
dw - delete/cut a word
ndw - delete/cut n words (replace n with number you want Eg: 3dw will delete 2 words)
cw - change or replace word (move the cursor to the word you want to change and give cw, then type in the replacement word)
ncw - change n words at a time(Eg: 2cw will help you replace two words)
o - to insert a line below the line where the cursor is positioned
shift+o - to insert a line above the line where the cursor is positioned

Cursor positioning or movement:
---------------------------------------
<- or h - to move left -> or l - to move right
up arrow or k - to move up
down arrow or j - to move down
0(zero) - to move to the first character of the current line
$ - to move to last character of the line
w - to move cursor to the beginning of the next word
b - to move cursor to the first character of the preceding word
:0 - to move to the first line of the file(what you see here is zero)
:n - to move to the nth line of the file(replace n with number of your choice)
:$ - to move the cursor to the last line of the file

* CR- carriage return/Enter key in the keyboard

Scroll commands:
---------------------
^d (ctrl+d) - scroll half screen down
^u (ctrl+u) - scroll half screen up
^f (ctrl+f) - scroll full screen down
^b (ctrl+b) - scroll full screen up

(do it for yourself to see the difference, choose a bigger file to see the difference between these scrolls for yourself)

Search commands:
-----------------------
/string - to search for a string (replace string with your search string)
(n to find the next match, shift+n to find the previous match.

Search and Replace:
------------------------
:s/old_string/new_string - replaces the first occurrence of "old_string" with "new_string" in the current line (Eg:- :s/import/export will replace first occurrence of the word import with export in the current line)
:s/old_string/new_string/g - will replace all occurrences of "old_string" with "new_string" in the current line
:%s/old_string/new_string/g - will replace all occurrences of old_string with new_string in the file.

(**Remember everything is case sensitive here, to make your search & replace case insensitive see below)
:s/old_string/new_string/i
:s/old_string/new_string/gi
:%s/old_string/new_string/gi

see the 'i' at the end makes it case in-sensitive.

To perform search and replace between selected lines, you can use the commands below.
:l1,l2s/old_string/new_string/g - replace l1 and l2 with line numbers you want. (Eg:- :1,10s/import/export/g you know what this means... isn't it?)

Undo:
--------
u - to undo previous commands

Switching modes:
----------------------
i - insert mode
a - append mode
esc - to get out of any mode you already chosen

I will stop with these basic commands you would need to start.

In case if people need more useful commands at advance level, I will put a separate post later.

Happy VI'ing :))