星期四, 十一月 30, 2006

python ','.join([]).split(',') != []

python distutils MANIFEST.in recursive-include

$ cat MANIFEST.in
recursive-include scripts *
...

$ ls scripts
copy.config patches setup-blfs

如果 patches 为空目录,则不会加入 MANIFEST,当运行 python setup.py sdist 时也就不会打包到 dist 中。

星期三, 十一月 29, 2006

python Cmd file name auto completion

在 crablfs 中 cmdline[.py] 通过继承 cmd.Cmd 类来实现交互式命令行,但 cmdline 只能补全命令如 cm(cmd,cmt), li(list) 却不能补全需要操作的文件及其路径名,不如:
crablfs> cmd tar xfz mlter(m-2.9.3.tar.gz)

为解决这个问题,首先查看 cmd.py 的文档(www.python.org/doc)和源代码,可以看到,Cmd.cmdloop() 会通过 readline.set_completer() 设置为 Cmd.complete() 来完成自动补全。分析 Cmd.complete():
253     def complete(self, text, state):
254 """Return the next possible completion for 'text'.
255
256 If a command has not been entered, then complete against command list.
257 Otherwise try to call complete_ to get list of completions.
258 """
259 if state == 0:
260 import readline
261 origline = readline.get_line_buffer()
262 line = origline.lstrip()
263 stripped = len(origline) - len(line)
264 begidx = readline.get_begidx() - stripped
265 endidx = readline.get_endidx() - stripped
266 if begidx>0:
267 cmd, args, foo = self.parseline(line)
268 if cmd == '':
269 compfunc = self.completedefault
270 else:
271 try:
272 compfunc = getattr(self, 'complete_' + cmd)
273 except AttributeError:
274 compfunc = self.completedefault
275 else:
276 compfunc = self.completenames
277 self.completion_matches = compfunc(text, line, begidx, endidx)
278 try:
279 return self.completion_matches[state]
280 except IndexError:
281 return None

这里 text 是命令行上最后的那个参数(这应该是由 readline 自动得到的),例如'cm'就是'cm','cmd tar xfz mlter'则是'mlter'。state == 0 说明这个参数需要补全。

lstrip() 只去处头部的空格而,所以对"cmd tar xfz mlter"来说,stripped=0,
begidx = readline.get_begidx() - stripped
会计算出 mlter 的 m 所在的位置,这里是 12。

所以这时会调用自己设定的 completer:complete_$cmd 或 completedefault(当 complete_$cmd 没有编写时);如果 degidx 为 0,则会将 completenames 作为 completer,这个函数仅仅补全 Cmd 自己的命令。

因此,如果需要在 cmdline[.py] 的'cmd(command)', 'do'这些命令中使用文件名补全功能的话,需要编写一个相应的 completer(complete_$cmd),如下:
 78     def complete_command(self, text, line, begidx, endidx):
79 import readline
80 # import rlcompleter
81 # readline.parse_and_bind("tab: complete")
82 readline.set_completer_delims(' \t\n`~!@#$%^&*()-=+[{]}\\|;:\'",<>;?')
83 import glob
84 return glob.glob('%s*' % text)
85 complete_cmd = complete_command
86 complete_do = complete_cmd
重新设置 completer_delims 是为了把'/'这个符号从中剔除,否则如果运行:
crablfs> cmd tar xfz /sour(ces)
则 text 会变成 'sour' 而不是需要的 '/sour',因此是无法匹配的。

参考:
http://chinaunix.net/jh/55/614952.html'

python class inheritance overided method

$ cat inheritance_overided_method.py
#!/usr/bin/python
# -*- encoding: utf-8 -*-

"""inheritance_overided_method:
parent -- func() --> func1()
|
(inherit)
|
child -- func() --> Parent.func()

Then, which func1() will been called,
parent.func1() or child func1 or both?"""

class parent:
def func(self): self.func1()
def func1(self): print "parent.func1"

class child(parent):
# def func(self): parent.func()
def func(self): parent.func(self)
def func1(self): print "child.func1"

obj = child()
obj.func()
可以看到,parent.func1() 完全没有执行

星期二, 十一月 28, 2006

python module 'import' vs 'from import'

$ cat main.py
#!/usr/bin/python
# -*- encoding: utf-8 -*-

"""比较 import 和 from import 的区别
差异来自与 mutable 与否!"""

import module
from module import var, L
var += 1
L.append('d')
print var, module.var
print L, module.L
# var != module.var
# 但是 L == module.L

$ cat module.py
#!/usr/bin/python
var = 0
L = ['a', 'b', 'c']

python module global var

$ cat main.py
#!/usr/bin/python
import module
module.func()
module.func()

$ cat module.py
#!/usr/bin/python
VAR = 0
def func():
global VAR
VAR += 1
print 'module global VAR: %s' % VAR

$ python main.py
module global VAR: 1
module global VAR: 2

所以必须注意,如果改变了全局变量的值,程序可能会出问题,如果在一个模块内调用问题不大,但特别是作为其它模块调用时,很容易忽视这一点。

星期六, 十一月 25, 2006

LFS compile Xorg for i180(915GM) trouble shooting

