Thursday, July 25, 2013

When I fell in love with Computer Programming


  • When I was 8 or 9, I had an MS DOS computer.  The monitor was color, and it has QBASIC on it, and I had a book of QBASIC programs.  I remember writing programs that would generate circles, with a random color, size, and location on the screen. I would also generate sounds, beeps really, in time with the circles.  I didn't know about command line arguments, so every change I made I would do by changing the code itself.  The numbers were all numeric literals.  I got it running so fast that the filling of the circles couldn't keep up with their drawing. I liked making it go, and controlling it, and making music and shapes.
  • When I was 13 or, we got a A dialup 28.8k modem, and a Windows  Computer from Gateway.   There was no built in programming language, but I liked chatting online, and eventually started using Mirc and writing a few scripts. There may be an archive of one or two somewhere, because I posted a few to some websites, back in the day.  I learned about variables and conditionals.  I liked getting the program to do what I wanted, and not having to type things repeatedly.  
  • I'm and about to graduate with a Bachelors Degree in Psychology.  I had a great statistics professor, Jack Vevea, who has us do our classes using R.  I did well, and I and another undergrad were invited to one of his graduate level courses in item response theory.    We have a program where we had to calculate a value on 2400 elements.  Each element took about 6 minutes with the program we were given, because it tries to calculate a value to a high degree of accuracy. That's 10 days of non-stop running. I look at the code and figure out how to narrow the search down at each iteration so it runs more quickly.  
  • I'm back in school, and  I am learning C and Java.  I take the data structures and Java for C programmers classes at the same time I take the prerequisite course, work really hard and get an A in all of them.  I like learning, and working hard, and figuring things out.  
  • I find out about the tutor program.  I join it, and and am made a mentor and senior tutor within the first week, on the basis of my work.  I find out that I love helping people learn about programming, and that having to explain stuff makes me comprehend it better.
  • I am looking through job postings for internships using my browser's find in page function, and realize I can write something to automate this for me.  I write the first version of Gutsy, in Perl.  I like being able to take what I know and use it in real everyday life.  
I fell in love multiple times with programming.  It wasn't a linear progression, where I learned to code a little when I was young.  I had to come back to it, again and again, learning new things each time.  


Tuesday, July 9, 2013

quick vim trick for fixing indentation and returning to where you were

So, many people have noted that you can use gg=G to fix indentation in a file.

gg makes the program go to the top of the file, and =G idents until the bottom.   however this places your cursor at the first line in the file, which isn't something you probably wanted to do when you just wanted to fix indentation.

But you can use 2<C-o> to go back to the place you typed the command. <C-o> jumps back, but you need two jumps backward to get back to where you were.

Therefore I've placed nmap <leader>g gg=G2<C-o> in my .vimrc to fix indentation as needed without needed to go back to where you were.

Wednesday, May 15, 2013

vim macro: c declaration to c definition outline

There is probably a prettier way to do this, but I've made my "d register the following macro

