2007年12月27日星期四

Tips:2007.12工作点滴

1.MATLAB官方博客:http://blogs.mathworks.com/
其中的Inside the MATLAB Desktop 主要介绍工作环境和绘图中的新功能和技巧。推荐订阅。
最近的一篇"Focusing on Zooming" 一文中介绍了使用命令来控制figure的缩放。通过linkaxes命令,可以将一个figure中的各个axes指定相同的坐标范围,实现各个绘图同步放大、缩小。在缩放一个绘图时,其它也会响应地同步缩放。可以同时关联x、y轴,也可以只关联一个坐标轴。
Giving your code some privacy一节介绍了MATLAB2007b中引入的代码折叠功能,对编写大型的程序应该很有帮助。

2.MATLAB Help中的Interactive Plotting一文提供了一种在figure中用鼠标绘图的方法,主要使用ginput函数。

3.判断点在离散的封闭曲线(多边形)内的方法,基本原理是,多边形内一点发出的任意射线与多边形仅有奇数个交点;
1). 求出封闭曲线的外接矩形的范围。即曲线中所有顶点的最大、最小坐标范围。
2). 判断点是否在该矩形内,否,则结束;是,则执行3)
3). 判断由该点发出的水平(或垂直)射线与多边形的交点个数。该射线与多边形的边有交点的判断(以水平正向为例):
边的两个端点的纵坐标不能同时大于或小于该点纵坐标,否则,该射线与该条边没有交点。
如果两个端点的横坐标同时小于该点的横坐标,则没有交点,如果同时大于该点的横坐标,则有交点。
如果一大一小,则需要求出该射线与边的交点的横坐标(纵坐标已知),如果交点横坐标大于点的横坐标,则有交点。(如果曲线上的点很密集,判断精度要求也不高,这一步也可以忽略)。

用上面的方法,在MATLAB中手动进行锋电位特征的聚类:


4. Word中图片使用嵌入型时,位置自动移动到页面的边缘:可能是样式引起,将图片的样式改为正文或可解决。实际上
可能是图片所在段落的行距太小造成的,可以设为单倍行距试试。

2007年12月21日星期五

sudo的简单配置

sudo的简单配置

sudo的配置文件是/etc/sudoers,它有专门的编辑工具visudo,用su切换到root用户,然后执行这个命令。
对于VI,对我这样的初学者,只要记住几个快捷键就可以了:光标移动,j上一行,k下一行,h向左,l向右。i切换到编辑状态,然后再配合End、Delete、和BackSpace键,完成这个位置的编辑,Esc退出编辑状态;移动光标到下一个位置,再切换到编辑状态,再输入,直到修改完成。然后输入冒号“:”,最下面一行会改为接受命令状态,输入w,保存,q退出。
执行visudo以后,将光标下移,可以看到一行:
root ALL=(ALL) ALL
这个命令定义了root用户的sudo权限,我们要添加的配置也具有相应的命令格式即
user host=[(Runas)] [NOPASSWD] commands
被授权用户 主机=[目标用户][不需密码] 命令
即“被授权用户”可以在“主机”上以“目标用户”的权限执行“命令”。方括号内是两个可选参数,目标用户缺省为root。命令必须用绝对路径,之间用","分开。例如
liuxq localhost=/sbin/poweroff
表示用户liuxq可以在本机上以root的权限执行"sudo /sbin/poweroff"命令,而不需要root密码(需要liuxq的用户密码)。
如果加上NOPASSWD,则表示不需要输入密码:
liuxq localhost=NOPASSWD: /sbin/poweroff

基本的定义方法就是这样,如果需要为不同的用户、不同的主机配置不同的命令权限,这样逐条配置显然太繁琐,所以这个配置文件中引入了别名Alias的功能,在配置文件的开头部分,有四个别名类型:
User_Alias; Host_Alias; Runas_Alias; Cmnd_Alias;
分别对应该命令形式中的四个部分。别名实际上定义了相同类型的对象的一个集合。例如
User_Alias LIU=liuxq,lxq
定义了一个LIU集合,其中有成员liuxq和lxq,用LIU代替前面命令中的liuxq,则用户liuxq和lxq都可以执行sudo /sbin/poweroff命令。
其它别名的定义也是类似的。这里就不多啰嗦了,推荐看看Linux 系统中的超级权限的控制,讲得比较详细。

2007年12月13日星期四

Expectation-maximization: 高斯混合模型的期望最大化算法

高斯混合模型的期望最大化算法

本文大部分内容翻译自Answers.com的Expectation-maximization algorithm 词条。

对于一个不完整的样本集,假设y为观测(已知)数据,z为丢失数据,z和y构成了完整的数据。z可以为丢失的观测量,也可以是隐含的变量,如果这些变量已知的话将会简化问题的求解。例如,在混合模型中,如果产生样本点的各个成分的分布为已知,则可以大大简化似然函数的计算。

