Sunday, October 17, 2010

Everest "Application server does not exist" error

This post may only end up being of interest to about 10 people in the world, but hopefully those people find it and it saves them some of the hair-pulling time that I wasted.  I've been working on installing Everest's business software, Everest Advanced Application Server, for a client.  We were installing both server and client modules on Windows Server 2003.  The server module also automatically installs Microsoft SQL Server 2005 Express.  After installation, we would open the client and try to log in but would get the "Application server does not exist" error.

The first thing we were advised by support was to make sure to type in the whole machine name and SQL Server name instead of just trying to use a . dot like they say you can.  So for example, server name is "ourserver" and database instance is "ourserver\SQL2005".  That didn't fix it, so not sure if that was necessary or not.

The real fix had to do with the fact that we had set it up to run as an interactive user, meaning the user who is logged on to the machine.  This wasn't their recommendation, but this was just a development server, so we didn't think that part mattered much.  Turns out it did.  Maybe it had to do with the fact that we were only logging in using Remote Desktop and that wasn't recognized as an actual login???  But anyway, the document that finally gave me the right info about how to change that was only available after logging into their knowledge base, so I've pasted the contents below.

And we were also installing the Everest SDK aka the Everest API and it was giving connection errors.  That ended up being the same problem with the same solution.  You can't run as interactive user.  That is set up in a COM package as described in their API Guide, but the fix is the same procedure as the server one described below, just for the API COM package instead of the main Everest COM package.

Here is the document from Everest:

PROBLEM

While logging into Everest, I receive an error message "Application Server does not exist."

Possible Causes

This error message can occur for the follow known reasons:
n         The Everest Application server name is misspelled.
n         The Everest Application server is not installed in the given application server.
n         The “Enabled Distributed COM on this computer” property (path: Component Services > My Computer > Properties > Default Properties tab) may not have been selected in either the client, server, or both.
n         The Client and the Server are on different versions of MDAC. If you do not know how to check this, contact Everest Software Support for assistance.
n         If the Everest application server (COM+ components) is configured to use "Interactive User", a windows users must be logged in to the Everest application server.
n         If the Everest application server (COM+ components) is configured to use "This User", the user ID or password details are incorrect for the specified windows user in your COM settings.
n         The presence of a virus can also cause COM applications to not automatically start after a system reboot.

Solution 1

In order to overcome the problem with the last three possible causes listed above, do the following:
1         Go to the server that that has the Everest Application server installed.
2         Go to Start > Settings > Control Panel > Administrative Tools
3         Double-click Component Services.
4         Expand Component Services > Computers > My Computer > Com+ Applications.
5         Right-click Everest and select Shut Down.
6         Right-click Everest and select Properties. Select theIdentity tab. Check if the option is set to Interactive. If it is, we recommend you select This User option and specify a valid Windows Account that has Local Administrative rights. This will ensure that the Everest COM+ components start using this account and there is no need to log in to the server after reboot of the server.
7         Click OK.
8         (Optional step) To test if the Everest Application Server is working correctly, right-click Everest and select Start. If it does not work correctly, you will receive an error message explaining why it cannot start. If it works correctly, there will be no messages.
If the application service is functioning properly, you should be able to log in to the company.

Be sure to scan the system for the presence of any Viruses. The presence of a Virus may prevent the DCOMCNFG services from starting automatically each time the system is restarted.

Solution 2

If your server operating system is Windows 2003, refer to knowledge base article 87580 – Installing Everest Advanced Edition on Windows Server 2003 for more information. See the “Common Technical Issues Windows 2003 Server SPI and R2” section, Issue #1 – Application server does not exist.     
Everest is a registered trademark of Everest Software, Inc. All other product names and services referenced herein are trademarks of their respective companies.
Disclaimer:
The third-party product that this document confers is created by companies that are independent of Everest software. Everest Software makes no warranty, implied or otherwise, regarding the performance or consistency of this product.

Thursday, July 15, 2010

Javascript to get parameter from URL query string

I needed a Javascript function to get a parameter value form the URL today.  I found a couple posts about it but had a hard time getting them to work.  First I found this one using regular expressions.  It didn't work at all for me, no idea why.  So then I found this one that uses the split function several times.  It wasn't quite complete and had a bug (his query_string.split line left out the [1]).  But my solution is heavily based on that one.

So after a lot of trial and error this is the final solution I came up with.  I hope its useful to someone.  Note that it doesn't unescape special characters.

