2008年11月10日星期一

光圈档数(aperture stop)的计算方法

摄影的时候计算曝光量经常用到几“档”曝光这个术语。这个曝光的“档数”(stop)也经常被称作EV(exposure value)。这个“档数”到底怎么算出来的? 曝光量是由光圈和快门共同决定的。曝光量增加一倍,就叫做曝光增加一档。当光圈一定时,曝光量和快门时间(也就是曝光时间)成正比,例如1/30秒就比1/60秒曝光增加一倍,也就是增加一档。这比较容易理解。比较容易迷惑的是光圈。 光圈一般用F数(F number或者F/#)来表示,其定义为:
f/#=fD
其中f是镜头焦距,D是镜头入射孔径。如果拿起一个镜头,从前面看进去,所看到的那个圆形小孔的直径,就是镜头的入射孔径了。对于一般相机镜头,这个孔径大小是可调的,由f/#的设置来控制。有些人可能会想,既然计算曝光量,为什么不直接拿孔径大小D来算,还要定义一个什么f/#。这是因为,感光器件(胶片或者CCD)的曝光量不仅和孔径大小有关,还和焦距有关。用f/#能更准确的表示曝光量。但是这有一个前提,就是物体离镜头比较远,如果物体离镜头很近(例如显微镜),就不能用f/#来算曝光量了。这时候一个更常用的量是数值孔径(numerical aperture或NA)。 因为孔径D在分母上,所以f/#数值越小,光圈越大。例如光圈f/2比f/4要大。但是f/2并非比f/4大一档光圈,而是二档。因为镜头通光量和孔径面积成正比,也就是和孔径大小的平方成正比。所以,比f/4大一档的光圈是
422.8
实际上还会经常碰到分数表示,例如半档,1/3档。对于普遍情况下,可以用下面的公式计算两个光圈究竟差几档:
N=2log2f/#2f/#1
例如,f/1.4和f/1.8相差
N=2log2f/1.8f/1.423

2008年11月4日星期二

LaTeX CJK生成PDF文件的中文搜索以及复制粘贴

以前的blog介绍过如何在Fedora下安装配置LaTeX CJK,其他的Linux发行版也可以用类似的方法。但是如果直接用ps2pdf或者dvipdfm生成PDF文件,这样的PDF文件没办法搜索中文,也不能复制粘贴中文内容。可以用dvipdfmx将生成的dvi文件转换为PDF,这样生成的PDF可以完成上述功能。 另外,我把自己的LaTeX CJK的字体和配置文件放到了网上,地址是http://www.mediafire.com/file/dwutwxjjmdn/texmf.tar.gz,有需要的朋友可以去下载。这个文件包含CJK包和三个字体,分别是Fedora自带的文鼎宋体,楷体,还有文泉驿的黑体,应该满足大多数应用。下载后解压到$HOME目录,执行texhash $HOME/texmf。不需要进行任何其他配置。下面的文件可以用来测试安装结果:
\documentclass{article}
\usepackage{CJKutf8}
\begin{document}
\begin{CJK}{UTF8}{song}
CJK 测试。

\emph{CJK 测试。}

\textbf{CJK 测试。}
\end{CJK}
\end{document}

2008年10月31日星期五

用WebPlayer在网页里播放mp3

WebPlayer利用Flash技术,允许你在你的网页里直接播放mp3文件,而不需要任何其他软件。WebPlayer使用非常简单,只要下载一个很小的文件放在你的网站上,把要播放的mp3文件也放上去,再在你的网页的HTML文件里加几行代码,就可以了。 下面是我用口琴演奏的《天鹅》。
祝老婆纪念日快乐!

2008年10月29日星期三

光束质量因子M2(M squared)的测量

各种文献经常会用M2(M squared)因子来评价光束的质量。到底什么是M2?一般文献会告诉你,M2就是一个光束的腰半径和发散角的乘积跟TEM00高斯光束相比的比值。M2≥1,因为TEM00高斯光束的该乘积具有最小值。要想从实验得到M2的值,不可避免的要涉及光束半径测量的问题。
  1. 光束半径
  2. 光束没有明显的边界,因此它的半径有很多不同定义方法。对于高斯光束,最常见的定义就是1/e2半径,也就是把光强下降到最大值的1/e2的位置定义为半径,通常在公式里以W表示。在统计学里,我们对高斯分布的宽度(半径)使用的是方差,也就是说,对于高斯分布函数
    f(x)=ae-x22σ2
    它的方差(二次矩)半径为σ。把这个公式和一维高斯光束光强公式
    I(x)=e-2x2wx2
    比较,就会发现W=2σ。无论是W还是σ,实验上都没办法直接测量。但是如下定义的宽度实验上是可以测量的:用一个刀片,横向扫描过光束,这样一部分光束被刀片遮挡,另外一部分会通过。如果通过的光强等于总光强的90%时刀片坐标为x1,通过的光强等于总光强的10%时刀片坐标为x2,这样光束的宽度可以用
    D=|x2-x1|
    表示。当然,这个比例不局限于10%和90%,也可能是其他值。这种实验方法称为“刀锋(knife edge)法”。这样的话,我们需要找出一个D和W(或者σ)的关系。可惜,这个关系依赖于光束的光强分布,所以不存在一种普遍适用的关系。但是对于TEM00高斯光束,这个关系不难得到。
  3. TEM00高斯光束
  4. 因为刀片在一维方向移动,所以我们只要对光强进行一维积分就可以了。高斯函数的积分为误差函数。例如我们计算宽度D内通过的光强占总光强的比例:
    -D2D2e-2x2w2dx-e-2x2w2dx=erf(2D2w)
    按照上面的例子,这个比值应该是80%。通过查表或者数值计算,我们可以得到
    D=1.2816w=2.5631σ
    这是TEM00高斯光束的结果。对于其他分布种类的光束,这个结果会有变化。
  5. M2因子
  6. 对于TEM00高斯光束来讲,光束半径在光轴方向(z方向)的变化可以表示为
    w2(z)=w02+(λπw0)2(z-z0)2
    其中z0表示TEM00高斯模式腰的位置。对于一般光束,我们已经提到过,光束发散程度一定超过TEM00高斯光束,所以可以引入一个M2因子,这样一般光束半径可以表示为
    w2(z)=w02+M4×(λπw0)2(z-z0)2
    上述各式均是在某单一横向方向(例如x),对于一般光束,x和y方向可能有不同的半径和M2(例如半导体激光),甚至各个方向都不相同,这时候就需要更多方向上的测量才能确定光束分布。M2可以作为光束质量的一个量度。M2越接近1,光束质量越好,发散越小,聚焦时形成的斑点越小。
  7. 刀锋法测量
  8. 上面的例子中,我们用10%和90%作为光束宽度的测量标准,那么可不可以用其他数值呢?另外,上面得到的D和W之间的关系只对于TEM00高斯光束适用,那么一般的光束半径如何测量呢?Siegman的一篇论文阐述了这个问题,结论是对于绝大多数激光光束,如果阈值选择在8.5%到11.6%之间,TEM00高斯光束的结果都可以作为很好的近似,10%无疑是一个很好的折衷。其实对于大多数激光光束而言,TEM00都是主要成分,这样的近似在大多数时候都是没什么问题的。 测量时,可以在不同的位置z多测几组,然后进行拟合,得到光束的M2和其他各个参数。

2008年10月28日星期二

让blogger支持MathML公式输出

我想在我的blog里显示公式怎么办?我可以把每个公式变成图片文件,然后把公式作为图片显示。我不需要截屏软件,OpenOffice可以很方便的把包含公式的文档转换为包含图片的HTML文件。但是这么做太笨了。更好的办法是用MathML在网页上显示公式。 MathMLXML的一个应用,是W3C推荐使用的网页数学公式显示方案。遗憾的是,目前不是所有的浏览器都支持MathMLFirefox本身包含对MathML的支持,但是你可能需要安装显示数学公式需要的字体。如果你使用Linux,你的发行版很可能包含(甚至已经安装)了该字体,请以mathml为关键词搜索以确定是否已经安装。如果你不幸使用Windows,请到这里按照说明自行安装字体。如果你更不幸使用IE浏览器,那只好自生自灭了。(开个玩笑,请安装MathPlayer插件)。 现在你可以到这里测试一下你的浏览器是不是可以正确显示MathML公式了。能显示,很好。可是,blogger并不能自动支持MathML的显示,因为blogger的网页扩展名都是html,浏览器不会自动按照xml来显示。这个问题可以这么解决:到这里下载一个小javascript文件,把这个文件直接放到你的blogger template文件的head里面,或者放到互联网上某个地方,在template的head里面加入下面一行:
<script type="text/javascript" src="javascript文件的链接"></script>
这样blogger就可以显示你的MathML公式了。 MathML语法非常复杂,要想直接用MathML写出一个公式并不容易。TtM是个把LaTeX公式转换成MathML代码的小工具。这下就方便多了。把转换好的MathML代码复制到你的blog就可以了。 下面是一个MathML显示公式的例子:
U(r)=A0W0W(z)exp[-ρ2W2(z)]exp[-jkz-jkρ22R(z)+jζ(z)]

2008年10月21日星期二

不用重启切换runlevel

Linux下telinit命令允许不重启的情况下切换runlevel。

2008年10月19日星期日

魔术组合键SysRq

很多用户不熟悉SysRq键到底有什么用,甚至很多用户根本没注意过电脑键盘上还有这么一个键存在。在Linux系统出现问题时,只要内核没有完全崩溃,SysRq就可以为我们提供一个诊断和控制内核的途径。SysRq键的使用方法是同时按下:
Alt + SysRq + CommandKey
有些键盘无法同时处理那么多键,例如一些笔记本的键盘,很可能还需要按下额外的Fn键。这时候可以按照下面的顺序:
按住Alt不放 => 按下并放开SysRq => 按下CommandKey => 放开所有键
Fedora默认是不开启SysRq功能的。如果想开启这项功能,可以修改/etc/sysctl.conf文件,把kernel.sysrq设置为1:
kernel.sysrq = 1
常用的CommandKey有如下这些:
CommandKey功能
m目前内存信息
t目前任务信息
s同步所有挂载文件系统
u重新挂载所有文件系统为只读
b立即重启(不sync或者unmount)
r键盘从raw模式切换到XLATE模式
kSecure Access Key杀死现在终端上所有程序
c故意让系统崩溃
e向除init外所有进程发出SIGTERM信号
i向除init外所有进程发出SIGKILL信号
如果syslogd仍然起作用,SysRq触发结果将会保存在/var/log/messages

2008年9月30日星期二

如何使用Maxima(四)

矩阵运算
  1. 输入矩阵
  2. 可以用entermatrix(m,n)输入一个m乘n矩阵。如果m=n,Maxima会自动询问是什么类型的矩阵,以减少输入的工作量。
    (%i1) m: entermatrix(2,2);
    
    Is the matrix  1. Diagonal  2. Symmetric  3. Antisymmetric  4. General
    Answer 1, 2, 3 or 4 :
    4;
    Row 1 Column 1:
    a;
    Row 1 Column 2:
    1;
    Row 2 Column 1:
    0;
    Row 2 Column 2:
    b;
    
    Matrix entered.
                                      [ a  1 ]
    (%o1)                             [      ]
                                      [ 0  b ]
    也可以用matrix以行为单位输入
    (%i2) matrix([a,b,c],[1,2,3],[d,e,f]);
                                      [ a  b  c ]
                                      [         ]
    (%o2)                             [ 1  2  3 ]
                                      [         ]
                                      [ d  e  f ]
  3. 矩阵的转置,逆和行列式
  4. (%i3) transpose(m);
                                       [ a  0 ]
    (%o3)                              [      ]
                                       [ 1  b ]
    (%i4) invert(m);
                                     [ 1     1  ]
                                     [ -  - --- ]
                                     [ a    a b ]
    (%o4)                            [          ]
                                     [      1   ]
                                     [ 0    -   ]
                                     [      b   ]
    (%i5) determinant(m);
    (%o5)                                 a b
  5. 矩阵的代数运算
  6. (%i6) m . %o4;
                                       [ 1  0 ]
    (%o6)                              [      ]
                                       [ 0  1 ]
    (%i7) %o6 + %o4;
                                   [ 1         1  ]
                                   [ - + 1  - --- ]
                                   [ a        a b ]
    (%o7)                          [              ]
                                   [        1     ]
                                   [   0    - + 1 ]
                                   [        b     ]
  7. 提取矩阵的某一行或某一列
  8. (%i8) row(m,1);
    (%o8)                              [ a  1 ]
    (%i9) col(%o7,2);
                                       [    1  ]
                                       [ - --- ]
                                       [   a b ]
    (%o9)                              [       ]
                                       [ 1     ]
                                       [ - + 1 ]
                                       [ b     ]
  9. 为矩阵增加一行(列)或几行(列)
  10. (%i10) addcol(m,[0,1],[c,1]);
                                     [ a  1  0  c ]
    (%o10)                           [            ]
                                     [ 0  b  1  1 ]
    (%i11) addrow(%o10,[1,0,0,1]);
                                    [ a  1  0  c ]
                                    [            ]
    (%o11)                          [ 0  b  1  1 ]
                                    [            ]
                                    [ 1  0  0  1 ]
  11. 另外,+, -, *, /, ^, exp(x)等运算都可以应用于矩阵,这些运算符分别作用于每一个元素。
  12. (%i12) m/c;
                                       [ a  1 ]
                                       [ -  - ]
                                       [ c  c ]
    (%o12)                             [      ]
                                       [    b ]
                                       [ 0  - ]
                                       [    c ]

2008年9月25日星期四

Vim输入特殊字符(例如希腊字母)

Digraphs可以用来在Vim中输入特殊字符。Digraphs使用两个一般字符来表示一个特殊字符,输入之前先按Ctrl+K,然后紧接着键入两个一般字符。 例如要键入拼音字母ü,可以先按Ctrl+K,然后键入u:。如果要键入希腊字母θ,可以先按Ctrl+K,然后键入h*。 这个双字符组合比较有规律,例如第二个字符
  • *表示希腊字母
  • 表示字母上面加两点
  • R表示罗马数字
等等。默认的组合列表可以在Vim里用:dig命令查看。另外,还可以手动添加字符。详细说明可以参考Vim Digraphs文档。

2008年9月22日星期一

改变Linux终端分辨率

grub.conf文件里kernel启动选项加入参数
vga=xxx
其中xxx是代表显示模式的数字,具体多少可以从这里查出来。下面是一些常用的数值:
640x480800x6001024x768
256 color palette769771773
16-bit785788791
24-bit786789792

2008年9月20日星期六

在Linux下合法使用微软字体

corefonts提供了绕开Windows授权使用微软字体的方法,可以很方便的得到rpm安装包。这里是我在Fedora 9上编译好的rpm文件,以方便以后使用。

2008年8月20日星期三

在Xfig或者Gnuplot生成的图画中加入公式或label

XfigGnuplot都可以把图画输出为MetaPost文件。用MetaPostlabel命令就可以方便的插入公式或者标签。修改后的MetaPost文件可以借助mpost和mps2eps生成eps文件,具体方法可以参考这里

2008年4月23日星期三

新的Linux Flash Player

仅仅安装Adobe的flash-plugin不能保证新的Linux Flash Player工作,还需要安装libflashsupport。最简单的办法是到Adobe的下载网站使用YUM for Linux。

2008年4月20日星期日

新安装Fedora 9 Preview

KDE4一开始不太适应,过了一段时间觉得还不错。不知道什么原因,每次log out之后,键盘就不管用了,用鼠标restart X就没有问题了,大概是kdm的bug。可以设置kdmrc让kdm每次log out后重启X。在kdmrc中
[X-*-Core]
后面增加一行:
TerminateServer=true

2007年12月7日星期五

矢量绘图语言Asymptote(一)

Asymptote是从MetaPost扩展而来的矢量数学绘图语言。它使用浮点数运算,支持三维图形,使用类似C++语法。Asymptote的很多语法和MetaPost类似,但是也有不同。下面简单介绍它的使用方法。假设Asymptote命令存在文件test.asy中,则执行下面的命令可以生成eps文件:
asy -V test
其中-V参数会自动打开一个PostScript浏览窗口,这样可以立即浏览生成的图形。
  1. 简单直线图形
    Asymptote代码生成的图像
    draw((0,0)--(100,0)--(100,100)
    --(0,100)--cycle);
    size(0,3cm);
    draw(unitsquare);
    unitsize(2cm,3cm);
    draw(unitsquare);
    label("$A$",(0,0),SW);
    label("$B$",(1,0),SE);
    label("$C$",(1,1),NE);
    label("$D$",(0,1),NW);
  2. 曲线图形
    Asymptote代码生成的图像
    draw((0,0){up}..(100,25){right}..(200,0){down});
    draw((0,0){up}::(100,25){right}::(200,0){down});
    size(0,100);
    path unitcircle=E..N..W..S..cycle;
    path g=scale(2)*unitcircle;
    filldraw(unitcircle^^reverse(g),yellow,black);
    size(200);
    
    real mexican(real x)
    {return (1-8x^2)*exp(-(4x^2));}
    
    int n=30;
    real a=1.5;
    real width=2a/n;
    
    guide hat;
    path solved;
    
    for (int i=0; i<n; ++i) {
      real t=-a+i*width;
      pair z=(t,mexican(t));
      hat=hat..z;
      solved=solved..z;
    }
    
    draw(hat);
    dot(hat,red);
    draw(solved,dashed);
  3. graph module
    Asymptote代码生成的图像
    import graph;
    size(150,0);
    
    real f(real x) {return exp(x);}
    pair F(real x) {return (x,f(x));}
    
    xaxis("$x$");
    yaxis("$y$",0);
    
    draw(graph(f,-4,2,operator ..),red);
    
    labely(1,E);
    label("$e^x$",F(1),SE);

2007年11月13日星期二

计算折射率和其他光学变换的网站

计算折射率和其他光学变换的网站

http://www.luxpop.com/

2007年9月3日星期一

在Fedora 7下安装LaTeX CJK

LaTeX CJK的安装一向都很麻烦,主要是字体安装和配置不容易。这里主要根据Edward Lee的Blog(http://blog.bs2.to/post/EdwardLee/7672)里的方法进行配置。
  1. 下载安装CJK包
  2. http://cjk.ffii.org/下载CJK扩展包,解压缩到“$HOME/texmf/tex/latex/CJK/”。这里不准备修改系统文件,所以只安装到用户目录。
  3. 生成Type1字体和配置文件
  4. 这里使用CJK自带的FontForge脚本文件subfonts.pe生成Type1字体。 首先建一个目录,例如$HOME/song/,我们就在这个目录里生成字体。把我们想要的TrueType字体拷贝到这个目录中,我这里使用的是Fedora自带的文鼎Unicode字体uming.ttf。再把CJK包utils里面的subfonts.pe拷贝到这个目录。最后到http://delloye.free.fr/Unicode.sfd下载Unicode.sfd文件到同一个目录。执行下面的命令:
    fontforge -script subfonts.pe uming.ttf song Unicode.sfd
    这个命令执行的时间比较长。执行完之后,还在该目录执行下面命令生成map文件:
    for i in *.tfm
    do
    cat >> song.map << EOF
    ${i%.tfm} ${i%.tfm} < ${i%.tfm}.pfb
    EOF
    done
    按照Edward Lee的方法,还需要生成fd文件。但是我们给字体起的名字song和CJK自带的c70song.fd文件冲突了,如果用Edward Lee的方法反倒会出问题。我们有个更简单的解决办法,直接把c70song.fd修改一下。CJK自带的c70song.fd文件在$HOME/texmf/tex/latex/CJK/texinput/UTF8/目录下,内容如下:
    % This is the file c70song.fd of the CJK package
    %   for using Asian logographs (Chinese/Japanese/Korean) with LaTeX2e
    %
    % created by Werner Lemberg 
    %
    % Version 4.7.0 (17-Oct-2006)
    
    \def\fileversion{4.7.0}
    \def\filedate{2006/10/17}
    \ProvidesFile{c70song.fd}[\filedate\space\fileversion]
    
    
    % character set: Unicode U+0080 - U+FFFD
    % font encoding: Unicode
    
    \DeclareFontFamily{C70}{song}{\hyphenchar \font\m@ne}
    
    \DeclareFontShape{C70}{song}{m}{n}{<-> CJK * cyberb}{}
    \DeclareFontShape{C70}{song}{bx}{n}{<-> CJKb * cyberb}{\CJKbold}
    
    \endinput
    
    我们只要把其中的cyberb改作song就可以了。
  5. 把生成文件拷贝到相应目录
  6. 把生成文件拷贝到下面的目录:
    $HOME/texmf/fonts/map/dvips/CJK/song.map
    $HOME/texmf/fonts/tfm/CJK/song/*.tfm
    $HOME/texmf/fonts/type1/CJK/song/*.pfb
    如果目录不存在,自己建立一下。
  7. 生成ls-R数据库
  8. 执行
    texhash
  9. 更新字体map
  10. updmap --enable Map song.map
  11. 测试
  12. 可以编辑下面的文件进行测试。
    \documentclass{article}
    \usepackage{CJKutf8}
    \begin{document}
    \begin{CJK}{UTF8}{song}
    \LaTeX CJK 测试。
    \end{CJK}
    \end{document}

2007年3月30日星期五

如何使用Maxima(三)

  1. 复数运算
  2. 代数运算:
    (%i1) a:2-3*%i$
    (%i2) b:5+4*%i$
    (%i3) a+b;
    (%o3)                               %i + 7
    (%i4) a*b;
    (%o4)                        (2 - 3 %i) (4 %i + 5)
    
    上面%i1%i2结尾用$而不是分号;表示不输出结果。 实部和虚部:
    (%i5) expand(%);
    (%o5)                              22 - 7 %i
    (%i6) realpart(%);
    (%o6)                                 22
    (%i7) imagpart(%o5);
    (%o7)                                 - 7
    
    绝对值和幅角:
    (%i8) abs(%o5);
    (%o8)                              sqrt(533)
    (%i9) carg(%o5);
                                            7
    (%o9)                             - atan(--)
                                            22
    
    复数形式和直角形式:
    (%i10) polarform(%o5);
                                         - %i atan(7/22)
    (%o10)                    sqrt(533) %e
    (%i11) rectform(%);
                                   7                            7
    (%o11)       sqrt(533) cos(atan(--)) - sqrt(533) %i sin(atan(--))
                                   22                           22
    (%i12) %,numer;
    (%o12)                           22.0 - 7.0 %i
    
  3. 方程数值解
  4. 找出方程f(x)=0[a, b]范围内的数值解:
    find_root(f(x), x, a, b);

2006年11月28日星期二

在线收听古典音乐频道

WCPE古典音乐频道,位于Rolesville,NC,24小时播音。这里是在线收听地址: http://audio-ogg.ibiblio.org:8000/wcpe.ogg.m3u

2006年10月26日星期四

Linux下复制Video DVD

首先制作iso镜像文件:
mkisofs -dvd-video -o dvd.iso /media/dvd
刻录DVD:
growisofs -dvd-compat -Z /dev/hdc=dvd.iso