假设p为完整数据的联合概率密度函数,该函数具有参数θ:p( mathbf y, mathbf z | theta),它也可以看成是完整数据的似然函数(即样本集(y,z)具有θ分布函数的相似性),一个关于θ的函数。进一步,根据贝叶斯公式和全概率公式,丢失数据对于观测数据的条件分布为:

p(mathbf z |mathbf y, theta) = frac{p(mathbf y, mathbf z | theta)}{p(mathbf y | theta)} = frac{p(mathbf y|mathbf z, theta) p(mathbf z |theta) }{int p(mathbf y|mathbf hat{z}, theta) p(mathbf hat{z} |theta) dmathbf hat{z}}

这个式子仅要求计算观测数据对于丢失数据的条件概率(似然函数)p(mathbf y|mathbf z, theta)和丢失数据的分布概率p(mathbf z |theta)。(分母仅为归一化需要)

EM算法通过迭代方法,构造更好的 θ12,... ,逐步优化初始的 θ0, θ的递推优化公式通过下式得到:

theta_{n+1} = argmax_{theta}Q(theta)

Q(θ)是对数似然函数lnp( mathbf y, mathbf z | theta)的期望。换句话说,我们不知道所有数据的值,所以我们不知道似然函数的准确值,但是对于给定的观测数据y,我们可以得到未知的z的概率分布,对于每一个丢失的观测(z中的一个元素),都有一个关于θ的似然值,这样我们就可以计算似然函数的数学期望。这个期望显然受到θ的值的影响。

Q(θ)通过下式得到:

Q(theta) =  sum_z   p left(z ,|, y, theta_n right)   log p left(y, z ,|, theta right)

或者,更普遍地,可以写成条件期望的形式

Q(theta) =  E_{mathbf z} ! ! left[ log p left(mathbf y, mathbf z ,|, theta right) Big| mathbf y right],

应该清楚, 这里关于log p left( mathbf y, mathbf z ,|, theta right)的条件期望中用到的z的条件分布(前一个式子中的第一项)是在固定θn的情况下取得的。用对数似然代替直接的似然函数,可以在保证极值位置不变的情况下简化计算。也就是说,θn + 1是通过在θn 的基础上,最大化所有数据关于已知数据的条件期望E而取得的。

当样本集合的最大似然估计比较容易获得时,EM算法更为有用。如果似然估计具有给定的形式,则M步就非常简单。一个经典的例子是用于有限的高斯混合模型的最大似然估计,如果混合分布已知,则可以很容易得到各个成分的分布。

高斯混合模型

假设n个高斯分布,从中产生m个样本mathbf y_1, dots, textbf{y}_m,每一个 yj 所从属的分布用 zj 表示,zj 的取值范围为1到n。对于任意的y,其来自第i个高斯分布的概率为

P(mathbf y | z=i,theta) = mathcal{N}(mu_i,sigma_i) = (2pi)^{-l/2} {left| sigma_i right|}^{-1/2} expleft(-frac{1}{2}(mathbf y - mathbf mu_i)^T sigma_i^{-1} (mathbf y - mathbf mu_i)right)

我们的任务是估计未知的参数theta = left{ mu_1, dots, mu_n, sigma_1, dots, sigma_n, P(z=1), dots, P(z=n) right},即每一个高斯分布的均值、方差和先验概率。

首先我们必须设定初始值。

对于无监督的聚类,我们首先必须为每一个样本指定一个类别,这一步可以通过其他的聚类方法实现,如K-means方法,求出各个类别的中心和每一个样本的类别。然后求出各个类别中样本的协方差阵,可以用每个类别中样本的个数来表示该类别的权重(先验概率)。

E-step

使用上一次M步中得到的参数θ,计算未知的z(即每一个分类)对于观测数据的条件分布。即,在当前参数θn 下,对每一个样本,计算各个类别的后验概率。 下式中第三个等号后面的分子的第一项,为每一个样本在类别i中的分布概率,分子中的第二项为每一个类别的先验概率。
分母为归一化,即对每一个样本,其在各个类别中的分布概率的和为1.

p(z_j=i|mathbf y_j,theta_t)  = frac{p(z_j=i, mathbf y_j | theta_t)}{p(mathbf y_j|theta_t)}  = frac{p(mathbf y_j|z_j=i,theta_t) p(z_j=i|theta_t)}{sum_{k=1}^n p(mathbf y_j | z_j=k, theta_t) p(z_j=k|theta_t)}

for ti = 1:Ncluster
PyatCi = mvnpdf(featurespace,Mu(ti,:),Sigma(:,:,ti));
E(:,ti) = PyatCi*Weight(ti);
end
Esum = sum(E,2);
for ti = 1:Ncluster
E(:,ti) = E(:,ti)./Esum;
end

M-step

为了最大化联合分布的对数似然函数的期望

