Tuesday, July 31, 2007

Arm Update

So I went to the orthopedist today. My nerve conduction study, which was a story unto itself, showed that my ulnar nerve is doing just fine.

I had the nerve conduction study done last Friday. It was scheduled for 9:30 a.m., so after I'd waited in the waiting room for over an hour, I went up to the front desk to make sure I hadn't been overlooked. The receptionist assured me that I hadn't been overlooked, but I didn't get in until after 11. Then, I had the first test, which I'd had before: electrodes placed in various places on my arm, producing a shock that caused my arm to involuntarily move. It was unpleasant but not too bad. Then, I had a second test that I'd never had. He stuck this huge needle into my muscles and then made me use the muscles. For example, you know the kind of fleshy part of your palm, below your thumb? Well, he stuck this needle into that part of my palm and then made me press my thumb and pinky together. The needle sticking into me was painful, but flexing the muscle with that needle in it was excruciating!

Anyhow, all that pain and suffering led to the conclusion that my nerve is fine. The x-rays of my elbow didn't show anything wrong, either. The doctor doesn't really know what my problem is exactly; I have a combination of medial epicondylitis and ulnar nerve entrapment. He knows he can relieve the ulnar nerve entrapment through surgery, but the medial epicondylitis he is less optimistic about. But we talked about it and he's going to do the surgery, because chances are that it won't make things worse, and it could, in fact, make things better in the medial epicondylitis department. If I have something like a cyst in my tendon, he can remove that.

I'll spend two weeks in a cast, and then another four weeks in a splint, and after that I should be almost back to full usage of my arm. I should regain full motion in my arm, and I might have a slight tingling in the skin where I was cut if he severs any of those nerves. But if all goes well, I should be feeling a lot better after it's over.

So, I have ulnar nerve entrapment surgery scheduled for Thursday, August 16. On the 10th, I'm supposed to go meet the anesthesiologist. I guess I'm going to be put under for this surgery. I'm kind of nervous about it but kind of excited too. Maybe there will be some relief from this pain!

Monday, July 30, 2007

On Balance

It's funny that the themes of the last two blog carnivals I've participated in have matched so well with my work. Last month the postdoc carnival theme was uniqueness, and I worked on ill-posed problems for my dissertation. The theme for this month's scientiae carnival is balance, and my current research is in the field of load balancing.

In my research, I'm looking for a way to distribute the work derived from an application in computational quantum chemistry over thousands or even tens of thousands of processors on a supercomputer. There are two conflicting objectives in this work: evenly spread the work across all the processors, while minimizing the number of links broken by dividing up the work.

I suppose there are many apt comparisons to be made between the work that I do and the life that I live. After all, I have many conflicting pulls on my time, and I have to reach a balance in my life, one that minimizes the broken links and missed opportunities. But instead I want to focus on a particular aspect of my life in which I am reaching a balance.

When I returned to work at the end of November after Vinny was born, I really felt like I had no time at all. I got up, went to work, came home, ate dinner, and went to bed, only to start the cycle all over again. It was really hard because I needed to get back into the swing of work, and at the same time I didn't want to miss out on anything in Vinny's life. I was going crazy because I just felt like I had no time.

Catching up at work was really hard to do, because even though I was out for only eight weeks, it felt more like a lifetime. I had written myself what I believed would be good notes before I left, but basically it felt like I was new to my job again. I couldn't remember what I was doing or what I had done before and every day I rediscovered something for the second time. It took me until about February to get back on my feet. At that point, I no longer felt that I was playing catch-up, and started actually making some progress instead of retracing my steps. But I was still sleep-deprived and felt that I had no time to do anything but work.

Two things made a difference: First, Vinny started sleeping through the night, and it didn't take as long to get enough sleep. Second, I began working the 9/80 schedule, which gave me every other Friday to spend with my family.