function getURLParam( name )
        {
            // get query string part of url into its own variable
            var url = window.location.href;
            var query_string = url.split("?");
            
            // make array of all name/value pairs in query string
            var params = query_string[1].split("&");
            
            // loop through the parameters
            var i = 0;
            while (i < params.length) {
                // compare param name against arg passed in
                var param_item = params[i].split("=");
                if (param_item[0] == name) {
                    // if they match, return the value
                    return param_item[1];
                }
                i++;
            }
            return "";
        }

Tuesday, June 8, 2010

Digitizing old media

I was very interested to see LifeHacker's post on Digitizing Your Life today because I've been working on this, to varying degrees, for many years.  I think this is a long multi-year project for anyone who was not born in the digital age.  If, like me, you were born anytime before 1980 or so, you probably have accumulated lots of letters, cassette tapes, and non-digital photos over your lifetime.  Digitizing these things allows you to:
1) have a digital version that can be backed up in multiple locations
2) have less physical material to store in your home, or to move next time you move to a new home
3) in the case of tapes, use your media on new devices as old tape players become obsolete

Digitizing can take a lot of work.  Of course, how much work it takes depends a lot on which media you have the most of and are least willing to throw out.  But here are my experiences with digitizing different media.

Audio Cassette Tapes and Vinyl LP's
I love music, so the thought of losing music that I had on old cassette tapes and records was really hard for me.  If I didn't want to just throw them out and lose the music, then the options are basically to buy a replacement on CD or MP3, or record the music to my computer myself using the free audio program Audacity.  If it is a common enough album, then you can find it used online for a few dollars, so that's often the best option.  But otherwise, you can get a 1/8" mini jack to 1/8" mini jack cable and run it from the headphone jack on a tape or record player or stereo console to the line in jack on your computer, start recording in Audacity, and start playing the album.  You'll lose some audio quality, so that is something to consider.  And you'll still probably want to split the recording into tracks, which takes some time.  So I recommend purchasing a true digital replacement whenever it's affordable.

Video Cassette Tapes
I'm not as much of a movie lover as a music lover, so this one wasn't as hard for me as the music.  Basically the options are the same: see if you can purchase a DVD replacement, digitize it yourself , or just throw it out.  Home movies are the hard part because you can't buy them and you probably don't want to throw them out.  Computers don't generally have video inputs, so digitizing with your computer will require special hardware and software, like Roxio Easy VHS to DVD.  I paid a local service to have my home movies converted to DVD.  You can probably find one of these services near you for less than $20 per VHS tape.

Letters and Cards
I've saved a lot of paper letters and cards from family and friends over the pre-email years.  I've been carrying them around in a big box from home to home, along with old college papers typed on a typewriter or very old word processor.  Letters or papers that are on 8 1/2" by 11" paper that isn't too folded or crumpled can be fed through a scanner with a multi-page document feeder fairly easily.  And you can find that kind of scanner in an all-in-one printer for under $100.  But the odd-sized letters and cards and other odd-shaped souvenirs will have to be done on the flatbed part of the scanner.  Some of them I've just taken a digital picture of, depending on what it is.  I'm still working on this project.  I just take a stack every couple weeks or so, decide what I can just throw out, and I scan the rest.

Photos
I had a complete under-bed storage box of old photos from the non-digital photo era.  And as I mentioned above, 3" by 5" photos probably won't go through a standard scanner's document feeder.  So I would place 3 or 4 related photos (slightly overlapped) on the glass of the flatbed scanner at a time.  As I mentioned above, I did this over many weeks/months.  If you have some free time, you just grab a stack of photos and scan them in, and someday you make it through all of them!

Of course all of this begs the question, do we really need to keep all these things?  I think most people would have a hard time throwing out old photos or home movies.  And like I said, music was hard for me to just throw out too.  But letters and cards are I think where I could throw out more without scanning them.  Oh well, at least I'm happier being a digital pack rat than a paper one :-)

Monday, May 10, 2010

Sum total line in footer of ASP.Net gridview

A few years ago, I was looking for a solution to sum up a column of numbers in a gridview in ASP.Net and display the total in the footer of the gridview.  I found a solution on aspalliance that worked well for me for these few years.  It uses TemplateFields to call one function in the ItemTemplate that adds the values and another function in the FooterTemplate that displays the total.  I enhanced it to use a Hashtable so that when I had lots of fields I wanted to total, I didn't have to make a separate variable for each one.  I just added a new key to the Hashtable.

