分类目录归档:项目管理

做了一个SVN的备份脚本

不知道公司租了个什么破写字楼,隔三差五的跳闸、停电。想想内部PC服务器也没有个UPS扛一下,真是捏把汗,万一硬盘坏了,平时又没有做备份,项目代码可就找不到了。因此就想到写一个脚本,定期的备份SVN库。我的备份策略是:

  • 每天进行一次增量备份。
  • 每周进行一次全备份。
  • 备份的文件复制到另一台服务器上。

因为服务器采用的是ubuntu系统,所以实现起来也比较顺利。linux中的cron搞定定时功能,而svn支持增量备份和全备份,使用scp复制文件到另外一个ubuntu服务器。由于scp复制过程中需要输入密码,就使用了expect脚本。

weekly-full-backup.sh脚本如下:

#!/bin/sh
#
# Perform a weekly backup of a subversion repository,
# logging the most-recently-backed-up revision so an
# incremental script can be run other days.

svn_repos="your svn repos";
backups_dir="your backup dir";
next_backup_file="xxx-weekly-full-backup.$(date +%Y%m%d)"
last_backed_rev="last_backed_rev"

youngest=$(svnlook youngest $svn_repos);

echo "Backing up to revision $youngest"
svnadmin dump $svn_repos > $backups_dir/$next_backup_file

echo "Compressing dump file …"
gzip -9 $backups_dir/$next_backup_file
echo $youngest > $backups_dir/$last_backed_rev

echo "$next_backup_file        rev 0  ~ $youngest" >> ${backups_dir}/readme

$backups_dir/cp-another-server.sh $backups_dir ${next_backup_file}.gz

daily-backup.sh脚本如下:

#!/bin/bash
#
# Perform a daily backup of a subversion repository,
# using the previous most-recently-backed-up revision
# to create just an incremental dump.

svn_repos="your svn repos"
backups_dir="your backup dir"
next_backup_file="xxx-daily-incremental-backup.$(date +%Y%m%d)"
last_backed_rev="last_backed_rev"

read previous_youngest < $backups_dir/$last_backed_rev

youngest=$(svnlook youngest $svn_repos)
if [ $youngest -eq $previous_youngest ]
then
    echo "No new revision to backup"
    exit
fi

# We need to backup from the last backed up revision
# to the lastest(youngest) revision in the repository
let first_rev=previous_youngest+1
last_rev=$youngest

echo "Backing up revision $first_rev to $last_rev …"

svnadmin dump -incremental -revision $first_rev:$last_rev $svn_repos > $backups_dir/$next_backup_file

echo "Compressing dump file …"
gzip -9 $backups_dir/$next_backup_file

echo $last_rev >$backups_dir/$last_backed_rev

echo "$next_backup_file        rev $first_rev ~ $last_rev" >> $backups_dir/readme

$backups_dir/cp-another-server.sh $backups_dir ${next_backup_file}.gz

cp-another-server.sh脚本如下:

#!/usr/bin/expect
if {$argc<2} {
    send_user "usage: $argv0 backup_dir filenamen"
    exit
}

set backup_dir [lindex $argv 0]
set backup_filename [lindex $argv 1]
send_user "execute:$argv0 $backup_dir $backup_filenamen"

spawn scp $backup_dir/$backup_filename alexz@10.3.48.8:/home/alexz/svn-backup/$backup_filename
expect {
    "*password*" {send "alexz123n"}
}

expect eof
exit

请注意,脚本中涉及到项目名、路径名的,都进行了替换。

Cygwin/X介绍

在开发基于Webkit的浏览器这个过程中,深深体会到拥有一台强劲的开发机是多么重要,以我的本本(Core Duo T2300, 2.5G内存)为例,全编译QtWebkit需要三四个小时,如果不是全编译,仅仅最后的链接过程就要花上十几分钟。一般来说,公司一般都配备了性能强劲的服务器,服务器通常安装linux系统,作为文件服务器或者SVN服务器。所以如果能够充分利用服务器进行开发,可以大大加快开发速度。通常我们使用ssh登录到服务器,然后在命令行下工作。这对于编译程序来说没什么问题,但是如果要在服务器上进行调试且程序包含UI呢?下面就介绍一款这样的工具Cygwin/X。

Cygwin/X 是运行在Microsoft Windows上的X Window System实现。Cygwin/X 是Cygwin计划的一部分,可以用Cygwin的标准安装程序进行安装。在Cygwin安装过程中选择X server组件,如下图所示:

image

安装完成后,会创建Cygwin-X | XWin Server启动项,第一次运行XWin Server时,在启动的X-Terminal中运行:

cygserver-config

命令设置NT服务cygrunsrv。接下来添加一个Windows环境变量CYGWIN,其值为server

接下来设置Putty,在PuTTY Configuration中选择Category下的Connection | SSH,勾选Enable X11 forwarding,X display location框中输入localhost:0,如下图:

image

在XWin Server启动的情况下,在ssh命令行下输入gedit,是不是打开了gedit编辑器?

项目管理修炼之道学习笔记(1)

项目经理必须知道项目的关键驱动因素是什么、项目要怎么样才算“完成”,而且还得把这些结论写到章程中,让整个项目团队都能了如指掌。

项目:一个独特的任务或是系统化的流程,其目的是创建新的产品或服务,产品和服务交付完成标志着项目的结束。项目都有风险,并且受制于有限的资源。

产品:项目产生的一系列可交付物。

项目经理:负责向团队清晰说明完成的含义,并带领团队完成项目的人。完成,是指产品符合组织对这个产品的要求,也能满足客户使用这个产品的需要。

要完成一个项目,如果不能理解项目的背景,前进的路上必然充满艰险。

  • 项目的关键驱动因素

    首先,要写下客户的期望 — 从客户的角度来看,项目的驱动因素是什么。这个列表中应该包括:客户想要什么(功能集合),他们期望何时收到交付物(发布时间),可交付物的质量如何(缺陷等级)

  • 接下来,写下项目的约束。环境是什么样子的?能否灵活安排团队的位置?必须遵守什么样的流程?手下的人有哪些?他们能做什么?预算有多少?

对比客户的期望列表和项目的约束列表。你脑海里蹦出来的项目成功的必要因素有哪些?选择其一,比如发布时间,这就是识别出来的项目的关键驱动因素

 

受到过多限制的项目难以逃脱失败的厄运。过多的关键驱动因素,意味着没有人知道成功的条件是什么。过多的约束,意味着组织中没人愿意去判断孰轻孰重。