这是安装 BLFS 的一部分,首先按照文档安装 Xorg-6.8.2,但是在编译时出错,出错信息如下:
fbmmx.c: In function 'negate':
fbmmx.c:107: error: incompatible type for argument 1
of '__builtin_ia32_pxor'
fbmmx.c:107: error: incompatible type for argument 2
of '__builtin_ia32_pxor'
fbmmx.c: In function 'expand_alpha':
fbmmx.c:166: error: incompatible type for argument 1
of '__builtin_ia32_por'
fbmmx.c:166: error: incompatible type for argument 2
of '__builtin_ia32_por'
fbmmx.c:166: error: incompatible types in assignment
fbmmx.c:168: error: incompatible type for argument 1
of '__builtin_ia32_por'
fbmmx.c:168: error: incompatible type for argument 2
of '__builtin_ia32_por'
fbmmx.c:168: error: incompatible types in assignment
fbmmx.c: In function 'expand_alpha_rev':
fbmmx.c:181: error: incompatible type for argument 1
of '__builtin_ia32_por'
fbmmx.c:181: error: incompatible type for argument 2
of '__builtin_ia32_por'
fbmmx.c:181: error: incompatible types in assignment
fbmmx.c:183: error: incompatible type for argument 1
of '__builtin_ia32_por'
fbmmx.c:183: error: incompatible type for argument 2
of '__builtin_ia32_por'
fbmmx.c:183: error: incompatible types in assignment
fbmmx.c: In function 'invert_colors':
fbmmx.c:195: error: incompatible type for argument 1
of '__builtin_ia32_pand'
fbmmx.c:195: error: incompatible type for argument 2
of '__builtin_ia32_pand'
fbmmx.c:195: error: incompatible types in assignment
fbmmx.c:196: error: incompatible type for argument 1
of '__builtin_ia32_pand'
fbmmx.c:196: error: incompatible type for argument 2
of '__builtin_ia32_pand'
fbmmx.c:196: error: incompatible types in assignment
fbmmx.c:197: error: incompatible type for argument 1
of '__builtin_ia32_pand'
fbmmx.c:197: error: incompatible type for argument 2
of '__builtin_ia32_pand'
fbmmx.c:197: error: incompatible types in assignment
fbmmx.c:202: error: incompatible type for argument 1
of '__builtin_ia32_por'
fbmmx.c:202: error: incompatible type for argument 2
of '__builtin_ia32_por'
fbmmx.c:202: error: incompatible types in assignment
fbmmx.c:203: error: incompatible type for argument 1
of '__builtin_ia32_por'
fbmmx.c:203: error: incompatible type for argument 2
of '__builtin_ia32_por'
fbmmx.c:203: error: incompatible types in assignment
fbmmx.c: In function 'over_rev_non_pre':
fbmmx.c:237: error: incompatible type for argument 1
of '__builtin_ia32_por'
fbmmx.c:237: error: incompatible type for argument 2
of '__builtin_ia32_por'
fbmmx.c: In function 'expand565':
fbmmx.c:300: warning: ISO C90 forbids mixed
declarations and code
fbmmx.c:303: error: incompatible type for argument 1
of '__builtin_ia32_por'
fbmmx.c:303: error: incompatible type for argument 2
of '__builtin_ia32_por'
fbmmx.c:303: error: incompatible types in assignment
fbmmx.c:304: error: incompatible type for argument 1
of '__builtin_ia32_por'
fbmmx.c:304: error: incompatible type for argument 2
of '__builtin_ia32_por'
fbmmx.c:304: error: incompatible types in assignment
fbmmx.c:305: error: incompatible type for argument 1
of '__builtin_ia32_pand'
fbmmx.c:305: error: incompatible type for argument 2
of '__builtin_ia32_pand'
fbmmx.c:305: error: incompatible types in assignment
fbmmx.c: In function 'pack565':
fbmmx.c:327: error: incompatible type for argument 1
of '__builtin_ia32_pand'
fbmmx.c:327: error: incompatible type for argument 2
of '__builtin_ia32_pand'
fbmmx.c:327: error: incompatible types in assignment
fbmmx.c:328: error: incompatible type for argument 1
of '__builtin_ia32_pand'
fbmmx.c:328: error: incompatible type for argument 2
of '__builtin_ia32_pand'
fbmmx.c:328: error: incompatible types in assignment
fbmmx.c:329: error: incompatible type for argument 1
of '__builtin_ia32_pand'
fbmmx.c:329: error: incompatible type for argument 2
of '__builtin_ia32_pand'
fbmmx.c:329: error: incompatible types in assignment
fbmmx.c:336: error: incompatible type for argument 1
of '__builtin_ia32_pand'
fbmmx.c:336: error: incompatible type for argument 2
of '__builtin_ia32_pand'
fbmmx.c:336: error: incompatible types in assignment
fbmmx.c:338: error: incompatible type for argument 1
of '__builtin_ia32_pand'
fbmmx.c:338: error: incompatible type for argument 2
of '__builtin_ia32_pand'
fbmmx.c:338: error: incompatible types in assignment
fbmmx.c:340: error: incompatible type for argument 1
of '__builtin_ia32_pand'
fbmmx.c:340: error: incompatible type for argument 2
of '__builtin_ia32_pand'
fbmmx.c:340: error: incompatible types in assignment
fbmmx.c:342: error: incompatible type for argument 1
of '__builtin_ia32_pand'
fbmmx.c:342: error: incompatible type for argument 2
of '__builtin_ia32_pand'
fbmmx.c:342: error: incompatible types in assignment
fbmmx.c:344: error: incompatible type for argument 1
of '__builtin_ia32_por'
fbmmx.c:344: error: incompatible type for argument 2
of '__builtin_ia32_por'
fbmmx.c:344: error: incompatible types in assignment
fbmmx.c:345: error: incompatible type for argument 1
of '__builtin_ia32_por'
fbmmx.c:345: error: incompatible type for argument 2
of '__builtin_ia32_por'
fbmmx.c:345: error: incompatible types in assignment
fbmmx.c:347: error: incompatible type for argument 1
of '__builtin_ia32_por'
fbmmx.c:347: error: incompatible type for argument 2
of '__builtin_ia32_por'
fbmmx.c: In function
'fbCompositeSolidMask_nx8x8888mmx':
fbmmx.c:652: warning: ISO C90 does not support 'long
long'
fbmmx.c:695: warning: ISO C90 does not support 'long
long'
fbmmx.c: In function
'fbCompositeSolidMask_nx8x0565mmx':
fbmmx.c:758: warning: ISO C90 does not support 'long
long'
fbmmx.c:818: warning: ISO C90 does not support 'long
long'
make[5]: *** [fbmmx.o] Error 1
make[5]: Leaving directory
`/usr/src/Xorg/xc/programs/Xserver/fb'
make[4]: *** [fb] Error 2
make[4]: Leaving directory
`/usr/src/Xorg/xc/programs/Xserver'
make[3]: *** [all] Error 2
make[3]: Leaving directory
`/usr/src/Xorg/xc/programs'
make[2]: *** [all] Error 2
make[2]: Leaving directory `/usr/src/Xorg/xc'
make[1]: *** [World] Error 2
make[1]: Leaving directory `/usr/src/Xorg/xc'
make: *** [World] Error 2
这里:
http://linuxfromscratch.org/pipermail/blfs-support/2006-August/060856.html
http://linuxfromscratch.org/pipermail/blfs-support/2006-August/060858.html
提供了解决方法,就是使用 Xorg-6.9.0。

于是编译安装 Xorg-6.9.0 成功,但是安装安装提示运行:
# Xorg -configure
时出错:
Fatal server error:
Cannot open log file "/var/log/Xorg.0.log"

Please consult the The X.Org Foundation support
at http://wiki.X.Org
for help.
/var/log 的权限是没有问题的,问题出在 /usr/X11R6/bin/Xorg 上,因为是基于用户的包管理,所以其属主是 Xorg,但 X 需要 root+suid,所以运行时属主变成了 Xorg,当然没有权限写 /var/log/

于是更改 Xorg 属主:
# chown root /usr/X11R6/bin/Xorg
# chmod u+s /usr/X11R6/bin/Xorg

再次运行,得到如下的错误:
(II) LoadModule: "apm"
(II) Loading /usr/X11R6/lib/modules/drivers/apm_drv.so
dlopen: /usr/X11R6/lib/modules/drivers/apm_drv.so: undefined symbol: XvRTPort
(EE) Failed to load /usr/X11R6/lib/modules/drivers/apm_drv.so
(II) UnloadModule: "apm"
(EE) Failed to load module "apm" (loader failed, 7)
使用 X -config /root/xorg.conf.new 则黑屏,键盘无反应,只能关机。

如果仅从上面的提示来提示来看,则会步入误区,因为实际上 apm 模块并没有实质性的影响,它是电源管理的一部分:
Xorg wiki FAQ

正确的做法是,耐心查看由于运行 startx(Xorg -config ~/xorg.conf.new) 而产生的 /var/log/Xorg.0.log,查找其中所有"error","failed"等可能会是一个比较快捷的方式。因为问题很可能是出在芯片组的驱动上。

log 的内容比较多,但是其中可以看到如下几行:
drmOpenDevice: Open failed
[drm] failed to load kernel module "i915"
(II) I810(0): [drm] drmOpen failed
(EE) I810(0): [dri] DRIScreenInit failed. Disabling DRI.
...
Fatal server error:
Caught signal 11. Server aborting

提示找不到内核的 i915 模块,虽然 /lib/modules 中实际上是有这个模块的。因为之前的内核是我直接从主系统拷贝过去的,包括 initrd-$kernel.img 和 /lib/modules/$kernel 以及 /etc/modprobe.conf,所以问题可能就出在这里。

于是重新编译内核。注意在主系统下用 chroot 来进行编译和启动到 LFS 系统下进行编译可能会有差异,我两次都试过,用 md5sum 校验发现不同。建议启动到 LFS 系统进行编译。可能 Xorg 也需要重新编译,移除原来的 /usr/X11R6/bin/Xorg,运行:
# userpack install -a Xorg-6.9.0
即可。

编译内核时,LFS 没有 initrd,所以一些重要模块如 ext3, jbd, scsi 等需要编译到内核中,我写在了这里:
LFS kernel compling

这次启动 X 没有彻底黑屏,键盘还有响应,也可以按 3 键(CTRL+ALT+DEL)重启,但总的来说还是没有成功。有如下报错:
# Xorg -configure
dlopen: /usr/X11R6/lib/modules/drivers/apm_drv.so: undefined symbol: XvRTPort
(EE) Failed to load /usr/X11R6/lib/modules/drivers/apm_drv.so
(EE) Failed to load module "apm" (loader failed, 7)
(++) Using config file: "/root/xorg.conf.new"
(WW) I810: No matching Device section for instance (BusID PCI:0:2:1) found
(WW) ****INVALID MEM ALLOCATION**** b: 0xffe80000 e: 0xffefffff correcting^G
(WW) ****INVALID MEM ALLOCATION**** b: 0xffe40000 e: 0xffe7ffff correcting^G


Xorg detected your mouse at device /dev/mouse.
Please check your config if the mouse is still not
operational, as by default Xorg tries to autodetect
the protocol.

Your xorg.conf file is /root/xorg.conf.new

To test the server, run 'X -config /root/xorg.conf.new'

# X -config ~/xorg.conf.new
...
drmOpenDevice: node name is /dev/dri/card0
drmOpenDevice: open result is -1, (No such device or address)
drmOpenDevice: open result is -1, (No such device or address)
drmOpenDevice: Open failed
drmOpenDevice: node name is /dev/dri/card0
drmOpenDevice: open result is -1, (No such device or address)
drmOpenDevice: open result is -1, (No such device or address)
drmOpenDevice: Open failed
drmOpenByBusid: Searching for BusID pci:0000:00:02.0
drmOpenDevice: node name is /dev/dri/card0
drmOpenDevice: open result is 11, (OK)
drmOpenByBusid: drmOpenMinor returns 11
drmOpenByBusid: drmGetBusid reports pci:0000:00:02.0
...
(WW) I810(0): Extended BIOS function 0x5f05 failed.
...
Fatal server error:
Caught signal 11. Server aborting

"(WW) I810: No matching Device section for instance (BusID PCI:0:2:1) found"这个错误并没有什么关系,可以看这里:
Xorg wiki FAQ
用 lspci 可以看到这一点:
00:00.0 Host bridge: Intel Corporation Mobile 915GM/PM/GMS/910GML Express Processor to DRAM Controller (rev 04)
00:02.0 VGA compatible controller: Intel Corporation Mobile 915GM/GMS/910GML Express Graphics Controller (rev 04)
00:02.1 Display controller: Intel Corporation Mobile 915GM/GMS/910GML Express Graphics Controller (rev 04)
所以虽然 0:2:1 找不到,但 0:2:0 可以,如果真的找不到,一般会报告"No screen found"的错误。

只能换一种思路。现尝试编辑配置文件,将 i810 换成 vesa 试试:
# vi /etc/X11/xorg.conf
Section"Device"
Identifier "Card0"
Driver "vesa"
# Driver "i810"
VendorName "Intel Corporation"
BoardName "Mobile 915GM/GMS/910GML Express Graphics Controller"
BusID "PCI:0:2:0"
EndSection
这时候是可以启动 X 的,但只能以 root 身份运行,并且不能解决宽屏问题(915resolution)。

再尝试通过运行 xorgconfig 来获得一个配置文件(先将原来的文件备份),将其 Driver 改成 i810,在运行 915resolution 49 1280 768 之后,startx 竟然可以看到正确的长宽比,但之后就基本上没有什么响应了,twm 的窗口无法正常显示,点击鼠标只显示一些绿色的条纹。

我开始估计是窗口管理器的问题,于是接着安装其他的包,直到将 xfce4 安装之后,再进入 startx,这次可以看到正确的显示了,包括上下两个 panel,但是机器却好像越来越慢,点出来的菜单无法再隐藏,直至最后失去响应。

再使用 vesa 模块,基本上可以,但仍然不能以普通用户身份运行 startx。

所以现在是两个问题:
(1) i810 driver 或 vesa 1280x768
(2) normal user startx 的问题


(1)的 Xorg.0.log:
Could not init font path element /usr/X11R6/lib/X11/fonts/CID/, removing from list!
Could not init font path element /usr/X11R6/lib/X11/fonts/local/, removing from list!
ADVANCE_LP_RING: outring (0x27) isn't on a QWord boundary(WW) I810(0): Fixing display offsets.
ADVANCE_LP_RING: outring (0x2f) isn't on a QWord boundary(WW) I810(0): Fixing display offsets.
ADVANCE_LP_RING: outring (0x37) isn't on a QWord boundaryADVANCE_LP_RING: outring (0x3f) isn't on a QWord boundaryADVANCE_LP_RING: outring
(0x57) isn't on a QWord boundaryADVANCE_LP_RING: outring (0x5f) isn't on a QWord boundary(WW) I810(0): Fixing display offsets.
ADVANCE_LP_RING: outring (0x67) isn't on a QWord boundaryADVANCE_LP_RING: outring (0x87) isn't on a QWord boundaryADVANCE_LP_RING: outring
(0x8f) isn't on a QWord boundaryADVANCE_LP_RING: outring (0xaf) isn't on a QWord boundaryADVANCE_LP_RING: outring (0xb7) isn't on a QWord
boundaryADVANCE_LP_RING: outring (0xcf) isn't on a QWord boundaryADVANCE_LP_RING: outring (0xe7) isn't on a QWord boundaryADVANCE_LP_RING
: outring (0xff) isn't on a QWord boundaryADVANCE_LP_RING: outring (0x117) isn't on a QWord boundaryADVANCE_LP_RING: outring (0x12f) isn't
on a QWord boundaryADVANCE_LP_RING: outring (0x147) isn't on a QWord boundaryADVANCE_LP_RING: outring (0x15f) isn't on a QWord boundaryAD
VANCE_LP_RING: outring (0x177) isn't on a QWord boundaryADVANCE_LP_RING: outring (0x18f) isn't on a QWord boundaryADVANCE_LP_RING: outring
(0x1a7) isn't on a QWord boundaryADVANCE_LP_RING: outring (0x1bf) isn't on a QWord boundaryADVANCE_LP_RING: outring (0x1d7) isn't on a QW
ord boundaryADVANCE_LP_RING: outring (0x1ef) isn't on a QWord boundaryADVANCE_LP_RING: outring (0x207) isn't on a QWord boundaryADVANCE_LP
_RING: outring (0x21f) isn't on a QWord boundaryADVANCE_LP_RING: outring (0x237) isn't on a QWord boundaryADVANCE_LP_RING: outring (0x24f)
isn't on a QWord boundaryADVANCE_LP_RING: outring (0x267) isn't on a QWord boundaryADVANCE_LP_RING: outring (0x27f) isn't on a QWord boun
daryADVANCE_LP_RING: outring (0x297) isn't on a QWord boundaryADVANCE_LP_RING: outring (0x2af) isn't on a QWord boundaryADVANCE_LP_RING: o
utring (0x2c7) isn't on a QWord boundaryADVANCE_LP_RING: outring (0x2df) isn't on a QWord boundaryADVANCE_LP_RING: outring (0x2f7) isn't o
n a QWord boundaryADVANCE_LP_RING: outring (0x30f) isn't on a QWord boundaryADVANCE_LP_RING: outring (0x327) isn't on a QWord boundaryADVA
NCE_LP_RING: outring (0x33f) isn't on a QWord boundaryADVANCE_LP_RING: outring (0x357) isn't on a QWord boundaryADVANCE_LP_RING: outring (
0x36f) isn't on a QWord boundaryADVANCE_LP_RING: outring (0x387) isn't on a QWord boundaryADVANCE_LP_RING: outring (0x39f) isn't on a QWor
d boundaryADVANCE_LP_RING: outring (0x3b7) isn't on a QWord boundaryADVANCE_LP_RING: outring (0x3cf) isn't on a QWord boundaryADVANCE_LP_R
ING: outring (0x3e7) isn't on a QWord boundaryADVANCE_LP_RING: outring (0x3ff) isn't on a QWord boundaryADVANCE_LP_RING: outring (0x417) i
sn't on a QWord boundaryADVANCE_LP_RING: outring (0x42f) isn't on a QWord boundaryADVANCE_LP_RING: outring (0x447) isn't on a QWord bounda
ryADVANCE_LP_RING: outring (0x45f) isn't on a QWord boundaryADVANCE_LP_RING: outring (0x467) isn't on a QWord boundary(WW) I810(0): Fixing
display offsets.
ADVANCE_LP_RING: outring (0x46f) isn't on a QWord boundary(WW) I810(0): Fixing display offsets.
ADVANCE_LP_RING: outring (0x477) isn't on a QWord boundary(WW) I810(0): Fixing display offsets.
ADVANCE_LP_RING: outring (0x47f) isn't on a QWord boundary(WW) I810(0): Fixing display offsets.
ADVANCE_LP_RING: outring (0x487) isn't on a QWord boundary(WW) I810(0): Fixing display offsets.
ADVANCE_LP_RING: outring (0x48f) isn't on a QWord boundary(WW) I810(0): Fixing display offsets.
ADVANCE_LP_RING: outring (0x497) isn't on a QWord boundary(WW) I810(0): Fixing display offsets.
ADVANCE_LP_RING: outring (0x49f) isn't on a QWord boundary(WW) I810(0): Fixing display offsets.
ADVANCE_LP_RING: outring (0x4a7) isn't on a QWord boundary(WW) I810(0): Fixing display offsets.
ADVANCE_LP_RING: outring (0x4af) isn't on a QWord boundary(WW) I810(0): Fixing display offsets.
ADVANCE_LP_RING: outring (0x4b7) isn't on a QWord boundaryADVANCE_LP_RING: outring (0x7) isn't on a QWord boundary


(2)的 Xorg.0.log:
(==) VESA(0): Write-combining range (0xd0fa0000,0x10000)
(==) VESA(0): Write-combining range (0xd0f80000,0x30000)
(==) VESA(0): Write-combining range (0xd0f00000,0xb0000)
(==) VESA(0): Write-combining range (0xd0e00000,0x1b0000)
(==) VESA(0): Write-combining range (0xd0c00000,0x3b0000)
(==) VESA(0): Write-combining range (0xd0800000,0x7b0000)
(WW) VESA(0): Failed to set up write-combining range (0xd0000000,0xfb0000)
(II) VESA(0): virtual address = 0xb6c2b000,
physical address = 0xd0000000, size = 16449536
...
Could not init font path element /usr/X11R6/lib/X11/fonts/CID/, removing from list!
Could not init font path element /usr/X11R6/lib/X11/fonts/local/, removing from list!
FreeFontPath: FPE "/usr/X11R6/lib/X11/fonts/misc/" refcount is 2, should be 1; fixing.


(2)的解决
首先推测是不是程序权限的问题,就像前面出现过的,因为使用的是基于用户的包管理。于是运行:
# userpack files Xorg-6.9.0 >/usr/src/xorg.files
# cat !$ | xargs chown root.root
# chmod u+s /usr/X11R6/bin/Xorg
然后以普通用户登录运行 startx,出现一样的问题,所以不是这个原因,改回权限:
# cat /usr/src/xorg.file | xargs chown Xorg.Xorg
# chmod u+s /usr/X11R6/bin/Xorg

这是注意到一个问题,LFS 没有给这个普通用户创建 $HOME 目录,是否会是这个原因?创建 HOME 目录,将 /root/.xinitrc 拷贝到 ~,在运行 startx。OK。

(1)的解决
始终没有成功的配置好 i810 driver,于是只好用 vesa driver:
# gtf 1280x768 60
1280x768 @ 60.00 Hz (GTF) hsync: 47.70 kHz; pclk: 80.14 MHz
Modeline "1280x768_60.00" 80.14 1280 1344 1480 1680 768 769 772 795 -HSync +Vsync
然后复制这一行到 /etc/X11/xorg.conf 的 Monitor 段(一说要将"1280x768_60.00"改为"1280x768"),编辑 Screen 段的 Modes 为 "1280x768"。

然后运行 915resulotion:
# 915resolution 49 1280 768
之后 startx。

配置文件如下(主体是由 xorgconfig 产生的,做了一些修改:
# cat /etc/X11/xorg.conf
# File generated by xorgconfig.

#
# Copyright 2004 The X.Org Foundation
#
# Permission is hereby granted, free of charge, to any person obtaining a
# copy of this software and associated documentation files (the "Software"),
# to deal in the Software without restriction, including without limitation
# the rights to use, copy, modify, merge, publish, distribute, sublicense,
# and/or sell copies of the Software, and to permit persons to whom the
# Software is furnished to do so, subject to the following conditions:
#
# The above copyright notice and this permission notice shall be included in
# all copies or substantial portions of the Software.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
# The X.Org Foundation BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
# WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF
# OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
# SOFTWARE.
#
# Except as contained in this notice, the name of The X.Org Foundation shall
# not be used in advertising or otherwise to promote the sale, use or other
# dealings in this Software without prior written authorization from
# The X.Org Foundation.
#

# **********************************************************************
# Refer to the xorg.conf(5x) man page for details about the format of
# this file.
# **********************************************************************

# **********************************************************************
# Module section -- this section is used to specify
# which dynamically loadable modules to load.
# **********************************************************************
#
Section "Module"

# This loads the DBE extension module.

Load "dbe" # Double buffer extension

# This loads the miscellaneous extensions module, and disables
# initialisation of the XFree86-DGA extension within that module.
SubSection "extmod"
Option "omit xfree86-dga" # don't initialise the DGA extension
EndSubSection

# This loads the font modules
Load "type1"
# Load "speedo"
Load "freetype"
# Load "xtt"

# This loads the GLX module
# Load "glx"
# This loads the DRI module
# Load "dri"

# Load "bitmap"
# Load "ddc"
# Load "i2c"
# Load "int10"
# Load "vbe"
# Load "record"

EndSection

# **********************************************************************
# Files section. This allows default font and rgb paths to be set
# **********************************************************************

Section "Files"

# The location of the RGB database. Note, this is the name of the
# file minus the extension (like ".txt" or ".db"). There is normally
# no need to change the default.

RgbPath "/usr/X11R6/lib/X11/rgb"

# Multiple FontPath entries are allowed (which are concatenated together),
# as well as specifying multiple comma-separated entries in one FontPath
# command (or a combination of both methods)
#
#

FontPath "/usr/X11R6/lib/X11/fonts/misc/"
FontPath "/usr/X11R6/lib/X11/fonts/TTF/"
FontPath "/usr/X11R6/lib/X11/fonts/Type1/"
FontPath "/usr/X11R6/lib/X11/fonts/CID/"
FontPath "/usr/X11R6/lib/X11/fonts/75dpi/"
FontPath "/usr/X11R6/lib/X11/fonts/100dpi/"
FontPath "/usr/X11R6/lib/X11/fonts/local/"
# FontPath "/usr/X11R6/lib/X11/fonts/Speedo/"
# FontPath "/usr/X11R6/lib/X11/fonts/TrueType/"
# FontPath "/usr/X11R6/lib/X11/fonts/freefont/"

# The module search path. The default path is shown here.

# ModulePath "/usr/X11R6/lib/modules"

EndSection

# **********************************************************************
# Server flags section.
# **********************************************************************

Section "ServerFlags"

# Uncomment this to cause a core dump at the spot where a signal is
# received. This may leave the console in an unusable state, but may
# provide a better stack trace in the core dump to aid in debugging

# Option "NoTrapSignals"

# Uncomment this to disable the VT switch sequence
# (where n is 1 through 12). This allows clients to receive these key
# events.

# Option "DontVTSwitch"

# Uncomment this to disable the server abort sequence
# This allows clients to receive this key event.

# Option "DontZap"

# Uncomment this to disable the / mode switching
# sequences. This allows clients to receive these key events.

# Option "Dont Zoom"

# Uncomment this to disable tuning with the xvidtune client. With
# it the client can still run and fetch card and monitor attributes,
# but it will not be allowed to change them. If it tries it will
# receive a protocol error.

# Option "DisableVidModeExtension"

# Uncomment this to enable the use of a non-local xvidtune client.

# Option "AllowNonLocalXvidtune"

# Uncomment this to disable dynamically modifying the input device
# (mouse and keyboard) settings.

# Option "DisableModInDev"

# Uncomment this to enable the use of a non-local client to
# change the keyboard or mouse settings (currently only xset).

# Option "AllowNonLocalModInDev"

EndSection

# **********************************************************************
# Input devices
# **********************************************************************

# **********************************************************************
# Core keyboard's InputDevice section
# **********************************************************************

Section "InputDevice"

Identifier "Keyboard1"
Driver "kbd"

# For most OSs the protocol can be omitted (it defaults to "Standard").
# When using XQUEUE (only for SVR3 and SVR4, but not Solaris),
# uncomment the following line.

# Option "Protocol" "Xqueue"

Option "AutoRepeat" "500 30"

# Specify which keyboard LEDs can be user-controlled (eg, with xset(1))
# Option "Xleds" "1 2 3"

# Option "LeftAlt" "Meta"
# Option "RightAlt" "ModeShift"

# To customise the XKB settings to suit your keyboard, modify the
# lines below (which are the defaults). For example, for a non-U.S.
# keyboard, you will probably want to use:
# Option "XkbModel" "pc105"
# If you have a US Microsoft Natural keyboard, you can use:
# Option "XkbModel" "microsoft"
#
# Then to change the language, change the Layout setting.
# For example, a german layout can be obtained with:
# Option "XkbLayout" "de"
# or:
# Option "XkbLayout" "de"
# Option "XkbVariant" "nodeadkeys"
#
# If you'd like to switch the positions of your capslock and
# control keys, use:
# Option "XkbOptions" "ctrl:swapcaps"

# These are the default XKB settings for Xorg
# Option "XkbRules" "xorg"
# Option "XkbModel" "pc105"
# Option "XkbLayout" "us"
# Option "XkbVariant" ""
# Option "XkbOptions" ""

# Option "XkbDisable"

Option "XkbRules" "xorg"
Option "XkbModel" "pc105"
Option "XkbLayout" "us"

EndSection


# **********************************************************************
# Core Pointer's InputDevice section
# **********************************************************************

Section "InputDevice"

# Identifier and driver

Identifier "Mouse1"
Driver "mouse"
Option "Protocol" "Auto" # Auto detect
Option "Device" "/dev/mouse"

# When using XQUEUE, comment out the above two lines, and uncomment
# the following line.

# Option "Protocol" "Xqueue"

# Mouse-speed setting for PS/2 mouse.

# Option "Resolution" "256"

# Baudrate and SampleRate are only for some Logitech mice. In
# almost every case these lines should be omitted.

# Option "BaudRate" "9600"
# Option "SampleRate" "150"

# Mouse wheel mapping. Default is to map vertical wheel to buttons 4 & 5,
# horizontal wheel to buttons 6 & 7. Change if your mouse has more than
# 3 buttons and you need to map the wheel to different button ids to avoid
# conflicts.

Option "ZAxisMapping" "4 5 6 7"

# Emulate3Buttons is an option for 2-button mice
# Emulate3Timeout is the timeout in milliseconds (default is 50ms)

Option "Emulate3Buttons"
# Option "Emulate3Timeout" "50"

# ChordMiddle is an option for some 3-button Logitech mice

# Option "ChordMiddle"

EndSection

Section "InputDevice"
Identifier "Synaptics"
Driver "synaptics"
Option "Device" "/dev/input/mice"
Option "Protocol" "auto-dev"
Option "Emulate3Buttons" "yes"
EndSection


# **********************************************************************
# Other input device sections
# this is optional and is required only if you
# are using extended input devices. This is for example only. Refer
# to the xorg.conf man page for a description of the options.
# **********************************************************************
#
# Section "InputDevice"
# Identifier "Mouse2"
# Driver "mouse"
# Option "Protocol" "MouseMan"
# Option "Device" "/dev/mouse2"
# EndSection
#
# Section "InputDevice"
# Identifier "spaceball"
# Driver "magellan"
# Option "Device" "/dev/cua0"
# EndSection
#
# Section "InputDevice"
# Identifier "spaceball2"
# Driver "spaceorb"
# Option "Device" "/dev/cua0"
# EndSection
#
# Section "InputDevice"
# Identifier "touchscreen0"
# Driver "microtouch"
# Option "Device" "/dev/ttyS0"
# Option "MinX" "1412"
# Option "MaxX" "15184"
# Option "MinY" "15372"
# Option "MaxY" "1230"
# Option "ScreenNumber" "0"
# Option "ReportingMode" "Scaled"
# Option "ButtonNumber" "1"
# Option "SendCoreEvents"
# EndSection
#
# Section "InputDevice"
# Identifier "touchscreen1"
# Driver "elo2300"
# Option "Device" "/dev/ttyS0"
# Option "MinX" "231"
# Option "MaxX" "3868"
# Option "MinY" "3858"
# Option "MaxY" "272"
# Option "ScreenNumber" "0"
# Option "ReportingMode" "Scaled"
# Option "ButtonThreshold" "17"
# Option "ButtonNumber" "1"
# Option "SendCoreEvents"
# E

# **********************************************************************
# Monitor section
# **********************************************************************

# Any number of monitor sections may be present

Section "Monitor"
Identifier "Monitor0"

# HorizSync is in kHz unless units are specified.
# HorizSync may be a comma separated list of discrete values, or a
# comma separated list of ranges of values.
# NOTE: THE VALUES HERE ARE EXAMPLES ONLY. REFER TO YOUR MONITOR'S
# USER MANUAL FOR THE CORRECT NUMBERS.

### HorizSync 31.5 - 48.5

# HorizSync 30-64 # multisync
# HorizSync 31.5, 35.2 # multiple fixed sync frequencies
# HorizSync 15-25, 30-50 # multiple ranges of sync frequencies

# VertRefresh is in Hz unless units are specified.
# VertRefresh may be a comma separated
# comma separated list of ranges of values.
# NOTE: THE VALUES HERE ARE EXAMPLES ONLY. REFER TO YOUR MONITOR'S
# USER MANUAL FOR THE CORRECT NUMBERS.

### VertRefresh 50-90

# 1280x768 @ 60.00 Hz (GTF) hsync: 47.70 kHz; pclk: 80.14 MHz
### Modeline "1280x768_60.00" 80.14 1280 1344 1480 1680 768 769 772 795 -HSync +Vsync
Modeline "1280x768" 80.14 1280 1344 1480 1680 768 769 772 795 -HSync +Vsync

EndSection


# **********************************************************************
# Graphics device section
# **********************************************************************

# Any number of graphics device sections may be present

# Standard VGA Device:

Section "Device"
Identifier "Standard VGA"
VendorName "Unknown"
BoardName "Unknown"

# The chipset line is optional in most cases. It can be used to override
# the driver's chipset detection, and should not normally be specified.

# Chipset "generic"

# The Driver line must be present. When using run-time loadable driver
# modules, this line instructs the server to load the specified driver
# module. Even when not using loadable driver modules, this line
# indicates which driver should interpret the information in this section.

Driver "vga"
# The BusID line is used to specify which of possibly multiple devices
# this section is intended for. When this line isn't present, a device
# section can only match up with the primary video device. For PCI
# devices a line like the following could be used. This line should not
# normally be included unless there is more than one video device
# intalled.

# BusID "PCI:0:10:0"

# VideoRam 256

# Clocks 25.2 28.3

EndSection

# Device configured by xorgconfig:

Section "Device"
Identifier "Card0"
# Driver "vga"
Driver "vesa"
# unsupported card
#VideoRam 16384
# Insert Clocks lines here if appropriate
Option "HWCursor" "false"
EndSection


# **********************************************************************
# Screen sections
# **********************************************************************

# Any number of screen sections may be present. Each describes
# the configuration of a single screen. A single specific screen section
# may be specified from the X server command line with the "-screen"
# option.
Section "Screen"
Identifier "Screen 1"
Device "Card0"
Monitor "Monitor0"
DefaultDepth 24

Subsection "Display"
Depth 8
Modes "1280x768" "1280x1024" "1024x768" "800x600" "640x480"
ViewPort 0 0
EndSubsection
Subsection "Display"
Depth 16
Modes "1280x800" "1280x768" "1280x1024" "1024x768"
ViewPort 0 0
EndSubsection
Subsection "Display"
Depth 24
# Modes "1280x768" "1280x1024" "1024x768" "800x600" "640x480"
Modes "1280x768"
ViewPort 0 0
EndSubsection
EndSection

# **********************************************************************
# ServerLayout sections.
# **********************************************************************

# Any number of ServerLayout sections may be present. Each describes
# the way multiple screens are organised. A specific ServerLayout
# section may be specified from the X server command line with the
# "-layout" option. In the absence of this, the first section is used.
# When now ServerLayout section is present, the first Screen section
# is used alone.

Section "ServerLayout"

# The Identifier line must be present
Identifier "Simple Layout"

# Each Screen line specifies a Screen section name, and optionally
# the relative position of other screens. The four names after
# primary screen name are the screens to the top, bottom, left and right
# of the primary screen. In this example, screen 2 is located to the
# right of screen 1.

Screen 0 "Screen 1" 0 0

# Each InputDevice line specifies an InputDevice section name and
# optionally some options to specify the way the device is to be
# used. Those options include "CorePointer", "CoreKeyboard" and
# "SendCoreEvents".

InputDevice "Mouse1" "CorePointer"
InputDevice "Keyboard1" "CoreKeyboard"

EndSection

# Section "DRI"
# Mode 0666
# EndSection
很奇怪的事,开始就是不行,但后来突然可以了,在此之前只做过(2)的解决,不知道为什么。但至少保留这个可用的配置文件吧,应该是没什么问题了。

星期五, 十一月 24, 2006

为 cable modem 接入配置 LFS network dhcp client

...未完...

LFS 可用的 dhcp client 有两个:dhcp 和 dhcpcd,前者包括一个服务器,因为没有必要安装服务,所以我选择后者:
# cat usr/src/dhcpcd/.config
pkgname = "dhcpcd";
version = "1.3.22";
group = "dhcpcd";
user = "dhcpcd";
archive = "dhcpcd-1.3.22-pl4.tar.gz";
patch = "dhcpcd-1.3.22-pl4-fhs-1.patch";
command = "tar xfz dhcpcd-1.3.22-pl4.tar.gz";
command = "cd dhcpcd-1.3.22-pl4";
command = "patch -Np1 -i ../dhcpcd-1.3.22-pl4-fhs-1.patch";
command = "./configure --prefix="" --sysconfdir=/var/lib";
command = "make";
command = "make install";
command = "cd ..";
command = "rm -rf dhcpcd-1.3.22-p14";
time = "20061125 19:34:15 Sat";

然后安装 blfs-bootscripts-6.1 的 dhcpcd script:
# tar xfj blfs-bootscripts-6.1.tar.bz2
# cd blfs-bootscripts-6.1
# make install-service-dhcpcd
这会在 /etc/sysconfig/network-devices/services 下安装一个 dhcpcd 脚本。

然后移除 /etc/sysconfig/network-devices/ifconfig.eth0/ipv4,编写:
cat > /etc/sysconfig/network-devices/ifconfig.eth0/dhcpcd << "EOF"
ONBOOT="yes"
SERVICE="dhcpcd"
# DHCP_START="[insert appropriate start options here]"
# DHCP_STOP="-k [insert additional stop options here]"
DHCP_STOP="-k"

# Set PRINTIP="yes" to have the script print
# the DHCP assigned IP address
PRINTIP="yes"

# Set PRINTALL="yes" to print the DHCP assigned values for
# IP, SM, DG, and 1st NS. This requires PRINTIP="yes".
PRINTALL="no"
EOF

然后运行 /etc/rc.d/init.d/network restart。

其基本机制是,/etc/rc.d/init.d/network 脚本会首先查找 /etc/sysconfig/network-devices/ifconfig.*,针对每个接口运行 /etc/sysconfig/network-devices/ifup,而这个脚本又会查找所有的配置文件逐一启用,例如 ifconfig.eth0,则会查看 ifconfig.eth0/*,所以如果有 ipv4 和 dhcpcd 则都会运行,所以前面移除 ipv4。对 dhcpcd,则会检查 ONBOOT 和 SERVICE 等参数,对 SERVICE="dhcpcd",则会寻找 /etc/sysconfig/network-devices/services/dhcpcd 以运行之。

gpm protocol

...未完...

# ls /dev/mouse -l
/dev/mouse -> input/mice
# gpm -m /dev/mouse -t help
查看所有的 protocol。

在主系统中查看 protocol:
# ps aux | grep gpm | cut -b 66-
gpm -m /dev/input/mice -t exps2

text web browser: w3m

text web browsers 有 lynx, links, elinks 和 w3m 等,但 lynx 比较晦涩,links 和 elinks 对中文的支持都不太好,所以使用 w3m。
首先要安装 gc(A garbage collector for C and C++)。以下是 userpack 的安装配置文件(profile):
# cat /usr/src/gc/.config
pkgname = "gc";
version = "6.8";
group = "gc";
user = "gc";
archive = "gc6.8.tar.gz";
command = "tar xfz gc6.8.tar.gz";
command = "cd gc6.8";
command = "./configure --prefix=/usr";
command = "make";
command = "make install";
command = "cd ..";
command = "rm -rf gc6.8";
time = "20061124 19:54:26 Fri";
这里使用 --prefix=/usr 可以避免装入 /usr/local/lib,否则下面安装 w3m 时,configure 会有问题。

然后安装 w3m。相关 profile 如下:
# cat /usr/src/w3m/.config
pkgname = "w3m";
version = "0.5.1";
group = "w3m";
user = "w3m";
archive = "w3m-0.5.1.tar.gz";
command = "tar xfz w3m-0.5.1.tar.gz";
command = "cd w3m-0.5.1";
command = "./configure --prefix=/usr --libexecdir=/usr/lib --sysconfdir=/etc";
command = "sed -i '/MAN1_JA/d' Makefile";
command = "make";
command = "make install";
command = "install -v -D -m 644 doc/keymap.default /etc/w3m/keymap";
command = "install -v -D -m 644 doc/menu.default /etc/w3m/menu";
command = "install -v -d -m 755 /usr/share/doc/w3m-0.5.1/html";
command = "install -v -m 644 doc/{HISTORY,README*,keymap.*,menu.*} /usr/share/doc/w3m-0.5.1";
command = "install -v -m 644 doc/*.html /usr/share/doc/w3m-0.5.1/html";
command = "cd ..";
command = "rm -rf w3m-0.5.1";
time = "20061125 06:15:34 Sat";
如果 gc 没有安装到 /usr,则 make 可以使用参数 LDFLAGS=/usr/local/lib。

sed -i '/MAN1_JA/d' Makefile
当使用 userpack 进行安装时,用上面这个命令阻止 w3m 安装日文的 man 手册,因为我没有将 /usr/man/$locale 加入到 /etc/userpack.dirs。如果要加入,应该使用这个命令:
# find /usr/man -type d -maxdepth 2 >>/etc/userpack.dirs

星期四, 十一月 23, 2006

sourceForge file release system

sourceforge file release system

在最下面选择"Add Release"来上传新的版本的文件。在编辑 Note 和 ChangeLog 之后(可直接上传文本),需要先通过 ftp 将上传的包及其相关文件上传到:
ftp://upload.sourceforge.net/incoming
中,然后在页面上 refresh 就可以看到需要的文件,选中后点击"upload"即可。

LFS kernel compling

之前构建 LFS 时直接使用了老系统的内核,将 vmlinuz 和 initrd.img 直接拷贝过去再编辑 grub.conf 的,系统可以启动。

但现在编译 Xorg-6.9.0 却有问题,在日志中有如下信息:
drmOpenDevice: node name is /dev/dri/card0
drmOpenDevice: open result is -1, (No such device or address)
drmOpenDevice: open result is -1, (No such device or address)
drmOpenDevice: Open failed
drmOpenDevice: node name is /dev/dri/card0
drmOpenDevice: open result is -1, (No such device or address)
drmOpenDevice: open result is -1, (No such device or address)
drmOpenDevice: Open failed
[drm] failed to load kernel module "i915"
(II) I810(0): [drm] drmOpen failed
(EE) I810(0): [dri] DRIScreenInit failed. Disabling DRI.

推测可能和内核有关,于是重新编译内核。将原理系统的 .config 文件拷贝过来。但 LFS 本身是没有 initrd 的,所以有几个模块必须编译到内核中才能保证系统可以启动。解档 initrd(initrd.img解档)后可以查看 lib 下的几个模块,这几个模块需要注意:
ahci.ko
ata_piix.ko
ext3.ko
jbd.ko
libata.ko
scsi_mod.ko
sd_mod.ko

在 make menuconfig 时将 SCSI disk support 和 ext3 file system 编译到内核中,但是 ahci.ko, ata_piix.ko 和 libata 不知道是哪个子选项,于是直接编辑 .config 文件:
# sed -i 's/CONFIG_SCSI_ATA_PIIX=m/CONFIG_SCSI_ATA_PIIX=y/' .config
# sed -i 's/CONFIG_SCSI_SATA=m/CONFIG_SCSI_SATA=y/' .config
# sed -i 's/CONFIG_SCSI_SATA_AHCI=m/CONFIG_SCSI_SATA_AHCI=y/' .config

星期三, 十一月 22, 2006

google homepage 添加待办事项来进行时间管理

可以进入"添加内容",搜索待办事项,或者直接加入如下 url:
http://www.google.com/ig/modules/todo.xml

我加了两个"todo list",一个"重要紧急"和一个"重要但不紧急",这样比较有计划。

initrd.img 解档

# cp /boot/initrd-$version.img /tmp
# cd /tmp
# cat initrd-$version.img | gunzip >initrdfs
# mkdir initrd
# cd initrd
# cpio -idv <../initrdfs

星期一, 十一月 20, 2006

svn simple tagging

$ svn copy file:///file/project/data/ea/crablfs/trunk file:///file/project/data/ea/crablfs/tags/v0.1.1alpha -m "tagging v0.1.1alpha"
Committed revision 59.
$ svn update

其中 $repos=/file/project/data/

星期日, 十一月 19, 2006

FC6 误删 /usr/lib/python2.4 之 rpm 恢复

Fedora Core 6 下调试 BLFS 时误删了 /usr/lib/python2.4,很多程序都不能跑了,可以如下方式恢复:

# cd
# mkdir pkg && cd pkg
# for pkg in `rpm -qa`; do echo $pkg; rpm -V $pkg >$pkg; done
// 校验所有的包
# for pkg in `du * | grep -v '^0' | awk '{print $2}'`; do echo "$pkg"; rpm -ivh /mnt/iso/Fedora/RPMS/$pkg.i386.rpm --force; done
// 如果记录非空,说明该包有问题,则重新安装之
// 有少数包是 noarch,手工安装一下即可

星期四, 十一月 16, 2006

jhalfs-1.0 LFS trouble shooting

参照:
http://chowroc.blogspot.com/2006/10/jhalfs-clfs.html
进行配置,注意这里是 LFS 而不是 CLFS。所以运行:
# ./lfs -B 6.2 -D /mnt/lfs -K ~lfs/skeleton/linux-kernel-config -F ~lfs/skeleton/etc/fstab -G -T 0 -M

但是编译 028-binutils-pass1 时出错,gcc 报告 /tools/bin/ld 的 --hash-style=gnu 无效:
gcc -W -Wall -Wstrict-prototypes -Wmissing-prototypes -g -O2 -o ld-new ldgram.o ldlex.o lexsup.o ldlang.o mri.o ldctor.o ldmain.o ldwrite.o ldexp.o ldemul.o ldver.o ldmisc.o ldfile.o ldcref.o eelf_i386.o ei386linux.o ../bfd/.libs/libbfd.a ../libiberty/libiberty.a
/tools/bin/ld: unrecognized option '--hash-style=gnu'
/tools/bin/ld: use the --help option for usage information
collect2: ld returned 1 exit status
make[2]: *** [ld-new] Error 1
make[2]: Leaving directory `/mnt/lfs/sources/binutils-build/ld'
make[1]: *** [all-recursive] Error 1
make[1]: Leaving directory `/mnt/lfs/sources/binutils-build/ld'
make: *** [all-recursive-am] Error 2
make: Leaving directory `/mnt/lfs/sources/binutils-build/ld'