But today I wanted to try to find a solution that was less work, where I could still use BoundFields.  I found a good solution on Microsoft.com using the RowDataBound event.  With this solution, you can still use BoundFields, but you have to add code to the function for each column that you want to sum up.  I have a grid with over 60 columns (because we hide and show different ones for different scenarios) so I was really hoping to  find some way where I didn't have to write code for each field.

So the solution I came up with is below, in C#.  It's very similar to the Microsoft.com solution, but with a couple modifications.  First, I'm using Hashtables again, two this time: one for the totals and one for the type of the field -- integer or currency.  Second is the automatic check for whether a field is numeric or not, and if its is, what kind of number -- integer or currency.  I check this simply by looking for the dollar sign in the text of the cell.  Note that when parsing the text to number format, the System.Globalization.NumberStyles.Any parameter is very important because it handles characters like the $ and parentheses for negative numbers in accounting format.

One drawback of this method is that it will total every numeric field, including zip codes, for example.  But it could be easily modified to either list specific columns to total or specific columns to exclude.  One other drawback is that it doesn't work for percentage columns.  You can't total up different percentage values anyway to get a percentage that is accurate for the total line, but at least with a TemplateField solution, you can divide the appropriate totals to get the correct percentage in the FooterTemplate.

Listing, in C# (VB listing below):


    Hashtable total = new Hashtable();
    Hashtable fieldType = new Hashtable();


    protected void reportGrid_RowDataBound(object sender, GridViewRowEventArgs e)
    {
        int i;
        double result;
        string cellText;

        if (e.Row.RowType == DataControlRowType.DataRow)
        {
            for (i = 0; i < e.Row.Cells.Count; i++)
            {
                cellText = e.Row.Cells[i].Text;

                try
                {
                    result = Double.Parse(cellText, System.Globalization.NumberStyles.Any);

                    // if this didn't go to the catch, then field was a number
                    // if it has a $ in it, save in Hashtable that it is currency field

                    // this code assumes that the field won't change type from row to row

                    if (cellText.Contains("$"))
                    {
                        fieldType[i] = "C";
                    }
                    else
                    {
                        fieldType[i] = "N0";
                    }

                    if (total.ContainsKey(i))
                    {
                        total[i] = double.Parse(total[i].ToString()) + result;
                    }
                    else
                    {
                        total[i] = result;
                    }
                }
                catch
                {
                    // do nothing
                }
            }
        }
        else if (e.Row.RowType == DataControlRowType.Footer)
        {
            for (i = 0; i < e.Row.Cells.Count; i++)
            {
                // display the value of any Hashtable total field that has a key
                if (total.ContainsKey(i))
                {
                    e.Row.Cells[i].Text = String.Format("{0:" + fieldType[i].ToString() + "}", total[i]);
                }
            }
        }
    }

Listing, in VB, using excluded fields

    Dim fieldType As Hashtable = New Hashtable()
    Dim total As Hashtable = New Hashtable()

   Protected Sub reportGrid_RowDataBound(sender As Object, e As GridViewRowEventArgs)
        Dim i As Integer
        Dim result As Double
        Dim cellText As String

        ' excluded fields
        Dim excludedFields As String = ",0,2,"

        If (e.Row.RowType = DataControlRowType.DataRow) Then
            For i = 0 To e.Row.Cells.Count - 1
                cellText = e.Row.Cells(i).Text

                Try
                    result = Double.Parse(cellText, System.Globalization.NumberStyles.Any)

                    ' if this didn't go to the catch, then field was a number
                    ' if it has a $ in it, save in Hashtable that it is currency field
                    ' NOTE: this code assumes that the field won't change type from row to row

                    If Not excludedFields.Contains("," & i.ToString() & ",") Then
                        If (cellText.Contains("$")) Then
                            fieldType(i) = "C"
                        Else
                            fieldType(i) = "N0"
                        End If

                        If (total.ContainsKey(i)) Then
                            total(i) = Double.Parse(total(i).ToString()) + result
                        Else
                            total(i) = result
                        End If
                    End If
                catch
                    ' do nothing
                End Try
            Next
        ElseIf (e.Row.RowType = DataControlRowType.Footer) Then
            For i = 0 To e.Row.Cells.Count - 1
                ' display the value of any Hashtable total field that has a key
                If (total.ContainsKey(i)) Then
                    e.Row.Cells(i).Text = String.Format("{0:" & fieldType(i).ToString() & "}", total(i))
                End If
            Next
        End If
    End Sub

