正在载入...

其实我觉得大部分人完全可以用WPS取代MSOffice

2008年10月17日 软件 ,

想写这么一篇文章是因为这么一件事,昨天从网上找了篇doc的数模论文,机器里只有word viewer和WPS。用word viewer看了一下论文,发现里面有地方要小改一下,试着用WPS开了一下,很惊讶的发现格式99%都是没问题的(那1%我还没发现,不敢说绝了……),有感于以往“非MSO打开doc等文档时格式严重错乱”的错误观点,想写这么一篇文,让大家多了解了解WPS。

评价一个软件无非从界面、功能、使用感受这几个方面,最后还会说一下格式兼容性。

一、界面
经过这么多年的模仿,WPS的界面已经跟word 2003几乎一模一样。说是几乎,是因为WPS多了一个标签栏,同时打开多个文档的时候,就不用到地址栏那里切换了。而且快捷键也是标准的”Ctrl+T”、”Ctrl+Tab”等。
除此之外,WPS的右上角会有一些金山的新闻推送。标题和内容都还可以,应该算是很“干净”的新闻,有些WPS技巧也还不错。虽然不影响视觉效果,但是仍然希望以后的WPS可以选择关闭这些新闻。
除了视觉上的效果,WPS的快捷键也跟word相差无几,常用的ctrl+shift+>增大字号,ctrl+b加粗等等都很顺手。
总之,用习惯了word的同学上手WPS的难度为0。若2007你都尝试着去上手了,那为啥不去试试WPS?

二、功能
作为一款20MB的软件,功能上跟MSO肯定有删减的。删减的部分主要集中在一些企业级应用上,比如团队撰写文档。我相信这一部分的功能,绝大多数交大的同学都没有用过。就我身边的人来讲,用的比较多的功能有这么几个:

  • 1.格式设置:字体、字号、字体样式、上标脚标。自动缩进、段落、段落间距、格式刷、页面格式、页眉页脚
  • 2.内容的查找、替换、通配符替换
  • 3.拼写检查、字数统计、繁简转换
  • 4.引用、脚注、参考文献
  • 5.符号/表格/图片/公式的插入、修改、混排
  • 6.打印/打印预览
  • 7.文档结构图

之所以说这么详细,我是希望可以把大家常用的功能都一一列举出来,对着功能说,哪个功能WPS没有。而不是笼统的一句,WPS功能太弱,就把这么优秀的一款国产软件枪毙。
除了上面提到的常用功能以外,还有两个功能是WPS独有的:(我只用过MSO 2003,2007可能新加了这些功能,我不大熟悉)
1.pdf输出。pdf的开放性保证了pdf文件在各种平台下都具有一致的表现,因此我认为这个功能相当重要。各种通知、策划的发放,最好使用pdf而不是doc/WPS等中间格式。
2.窗口并列文件比较。当WPS下打开了多个文档时候,可以选择窗口->并排比较,同步滚动文档。

三、使用感受
这部分我就写的主观一点,使用感受本身就是一个很主观的看法。
首先是启动速度,很快,跟word2000的速度差不多,比2003要快,跟2007比是飞快。
操作上很方便,功能按钮快捷键都很熟悉,很方便。
标签栏(TAB栏)的快捷键跟Fx是一样的(除了ctrl+shift+t打开最后关闭的标签,建议下个版本加入这个),直接熟练掉,比在任务栏里切换文档速度快多了。
其实感觉就这么多,因为其他的感受跟使用mso2003是一样的,没有区别。我觉得这个就是最大的感受吧,呵呵。

四、文档兼容性
首先要说的是,mso写的doc到WPS上面肯定是有兼容性问题的,就像WPS相比mso在功能上肯定有删减一样。但我认为这种格式兼容性问题已经到了可以忽略的程度,特别是WPS->mso的兼容性是完美的,也就是说,你不必担心你用WPS写的doc到别人的电脑上用word看会乱掉。
其次,一些媒体测试兼容性的时候,使用的是一些相当变态的文档,比如多层表格图片嵌套,我觉得这种测试太过脱离平时的使用环境。对于我和我周围的同学来说,平时用office最多的就是写个思想汇报什么的,学期末的时候写两篇大作业上去。
所以这次测试我选择的是我开篇提到的那篇数学论文。
测试结果,有图有真相:

word viewer 2003下的效果

word viewer 2003下的效果

wps下打开的效果

wps下打开的效果


要说的,我能说出来的,也就这么多了。我用WPS不是因为它免费,而是因为它在我的需求范围内,它体积小,速度快,功能全,可以输出pdf,国产。跟我用7zip/irfanview取代winrar/acdsee的理由一样:It works, perfectly.


最后,借用倪光南的话:“希望一切对国产Office还存有怀疑的人实际去用一下,那么你就会明白,放着好用的国产Office不用,而非要被戴上盗版的帽子是多么不值!”

本文还没有评论,赶快来抢沙发吧

饮水思源文件上传工具 1.0

牢骚:算是python的小作业了吧,虽然折腾了我两天折腾到要吐……
另外:感谢xXx同学的帮忙调试,被折腾的想吐的人不止我一个……

YSSYFileUploader
CTerm专用的水源文件上传器,可以上传所有类型的文件。只能用于饮水思源bbs,广大CTerm同学再也不用为了传图开web了。

源代码在压缩包里

下载:饮水思源CTerm文件上传

压缩包内有CTerm 3.3.17.317和CTerm 3.299两个版本的安装文件。推荐使用这两个版本的CTerm。其他版本切勿直接覆盖,见手动修改部分。

安装有两种方法:

1.需要开启CTerm的自动登录。
关闭CTerm。将压缩包内文件按目录结构解压至CTerm文件夹下覆盖原有文件。注意原文件的备份。打开CTerm,安装完毕。

2.不需使用CTerm的自动登录,但需要手工设置账号和密码。
关闭CTerm。将压缩包内文件按目录结构解压至CTerm文件夹下覆盖原有文件。注意原文件的备份。
用记事本打开CTerm目录/script/upload.py,将第七行和第八行更改为

1
2
username = "水源用户名"
password = "水源密码"

打开CTerm,安装完毕。

使用方法:
1.资源管理器中选中需要上传的文件,Ctrl+C。CTerm窗口下按ctrl+alt+u,文件上传后址,自动粘贴至剪贴板。
2.使用截图工具截图至内存,CTerm窗口下按ctrl+alt+u,文件自动上传后,地址自动粘贴至剪贴板。

可能导致上传失败的原因:
1.文件名有中文。程序暂不支持中文文件名上传,请确保文件名为英文/数字/下划线等常规字符。
2.过于频繁使用本工具。如果一天内使用本工具次数太频繁(大概五十次以上),会被web水源暂时封禁一天……被web封禁以后不影响term的登陆,但是到今天24:00之前都无法再进行web登陆,也无法再使用本工具。
3.出现窗口一闪就消失的话,有可能是文件大小太大。

其他版本的手工安装:
像自动安装一样覆盖除了script/ct_system.py以外的所有文件。
用记事本打开CTerm目录/script/ct_system.py,找到以下内容

1
2
3
4
5
6
7
8
9
10
11
12
def OnDataCome(ID):
    #print "session %ddata comes"%ID
    #print
    #print GetText(ID,0,23)
    #print
    try:
        dataEvents[ID].set()
        dataEvents[ID].clear()
    except KeyError:
        pass
    #print 'KeyError'
    #print dataEvents, ID

添加第9-12行,注意使用tab键以保持缩进的正确

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
def OnDataCome(ID):
    #print "session %ddata comes"%ID
    #print
    #print GetText(ID,0,23)
    #print
    str = GetText(ID,0)
    str = str[str.index(" [")+2:]
    str = str[:str.index("]")]
    if str:
        fp = open("YSSYFileUploader/boardstate.txt","wb")
        fp.write(str)
        fp.close()
    try:
        dataEvents[ID].set()
        dataEvents[ID].clear()
    except KeyError:
        pass
    #print 'KeyError'
    #print dataEvents, ID