再次编译,configure 报告 compiler 不能 work,"can't create executables":
checking for gcc... gcc
checking whether the C compiler (gcc ) works... no
configure: error: installation or configuration problem: C compiler cannot create executables.

于是排错,发现 $LFS/jhalfs/lfs-commands/chapter04/022-addinguser 有 useradd 和 groupadd 命令,但之前已经创建了用户,所以肯定会出错,那么后面的:
chown -v lfs $LFS/tools
chown -v lfs $LFS/sources
两个命令就无法运行,权限检查的结果也是如此,$LFS/sources的属主没有被更改。

进一步,发现 $LFS/jhalfs/lfs-commands/chapter04/023-settingenvironment 没有产生实际的效果,在 ~lfs 下没有相应的 .bashrc 和 .bash_profile。显然,set +h 没有运行,所以这可能是导致报告 ld --hash-style=gnu 无法识别的原因吗?

于是手工添加了 ~lfs/.bashrc 和 ~/.bash_profile,再在 $LFS/jhalfs 下运行 make,但结果好像是整个进程挂起了,编译 binutils 一小时都没有结果,而手工编译却只要几分钟就结束了。查看进程树得到如下显示:
mlterm
\_ bash
\_ su -
\_ -bash
\_ make
\_ /bin/sh -c ( time { su - lfs -c "source /home/lfs/.bashrc && /mnt/lfs/jhalfs/lfs-commands/chapter05/028-binutils-pass1" >>logs/028-binutils-pass1 2>&1 ; } ) 2>>logs/028-binutils-pass1 && \?echo -e "\nKB: `du -skx --exclude=jhalfs /mnt/lfs`\n" >>logs/028-binutils-pass1
\_ /bin/sh -c ( time { su - lfs -c "source /home/lfs/.bashrc && /mnt/lfs/jhalfs/lfs-commands/chapter05/028-binutils-pass1" >>logs/028-binutils-pass1 2>&1 ; } ) 2>>logs/028-binutils-pass1 && \?echo -e "\nKB: `du -skx --exclude=jhalfs /mnt/lfs`\n" >>logs/028-binutils-pass1
\_ su - lfs -c source /home/lfs/.bashrc && /mnt/lfs/jhalfs/lfs-commands/chapter05/028-binutils-pass1
\_ /bin/bash
/bin/bash ./progress_bar.sh 028-binutils-pass1
\_ sleep .12
好像是启动了一个 /bin/bash 但没有调用任何命令。

目录树是用如下方法得到的:
$ echo "roc 15754 0.0 0.5 10588 1344 ? S 16:16 0:01" | wc
1 10 65
$ ps auxf | cut -b 65-
(当然也可以用 pstree)

这是在 Fedora Core 6 环境下构建的,之后尝试 jhalfs-1.0 CLFS i386 却可以通过 binutils-pass1 这一段;并且最后通过使用 lfs-livecd 完成了安装!

所以只能推测是版本或平台的问题,可能是 FC6 太新,gcc-4.1.1 于 binutils-2.16.1 不能正确匹配(livecd 是 gcc-4.0.3)的原因。

星期三, 十一月 15, 2006

tor google/blogspot 语言问题

当使用 tor 访问 google 及其 blogspot 时,由于是通过代理访问,locale 的设置会受到影响,结果显示出来的可能是各种语言,根本看不懂,有两种方法解决。

其一是在 url 之后加 ?hl=en(没有其他参数时)或 &hl=en(前面已经有其他参数),例如:
http://beta.blogger.com/home?hl=en
http://beta.blogger.com/posts.g?blogID=6363462607047579738&hl=en

其二是对 blogspot,可以现直接进入:
http://beta.blogger.com/language.g
选择英文,则以后的会话都会以英文显示。

参考:
http://wiki.noreply.org/noreply/TheOnionRouter/TorFAQ#GoogleLanguage

tor + privoxy

1. Linux(Fedora Core 6):
tor 依赖于 libevent
# rpm -Uvh /mnt/iso/Fedora/RPMS/libevent-devel-1.1a-3.2.1
安装 tor
# userpack install -f tor-0.1.1.25.tar.gz
crablfs> cmd tar xfz tor-0.1.1.25.tar.gz
crablfs> cmd cd tor-0.1.1.25
crablfs> cmd ./configure
crablfs> cmd make
crablfs> cmd make install
crablfs> cmd cd ..
crablfs> cmd rm -rf tor-0.1.1.25
crablfs> cmt
privoxy 在 tor 之上运行
# userpack install -f privoxy-3.0.3-stable-src.tar.gz privoxy-3.0.3
crablfs> cmd tar xfz privoxy-3.0.3-stable-src.tar.gz
crablfs> cmd cd privoxy-3.0.3-stable
crablfs> cmd autoheader
crablfs> cmd autoconf
crablfs> cmd ./configure
crablfs> cmd make
crablfs> cmd make install
crablfs> cmd cd ..
crablfs> cmd rm -rf privoxy-3.0.3-stable
crablfs> cmt

然后运行 tor + privoxy
# tor &
# cd /usr/local/etc/privoxy
# vi config
forward-socks4a / 127.0.0.1:9050 .
// 增加这一行
# privoxy

对 firefox,安装 torbutton 扩展即可,这样在右下角的状态栏会出现一个 toggle button 以开闭 tor,设置其使用 privoxy。

也可以设置 torbutton 使用手工的设置,注意 tor 使用的是 SOCKS 代理,所以只需要在 SOCKS host 一栏设置 localhost:9050 即可。但这样可能存在安全问题,tor 的官方网站也建议使用 privoxy。

使用 torbutton 和手工直接填写代理是一个意思,打开 torbutton 之后,可以看到代理设置实际上发生了变化:
HTTP: localhost:8118
SSL: localhost:8118
SOCKS: localhost:9050

2. Windows:
在 tor 的官方网站上下载 vidalia bundle,它包含了 tor + privoxy,直接安装即可,以后只要启动 vidalia 和 privoxy 即可(默认设置为开机启动的),firefox 同理安装 torbutton 扩展。只是要注意 vidalia 和 privoxy 使用的端口要配合。

感觉上,tor + privoxy 比 torpark 还是要快一些的。

星期一, 十一月 13, 2006

Linux 宽屏显示(915resolution)

我新买的笔记本,intel 915GM 显卡,宽屏,但在 Linux 默认只有 1024*768 的显示分辨率,system-config-display 无法调整,需要使用 915resolution 程序。

下载:
http://www.geocities.com/stomljen/download.html

解压后运行 make 编译,会生成一个 915resolution 的二进制程序,运行之:
# ./915resolution -l
会列出所有可用的“模式 分辨率 色彩位”匹配,选择一个合适的,例如,我的:
# ./915resolution 58 1280 768
之后进入 X Window 就可以以宽屏显示了。

为了每次都自动配置,将 915resolution 拷贝到 /usr/local/sbin,并在 /etc/rc.d/rc.local 中加入:
/usr/local/sbin/915resolution 58 1280 768

参考:
http://www.linuxplus.cn/org/showthread.php?s=7224bb593561c7f0aeffb190646517b9&t=7986
不过实际的命令行有些出入的。

另外,这里:
http://www.stcore.com/linux/2006-06-06/1149574180d14965.html
提供了对非 intel 芯片及 xorg.conf 的调整方法。

Linux cable modem 上网

有线通就是使用的 cable modem,直接从有线电视线路接入,不用拨号,只需 cable modem 由工作人员激活即可。

所以 Linux 和 Windows 的配置一样,很简单,设置网卡从 dhcp 获得 IP 和 DNS 信息即可。

星期日, 十一月 12, 2006

论中国铁兵器的普及时间[转]

论中国铁兵器的普及时间
普鲁日尼科夫

去年11月底,在 sonicBBS 网站古代战争论坛的《古代欧洲的军队肯定不行嘛》一文的回应中 ,TIGERyj 先生就中国与西方铁兵器的普及时间问题对史学界的普遍观点提出质疑,他认为:“中国的铁器普及远比西方来的迅速,”这令我惊讶。因为根据学争鸣的惯例,非常的观点必须有非常的证据作为支持。而 TIGERyj 先生却始终没有就他这一可以说是惊世骇俗的观点提出过哪怕是一个真正的证据,更不用说是足够支撑其观点的非常过硬的证据组合了。为了使大家能够了解关于中国铁兵器普及时间,史学界的普遍观点以及有关的古文及考古资料,我写成此文,对这一本不是问题的问题作一简单的说明,介绍史学论著、古文资料、考古证据和有关技术,以澄清史实。笔者不是历史专业出身,才疏学浅,谬误之处一定不少,欢迎专业人士及广大网友指正。