Tuesday, May 4, 2010

Microsoft Office Viewer applications

It's been a couple months now that I've been going without Microsoft Office or Open Office.  I'm creating all my documents in Google Documents.  The biggest problem, at first, was viewing Microsoft Office documents that other people sent  to me.  I would have to upload them to Google Documents in order to view them.

But then I learned about the free Viewer applications provided by Microsoft for Microsoft Office documents.  There is a free PowerPoint Viewer, free Word Viewer, and free Excel Viewer.  These applications make it very easy to open an Office document that someone sends you without having to buy Office yourself.  The PowerPoint viewer and the Word Viewer especially are great, I've had no problems with them.

I have had problems with the Excel Viewer.  First, it does not open comma separated value (CSV) files.  I do a lot of database work with exports of database tables to CSV.  So for CSV files, I still have to upload them to Google Docs to view them.  Also, Excel Viewer does not read HTML files that are saved as .xls files.  This probably isn't common for most people, but again, for my work we sometimes export a table to a text file as HTML text wrapped in the HTML
tags.  When these files have a .xls extension, Excel opens them fine.  Excel Viewer does not.  And Google Docs doesn't like those files either.  So to get those in to a spreadsheet, I have to:
1) Open the file in a browser
2) Highlight and copy the HTML table
3) Paste into a Google spreadsheet

However, if the file is very large, Google will not let me paste it into the spreadsheet.  It gives me an error like, "You can not paste that much data from the clipboard" (and sometimes it just fails with no error).  So then I have to take these additional steps:

3) (instead of 3 above) Paste the copied table into Notepad, which gives me a tab delimited data file
4) Save that text file temporarily
5) Import the tab delimited file into a Google spreadsheet using the spreadsheet's Import... menu item

So those are some ways to work around Excel Viewer's limitations and survive without installing Microsoft Office or Open Office.  Unfortunately, Google spreadsheets also lack some key features, like Print Preview.  So because of the various spreadsheet issues, I still may break down and install Open Office, we'll see.

Saturday, March 27, 2010

Google Documents

I'm getting a new computer soon, so I'm using that as motivation to try to upload all of my documents to Google Documents and not purchase a new license of Microsoft Office.  Recently Google added the ability to upload any file type to Google Docs.  So in addition to all the Microsoft Word and Excel documents I have, I can also upload assorted image and sound files, and even zip files and executables.

There are some big advantages to storing your documents "in the cloud" instead of on your computer.
1. You can access them from any computer with an Internet connection, anywhere.  Not to mention any capable phone.
2. You don't have to worry about losing documents if your computer crashes and you haven't made a recent backup
3. Google Documents is free, so you can avoid buying a Microsoft Office license.

Some people worry about being able to access your documents if Google goes down, but I consider that less likely than my own computer going down.

Still, there are some definite disadvantages:
1. You need an Internet connection to view your documents.  This isn't usually a problem unless you're trying to work outside or in some restaurant without wireless.
2. Privacy - Google technically does have access to the contents of your documents, if that bothers you
3. Google Documents lacks many features of Microsoft Office

So the first two disadvantages I listed aren't that big of a deal to me, but the more I've used Google Docs, the more I've missed a few key features found in Office.

First off, although Google Documents has its own revision tracking for changes made withing Google Docs, it did not successfully import Microsoft Word's revision tracking last time I tried it.  This can be a real problem if you are sent a Word document with revision tracking as you'll have no way to view it.  I've read that Open Office can interpret Word's revision tracking though.  So if that comes up again, I'll plan to install Open Office just for the sake of reading the revisions.

Second, when typing a regular document, Google Docs does not give you any indication of where the page breaks will be.  So let's say you're typing a letter and you want it to fit on one page, there's no way to tell when you've reached a full page while you're typing.  The only thing you can do is use Print Preview, which will convert your document to a PDF to show you how it will print.  This gets pretty annoying when you're trying to trim out words and lines to see if it gets down to one page and have to keep going to Print Preview over and over.  Apparently I'm not the only one bothered by this.

