电子期刊协同编辑系统设计

  同其它OA系统类似,电子期刊编辑系统的设计目的是为了减少网络交流带来的不便,协调各部门的进度,提高工作效率,从而将编辑从枯燥的排版、美工中解脱出来,把更多的精力投入到期刊内容的规划中去。
  下面笔者将从几个方面来阐述编辑系统的相关设计思想。

PHP5与Sqlite运用于期刊编辑系统的可行性分析

1. 电子期刊编辑系统的特性分析
1. 数据安全性:对于电子期刊编辑部来说,数据的安全是最重要的,它是整个部门脑力劳动的结晶,因而,电子期刊编辑系统的设计需要易于数据的移植和备份。
2. 代码易用性:编辑部成员并非都是电脑高手,一套便于安装维护的代码会更利于日常工作的进行。
3. 平台无关性:我们希望代码是平台无关的。费力腾出一台机器安装这套代码显然没有必要,只要硬件稳定,无论什么OS都能跑的很好,这才是省心的系统。

2. PHP5与Sqlite有利于电子期刊编辑系统的一些特点
1. Sqlite的数据库以文件形式独立存放,管理员可以使用ftp、rcp等方式异地备份。
2. 管理员只需懂得配置apache+php5、IIS+php5等组合之一,并将代码拷贝到一个目录下,即可完成安装。

保存与查看编辑历史

  大家知道在Unix/Linux下有一个命令叫做diff,它可以表现出两个文本文件间的差异,并用规范化的格式输出结果。人们用它来制作patch,比较文件,一些协同开发平台如也广泛应用了这样的思想。
  将编辑历史用diff表现的好处是节约大量硬盘资源,下面我们借鉴pmwiki(一套基于php技术的wiki系统)的一些设计,介绍如何保存一篇文稿的编辑历史。
  pmwiki将每篇文章保存为一个单独的文件,各个历史版本与前一个版本的差异就以特定的格式附加在文件的末尾,我们期刊编辑系统则可以设计一个diff表来存储编辑历史,这个表应至少包含“稿件id”、“改动时间”、“diff内容”几个字段。
  最关键的一点是:如何得到diff的内容呢?pmwiki是这样做的:
//$tempold和$tempnew是文章改动前后的两个版本
$SysDiffCmd = ‘/usr/bin/diff’;
//…
$diff = ”;
$diff_handle = popen(“$SysDiffCmd $tempold $tempnew”,”r”);
if ($diff_handle) {
while (!feof($diff_handle)) { $diff .= fread($diff_handle,1024); }
pclose($diff_handle);
}
@unlink($tempold); @unlink($tempnew);
return $diff;

  其实就是利用系统的diff程序,附加管道方式读取。

MSN出现0x81000370错误的解决方法

  今天在登录MSN6.2的时候,突然出现了“0x81000370错误”,由于先前只是更改了软件的配置,没有动过程序文件,因而比较奇怪。google一番找到了几种解决办法,在此与网友分享。

1. 进入命令行方式:输入regsvr32 softpub.dll,重新打开MSN并登录。我的MSN就是用这种方法解决的。
2. 如果上面的方法不行,就仔细回忆刚刚进行的配置改动,例如网络环境、代理服务器设置、防火墙配置,都是需要考虑的因素。此外还需查看IE的安全设置,以及用户密码是否正确等等。

一个显示MP3文件信息的程序

/*
一个显示MP3文件信息的程序

2004.01.01 第一版

Copyright (C) 2004, bluetent

*/

include
include
include
include

struct TID3Tag{

char TAGID[3]; // 3 字节: 必须是TAG
char Title[30]; // 30 字节: 歌曲标题
char Artist[30]; // 30 字节: 歌曲的艺术家
char Album[30]; // 30 字节: 歌曲专辑
char Year[4]; // 4 字节: 出版年
char Comment[30]; // 30 字节: 评论
char Genre; // 1 字节: 种类标识

}x;

