星期三, 七月 14, 2010

此博客已移动

此博客现在位于 __FTP_MIGRATION_NEW_URL__。 您会在 30 秒内自动重定向,或者您也可以点击此处。 如果您是供稿订阅者,请更新对 __FTP_MIGRATION_FEED_URL__ 的供稿订阅。

此博客已移动

此博客现在位于 __FTP_MIGRATION_NEW_URL__。 您会在 30 秒内自动重定向,或者您也可以点击此处。 如果您是供稿订阅者,请更新对 __FTP_MIGRATION_FEED_URL__ 的供稿订阅。

星期三, 十一月 15, 2006

浅谈OpenType字库


随着OpenType字库逐渐为大家所知,越来越多的人希望了解什么是OpenType字库,希望通过以下的介绍能让大家对OpenType字库有一个简单的认识。
过去我们经常接触的字库类型有两种,它们分别是TrueType字库和PostScript字库。TrueType字库是由Microsoft和Apple在1991年共同推出的,供前端排版时显示和打印输出,虽然打印质量没有PostScript字库好,但是完全可以满足一般用字的需求。PostScript是Adobe于1985年发表的文件描述技术,按该 PostScript页面描述语言语法定义的字库就是PostScipt字库,其主要特点是可以精确地描述绘制字型,因而按印刷工业中的质量标准,PostScript字库在平滑性、细节和忠实性方面比TrueType字库要好。PostScript字库一般装于后端输出设备如激光打印或RIP软件中,而它在前端的使用需要依靠特殊的软件比如Adobe 的ATM,由于PostScript字库在操作系统软件中的兼容性不是很理想,目前主要还是用于后端输出。
OpenType字库的推出打破了过去的字库格局,下面就OpenType字库的内容、安装、使用三方面介绍一下OpenType。
Adobe和Microsoft从1995年就开始着手联合开发OpenType项目,该项目除了开发一种新型的跨平台字体文件格式外还旨在为用户提供具有更丰富排版特性的字体格式,目前该字体格式已经成为一种业内标准,越来越多的软件支持OpenType字体格式,越来越多的字体厂商将自己的字库升级到OpenType字体格式。Microsoft从Windows 2000系统开始兼容OpenType字库,其系统自带的西文字库都已升级到了OpenType字体格式,苹果公司也从MAC OS X开始完全兼容OpenType字库。而Adobe 公司不仅将自己Adobe 字体全部升级到OpenType格式,还推出Adobe Creative Suite 2 软件包,其中的InDesign,Illustrator 和Photoshop对OpenType 的排版特性都有非常好的支持。
同一个OpenType字体文件可以用于Mac OS,Windows 和 Linux系统,这种跨平台的字库非常方便于用户的使用,用户再也不必为不同的系统配制字库而烦恼了。
A、 文件结构
从OpenType文件结构来说,确切地讲它是TrueType 格式的扩展延伸,它在继承了TrueType格式的基础上增加了对PostScript字型数据的支持,所以OpenType的字型数据即可以采用TrueType的字型描述方式也可以采用PostScript的字型描述方式,这完全由字体厂商来选择决定。从文件结构的角度来讲OpenType或许并不是一种真正新的字体格式,但是该字体格式所增加的排版特性却从功能上为用户开辟了新的用字方式,为用户提供了更高效率的排版模式。
B、 字型描述方式
OpenType字体带有"O"图标,如 :
如果在Windows上双击Arial字体文件,可以看到如下画面:
"OpenType Font,Digitally Signed,TrueType Outlines"说明这款OpenType字库采用的就是TrueType描述方式,这种字库在原有的TrueType字库的基础上增加入了OpenType的排版特性使其升级到了OpenType字库格式,这些排版特性的加入可以更好地控制字型的替换和排版位置。
如果双击汉仪柏青体简字库,可以看到如下画面:
"OpenType Font,PostScript Outlines,Single Master"说明这款OpenType字库是PostScript 描述方式,采用了Adobe CID-Keyed font 技术,我们简称该类字库为 CFF OpenType。 过去前端可使用的PostScript字库很少,一般是Type1字库,它仅能容纳256个字符,显然这种字型格式不适合我们的中文字库,并且不是所有软件都支持这种格式。而OpenType字体格式不仅可以包含上万的字型,而且兼容性非常好,对于图形或排版的专业人员来说前端使用CFF OpenType字库是很好的选择。目前Adobe在大陆发行的Adobe CS 2 专业版、标准版、InDesign CS2软件均提供一张汉仪开元字宝光盘,该产品就是30 款 CFF OpenType 字库。
C、 编码方式
OpenType字体格式采用Unicode编码,Unicode是国际编码标准,它为不同语言的字型分配了唯一的编码,几乎包含了世界上的所有字符,每个字符都有一个单一的Unicode值,所以在同一款OpenType字库中可以同时包含很多种语言的字型,比如西文、中文、韩文、日文、俄文等,从这方面讲OpenType是一种兼容各种语言的字体格式。 目前OpenType 可以包含65,000 多个字型,对于中文字库而言最基本的字汇应该包含GB2312-80标准的6763个常用字型,这些字应该能满足一般用户的使用,对于户籍管理、银行系统和出版社等用户而言需要2万多字甚至7万多字的支持。 汉仪开元字宝Ver1.0的字库从字汇来讲是基于Basic Latin与GB2312-80字符集制作的,除此以外字型上还增加了全角字、半角字,补充了Latin的竖排字型及欧元等常用字符。
D、 排版特性
这是OpenType字体格式最突出的特点,它可以协助排版用户更快地设计出色版面,比如提供了分数字、上下标、连笔字的替换功能。下面举一些例子:
自由连笔功能: 有些用户可能在排以下符号时会觉得字母之间距离过大,会通过调字间距的功能来缩小间距,如今字体厂商可以在字库中为用户做一些常用的连笔字型,然后利用OpenType的自由连笔特性将这个字型与需要连笔的字符进行关联,在Indesign中打开OpenType的自由连笔字功能,用户在敲"m""m"两个字符时就自动被一个"mm"图形所替代。
分数字,上下标功能:当文章中需要敲一些分数字或上下标时用户往往会为数字的位置高低而烦恼,同样利用OpenType的分数字、上标、下标、分子字、分母字的功能可以帮用户很快实现用户想达到的效果。
花饰字功能:在排英文版面时,如果段落的第一个大写字母是一个漂亮的花体字是不是很漂亮呢,现在OpenType提供的花饰字功能就可以达到锦上添花的效果。
汉仪开元字宝Ver1.0支持的OpenType特性有 自由连笔、全角字、半角字、替代批注格式、等比宽度和直排书写,由于每增加一新特性就有可能需要增加新的字型,每个字型都需要一个固定的ID号来鉴别,有些字型如分数字目前在中文字库中还没有分配固定的ID号,考虑到兼容性汉仪目前没有增加这些特性,不过Adobe承诺在不久将发布新的字符集标准--- Adobe-GB1-5,该文件中会分配ID号给新的字型比如分数字型,届时汉仪会为中文OpenType字库增加更丰富的OpenType排版特性。
汉仪将着力扩充某些款字库的字数到GB18030(包含2万7千多汉字)标准以满足专业排版用字需求。到时会将针对GB18030字库中简体字和繁体字并存和互换的特点增加OpenType的新特性以达到一简对多繁,这种特性将会为用户提供一个更加便捷的排版方式