Fighting the pull of gravity against my eyelids had been affecting my productivity at work, but once Vinny started sleeping through the night, I could get enough sleep to keep me from dozing off during the day. I would take him to bed with me in the evening, and I could actually get a full eight hours of sleep, which was just wonderful!

And having every other Friday to spend with my family is marvelous! I work an extra hour each of the other days of the week, but I was able to accomplish this simply by getting up an hour earlier than before. The full night's sleep is what made this possible.

I just love spending time with Jeff and Vinny, and having a three-day weekend every other weekend really gives me a lot more quality time with my boys. I wish that I could be there to see every development, as Vinny learns to do various things. Unfortunately, I am not there for those things, but Jeff records the momentous occasions as best he can. But I don't feel completely shortchanged because I do have quite a bit of quality time with my family, thanks to my flexible work schedule. So I think I have reached a pretty good balance between my responsibilities as primary breadwinner and as a wife and mother.

Friday, July 27, 2007

Supercomputing Course: Makefiles


If you write a small computer program, you can usually fit it all into one file. But when you start writing anything halfway significant, it's a good idea to split the program into pieces. For example, if I'm writing a program to optimize a function, I'd probably want to put the function evaluation code in one file, and the optimization code in another (or, depending on the complexity of the algorithm, several others). As the complexity of the program and the size of the code grows, it's easy to expand into several hundred (or even thousand) files spread across multiple directories.

Here's how a program is made, in a nutshell. First, you write some code in a computer language, such as C++. Then, the compiler takes your code and parses it, and turns it into an object file, which is just a fancy way of saying machine-readable code. C++ code files usually have the suffix .h if they are header files, and .cc if they are source files; object files usually end in .o . Then, the compiler takes all the object files and links them together into an executable, which is what you run when you're running your program.

It's pretty simple to compile a small program in one file: you just type g++ -o myprog myprog.cc (where g++ is the name of the compiler and myprog is the name of the executable). It's even simple to compile a couple of files into a single program: you can just type g++ -c *.cc; g++ -o myprog *.o and that will do it. But when you have a bigger program and you require many files in many different directories, you run into a number of problems: first, you might have to link in libraries, or to pre-process certain files, and that can get very confusing; second, the more files that need to be compiled, the longer it takes. Each object file contains only data from the source files it depends on, so if you made a change in one code file but not in the others, you could remake the corresponding object file and relink everything together.

The make utility will help you to preprocess certain files correctly, link in the proper libraries, and recompile only the source codes that need to be recompiled, through the use of a Makefile. In a Makefile, you provide the rules for compiling your code, and the make utility automatically figures out which codes to recompile based on the timestamp of the object file and the source file(s) it depends on. So if my source file mycode.cc has been modified more recently than the corresponding object file mycode.o, then make will automatically recompile mycode.cc into mycode.o .

Makefiles follow a certain format. First, they are nearly always called Makefile (or makefile, although I prefer to capitalize it so it stands out better). You could name your Makefile Bob if you felt like it, but then you have to feed the file name to the make command and it can get ugly. Also, if you're writing a code that somebody else will ever need to decipher, then you should really stick with the standard names and just call it Makefile.

The contents of the Makefile are standardized too. Generally, the first thing you do is assign variable names (technically these are macros), like this:
CXX = mpicxx
FC = mpif90
LIBS = -lmylib -lm

INCLUDE_DIR = -I/home/rebecca/include

LIB_DIR = -L/home/rebecca/lib

CXX_FLAGS = -Wall -g -O0

EXEC = myprog
OBJS = myprog.o sub1.o sub2.o sub3.o \

        sub4.o
# this is a comment

In the first two lines, I create variables to alias my compilers. The reason I do this is because compilers have different names on different machines. So if I ever want to port my code over to a different machine, if the C++ compiler on that machine isn't called mpicxx, I can just change it on one line instead of having to do a global replace with vi.

