Lars Pind

internet software, coaching, and entrepreneurship

Lars Pind - internet software, coaching, and entrepreneurship
Check out Coach TV, my video blog on happiness and personal development for geeks.

Upgrading an ACS Installation

June 19, 2000 · 0 comments

This document will walk you through upgrading ACS from one major version to the next. If you need to upgrade across several major versions, take them one at a time. If you haven’t kept up-to-date for a really long time, it may be better to start afresh and invent a way to move your old data into the new system. See the <a href=”http://www.arsdigita.com/doc/upgrading”>other upgrading document for how to do that.

The process being outlined here involves shutting the site down for an hour or two while the upgrade takes place. We’ll update the document later to include how to do it without taking the live site down.

The steps are:

  1. Stop you webserver.
  2. Download and untar the new version.
  3. Import the new files and resolve conflicts.
  4. Back up your database.
  5. Figure out what minor version your database is at.
  6. Upgrade the database.
  7. Do any version-specific upgrade tasks.
  8. Start the webserver.
  9. Test.

1. Stop Your Webserver

Turn off the line for your webservice in /etc/inittab. Remember that you can’t comment out lines in inittab on Solaris. Instead, change respawn to off. Then type init q on the command line to have the server process killed.

2 and 3. Download, Untar, Import, Resolving Conflicts

This is already described in detail in <a href=”http://www.arsdigita.com/doc/runbook/project-management#upgrade”>the project management document in the ACS Runbook.

4. Back Up Your Database

You can do this with

exp <i>yourservice</i>/<i>password</i> owner=<i>yourservice</i> file=<i>yourservice</i>.dmp consistent=y

Make sure it completes without hickups.

5. Figure Out Your Minor Version

If you’re in doubt, fire up SQLPlus, open the first minor upgrade script for your major version (e.g. upgrade-3.2-3.2.1.sql and check if the first few changes from that file have been done with describe <i>objectname</i>. Continue till you find something that hasn’t been done, and here’s where you should start.

6. Upgrade The Database

Programmers make mistakes. We haven’t been good enough at testing in the past. Therefore, we urge you to interactively run the upgrade scripts, rather than run the automatically. That way you’ll know what worked and what didn’t and resolve the problems by hand. This is especially a good idea, if you’ve made custom development on top of the toolkit.

The most convenient way to do it is to fire up SQLPlus in a shell buffer in Emacs (M-x rename-buffer to sqlplus), then open the upgrade script in another buffer (you probably already have it open from step 5).

Copy the stuff from the upgrade-script buffer to the SQL*Plus buffer bit by bit and make sure there aren’t any problems. The upgrade scripts are divided into blocks concerning each their part. Experience shows that if the first few statements in a block succeed, you can be reasonably safe taking larger chunks from within that block, but go by your intuition.

7. Version-specific Upgrade Tasks

Some versions have specific things you need to do. For example, ACS 3.3 requires you to deleted some files in special places. Check the release notes for these.

8. Start the Web Server

Fire up another shell in Emacs, and do a

tail -f /home/aol30/log/<i>yourserver</i>-error.log

Change /etc/inittab back, so it says respawn again, and init q. Check that the webserver is running. Search for “Error” or other suspicious-looking messages in the error log.

9. Test

Surf around your website, to make sure that everything worked okay.

0 comments

Task Manager

June 08, 2000 · 0 comments

Yet another software design proposal.

The Big Picture

I need a tool to help me manage my time. It’s my time, and the tool should recognize that fact. It shouldn’t try to make me do anything I won’t, and it shouldn’t get in my way. That’s the main idea here.

Here are the main requirements for my task manager:

  • I want my tool to help me remember tasks that I must get done. But I also want it to remember things that I’d like to get done, that are not critical (but they might be fun).

  • I want it to help me remember what state I left a task in when I last worked on it, so I can more easily pick it up later on.

  • I want it to give me a clear overview and arrange the things according to my head. Move stuff up and down my list, put things aside for later, note it somewhere if I’m waiting for someone else to do something before I can move on on the task.

  • I also want to be able to categorize things, to help me divide my time between, say, work, fun, organizing a private party, etc. Grouping tasks together into bigger task chunks might be helpful, too, but it’s tough to come up with a usable UI for that.

  • Some task management gurus operate with the notion of A, B or C tasks. They’re on a small grid:

    not urgenturgent 
    BAimportant
     Cnot important

    Originally, my plan was to have hitgh/medium/low for both dimensions of priority (urgency is probably a better term) and importance. Maybe the simple A/B/C-scheme is simpler for people to manage and understand.

  • I want my tool to have some clever default views that follows my moods. Sometimes I’m really in the mood for diving into some challenging and time-consuming task and spend all day doing that. Sometimes I’m completely bombed, and just want to get some routine, boring stuff done, stuff that doesn’t require normal brain functions. That sort of views. I’ll think about the details when I’ve got the basic tool working.

A World Outside

It’s obvious to integrate the task manager with other tools, sucs as a workflow manager, the ticket tracker or an email client. But each of their scope is different. The workflow manager’s purpose is to manage the workflow of processing a case, not to manage my time. The ticket tracker’s purpose is to organize communication around a ticket, and make sure no ticket slips through the cracks, not managing my time. The email client is good at managing email, but the task manager is better at managing my time, i.e. when I’m going to reply. So I want to be able to link any task to any other object (at least to any other object with a URL).

Another thing is collaboration. It’s natural for a group of people to have a list of stuff that needs to get done. A task manager might be reasonable at solving this problem. But there’s a crucial difference. The task manager is thought of as a personal tool, so all the tasks I’m supposed to do should be in my personal task manager. If one of the group tasks are delegated to me, an entry should show up in my private task manager, linked to the group task mananager. It’s imperative that I’m able to prioritize stuff on my own task list, independent of how they’re prioritized on the group task list.

Under The Hood

The basics are pretty simple:

create table todo_tasks (
  task_id               integer
                        constraint todo_task_id
                        primary key,
  owner                 integer
                        constraint todo_task_owner_fk
                        references users,
  one_line_desc         varchar(200)
                        constraint todo_task_one_line_nil
                        not null,
  description           clob,
  -- 1 is A, 2 is B, 3 is C, 4 is no priority
  priority              integer
                        constraint todo_task_priority_ck
                        check (priority between 1 and 4),
  -- to move stuff up and down within one priority
  sort_key              integer,
  load                  integer
                        constraint todo_task_load_ck
                        check (load between 1 and 3),
  start_date            date,
  deadline              date,
  state                 varchar(40)
                        constraint todo_task_state_ck
                        check (state in
('waiting','active','suspended',
                        'canceled','completed')),
  suspended_until       date
);

A bunch of things are missing, though:

  • A table of categories and a table mapping tasks to categories

  • A parent table, todo_list, to hold an entry per seperate list of tasks. By default, each person will have his own, but since a todo list can also belong to a group, it’ll be cleaner to have a parent table.

  • An audit table for all activity regarding a task, especially state changes. Since I’ll be implementing this as part of the <a href=”http://www.arsdigita.com/pages/toolkit/”>ArsDigita Community System, I’ll probably use <a href=”http://www.arsdigita.com/doc/general-comments.html”>general comments for this.

  • I’ll use <a href=”http://www.arsdigita.com/doc/general-links.html”>general links to let users record arbitrary URL links for a task.

0 comments