(1) 关于中国铁兵器普及时间的一般观点

TIGERyj 先生称:“如果随便找个历史学家写的什么论著就可以而不用以考古文物为实据的话,那我还可以说最早普及使用铁的是亚特兰帝斯人呢??因为古希腊的文学里称道过亚特兰帝斯的军队战力强大和铁装备的先进。反正有人写书说就是真的吗??”这句话反映了他史学著作阅读量的不足。事实上,关于中国铁兵器的普及时间,史学界早已形成了较为一致的观点。现摘录较常见的书籍的有关段落于下:

1.《中国军事史略》上册, 高锐主编, 军事科学出版社, 1992年3月第一版。该书是中国军事史方面较权威的著作,编者高锐是研究先秦军事史的知名专家。

第五章《春秋军事》第三节《武器装备与作战方式的发展》第96页“刺杀格斗兵器。基本上仍是西周时期已有的戈、矛、戟、剑等。兵器材料仍以青铜为主,”第97页“矛、矛头,仍为青铜质。”“...剑质虽仍是青铜的但形制改进了,质量提高了。”第98-99页“箭镞虽仍为青铜质,但形制有了较大的改革,” 第六章《战国军事》第三节《铁兵器的使用与战术变化》第151页“春秋文献很少提及铁兵器及其运用,但战国文献提到铁兵器及其应用的情况就很普遍了。”“在已出土的上千件先秦铁器中,绝大部分是战国中晚期的。” 第152页“战国出土兵器仍以铜兵器为多,”

2.《中国战争史(一)》, 武国卿、慕中岳合著, 金城出版社出版, 1992年7月第一版

第一章《西周与春秋战国时期总论》第八节《七国军制装备与军事学术的进步和发展,第二 兵器装备的进步》第59页"一、兵器方面的发展" “春秋时期,战争使用的兵器有戈、矛、戟、剑、刀、弓矢等,一般用铜制造。进入战国时代、(该标点原文如此,应用逗号为妥——引者注)冶铁技术有显著进展,用于兵器的改革与制造,促进了兵器的发展。”

3.《中国军事经济史》, 王其坤主编, 解放军出版社, 1991年6月第一版。该书是有关中国古代军事经济的论著中比较好的一本,缺点是错别字较多,有前后矛盾的现象。

第二章《奴隶制向封建制转变时期——春秋时期的军事经》第三节《春秋时期冶金业的发展和军事生产》第34页“冶铁业是春秋中叶以后发展起来的新兴手工业。”35-36页“春秋时期的兵器,大部分仍旧是铜制。”“春秋初、中期,冶铁业得到初步发展。但是,铁的产量少、质量差。生产出来的熟铁缺乏碳素,性柔软。生铁含碳素过多,性硬而脆,都不适应于制造兵器。因此,在相当一个时期,摒弃装备的主要原料是青铜。....可是到了春秋后期,由于冶铁技术的发展,铁的质量大大提高。于是,铁运用于兵器生产。”

第三章《封建社会初期——战国时期的军事经》第二节《军事经济发展对战争规模和方式的影响》第25页“战国时期兵器生产有较大的改善,主要表现在以下几个方面:第一,以铜兵器生产为主转向以铁兵器为主。”“很多国家逐渐淘汰了铜兵器。” “铁兵器取代铜兵器,标志着我国军事手工业生产进入新的发展时期。”

从以上看,似乎著者认为中国铁兵器取代铜兵器的时间是战国。但接下来,在第五章《西汉时期封建国家军事经济的巩固和发展》第三节《西汉中期的对外战争和战时军事经济的迅猛发展》第106页又有如下语句:“西汉中期由于冶铁实行官营,促进了冶铁规模的扩大和冶炼技术的提高。”“在此基础上,西汉中期的兵器制造已盛用铁,铁兵已基本取代铜兵而完全居于主导地位。”这里又以西汉中期为铁兵器基本取代铜兵器的时间了。

我认为,联系上下文来看,著者还是认为西汉是铁兵器取代铜兵器时间的。有兴趣的网友可以自行到图书馆阅读。

4.《先秦军事研究》论文集, 由军事科学院战略部后勤学院学术部历史室编, 金盾出版社, 1990年5月第一版。其中的《考古所见战国齐兵器种类及有关问题》(杜宇、孙敬明撰文)该文详论了战国时期齐国兵器出土发现的情况,但无一处讲到故齐地曾发现铁兵器。全文仅出现了一个“铁”字,并且与文章主体无关。《略论先秦时期兵种的变化及武器装备的发展》(何贤武撰文)一文中则写道:“到战国时,虽然铁兵器尚未完全取代铜兵器,但已经充分显示了作为新的生产力代表的的优势,到了汉代就基本上取代了铜兵器,成为军队中的主要武器,”(这句话有问题,战国时的铁兵器与铜兵器之比到底怎样?如果仅仅是“尚未完全取代铜兵器”,那么又怎会迟到汉代才“基本取代铜兵器”?“汉代”的时间跨度很长,从上下文来看,这里的“汉代”当指“西汉”,文章却没有说明。另外,铁兵器也不是什么“新的生产力代表”,它仅仅是一种新式的武器,与生产力关系不大,生产力比战国、西汉时期的中国低得多的赫梯、亚述装备铁兵器的时间却比中国早得多。铁制农工具才真正是“新的生产力代表”。尽管有以上问题,但作者的基本观点还是清楚的。——引者注)

5.《战术史纲要》, 卢林著, 解放军出版社1987年10月第一版。

该书有的语句含义不太清晰。第73页“(中国)到了春秋末期,已开始用铁制造兵器了。”“到了战国时...从这时开始,我国的铁兵器逐渐取代了青铜兵器的地位。”(这里的含义就不清,到底作者认为中国的铁兵器何时取代了铜兵器?是战国时期就基本完成了兵器铁化的过程,还是这时才开始了兵器铁化的过程?由于在以后的篇幅里作者再未涉及这个问题,即使看完全书,读者仍然不知道作者的本意。——引者注)

6.《世界全史-新编世界军事史(上)》, 中国国际广播出版社, 1996年11月第一版。