yy0Gi^Mp<80>kb^[pA<80>kb {^M^M}^M^M^[^O<80>kd

this will copy a c declaration, move it to the bottom of the file, replace the ; with an opening curling brace and insert a closing curly brace a few spaces down, before going back to the initial declaration and moving down.  This lets you use a range

so 10@d will do this with 10 declarations as long as they don't have spaces.

pretty useful for me.

Tuesday, April 2, 2013


recursivereverse
================

Example is here: https://github.com/gryftir/recursivereverse

recursively reverse a linked list.  Recursion is mostly used to keep track of state data (in this case, node information and order) using the stack's function call order.

AFAIK there isn't anything you can do with recursion you can't do with an interative approach, but the data structures are going to be somewhat ugly.

Recursion isn't hard, it's just not taught correctly.  It's fairly easy to break it down into rules.

And then people memorize how to do stuff, instead of learning it from priniciples.

Take the classic question, recursively reverse a linked list.

You will see a lot of people making false starts, or trying to reverse the list in some way like they would reverse an array, or even repeatedly walking the list to the end.

But if you understand some simple rules about recursion, it's fairly easy to figure out how to do this on the fly.  And that is so much better then memorization, because you can explain why you are doing things.

first you are reversing, so you're moving backward, which means you calls your function, then do assignments.  If you were doing something moving forwards, like printing in order, you'd print first, then call the function.

Now we need to worry about the end, and the beginning.

First, the beginning, which happens after we have recursively walked the list.

Now, we want to walk to the last node before null, and we need a place to store what we return.  so assuming we have something like this in c  'node * recursivereverse(node * current)' and a node structure with next as the next link (we never touch our data)

our test is
if (current->next)
  node * newbeginning = recursivereverse(current->next);
else
  return current;
//some assignments go here;

return newbeginning;

Then we just need to figure out the assignments.

Now, people may get tripped up and try to use the new beginning... but then they have to walk it to the end... but the current node already knows the node that comes after it.

so we assign current->next->next = current;  IE the node that was previously after the current node now points to the current node as it's next.
And that's fine for all the rest of the list, until we get to our original beginning node.  We need to worry about the new end.

Since it's going to the end, we need to point it to NULL, otherwise it will point to it's predecessor, meaning we'll have an infinite loop at the end of the last two nodes.

Easy way to deal with it is to just assign the next of the current node to NULL, for each node.


so we add to current->next->next = current;
current->next = NULL;

and then you have a reversed linked list.  This makes certain assumptions about the list (like it has at least one node, and isn't circular), so don't just copy this for your interview.

So with some simple rules, I figured out how to reverse a linked list.  But those simple rules aren't taught, or at least, I came up with them for myself after I became a computer science tutor at my college, because I needed people to understand recursion.

So I guess my point is, it's not that people can or can't understand recursion, it's whether they are taught to think about things in the right way.

Now to a certain extent, we need to teach people to generalize, but if you teach people a general rule (always worry about the beginning and end of any data structure, and that's important for everything, including memory management and debugging) and a recursion specific rule (call the function first to reverse, call the function after to use the current order), and they can generalize.

Too often people come to program with the ability to copy code and get it working (and that isn't anything to denigrate, because it's not simple), but lack the understanding of how to think about things.


Sunday, March 31, 2013

More Vim stuff, fix indentation and and remove blank lines

I've been using Vim as my ide, and it's been wonderful.

some additional cool things I've found.

you can have your whole file's indentation fixed with gg=G
it may be helpful to :set sw= and :set tabstop= to 4 or 2, and turn cindent on :set cindent, to handle brackets.

gg goes to the top of the file = fixes indentation, and GG does the same to the bottom of the file

you can erase blank lines with :g/^$/d

:g makes it a global command executed on all instances which match your search pattern, ^$ (start of line and end of line with nothing in between) matches blank lines, and d deletes

you might also use something like :g/^\s*$/d to remove all lines with either blanks or only whitespace

for Perl, I recently used :%s/\(\S\+\)\s*\(#.*\)/\r\U\2/g which cuts any comments from the end of a line and inserts them on a new line, in uppercase and :%s/\s*\(#.*\)/U\1/g which removes any spaces between a comment and the beginning of the line and makes the comment uppercase to be useful.



Wednesday, March 13, 2013

new VIM version autocomment fix

I compiled the most recent version of VIM.  It has an annoying behavior

if I start a comment in insert mode and press enter in insert mode, the next line is automatically a comment too.

This means cutting and pasting from outside vim will fail at the first comment.  I guess it's useful for long comments, but mostly it's an annoyance.

However, by piecing together stuff from a few web pages and vim doc you can easily fix this.

You need to change your format options

you can do this from inside vim with set formatoptions. you can see your current formatoptions with :setlocal

So briefly:

To turn off, you need to disable the q option in formatoptions 
:setlocal find your format options then in your .vimrc au FileType * set formatoptions= after the =, put your format options without the q 
see http://vimdoc.sourceforge.net/htmldoc/change.html#format-comments for more details


* after FileType can be a language... so c, perl, ruby, python, etc.  

Thanks to http://www.kevinslonka.com/index.php?section=1&blog=179&page=1 for getting me started.  The comments have several clever fixes, including a compromise to stop commenting if the commented line ends with a space, but I haven't gotten that working myself.  You can also fix just the pasting with :set paste, if you prefer.



Sunday, January 20, 2013

Too much time in the terminal

I just tried to use Ctrl-A to go to the beginning of the line in chrome :)