The next line I have put what libraries I want to link with my code. When you see a -l followed by some letters, e.g., -lmylib, what that means is that the compiler needs to look for a library file by the name of libmylib (usually with a suffix of .a or .so). I'm also telling it to look in the directory /home/rebecca/lib in addition to the normal list of directories it goes through with the LIB_DIR variable. The INCLUDE_DIR variable has a list of directories in which I want the compiler to look for header files (again, in addition to the normal list of directories). The CXX_FLAGS variable holds some compiler option flags that I want the compiler to invoke. The first one, -Wall, tells the compiler to report all warnings (when I do something questionable but not bad enough to be a deal-breaker); -g tells the compiler to insert debugging information into the code so that when it breaks down I can use a debugger on it, and –O0 tells it to turn off all optimizations (such as loop unrolling). EXEC holds the name of the executable(s) I'm compiling. OBJS is the list of object files that need to be created in order to make $(EXEC). (When we use the variable for an expression, we precede it with the $ character, which tells make to evaluate the variable [i.e. print it out].)

Notice that at the end of the line starting with OBJS, I have a backslash. That represents continuation, meaning that make will go on to the next line and read it as part of the previous one. Something very important to remember is that when you indent in a Makefile, you always do it by tabbing, and never with the spacebar. make will give you weird, cryptic errors if you use spaces instead of tabs. In my experience, 99% of the errors in Makefiles are a result of using spaces instead of tabs. So learn from my experience, and don't make the same mistake!

After the variable declarations comes the meat of the makefile. In this part, you'll use the variables you just defined to create rules for make to follow. The basic format is the following:
target: dependencies
        commands

So, we begin with the obvious. If we want to make $(EXEC) (target), that depends on $(OBJS) (dependencies), and the command we use to link that invokes the compiler to link together the objects and the libraries. Thus the next lines in our makefile are
myprog: $(OBJS)
        $(CXX) -o $(EXEC) $(LIB_DIR) $(OBJS) \
                $(LIBS)


Next we need some lines telling how we make the object files. These take a weird format, so bear with me.
.cc.o:
        $(CXX) $(INCLUDE_DIR) $(CXX_FLAGS) -c $@ $<

.f.o:
        $(FC) -c $@ $<

So what's that crazy stuff at the end of the command lines? Well, @ and < are variables in make with a special meaning; $@ means the name of the current target, and $< means the source file of the current dependency.

There's another thing that it's very useful to have: a make clean rule. What that does is to wipe out your executable and all the object files, giving you a clean slate to restart your compilation. That rule looks like this:
clean:
        /bin/rm -f *.o $(EXEC)