int main(int argc, char* argv[])
{
FILE *fp;
int fd;
if(argc<2){
printf(“Usage: mp3detail n”);
return -1;
}
fd=open(argv[1], O_RDONLY);
lseek(fd, 0L, SEEK_END);
lseek(fd, -128L, SEEK_CUR);
read(fd, &x, 128);
close(fd);
printf(“Title:%sn”, x.Title);
printf(“Artist:%sn”, x.Artist);
printf(“Album:%sn”, x.Album);
printf(“Year:%sn”, x.Year);
printf(“Comment:%sn”, x.Comment);
printf(“Genre:%dn”, x.Genre);
return 0;
}

获取网站来路页面

  有时我们访问某个网站,会惊奇的发现以下字句:“欢迎您从Google连接到本站,您的搜索词为×××……”莫非有木马在偷窥我们浏览器上的信息吗?查看防火墙日志,没有发现任何异常情况,于是我们推断,是浏览器将上一个链接页面随每次请求发送出去,服务器端获取了相关信息之后,又将结果反馈给我们。
  事实的确如此,我们知道,浏览器的请求和服务端的响应都包含headers,headers提供了有关请求和响应的附加信息,也包括了浏览器生成请求和服务端提供响应的过程信息。从网络编程的角度,我们可以将其视作一组变量的集合,其中 HTTP_REFERER变量就存放了来路页面的URL,读取变量的值是非常容易的:
  在php中,我们可以这样写:
  $originalpagelink=$_SERVER[“HTTP_REFERER”];
  在asp中,则可以这样写:
  OriginalPageLink=Request.ServerVariables(“HTTP_REFERER”)
  来路页面的用途是很广的。我们可以在软件下载页面中加入对其的判断来防止盗链;可以根据来路页面统计各个友情链接投放的有效性;甚至可以根据不同的来源转至不同的页面。更多的功能还要靠编程发烧友来挖掘了。

Windows补丁全面收集方法

1. 登录www.windowsupdate.com;
2. 点击“其他选项”->“个性化 Windows Update”;
3. 将“在相关主题下显示到 Windows Update 目录的链接”前的复选框选中,并保存设置,这时在左侧“相关主题”一栏就出现了“Windows Update 目录”的链接;
4. 点击“Windows Update 目录”的链接,选择“查找 Microsoft Windows 操作系统的更新”,随后依说明一步步进行即可;
5. 操作成功,补丁已经被下载到你选择的目录中,并分类存放,这样你就可以在公司、学校的局域网络上分发Windows升级补丁了。

【注】下载目录中存放了一些xml文件,可能是在Windows Update网站中被用来显示补丁信息的。

获得了第一个Gmail邮箱

感谢qoop@ytht.org网友的邀请!

我申请这个邮箱,一是出于兴趣,二是为了将其作为大文件的存储与交换工具。
因而在bluetent@gmail.com注册成功之后,便立即进行了大尺寸附件的发送测试。
我成功的给自己发送了一个5M多的驱动程序,感觉Gmail应当能够post至少8M的附件,
总之,发送MP3是没有问题了

软件工程专业毕业生的目标(转载)

作者:beiyan(翻译)

偶然从网上发现软件开发先驱之一David Parnas制定的软件工程专业毕业生的目标。读之,不禁汗颜。我的一位美国同事也说这些目标确实很高,不知有多少毕业生能达到。不管怎样,这或许是我们软件开发人员所要追求的目标?翻译如下:

软件工程专业毕业生的目标
1.总体
1.1 道德行为和社会责任
毕业生要对他们的成绩有着习惯性的诚实。
毕业生要很快地把荣誉分享给那些做出贡献的人。
毕业生要了解他们对雇主和客户的责任。
毕业生要了解他们对社会的义务。
1.2 个人修养和成熟度
毕业生要能从那些看起来很不相同的事物中发现共性。
毕业生要了解自己的局限与能力,并能在其局限与能力的范围内展开工作。
毕业生要能处理压力,并知道在必要时寻求帮助或调剂方法。
毕业生要了解他们达到最佳工作状态的条件,并能取得其自身的平衡。
毕业生要勇于承认他们的错误与失败,并能做出适当的反应。
毕业生要能面对批评,而不总是为自己辩护。
1.3 专业修养和成熟度
毕业生要了解什么是他们的未知领域。
毕业生不要惧怕探索、询问他们专业领域以外的课题。
毕业生要知道怎样管理自己的时间。
毕业生要了解开发长期项目的方法,而不要轻率地寻求捷径。
毕业生要知道何时需要冒险、应该冒什么样的风险。
毕业生要习惯于预料潜在问题,并有所准备。
毕业生要了解折衷(trade-offs)的重要性,并知道怎样做出这样的决定。
1.4 灵活性
毕业生要有灵活性,要能随环境变化而变化。
毕业生要主动做一些他们认为“正确”的事,即使他们没有被告知要这样做。要在需要时,展示其建设性的主动性。
毕业生要能分析各种情况,并能寻找适当的解决方法。这要求他们了解在什么条件下某一方法是适宜的,什么时候必须选择或发明另一个方法。
毕业生要能将其所学应用于其它的领域,甚至是很不相同的领域。
1.5 思考、学习及工作技巧
毕业生要习惯性地提高他们的能力(终身自学者)。
毕业生要能很好地在小组内工作。
毕业生要能建立并领导小组。
毕业生要习惯性地研究他们尚未了解的想法和概念的历史及详细定义。
毕业生要习惯性地寻求术语的准确定义。
毕业生要了解何时、怎样用“反复试验”(trial and error)的方法探索某一问题。
毕业生要学会习惯性地运用他们第一次学到的原则。
毕业生要习惯性地应用“分而治之”(divide and conquer)的原则处理复杂问题。
毕业生要能质疑或反驳某些推测和论断。
2.交流
毕业生要能合理地组织交谈、文档和论文,以适当的方式向听众传达他们的信息。
毕业生要熟练掌握英语,以应付工作中的交流。
毕业生要准备在需要是学习新的自然语言。
毕业生要有在小组内的交流技巧,特别是有关目标、任务和进展等事项的交流。
毕业生要知道如何用少而易懂的文字解释复杂的主题。
毕业生要能有意识地表达他们在无意识间运用的原则。
3.数学
3.1 普通数学技巧
毕业生要知道如何进行仔细地、逻辑性地思考。
毕业生要知道如何抽象,如何寻找更通用、更可复用的概念。
毕业生要熟悉很多已经被研究过的数学概念。
毕业生要知道如何通过去除不相关的细节建立现实世界的模型。
毕业生要知道如何在工作和日常生活中运用数学知识和其它抽象模型。
3.2 软件开发中的应用数学
毕业生要能用数学逻辑描述软件状态和功能。
毕业生要理解基本的逻辑概念,能提出证明,知道怎样选择并应用基于逻辑的工具,如自动定理证明机。
毕业生要了解如何在软件开发中应用离散数学的概念,如图、树、关系等。
毕业生要知道如何运用数字数学(numerical mathematics)。
毕业生要知道如何运用符号数学。
4.软件开发
4.1 软件基础
毕业生要了解支配着我们能用软件做什么事情的基础数学定律,以及支配着应用和设计活动的物理定律。
毕业生要知道软件开发难的原因。
毕业生要了解当前开发软件的方法,不管是正确的,还是错误的。
毕业生要了解为什么“人月”不是一个衡量软件任务复杂度的单位。
毕业生要知道如何减少开发和维护软件的工作量。
4.2 软件技术
毕业生要知道如何使用现有工具,以及如何学习使用新工具。
毕业生要熟练掌握编程技巧。
毕业生要知道如何开发网络应用软件。
毕业生知道如何选择适当的程序开发工具。
4.3 软件设计与分析
毕业生要能够编写满足所提供的软件规格说明书的程序。
毕业生要能够根据规格说明准备程序测试。
毕业生要能够检查程序,确定是否满足了规格要求。
毕业生要能够使软件“模块化”,以便各模块能被单独开发、测试和理解。
毕业生要能设计软件产品,并能通过写接口规格设计软件组件。
毕业生要知道如何开发独立于设置和设备的(分布式的)软件。
毕业生要能开发需进行并行处理的软件。
毕业生要知道如何开发实时软件。
毕业生要知道如何估计/限定科学计算中数字结果的精确度。
毕业生要知道如何选择和设计有效的算法。
毕业生要知道如何在问题被详细说明前解决问题,并知道如何确定一套完备的一致的需求。
毕业生要了解如何为那些需存储和处理大量数据的产品组织数据。
5.科学方法
毕业生要理解“知道某事”意味着什么,以及能“知道某事”的方法。
毕业生要知道如何设计并进行试验。
毕业生要了解如何从观察中得出正确的结论。
6.管理、项目计划及经济
毕业生要有基本的法律和商业知识。
毕业生要有基本的会计税务等方面的知识,能足以运营小公司或与专用软件的专家一起工作。
毕业生应知道如何保护信息,以避免丢失和泄密。
毕业生要对信息保护策略有相当的了解,以便能向策略制定者提出正确的问题。
毕业生要足够了解知识产权法规,以了解他们的权利和义务。
毕业生要知道如何做项目计划、定义里程碑、以及设置达到里程碑的最后期限。
毕业生要熟悉软件项目费用评估的不同方法。