上式中最后一项的联合分布可以写成条件分布和边缘分布的乘积的形式,得到

Q(theta)  = sum_{j=1}^m sum_{i=1}^n p(z_j=i | mathbf y_j, theta_t) ln left( p(mathbf y_j | z_j=i, theta) p(z_j=i | theta) right)

上式需要满足先验概率归一化的要求:

sum_{i=1}^{n} p(z_j=i|theta) = 1

为了求得Q(θ)的极大值的位置,引入拉格朗日算子 ,然后带入概率密度函数,

mathcal{L}(theta) = left( sum_{j=1}^m sum_{i=1}^n p(z_j=i | mathbf y_j, theta_t) left( - frac{l}{2} ln (2pi) - frac{1}{2} ln left| sigma_i right| - frac{1}{2}(mathbf y_j - mathbf mu_i)^T sigma_i^{-1} (mathbf y_j - mathbf mu_i) + ln p(z_j=i | theta) right) right) - lambda left( sum_{i=1}^{n} p(z_j=i | theta) - 1 right)

为了求得新的 θt + 1,我们需要找出上式取得极值时对应的θ,即其一阶导数frac{partial mathcal{L}(theta)}{partial theta} = 0

下面推导满足上式的均值,


for ti = 1:Ncluster
muti = E(:,ti)'*featurespace;
muti = muti/sum(E(:,ti));
Mu(ti,:) = muti;
end

产生新的协方差矩阵


新的各个分类的权重


进行归一化处理

Inserting λ into our estimate:


将新的参数,均值、方差、分类的先验概率,带入E步,重新计算,直到样本集合对各个分类的似然函数不再有明显的变化为止。