然后即可使用。如果想不使用自动登录,参见安装方法2修改upload.py

下载:饮水思源CTerm文件上传

本文还没有评论,赶快来抢沙发吧

Python tutor 笔记

2008年10月10日 Script

http://doc.chinahtml.com/Manual/Python/tut/node2.html

前言
名称起源:BBC的“Monty Python’s Flying Circus”节目,
Python是一门解释性脚本语言,
面向对象,
语句组织依赖于缩进而不是{}或者begin/end,
不需要声明变量或者参数。

Python解释器
调用解释器
1.直接启动:
[perfectworks@Debian ~]# python
2.调用脚本:
[perfectworks@Debian ~]# python script
3.直接运行语句:
[perfectworks@Debian ~]# python -c command[arg]…

参数传递:sys.argv[0]脚本名,sys.argv[1]第一个参数。

多行结构:主提示符:<<<,从属提示符...

Python脚本
单行注释:#

开头写入:

1
#! /usr/bin/env python

编码指定:

1
# -*- coding: utf-8 -*-

不直接支持GB/GBK/GB18030/ISO-10646(新版好像有所改进?)

运算
直接支持整数/浮点/复数运算,可以用变量_调出上一次的运算结果。
>>> tax = 12.5 / 100
>>> price = 100.50
>>> price * tax
12.5625
>>> price + _
113.0625
>>> round(_, 2)
113.06
>>>

字符串与运算
单引号,双引号,三引号,
字符串分行,行末加\,
三引号与raw行:保留一切格式,行末不需加\。

字符串用+连接,用*循环,用[a:b]切出部分字符串。

字符串长度:len(str)。

Unicode字符串,引号前加u,可以用Unicode代码输入。

链表
类似数组,用中括号[]标记以逗号分隔的一系列值。
可以当做堆栈/队列使用。
链表方法:
append(x)
extend(x)
insert(i,x)
remove(x)
pop([i])
index(x)
count(x)
sort()
reverse()

filter(),返回调用函数后为true的元素;
map(),返回调用函数后的所有结果;
reduce(),调用前一次的处理结果作为下一次运算的函数参数。

链表推导式:[function(x) for x in linkList],将linkList中的每一个元素作为function的参数传入后,将返回结果输出。

元组(Tuples),序列(Sequences)
用小括号围住,以逗号分割。元组是不可改变的链表。
序列拆封:
>>> t = 12345,54321,'hello'
>>> x,y,z = t

字典(Dictionaries)
Hash表,用大括号围住,以逗号分隔,’key’:value对

循环

1
2
3
4
5
6
for key,value in dict.itmes():
   print k,v
for pos,value in enumerate(array):
   print pos,value
for valueA,valueB in zip(arrayA,arrayB):
   print valueA,valueB

流程控制

1
2
3
4
5
6
if a>b:
   print a
elif a==b:
   print a
else:
   pass

函数

1
2
3
4
5
6
def func(love,qmt="beauty")
   return love
 
func(love="yc")
 
func("yc")

赋值失败:缺少必要参数,关键字后面出现非关键字赋值,参数重复赋值,未知关键字

模块

1
2
3
4
5
6
7
import package # 引入package.py
package.test() # 调用package.py中的test函数
from package import * # 导入模块快定义中所有命名
test() # 调用了package.test()
dir(package) # 返回package中所有的定义
 
import package.pkg # 引入/package/pkg.py,package目录下比如有__init__.py

输入输出
格式化字符串,str()与repr()
格式化输出 print ‘%2d %3d %4d’ % (x,x*x,x*x*x)

文件读写

1
2
3
4
5
6
7
8
fp = open('filename','mode')
fp.read()
fp.readline()
fp.readlines()
fp.write(string)
fp.tell()
fp.seek()
fp.close()

数据类型的序量化:

1
2
pickle.dump(obj,fp)
obj = pickle.load(fp)

错误处理

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
class ImpossibleError(Exception): # 自定义错误类
   def __init__(self,value):
       self.value = value
   def __str__(self):
       return repr(self.value)
 
try:
   print "trying"
   raise ImpossibleError, 'nothing is impossible!' # 强制抛出异常
   break
except ImpossibleError: # except加类名,捕获异常
   print "that's impossible"
except: # 捕获所有异常
   print "that's impossible,too"
 
try:
   print "trying"
   raise ImpossibleError, 'nothing is impossible!'
   break
finally:
   print "the impossible thing will happen" # 无论try是否有异常都会被执行

1
2
3
4
5
6
7
8
9
10
11
12
13
class MyClass: # 定义一个类
   def __int__(self): # 构造函数
       pass
   def __iter__(self): # 迭代器
       return self
   def next(self):
       if self.index == 0:
           raise StopIteration
       self.index = self.index - 1
       return self.data[self.index]
class MyClass2rd(MyClass): # 继承
   def __int__(self): # 构造函数
       pass

python支持多继承

发生器看的不是很明白

结束
不是结束,而是开始

本文才有2条评论,狂点我发表意见

python调用本地程序

2008年10月8日 Script

有三种比较简单的方法,以调用notepad查看upload.log为例

1
2
3
os.system("notepad upload.log")
win32api.ShellExecute(0,"","notepad","upload.log",".",1)
WinExec("notepad upload.log", 1)

详细参见手册

本文还没有评论,赶快来抢沙发吧

恢复Ubuntu的root密码

2007年11月9日 UNIX/Linux

今天不小心用usermod命令将我的用户踢出了admin用户组,也就是说没法用sudo切换到root权限了。这时候才体会到了什么叫求生不得求死不能,所有系统文件都没法编辑,关机重启这样的操作也做不了。更别说把自己再加回admin用户组了……
google一下,可以通过更改grub引导的方法,强制开一个shell,问题是我的grub的引导时间为0,要改引导时间还得用root权限,faint…
翻箱倒柜找到一张ubuntu desktop的安装盘,进入live环境,将/boot/grub/grub.conf中的timeout字段改为1,保存后重启
然后通过这个帖子里面的方法,开一个shell,给root加密码。重启之后通过root登录系统,将perfectworks加入admin组,万事大吉:)

本文还没有评论,赶快来抢沙发吧

由strpos与in_array想到moond的是推还是拉

2007年7月30日 交互设计


PHP里面

strpos函数(PHP手册
第一个参数是被查找对象,第二个参数是查找对象

而in_array函数(PHP手册
第一个参数是查找对象,第二个参数是被查找对象

几乎每次都记反,每次都要查手册……

这个情况跟moond写的两篇文章(推还是拉,推还是拉(2) 习惯的延续性)里面描述的情况是一样的。

让我感到困惑的是,在这时我对UE产生了极大的怀疑。纵然PHP里着两个函数的设计绝对的与UCD的思想背道而驰,但我根本不可能因为这样的错误放弃php。当产品的优点越突出,性能越优越的时候,是不是UE的地位也就随之降低?换而言之,当用户的忍耐度提高的时候,用户体验也就不再那么重要?
阅读全文…

才有1条评论,快来向楼主拍砖

IE下Prototype的一个问题及解决方法

2007年7月27日 前端


今天刚刚发现这个问题

1
2
3
4
5
6
7
<body>
<div id="test"><div></div></div>
<script type="text/javascript">
var obj=$('test');
alert(obj.firsthChild.addClassName);
</script>
</body>

输出结果在FF中正常,IE中undefinded
这个问题直接导致了在IE中无法用

1
obj.addClassName("className");

来更改元素的class

问题的原因是phrototype使用了IE不支持的HTMLElement对象对页面中的元素进行扩展(Prototype, IE 的痛

解决方法是使用Element对象进行更改class操作

1
Element.addClassName(obj,"className");

本文还没有评论,赶快来抢沙发吧