星期四, 十一月 02, 2006

SSH的 Port Forwarding —— Remote Forwarding

简介
SSH的的Port Forward,中文可以称为端口转发,是SSH的一项非常重要的功能。它可以建立一条安全的SSH通道,并把任意的TCP连接放到这条通道中。本文仔细讨论SSH的这种非常有用的功能, 上文已经介绍了Port Forward的Local Forward功能,这篇将要介绍是的Remote Forward功能。
Remote Forward
所谓的Remote Forward,也就是远程转发,意思就转化Remote端,也就SSH服务器上的端口。首先我们要搞清楚,Remote Forward与Local Forward的区别在在哪里。什么时候用Remote Forward,什么时候用Local Forward,如果搞清楚这两个问题,你就可以说了解了SSH的Port Forward了。

图1. 典型的local Forward 示意图

机器A与SSH服务器B可以互相访问,SSH服务器与目标服器C可以互相访问,但是A不能与C互想访问。在机器A上把一个本地端口,比如:2202,通过SSH服务器转发(Forward)到服务器C的21号端口。整个过程,相当于在原来并不相通的A和C之间建立了一个从A机器2202端口到C机器21端口可以互相讯问的通道,所以SSH的Port Forward也叫做SSH Port Tunnels,非常形象。
接着来看看Remote Forward的情况:

图2. 典型Remote Forward情况示意图

办公室本地(local)机器A,一般都在防火墙后面,防火墙一般让出不让进,所以机器A可以访问SSH服务器B,如果家里的机器C,开着的话,也可以访问机器C。但是服务器B和机器C都没有办法直接访问机器A。而我们在家里有时希望能够SSH到办公室机器A。这种情况下,就要使用SSH的Remote Forward功能了。
机器A是本地(local)机器,也就是说在机器A运行SSH程序进行Port Remote Forward。
  • 方法1. 在机器A的~/.ssh/config文件中加入: Host home-with-tunnel
       Hostname ssh.b.com
       RemoteForward 2002:a:22
       User tom
    然后运行: tom@a ]$ ssh home-with-tunnel
    tom@ssh.b.com's password: ********
  • 方法2. 使用SSH命令行参数: sptom@a ]$ ssh -N -f -R 2202:a:22 ssh.b.com -f使得SSH到服务器B后,就转入后台运行。
    -N使得连到SSH服务器B后,一直维持这个连接。
    -R是Remote Forward的参数选项
    2202是Remote服务器上,要被Forward的端口,这个端口将会被SSH程序绑定到这个连接上。
    a:22是我们希望联到的目标机器的名字或者IP,冒号后是希望连到目标机器的端口。端口22一般是SSH服务用的。
当我们完成上面任意一种方法以后,回到家中,当我们希望能从家里机器C,连到机器A时,我们只要先连到SSH服务器B上: tom@c ]$ ssh ssh.b.com
tom@ssh.b.com's password: ********
tom@ssh.b.com ]$
因为SSH服务器上的端口2202已经被Remote Forward到a:22上了。所以 tom@ssh.b.com ]$ ssh -p 2202 localhost
tom@localhost's password:***********
tom@a]
可见,在机器A上运行SSH的Remote Forward,建立了一条,从机器C通向机器A的通道。正如图2中红线标示的一样。正是因为存在这样单向访问的网格,所以需要Remote Forward的功能存在。 机器C,通过访问服务器B的上已经被Forward的端口2202,与机器A进行交流。

图3. Remote Forward情况下数据交换示意图

具体流程如图所示:
  1. 机器A,运行Remote Forward命令,建一个条机器A与SSH服务器的安全加密通道。
  2. 然后,SSH程序在SSH服务器B上,绑定个端口,如:2202,并监听它。
  3. 机器C,登陆到服务器B上,连接localhost的端口2202。 tom@c ]$ ssh ssh.b.com
    tom@ssh.b.com's password: *********
    tom@bssh.b.com ]$ ssh -p 2202 localhost
    如图3,箭头2。
  4. SSH程序把端口2202监听到的数据经由,第一步建立的加密通道(图3中红色管道)传给机器A,如箭头3,4。
  5. 最后由机器A,把数据转到目标机器上的指定端口,这里就是机器A本身的SSH端口22。
Remote Forward 端口的安全问题
当你在服务器B,打开一个监听端口,同样问题来了,这个端口,允许哪些机器来联接。SSH程序的默认设置是不允许除了本机外的IP使用这个端口。如果你想让别的机器也能连接这个端口,你需要在/etc/sshd_config文件中打开: GatewayPorts yes 选项。这是唯一的办法。
参考文献

SSH的 Port Forwarding —— Local Forwarding

简介
SSH的的Port Forward,中文可以称为端口转发,是SSH的一项非常重要的功能。它可以建立一条安全的SSH通道,并把任意的TCP连接放到这条通道中。本文仔细讨论SSH的这种非常有用的功能。
LocalForward
LocalForward顾名思意,是把本地的端口(Port)转发出去。SSH应用中,所以谓的本地端(local)就是指你面前操作的机器。通常也叫作客户端(client),也就是你运行SSH命令的机器,而远程端(remote)就是你SSH打算连接的机器,通常也叫做服务器(server)。 例如:你运行命令ssh www.example.com 这时,你运行ssh 命令的机器就是Local,而你要连接的机器: www.example.com就是Remote。
下面来看一个本地转发的例子:有一个FTP服务器,地址为" ftp.exp.com" ,端口为21,通常我们连接这个FTP可以使用 $ lftp ftp.exp.com 现在如果我们使用本地转发(Local Forward) $ ssh -L 2202:ftp.exp.com:21 ssh.exp.com 运行这个命令后,SSH程序会把所有发往本地2202端口的内容都转发到 ftp.exp.com 服务器的21端口上,这就是SSH的端口转发的含义。
  • -L 是ssh命令的选项,表示开启本地端口转发(Local Forward)
  • 2202:ftp.exp.com:21 2202指定ssh程序将要监听的本地端口,注意,每个端口只能被监听一次。
  • ftp.exp.com:21 指定ssh将本地2202监听到的内容转发到ftp.exp.com服务器的21端口