下面的程序提供了一种快速的似然函数计算方法,摘自Patrick Tsui的EM_GM样例程序:
http://www.mathworks.com/matlabcentral/fileexchange/loadFile.do?objectId=8636
function L = Likelihood(X,k,W,M,V)
% Compute L based on K. V. Mardia, "Multivariate Analysis", Academic Press, 1979, PP. 96-97
% to enchance computational speed
% a subfunction from Patrick P. C. Tsui's EM_GM code.
[n,d] = size(X);
U = mean(X)';
S = cov(X);
L = 0;
for i=1:k,
iV = inv(V(:,:,i));
L = L + W(i)*(-0.5*n*log(det(2*pi*V(:,:,i))) ...
-0.5*(n-1)*(trace(iV*S)+(U-M(:,i))'*iV*(U-M(:,i))));
end


2007年12月10日星期一

MAXScript:利用3DSMAX脚本产生原子运动动画

利用3DSMAX脚本产生原子运动动画

很久,很久以前,曾经做过一些关于分子动力学的工作,最后无疾而终,几乎什么都没有留下。分子动力学(Molecular Dynamic Simulation)计算微观原子间的相互作用,产生其运动轨迹,所有原子的运动形态最终表现为物体宏观的运动和变形等。

如果将这些原子的运动以动画的形式渲染出来,无疑是非常形象的。我曾经用3DSMAX的脚本MAXScript编写了一段程序来完成这个功能,在这里贴出来,供有需要的参考。
以下图中的模型为例,上面是Au探针,压入下面的Ni平板。原子的初始坐标值(x,y,z)分别放在文本文件posau0.txt和posni0.txt;
计算过程中产生一系列的原子坐标文件,这些文件以编号区别,如posau1.txt~posau100.txt;
在脚本文件中,首先读入原子的坐标信息,建立模型,每个原子对应一个球模型;
然后,在时间轴的不同时间坐标上,读入并指定每个原子的新坐标。
脚本的执行我也记不清了。可以在网上搜一下。
完整的程序如下(“--”的注释是把程序粘贴过来后补上去的,不知道有没有什么问题。我是在3DSMAX 5上运行的。):

--指定数组变量;
posarray = #()
postemp = #()
spAu = #()
spNi = #()
lay = #()
--字符串变量
strti = " "
--Au模型中原子个数,坐标数据量
atomau = 768
dataau = atomau*3
--Ni模型中原子个数,坐标数据量
atomni = 616
datani = atomni*3
--位置坐标文件的个数,不含初始坐标文件
framenum = 14
--原子半径
Rau = 1.44
Rni = 1.3
--指定材质,Ni平板每一层具有不同的颜色
--textMatAu = standardMaterial diffuse:[125, 125, 255]
textMatNi = standardMaterial diffuse:[92, 216, 92]
textMat1 = standardMaterial diffuse:[126, 173, 126]
textMat2 = standardMaterial diffuse:[233, 114, 67]
textMat3 = standardMaterial diffuse:[236, 224, 92]
textMat4 = standardMaterial diffuse:[92, 92, 216]
textMat5 = standardMaterial diffuse:[60, 151, 159]
textMat6 = standardMaterial diffuse:[179, 121, 216]
--读入Au的初始坐标
filename = "F:\data\posau0.txt"
in_name = (filename)
in_file = openFile in_name

if in_file != undefined then
(
for v=1 to dataau do
(
vert = readValue in_file
posarray[v]=vert
)
close in_file
--根据原子坐标建立每个原子的球模型
for v=1 to atomau do
(
ti=(v-1)*3+1
px = posarray[ti]
ti=ti+1
py = posarray[ti]
pz = posarray[ti+1]

spAu[v] = sphere radius:Rau position:[px, py, pz] segs:12 smooth:true
--判断原子所在的层,指定不同的材质
lay = (v-1)/288 as integer
lay = lay+1
if lay == 1 then
(spAu[v].mat = textMat1 )
if lay ==2 then
(spAu[v].mat = textMat2 )
if lay ==3 then
(spAu[v].mat = textMat3 )
if lay ==4 then
(spAu[v].mat = textMat4 )
if lay ==5 then
(spAu[v].mat = textMat5 )
if lay ==6 then
(spAu[v].mat = textMat6 )

)

)

--读入Ni的原子位置,并建立模型
filename = "F:data\pos\ni0.txt"
in_name = (filename)
in_file = openFile in_name
if in_file != undefined then
(
for v=1 to datani do
(
vert = readValue in_file
posarray[v]=vert
)
close in_file

for v=1 to atomni do
(
ti=(v-1)*3+1
px = posarray[ti]
ti=ti+1
py = posarray[ti]
pz = posarray[ti+1]

spNi[v] = sphere radius:Rni position:[px, py, pz] segs:12 smooth:true
spNi[v].mat = textmatNi
)

)

--开始设置坐标-时间动画
animate on (
at time 0
for tj in 1 to framenum do
( ti=tj*10
--指定新坐标对应的时间
at time ti (
strti = tj as string
filename = "F:\data\posau"+strti+".txt"
in_name = (filename)
in_file = openFile in_name
if in_file != undefined then
(
for v=1 to dataau do
(
vert = readValue in_file
posarray[v]=vert
)
close in_file

for v=1 to atomau do
(
ti=(v-1)*3+1
px = posarray[ti]
ti=ti+1
py = posarray[ti]
pz = posarray[ti+1]
--设置Au原子模型的新位置
spAu[v].position = [px, py, pz]
)
)

filename = "F:\data\posni"+strti+".txt"
in_name = (filename)
in_file = openFile in_name
if in_file != undefined then
(
for v=1 to datani do
(
vert = readValue in_file
posarray[v]=vert
)
close in_file

for v=1 to atomni do
(
ti=(v-1)*3+1
px = posarray[ti]
ti=ti+1
py = posarray[ti]
pz = posarray[ti+1]

spNi[v].position = [px, py, pz]

)

)
)

)
)

--max time play


再贴一个效果图(模拟计算结果本身可能不正确):

2007年11月30日星期五

Task Manager任务管理器中一些功能的简单介绍

任务管理器中一些功能的简单介绍

表格中的内容来自:http://www.microsoft.com/technet/prodtechnol/windows2000serv/reskit/core/fneb_mon_oyjs.mspx?mfr=true

在任务管理器的查看->选择列中,可以更改进程面板中显示的性能检测项目。

进程统计项目 Description描述

Base Priority

基本优先级

进程的基本优先级决定了这些进程在CPU的处理队列中的排列顺序。基本优先级由进程本身控制,而不是操作系统指定。操作系统设置、改变进程中线程的动态优先级。可以在任务管理器中设置进程的优先级,更详细的内容参考“处理器活动分析 ”。

CPU Time

CPU时间

从进程开始运行起,所占用的CPU总时间,以秒计。

CPU Usage

CPU占用

上次跟新到本次更新的时间段内,该进程占用的CPU时间的百分比。

GDI Objects

图形设备接口对象数目

进程使用的图形设备接口(GDI)控件的数目。GDI控件是指,从针对图形输出设备的应用程序接口GDI库中调用的控件。

Handle Count

句柄数

进程的对象列表中对象句柄的数目。

I/O Other

I/O其它

进程产生的非读非写的输入输出操作的数目,包括,文件、网络和设备I/O。这种操作的一个例子是行使控制功能。不统计指向控制台的操作(控制台输入)。

I/O Other Bytes

I/O其它字节数

其它I/O操作传输的字节数。

I/O Read Bytes

I/O读取字节数

进程在输入输出操作中读入的字节数。包括文件,网络和设备I/O。指向终端的操作不在统计之列。

I/O Reads

I/O读取

进程在输入输出操作中读操作的数目。包括文件,网络和设备I/O。指向终端的操作不在统计之列。

I/O Write Bytes

I/O写入字节数

进程在输入输出操作中写出的字节数。包括文件,网络和设备I/O。指向终端的操作不在统计之列。

I/O Writes

I/O写入

进程在输入输出操作中的写出操作数。包括文件,网络和设备I/O。指向终端的操作不在统计之列。


Image Name

映像名称

进程名。

Memory Usage

内存使用

进程占用的主内存数,以千字节KB计。

Memory Usage Delta

内存使用增量

两次统计更新之间,内存占用量的变化,以KB计。

Nonpaged Pool

非页面缓冲池


该进程占用的操作系统内存数,以KB计。操作系统内存中从未分页到硬盘的部分。分页是将应用程序内存中的不常用的部分转移到其它存储媒介上,通常是转移到硬盘上。

Page Faults

页面错误

应用程序请求的数据由于不在内存而需要从硬盘上重新读入的次数。从应用程序启动开始计数。

Page Faults Delta

页面错误增量

两次更新间的页面错误增加量。

Paged Pool

页面池

该进程占用的操作系统内存数,以KB计。页面池是可以分页到硬盘的虚拟内存。页面池包括所有的用户内存和系统内存的一部分。

Peak Memory Usage

内存使用峰值

从启动开始,进程占用的物理内存峰值。

PID (Process Identifier)

进程标识

应用程序启动时分配的数字标识。

Thread Count

线程数

应用程序中运行的线程数。

USER Objects

用户对象

进程占用的用户对象数。用户对象是指窗口管理器中的对象,包括窗口、菜单、光标、图标、钩子hooks、加速器、显示器、键盘布局,以及其它内部对象。

Virtual Memory Size

虚拟内存量

为该进程分配的虚拟内存(或地址空间)量。


在任务管理器的性能面板中,通过“查看”菜单中选择“显示核心时间”,可以查看应用程序调用操作系统服务所占用的CPU时间,剩余的时间,即用户模式,是运行应用程序本身的代码所占用的时间。


下表简单地描述了性能面板中一些统计项目的内容。

Task Manager counts Description

CPU Usage

CPU使用


MEM Usage

内存使用

虚拟内存的使用量( 虚拟内存(Virtual Memory)是Windows管理所有可用内存的方式)

Total Handles

总句柄数


Total Threads

总线程数


Total Processes

总进程数


Physical Memory: Total

物理内存:总量



Physical Memory: Available

物理内存:可用量

包括清零的,释放的和待分配内存。

Physical Memory: File Cache

物理内存:文件缓存

Amount of physical memory, in kilobytes, released to the file cache on demand.

文件缓存占用的物理内存。

Commit Charge: Total

认可用量:总数


所有进程使用的虚拟内存量

Commit Charge: Limit

认可用量:限制

不扩大页面文件的情况下,可供分配的虚拟内存总量。

Commit Charge: Peak

认可用量:峰值

虚拟内存的峰值用量,如果虚拟内存增大,可能会超过认可用量的限制值。

Kernel Memory: Total

核心内存:总量

页面和非页面内存的总量

Kernel Memory: Paged

核心内存:页面

操作系统占用的页面池容量。

Kernel Memory: Nonpaged

核心内存:非页面

操作系统占用的非页面池容量。


关于内存这部分把我弄晕了,对我来说又没有什么太重要的意义,算了,有心人可以看下面牛人写的:

虚拟内存,物理内存,页面文件,还有任务管理器

[quote]发信人: Hakkk (蓝猫淘气3k问·荷兰篇), 信区: NewSoftware
标 题: 虚拟内存,物理内存,页面文件,还有任务管理器
发信站: 水木社区 (Tue Nov 20 21:56:20 2007), 站内

虚拟内存(Virtual Memory)是Windows管理所有可用内存的方式。
对于32位Windows系统,每个进程所用到的虚拟内存地址从0到2^32-1,总容量4GB,
其中2GB是与操作系统以及其他所有进程所共享,
另外2GB分派给进程独占(这就是常说的32位Windows中一个进程最多能用2G内存的由来)。

4GB虚拟地址空间(Virtual Address Space,VAS)中,2GB的进程独占VAS是进程隔离的,
换句话说,每个进程都可以从RAM或者硬盘上映射到属于自己的2GB VAS。
所以虽然32位Windows每个进程最多只能获得4GB可用虚拟内存,
但是所有进程总和可以使用总量超过4GB的虚拟内存。
可惜XP只支持4GB RAM,也就是说超出部分一定得靠页面文件补足;
而比如2003企业版通过PAE支持32GB RAM,可以减少页面文件的用量。
(但单个进程最多仍然只有4GB虚拟内存地址空间,而不是32GB)

所以,一个简单的计算示例:
三个进程最多能用掉多少VAS?
2GB(共享)+2GB(独占)×3=8GB

这4GB的虚拟地址空间,按照4KB的大小进行分页(page),
然后以页为单位映射到实际存储单元中,包括:
·物理内存(RAM)
·页面文件(Page File,在Win9x中称为交换文件Swap File,即win386.swp)
·其他文件自身(比如一些长时间未活动的进程的exe文件自身)
可见,通常人们所说的虚拟内存实际上只是指其中的页面/交换文件而已,
这是对虚拟内存的一个错误的理解。
虚拟内存≠页面文件

RAM中除了保存最近读写的文件缓存(File Cache,相当于Win9x中的Vcache)
主要用来存储正在使用的程序代码和数据,
当RAM资源紧张,或者有程序码或数据长时间未使用时,
XP通常会将非活跃程序码所在的地址页映射回程序文件(exe、dll等),
将数据所在的地址页映射到页面文件(pagefile.sys)中并拷贝数据,
然后将它们本来占用的RAM空间释放。
这个过程称为页出(Page Out)。

当系统读取某个虚拟内存地址,而该地址所在的页不在RAM中时,
将产生一个页面错误(Page Fault)中断,
告诉系统从页面文件或者程序文件中取回包含该地址的虚拟内存页,
即将内容拷回到RAM并建立新的虚拟地址映射,并将页面文件中对应部分标记为未使用,
这个过程就是页入(Page In)。
页入成功的话就是一个Valid Page Fault,否则就是Invalid Page Fault。
前者非常普遍,(可以在任务管理器的进程页监视到)
而后者是由程序或硬件错误引起,
如果发生在进程上会导致非法操作,如果是系统自身则很可能蓝屏。

内存用量可以在任务管理器的性能页中看到。
其中物理内存的总量、可用数等是指安装的RAM容量和剩余RAM容量,
而内存使用或者提交更改的总量和限制是指虚拟内存的Commit Limit和Committed Bytes,
可以理解成系统可以使用的虚拟内存总量和当前使用量,
其中总量是由RAM大小+页面文件大小决定的。

而在任务管理器的进程页中,“内存使用”和“虚拟内存大小”造成的误解很多,
而实际上,这两个值是对应性能监视器中该进程的Working Set和Private Bytes,

Working Set是指一个进程的4GB虚拟地址空间中被映射到RAM中的部分的大小,
通常是该进程的虚拟内存中的活跃部分。
表面看来这个表述和“进程占用的RAM大小”没有太大区别,
但至少有两种情况导致了例外的发生:
第一种是这部分虚拟内存如果是属于2G的系统共享虚拟内存,
那么它映射到的RAM地址可能和其他进程有重复,计算多个进程占用RAM总和就不正确,
使得所有进程的Working Set之和比实际占用RAM要大。
第二种是一个进程中可能有同一段RAM内容的多个引用,比如一个文件被loop多次,
此时虚拟空间中会有多段地址被映射到同一段RAM上,
从而造成该进程的Working Set比实际占用RAM要大。

Private Bytes是一个进程的2GB独占虚拟地址空间中用到的部分的大小,
无论这部分是在RAM中还是在页面文件中,甚至是在exe、dll等文件中。
所以,任务管理器进程页中的虚拟内存绝对不反映pagefile.sys的用量。

所以,任务管理器无论是进程页还是性能页都不能直接反映pagefile的使用情况,
诸如“关掉pagefile还能看到虚拟内存”之类的疑问,应该很清楚了。

下面是一个简单图示,
两个进程,各自拥有2G独占VAS,共同拥有2G共享VAS,
W代表映射到RAM中的部分(Working Set),P代表页出的部分。

0 …………………2GB独占内存……………… 2G ………2GB共享内存……… 4G
进程1 |--PPPP---------------WW-----PPPP--------|
\\ || \\
\\ || \\
\\ || |||| |--PPPPPPPPPPPP--WWWWWWWW--|
exe2 exe1 dll RAMemory pagefile.sys |||||||||||| ||||||||
|||| /// // / || | 共享内核/dll等 共享RAM空间
进程2 |-PPPP------PPP---WW--WW------PP----P----|

然后,任务管理器的进程页中的“内存”就是上图中的W,
所以所有进程的内存项加起来肯定比实际用的RAM大,因为有共享部分
此外还有重复引用,比如上图中进程2独占内存中第二和第三个W指向同一段RAM空间。

而任务管理器进程页中的“虚拟内存”就是上图中右半部分,“独占VAS”。
可见pagefile只是其中的一部分,而RAM,只要用于独占VAS,一样计入了该处“虚拟内存”


最后,实际的页面文件用量(pagefile.sys中实际使用部分),
可以在性能监视中看到,即Paging File下的% Usage和% Usage Peak
配合当前pagefile.sys的大小就可以计算出字节数,
这个值可以做为设定页面文件最小值的一个参考,
而不是用任务管理器进程页的所有进程的虚拟内存大小相加做为页面文件最小值的参考。

2007年11月28日星期三

Sitting Too Close to the Computer Screen Can Make You Go Blind

长时间注视屏幕容易引起视觉疲劳

Sitting Too Close to the Computer Screen Can Make You Go Blind

Eyestrain is a common—and occasionally debilitating—effect of staring at screens

By Molly Webster

原文:http://www.sciam.com/article.cfm?id=is-sitting-too-close-to-screen-making-you-blind&page=1

翻译:liuxqsmile


图片来源http://www.adcock.co.za/LifeStyle.aspx?Page=EyeComponents ;我在上面添加了对应的中文名称。

你晃晃脑袋,松弛一下紧张的脖子,闭上眼睛,揉一揉,然后继续在几英寸之外盯着电脑屏幕。完全不管你的的视线仍然一片朦胧,几难分辨出屏幕上的字符来。这时,你应该会有疑问:再继续下去,键盘上所敲击的每一个按键,YouTube上所观看的每一个视频,以及发送的每一个电子邮件......这些会损坏你的视力吗?

眼科医师,验光师以及其他的眼科专家注意到近视与近距离用眼有一些关系。这些近距离用眼包括,在距眼睛40cm左右读书、注视电脑屏幕等,尽管电脑屏幕一般距离在50cm左右。但是,只有一小部分人会因为近距离用眼而导致近视,不论他们是读书还是读屏幕。“我们还不清楚哪些人会受影响。”俄勒冈州太平洋大学视觉学院教授James Sheedy说。

事实是,近距离用眼不会在所有人中都导致近视,但是,并不是说紧坐在电脑前面就一点问题都没有。尽管对大多数人来说,不会造成永久性的后果,但近距离用电脑却会导致眼睛疲劳综合症。俄亥俄州立大学视觉学院教授Mark Bullimore告诉我们,眼睛疲劳综合症是指,眼睛疲惫不堪:烫痛、干燥和眼肌疼痛,以及所有继续用眼时伴随的不快感受。

理解眼睛为什么会疲劳,并且知道该如何去防止的最简单的方法是了解我们的眼睛能看清细小文字的工作原理。当我们“看”到某个对象的时候,实际上是从物体上反射的光穿过角膜(覆盖在眼球表面的一层透明的穹状结构)。角膜和晶状体(虹膜后面的圆形、透明、弹性结构)对光波进行聚焦,使其准确地到达视杆细胞和视锥细胞,这两种位于视网膜上的光感受器用来收集入射的光线信息。位于最内层的视网膜汇总光线信息,并且通过视神经传递到大脑,形成一幅图像。

Sheedy告诉我们,近距离凝视屏幕会使睫状肌紧张,睫状肌控制晶状体的形状,以准确聚焦,睫状肌必须始终保持张紧,这对这块小肌肉的要求太苛刻了。过紧的盯视也会阻止眨眼。眨眼的重要作用在于将眼泪覆到眼球的表面。如果不眨眼,角膜表面就会干燥,看东西模糊不清。正常情况下,眼睛每分钟眨20次,用电脑时可能会下降到7次,但是,专家们认为不会造成永久性的后果。

眼科教授Dennis Robertson说,如果屏幕周围有耀眼的强光,还可能会导致斜视。斜视可以减弱进入眼球的光线强度(一定程度上缓解眨眼不足),但是斜视让眼球周围的肌肉处于紧张状态,连续九个小时,让它筋疲力尽。

在眼睛放松后,眼睛疲劳通常会在数小时之后消。但只要这些症状一出现,就会严重影响到工作效率,更严重时让人感觉烦躁。这些症状都不是永久性的,不会造成视觉功能的损害。我们也可以通过改善工作环境来避免这些症状的出现。

使用非闪烁的电脑屏幕,改变屏幕的亮度、对比度、和文字的大小,屏幕的位置要略低于眼睛,显示器的上沿与眉毛平齐。如果眼睛的生理有问题,应该赶快配一副矫正眼镜。

关掉周围太亮的光源。用手在眼前遮住灯光,看你的脸部和肩膀是否有一定程度的放松,如果有,说明这些灯光应该做出调整。专家建议,看电视的时候,在比较舒服的位置上跟里面的主人公“休戚与共”。

但是,到目前为止,避免眼部疲劳的最好、最简单的方法仍然是经常性地休息、放松。即使你不渴,也可以到饮水机前走一趟,一定要把你的安乐椅放到电视两英尺(约0.6m)以外,最后,别忘了眨眨眼睛。

译者注:调整Windows桌面字体一般在 显示属性->外观中选择大字体,但这样字体反而太大,并且只有桌面中的部分文字受其影响,对应用程序一般没有什么效果。实际上,在设置->高级面板中修改DPI,可以更灵活地控制字体的大小,大部分应用程序中的文字都会相应改变。


2007年11月22日星期四

Quack medicine: Imagination Goes Wild(3) 伪医学:想象力的疯狂(3)

Quack medicine: Imagination Goes Wild(3) 伪医学:想象力的疯狂(3)

英文原文出自www.collectmedicalantiques.com ,链接http://www.collectmedicalantiques.com/quack3.html
翻译:liuxqsmile
本文地址:http://liuxqsmile.blogspot.com/2007/11/quack-medicine-imagination-goes-wild3-3.html
(译注:图片有删减)
有很多种产生电的方式,但在这个发展迅速而缺乏规则的行业里,每一种都被逐利的奸商所利用(56)。在交流电应用之前,早期的干电池后来的蓄电池(57-61),都被用来产生直流电,在诊所(62-64)和病人家里治病。电子腰带可以产生一个“治疗”电磁场,带有一个会发光的灯泡,让人以为它很有效果(65-37)。大型的静电发生器和摩擦生电仪通过摩擦玻璃来产生电荷,存储在莱顿瓶里,放电时就可以用来治疗一切叫得上名字的疾病。不过,这些仪器在早期也为X射线的研究提供电力(68-74)。一些临床医学家甚至在透热疗法的仪器上找到了微波的妙用(75-77)。
在二十世纪,电的应用更为广泛。制造商们也挖空心思,很多的大型设备出现在诊所和医院里,电疗椅(78-82)、电疗浴(83)、电子壁柜(84-86)及橱柜(87)等。

放射性

居里夫人发现的放射性为医学界创造了不可估量的商机。Revigator(88,89)是一个用有弱放射性的粘土制成的罐子,制造商宣称,患者喝了在罐子中过夜的水后可以“水到病除”。不幸的是,直到在那些坚持使用的人中间产生很多的口腔癌患者时,人们才对它产生了怀疑。尽管这个罐子的放射性很低,但氡(译注:参考世界卫生组织|氡与癌症 )的含量很高,收藏者要注意把他们放在密闭的容器里。



56)宣传招贴
新奇药品和虚假医疗器械的生产商们通过广告招贴来宣传他们的产品。这是Scott博士的一幅宣传画,用来推销他诸多骗人的电子装置中的一部分。
57-61)家用直流医疗装置
使用电池的“电子组合”是在二十世纪早期很常见的虚假医疗器械,并且在江湖医术的历史中占有重要的位置。正是由于它的销售最终导致了对相似的医疗器械进行立法,对安全和功效进行了标准化。图中展示了诸多附件中的一部分。Williams电磁仪也使用直流电驱动。