该书是近年来比较著名的“大部头著作”,其中《世界古代中期军事史》(龙源、于可著)第139页写道:“春秋兵器为青铜制造,大体可分三类。”世界古代后期军事史(岳庆平 左芙蓉著)第135页写道:“秦汉时期的武器多为铁兵器、铜兵器已极少。”(这里也存在问题。众所周知,秦汉时期上至前221年,下至后221年,如不加详细说明,读者很难弄清作者的观点。至于对这个结论的看法,我下面还要提到——引者注

7.《中国上古军事史》, 军事科学出版社, 1995年8月第一版, 著者为前面已经介绍过的高锐。

在《中国军事史略》出版三年后,作者关于铁兵器普及时间的观点并没有变。因此这里略去该书第五章的有关内容。在第六章《战国军事史》的第六节《战国时代社会生产的发展与兵器的改进》第455页写道:“青铜兵器的发展,进入了鼎盛时期,制造技艺达到了古代的高峰。”“但战国前中期,格斗兵器仍沿袭春秋时代的,兵器质材仍是青铜,后期,铁兵器才用于装备军队。”第457页“不过,铁(钢)剑在战国时代兵器总量中还不占优势,青铜剑仍是战国剑的主流,”第458页“皮甲胄、铜甲胄是战国时代的主要防护兵器;铁甲胄虽已出现,但并不占主要地位。

8.《中国古代军事思想概论》, 谢国良、袁德金著, 解放军出版社1994年5月第一版。该书也存在语焉不详,前后矛盾的情况。

关于铁兵器的普及时间,该书在第三章《春秋战国时期军事思想》第二节《军事概况》中写到:“春秋战国,铁兵器的运用渐趋普遍,并取代了青铜兵器的地位。”160页第六章《秦、汉时期军事思想》第二节《军事概况》“这一时期(指秦、汉)铁兵器完全代替铜兵器。被看作兵器和生产工具铁器化的完成时期。”这些话的问题在于“取代了青铜兵器的地位”到底是什么意思?是指在人们心中的地位上升,还是在军队中成为了好兵器的象征?或者是在数量上也超过了铜兵器?并且春秋战国的时间跨度很长,笼统的说意思不够明确。

9.《战国史》(增订本), 杨宽著, 1995年9月第一版, 1998年3月第3版第10次印刷。这本书是战国历史的最权威著作之一。该书第303页写道:“春秋时代武器都是铜制的”,“战国时代铜兵器有显著进步。”304页“同时,由于冶铁技术的进步,矛、戟、剑等武器逐渐改用铁制。”308页“战国后期随着冶铁技术的进步,开始制造铁胄、铁甲。”

10.《中国通史》, 上海人民出版社出版发行。该书由我国史学界的泰山北斗白寿彝同志任总主编,徐喜辰、斯维至、杨钊主编。上古时代(上册)第385页“春秋时期的兵器虽然仍用青铜铸造,而在农具、木工具方面已经采用铁制的了。”“但是,应当注意的是,春秋时代的铁制工具出土数量毕竟很少,这表明当时铁制工具的使用还很不普遍”

11.《中国科技史话丛书》之《古代兵器史话》, 杨泓著, 上海科学技术出版社, 1988年5月第一版。该书的水平较高,体系完整。如果要了解中国古代兵器,对于非专业的网友来说,看这本书已经足够了。关于中国铁兵器的普及时间,该书的叙述无疑带有很大的权威性。其第82页写道:“但是在战国晚期,钢铁兵器和防护装具大规模生产的条件还不成熟,”第84页“钢铁兵器成为战争的主要兵器是在汉代才实现的事。”999页 “这种变革的很关键的时期,是汉武帝时期,待到东汉时期,这个变革就完成了。”

12.《中国通史·第二册》, 范文澜著, 人民出版社, 1978年6月第五版。关于范文澜同志在史学界的地位,我想用不着我来多嘴。人民出版社在中国出版界的地位,当然也无需多说,该书是范文澜同志的代表作,以观点鲜明、条理清晰、深入浅出见长。总体水平高于国内绝大多数史学著作。(包括近年来许多大部头著作)我建议每个历史爱好者都借来好好阅读一番。

该书第75页“战国时期,楚、韩等国的‘巧治’应用炼钢(刚铁)术制造某些兵器,但直到汉文帝时,兵器仍主要是铜制。汉武帝设铁官后,推广炼钢术,全国铁官都能炼钢造兵器···近年来辉县、长沙发掘西汉墓葬,证明自汉武帝时起,长铁剑及铁刀代替了铜兵器。炼钢成为普通的技术,正是官营冶铁的效果。”

13. 青年文库之《中国古代史常识》秦汉魏晋南北朝部分, 中国青年出版社出版, 1979年3月。为了尽快改变文革造成的青年文化知识缺乏的状况,国家对这套普及性的丛书予以了极大的关注。第一版印数即达20万之多,该丛书在当年几乎普及到了每一个青年。不过大概作者本人也未曾料到,24年后、文化发达的21世纪,依然需要这样过时的书来向一个大学生普及一个简单的历史常识!

该书第112页《汉代冶铁生产有哪些发展?》中专门讲述了中国铁器普及的历史。“到了战国,使用铁器才比较普遍起来,形成冶铁生产的第一次大发展时期。秦汉时期,尤其西汉中期以后,铁的生产量猛增,技术迅速发展,质量显著提高。这是我国古代冶铁业的第二次大发展时期。”“汉代铁的应用比过去广泛。铁器逐步取代了铜器。以兵器为例,汉武帝前,铜铁兵器往往同时出土;武帝以后,铁兵器占了主要地位;东汉时期,主要兵器已全部为铁制。”(请注意这句话,在该丛书出版后的许多历史读物都原封不动的照抄了它,直到今天。——引者注)

我查阅的史学专著、通史、论文集、历史教材和普及性读物共计21种。在未提及的其他书籍中,除一种以外都无一例外的主张中国铁兵器基本普及是在西汉时期。唯一的例外是经济史学家陈振中所著《青铜生产工具与中国奴隶制社会经济》(中国社会科学出版社1992年9月第一版),陈振中先生认为中国铁兵器在战国后期就已经成为了主要的作战兵器。[见该书下编《铁器的使用与中国奴隶制社会的崩溃》第十三章《先秦铁器的使用 二、战国时期钢铁器物的普遍使用和业铁技术的巨大发展(二)铁器成为主要的生产工具,铁兵器到战国晚期已成为主要的作战武器》一节]对于这种观点,我不敢苟同。原因在于:一、陈先生对古文的运用和解释似有偏向性。陈先生的古文资料并没有超出我收集到的范围,从原文看,根本都不能证明战国后期铁兵器已占主要地位。(可以参阅我下面的引文)而且,在抄录《史记·秦始皇本纪》时,不知是否疏忽,恰恰少抄录了关键的一句话:“以弱黔首之民”,如果当时铁兵器已占兵器的大部分,那么单单收缴铜兵器,又怎能“弱黔首之民”?二、考古表明,汉前期的铜兵器仍然是经常出土的,在西汉前期还往往在数量上超过同地出土的铁兵器。远不是在秦之后就“基本结束了”其历史。(这点在下面还要提及)三、即使是贵族墓,其中的殉葬兵器也是实用型的。在春秋战国时期根本没有以仪仗兵器代替实用兵器殉葬的风俗,相反,当时的丧葬习惯是尽可能模拟墓主生前的生活,一般以墓主实际使用的器物殉葬。事实上,中国早期的铁钢兵器大多是在贵族墓中找到的。四、最主要的是,即使武士的墓也无法证明战国时铁兵器已经占据了主要地位。陈先生的有关证据有三条,其中两条出土铁兵器较少,难以说明问题。唯一出土铁兵器比较集中的燕下都群葬坑是非正常墓葬。形成时的情况到底如何,历史背景是什么,都不清楚。在更充分的证据出现之前,史学界现在还难以下结论。相反的,铜兵器出土不仅数量多,而且在各种墓葬中都有许多例子。[关于春秋战国的墓葬风俗,请参看《百卷本中国全史.中国春秋战国习俗史》(史仲文、胡晓林主编.人民出版社出版),关于出土铜兵器的情况,推荐《秦始皇陵兵马俑研究》(袁仲一著.文物出版社1990年12月第一版),该书是研究秦兵马俑的权威之作,篇幅极大。可以说对于秦兵马俑的方方面面,包括对战国后期铜兵器的一切有关问题都已经有了详细的阐述。如果哪位网友对秦兵马俑兴趣很大,更应该购买该书。我在本文后面还要将其中直接涉及铁兵器取代铜兵器问题的一段作为附录。]到目前为止,支持陈振中先生的学者并不多。

综上所述,目前历史学界普遍认同:中国铁兵器基本取代铜兵器的时间是在西汉中期或以后,到东汉这一过程完成。分歧主要存在于两个方面:1. 战国后期铁兵器是否占据了主要地位?目前认为“没有”的学者人数较多,一些大家如郭沫若、范文澜均持这一观点。2. 中国铁工具和农具是什么时候占据主要地位的?有战国说和西汉说两种。这两个分歧都没有达到辩论的程度。关于这些分歧,感兴趣的网友可以参阅我在文中列出的各种著作。

也就是说,中国史学界普遍认为:中国铁兵器取代铜兵器的进程是在耶元前2世纪后期开始-后1世纪初完成。

那么,欧洲的情况如何呢?

根据名从主人的原则,现摘录西方史学家的观点于其下:

1. encyclopedia americana copyright (c) 1990 by Grolier Incorporated, 在该书的 IRON AGE 欧洲义项下写道:“在相同时期(约前十二世纪——引者注铁的使用开始传入欧洲。主前十一世纪,希腊克里特岛的坟墓中已经放有铁器;约在主前900年铁器出现在意大利的 villanovan 族中,根据传说可能由来自小亚细亚的特洛依人(Etruscan)引进。约在主前700年,第一个大规模的铁器制造中心在现代奥地利的 Hallstatt 地方发展起来。当地含量很丰富的锰铁矿竟然不需要碳化。(此句意思不明,作者的本意大概是说用当地产的铁制造的铁兵器不需要一般制造铁兵器的碳硬化过程就足够坚硬了。--引者注)。Hallstatt 的铁制长剑,可能是凯尔特人崛起,并在以后几个世纪中统治中欧和西欧的主要原因.随着凯尔特人的扩张,铁的使用也遍及欧洲,许多地区结束了以青铜复制 Hallstatt 长剑的历史。...到了主前500年,铁和铁的生产在相当于现代的德国及斯堪的纳维亚半岛地区已经很普遍。在不列颠,历史悠久的青铜制造业仍很重要,铁器制造业的引进因此较晚,但到了主前450年,铁也取代了青铜。...”在其他地区义项下明确写道:“铁的使用在主前六世纪才首次传入中国——比北欧还晚。”

2. Harper collins Publishers, Inc. 该书第三章《巨人时代 罗马的军事体制(主前220年以前)》写道:“(罗马)每个士兵还配有用于刺杀的短剑,大约有1.米长。”罗马的重标枪或标枪,是一种具有独创性的武器。这种标枪容易投掷,穿透力大,一半是金属杆,一半是木头制成,也就是将一根铁头插入木杆中。”在同一章《秦朝的军事体制》中,作者写道:“主前2—3世纪,中国看起来在武器设计方面已经远远的领先于西方,但在冶金术方面则明显的落后,中国在秦始皇时期才开始使用铁兵器,而且还仍然保留大量的青铜兵器。在此以前很长一段时间,地中海世界的军人们已经开始完全使用铁兵器了。另一方面,中国的铜兵器似乎非常尖锐,在硬度和韧性方面,可以与同时代西方的铁兵器相比。”

从这些话我们可以发现什么呢?除了那些已经讲得很明白的话以外,还可以纠正一个常识性的错误:罗马的短剑并不真的“短”,事实上全世界最长的青铜剑是中国嬴政兵马俑坑中出土的94.8厘米剑,从青铜的特性来说,很难再超过这个长度。长达1.2米的剑,必是铁剑无疑。罗马短剑的长度有各种规格,最短的规格是两英尺长(约合66厘米)。仍比战国时期中国地区一般的铜剑长,而与同期的中国铁剑相当。所谓 “短”,当是与投枪等长兵器相比较而言的。

当然,这段引文也有错误,就是关于中国铁兵器开始使用时间的说法。现在根据考古资料,可以肯定中国地区在春秋时期就开始使用铁兵器了。

3.《全球通史·150年以前的世界》中文版(在书店及图书馆未找到英文版——引者注), 缪吕肯.斯塔夫里阿诺斯著,吴象婴、梁赤民译。p170 “不过,这一阶段(指铁器时代——引者注)——在印度,大约是前800年;在中欧,是公元前750年;在中国,是公元前600年。”

4. 在国内的世界史著作在这方面也是清楚的。《世界史.古代史》(主编:崔连仲, 人民出版社1983年5月第一版, 1986年8月第四次印刷。)该书第五章《古代希腊》第二节《荷马时代》第203页“公元前两千年代末至一千年代初希腊由青铜时代向铁器时代过渡。”第204页第三节《奴隶制城邦的形成》“公元前八至六世纪是希腊奴隶制城邦的形成时期,这一时期又被称为早期希腊。这时希腊各地社会生产力有新的增长。铁制工具逐渐普遍应用。装有铁铧的犁、铁锄和铁锹等农具的广泛应用,使希腊多山而贫瘠的土地成片的得到开垦和深耕。”第七章《古罗马共和国》第一节《上古意大利和罗马的“王政”时代》第291页 “发掘表明,约公元前一○○○-八○○年间意大利已经渡到铁器时代。第295页“‘王政’时代的罗马,由于铁制工具的普遍运用,并在伊达特里和希腊文化的影响之下,社会经济有了显著的发展。”

尽管近年来狂热民族主义在中国史学界造成了一定程度的不良影响(主要是“提前”中国科技发明、发现的时间直至中国文明本身的长度,夸大中国在世界历史上的作用等),但目前无论在中外史学界,关于中国与欧洲铁器普及时间的先后,意见仍然和过去一样完全一致——不是百分之九十九,而是百分之一百的肯定:中国晚于欧洲。

除列出了引文的书籍外,可供参考的书还有《中国小通史》(长城出版社2000年1月第一版)和我们大家都很熟悉的《中国历史》--先秦卷(面向21世纪课程教材,作者:张岂之, 出版社:高等教育出版社);秦汉魏晋南北朝卷(作者:张岂之 出版社:高等教育出版社。两书均为2002年5月出版),中国铁兵器普及时间在考试时可作为选择题,占1-2分。

(2) 中国古书中的资料

在研究中国铁兵器普及时间时,一个重要的途径是研究史料,在古代,中国是世界上历史著作最完整、最丰富、最详尽、最可靠、水平最高的,这给我们的研究提供了极大的方便。然而即使是中国的史料也并不是绝对可靠的,在中国史书中,主要的问题是:

1. 托古。在中国古代,托古著书的现象很突出。先秦著作大部分夹杂有后人的“私货”。显然,用后人的说法来证明当时的现状是不可靠的。

2. 文言。中国使用的是象形文字,因此可以长期使用与口语脱节的文言文。在先秦,文言还是基本与口语相近的,但后来文言长期使用,渐渐脱离口语。一些用语从字面看上似乎并没有大的变化,但意思却完全不同。加之年代久远,因此先秦文献的翻译历来是见仁见智,难得统一。例如《墨经》中关于光学现象的一段话,就很难解释,至今都没有一个公认的译文。

3. 文学化的弊病。中国古代的知识分子基本上写什么文章都力图实现文学化,他们的著作中存在着大量的 “艺术加工”。这样有利于吸引读者,但却不利于科技知识的保留。我们今天很难清楚到底先秦古文中的一些数字究竟是实指还是虚指,从古文中往往也很难了解某项技术的工艺流程。

4. 专业不对口问题。古代中国的知识分子大部分是纯粹的书生,很少有其他方面的专业知识。懂得科技的人就更少,一个外行人叙述技术问题,难免有偏差。

5. 近年来狂热民族主义给历史学界带来的不良影响是显而易见的,在古文方面,主要的表现是任意解释古文和偏用古文,怎样解释对表现中国的“优点”和“长处”有就怎样解释,哪段古文对“中国最好”的论点有利就摘用哪段,而对于相反的资料,论意义如何,均一概略去不登。

因此在引用古文时,要注意鉴别。

目前有关先秦铁器使用情况的主要有如下几条资料:

一. 最为经典的和最能说明春秋时期铁器使用情况的是《国语.齐语》中据说是管仲说的话:“美金以鋳劍戟試諸牛馬惡金以鑄(金且)夷斤(屬刂)試諸壌土。” 尽管管仲有没有说过这话不清楚,但《国语》成书时间不晚于战国,这句话可以说是表明了早期铁器在中国人心目中的低下地位——与世界上其他文明初遇铁时的如获至宝形成鲜明的对比。

注:“恶金”亦有说法认为也是青铜,不过是较劣的青铜。但现在普遍认为是指铁。

用书:(《国语》上海古籍出版社, 上海师范大学古籍整理组校点, 1978年三月出版, 第二百四十页)

二.《管子》的记载:在《管子.地数篇》中有“出銅之山四百六十七出鐵之山千六百零九”的记载。其海王篇说:今鐵官之數曰一女必有一(金咸——古文中有不可用輸入法表現的字我只能用拚字的土辦法表現,下同)一刀若其事立耕者必有一耒一鋸一錐一鑿若其事立不爾而成事者天下無有令(古本為‘今’)(金咸)之重一三十(金咸)一人之籍也刀之重加六五六三十五刀一人之籍也耜鐵之重加七三耜鐵一人之籍也(此处之‘七’王引之认为应是‘十’)。”(用书:《管子轻重篇新诠》, 马非百编成, 中华书局1979年12月, 第二百零二页)

需要注意的是《管子》一书中文章的作者时间跨度从战国到秦汉都有,但以战国为主。而上面那条海王篇中的资料有“铁官”字样,而铁官是秦朝时才设立的,因此可以肯定海王篇的作者至少是秦时人,所以这条引文反映的应当是秦以后的情况。在第一条引文中需要注意的是在铁器普及时期,人们已经知道了铁矿比铜矿多得多。

三.《韩非子·内储说上》有:“夫矢來有鄉(通“向”,下同)則積鐵以備一鄉矢來無鄉則為鐵室以盡備之”的话。“积铁”有两种解释:铁盾或铁甲。而“铁室”也有两种解释:防护全面的铁甲或铁屋子。我难以断定正确的解释。

用书:《韩非子集释》陈奇猷 校注 上海出版社1979年7月新一版 原版为中华书局出版。 摘第五百三十六页, 卷九《内储说上——七术第三十》。

四.《荀子》中有:“楚人鮫革犀兕以爲甲(革合)如金石宛鉅鐵釶慘如蜂虿轻利(亻票)(辶敕)卒如飄風。”的话。其中的鉅指大钢,釶指长矛。以今人的看法,并不觉得蜂蜇有什么惨的,可能古人的想法不同。(《荀子·议兵》卷十议兵篇第十五, 第二百八十一页)。

用书:新编诸子集成第一辑《荀子集解》, 清-王先谦编, 中华书局1988年9月第一版

五.《孟子》中有著名的问句:“許子以釜甑爨以鐵耕乎”。

用书:《孟子正义》, 清-焦循撰, 中华书局1988年10月第一版,摘该书第三百七十页《滕文公卷十一 孟子卷第五 滕文公章句上》

六.《吕氏春秋》有一段话:“趙氏攻中山中山之人多力者曰吾丘(穴鳥,一作鳩)衣鐵甲操鐵杖以戰而所擊無不碎所衝無不陷”。注:铁杖在考古中发现不多,尤其是古文中这种较大的铁杖,还没有实物发现。
用书:《吕氏春秋集释》, 许维遹编, 北京市中国书店1985年5月第一版,引文摘自卷二十一《开春论第一》

七. 作为中国早期第一种信史,《史记》中的资料比较多。如:“昭王曰吾聞楚之鐵劍利而倡優拙夫鐵劍利則壯士勇倡優拙則思慮遠吾恐楚之圖秦也”(卷七十九:范雎列传)“朱亥袖四十斤鐵錐錐殺晉鄙”(卷七十七 魏公子列传)在《苏秦列传》中,有“铁幕”字样,《索隐》对此的解释是“谓以铁为臂胫之衣”。在《秦始皇本纪》中,有张良命壮士使用巨大的铁锥投掷秦始皇车队的记载。

注:这种巨型的铁锥,在考古中也没有发现。

用书:《史记》中华书局1959年9月版,摘自第两千三百八十一页、两千四百一十八页。

在信史中基本上就是这些,如果加上近年来以不认为是史书的《战国策》,那么还有以下的情况:韩策一也讲到了“铁幕”,还有“陸斷牛馬水擊鹄雁當敵即斬”的话。

用书:《战国策》上海古籍出版社1978年5月版

注:《战国策》之所以不再被认为是可靠的史书,原因在于其史实差错太多。关于这点可以阅读近年来的研究文章和译本。

从总的情况看,汉代之前有关铁器的古文资料不仅少而分散,而且很少有关开矿、工艺流程等方面的段落,甚至西汉初期也很少,表明铁器的制造工艺中国地区的人们还不熟悉。我们还可以发现当时的铁工具和农具已经比较普遍了,在古文中有关的语句相对较多。而铁兵器很少,人们把它当作一种新式武器来加以描写。

相比之下有关铜兵器的资料就很多,而且在工艺流程方面有完善的记载。

一.《吕氏春秋·季春纪第三》“是月也命工師令百工審五庫之量金鐵皮革筋角齒羽箭幹脂膠丹漆無或不良百工咸理”。

请注意:在西汉之前,中国人对金属往往区分得不很清楚。将除铁之外的所有金属都称为“金”。这跟中国金银矿产较少,主要使用铜货币有关。

二.《荀子》“刑范正金锡美工治巧火齐得剖刑而莫邪己然而不剝脫不砥厲則不可以斷繩”。(疆国篇第十六 卷十一 第二百九十一页)

三.《周礼》“鄭之刀宋之斤魯之銷吳粵之劍遷乎其地而弗能爲良地氣然也燕之角荊之幹妢胡之(上竹下可)吳粵之斤錫此材之美者也”“凡攻木之工七攻金之工六攻皮之工五设色之工五刮摩之工五搏(土直)之工二。···攻金之工築冶鳧栗段桃。···”“(火樂)金以爲刃”。

用书:《周礼》书目文献出版社, 1985年2月第一版。摘录《冬官考工纪第六》,第四百一十九页、第四百二十页。

在考工纪中还有一段著名的记载:“金有六齐:六分其金而锡居一,谓之锺鼎之齐;五分齐金而锡居一,谓之斧斤之齐;四分其金而锡居一,谓之戈戟之齐;三分其金而锡居一,谓之大刃之齐,五分齐金而锡居二,谓之杀矢之齐,金、锡半,谓之鉴燧之齐。”(转引自"第三异空间论坛-动漫讨论区, http: //www.3magicspace.com/bbs/list.asp?boardid=2")这是世界上最早的铜锡合金配方表,当然根据现代科学我们知道这份配方并不科学,因为古人无法分析合金成分,其中所称的“锡”实际上包含了青铜中所有的非铜成分,并且比例也不准确。但在古代,这份配方表仍有一定的参考价值,是一份珍贵的文件。

注意:这里的资料表现了中国青铜时代长期延续的原因之一:中国有丰富的锡矿,锡与铜的合金,只要其中的锡比例合适,就可以使青铜器得到人们想要的各种不同性能。而中国的锡矿丰富,可以使中国人有充裕的试验用品来慢慢摸索出较正确的青铜制造工艺,而锡矿较少的国家显然没有这种条件。

四.《史记》中有关铜兵器的段落也有很多。在《秦始皇本纪》中,司马迁摘录加以的话说:“太史公曰···秦王···墮名城殺豪傑收天下之兵聚之咸陽銷鋒鑄鐻以爲金人十二以弱黔首之民”(《秦始皇本纪第六》, 第二百八十一页)。这是有关当时铜兵器的很重要的一句话,它表明:即使在秦朝,只要收缴了铜兵器,就可以虚弱人民的武装。很显然,当时中国铁兵器的数量是微不足道的,即使不收缴也关系不大。

从其他方面看,《史记·货殖列传》中记载的以铁致富者有蜀之卓氏、宛之孔氏、鲁之曹邴氏等,他们都是在战国时才发展起来的。

昭宣之世,全中国有郡国一百零二。其中设铁官者如下:京兆郑、沛郡沛、左冯翊夏阳、魏郡武安、右扶风雍、长山都乡、弘农郡、涿郡、弘农宜阳、蜀郡临邛、河南郡、犍为郡武阳、颖川阳城、犍为南安、汝南西平、琅琊郡(此两字的古代写法与现代正好相反,“琅”字有耳旁,“琊”字没有。)、南阳宛、庐江皖、山阳郡、河南郡、河东安邑、河东皮氏、河东绛、太原大陵、河内隆虑、千乘郡、千乘千乘、济南东平陵、泰山嬴、齐郡临淄、东莱东牟、辽东平郭、胶东国郁秩、东平国、楚国彭城、东海下邳、临淮盐渎、临淮堂邑、汉中沔阳、陇西郡、渔阳渔阳、右北平夕阳、中山国北平、成阳国莒、鲁国鲁、广陵国。但《汉书》称当时全国共有铁官四十九处,另三处的情况不详。这样,设铁官的郡国仅占当时全中国郡国数的二分之一。(见《汉书》卷二十八《地理志》)

需要注意的是在四十六处铁官中,在江南的仅蜀郡临邛一处。是不是江南没有铁矿,因而不宜设立铁官呢?否。马鞍山、当涂、鄂东、鄂西,都是当今著名的铁矿。湖南、两广也有铁矿。那么是不是江南很太平,不需要大量铁兵器补充呢?否。前111年,汉灭南越,征服壮族/越族地区、前111年-110年,中国征服东越,同时侵入海南岛、前109年,中军又入侵西南各族地区,此后各族人民的反抗此起彼伏,各殖民地的中军都不得安宁。而到了昭宣之世,江南仍只有一处铁官!这种情况是值得令人深思的,

在汉代,铁器逐渐普及,中国人的冶金知识也有了进步,因此,在《汉书·地理志》中有了如下的话:“巴蜀亦沃野地饒卮薑丹沙石銅鐵竹木之器···浙江南則越夫吳自闔廬春申王濞三人招致天下之喜遊子弟東有海鹽之饒章山之銅三江五湖之利亦江東一都會也···豫章出黃金長沙出連錫然堇堇物之所有取之不足以更費河東土地平易有鹽鐵之饒本唐蕘之所居···粵地···今之蒼梧桂林合浦···皆粵分也···處近海多犀象毒冒珠玑銀銅果布之湊中國往商賈者多取富焉”。

(《汉书》中华书局1962年6月出版, 第六册, 卷二十八)在东汉,显然已经能够区分青铜和黄金了。“铜”也取代了“金”,成为铜的专用名词。但我认为在西汉一般所称的“黄金”当指黄铜,原因在于当时的文章提到的“黄金”,数量未免太大,动辄成千上万斤。而众所周知:中国不是一个盛产金的国家。

上面这条资料表明:到了汉代,青铜不再是包打一切的“金”了,人们必须想一个新名词来称呼它。从此铜被认为是金属的一种,与铁并列。铁直到这时才争得了平等地位,不再是劣于铜的“恶金”。

(3) 考古资料

TIGERyj 先生经常用到的一个词组是“考古资料”,但很遗憾,他并没有提供哪怕一个具体资料或资料索引。其实,有关铁兵器与铜兵器的考古资料,有很多很多。只是——用鲁迅先生的话说——看你肯不肯把睡懒觉、谈恋爱、玩网络游戏、在论坛上灌一些空洞无物的水的时间,分出一点来用在找资料上而已。以下是我找到的考古资料汇总:

1. 河南上村岭虢国目的出土兵器中,出现了脊、茎、刃区分明显的柱脊铜剑,但最长的不过近40厘米。还出现了圭型锋的长胡二穿戈和三梭型锥体铜镞。上村岭墓地的年代为春秋晚期。(参见《上村岭虢国墓地》)

2. 江陵望山一号楚墓出土越王勾践剑,该剑青铜质,全长55.7厘米。上有错金铭文“越王鸠浅自作用剑”。越王勾践是春秋最后阶段的人,当时吴越的剑号称锋利,但最长的不过如此。(参见《文物》1966年第5期)

3. 春秋时期的复合铜剑多有出土,这种剑的特点是脊部含锡量较低(约百分之十几),性坚韧而较软,两侧刃部含锡量较高(一般在百分之二十以上),性硬而脆。复合剑将高锡合金与低锡合金的优点合而为一,剑既锋利又不易折断。当时欧洲正在以铁兵器取代铜兵器,铜兵器基本上停止了发展,而中国铜兵器的发展却方兴未艾。(参见《中国古代冶金》, 北京钢院, 文物出版社1978年12月出版)

4. 长沙春秋晚期墓中出土钢剑,由含碳0.59%的中碳钢制成,长38.4厘米,是目前中国发现年代最早的块炼铁渗碳钢制造的兵器。而就世界范围而论,在前11世纪的凯美遗址之中,有残留的钢,但这一发现不能肯定。可以肯定的世界最早的钢器在印度,前六世纪冶炼。(参见《文物》1978年第10期)

5. 湖北随县曾侯乙墓出土大量铜兵器和皮甲胄,有弓矢、戟(二果或三果)、矛、殳、戈,兵器柄多用“积竹”柄。出土髹漆皮甲胄、髹漆皮马甲。曾侯乙死于前433年或稍晚。(参见《文物》1979年第7期)

6. 河南淮阳马鞍冢楚墓车马坑中出土的驷马木战车的车舆上,装有青铜护板。年代为约前278~240年。(请那位说战国战车已经使用了铁护板的网友注意《文物》1984年第10期)

7. 战国时期的青铜弩机,在湖南、四川、山东、河北、河南等地均有发现。以1952年长沙南郊扫把塘138号墓出土的髹漆木臂最完整,弩机(牙、悬刀、牛)直接装入木臂槽内,无铜廓。同出弩箭带有装铁铤的三梭型铜箭镞。(参见《中国古兵器论丛》, 杨泓著, 文物出版社, 1980年第一版增订本于1985年出版)

8. 目前战国铁兵器出土最多的是河北燕下都44号墓发现的战国晚期钢铁兵器群。有剑15件、矛19件、戟12件、小刀一件和匕首4件,铁尊11件。经检验有些剑、矛、戟是块炼铁渗碳制成的低碳钢制品,并经过淬火,是中国目前所发现的最早的淬火产品。也有用块炼铁直接锻造的铁剑。还出土有一顶有铁甲片编成的兜鍪。该墓是一个乱葬坑,所埋葬的人系非正常死亡。具体情况如何至今不清楚。(参见《考古》1975年第4期)

9. 嬴政陵墓著名的兵马俑出土数量众多的披铠甲陶俑,并出土有四马(陶马)木质战车和牵马的陶骑兵俑。同出兵器极多,青铜兵器即达近40000件,而同地出土的铁兵器不过4件(与铜镞相配的铁铤一件、铁镞两件、矛一件)。铜兵器的样式有:剑、戟、铍、殳、镞和装铜弩机的木弩。青铜兵器制作极其精密,铜剑表面无锈痕,镞表面有含铬约2%的致密氧化层,有人认为是用铬盐进行过表面处理,但未能证实。(《文物1975年第11期,及前面推荐的《秦始皇陵兵马俑研究》)

10. 前200年,在西汉都城长安建设了中央武器库——武库,一直使用到新朝,后在新末大战乱中毁弃。遗址在今西安大刘寨。1975年开始发掘,出土大量铁兵器,有刀、剑、戟、矛、斧和镞,以及大量的铁铠。仅铁镞即达1000余件。还有少量的铜兵器。说明在新朝末期,铁兵器已经基本上取代了铜兵器。(《考古》1978年第4期)

11. 陕西咸阳杨家湾西汉早期墓出土陶俑群,所披黑色铠甲被认为是模拟铁甲,有步兵的带披膊的札甲和骑兵的不带披膊的札甲,并出现做工精细的鱼鳞甲。(《文物》1966年第3期、1977年第10期)

12. 河北满城刘胜墓出土大量铜铁兵器。有渗碳钢制的剑、块炼铁和低碳钢制的大量箭镞和铠甲片,出现了环首长刀和戟、以及由2859片甲片编成的鱼鳞甲。铜兵器有戈、矛、剑、匕首、弩机和镞。弩机已经有了铜廓,可以加强弩力。部分弩机的望山上有刻度,作用类似于今天步枪的表尺,增加了射击的准确度。刘胜死于前113年。(《满城汉墓发掘报告》)

13. 1959年~1960年在内蒙古的呼和浩特市郊二十家子古城出土一领完整的西汉铁铠,是由大型长方形札甲片和中型圆角长方形甲片合编的实例,铠高64厘米,约用648片甲片,总重约1114克。(《考古》1975年第4期)

我还寻找了1982年全年和2002年1-5期的《考古》杂志,这11期中,涉及春秋至东汉兵器的遗址发掘报告共21份,其中,春秋之前遗址无一处有铁兵器;春秋时期同样如此;春末战初有铁兵器的遗址一处:当地出土的铜兵器数量多于铁兵器;战国有铁兵器的遗址一处,铜兵器多于铁兵器;西汉的情况发生了很大变化:共有七处遗址出土铁兵器,铜多于铁两处、铁多于铜两处、全铁四处、全铜三处,当时中国统治区出土的铁兵器数量多于当时外国外族的铁兵器,并明显的表现出西汉后期铁兵器多于前期的趋势;东汉出土兵器遗址三处,全为铁兵器。另外战国铁工具、农具出土两处,西汉铁农具、工具出土五处,铁工具、农具出土的数量明显大于铁兵器,并且有了大型的制造基地。以上这些都与史学界的主流观点相吻合。2002年的情况与1982年并没有大的变化,1982年至2002年间的其他各期《考古》以及中国考古学界另一本著名杂志《文物》情况大同小异,不再赘述。关于欧洲铁兵器普及时间和欧洲古代冶铁作坊(包括古希腊的冶铁作坊)的考古资料,可参看上面列出的西方史书的附录——这花不了多少时间。

本节附1:中国考古与历史杂志名录

《文物》,《文物》编辑部编, 文物出版社, 1959开始发行, 广西图书馆索书号 K873/00272

《考古》, 中国科学院考古研究所编, 科学出版社, 1959开始发行, 广西图书馆索书号 K85/44400

这两本杂志是考古学界最有影响的杂志,史学论文几乎肯定会引用其中的报告。

《史学月刊》, 《史学月刊》编辑部编, 中国史学会湖南分会主办, 河南人民出版社, 1957年开始发行, 广西图书馆索书号 K/50772

《军事历史》, 中国人民解放军军事科学院编, 军事科学出版社, 1983年开始发行, 广西图书馆索书号 E29/37575

此外,《轻兵器》杂志有时会介绍古代兵器,也可以观看。(该刊由轻兵器编辑部编1977年开始发行 , 广西图书馆索书号 TJ2/51726

至于西方比较有用的杂志有:

中图刊号:210MC058

中图刊号:210MC057

中图刊号:210B0117

中图刊号:210C0057

中图刊号:210E0072

《Greece & Rome》中图刊号:420C0051

本节附2:《考古》杂志的有关文章推介

1982年第1期《云南铜柄铁剑及其有关问题的初步探讨》, 作者-张增祺。从该文中的考古资料我们可以知道,云南土著居民早在春秋末期就开始制作铁剑,并不比中原晚多少。

1982年第3期《咸阳市空心砖汉墓清理简报》, 咸阳市文管会、咸阳市博物馆编写。该文有助于了解西汉中后期到新朝铁器的普及情况。

同期《扬州东风砖瓦厂八、九号汉墓清理简报》, 扬州博物馆编。该文表明新朝铁兵器取代了铜兵器。

同期《河南镇平出土的汉代窖藏铁范和铁器》, 河南省文物研究所镇平县文化馆编。阅读该文可以了解西汉末至东汉中国铁工具的制造方法。

同期《湖南郴州市郊东汉墓发掘简报》, 湖南省博物馆编。这篇文章从一个侧面反映了东汉铁兵器已经取代铜兵器。

1982年第4期《四川宝兴县汉代石棺墓》, 宝兴县文化馆。该文中的考古资料十分清楚的表现了西汉时期以铜兵器为主过渡到东汉以铁兵器为主的历史进程。

2002年第5期《江苏邳州市九女墩三号墩的发掘》, 孔令远、陈永清撰写。该墓是汉初铜兵器使用情况的缩影。

(4) 中国普及铁兵器的进程比其他古文明缓慢的原因

史学界公认,中国普及铁兵器的时间晚于其他所有的上古文明国家。并且这个过程相当长,从春秋末开始,到西东汉之交才完成。时间跨度近五百年(欧洲普及铁兵器用时约三百年)。那么,究竟是什么使得中国普及铁兵器竟如此之难呢?我认为有如下三个原因:

第一个原因是中国封闭的地理条件,使其不易得到其他先进文明的文明成果。

打开中国地图,可以发现仅就直线距离来说,中国就已经远离其他先进文明了。如古都西安,是中国古代最靠西的一个大城市,它与其他文明中心的直线距离如下:新德里3000约公里、德黑兰约5000公里、巴格达约5500公里、开罗约7000公里、雅典约7300公里。相比之下,雅典距巴格达约2000公里、距开罗约1200公里、距新德里约5000公里。

更糟糕的是,中国周边的环境不适于通商和旅游。从地理角度说:在中国东方是多台风的太平洋,耶元13世纪,入侵日本的14万中军就是因为遇到台风而遭到重创;往南是同样险恶的南海,中国周边的海洋都是大面积的深海,受北赤道暖流和北太平洋暖流的影响,变幻莫测,缺乏较安全的平静水域,对于古代帆船来说是难以逾越的障碍,唐朝时的高僧鉴真,五次东航有四次败于大风,第五次也遭到大风袭击,仅仅因为运气才侥幸登上日本;在陆地上,中国以南的中南半岛是一望无际的原始森林,通行极其困难;往西南是不适于人类活动的青藏高原;往西3000多公里都是干旱地区;往北则是寒冷的西伯利亚;中国周边没有一个较好的对外交往的窗口。从古代国际交往的最大动力——商业的角度考虑,在铁器时代初期,中国周边各国各族普遍人口较少,没有较大较富裕的文明中心,也就是说缺乏较大的市场;而对中国商品需求较大的西方国家,由于路途太过遥远,只能通过中间商(如波斯人)进行贸易,中国商人的商业机会并不多;相比之下,中国地区人口较多,市场空间很大、路途平坦,各国政府都对商业加以保护、从事华夏文化圈内的商业活动十分安全和较易致富;以上三个原因使得华夏诸国商人缺少对外交通的兴趣,都把注意力放在华夏文化圈内。从文化交流的角度讲,中国离其他大文明太远,周边各国各族文化、科技落后,使得中国地区缺乏学习外国长处的动力和紧迫感。最后,即使是民间小规模的对外交往和贸易,也受到古代中国对外扩张造成的华夏诸国与周边各国各族尖锐矛盾的影响,进行得十分困难,危险很大。

由于以上自然和人为的不利因素,在整个古代,虽然每个时代的情况不尽相同,但总的来说,中国人主动对外交流并不多,并且主要是政府行为和边民小规模的交易,集中在距中国较近的那些落后地区。而外国与中国的交往也只能是零散的,小规模的。这样一来,古代中国人实际上从来没有受到过外来先进文化的较大冲击,助长了他们睥睨天下的自傲心理。外国的先进科技,当然也就更难进得来了。

在人类历史上,那些对外交往便利的地区往往也是较发达先进的地区。铁器时代初期的两河流域正是这样一个地区。从耶元前五千年这里出现城市之后,就一直牢牢地稳坐在世界领先文明区的宝座上。文字、铜器、铁器、砖砌建筑物、灌溉农业、城邦民主、法律、学校···莫不在世界之先。究其原因,正是两河对外交往便利。两河流域本身是新月沃地的一部分,这里在上古时代是被称为天堂的农业宝地,丰富的出产养活了众多的文明,可以说这里的每个民族对世界历史都有贡献,连小小的落后部落联盟以色列人,都发展了世界第一种一神教。两河流域因为有便利的灌溉条件的缘故,当然成为天堂中的天堂,并且两河的对外交往条件极其便利。往东是当时的波斯,这里的植被还没有被破坏之前,是一个有利于通行的地区,商队和游客可以直通印度河流域,接触印度文明;两河以北的高加索山脉,从来不是截断南北交通的障碍,山北的游牧文化和山南农耕文化的交流,从来没有中断过;两河以西,新月沃地直抵大海(即今地中海),在巴勒斯坦上船,沿海岸行驶可直抵爱琴海,与爱琴海文明接触;西南,从巴勒斯坦到尼罗河三角洲直线距离不到350公里,步行也仅需十天。这样有利的环境,对于先进文化、科技的传播当然是十分有利的。各先进民族之间的战争,促使他们不断改良武器,所以铁兵器最先在两河流域得到普及,一点不奇怪。

而在两河流域之后领先世界的南欧文明,也是便利交通的受益者。希腊、罗马所在的地中海是一个内海,相对中国的东海、南海来说风平浪静,对上古简陋的桨船航行十分有利,而在近代铁路发展起来之前,海运的运费仅是同等距离陆上运输的1/30,发达的海运对于希腊、罗马的经济和对外交往来说,都起了很大的促进作用。欧洲文明的发展,从来没有与其他文明截然分开过。希腊人对巴比伦和凯美都十分熟悉,对遥远的印度也不陌生。他们的学者中很多人去过凯美和巴比伦(最著名的是测量金字塔高度的泰勒斯),甚至可能有人去过印度(即毕达哥拉斯),这种文明间充分交流的场景,对于古代中国人来说是不可想象的。而波希战争、亚历山大东征、罗马对凯美的征服和对两河流域的远征,更是先进文明之间军事文化与科技的直接碰撞,迸发出了光耀千古的火花。欧洲人较早的普及了铁兵器,当然是顺理成章的事情。

令我奇怪的不是中国在近代落后,而是中国在封建时代竟然能够领先世界一千两百多年。细细想来,中国相对闭塞的环境固然不利于文明交流,但却也阻止了外来先进文明的冲击,使中国人可以安全的沿自己的道路走下去。尽管走得慢,但一直走下去,总可以得到成果。当两河流域因生态破坏而风光不再,当欧洲在基督教的统治下变得极度愚昧的时候,中国人的机会就来了。而中国在世界上由落后变成先进的标志物,就是钢铁兵器的普及。这点,下面还要讲到。

第二个原因是中国的锡矿丰富(探明储量居世界首位),铜矿、铅矿也较多,使得青铜器的制造相对较易,质量较高。压制了早期不完善的铁兵器。

早在商朝,中国人就铸造了重832.84公斤的司母戊大方鼎,显示出中国人在冶金技术方面的出色才能。后来,制造青铜兵器基本上使用的也是浇铸法。在长期摸索的过程中,中国人逐渐改进了铸造工艺和其他加工工艺,使得中国青铜兵器的质量得以达到青铜材料所能支持的极致。例如前面所说的复合剑,就是一个杰出的成果。中国人还有一些令人感到费解的发明:越王勾践剑历经两千五百年岁月,出土时依然光亮无锈迹。据分析该剑进行过表面硫化处理。如果说这是一个孤证的话,那么后来发生的事情就更离奇:在嬴政陵兵马俑出土的两柄秦剑也同样毫无锈迹,锋利如初。经分析,这两柄剑进行过表面铬酸盐氧化处理。要知道,现代的铬盐处理法是在二十世纪三十年代由德国发明的!虽然古代中国人用什么办法得到了铬盐处理的效果现在仍不清楚,但可以肯定这种方法是有效的(当然,如果以后证明这些剑不锈仅仅是巧合或其他非技术原因除外)。同时,中国青铜剑的长度也是世界之最(最长94.8厘米)。这么出色的青铜兵器,当然能够与早期产量低,质量不保证的铁兵器抗衡,甚至胜过。其实,在战国时代,铜铁经常合用在箭头上,负责杀伤的镞由铜铸造,而附件铤则由铁制造。这雄辩的表明当时的铁镞不如铜镞锋利。

第三个原因,也是根本的原因:中国铁矿石的品质低劣。

在讨论中国铁兵器取代铜兵器的问题时,人们常常忽略一个最基本却也是最重要的常识:一个国家的技术发展,直接受其境内自然环境和资源状况的制约。如果说历史学家很少谈及这点,是因为他们认为这种常识没有必要专门讲的话,那么在网上有些青年历史爱好者也很少谈及这点,恐怕就是因为没有受到过专门的历史基础教育和太过浮躁、不愿“钻”下去看书,因而知识储备量不足的缘故。

在科学还没有诞生的古代,无论是农业、商业还是手工业,都处于“靠天吃饭”的状态中。一个国家的某项事业是否兴旺,首先取决于该国有没有从事这种事业的自然条件。所以,凭借便利的交通和较少的人口,雅典可以用古代海商业来支持国家经济,而离东地中海商业要道相对较远,人口相对较多的罗马就不能;雨量适中,土地肥沃的中国可以发展出发达的农业,而极端干旱,遍地沙漠的阿拉伯就不能;银储量极多的阿兹特克可以将银作为货币和普通的饰物,而缺乏银矿的中国显然不能。

冶铁业也不能例外,虽然铁在地球上是一种常见的金属,但本国铁矿脉的大小、铁矿石的质量好坏、铁矿开采的难度,仍然是制约一个国家冶铁工业的首要自然资源条件。铁资源质量好、数量大的俄罗斯、印度、澳大利亚、巴西,是铁矿石的重要出口国;英、法、德、三国之所以能够建立起发达的资本主义工业,重要的原因在于它们都是铁资源丰富的国家;而历史上的名刀,其原料必然来自铁矿石质量优越的地区,如印度、日本。

在铁兵器使用初期,人们都还没有熟练掌握冶铁技术,谈不上用专门的冶金工艺来改善铁器性能,这时,铁矿石质量的好坏便直接决定了铁兵器质量的好坏。对于世界上其他文明古国来说,这不是一个问题,因为铁矿是相当常见的,并且,世界铁矿的一般水平是富矿占矿产总量的50-60%左右,也就是说,一般人们开两个矿,就会遇到一个富矿。富矿的矿石含杂质少、易于锻造、制出的铁器性坚韧,对于制造铁兵器相当有利。即使是块炼铁,也能够压倒青铜兵器(各文明古国的青铜兵器都没能够发展到象中国那种水平)。所以各文明古国接受了先进文明传来的冶铁技术之后,在本国富铁矿的支持下,都很快的用铁兵器取代了铜兵器。

中国却与众不同。其自然资源具有这样几个特点:贫矿、难选矿、综合矿多,富矿、易选矿、单一矿少。而铁资源正是最好的例子:蕴藏量虽多(探明储量501亿吨),但易采易选的贫矿多、需综合利用的多组分矿石多、富铁矿资源少、可直接入炉的高炉富铁矿不到探明总储量的3%!并且矿石普遍含有较多杂质,如硫、磷等,甚至有少数矿石含有铀元素,硫会使铁变脆,在稀土族元素被利用到冶铁业之前,一直是该行业的梦魇。

现在就战国时期主要的几个大国境内的铁资源情况作逐一介绍,以使网友们了解铁器取代铜器时期华夏人所面临的特殊困难:

楚所在的湖南,1992年底探明储量中,高炉富铁矿仅占综合保有储量的0.91%,在工业储量中仅占0.86%。难选的沉积变质赤-磁铁矿及赤铁矿贫矿占72% 。

韩国所在的河南,探明储量10.98亿吨,保有储量10.63亿吨,其中96.2%为贫矿。185处铁矿中,富矿产地仅9处,储量3672.3万吨,贫矿石+需选的高炉高硫、高炉高磷矿石共计占矿石总量的99.74%,平炉富矿仅274.3万吨,只占矿石总量的0.26%。矽卡岩型铁矿位于安阳、林县、桐柏、沁阳等地,矿石相对较富,成为韩、楚两国素称锋利的铁兵器的重要原料产地。

燕所在的河北:1990年底,累计探明储量82.9亿吨,其中工业储量(A+B+C 级)42.5亿吨,贫矿77.1亿吨,占总量的99.6%,但易采、易选、具有较高开采价值,在开矿技术原始的古代,这成为燕国制造铁兵器的一个优势。富矿保有量仅0.3亿吨,占总量的 0.4%。

吴、越及后来的楚国的辖地浙江,全省探明储量9850.4吨,A+B+C 级储量4681.3万吨,D 级储量5169.1万吨,保有储量7454.2万吨,其中 A+B+C 级2440.1万吨,D 级5014.1 万吨。该省的铁资源较少。

秦国所在的陕西,全省探明储量6.50亿吨,其中0.2%为富矿,富矿占资源总蕴藏量的1.33%。并且陕西铁矿多位于秦巴山地,开采不易。这就是嬴政陵出土铁兵器仅相当于铜兵器数量万分之一的重要原因。

中国缺乏富铁矿的现状是由中国地质发育的特点决定的。首先,中国缺少形成大型风化壳型矿的物质基础,目前在南方尚未发现形成该类型铁矿所需的18-25亿年前的地层。在北方该时代地层很不完整,支离破碎,面积不大;其次中国发现的大量贫铁矿虽形成于25亿年前,但变质很深,抗风化力强,缺少长期风化淋滤的地质环境。只有新疆存在38亿年前的地层,面积占全疆1/4,还有可能找到大型富铁矿。不过这跟中国铁兵器取代铜兵器的历史没有一点关系。

目前世界上拥有富铁矿最多的前苏联地区、澳大利亚、巴西、印度,都具有大型、特大型风化壳型优质富铁矿。在历史上,印度是大马士革钢的产地。而苏联的钢甲在二战中是世界闻名的。

很显然,在没有科学的古代,中国人是无法象现代这样选矿的,也不可能利用商业引进数量足够的铁矿石。唯一的办法只有尽量利用现有的贫矿。对于农具和工具来说,中国铁主要的问题:脆,并不是太大的缺点。因为农具要对付的不过是土地和草木,折断的危险很小;工具中很多对付的也不过是木头,即使用于金属加工的工具,如在铜器上刻画的铁刀,也不会遇到横向的冲击力,折断的危险同样很小,并且铁凿、铁刀之类工具,要求能破开石头或割入铜器,硬度的要求才是第一位的。而且,下面还要讲到,中国人还对生铁技术进行了有效的改进。

但兵器则不然,对于剑、戈、戟等武器来说,它们经常彼此碰击,因此不能够脆,必须坚韧。然而,中国贫铁矿中的杂质,使得铁器的机械性能极差,在块炼铁时代,这个缺点更加显得突出。因此在中国人还没有发展出足够先进的冶铁技术之前,中国地区只能利用极少数富矿中的矿石来锻造兵器,在这种情况下,战国时期及以前的铁兵器不可能普及,它们只是战争舞台上的配角。

本节参考书:

《中国自然资源丛书》, 中国自然资源丛书编撰委员会编著, 中国环境科学出版社1994年开始出版, 综合、矿产、湖北、湖南、河北、河南、浙江、陕西诸卷

青年文库之《中国地理知识》分册 , 第316-320页、第330-333页,《矿产知识》分册

《失落的文明》丛书 , 巴比伦、古希腊、古罗马、犹太王国各卷

《中国地图册》,地图出版社1966年第一版, 1979年12月第四版, 1981年12月山西第11次印刷

《世界地图册》(压膜本), 地图出版社编制出版, 1972年7月第2版, 1982年8月西安第4次印刷

剑胆琴心——中国青铜剑第一网, 网址:jdqx21cn.nease.net

(5) 中国人为改变命运而进行的努力

恩格斯说:“最初的铁往往比青铜软,所以石器只是慢慢消失的。”这是欧洲的情况,而在中国,铁工具和农具普及较快,兵器却普及较慢。

中国绝大多数的铁矿石品质都很恶劣,但偶然遇到富矿而打造出来的铁兵器的锋利坚固,仍给中国人以很深的印象(这成为那些铁剑传奇的最初来源),他们开始尝试着使用铁兵器。为了使铁兵器变得像传说中的神剑那样优秀,工匠们进行了不懈的努力。

铁(繁体字为“鐵”)音tie3,化学元素[周期系第Ⅷ族(类)元素]符号Fe,原子序数26,银白色。相对密度7.86。延展性良好。纯铁的磁化和去磁都很快。含杂质的铁在潮湿空气中易生锈。溶于稀酸,浓硝酸或冷的浓硫酸能使铁纯化。加热时能同卤素、硫、磷、硅、碳等非金属反应,但同氮不能直接化合。氮化铁需在氮气中加热生成。铁的化合价一般为+3价和+2价。重要矿物有磁铁矿、赤铁矿、褐铁矿、菱铁矿、黄铁矿、铬铁矿等。中国铁矿储藏量丰富,但贫矿占绝大多数。纯铁可以用氢气使纯氧化铁还原而得。工业用铁是将铁矿石、焦炭和助燃剂(如石灰石等)置于高炉中冶炼而得,其中常含有碳、硫、磷、硅等元素。根据含碳量不同,可分为生铁(亦称“铸铁”含碳2%以上)、工业纯铁(含碳量一般在0.025%以下)和钢(含碳量在0.025%-2%之间)纯铁用于制造发电机和电动机的铁芯,铁粉用于粉末冶金,钢铁用于制造机器和工具。铁及其化合物还用于制磁铁、药物、墨水、颜料、磨料、染料等。铁是铁器时代之后经济建设和军事建设最重要的金属,并且是生命必须的微量营养元素。

生铁:含碳2%以上的铁碳合金,由铁矿石在高炉内冶炼而成。除碳外,还含有硅、锰及少量磷、硫和其他元素。特点是性硬而脆、不能展延、锻造。

熟铁:又称锻铁,含碳0.2%以下。由铁矿石用碳直接还原,或由生铁经过溶化并将杂质氧化得到的产物。前者冶炼温度很低,采用较早,后者温度较高,但生铁去碳后由于熔点增高而变稠。两者都不易使杂质同铁完全分离,所以固体中常含有少量的渣,在加工之后显示纤维组织。特点与生铁正好相反:较软,但延展性佳。

钢:含碳含碳量在0.025%-2%之间的铁基合金的总称。常含有锰(一般含量0.1%~2%)、硅(一般含0.4%以下)、磷、硫(两者一般各不超过0.05%)等杂质。不含合金元素的钢称为碳素钢。含有一种或以上合金元素的钢称为合金钢。钢兼具硬度和延展性,是最理想的冷兵器材料。

自然界中没有天然铁块,人类最初使用的是陨铁,陨铁就其性能来说,并不理想。而且来源没有保证,显然不能取代青铜。中国在前13世纪已经有了铜柄陨铁刃的大斧,但之后4个世纪都没有其他铁器发现,证明了陨铁不被人重视。

后来,两河流域的人们使用了块炼铁技术。此法以地炉、竖炉为之。地炉的直径一般为40厘米,深20厘米。冶炼时铺一层木炭,铺一层铁矿石,再铺一层木炭,这样一层一层地堆积起来,然后将木炭点燃,冶炼后取出全部炉料,经过锻打分离炼渣,或者先行破碎,分选之后烧结锻造成锭。铁矿石中的铁一般呈氧化物状态。在一定温度下,铁矿石中的氧化铁与还原剂(木炭及其它燃烧物所产生的一氧化碳)接触,便可逐渐还原为铁。大约500-600度以上开始还原,到1000度左右,就可以得到含碳量很低的固体铁块。这种铁块是软的、海绵似的熟铁块,结构疏松,表面有很多孔隙。孔隙中夹有矿石本身存在的许多氧化物,需要在锻铁炉中烧红后,经过不断锻打,才能挤出一部分或大部分杂质,取得较纯的熟铁块,锻造成各种铁器。

块炼铁无论是在外国还是在中国都首先被运用在兵器上。目前出土的中国最早的铁剑的时代是西周晚期,因此可以审慎的把中国块炼铁技术出现的时间定在西周早期,只是由于前面说过的原因,这项技术长期没有推广,铁兵器开始受到中国人重视是在几百年后的春秋晚期。

在块炼铁多次加热中由于同炉火接触而触碳变硬,人们由此逐渐总结出了块炼铁渗碳增成钢的经验,即“块炼钢”冶炼技术。渗碳、反复叠打、快冷或淬火都可以使钢铁变硬。在14世纪之前,块炼铁/钢法一直是中国文化圈以外用铁民族普遍采用的炼铁方法。

中国最初使用的也是块炼铁法,但在前六世纪左右已经发明了生铁铸造法。目前发现最早的生铁制造物是江苏六合县东周墓出土的铁丸。最早的铸铁器是在长沙窑岭一座春秋战国期间墓中出土的由麻口铁铸成的铁鼎。

生铁由铁矿石和木炭在高大的炉内通过高温熔炼而成。在冶炼过程中铁矿石(各种氧化铁)在一定温度下与高温还原剂(木炭及其燃烧产物一氧化碳)接触,就可以逐步的还原出金属铁。还原生成的固态铁吸收碳后,熔点也随之降低。当含碳量达到2%时,熔点降至1380摄氏度。当含碳量达2%时,熔点达到至低点1146摄氏度。利用鼓风技术使炉温升高到1100-1200摄氏度以上,可得到液态铁水流集于炉底,其上覆盖的一层铁渣保护铁水不再被氧化。铁水从炉底流出冷却成块,就是生铁。

生铁含碳量较高,质硬而脆,最初只能用来铸造一些粗笨的东西,如铁鼎之类。锤锻则易坏。显然,用它来制造兵器是不可能的。

在得到块炼铁技术后不久就发展出了生铁铸造技术是中国的特有现象。罗马人也曾偶然炼出过生铁,但却把它当作废品抛弃了。大概其他国家看不上这种不能做兵器的脆铁,而中国人意识到了它在生产方面的巨大作用。并且中国的青铜铸造技术也是比较先进的,其中对生铁铸造十分有用的是鼓风技术。最早的鼓风工具是一种用牛皮制成的大皮囊,叫做“橐”。人们手拿橐的把手,使它一张一合,把风鼓入炉中,把炭火吹旺,使金属熔化。开始是一人一橐,通过一个进风管鼓风。大约在春秋末期,又发明了多管鼓风方法,就是把许多橐排起来,通过几个进风管,一起向炉里鼓风。这种多管鼓风工具就叫做“排橐”。中国人很聪明的把青铜铸造术“嫁接”到冶铁上面,使生产力得到了极大提高。后来又出现了用畜力代替人力的鼓风机具,叫做“马排”。但是所花费的畜力也相当可观,据古书记载,熔化一次矿石,需要上百匹马来拉鼓风机。耶元31年,南阳太守杜诗召集工匠,组织设计、制造了水排,即水力鼓风机。水排能够节省人力、畜力,降低建立大型冶炼场的成本。鼓风技术的出现和改进对于提高炉温是不可缺少的。

不过正如前面所说,生铁铸造兵器是不可能的,解决的办法有三种。

第一种是两河流域的老办法:块炼钢技术。这是最可靠、最成熟的一种办法。中国人利用了它。1976年在长沙杨家山春秋晚期墓中出土的钢剑,是这种技术的证明。它长38.41厘米,宽2-2.6厘米。从剑身断面上可以看出反复锻打的层次,中部由7-9层迭打而成。这是用块炼铁打成片后进行固体表面渗碳,使两面形成高碳层,中间夹着低碳层,经过对折锻合,并用若干片迭搭锻打成长剑,钢的含碳量为0.5%-0.6%,金相组织均匀,可能进行过热处理。这把剑的制作工艺可以使我们联想到同期中国的复合剑。

第二种是钢铁热处理技术。早期生铁为白口铁,其中的碳都以硬度很高的化合态的渗碳体形态存在的,使生铁性硬而脆,铸造性能好,但强度不够,为克服其脆性,战国早期创造了白口铁柔化处理技术。所谓“柔化”就是将生铁铸件进行退火处理,即将生铁铸件加热到高温,保持较长的时间缓缓冷却,就会适当降低其硬度和脆性,增加其可塑性和冲击韧性,从而得到可锻铸件。依处理条件不同可以分为白心韧性铸铁和黑心韧性铸铁。前者是在大约750摄氏度左右的较低温度下进行退火脱碳处理而得到的白心韧性铸件,也叫做脱碳可锻铸铁;后者是在900摄氏度左右较高退火温度和3-5天较长退火时间处理下,使渗碳体石墨化而生成的黑心韧性铸件,也叫石墨化可锻铸件,石墨以团絮状存在。

这种经退火而使铸件柔化的技术,既保持了生铁易于铸造的优点,又增强了铸件的强度及韧性,刚柔结合,大大增加了铁器使用的寿命,使生铁的广泛运用成为可能,加快了铁器代替青铜器的历史过程,战国中晚期,这种工艺较普遍的应用到农具和兵器的生产上,大冶铜绿山、河北易县燕下都出土的铁锤、斧、锄、镢、锛、(钅尃)、(钅尊)等礼器、用具、工具、农具,是钢铁热处理技术这时已经存在的证据。

中国人在生铁技术上的天才是令人惊讶的,我们可以比较一下,在世界上第二个发明白心韧性铸铁的是法国,在1722年;而黑心韧性铸铁是由美国第二个发明的,在1826年。

然而,经过热处理的生铁,终究也只是生铁,还是不很合适制造兵器,对于兵器来说,最理想的是材料是钢。中国人很快又发现:含碳量高的白口生铁铸件,在氧化性气氛中脱碳退火,将含碳量降低到钢的范围,而不析出或很少析出石墨,也可以得到钢。铸铁脱碳钢技术在战国初出现,洛阳水泥制品厂出土的战国早期铁锛,就属于铸铁脱碳钢技术早期的产品。

问题依然存在:块炼渗碳钢件或退火过分的铸铁脱碳钢件,坚硬程度可能不足,这就迫使人们在实践中摸索出钢的淬火处理工艺,钢的应用和淬火是分不开的。战国晚期,淬火技术得到运用。所谓淬火,指钢件加热到高温之后使之急速冷却(常见的是浸入冷水或冷油中)经淬火处理的钢件,质地就变得坚硬,如是兵器,刃部将更锋利。淬火的冷却剂,起初都用水,后来拓展到动物脂肪和尿。尿中含盐分,冷却能力比水强;用脂肪淬火,高温时冷却快,低温时冷却慢,用这两样东西淬火,可能得到性能良好的钢件制品。燕下都的铁兵器都经过淬火处理。

如上所述,到了战国后期,制造兵器的钢铁的冶炼技术难关已经逐步被攻克,中国铁矿石品质低劣的困难初步被克服。铁兵器普及已经不存在大的问题了。这时,铁兵器终于可以与铜兵器一较短长。但自然资源条件这个问题再一次显示了它的威力。还是因为铁矿石的品质问题,经过多次改进的中国铁兵器在生产性能上已经超过铜兵器,但在锋利程度上还不能完全压倒成熟的铜兵器。很显然,不在质量上进一步提高,铁兵器的优势就不能完全发挥。

汉代,决定性的转变终于到来了。

西汉的铁产量进一步提高。原因在于高炉的普及。高炉用于冶炼生铁。从上面装料,下部鼓风,形成炉料下降,煤气上升的相对运动。燃料产生的高温煤气穿过料层上升,把热量传给炉料,其中所含一氧化碳同时对氧化铁起还原作用。这样燃料燃烧的热能和化学能同时得到比较充分的利用。下层的炉料被逐渐还原以至溶化。上层的炉料便从炉顶徐徐下降,燃料被预热而能达到更高的燃烧温度。

汉代的高炉有圆形截面、椭圆形截面两种。汉代的冶铁遗址中都有高炉残迹。圆形截面高炉的直径有1.8米的、1.6米的、1.3~1.5米之间的。高1米以上至2米。椭圆高炉的短轴有2.2~2.4米,长轴2.4-3米。当时还出现了直径4米,高达5~6米,有效容积五十立方米左右的巨型高炉。

显然,这种炉的效率比起容积小、炼出铁后必须拆毁炉具才能得到铁块的地炉、竖炉要高得多,由于高炉的普及,中国的农具和工具终于完全实现了铁器化。

另一方面,战国时期出现的钢铁热处理技术和淬火技术已经成熟,并发展出了第三种解决兵器材质问题的方法:使用新技术炼钢。

最早出现的炼钢新方法是百炼钢技术。所谓“百炼钢”,就是将块炼铁反复加热折叠锻打,使钢的组织致密、成份均匀,杂质减少,从而提高钢的质量。用百炼钢技术制造的刀剑,质量上完全无可挑剔,轻易的压倒了青铜剑。“百炼钢刀”成为了宝刀的代名词。

百炼钢技术的孕育时间是西汉,刘胜墓中的佩剑、钢剑和错金宝刀,虽与易县燕下都钢剑所用的冶炼原料相同,但金相检查表明,钢的质量却有显著的提高,它正是 “百炼钢”技术雏形的产物。这一技术的成熟和逐渐普及是在东汉。1974年,山东省临沂地区苍山汉墓中,出土了一把112年制造的钢刀,全长111.5厘米,刀背有错金铭文:“永初六年五月丙午造卅湅大刀吉羊宜子孙”。“湅”,即是炼的意思。这是迄今为止发掘出的最早的百炼钢类型的产品。检验表明,这把钢刀含碳量比较均匀,刃部经过淬水,所含杂质与现代熟铁相似。百炼钢在东汉之后仍继续发展。三国时代,魏、蜀、吴的君主都配有百炼钢刀。直到北宋,沈括仍在《梦溪笔谈》中描述了磁州制造百炼钢的工艺。并且传到了日本,著名的日本武士刀中被称为宝刀的,制作时采用的实际上都是百炼钢技术。

百炼钢的名字由来,研究者一般认为是指加热的次数。即加热了一百次,同时反复折叠锻打了一百次的钢。不过根据现代科学我们知道:如果钢果真加热锤打了这么多次,其性能不仅不会提高,反而会下降(即变成了熟铁),而性能最好的是三十炼钢。实际上,考古发现的百炼钢刀,其炼数很少有超过三十炼的,说明古人也了解这点。

从百炼钢的工艺我们可以发现,这种技术与块炼钢技术差别不大,甚至可以说只是一种改进过的块炼钢技术。因此它也保留了块炼钢技术的主要缺点——耗费工时,其制作方法甚至到了极为繁琐的程度。例如,曹操命工匠制造五把宝刀,据说工匠花了三年才造好。这样的速度,用来造帝王将相的宝刀则可,如果想大规模装备钢兵器,用这种方法是不可能的。

中国人大概早就清楚这点,大约在百炼钢技术产生的同时,炒钢技术也出现了。炒钢,就是把生铁加热到熔化或基本熔化之后,在熔炉中加以搅拌,借空气中的氧把生铁中所含的碳化掉,从而得到钢。因为搅拌过程跟“炒”这种烹饪方式相似而得名。炒钢技术这一发明的重要性对中国军队来说远远超过百炼钢,因为炒钢技术相对节省工时,可以大量制造出兵器用钢材,对于人数众多的中军非常有用。

不过炒钢技术的普及比百炼钢还慢,一直到三国时代,炒钢仍然是只有少数熟练工匠才能掌握的“绝技”。据说蒲元就是这样的专家。他曾给蜀相诸葛亮督造过宝刀。不久,一种更简便的炼钢方法又出现了,这就是灌钢法。所谓灌钢,就是将生铁和熟铁一起加热,让先熔化的生铁液灌入疏松的熟铁的空隙中,使熟铁增加碳分变成钢材。南朝齐、梁时的陶弘景(约452-536年)著有《古今刀剑录》一书,首先记载了灌钢法。他写道:“(灌钢是)杂炼生(钅柔)所作”。北朝魏、齐间的泰母怀文曾用这种方法制成十分锋利的“宿铁刀”,“斩甲过三十札”非常锋利。不过关于灌钢的质量也有不同的说法。沈括说:“世間所謂鋼鐵者用柔鉄取盆之謂之團鋼亦謂之灌鋼此乃偽鋼耳暫假生鐵以爲堅二三煉則生鐵自熟仍是柔鉄然而天下莫以爲非者蓋未識真鋼耳”。他极力推崇百炼钢。不过从这里也可以知道,北宋时中国已经普遍采用灌钢法了。

灌钢法之后,中国钢铁技术基本上就没有什么大的发展了,直到明中期以后,灌钢法才进一步发展为苏钢法。这种方法因在苏州首先使用而得名。苏钢法以熟铁为料铁,置于炉中,而将生铁板放在炉口,当炉温升高到摄氏1300度左右,生铁板开始熔化时,即用火钳夹住生铁板左右移动,并不断翻动料铁,使料铁均匀地受到滴下的生铁液;这样,既可产生很好的渗碳作用,又可产生剧烈的氧化作用,使铁和渣分离,生产出含渣少而成分均匀的钢材。这种冶炼法显然比较先进,不过这时中国已经开始衰落了。到1740年,欧洲发明了近代坩埚炼钢法,一举从中国人手里夺去了冶铁技术的桂冠。

从铁器时代初期来看,中国普及铁兵器的关键技术主要是鼓风技术、生铁冶炼、钢铁热处理、淬火、高炉的运用。在这几项技术成熟之前,以中国质量恶劣的铁矿石,想普及铁兵器是不可能的。

在西汉,中国人还可能发明了球墨铸铁,如果是真的,这是一项超越时代的发明。不过跟兵器关系不大,因此就略去不介绍了。

“福兮祸所倚,祸兮福所倚”,中国品质低劣的铁矿,却迫使中国人发展出了世界领先的冶铁技术,不过我们要注意三点:第一,在没有科学的古代,用上列各种冶金技术冶炼出来的钢铁,其性能水平完全取决于工匠的熟练程度、冶炼地的自然条件、原料的天然质量等不确定因素,质量是很难保证的。如炒钢就容易出现“一炒到底”的情况,即把生铁炒成了熟铁;太高大的高炉很容易发生爆炸事故,因此大多数高炉都不大;百炼钢炼数过多性能反而下降;灌钢法正如沈括所说,炼出的钢质量叫人怀疑···在古代,唯一比较可靠的大概就是最简单的生铁铸造和块炼铁技术了。第二,古代没有专利制度,为了维护自己的利益,各种技术的发明者和掌握者大多仅将技术进行单线式的师徒、父子相传。这种传承方式很难推广和提高技术,有时候甚至造成了技术的倒退和失传。第三,古代关于铁兵器的各种传说,例如干将莫邪之类,其来源是对富矿铁兵器性能的崇拜。这种传说及演化出来的文学作品,可能有其文学价值,但对于铁兵器的发展很本没有好处,而只有误导作用,例如十分荒谬的“三百童男女鼓风”,其实每个现代人都知道,三百个少年男女鼓风,还不如一百头驴子有效。

在与中国之外的著名铁兵器,如武士刀、大马士革钢刀较量时,中国人惊愕的发现,自己用先进冶铁技术制造的武器并没有取得优势。大马士革钢刀和制作精良的日本武士刀,都能够砍断中国的钢刀!这恐怕也是因为印度和日本的铁矿石质量远优于中国的缘故。这种情况还证实了我的推断——中国的冶铁技术始终存在问题。

参考书:

《马克思恩格斯选集》第四卷, 第159页

《简明五金手册》修订版, 简光沂、王仁豹、李耀天、陈其安编, 北京出版社1983年10月第一版, 1991年6月第2版第1次印刷

《钢材实用手册》, 陆友琪、马二恩、郭铁成、王毅昌编、中国科学技术出版社1991年4月第1版

《辞海》, 上海辞书出版社, 1999年版, 第4593、4642、4577、4248页

《中国大百科全书》矿冶卷, 中国大百科全书出版社1984年9月出版

《中国青铜时代》, 张光直, 生活、读书、新知三联书店1983年出版

《中国全史》中国春秋战国科技史, 申先甲著, 人民出版社1994年1月出版, 第20-23页

《中国秦汉科技史》, 董粉和著, 第123页

《中国科学技术史》军事科学卷, 王兆春著, 科学出版社, 1998年8月第一版, 第62-63页

tom 科普频道, 网址 http://www.scitom.com.cn/home.html

人教网, 网址 http://www.pep.com.cn/index.htm

中学化学资源网, 网址 http://huaxue.hxtoy.com.cn/

钱伟华工作室, 网址http://dreamofeast.com/study/workroom/teacher/qianweihua/

《新校正梦溪笔谈》, 胡道静校注, 中华书局1957年11月第一版, 卷三, 辨证一

(6) 关于世界及中国铁兵器普及时间的合理结论

考古学家在地中海和近东地区,发现了耶元前3000年的铁器共十四件。其中一件为人工冶炼,4件为陨铁制品,其余情况不明。这些都是目前所知道最早的铁器。前2000年,亚美尼亚山地的基兹温达部落掌握了炼铁技术。最先制造的是铁兵器。从此铁兵器被当作珍品在两河流域各国之间流通。赫梯人在前1400年、腓尼基人和亚述人在前1300年已经普遍使用了铁器。赫梯衰落之后,它的工匠带着冶铁技术自愿或被迫的四处迁徙,扩大了冶铁技术的传播范围。前9世纪,古国亚述成为世界上第一个普遍使用铁兵器的国家。这成为它振兴的重要原因。在与亚述的战争中,新月沃地诸文明得到了血的教训,也纷纷普及铁兵器。用铁的潮流从这时起向外扩散。前九世纪,凯美开始进入铁器时代;黑人地区直到耶元后才开始冶炼铁器;印度何时进入铁器时代不详,目前可以确定的是在孔雀王朝初期,印度已经普及了铁器;东南亚普及铁器是在中国和印度的影响下才实现的;中亚游牧民族接受铁器较早,大概在亚述帝国之前就已经得到一些铁兵器了,前七世纪,他们开始冶炼铁器;美洲、大洋洲广大地区在近代之前始终没有使用铁器。

前14世纪,通过海上民族腓尼基人,铁器传入欧洲。目前发现的希腊最早的铁剑是前11世纪时锻造的,比中国早至少300年。从这时起,希腊开始向铁器时代迈进,希腊有充足的铁矿,如著名的拉夫里昂铁矿。因此,历经荷马时代和古风时代,到前六世纪,希腊的铁器化基本完成。几乎与希腊同时,意大利也拉开了铁器时代的序幕,到了王政时代,罗马的铁器化也基本完成。但罗马有一个不利于普及铁器的弱点:铁矿不多。所以在征服西班牙之前,其铁兵器和铁工具、农具的普及受到了限制,但在各国铁产量和需求量均不大的古代,这是可以忽略的。另一方面,斯基泰人凭借东欧极为丰富的富铁矿资源,将冶铁技术迅速向西传播。中欧诸“蛮族”在匈牙利草原上接受了这种技术,由于中、西、北欧铁矿都多而富,各“蛮族”虽然文化经济落后,但依然在短短两百年间普及了铁器(前八-前六世纪)。最后一个青铜器据点——不列颠,也在前五世纪完成了铁器化。至此,全欧洲都进入了铁器时代。

欧洲铁器时代的情况与其他文明基本类似,即铁兵器普及而铁工具和农具没有普及。原因在于中国地区以外的国家在14世纪之前一直仅掌握块炼铁/钢技术,这对于大量生产铁器十分不利,因此只能把有限的产铁量集中到兵器方面。直到14世纪,欧洲人仍然大量使用木、石农、工具。欧洲铁器时代的特点是从青铜时代向铁器时代的进展特别迅速。这要归功于欧洲丰富而优良的铁矿资源。

与欧洲相比,中国的铁器之路就坎坷漫长得多。中国最早的陨铁制品出现在前十三世纪(河北藁城、北京平谷出土过商代的铁刃铜钺),并不比欧洲晚多少,但后来就长期沉寂。看来当时中国人对铁的冶炼方法还一无所知。直到西周末期,才开始炼铁。在这过程中,可以肯定中国地区得到了两河流域的冶铁技术,可能正是两河技术的引进,才结束了中国人不知道用铁的时代。在这五百年间,中国人为自己的闭塞付出了代价:在商代原本已经成为先进文明之一的中国地区,再次落后了。

中国开始炼铁之后,发现当地铁矿炼出的铁质量很坏,完全无法与青铜相比,铁在中国被鄙夷的称为“恶金”。但偶然炼出的几柄好铁兵器又是那么的令人念念不忘,神剑传说开始在华夏大地上流传(中国人不知道那是富矿的产物)。为了炼出传说中的神兵,工匠们开始努力。很自然的,他们必然借鉴青铜时代的经验。这一过程持续了很久,直到春秋末期,中国人都没有能够克服恶劣的铁矿的影响。青铜兵器继续占据中国所有的武器库,只有很少的富矿铁兵器作为稀世宝物点缀在军队中。不过这时炼制铁兵器的副产品——生铁铸造技术,开始发挥其在生产方面巨大的作用。

生铁技术迎来了战国时代,这项技术改变了中国的命运。随着铁农具和工具的运用,华夏诸国的生产力大大提高,并带动了经济、文化和政治的突变。正如郭沫若所说:整个中国都沸腾起来了。生铁铸造是中国最重要的发明之一。

同时,武器工匠仍在努力。他们终于发现了钢铁热处理技术,这种技术与块炼钢技术结合,已经能够满足军队的要求。这样,到了战国中后期,铁兵器普及的障碍被克服了。

但一项新技术要普及,必须经过经验的积累,在没有科学的古代更是如此。刚刚发展出来的钢铁热处理技术必须等待其成熟后才能占据优势。这时的青铜兵器也发展到了性能的极致。在成熟、实用的铜兵器与不甚可靠的铁兵器之间,各国统治者选择了前者。

西汉是决定性的转变时期,这时的钢铁技术已经十分成熟,制造的铁兵器显然已经在性能上压倒了铜兵器,并且青铜已经发展到了其性能的极限,而铁的潜力却深不可测。人们对铁的感情倾向已经由原来的轻蔑厌恶变成了赞赏,这时军队使用铜兵器在很大程度上已经只是一个习惯问题了。

刘彻皇帝继位后,中国开始向外大肆扩张。铜兵器在对付西北各国的铁兵器时缺点暴露无遗:昂贵,性能却仅能勉强与对手保持平衡。前104-101年,中军侵攻大宛,大宛军在希腊化战术和武器的支持下,抗拒中军,最后虽然失败,但得以保全自己的国家,中军死伤惨重。而铁兵器的表现却不然,中国精锐的“玄甲军”(即披挂黑色铁甲的骑兵),在入侵匈国的战争中发挥了很大作用。根据射声校尉陈汤的说法,中军与匈军的战斗力对比是一敌五,很显然,用铁兵器才能得到这种效果。于是,刘彻皇帝做出了重要的决策:盐铁官营。不可避免的,在专制社会中,官营经济的弊病很大,如当时铁官只愿意制造利润丰厚的“大器”,不愿造利润少的“小器”,使得有的穷人只好用手拔草。但在铁器时代的这个关键时刻,铁专营确实是个英明的决定。首先,人民不得不购买大型的犁,耜之类落后的木器、石器终于消失。

其次,铁兵器产量激增,铁兵取代铜兵的历史脚步终于迈开了。在刘彻之前,铜兵器还多过铁兵器,在他之后,铁兵器就多过了铜兵器。并且,在个人经营时代,各地满是小作坊,作坊主只愿意生产可靠、成本低、市场大的生铁。而铁专营之后,技术复杂、成本高的兵器专用钢铁的生产就有了保证。在中国铁兵器史上,刘彻是贡献最大的人物之一。

刘彻之后铁兵器的普及只是时间问题了。到了新朝,也就是刘彻死后不到一百年,铁兵器的普及终于完成。只是弩机因为工艺不过关的缘故,一直用青铜生产到魏晋,成为青铜兵器的最后孑遗。
炒钢、百炼钢、灌钢等技术,反映了中国人的高度智慧。不过严格来说,这些技术成熟得太晚,与铁兵器取代铜兵器的历史关系不大。

中国铁器时代的特点是:一. 铁器普及时间晚。工具、农具是在前4-3世纪普及;兵器更是晚到了前1世纪。是五大文明古国中最晚的一个。二. 铁制工、农具比铁兵器早普及。以上这两个特点的形成原因前几节已经说明了。三. 铁生产量过剩。在中国古代的绝大部分时间,全中国每年只需要5-7万吨钢铁产量就够了,但大部分的年份里,生产钢铁的数量都超过这个数字。使得历朝朝廷只好常常关闭矿山和冶炼场。看来,中国的生铁冶炼技术发明得过早,以致有些超越时代。四. 铁工具、农具普及。这同样要归功于生铁冶炼技术。中国劳动者的生产条件,在耶元前5世纪以后,十四世纪以前显然要优于世界上其他地方的劳动者。五. 武器用钢铁质量不能与世界著名武器相比。中国的刀,显然是比不过武士刀和大马士革钢刀的。但请注意,仅仅是与制作精良的武器相比才会处于劣势。如果比较大规模生产的武器,中国先进的冶金技术还是能够占据一定优势的。五. 大量炼钢。原因已经说明过了。当然,封建时代的“大量用钢”完全不能跟工业社会的规模相比。例如:英国钢产量在1870年为22万吨。

铁兵器普及之后,中国的科技与罗马相比,劣势已经很少,而优势已经增多。两者已经处于同一条起跑线上。到了罗马人因为荒淫和基督教的影响日渐堕落和愚昧的时候,中国终于成为世界上最先进的国家——中国人为这一天奋斗了2400年。我们不要忘记,那些冶铁工匠为了克服极其不利的自然资源条件,付出了多少心血和汗水,表现了怎样前无古人的智慧。他们为中国的崛起做出巨大的贡献。

参考书:
前节所列各书

《世界全史——世界古代前期科技史》, 安家瑶著

《世界古代中期科技史》

(7) 后记:本不该说的话

终于写完了!这是一篇本不该写的文章,如果任何一个历史系的学生说出“中国普及铁兵器早于西方”、“中国首先普及铁兵器,然后普及铁制工具、农具”、“美索不达米亚在今土其”···这些话,恐怕他就要冒不能毕业的危险。从某种程度上说,回应这样的话对于我的智慧来说是一个侮辱。但我惊讶的发现,在网上,说这样话的人不止一个两个,甚至不只一两百、一两千!说得严重些,这不是对于当代中国知识青年的智慧的一种集体侮辱吗?于是不得不写下一些肤浅的文字,来讲述一个本来尽人皆知的常识。

动笔才知道,“揭穿一句三秒钟想出来的谎言,需要一个星期的准备。”乃是一个真理。为了找资料,不得不天天呆在图书馆里,在冷森森的旧书架中寻找厚厚的落满尘土的书里的只言片语。每一个论据都不能照抄,必须找到两个以上的佐证才能采用。网上的资料常有差错(因为中国的网络文化还不成熟,网站的管理员往往只是兼职,较缺乏专业性),就更是要搞清楚。古文和外文,为了不断章取义,必须看原文才能放心。”···

可喜的是,这篇文章终于写完,看起来也可以跟广大网友见面了。只要大家看了之后能够对“中国普及铁兵器的时间”这个常识有一个比较清楚的了解,我的目的也就达到了。我并且衷心的希望,有才华和知识的网友能就这个问题发表真正的好文章,使我们的网络增加一些现在还比较缺乏的“书卷之气”。

TIGERyj先生:

您好,我不想掩饰我的情绪。你的帖子我一一读过了,从这些“文章”中我看不出你的历史知识,可能您的资料比我丰富,因为您的言论与史学界的主流看法是那么的不相同,使我很难相信您和我受的是同样的教育。

每一本有关的史书都认为亚述的崛起和使用铁兵器有很大关系,而您认为“亚述的崛起是因为他们民族好战的特性和有效的职业军制度,而不是因为铁器。”

史学界认为赫梯的衰落跟冶铁技术的传播关系不大,甚至在客观上促进了这一技术的传播。您却说:“而且随着希梯帝国的衰亡,铁器的制造技术一度失传。”

我们每个人都认为:美索不达米亚是希腊文“两河之间”的中文音译。所谓“两河之间”就是幼发拉底河和底格里斯河之间的区域,在今伊拉克境内。亚述人就居住在今天伊拉克北部。我们认为:亚细亚是希腊文“日出之地”的意思,历史上从来没有什么“古亚洲”,过去没有,现在没有,将来也不会有。我们还知道:伊拉克和土耳其都在西亚,而不是中亚。您却说:“再说希梯人和亚述人是生活在古亚洲的美索不达美亚地区(今天的土耳其)在常理上,历史学家们是把他们划分在中亚文明里的”。

我们知道:希腊哲学家柏拉图是最先提到亚特兰帝斯的人。曾经在公元前360年两度在他的著作─《对话录》提及亚特兰蒂斯这个文明。之后再无人提及它,直到近代。您却认为古希腊还有文学作品描写过它。我不清楚这是怎么回事,请您明示。

我看了图书馆里所有的书,还是不知道您的“古希腊和古罗马文物里的铁器数量甚至还不如在希梯人文物里发现的铁器多呢??”这一问从何而来。

我发现书上有关古希腊铁作坊的资料很多,拉夫里昂铁矿从古风时代就很著名。而您说:“目前出土的文物和文献里还没发现古希腊有大规模的铁器作坊。”

“反正有人写书说就是真的吗??”很抱歉,比较起来,我还是比较相信范文澜、郭沫若、白寿彝诸位史学界泰山北斗的论断,而把您的说法放在一边。

“试问如果能够普及铁器的话,会有一个民族傻到用铁造斧头和锄头,而用青铜制造兵器吗??”很抱歉,您的祖先就是这样的傻子加异类。

我们知道:钢的普及是英国工业革命之后的事情,因此我们管那之后的时代叫“钢铁时代”。在古代无法保证大型高炉的操作安全,因此古代不能普及大型高炉,而大型高炉是大规模生产生铁的保证,而工业化炼钢必须有大量的生铁,而普及钢必须进行工业化炼钢。而您说:“汉代已经不是铁器普及而是用刚来代替铁的问题了。”我愚昧,想象不出一个初期封建国家有什么必要,有什么技术可以实现“用钢来代替铁”。

我不才,刚刚看了《世界全史-新编世界科技史(上)》中国国际广播出版社, 1996年11月第一版, 三遍,发现赫梯和亚述分在了两河流域诸文明目录下。请问您看的又是什么版本的世界全史?

有一个问题您与我是一致的:过去中国人常将中国以西的国家都叫西方,现在有时候为了方便,还常常这样分类。我认为这是不准确的,我们应当使用比较精确的称呼。在这一点上,我很高兴能收回过去的说法。

还有,请列出您看的《剑桥历史年鉴》的原文。

其余的,看我的文章就够了。
请原谅我的直率——我对您的历史水平和诚实产生了相当大的怀疑。希望您能够写一篇文章来证明我是错的。(请注意,是真正的文章,而不是那些“百字文”。)
另外,请不要胡乱称呼别人为“老兄”。

(8) 附录1:TIGERyj 先生有关言论集

目前出土的文物和文献里还没发现古希腊有大规模的铁器作坊,请问他们普及铁器一说如何来?亚述的崛起是因为他们民族好战的特性和有效的职业军制度,而不是因为铁器。擅长制造铁器的是希梯人哦,而且随着希梯帝国的衰亡,铁器的制造技术一度失传。再说希梯人和亚述人是生活在古亚洲的美索不达美亚地区(今天的土耳其)在常理上,历史学家们是把他们划分在中亚文明里的,不要因为他们生活在中国的西面,就把他们划入西方文明了哦。拜托普鲁日尼科夫老兄,多看点书啊,省的一言惊四座啊!

是吗??普兄??如果随便找个历史学家写的什么论著就可以而不用以考古文物为实据的话,那我还可以说最早普及使用铁的是亚特兰帝斯人呢??因为古希腊的文学里称道过亚特兰帝斯的军队战力强大和铁装备的先进。反正有人写书说就是真的吗??符合你的标准。

考古发现希腊军队的装备主要是由青铜制造的,试问如果能够普及铁器的话,会有一个民族傻到用铁造斧头和锄头,而用青铜制造兵器吗??如果我没记错的话,爱因斯坦说过“人类一向把智慧的最高成就用于互相残杀,这真是人类的悲哀”看来古希腊人就是人类中的异种,和普兄是一类人。

能够制造铁器和普及铁器是两个概念,古希腊和古罗马是有铁器的制造技术了,可离普及还差的远,现代的考古发现也证实了这一点,古希腊和古罗马文物里的铁器数量甚至还不如在希梯人文物里发现的铁器多呢??而过中国的铁器普及远比西方来的迅速,在战国时期就已经有相当大的数量了,到了秦灭六国,铁兵器已经相当普及,青铜兵器已经只是配角了,甚至已经有了铁制农具和工具,表明铁器普及已经基本完成。汉代已经不是铁器普及而是用刚来代替铁的问题了。

最后说一句,喜欢抄书是好事,但只抄与教学方面有关的书是不是有点片面啊?我知道有些教学书里的知识更新不快,往往与最新的理论有差距,比如普兄所说的亚述和希梯文明属西方文明一说,真是让人心惊肉跳啊,也不知道是那本教科书上说的。

哎....................秀才遇到兵,有理说不清。你一定要说任何时代任何技术方面都是西方比中国先进,那我无话可说,只能怪老天把你投错胎生在了中国,没把你生成白皮肤。

古中国的科技和西方比谁更先进,我想世有公论,你我之间再怎么争论也改变不了什么。只是希望你不要乱给别人扣帽子,什么愤青??我那点象愤青了啊?我只是说了我所知道的事实。如果为中国说话就是愤青的话,那我也可以说你是崇洋媚外者,在以前的话或者还会称你为汉奸哦。

大家是在讨论问题,不是在吵架,别动不动就给别人扣帽子,现在不是文革时期了。

还有我特地去图书馆看了《世界全史》,反反复复看了几十遍目录,如果我没看错的话,亚述和希梯文明是在古代史的亚洲文明的中亚文明里提到,而自古亚洲是被欧洲称之为东方的,这个概念被沿用至今。不知普兄是在哪个版本的《世界全史》里看见中国的那位史学家把中亚文明划在西方文明的目录下的啊???望请赐教。

还有认为罗马人是使用青铜兵器的人就是头脑不正常??完了完了!!原来英国剑桥大学里的历史教授都是疯子,剑桥历史年鉴都是疯子写的,多亏普兄英明,发现了英国教育史上的最大弊端。佩服佩服!!!

(9) 附录2:补充:何清谷同志文章的结尾部分

了最新技术。——渗碳制钢技术,农具及兵器福建的制作工艺较简单,技术较落后。官手工业中生产兵器的工匠有官奴婢、刑徒、雇工。刑徒刑满释放后可以自由,雇工是由外地用重金征聘去的(14),他们可以改进外地的技术,也可能把官手工业中的技术传播到民间,使馆符合民间的生产技术起交流作用。这样一来,制造铁兵器的先进技术,必然促进钢铁冶炼技术的进步,并会逐渐推广到农具、手工业工具的生产中去,从而影响社会生产力的发展。

铁兵器的使用对战争有一定的影响。秦昭王说:“铁剑利则壮士勇。”(《史记·范雎列传》)荀子说:“械用兵革攻完便利者强,械用兵革窳(木苦)不便利者弱。”(《荀子· 议兵》)可见钢铁兵器的装备能提高士兵的战斗力,是影响交战国力量对比的因素,当时武器的改良适应了战争方式的变化,增强了战争的残酷性,但是,武器的利钝对战争胜败不起决定作用,亦如荀子所说:“坚甲利兵不足以为胜”,楚国虽有“宛钜铁矛,惨如蜂虿,轻利僄遫,卒如飘风;然而 兵殆于垂沙,唐蔑死。庄蹻起,楚分而为三四。”不是没有“坚甲利兵”,而是缺乏统帅一切的“道”《荀子·议兵》即良好的政治。

(14)吴荣增:《秦的官府手工业》、《云梦秦简研究》第48-49页

袁仲一、何清谷两同志的文章,请大家看我的像册,完全共享。

感觉这篇文章写的不错,有理有据的。所以贴出来了。最重要的是,还记得以前我们的历史教科书是怎么写的吗?我觉得那种写法根本就是一种认知误导!

而且,从斯塔夫理阿诺斯的《全球通史》到这里,我越来越认同“地理决定论”了。当然实际上我认为无论是“唯物论”“英雄主意史观”还是“地理决定论”都不是绝对的,只有针对某些特定历史事件的特定的决定因素,要推算历史问题,在我看来比“三体”问题还要复杂得多