|« December 2003||February 2004 »|
I'm Ryan Lowe, a Software Engineering graduate living in Ottawa, Canada. I like agile software development and Ruby on Rails.
I write this blog in Canadian English and don't use a spell checker. Typos happen.
» Full-time Ruby on Rails freelancer
» Full-time with Rails since May 2005
» Former committer for RadRails (now Aptana)
» I also have a few Rails side-projects in development:
1. wheretogoinTO.com Toronto nightlife
2. Hey Heads Up! TODO list and sharing
3. Layered Genealogy family history research
4. foos for foosball scoring
5. fanconcert for music fans (on hold)
Hiring Rails developers? I can telecommute by the hour from Ottawa, Canada
»» Email: rails AT ryanlowe DOT ca
Now hosted on Hey! Heads Up -- check it out!
Derek Lowe's (Ryan's older brother) words at Ryan's funeral
email@example.com no more
Forging Email Headers: Good, Bad or Ugly?
Sarcastic Dictionary (Part 1 of Many)
Twisting Rails is Risky Business
Risky Business? My Take on Early Alphas
Whoa, it's August 2007
A Postscript to "Growth at the grassroots"
»» All Blog Posts
David Heinemeier Hansson
James Duncan Davidson
Signal vs. Noise
Amy Hoy: (24)slash7
Luis de la Rosa
# My Brief History With Technology
Hi, my name is Ryan Lowe and I'm an unemployed software developer in Ottawa, Canada. I recently graduated from the software engineering program at the University of Ottawa this past December with a B+ average. I started my studies at the university in the computer engineering program only to discover how much I hated advanced calculus and Laplace transforms. Three years into the program I switched into software engineering and took three more years of school.
During that time I also did six co-op (intern) placements, only one of which I did not like (and it subsequently didn't count because I didn't work enough weeks). It is not listed on my resume.
In my lifetime I have lived in Pakenham (Ontario, Canada), Newmarket (Ontario, Canada), Renfrew (Ontario, Canada), Ottawa (Ontario, Canada), Sophia Antipolis (France) and back to Ottawa again.
I knew I wanted to get into the field of computers even before I had one. I used to steal my neighbor's computer and play Tetris and Qix. Once I did have a computer I couldn't stay off it, even just to do menial tasks (I hadn't heard of programming then, or I would have tried to learn C -- no Internet remember). I retyped all of my class notes for an entire semester of grade 9 science because I ran out of things to do. I didn't realise it then but retyping notes is an excellent way to study. I got an A in the class but never took the time to retype notes ever again. I took grade 10 computers in grade 9 instead of keyboarding (typing) because it wasn't offered in grade 9.
Before the internet I used to log into the National Capital Freenet BBS in my Dad's account (as081), mostly to chat (beernut) but also to send e-mail. I never used the bulletin boards for some reason.
Shortly after getting an Internet connection I made my first web site in the summer of 1996. I got mononucleosis in my senior year and I was out of school for about a month including 5 days in the hospital when I missed my step-brother's wedding. After recovering I was at risk for a ruptured spleen and the school wouldn't let me play football, so I watched the games on the sidelines and made a web page for the football team. It was funny to see how excited people got about having their names online.
In grade 12 I made a Tetris game and a few card games in Turbo Pascal and brought them in to computers class to distract the students. In grade 13 (the now defunct OAC grade) I made a game based on the movie Tron that would let you go head to head against another player in the same keyboard. It was even more distracting.
I kept making small improvements to my home page, including a redesign in 1997. I even registered a domain name for it just for fun. I let the registration expire and amazingly enough it is still available.
I started blogging in 2000 on Blogger and later had a short stint on scribble.nu (which is always down these days). Neither blogs are up any more but it would be fun to read them if they were. My first public blog was the blog I wrote in France (sorry, archives broken). During my time there I registered beernut.ca and started playing with PHP and mySQL.
When I got back I registered ryanlowe.ca for my resume and started a blog about technology topics. I don't blog about personal stuff any more but I miss it sometimes -- it was a good outlet. It was kind of like writing a rant or a nasty letter to someone to let off steam and then tearing it up.
During most of my time at school I didn't work on personal programming projects. I regret that because I started to forget why I was even in software engineering in the first place. When you're only doing architecture assignments, math and very little programming you can lose your edge ... and with it goes any passion you once had.
I am trying to avoid being typecast as a "web guy" even though I've had many jobs doing that type of work. Sure I know a lot about web browsers and DHTML but I'm trying to get out of it and expand my horizons a bit. I think I've exhausted that area and it has definitely exhausted me.
I bought a Mac in December 2002 and it's been enlightening to see every application I use from a slightly different perspective. Today I'm interested in Java programming though I still read about the .NET framework and C# and use those tools sometimes to get to know the "competition". I believe Java has the best chance to gain widespread acceptance, given that it's cross-platform and not necessarily vendor specific. I'm in favour of open source or free software where it makes sense but I am not a zealot. I read slashdot.
I personally think I'm more of an architect style of personality (and Myers Brigg tests seem to confirm that), pumping out ideas rapid fire but requiring full concentration or extreme interest to follow through on them personally. I get bored easily but I'm working on that.
Besides developing AudioMan (improving this blog and my resume "portfolio" in the process) I have no other immediate goals. I have very little interest in travelling/backpacking right now. I am unemployed and enjoying the break. I would move to just about any city in the world to work at a great job, which would include working with a lot of smart and experienced but open-minded individuals bent on making software that changes people. Seriously, if you aren't going to make software for that reason you might as well just give up in my opinion ... because then making software would feel like flipping burgers. Ideally I would love to work with people who are a lot smarter than I am so I can aspire to catch up ... or at least be jealous enough to be motivated to beat them 10% of the time.
I figure the best way to get a job like that is to execute. No, not people, I mean execute on a plan and produce a product. I'll put something out there that people can use, try to break, possibly enjoy and otherwise see what I can do.
Then they'll have a semi-tangible thing to measure instead of just my resume ... because you know what? It stinks. Most resumes do. Such is life in the software galaxy. If I want to land a fun job I have to dance the dance. So let's do it.
# MVC 123
The more I think about AudioMan's current architecture, the more I realise it's not suited to model-view-controller event driven action. The old way was lazier -- we had to refresh the GUI explicitly. So I'm thinking about a new architecture that follows the model-view-controller pattern. Let me know what you think about it.
The components are:
1. The SWT/JFace graphical user interface (GUI) view.
The interactions fall into two groups: (A) changing the contents of the repository and (B) changing what part of the repository the model displays.
A1. Request to change the repository.
B1. View asks controller to load a different subset of the repository into the models.
I actually forgot something on the diagram: a event-driven link between the mutators and the models. While the GUI is sitting in its current view a record could be deleted, which has to go through the mutators. The mutators could notify the models of these little changes so that the entire model doesn't have to be reloaded by the controller to show the deletion.
# On Refactoring
Wow, this has been my biggest refactoring job so far. All I have to say is that without the unit test safety net and Eclipse's refactoring support this would not have been practical.
We had some wicked coupling because of the call-throughs we were doing, so I needed to mess up three layers at once. Now that I've got the UI working on a basic level again I'm going to go back to the sub-UI code. The worst thing you can do during a refactor is try to get features working right away. You'll just be chasing obscure bugs for hours on end. Once you have your post-refactoring bearing again start with methods on the bottom layers and make sure they are completely unit tested (we use jcoverage to check that). Then you can write the layer above it with the confidence that the layers below will work like you expect them to.
Some people prefer the fix-a-little strategy as opposed to the rip-it-up strategy. I think there is a time and a place for both. Sometimes slowly refactoring will just take too long.
When I get up to the user interface how am I going to make sure AudioMan works the same way that it did before the refactoring? Yep, I'm going to use the customer acceptance test spreadsheet. I'll publish that as soon as I figure out how to put the GPL in it. ;)
# Bad iBook Mobos Replaced for Free
It didn't cost me any money to fix the problem because it was still under warrantee but it did cost me 5 weeks without a notebook during school, when I needed it most. Admittedly though a notebook at school, even for a software engineering student, was a luxury. I learned to love the sunlight again. :)
Anyway, kudos to Apple for doing the right thing in this situation. I was hesitant about buying another Apple computer after this happened but now I'll have no qualms getting a G5 Powerbook in 2005.
# Data Abstraction Layer Architecture
I took my hands off Eclipse for a bit and thought about AudioMan's architecture, specifically the Data Abstraction Layer (DAL) and wrote up a whole section on it. I grouped the methods of the DAL package into classes so that they are easier to manage/isolate, instead of having one large singleton class. I definitely welcome your comments.
The key to the new Data Abstraction Layer is the notion of models and mutators. A model is a bunch of data that the user interface displays in views and mutators are functions that change the models.
AudioMan is a bit more complex because the mutators don't actually change the models directly, they change the repository and the files. When the repository changes the models are updated indirectly. As well the files can be modified outside of AudioMan so when the models are refreshed the files have to be checked. Add formatting to that and you have my brain turning to mush until I forced myself to write it all down. Now it looks pretty manageable.
# He's a Microsoft Human Aggregator ... Deal With It
Robert Scoble's been catching a lot of flak lately. OK, he's an opinionated guy so obviously he'll rile some people but that's why we read his blog. His opinions and links are worth reading ... sometimes. I don't think there's any blogger out there who I'd say is interesting all of the time, even the often hilarious Rory Blyth.
It's getting pretty hard to pick and choose what to read these days. I had a list of about 100 blogs I was reading and found after about a month it was just too much to digest. Now I just wait until someone else links to interesting posts. I might be missing around half of the good stuff, but I'll trade that for my sanity thank you very much. So that's the function that Robert Scoble's blog is serving for me: he's a Microsoft human aggregator.
I have half a brain -- sometimes two halves. I know he's going to be biased and I want that spin. I get enough anti-spin on Slashdot to counter it 10 times over. When I'm curious about what's going on at Microsoft I want to read it from a human being, not a press release.
But lately Scoble's been doing a lot of rear-view mirror watching. He thinks that linking to people that insult/disagree with him will make things better. I don't know about that -- it doesn't take much to write a disagreeing blog post these days. Maybe if they had a good point and it got Scoble reflecting about something and he blogged about it, it would be worth the link back. Otherwise he's just linking to trolls.
He also thinks that linking to competing products and companies will make things better. I disagree there too. Unless he has something better to say than "see? I'm linking to them too" it's not really worth the time to write it and it's definitely not worth the time to read it.
I pick on Scoble because he's one of the few bloggers who's getting a lot of attention AND he works for a software company with a bulls-eye on it the size of Redmond, Washington (I hear it's the only thing you can see from space other than the Great Wall). It's an interesting push and pull of opinions and politics that make for interesting blog reading. It's like watching a guy try to cross the Niagara Falls on a high wire ... on his hands. So it's kind of a shame to see him giving into his readers so much. Feedback is good but ultimately Robert has to stick to his guns and say "I like Microsoft people and products and damn the man if people complain about it."
Overall I think that Scoble's readers have to grow up. They have to realise what they are reading and why they are reading it. Scoble is not a local newspaper and he doesn't owe you anything. You're perfectly free to have an opinion on it, of course, but If you don't like his blog why waste your time complaining about it? Go read something else. You're screwing up a perfectly good thing for the rest of us. :)
# An About JFace
Time for an AudioMan update once again. I read more about how the SWT/JFace TableViewer is suppose to work and I think I finally figured it out. I had to pull the information together from a few sources, including the Eclipse help. One of the problems: The setInput() method is poorly named. It should be setModel(). Maybe if I have some time later I'll write a nice long post/tutorial of sorts on it. I couldn't find a lucid one on the 'net to save my life. JFace is new, but it's not that new.
At any rate, in order to take advantage of all of the nice JFace TableViewer stuff I'm going to have to re-architecture AudioMan a bit. Some of the stuff won't change at all, like the XML Repository (AKA database/cache) and everything below the File Abstraction (reading/writing metadata). But the Data Abstraction Layer is going to be wicked complex, managing all of the paths that the data can go in and out, synchronizing between the repository cache and the file data and also doing automatic formatting like capitalization.
I figure it's better to get something major like this out of the way really early in a version (0.1.3) than later. All of the small detail bugs that I fixed for 0.1.2 will be thrown out though, probably. But 0.1.2 gives people a more polished idea of what we're going for and something to get feedback on. I'm still ambitiously aiming for a 0.1.3 release by the end of the week, which will be a whole re-arch using the model-view-controller (MVC) pattern for the TableViewers and data displayed in them (if you're really curious you can check out the notes I've been making on bug #403). It's going to be for the best I think. A large refactor like this was needed anyway before we start to add more features again.
I hate to be cryptic and vague about it but that's all I've got for now until I "architect" it out. I'll try to get Visio fired up a make a pretty picture or two. Bring your crayons to class tomorrow.
# Acceptance Testing Web App
Here's an idea for an acceptance testing tool I'm looking for. I say "looking for" instead of "want to build" because I'm sure 100 other people have already thought of it.
The AudioMan project uses a spreadsheet to keep track of customer acceptance tests. These tests are derived (and grouped into) use cases given to us by the customer as feature requests. Each test consists of a number of steps and each step has an expected result: a behaviour by the application. If a step fails we log a bug and note it on the spreadsheet next to the failure.
This sounds simple enough, but when you are adding features all of the time the spreadsheet is continually changing. Stuff like adding tests, removing tests for features that were taken out, changing steps or expected behaviours because the user interface has changed.
So you end up with a new version of the spreadsheet every week. If you test the latest build with the latest spreadsheet all of the time it's hard to track your progress from just metrics because it might seem like the "completed %" never changes.
It would be nice to have this all in a web app, that users can log into and put results into. They don't even have to do a whole test run, just part of one. Then you combine results from all of the users to find what you're really looking for: unexpected regressions. You already know what hasn't been implemented, that isn't interesting. The whole reason why you want these results is to make sure the stuff that worked last week still works. And if you had a lot of users putting testing results into the system (hey we can dream, right?) that information would be pretty handy ... so making it easy to use is important.
But the real kicker is being able to use the testing results from a run done with "spreadsheet" version 40 and compare them to the results done from "spreadsheet" 30. Of course 30 will have less tests, probably have a few that we retired and aren't in 40 and will definitely have a few tests with changed steps/behaviours. This web app has to be able to know this and sort through it. All I want to be able to see is progress and regressions.
Find this web app for me, would ya guys? Thanks. This would have been a good fourth year software engineering project for somebody too. A little PHP and mySQL.
# Managing a Music Collection in 2004
OK, I have a problem. I have so many MP3s I can't keep track of them all. I have multiple copies of the same file on my home PC, my notebook and burned on CD as a backup. It would be nice if I could keep track of all of my music and have one unified view of it.
But how do you know when two files are the same? They could be in different directories, one on your PC and the other burned on a CD. Even better, they could have completely different tags/metadata and file sizes.
We'd need a way to generate a unique id number for each song in our collection so that it can be identified as the same song if it's on CD, a hard drive or another computer on the network. An answer is the Musicbrainz ID, which uniquely identifies a song.
So imagine this scenario: every song in your AudioMan collection has a unique Musicbrainz ID. You burn a mixed CD of hundreds of songs from a variety of directories. AudioMan could generate all of the MusicBrainz IDs for the burned songs on the CD and match them to ones on your hard drive. Then you could instantly see which songs on your hard drive were burned and on which discs.
You could also go the other way too. AudioMan would keep a list of all of the burned CDs you have and which songs are on them so you can browse them and know what songs you already have. Plus you could export this list and reburn a copy of the CD without the original assuming you still have all of the songs on your computer.
Why do we need this if hard drives keep getting bigger? Because if you buy music online, like from the iTunes Music Store you pay for a song and get to download it once. You are resposible for backing it up. If your 100GB hard drive fails you lose all of the music you paid for. So it's a good idea to back up the collection anyway to CD or DVD. Especially handy would be a view showing what hasn't been burned yet.
So what do you guys think? Should AudioMan do this?
# Edit Tag Dialog Newness
I've been working on AudioMan enhancements and bugfixes this week. Yesterday I rewrote the MPEG code to extract more information from files and last night I decided to tackle the Edit Tag dialog box. Here's what I ended up with:
Update Fri 6:37 AM I updated the image because I've changed the dialog since. Now when editing single files the checkboxes are disabled.
# Automatic Capitalization
Lately I've been re-reading Lou Gerstner's book Who Says Elephants Can't Dance?, an account of his time as CEO of IBM and the turnaround he instigated in the 90s. Near the end of the book he emphases action and producing results. He's mostly referring to his direct subordinate executives but really it could be extrapolated to anyone in the company. You can have a fantastic vision and plan but if you don't execute well no one will give a damn, especially the shareholders. The bottom line: results.
So in that spirit I decided to drop AudioMan "planning" for a bit and add a new feature. But since I'm starting up on development for the first time in about a month I decided to tackle something relatively small: automatic capitalization of tag data.
You can now set a checkbox in preferences to automatically capitalize all of the words in your tags. This feature can be extended though, and probably will be. What variations of capitalization do you think we should include?
"All lower case" and "All upper case" are obvious but simple options but I could also extend the regular capitalization to exclude certain words that a person might not want capitalized like a, the, in, if, on unless they are at the start of a phrase. The user could have a text box to enter a comma separated list of words and they would not be capitalized.
Update Wed 4:49 AM I've changed capitalization so that given words can be excluded, as mentioned above. It's available in the newest developer build now. Here's an updated screenshot:
# Why You Should Hire Them
People are getting the hint: a blog can get you exposure and lead to a great job. Two bloggers looking for work -- Tim Bray and Robb Beal -- explain why certain industry segments should hire them, using their blogs as pointers and their readers to spread the word. It's a great idea and I'd do the same thing -- if I had 10+ years experience too. :)
The good news? Tim says things are getting better out there.
# Read-Only CVS Access with pserver Attempt 2
I got secure CVS read/write access set up last week and now ironically enough I need to set up a Password Authenticating Server (or pserver) to give people that aren't committers anonymous read-only access. Here's how I set it up.
1. Use the su command and enter the root password.
We need to set up the inetd daemon. Red Hat 8.0 installed xinetd instead which is apparently more flexible.
2. Make sure the following line is in /etc/services (It was already there in my default install of Red Hat 8.0):
3. Create the file /etc/xinetd.d/cvspserver and add the following to it:
4. Restart xinetd. I used Red Hat's Service Configuration window in Bluecurve. Open the menu on the toolbar and go to Server Settings --> Services.
5. Create a new username: anonymous and give it the password password. Make sure anonymous is a member of the cvs group in /etc/group. I used the Red Hat User Manager.
6. Check out the CVSROOT module from your CVS repository using an ssh account . I used Eclipse to do this. Make a new file named readers and add this single line to it:
The make a new file named passwd and add this line to it:
The part after the colon is the encrypted password for CVS, which may not be exactly the same on your machine. You can make this the same password as the anonymous account for the machine. Look in /etc/shadow to find the line for the anonymous account (probably at the bottom) and copy the encrypted password from there. It is between the first and second colons.
Then check these new files into CVS and you're done.
You can test the pserver at the command line. For AudioMan, the command is:
cvs -d :pserver:firstname.lastname@example.org:/usr/local/cvsroot login
When prompted for the password, enter password. Now you can use other CVS commands from there.
To check out AudioMan anonymously from CVS using Eclipse read the CVS page on the AudioMan developer site.
# When to Release? Artists Debate
I have two friends I would describe as artists. One is a musician and the other is a writer. Neither have released anything to the public thus far and I was curious about why. Software developers sometimes like to think of themselves as artists when we aren't thinking of ourselves as engineers or scientists, so it was an interesting parallel. When do you release your work?
More specifically, when do you sit down and take all of the information you've learned about your field whether it be visual art, music, writing or software and produce something that someone else can consume? When will you be happy enough with the results of the output to release it? There's an obvious personality issue here -- a person could be so picky about their own work that they never release anything irregardless of its greatness. How sad is that?
Coming from software I can understand the benefit of feedback, which improves the quality of the work you do. But it's hard to map software to creative writing for example, where there may not be as many people willing to sit down to a 400 page manuscript and critique it. You would need to find enough experts to sit down and tear your stuff apart, whether it be music or visual art (which admittedly take less time to digest than a novel).
The difference in software I suppose is that it doesn't take a software expert to spot a small bug. However it does take one to spot a misuse of a design pattern, for example. In an analogy to music, it doesn't take a music expert to know a note was out of tune or wrong, it would just sound gross. In terms of an entire composition however, an expert would know what to do and the average listener would not. In writing, the small bug might be a spelling or gramatical error whereas larger problems might be a disjointed plot ... you get the picture. :)
So really I'm just trying to start a discussion ... how do you know when you are ready to produce something that is good enough to be consumed by the masses?
# First Open Source Release of AudioMan
The very first open source version of AudioMan has been released today under the GPL: 0.1.1. This project's goal is to create software that will organize your audio for you. This is just the first step -- it's a small one but we have to start somewhere. :)
I've been writing new pages for the AudioMan web site with information about the tools we use. I hope to get anonymous pserver access running soon on the development box so that people outside of the project can check out the latest code anonymously. As well I'll be writing up some documents about process and quality assurance for the project.
AudioMan started as a senior year group project by Peter, Trevor, Jim, Karen and I. The code in version 0.1.1 is what we ended up with plus I fixed some minor bugs and re-added the "Fill Tag Using Filename" feature that we axed earlier to save time.
If you have suggestions for new features or notice defects please use our Bugzilla repository. If you find Bugzilla difficult to use, that's cool ... you are not alone. Just send an email to feedbackATryanloweDOTca and we'll enter the report for you.
# Breaker Breaker One Nine
The power has gone out in my room a few times already. We have a space heater (1500W) on the first floor that is apparently on the same breaker as half the house. When someone turns the microwave on *poof* that trips the breaker and my computers lose power.
So I'm considering getting a uninterruptible power supply (UPS) for my computer so that when the breaker trips (by accident, of course *rolls eyes*) I have some time to reset it. Most of the UPSes I've seen give about 15 minutes of power. While I'm at it, I'm might as well put all of my important stuff on it too:
1. My main machine and monitor
So that's five outlets. My iBook notebook doesn't need to be on the UPS, it has its own battery. Has anyone ever looked into buying one of these and can recommend one? Thanks.
# Writing About Tools
Been a while, eh? I've been moving in with my bro temporarily until I find a job. Should be pretty quiet here so I'll be able to work a lot.
On the AudioMan front I've been keeping busy getting ready for the first release. I have the license on the files (GPL) and I've written some tutorials to help developers get started with the tools that we use on the project. These are definitely first drafts so don't worry too much about spelling mistakes, more missing information. Let me know what you think.
One of AudioMan's main raison d'etres is as a metadata management system for audio files. Well what's metadata? It's data about data. What? Yeah, users don't have a clue what that is ... and they shouldn't have to.
Metadata is information about a file and it's usually stored in the file itself. So you have a music file (data) and then some information about what's in the file (metadata), like the artist's name. If there's anything I've noticed in the last five years it's that most users are too lazy to care about metadata.
And why should they? All of the information they need to know is on the filename and directories, right? Well, kinda. For about a hundred mp3s this does alright. When your collection gets large you might want to group files in more specific ways. To do that you need accurate metadata.
AudioMan aims to completely automate the metadata problem. You give it a file and it will tag it for you. It might even move the file to another computer/hard drive/partition/directory for you. These are things users really don't care about as long as they can still see their whole collection in a nice interface.
What about the power users and control freaks? They can still hand edit their mp3s but they should also be able to tweak the automating part in interesting ways so that they don't have to hand edit. Giving the power guys that flexibility will give AudioMan some momentum.
But the main key will be to take the load off the user's back. All of the information that's needed to correctly tag a file is either
We just need to make the piece of software that brings all of those sources of information together to make an intelligent decision on its own. Sounds like fun, let's do it.
# Target 1.0
Sick of AudioMan yet? OK, here's more. From a planning perspective I think it would be wiser to get to a minimally functional piece of software first. AudioMan works well but it doesn't do much yet. We need both. So for the 1.0 release we should focus on the most important features.
I've been looking through the ideas we put into our Bugzilla repository and here are some good candidates for 1.0:
bug 156: id3v2 support
One area I really want to improve on is the threading in the UI. During an include directory we can show a progress bar in the status line and still allow the user to do other things. When showing a large number of tracks in the track list, they should update gradually and not freeze the TableViewer. Some research is definitely needed there.
What do you guys think?
# Setting up Secure Remote Access to a CVS Repository
I'm republishing this edited version because it changed a lot. :)
The CVS setup for AudioMan has to be used in two ways. The first is secure access for committers that will make changes. The second is open access to everyone else that wants to download the code and submit patches to AudioMan's Bugzilla system. This post describes how I set up the secure access so far and will change as I get feedback from people.
RedHat 8 installed CVS for me but I still have to initialize it. Here are the steps I've followed using su to gain root priveleges.
1. Make /usr/local/cvsroot/ directory.
cvs -d /usr/local/cvsroot init
3. Make a Linux group to manage access to the repository. Only users in that group will be able to commit to the repository.
4. Add users to the cvs group by editing /etc/group. Find the line starting with cvs and add users to the end to give them cvs access. The anonymous user is for read-only access later.
5. Change the group of the cvsroot directory:
chgrp -R cvs /usr/local/cvsroot
6. Change the permissions on the cvsroot directory so that only the group can edit files. This gives read, write and execute permission to the user (root) and group (cvs) and no access to others.
chmod -R ug+rwx /usr/local/cvsroot
7. Change the permission on the cvsroot directory so that new files added to it are assigned to the group cvs by default (thanks Kris):
chmod -R g+s /usr/local/cvsroot
8. If you plan on checking in binary files, you should add them to the CVSROOT/cvswrappers file. The types I added were gif, jpg, ico, mp3, jar, dll. For example, here's an entry for JAR files:
*.jar -k 'b'
For a more complete list, go here.
9. Set the CVSROOT environment variable to simplify commands:
10. Go into your project directory and add the your project to the cvs repository:
cvs import -m "initial" AudioMan rlowe start
Where rlowe is the vendor name and start is the initial release name.
You can give users secure remote access to a CVS repository with SSH (secure shell). RedHat 8 installed an SSH daemon, I just had to make sure it was running. The easiest way to do that is in the GUI (Bluecurve). Open the menu on the toolbar and go to Server Settings --> Services. From that interface you can start, stop and restart daemons on your machine. Start the sshd daemon and check the checkbox if you want it to start when the machine boots.
# Information Glut
All of my blogging friends must be on vacation because I haven't seen many posts in the last two weeks. Nothing interesting going on I guess. :) No worries though, I'm beginning to feel like I'm being overloaded with information lately. A lot of reading, reading, reading and not a lot of time to process it all. So I've started to cut back anyway.
Instead I'm going to focus on one or two specific things. One of them being getting the CVS server for AudioMan up and running. I've found better sources of information to help me out and should have an update this weekend.