62-64)交流电装置
交流电发展起来以后,出现了很多大型装置。图中精美小巧的麦金托什电源盒可以为前面的“电子组合”提供充足的电力,较大的汤普森电子柜则用于耳鼻喉科的诊治。

65-67)治疗腰带
插上电源,打开开关,这个带子会就产生一个磁场,被宣称具有医疗作用,并且很安全(现在看来是很有问题的)。随带子附送一个接有小灯泡的线圈,当线圈接近磁场时,灯泡会发出亮光,“看,不是很有效吗?"。

68-74)大型静电发生器
在二十世纪初,标准化的交流电的应用还比较少,于是“托普勒-霍尔兹Toepler-Holtz”静电发生器就被用来为一些医疗设备提供电源。它 同时也为第一部X射线发生器提供能源。它有很多的附件,应用非常普遍,并且在西尔斯商品目录手册上大作广告。图中是非常大的一种静电发生器,由24块玻璃 圆盘组成,4个一组,旋转时靠摩擦产生电荷。正在实施治疗的这幅图片选自1908年Franklin Gottschalk博士所著的《实用电疗》。
75-77)透热疗法 图中是由匹兹堡透热医疗联合公司生产的仪器,可以产生微波,像这本小册中所述,可以应用于几乎任何疾病的治疗。
78-82)电疗椅
电疗椅的应用是医学史上最大的讽刺性事件之一。早在1890年,麦金托什电椅就已经开始使用,并且出现在RW St. Clari博士所著的《电学在内科和外科中的实际应用》一书中。另外有很多类似的椅子,其中一种甚至在椅子的两侧装了两个紫色发光管来加强医疗(和眩目)效果。Wappler电子公司在这个领域非常活跃,这里有他们的一种产品,由一个电源柜来供电。还有Davis电子公司1904年生产的精美的瓷质健足盘。
83)电子浴
早期的医师们彻底为电学的魅力所倾倒,他们甚至让病人进行“电子浴”,完全沉浸在电子里。Max Wocher and Son公司1904年的医疗产品目录中展示了一个用静电发生器供电的电浴装置。
84-86)Wappler电源壁柜
电源壁柜为电疗椅和其他电子器械供电。图中是1904/1905年,西尔斯医疗商品目录上的产品,并且展示了一些医疗附件。Wappler电源橱柜的具有相同的功能。
.

88-89b) 瓶中的放射性
放射性的潜力是巨大的,尽管还没有多少严格的验证,它很快就被见缝插针的商人盯上了。Revigator(放射领航者)是一个有低放射性的陶罐,水在其中存放后也就具有放射性。如图中所示,也有几种不同的外观。

<待续>