(look up rm using man if you're interested in what the -f flag does.)

So, after you've written your Makefile and you want to compile your executable, you just type make myprog and away you go. And if you want to wipe it clean, just type make clean to do that.

Useful Makefile references:
GNU make
Make – a Tutorial
Oram, Andrew, and Steve Talbott. Managing Projects with make, O'Reilly & Associates, 1991.

Next topic: Batch Scripts

Things that Make No Sense to Me

I freely admit to being swept up in Obamania. I voted for Barack Obama when he ran for senate in my former home state of Illinois, and I still consider him my senator. (Bob Corker? Not so much.)

But the more I listen to him, the more fed up I get with his clear homophobia. (Look, Barack. Teh Gay is not a disease. You're not going to catch it!) Oh sure, compared to the antediluvian
who technically represents me now, Senator Obama is positively forward-thinking. But here's what I don't get.

In the debate the other night, Senators Edwards and Obama, both of whom are known to oppose gay marriage, were asked how they could justify using their religious beliefs to oppose gay marriage, when people used the same justification for opposing interracial marriage. Here's the clip:




I thought that John Edwards gave a fairly satisfactory answer. Basically, although he is personally opposed to gay marriage, he would not want to use his religious beliefs to prevent people from having equal rights. Of course that's not the answer I would want to hear, but it's better than what you would hear from any of the Republicans.

But Barack Obama's answer made me very angry. He said that the civil unions he proposed would confer all the rights that the states grant to heterosexual couples to homosexual couples. (Okay, sounds suspiciously "separate but equal," but better than nothing.) But his next statement sent my blood pressure skyrocketing. He said that it's up to individual churches to decide whether to recognize these relationships as marriages or not!

Look, people, I'll say it one last time. If heterosexual atheists can have legally recognized marriages, then homosexual couples of any religious persuasion should also be allowed to legally marry. Here's why. If the state recognizes marriages between atheists, then marriage is not a religious institution in the eyes of the state. Therefore, whatever religious objections there may be to the union of two individuals are not relevant to the legality of their marriage.

If your church opposes same-sex marriage, fine. They will never be required to perform same-sex marriages. Just like they will never be required to perform atheist marriages. After all, that would go against the principles of religious freedom upon which this country was built!

But like your church deserves to be separate from the state, the state needs to be separate from the church. That's why I can support marriage equality without fearing that it infringes upon anybody's rights.

We Are Entering a Whole New Era

So, the big news is...

Vinny is now crawling! He started crawling on Tuesday night, but I was not awake to see it. I first saw him crawl on Wednesday evening after I came home from work.

He's still not very good at it, but he's learning. We have a (music) keyboard that Vinny really loves, and Jeff turned it on and then put Vinny on the other side of the room. It wasn't long before he heard the cacophony of a baby playing the keyboard.

Last weekend, we taught Vinny how to clap. He understood the concept of moving your hands towards each other already, but he hadn't yet figured out that your hands needed to be open. But once he figured that out, he was clapping like it was going out of style. In fact, he frequently crawls and then becomes so delighted with himself that he sits himself up and claps. It's quite hilarious to watch!

Thursday, July 26, 2007

And I Thought I Already Knew the Source of My Misery...

... but no, it's actually The Gays, and their evil ways!



(Maybe this means it's Laura and not Rachel who's ruining my life!)

Wednesday, July 25, 2007

Nine Years!

It is hard to believe that nine years ago today, Jeff and I got married. In some ways, it feels like it hasn't been that long. Yet in other ways, it feels like it was several lifetimes ago.

So much has happened since then. We moved to Illinois as newlyweds, and I started graduate school. In those years, we went through some tough times but also some fantastic times. There were times I thought we'd never make it through. And then there were times I wished would never end.

One of the best things we ever did was to take a three-week vacation to England and Sweden. We saw some friends while we were over there, but mostly it was just Jeff and me, spending that time together, getting reacquainted. We had a great time doing touristy things and just being together.

After I finally made it out of school, we moved here so I could start working at the lab. We now have a baby. Life is really busy and hectic, but we do make time for each other. I'm so glad that we still have each other.

I love you, Jeff!

Tuesday, July 24, 2007

Back for More

Hello, vast blogging audience! How have you been?

Things have been interesting over here. I have been busy, busy, busy. I'm sorry I was so busy that I neglected you. But if I look over at my sidebar, I see that I have already posted more this year than I posted all of last year, and it's only July. So I don't feel so bad.

Last year, I was still adjusting to my new job, and balance that with being pregnant and then being a brand-new mother. So the blogging kind of took a back seat for a while. Then, I somehow got it all figured out in February, and went on a blogging rampage. I still have dry spells when I get really busy with other things, but hopefully I'll be back for the long term now.

I think it's safe to tell you now, after the fact, that yesterday's deadline was actually a job interview for a staff position here at the lab. At a supercomputing workshop in March, I caught the eye of the group leader of one of the groups in the supercomputing center, who told me to let him know when my postdoc was up. Well, my postdoc can actually extend for a third year, through next August, but he didn't want to wait that long, so he asked me back in May if I'd be interested in interviewing this month. I said sure, so yesterday, I managed to fit myself into one of my suits (despite being ~30 lbs heavier than the last time I wore it) and gave a seminar and talked to a lot of different people.

Last week, I had to concentrate on getting some meaningful results, which was non-trivial to do. I worked all weekend the weekend before last, and into the evenings after I got home from work all week. I had to balance this with taking care of Jeff and Vinny, because Jeff had come down with a really bad cold. Then, on Wednesday, Jeff's generous nature finally topped my iron constitution, and I fell victim to this cold. I still had to keep working, though, because I didn't have any meaningful results. That night, I couldn't sleep because I was unable to breathe, so I got up at 3:30 a.m. and kept working. I got my last results on Thursday, and incorporated them into my talk then. I think I really felt the worst on Friday and Saturday, but by Sunday I was feeling human again, and yesterday I was at about 80% power.

I blame my sister Rachel for this cold. She made some passing comment about getting a travel cold while she was here. My hypothesis is that she gave it to Vinny, who expressed it with a 103ยบ late-night fever, who then gave it to Jeff who gave it to me. The purpose of said illness: to ruin my life.1 But she wasn't counting on my constitution of 20 (D&D, anyone?), so I managed to fight it off. And the residual cough and raspy voice just made people impressed by my working through my illness. Sorry Rach, you're going to have to try harder next time!

I think that I would really enjoy this job, because it involves doing science and working with people. One thing I miss in my current position is human interaction. I really like talking to people, so it gets kind of lonely to go into work, disappear into my office, and come back out maybe for lunch, but otherwise basically spend the day alone, at my keyboard. The degree of isolation is actually kind of sad, because my boss's boss didn't know what I am working on, until he came to my seminar yesterday. If he'd known, he might have put me on a proposal that he'd just submitted, because my work is actually very relevant to what he was proposing to do.

Anyhow, I think my chances are very high, because the group leader had already done a lot of background checking (talking to my boss and the people I work with) before he even approached me. The group had to approve of me joining them, and I think overall they liked me. But I should know for sure in about two weeks. And, in the event that it falls through, I can still be a postdoc for another year. But I really hope it doesn't fall through. I think this is a job that I would enjoy and do really well at.


1 For reasons still unknown (except, perhaps, that he was batshit insane?), one of my teachers in high school declared that the reason I was so stressed was that my sister Rachel was ruining my life. Taking four AP classes (Calculus, Chemistry, French, and U.S. History)? Naah. Not Stressful. Functioning on six hours of sleep per night? All teenagers can do that. A complete lack of free time to relax or do anything fun? Of course not! No, it was Rachel, and her incessant drive to assert her superiority over me, that was ruining my life. Who knew? Ever since then, I've become acutely aware of the ways in which she attempts to ruin my life. In return, I foil her plans and ruin her life. (Occasionally, I even take steps to actively ruin her life.)

Wednesday, July 18, 2007

Brief Update

Just to let y'all know, I'm still alive, just very busy yet. I am working on getting some performance runs done with a deadline of Monday, and whatever can go wrong seems to go wrong. Right now, now that I've figured out what all the other problems were, everybody and their mom decided to run jobs on the big machine, so I am sitting around waiting for my jobs to run. It is kind of frustrating because I am in a hurry. But so are they, I suppose.

Anyhow, I went to the orthopedist yesterday, so I thought I'd report on that. He decided that I need to have surgery. So he had some x-rays of my elbow taken, and he ordered a nerve conduction study for Friday. Then I will come back to see him again a week from Tuesday.

I feel relieved that my problem is being taken seriously, but of course I do not look forward to the pain associated with surgery and the long road to recovery.

Friday, July 13, 2007

Supercomputing Course: The vi Editor

Back in the good-ol' days (again, before I was born), the user would communicate with the computer through the use of punch cards. Each card would represent a single line of FORTRAN code. There would be a sort of typewriter where you would type and it would punch out dots or rectangles from the cards. (They probably had problems with hanging chads in those cards, but I can't be sure of it.) You would stack up all your cards in the right order, and then put them into a card reader for the computer to read. Your output would be on a line printer, printed on that very wide, green-and-white striped paper. Then the terminal was invented in the 1960's, and after that your program would be keyed into the machine. A very crude line editor known as ed was invented. It had a 24-line terminal and no ability to scroll back. It did the job but it was very primitive and unsatisfactory.

In the mid-1970's, Bill Joy was a graduate student at Berkeley. He and his friends were unhappy with ed, so they hacked around on it and made some improvements. Joy and his counterparts built their new editor vi on top of ed, and they gave it away to anyone who wanted a copy, which is how vi became a part of basic UNIX.

Every *nix machine has some flavor of vi on it. Most modern unices (that's the plural of unix, like index → indices) have vim, which is an improved and slightly prettier version of vi. But if you ever find yourself using an ancient dinosaur machine, it will have vi on it, guaranteed, whereas other editors, such as emacs, are not guaranteed to be there. (That being said, I've never used a machine that didn't have emacs, but you never know.) So that's why I always teach vi instead of emacs.

You can start a whole flame war over which editor, vi or emacs, is better, something I'm not interested in getting into. Really! Self-righteous jerks on both sides condemn users of the other editor, people's feelings get hurt, and it gets really ugly. I think there is room for both editors in this world. I like vi because it's ubiquitous, it doesn't require as many keystrokes, and it's a much better text editor than emacs. But emacs is definitely more versatile than vi; as I've heard some people say, emacs is a great operating system with a pretty good text editor in it. If you want an editor that you can use to play tetris or check your e-mail in addition to editing your programs, then by all means learn emacs. However, you'll have to find a different resource if you want to learn emacs, because I'm teaching vi!

The most important concept to understand about vi is that there are two modes: command mode and text entry mode. When you're in command mode, you (surprise!) issue commands, such as moving the cursor, deleting words or whole lines, or substituting one piece of text for another. When you're in text entry mode, you (surprise!) enter text through typing. If you can't remember which mode you're in, pressing the escape key will assure you of being in command mode. There are several different ways to get into text entry mode, but the most common ways are to press i, a, o, or O while in command mode. Each of those commands starts you in a slightly different location. Keep in mind that vi is case sensitive, meaning that j and J do two very different things. (See one of the resources below to find out what they do.)

To start up the vi editor, from a command prompt type vi filename (or just vi if you don't have a file in mind). When you want to save, type :w to write the file, and if you want to quit, you can type :q, or :wq to save and quit, or :q! to quit without saving.

You can pattern search with vi, to find a particular string of characters. So if you have a file and you're looking for the word 'box' within the text, in command mode type /box and it will take you to the next instance of 'box' in the file, wrapping around to the top if necessary. Using a question mark instead of a slash (?box) takes you to the previous instance, wrapping around to the bottom if necessary. You can search for any regular expression too, meaning that you can use wildcard and other special characters in your search. For example, /[Bb]ox searches for 'box' and 'Box'. I could search for those with /ox, but /ox will also turn up lox, toxic, and oxen, for example.

Let's say that you've written a C code with a variable named goto, but then you realize that 'goto' is actually a keyword in C so you can't use it as a variable name. This totally stinks, because you have like 80 instances of 'goto' in your code. How in the world are you going to find them all and change them to an acceptable variable name, such as go_to? Well, you could search for goto everywhere and manually replace it with go_to, or you could use this very compact global search and replace expression:
:g/goto/s//go_to/g
which replaces every instance of goto with go_to. (Don't forget the colon at the beginning; it's part of the command.)

I will leave you with some useful links.

Good vi Resources:
vi lovers' homepage
Learning vi – the "cheatsheet" technique
vi Cheat sheet
K Computing vi editor cheat sheet (leading to a pdf file with the simplest commands)
EMACS vs. vi: The endless geek 'holy war' (a good summary of the emacs/vi feud)

Up next: Makefiles

Update

Sorry to leave you hanging like that. Vinny's doing just fine now; the fever disappeared as quickly as it came. By Wednesday afternoon, he was feeling just fine. Who knows what the deal was.

Anyhow, I have for you this morning another segment of the supercomputing course. This is because I had already written most of it by early last week. I will write about the family gathering at some point when I get the time, but for now, I am afraid I am positively swamped, because I have an actual deadline of Monday, July 23, by when I must have some real results at work! I'll try to keep my vast audience entertained as best I can between now and then.

Wednesday, July 11, 2007

Busy... Back Soon!

I meant to post something last night, but unfortunately we had a feverish little boy who had to be taken to the emergency room. We got home after 1 a.m., so anything I might write would be pretty incoherent anyway.

Anyhow, I hope to be back soon, with some tales from our family gathering, and the next installment of the supercomputing course!

Tuesday, July 03, 2007

Happy Independence Day!

We're having a busy five-day weekend. I have tomorrow as a holiday, and then I'm taking Thursday off, and Friday is my day off, so I have a total of five days off work in a row.

On Thursday, my sister Rachel and her family are coming for a visit. Laura is coming in on Friday. They'll all be here until Sunday, at which point Dad and Marvis are coming down for the day, and Rachel and her family will head back up to Lexington with them. And Laura will leave on Monday morning.

All of this is to say that I'm going to have a very busy next couple of days, so I hope you'll understand if you don't hear from me until sometime next week!

Sunday, July 01, 2007

Supercomputing Course: Introduction to Unix, Part II

Typically on a Unix or Linux machine, you have both a GUI (graphical user interface) and a command line mode. When you remotely log in to a machine, such as a supercomputer, from the comfort of your home or office, you will open a terminal session with that machine. The way to do it is using ssh (secure shell authentication, pronounced by spelling out the three letters). ssh sends your password and all your data encrypted, whereas telnet does not. Back in the day we used to use telnet but it is just not safe anymore, so instead you connect in the following manner: ssh userid@machinename . So if my userid is rebecca and my machine is called fred.fictitious.com, then I would do ssh rebecca@fred.fictitious.com . If you've never logged in to that machine from the one you're on right now, it will ask you to confirm the validity of it, which you confirm by typing yes and pressing enter. Then you'll be asked for your password, which you will of course type in correctly, and then you're logged in. (To log out, just type exit or logout and then press enter.)

If anyone reading this is ancient enough to have used DOS, *nix is a lot like that, with some caveats. First of all, the file name separator is the forward slash (/) rather than the backward slash (\). Secondly, *nix is case-sensitive, meaning that myfile, myFile, and MyFiLe are three different file names.

The man command is one of the most useful commands ever. Type in man man to find out why. (You use man to access the manual entry for any command. So doing man ls will tell you what ls does, along with give you an idea of all the different options that can be used with ls, e.g. ls -l, ls -t, etc.)

Another important concept has to do with the | character, which is called a "pipe." (On my keyboard, | is made by pressing shift and the key just above enter that makes the backslash.) Basically the pipe takes any command that you do before it, and makes that command be the input for the command that follows. A common use of the pipe is when you want to list the contents of your directory, but you want to see it one screen at a time. If you have a lot of files, they will all just scroll past really quickly and you won't get a chance to look at the whole list if you don't use this command. So you do ls | more . What that does is the following: ls lists the directory contents, as we already know. The more command is usually used with files, for example more myfile will display the file myfile in screen-sized chunks that you can scroll through by pressing the spacebar or the up and down keys. Pipe takes the output of ls and turns it into the input for more, so that you then have a listing of your directory in screen-sized chunks that you can scroll through. Make sense?

I will leave you with some links to some good tutorials.
Unix Tutorial for Beginners
DOS to UNIX Translation
UNIX Command Summary

Up next: a history of editors leading to the vi editor.