And the third issue I've found is that the charts in Google spreadsheets are not as robust as the charts in Excel.    I've always been pretty impressed with how easy it is to create an Excel chart, and customize it.  The first time I made a chart in Google Docs, it took me some time to figure out how to get both the data and labels on there.  It seems that the columns have to be adjacent, so I had to make a dummy column of labels.  And at least for the pie charts, there weren't as many options for how to label them.  But Google's do have a clickable "pop-out" functionality that's pretty nice.

If you've already made the switch from Microsoft to Google for your documents, let me know how it went!  Thanks!

Friday, March 12, 2010

Meetings - Scheduling and Calendars

To many people’s frustration, meetings are an essential part of any office place.   If your organization is very small, like two people, then meetings may always just be informal turn-your-chair-and-talk meetings.  But once you need three or more people to be in a room and focused on one topic at the same time, then you’re probably going to have to schedule a meeting L

There are a few different web-based tools to help you schedule your meeting around multiple people.  One of the best is called Meeting Wizard.  Meeting Wizard lets the organizer specify multiple possible times for the desired meeting on the site.  Then the organizer sends an invitation to each participant asking each one to specify which suggested times they would be able to attend and which ones they wouldn't.  After all participants have replied, its easy to view the grid of participants vs. times to find the best time for the meeting.  Definitely beats a big long string of emails.

Once you have scheduled your meeting, you’re going to want to put it on your calendar, which means you need a calendar program.  Perhaps the most popular calendar product is the Microsoft Outlook calendar, but his the big disadvantage of only being on your desktop computer or work network (unless you synchronize with a handheld device).   Outlook also requires a license from Microsoft, which isn't great for small businesses or non-profits.

Luckily, there an online option that not only works very well, but is also free!  Goggle Calendar allows you to perform all the tasks vital to any personal calendar application.  Beyond that, you can set up shared, and public calendars so that you can schedule your own time and share your schedule with whomever you choose.  You can have it email you event reminders (or text them to your cell phone).  And you can even use it to schedule resources, like meeting rooms.

The first thing you’ll have to do is set up a Google calendar account at the link above (if you use GMail, then you already have a Google account, and you’ll find the Calendar link at the top of your Inbox page).

Once you’ve logged in, you’ll be viewing your personal calendar.  Above the calendar on the right there are tabs to switch between Day, Week, Month, Next 4 Days, and Agenda view.  Let’s use month.

Now click on a day and you should get a bubble pop-up.  Just type something as a test, like “6pm dinner with Eric”.  That’s it!  You can click on the event and then on "edit event details" to add more information if you want, including location and reminder details.  Note that this is a personal event, so nobody can see it but you.  Now let’s talk about shared calendars.

On the left side, under the "My Calendars", you should see a "Create" link.  Click that to make a new calendar to combine with your personal calendar.  This will be your shared office calendar.  So for the name, use “My organization”, whatever it is.  The “Share with everyone” setting should be set to “Do not share with everyone”.  In the “Share with specific people” section, enter the email addresses of the people with whom you would like to share the calendar.  Now click “Create Calendar”, and those people will receive invitations.

Now try adding another event.  You should now have the option of adding the event to your personal calendar or to your organization’s calendar.  Enter your meetings as organization events, and then everyone will see it, and so theoretically nobody should forget to show up! J  That’s really all you need, but you can also check out the different reminder settings and using invitations to invite people to events that don't have the flexibility in timing that requires a Meeting Wizard.  

Last, you might want to add some public calendars to your own calendar, like "U.S. Holidays" or the schedule of your favorite sports team.

Monday, March 1, 2010

Hard Disk Drive Space Visualization Tools

For a long time I've been using this very old piece of software called SpaceMonger. Its a great tool. It scans your whole hard drive and divides it into blocks to show you which folders are taking the most disk space.


Today, Lifehacker had a post about Disk Space Fan, a tool that does essentially the same thing but instead of using a square grid of blocks, it uses a circular fan. And its free. So I was happy to see there was another free option that was more updated than my old SpaceMonger.


I was about to try it, but in the Disk Space Fan article, they mentioned another free disk visualization tool: WinDirStat. WinDirStat is like my old SpaceMonger in that it displays the disk space usage as a series of color coded blocks. So since I'm already comfortable with the block map, I decided to download and try that one.

WinDirStat adds a couple neat features to my old SpaceMonger. First it color codes by file extension instead of by folder. This actually makes the graphic a little harder to interpret, in my opinion, but it does also provide additional interesting data. And it makes it clear which file types use the most space, like .mp3's or .jpg's. And the other neat thing is that it has a directory tree view pane, so if you click on a file or folder in the block map, then it scrolls to the file or folder in the tree view and you can see additional statistics there.