所以,在端口转发后我们运行新的FTP连接命令: $ lftp -p 2202 localhost 同样可以连接到FTP上。虽然同样的最终效果,但是中间的过程已经大不一样了。
下面就讨论一下,以及转发后,ssh究竟作了什么。以及为什么要作端口转发, 命令: $ ssh -L 2202:ftp.exp.com:21 ssh.exp.com 实现的具体步骤如下:
  1. 首先,我们运行了ssh程序
  2. ssh程序登陆到 ssh.exp.com服务器上。
  3. ssh程序绑定你指定的本地网卡(127.0.0.1)的本地端口2202。
  4. 当任意一个程序如lftp连接到2202端口时。本地的ssh接受这个连接
  5. 本地ssh通过加密的SSH通道,通知服务器,让服务器连接目标也就是ftp.exp.com:21
  6. 本地ssh把从本地端口2202所以接受到的任何内容通过加密的通道传给服务器。
  7. 服务器把接受到的数据通过已经建立好的到目标的连接,以明文,也就未加密的形式传给目标
整个过程可表示为: 本地:127.0.0.1:2202<==加密==>SSH服务器:ssh.exp.com;<==明文==>目标:ftp.exp.com:21
Local Forward的意义
  1. 使用Local Forward后,首先可以看到,在本地与SSH服务器之间的数据传输是加密的,也就是在在本地的机器上,没有程序可以知道,你与目标服务器之间的实际通讯内容,因为所有这些内容先通过加密通道传到服务器上,然后才用明文的方式传到目标服务器。
  2. 其次,如果你不能直接连到目录服务器,而SSH服务器能,这时,SSH服务器就充当了个代理服务器的功能。使你可以“直接”的连到目标服务器。
Local Forward 端口的安全
从一开始的例子可以看到,当我们Local Forward一个端口,实际上打开了一个通向目录服务器的门,这时我们自然会关心这个门的安全问题。打开的端口是一个标准的网络应用端口,除了本地机器,如果还有另外一台机器,也想连接这个端口,那就可能会产生安全问题。当然SSH在默认的情况是,不允许除了本机以外的,其它机器连到这个端口的。这就是说,当你运行机器A上运行了Local Forward命令: $ ssh -L 2202:ftp.exp.com:21 ssh.exp.com 那么,你只能在机器A上运行连接命令: $ lftp -p 2202 localhost 也就是说,这个端口只能被机器A看见,假设机器A的IP是:192.168.1.3,另一台机器B,想连机器A的端口: $ lftp -p 2202 192.168.1.3 默认情况下,为了安全起见,SSH会拒绝机器B的连接请求。如果你想让机器A的端口,让其它机器也能连接。你需要开启一选项: -g。或者在(in ~/.ssh/config or /etc/ssh/ssh_config)中开启: GatewayPorts yes
一级高级技巧:SSH一些有用的选项
运行命令: $ ssh -L 2202:ftp.exp.com:21 ssh.exp.com 会你登陆到 ssh.exp.com 服务器上,事实上你只想维持一个连接,而不需要在SSH服务器上运行什么程序。SSH的 -f 选项可以把SSH的连接放到后台,使用这个命令后,SSH可以把这个联接放到后台。但要求必需在SSH服务器上运行一个命令,如果命令运行完了,这个连接也关闭。所以为了维持一个长时间的连接,你必跟一个能在SSH服务器上长时间运行的命令,通常这个命令是像sleep 30d这样,能运行30天的命令。所以更高级的命令如下: ssh -f -L 2202:ftp.exp.com:21 ssh.exp.com "sleep 30d"
选一个能长时间运行的命令,有时并不是一件简单的事,sleep 30d在三十天后也结束了。所以SSH又提供了一个选项-N,可以达到同样的效果,并且在没有意外的情况下,一直运行下去。更为简洁的有效的命令: ssh -f -N -L 2202:ftp.exp.com:21 ssh.exp.com
参考文献