更新公司ADSL网关的流程

  这两天利用业余时间,将单位的代理网关进行了改造。
  现有的网关是一台PII机器,安装有windows 2000系统和sygate等软件,偶尔会出现停滞现象。我尝试在Linux上架设相关服务替代这个网关,并取得了初步的成功。

  硬件:用一台Celeron 500的老无盘站,内存96MB(插满),挂上一块3G的三星硬盘,两块realtek网卡
  软件:Redhat 9(为了方便其他人维护,装上了图形界面,系统占用1G的硬盘空间)
  网络:网通ADSL线路一条

详细操作过程:
【注】
在这里将eth0作为与局域网连接的网卡,将eth1作为与adsl连接的网卡
局域网地址范围为192.168.0.1-192.168.0.254
1、加载下列模块
modprobe ip_tables
modprobe iptable_nat
modprobe iptable_filter
modprobe ip_conntrack_ftp
modprobe ip_nat_ftp
2、vi /etc/sysconfig/network-scripts/ifcfg-eth0;
vi /etc/sysconfig/network-scripts/ifcfg-eth1
将eth0设置为局域网IP,将eth1设置为自动分配IP
3、adsl-setup
设置adsl拨号属性,注意将连接网卡设置为eth1,防火墙模式建议选2
4、adsl-start
测试adsl是否正常工作
5、vi /etc/rc.local
加入以下几行:
echo 1 > /proc/sys/net/ipv4/ip_forward
/sbin/iptables -F
/sbin/iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -j MASQUERADE
/sbin/iptables -A FORWARD -s 192.168.0.0/24 -j ACCEPT
6、adsl-start
测试一下,局域网内的其它用户也可以访问网络了。

[运行效果]
速度比原来快了很多,而且更稳定了。

[总结]
做网关的机器,配置不用太好,内存稍微大点即可。
建议使用Debian架设类似的网关,不安装图形界面,这样一块540M的硬盘就足够了。
如果局域网的节点比较多,并且想进一步提高网页浏览速度,可以使用squid做透明代理,同时mount若干M的内存作为squid的缓存(使用tmpfs)。

也许,我只属于90年代

  除夕夜,依旧是无聊的春节晚会,还有窗外嘈杂的鞭炮声。我躲到卧室里,拾起那只有点接触不良的耳机,听起了Radio@Netscape。换了几个频道,最后还是定格在90s pop上。静下心来慢慢欣赏,仿佛只有这些歌曲了解我的心思,让我觉得耳边异常的充实。
  97年,我上高中,接触了几位铁杆的音乐歌迷。从那时真正开始了自己的欧美乐迷生涯。我还记得夜深人静时倚在凳子上坚持听完12小时Netaid音乐会的情景;我还记得每周三、周四中午听完世界歌曲排行榜,下午上课时趴在桌子上把榜单默写出来的情景;还记得跑到同学家里,一同拿古老的录音机练习英文歌曲,准备在元旦联欢会上演唱的情景。
  以前总跟别人炫耀,说自己如何如何紧跟潮流,没想到进了大学一切都改变了。当我可以尽情享受网络带来的快乐时,却再也没有那份耐心听一分钟电台节目了,也没有激情为了寻找一首歌曲而把音乐网站翻得底朝天了。电脑硬盘上留下的多半是八、九十年代的“老”歌曲,对新的艺人不了解,也懒于了解。
  可能我并没有全部接纳九十年代的音乐,而是接纳了那个年代的生活。