I was wondering if WinDirStat might have copied SpaceMonger's idea, so I did a Google search for SpaceMonger and found their site.  The first interesting thing is that there is a much more modern version of SpaceMonger than I'd been using.  Their latest version is multi-tabbed and has some pie charts, so it may even be better than WinDirStat.  The catch is that it isn't free, but its only $24.95 and there is a 30-day trial.  In regards to whether the idea was copied, I  found this interesting passage on their site:
In case you're curious, SpaceMonger's display-layout system is not unique; it uses a technique called treemaps that were originally developed at the University of Maryland's Human-Computer Interaction Laboratory by Dr. Ben Schneiderman. You can learn more about them on his Treemaps Page. SpaceMonger doesn't use any of their code, but it uses a similar idea.
If you're using one of these disk space tools or some other one, let me know which one you like best!

Monday, February 8, 2010

The Kindle

I've been learning a lot about the Kindle since my girlfriend got me one for Christmas.

At first I wasn't too excited about it. I like regular books. No big deal if they get lost, wet, or ruined. When you're done with one, you can give it to someone else. And you can generally find used books pretty dang cheap, or check them out at the library. On the other hand, it did appeal to the environmentalist in me -- no wasted paper. And books can be heavy and bulky when you move.

I started to get pretty excited about the Kindle though when I found out that it could browse the Web via the 3G network. Not only that, but the browsing is actually free! At least its free for now, I read rumors that Amazon may change that later. They say that the simple browser is meant for sites that are mainly text, such as Wikipedia. That's fine with me. And I did get my GMail to open on it.

Then I started to lose my enthusiasm for the Kindle when I learned that it doesn't support the EPUB format, which apparently is the prevailing standard for e-books. That's what Sony uses for their reader and that's what Google is using in their massive Google Books project. So Sony and Google teamed up to offer an open-source approach to e-books, and Amazon represents the leading giant with the closed proprietary format.

But my latest swing is back to enthusiastic for the Kindle because of the wonderful volunteers converting books from the EPUB format to the Kindle format(s). That combined with the fact that book copyrights usually expire 70 years after the author's death means that there are LOTS of public domain books that were converted from EPUB format to a format for the Kindle and are available to download for free on the Kindle! So I can have a library of classics all stored in my small Kindle at all times. If you like classics, then that's exciting! I downloaded seventeen free books yesterday, including a few from a couple of my favorite old authors, H.G. Wells and Jules Verne.

Add in lots of little neat features like built-in dictionary, ability to search books, and being able to see all your bookmarks and highlights in one list, and it really is a fun new way to read.

Thursday, January 28, 2010

Freelancing

Lifehacker, a tech (and some non-tech) blog about productivity, linked to a good article today on another blog I hadn't heard of, called Freelance Folder. The article was called 12 reasons you shouldn't freelance.

I agreed with a few of the points. It's true that you still pretty much have to keep regular business hours if your clients work regular hours. And if some of your clients have regular business hours and some don't, then you can end up working all hours!

I also agree that it can be hard to stay motivated at times. Especially when there are other chores to be done around the house and yard. So you have to be a pretty disciplined and organized person to make it work.

One of the things people often ask me as an independent contractor is where I find my contracts. It's a good question. I've hardly found any two clients the same way. Here are all of the different ways I've found clients, roughly in chronological order since I started:

-- referral from past co-worker
-- searching for part-time jobs/gigs on craigslist
-- referral from friend/family
-- referral from a volunteer project that I worked on
-- referral from an existing client to another organization
-- people finding my website by just searching on Google
-- referral from an existing client within a large organization to another branch/department within the same organization

So you can see that most of these are referrals. What I did, and what I recommend to others, before the referrals started happening are:

-- Develop your own website. Link to any sites you've worked on. Make it an online resume and portfolio.
-- Do some volunteer projects to build your portfolio and make contacts. If the project is a website, ask if you can put a small link to your own site in the footer of their site. Most organizations I've worked with are open to that.
-- Search craigslist for part-time gigs, or full-time short-term if you don't have anything going on at all.
-- Get in contact with some recruiters. I still haven't found any work from a recruiter because they are usually trying to fill full-time positions. But they occasionally have part-time opportunities.