添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
相关文章推荐
暴躁的钢笔  ·  xgpon标准 g.988 - CSDN文库·  2 周前    · 
逃跑的土豆  ·  Error - [tsc] ...·  6 月前    · 
气宇轩昂的竹笋  ·  JSP 简介 | 菜鸟教程·  1 年前    · 
阳刚的路灯  ·  js remove empty - ...·  1 年前    · 
  • IDL Workbench

    The IDL Workbench is a new graphical interface to IDL that replaces the IDL Development Environment included with IDL versions prior to 7.0. The IDL Workbench provides powerful code development and debugging tools in a cross-platform interface that looks and behaves the same way on all platforms supported by IDL.

    See Welcome to the IDL Workbench in the IDL help system for an introduction.

  • Platform Support Changes

    IDL 7.0 is available for Windows, Macintosh OS X, Solaris, and Linux platforms. See Requirements for This Release for complete details.

    The following enhancements have been made to IDL's platform support for the 7.0 release:

    Java Import Bridge: 64-Bit Linux and Windows Support

    The Java Import Bridge (exposed via the IDLjavaObject class) is now supported on all IDL platforms.

    Java Import and Export Bridges: JDK/JRE Version Update

    When using the Java Import and Export bridges, ensure that your application uses version 1.5 or later of the Java Runtime Environment (JRE). When creating Java objects for use by IDL, use the Java Software Development Kit (JDK) version 1.5 or later.

    On Macintosh machines, the version of Java installed along with the operating system should be sufficient, whatever its version number.

  • Language Enhancements

    The following enhancements have been made to the core language for the 7.0 release: GET_LOGIN_INFO MAKE_RT ROUTINE_FILEPATH IDL_START_DIR Preference

  • GET_LOGIN_INFO

    The GET_LOGIN_INFO function returns the name of the computer running the IDL process, as well as the user's login name. See GET_LOGIN_INFO for details.

  • MAKE_RT

    The MAKE_RT procedure creates a stand-alone IDL runtime distribution for one or more platforms. In addition to the IDL binary and resource files required to execute an IDL program in runtime mode, MAKE_RT creates platform-specific launching scripts that allow an end-user to easily launch a runtime application. See MAKE_RT for details.

  • ROUTINE_FILEPATH

    The ROUTINE_FILEPATH function returns the full path to a currently-compiled procedure or function (or a list of procedures and functions). See ROUTINE_FILEPATH for details.

  • IDL_START_DIR Preference

    The IDL_START_DIR system preference replaces two obsolete system preferences: IDL_MDE_START_DIR and IDL_WDE_START_DIR. The value of this preference determines IDL's initial current working directory when you are using the IDL Workbench.

    The IDL_START_DIR preference is ignored when running IDL in command-line mode; in this situation, IDL's initial current working directory is the directory from which IDL was started.

    See IDL_START_DIR for details. See Obsolete IDE Preferences for information system preferences that have been removed.

  • Documentation Enhancements

    In addition to documentation for new and enhanced IDL features, the IDL online help system has been redesigned to use the IDL Workbench's native Eclipse-based help system. The new system replaces the IDL Assistant-based help system used in IDL versions 6.2-6.4, and provides better integration between the help content and IDL itself. As a result, the IDL help content can now contain "active" hyperlinks that execute IDL code or make changes in the IDL Workbench interface.

    See Using IDL Help in the IDL help system for a complete description of the new help interface.

  • New IDL Routines

    The following new functions and procedures were added to IDL in this release.

  • GET_LOGIN_INFO

    Returns the name of the computer running the IDL process, as well as the user's login name.

  • MAKE_RT

    Creates a stand-alone IDL runtime distribution for one or more platforms.

  • ROUTINE_FILEPATH

    Returns the full path to a currently-compiled procedure or function (or a list of procedures and functions).

  • IDL Routine Enhancements

    The following IDL routines have updated keywords, arguments, or return values in this release. See the following topics in the IDL Reference Guide for complete reference information unless otherwise noted.

    PROFILER

    The PROFILER procedure has the following new keyword:

    FILENAME specifies the path to a text file that will contain the profiler results.

  • IDL Object Method Enhancements

    The following IDL object classes have enhanced methods in this release. See the following topics in the IDL Reference Guide for complete reference information.

  • IDLgrBuffer::QueryRequiredTiles
  • IDLgrClipboard::QueryRequiredTiles
  • IDLgrPrinter::QueryRequiredTiles
  • IDLgrWindow::QueryRequiredTiles

    These methods have the following new keyword:

    * PATH specifies the path in the graphics hierarchy used to compute the visible tiles. Each path object reference specified with this keyword must contain an alias. Tile visibility is computed for the version of the image object falling within that path. If this keyword is not set, the PARENT properties determine the path from the current object to the top of the graphics hierarchy and no alias paths are pursued.

    Backward Compatibility

    In the transition from the pre-version 7.0 development environments to the IDL Workbench, we have tried to replicate or enhance the features you've come to expect from IDL. In some cases, however, we have altered or deprecated existing functionality. See Obsolete Features for details.

    This section describes features whose behavior has been altered since IDL 6.4. If your IDL code relies on any of the features whose behavior has changed, you may need to modify your existing code to run it under IDL 7.0. Changes to the ONLINE_HELP Procedure

    Beginning in IDL 7.0, IDL's online help system uses the cross-platform help viewer support provided byt he Eclipse-based IDL Workbench. As a result, the behavior of the ONLINE_HELP procedure has changed in the following ways:

    * No support is provided for displaying user-created topics in IDL's default help viewer. Existing calls to ONLINE_HELP to display topics in the IDL Assistant help viewer (IDL's default help viewer for versions 6.2 - 6.4), a web browser, PDF viewer, or Windows help viewer will all work as they did in previous releases.

    We hope to incorporate support for user-created content in the default IDL help viewer in a future release.

    * The behavior of ONLINE_HELP when the BOOK keyword is not specified has been modified. Previously, IDL would search the directories specified by the !HELP_PATH system variable for files that matched the argument to ONLINE_HELP. Beginning in IDL 7.0, IDL will only search in IDL's own help system for matching topics.

    * The behavior of ONLINE_HELP when the BOOK keyword is specified has changed in the following way: if no file extension is provided to the value of the BOOK keyword, ONLINE_HELP will no longer find topics from IDL's own help system. The behavior with respect to user-created content is unchanged. 发行版更新:ParallelKnoppix2005-04-25 作者:R0meal编译 2005-04-27来自:http://linux.chinaunix.net/news/tech/2005-04-27/1532.shtml
    一份新版本的 ParalleKnoppox 现在已经发布,它为我们带来什么新的功能呢?在这份新版本中,安装过程看来更加流畅和人性化,对话框的字体看起来也舒服多了,安装指南也得到了升级,特别是详细的解释了新的安装方法,还有一些软件和启动的相关设置得到了改进。详细了解版本信息,访问他们的官方发布声明。 ParallelKnoppix是一份重新打造的Knoppix,它可以用LAM-MPI和/或MPI的实现MPICH来配置并行处理机集群。如果这些机器都配置有PXE网卡,让集群启动并运转只需不到15分钟。 [22:55] [ 发表评论 ] 从tetex转向texlive prosper还依赖于tetex,只好将以前的/usr/share/texmf/tex/latex/prosper/复制到这个位置,并运行mktexlsr,
    或者直接修改/var/lib/dpkg/status下的文件,修改包依赖关系后dpkg --configure --pending。
    或者dpkg将deb包解开,修改control文件里面的包依赖,然后重新打包,再用dpkg安装

  • mkdir prosper
  • dpkg -e prosper_1.00.4+cvs.2004.03.29-2_all.deb prosper/DEBIAN
  • dpkg -x prosper_1.00.4+cvs.2004.03.29-2_all.deb prosper
  • vi prosper/DEBIAN/control
  • dpkg -b prosper prosper_1.00.4+cvs.2004.03.29-3_all.deb
  • dpkg -i prosper_1.00.4+cvs.2004.03.29-3_all.deb spawn ssh root@sd$i expect { "password" { send "Passwd\r" expect "SUPERUSER"; log_user 1; send "glance\r" expect "Exit"; send "q\rbdf\rhostname\r" } "SUPERUSER" { log_user 1; send "glance\r" expect "Exit"; send "q\rbdf\rhostname\r"} "hpc1" { log_user 1; send "lsload\rdf\r"} interact { 屏幕取色:Gcolor2 Gcolor2 is a simple GTK2 color selector to provide a quick and easy way to find colors for whatever task is at hand. Colors can be saved and deleted as well. Homepage: http://gcolor2.sourceforge.net/ [22:55] [ 发表评论 ] phpsysinfo phpSysInfo is a PHP script that displays information about the host being accessed. It will displays things like Uptime, CPU, Memory, SCSI, IDE, PCI, Ethernet, Floppy, and Video Information. 要求系统安装了php以及网页服务器。
    Debian系统已经含有此软件包。 [22:55] [ 发表评论 ] 发信人: SNG (Security of Next Generation), 信区: TeX 标 题: 给vim+latex-suite编辑bib文件添加URL的keymap 发信站: 水木社区 (Tue Jun 27 20:56:46 2006), 站内 ieee模板支持Electronic的bib项,非常方便引用网页等online的资源。我用gvim在win 下写tex文件,编辑bib的时候latex-suite支持BBB等四个key map,默认为article,提 供的选项里也没有electronic,因为毕竟不是标准的。但是我article的bib根本不自己 编辑,都是直接从google或者ei导出的,真正需要手写的就是url,于是就通过改latex -suite目录下的bibtex.vim文件,增加了BBE为Electronic的key map。 首先在fields定义里添加 let s:l_standsfor = 'URL' 为什么用l是因为u和r都已经被占了 然后在required fields部分添加 let s:{'Electronic'}_required="tl" let s:{'Electronic'}_retval = '@Electronic{' . s:key . ','."\n" 其中t是title,l是上面提到的URL 第三步在已有的四个IMAP后加上 call IMAP ('BBE', "\ =BibT('Electronic', '', 0)\ ", 'bib') 至于BBE BBU还是URL什么的就随个人喜好了。 最后到BibT函数里在let types = 下面加上一个 \ 'Electronic'."\n". 就大功告成了! 如果不想出现otherinfo项,可以注释掉 let retval = retval.'otherinfo = {}'."\n" 位置在BibT函数倒数第四行。 说明:用的是2006-03-20的bibtex.vim [22:55] [ 发表评论 ] http://www-128.ibm.com/developerworks/cn/aix/library/au-expect/

    实现所有命令行操作自动化的脚本编写工具

    是进行高效的系统和网络管理工作不可或缺的一种工具,不过很多人对它存在着一定的误解。在本文中,将通过一些常见的用例来介绍 Expect 所提供的优点。Expect 在网络管理中发挥着重要作用

    级别: 中级

    Cameron Laird ( claird@phaseit.net ), 副总裁, Phaseit, Inc.

    2007 年 9 月 13 日

    Expect 是进行高效的系统和网络管理工作不可或缺的一种工具,不过很多人对它存在着一定的误解。在本文中,将通过一些常见的用例来介绍 Expect 所提供的优点。

    如果您从事系统和网络管理工作,那么您将需要 Expect。

    更准确地说,您为什么不使用 Expect 呢?对于一些常见的任务,它可以节省大量的时间。尽管您现在可能已经在使用 Expect,但是您可能并不是很清楚下面所描述的一些功能。

    Expect 可以实现命令行交互的自动化

    要从 Expect 中获益,您并不需要掌握有关它的所有内容;让我们从一个具体的示例开始,研究 Expect 如何在 AIX 或者其他操作系统中简化您的工作:

    假设您在一些 UNIX 或者类 UNIX 主机上具有登录帐号,并且您需要更改这些帐号的密码,但是并没有使用网络信息服务(Network Information Service,NIS)、轻量级目录访问协议(Lightweight Directory Access Protocol,LDAP)或者能够在每台计算机上识别出您是相同的登录用户的一些其他机制对这些帐号进行同步。在大多数情况下,登录到一台特定的主机,并运行合适的 passwd 命令并不会花费很长的时间,可能只需要一分钟而已。但是因为无法将您的密码编写在脚本中,所以您 必须 进行“手动”登录,是这样吗?

    其实并不是这样的。事实上,标准 Expect 分发版(完整的分发版)中包括一种命令行工具(以及描述其使用的手册页面!),该工具恰好可以负责完成这项烦琐的工作。 passmass (请参见 参考资料 )是使用 Expect 编写的一个简短的脚本,它可以使得在二十台计算机上进行密码更改的工作就像在一台计算机上进行密码更改那样简单。不需要反复地输入相同的密码,您可以只启动一次 passmass ,并允许您的桌面计算机负责更新每个单独的主机。您节省了大量时间并可以稍事休息,同时对于已经输入过的内容,极大地降低了错误输入的可能性。

    Expect 的限制

    这个 passmass 应用程序是一个非常优秀的模型,它说明了 Expect 的许多常规特性:

    • 这个工具值得我们去使用和研究:这个实用工具已经编写完成,并且可以免费地下载,它易于安装和使用,可以节省大量的时间和精力。
    • 从某种意义而言,它的作用是“无关紧要的”。如果任何操作都“按照既定的规则”进行(如果您使用了 NIS 或者一些其他的域身份验证或单点登录系统),或者可以通过编写脚本进行登录,那么就不需要使用 passmass 了。但实际情况并不总是这样的,而 Expect 非常适合于处理各种各样现有的问题。也许 Expect 能够帮助您节省更多的时间,以便您能够使您的配置更加合理化,这样一来您就不再需要 Expect 了。在此期间,您可以充分地利用它。
    • 对于分布式的环境, passmass 仅使用 telnet rlogin 或者 slogin 进行登录。我希望当前所有的 developerWorks 读者都不再使用这些协议,而是使用 ssh passmasss 没有 对 ssh 提供全面的支持。
    • 另一方面,几乎所有与 Expect 有关的内容都编写得非常清楚,并且可以免费获得。只需要使用三行简单的内容(至多)就可以对 passmass 进行增强,以支持 ssh 和其他选项。
    • 您可能已经了解了足够多的内容,完全可以开始编写或者修改您自己的 Expect 工具。当然,实际上 passmass 分发版中包含了以 ssh 方式进行登录的代码,但是省略了相应的命令行解析以到达这部分代码。本文介绍了一种方法,您可以修改分发版源代码,对 ssh telnet 以及其他协议进行同样的处理:
      清单 1. 经过修改的、接受 -ssh 参数的 passmass 片段

                          
               } "-rlogin" {
                  set login "rlogin"
                  continue
              } "-slogin" {
                  set login "slogin"
                  continue
              } "-ssh" {
                  set login "ssh"
                  continue
              } "-telnet" {
                  set login "telnet"
                  continue
            

      在我自己的代码中,我实际上从这个“样本”中提出了更多的内容。现在, passmass 第 100 行附近的这一连串测试,非常好地说明了 Expect 的可读性。这里并没有涉及到很深的编程技术,不需要面向对象、单体应用程序、协同例程,或者其他巧妙的技术。您只是请求计算机负责您通常进行的输入工作。恰好,这个简单的操作步骤可以节省大量时间和精力。

      什么是 Expect?

      Expect 究竟 什么,您应该如何使用它呢?

      “Expect”涉及到一些独特的概念,许多经常使用 Expect 的用户对这些概念并不是十分清楚:

      • Expect 是一种特定的、高级的和通用的编程语言,其语法与 Tcl 相同,并增加了 Tcl 中所没有的一些特殊用途的命令。
      • Expect 是一种可执行程序,从它正确地处理用 Expect 语言编写的输入的角度来看,它实现了这种语言。
      • expect 命令是其中的一个命令,Expect 以此对 Tcl 进行了扩展。
      • Expect 是一个 Tcl 包。一般说来,这意味着任何 Tcl 应用程序都可以在运行时加载 Expect 功能。
      • Expect 是一个基于 C 源代码的库,而这些 C 源代码则深入到 Expect 可加载的包和 Expect 可执行程序。
      • Expect 是某种工具的抽象概念,该工具:
        • 实现终端交互的自动化,甚至在涉及到密码或者其他特殊项目的情况下
        • 实现了一种“对话”模型,通过它对消息和响应的简单规律进行编码
        在这种抽象中,不存在特定于 Tcl 的内容,实际上,现在有几种使用其他语言(如 Python、Perl,等等)的 Expect 模型的独立实现。尽管本文中的示例都采用基于 Tcl 的 Expect 进行表述,但是可以使用其他语言来编写所有这些示例。没有理由因为您熟悉或者不熟悉 Tcl,而限制您对 Expect 的使用。
      请注意,考虑到一些技术细节超出了本文的关注重点,在前面的描述中,我稍微有些歪曲事实;例如,常规的 Expect 可执行程序不仅扩展了 Tcl 命令集,它还可以识别启动时的一些额外的命令行参数。尽管这些内容并不是专门针对主要的主题:一个简短的 Expect 程序所能够为系统管理员完成的工作,超出了大多数人的预期。

      在了解了这个背景信息之后,“ passmass 是一个 Expect 应用程序”表示:

        passmass 是一个以 Expect 语言编写的文本文件。
      • 如果您在正确地安装了 Expect 和 passmass 的主机上执行 expect passmass ... ,那么您将得到正确的 passmass 功能。
      请注意,具体的执行方法可能有一些变种:可以在一个 Tcl 解释器中以交互的方式加载 Expect、运行 passmass 、创建 passmass 作为一个独立的可执行程序,等等。同样地,这些替代方法超出了本文所关注的重点。

      网络管理示例

      让我们考虑一项更大的挑战,网络操作中心的日常操作中一项更典型的操作:检索一组托管的 Cisco 交换机的当前配置信息。尽管有些站点使用 SNMP 或者 HTTP 来进行这些操作,但是更常见的是使用控制台或者频内 telnet 会话来获取该信息。许多管理员认为,完成这项工作唯一可行的方法是输入与 清单 2 中所示类似的命令。
      清单 2. 典型的“手工”配置自检

                          
              telnet $MY_ROUTER
              [User: admin]
              [password: ...]
              CCNA01# show running-config
              [... Current configuration:
               ... version 12.0 ...
               FIFTY LINES MORE OF CONFIGURATION DETAIL
                  

      其实并不是这样的;实际上,通过在 cron、回复邮件(mailback)服务器,或者类似的作业控制机制(请参见清单 3)中进行调用,这项工作完全可以实现自动化。
      清单 3. 配置自检的自动化

                          
            #!/usr/bin/expect
            # initialize host, password, ...
            package require Expect
            set prompt {[00m# }
            spawn telnet $host
            expect {User: }
            send admin\r
            expect password:
            send $password\r
            expect -exact $prompt
            send "show running-config\r"
            expect -exact $prompt
            send exit\r
        

      这个脚本可以自动地检索路由器的配置信息,即在正确地编写了脚本之后,对其进行监视时不再需要输入密码或者进行干预。

      一些常见的混淆

      这个示例是典型的 Expect 使用情况,其中有几点值得注意。首先,不存在任何适用于各种情况的解决方案。许多管理员在获得 Expect 时都认为它是一个单独使用的工具,以解决他们当前所碰到的问题。那不是 Expect。Expect 与电子铁钉寻找器 (electronic stud finder) 不同,后者可以不依靠任何其他工具、独立地查找铁钉。Expect 更像是一个手钻:您必须将其与合适的钻头,或者转换接头、孔锯,或者其他附件进行组合,才能真正实现它的用途。

      同样地,Expect 至少需要进行一些自定义工作。当然,我通常使用 Expect 来解决一些其他工具所无法轻松解决的问题。running-config 的案例说明了,只需要几行内容,Expect 就可以自动地获得大量的信息。即使是这个简单的示例,也呈现出 Expect 所带来的一些问题。例如,这种特定的自动化,需要将管理密码以明文的形式嵌入到 Expect 脚本中;您需要判断,它是否适合于您的具体环境。

      这个案例至少在一些更多的方面是非常典型的。$prompt 让我感到有些奇怪。屏幕上所显示的是 CCNA01# ;对于许多设备来说,这是非常典型的,这个提示符实际上嵌入了一些不可见的控制字符。幸运的是,Expect 提供了各种有价值的调试开关,以报告其交互过程;这正是我确定 CCNA01 所生成的各种字符的方法。

      另外,如前所述,清单 3 返回了整个会话,包括我所需要的配置报告,还加上登录和退出作为其开始和结束。隐含在一般请求中的另一个有关 Expect 的常见误解是“检索一个命令的值”。Expect 并没有提供这些语义。当您坐在键盘前并输入一个命令时,您将它的操作认为是在下一个提示符之前所看到的相关显示。对于网络互连协议(如 telnet),在结果和提示符之间实际上并没有什么区别;您可以作为一个观察者对这些内容的含义进行分析。

      与这种网络通信模型完全一致,Expect 并不直接区分结果和提示符。所有的 Expect 都称为对话,即它通过 send 发送的字符序列,以及它所期望(expect)的内容。因此在实际中,我使用一个正则表达式解析来为我提供所需要的细节信息。Expect 的扩展正则表达式功能非常强大,并且很容易通过代码确定格式。现在,让我们重点关注通常无法通过脚本实现自动化的广泛主题。

      请记住,Expect 是一种功能强大的、通用的语言。实际的 Expect 应用程序通常用于解析命令行参数、将结果显示在分栏的表格中、从数据库中检索历史数据、显示图形用户界面 (GUI),以及更多的用途。所有这些都是常规的计算工作,本文中的示例并没有展示这些方面的内容。文本的重点是正确地理解 Expect 独特的价值。

      使用与清单 3 中所示类似的解决方案,网络管理员通常会考虑下一步的“水平方向的”增强:从大量类似的计算机检索这类报告。Expect 提供了循环构造 foreachwhile 等等,从而使得这样的工作变得更加简单。

      它也可能很快地变得无法接受。假设您负责上百台 LAN 主机,这是一个比较常见的情况。您使用一个 Expect 脚本自动地依次登录到这些计算机,并检索重要的数据。现在,您对该脚本稍微进行一下抽象,以便对整个集合进行遍历。

      问题是,运行所得到的脚本可能会花费很长的时间。它登录到一台主机,请求结果,接收结果,注销,然后转向下一台主机,请求一个新的结果,等等。这个过程中的延迟使得人们希望能够使用某种方法一次性地请求所有的结果,并按照结果到达的顺序对其进行收集,导致这些结果不同顺序的原因包括网络滞后、不同的负载,以及其他延迟。

      有一种方法可以实现这种操作。实际上,Expect 提供了一些非常好的功能来同时管理多个对话。本文提供了一个程序的示例,该程序多次进行登录,在每个登录上执行一些长时间运行的命令,然后根据结果到达的顺序进行接收;对这个案例进行了整理,以便这些结果返回的顺序与其启动顺序相反(请参见清单 4)。
      清单 4. 并发检索来自多个登录的报告

                          
             #!/home/claird/local/ActiveTcl/bin/tclsh 
             package require Expect
             log_user 0
             # Initialize user, passphrase, ... here.
                 # Sequentially login and issue time-consuming commands to all
                 # hosts.
             for {set i 0; set delay 8} {$delay > 0} {incr i; incr delay -1} {
                 spawn ssh $user@$host
                 set sid($i) $spawn_id
                 expect rsa':
                 send $passphrase
                 expect "Last login"
                 expect -ex $prompt
                 set active($sid($i)) $i
                 send -i $sid($i) "echo `date`; sleep $delay; echo `date`; echo \
                 '$delay done on $i.'\r"
             while {[llength [array names active]]} {
                 expect -i [array names active] -ex $prompt {
                      puts "RECEIVED:  $::expect_out(buffer)"
                      send -i $expect_out(spawn_id) exit\r
                      expect -i $expect_out(spawn_id) eof
                      unset active($expect_out(spawn_id))
        

      当您运行这个脚本时,将看到与清单 5 所示类似的结果。
      清单 5. 运行清单 4 所得到的结果
                          
             RECEIVED:  echo `date`; sleep 1; echo `date`; echo '1 done on 7.'
             Mon Apr 23 22:15:15 UTC 2007
             Mon Apr 23 22:15:16 UTC 2007
             1 done on 7.
             RECEIVED:  echo `date`; sleep 2; echo `date`; echo '2 done on 6.'
             Mon Apr 23 22:15:15 UTC 2007
             Mon Apr 23 22:15:17 UTC 2007
             2 done on 6.
             RECEIVED:  echo `date`; sleep 3; echo `date`; echo '3 done on 5.'
             Mon Apr 23 22:15:15 UTC 2007
             Mon Apr 23 22:15:18 UTC 2007
             3 done on 5.
             RECEIVED:  echo `date`; sleep 8; echo `date`; echo '8 done on 0.'
             Mon Apr 23 22:15:14 UTC 2007
             Mon Apr 23 22:15:22 UTC 2007
             8 done on 0.
                  

      在编程的层次上,请注意,所有这些登录都是通过基于密码的 ssh 登录到相同的主机,并使用相同的用户和密码凭据。在一个更实际的示例中,可以通过更多行的代码来管理各个不同的主机,对每个主机使用不同的帐号和登录协议。尽管对于那些对网络管理员非常 价值的命令,sleep 是一个很好的模型;但是没有理由先睡眠数秒钟,然后再返回。

      即使这个示例,也无法尽述 Expect 的所有功能。Expect 还提供了使用一个内置的套接字编程接口,直接管理 TCP/IP 对话的功能,并且它可以实现半自动化,在两种不同的模式之间来回切换,用户在其中一种模式中输入部分对话,而 Expect 在另一种模式中实现所有操作的自动化。

      我们将在以后的文章中介绍这些主题。本文的目标是,展示 Expect 中包含了大多数管理员并不知道的许多内容,具体来说是了解了该工具后,马上就能够解决网络管理工作中各种常见的问题。在脚本中使用密码和密码条目,以及并发地控制多个连接,这些功能都是非常强大的。

      Expect 可以完成所有看起来无法实现自动化的工作:在脚本中使用密码条目、登录到远程用户的会话和返回对他或者她的控制,以及更多的工作。尽管它已经得到了广泛使用,但是 Expect 却常常被人们所误解。正确地理解有关 Expect 的一些基本知识(如何调用它、它的对话模型、它的编程辅助,等等),以便在系统和网络管理工作中更充分地发挥它的作用。

      [22:55] [发表评论] 10 print*,'Please input start point' read*, sx,sy 20 print*,'Please input end point' read*, ex,ey 30 print*,'Please input current point x' read*, px write(*,'(a8,f5.2,a1,f5.2,a1)'),'Result:(',px,',',(ey-sy)/(ex-sx)*(px-sx)+sy,')' print*,'If you want change START point, please input s' print*,'If you want change END point, please input e' print*,'If you want change CURRENT point, please input p' read*,c selectcase(c) case('s') goto 10 case('e') goto 20 case('p') goto 30 endselect a=fix((0.9-0.1)/0.1),得到a=7,同时a=fix((0.8-0.1)/0.1),也得到a=7
      RSI的回答是这样的:

      This probably has something to do with the nature of floating-point arithmetic and storage of decimal numbers. See the reference guide entry for the MACHAR routine for more information.

      According to the mathematical expression you have entered, the resulting value for the variable "a" is indeed 8.0 :

      IDL> a = (0.9-0.1) / 0.1
      IDL> HELP, a
      A FLOAT = 8.00000

      But upon closer inspection, the variable actually stores the closest possible representation of 8.0 given 32-bit IEEE precision :

      IDL> PRINT, a, FORMAT='(F9.7)'
      7.9999995

      The FIX data type conversion routine truncates at the decimal point, so the resulting value gets rounded down to 7. In general, it is best to make use of the ROUND routine first when performing conversion from floating-point to integer data types in IDL :

      IDL> b = FIX( ROUND( (0.9-0.1) / 0.1) )
      IDL> HELP, b
      B INT = 8 [22:55] [发表评论] 利用UltraEdit编辑LaTeX, UltraEdit功能强大,是一个可代替WinEdt的好工具 http://www.ctex.org/forums/index.php?showtopic=21740&hl=
      说明:原载清华BBS TeX版的一个版友的经典文章,借花献佛转贴于此吧。
      TeX编辑器是WinEdt。除了对中文spellcheck、自动换行支持不好外,还有很多“智能”的毛病,比如经常一回车,刚敲过的两 行就被WinEdt自动排版了。UltraEdit实在是令人叹为观止的一款文本编辑器,我一直使用其编辑文本文件,如果能用它来编辑LaTeX就好了。 刚才试验了半天,发现UE早已为我们准备好这种功能了,真的是很爽,拿出来共享一下。

      1. LaTeX关键字的自动着色。
      到UltraEdit的官方网站下载Wordfile,具体在
      http://www.ultraedit.com/downloads/additional.html
      打 开UltraEdit目录下的wordfile.txt文件,把你下载下来的wordfile附加在末尾,用copy/paste就行了。另外 wordfile.txt中是以"/L*"来作为一种语言的开始标记,其中"*"代表数字序号,注意latex的序号不要和原先的语言(如C、Perl、 HTML等)冲突就行了。这时候你再打开一个.tex文件看看,是不是耳目一新?

      2. LaTeX Tag的自动插入。还是在
      http://www.ultraedit.com/downloads/additional.html
      下 载latextag.txt,按照对应格式copy/paste到UE目录下的taglist.txt文件中。记得要在最后的[Group List]里加上对应项目。 然后打开UE,按Ctrl+F8打开tag后,在tags窗口上点击鼠标右键,选择Modify Tags ,在弹出窗口上选择 browse,将taglist.txt定位一下就可以了

      3. 不脱离UltraEdit环境即对TeX文件进行编译和预览。
      这部分实现WinEdt的部分功能,通过几个工具栏按钮来编译、预览LaTex。

      3.1 编译LaTeX
      在UE的菜单项,选择Advanced->Tool Configurations,
      Command Line: Latex "%p%n.tex"
      Working Directory: %p
      Menu Item Name: LaTeX
      Save Active File: 选中
      Show Dos Box: 选中
      Capture Output: 选中
      然后点Insert,这样就加入了一个菜单项。这时用UE打开一个Tex文件,然后在Advanced菜单的最下面多了个菜单项:Latex,点它,就可以编译LaTeX文件 了!还可以用UE的自定义工具栏功能,把自定义的菜单项加到工具栏上。
      (补充:在这里,可以通过对话框的ADVANCE选项,添加工具的图表,下同)

      3.2 用YAP预览
      其他的就大同小异了。
      Command Line: yap "%p%n.dvi"
      Working Directory: %p
      Menu Item Name: View with YAP
      Windows Program: 选中
      注,其他皆不选。

      3.3 编译成ps文件
      Command Line: dvips "%p%n.dvi"
      Working Directory: %p
      Menu Item Name: DVIPS
      Windows Program: 不选
      Save Active File: 不选
      Show Dos Box: 选中
      Capture Output: 不选

      3.4 用GSView预览
      Command Line: "gsview32" "%p%n.ps"
      Working Directory: %p
      Menu Item Name: View with GSView
      Windows Program: 选中
      Save Active File: 不选
      Show Dos Box: 不选
      Capture Output: 不选

      3.5 制作 PDF 文件
      Command Line: ps2pdf "%p%n.ps"
      Working Directory: %p
      Menu Item Name: PS2PDF
      Windows Program: 不选
      Save Active File: 不选
      Show Dos Box: 选中
      Capture Output: 不选

      3.6 用Acrobat Reader预览生成的PDF文件
      Command Line: "AcroRd32.exe" "%p%n.pdf"
      Working Directory: %p
      Menu Item Name: View with Acrobat
      Windows Program: 选中
      Save Active File: 不选
      Show Dos Box: 不选
      Capture Output: 不选

      搞定!体验一下UltraEdit和LaTeX的完美组合吧 :)

      提醒一下,gsview32,和acrobat都不在系统的path里,因此要添加完整路径。另外,关于用ultraedit的yap回溯如下,不过如果路径里有中文好像有问题。
      ===========
      利用UltraEdit编辑LaTeX——在Yap预览时定位源文件

      前面发过一篇文章,讲了一下用UltraEdit编辑LaTeX的一些用法和技巧。但是WinEdt和Yap结合非常紧密,用Yap预览由WinEdt生成的dvi文件时,看到需要改的地方,双击一下,就可以打开WinEdt,并且定位到要修改的那一行,非常方便。下午研究了一下,发现用UltraEdit一样可以实现这个功能!

      首先打开Yap,菜单 -> View -> Options -> Inverse Search,这个页面
      是控制定位源文件的。在“Program”一栏一般是WinEdt,或者为空。在第二栏“Command”里,写上UltraEdit的命令行方式,比如:

      "D:\Program Files\UltraEdit\uedit32.exe" "%f/%l"

      这 一行的作用Yap讲的很清楚,就是用来打开dvi相应的tex文件的程序及设置。其中 %f 是tex文件的名字,%l 是鼠标所处的行号。然后点确定,关闭对话框。UltraEdit功能真是强大,它支持用命令行打开文件时指定行号和列号的定位。现在还没有结束,你需要保 证你的dvi文件里包含回溯用的源文件信息。在编译latex的时候,加上一个options (Thanks aloft @ bbs.ctex.org):

      latex -src-specials test.tex

      然后打开生成的 test.dvi,会发现Yap的状态栏里会显示:

      test.tex L:26

      即该dvi文件对应的源文件的名字,以及当前鼠标所处在源文件的行号。如果编译 的时候不加 -src-specials,这个地方会提示:

      (no source specials found)

      OK,在Yap里双击一下你想去的位置,看看UltraEdit打开了没?再看看光标所 处的行,是不是你想去的地方? [22:55] [发表评论] [王咏刚,2004年8月]本文发表于2004年10月《程序员》

      “Fortran 2003!面向对象的Fortran!自由、开放的Fortran!拥抱Fortran 2003吧!”我手舞足蹈、兴奋异常。

      “Fortran 2003?你发什么颠?”地球物理系一位戴着宽边眼镜的博士生拦住了我,鄙夷的目光从厚重的眼镜片里直射过来,“我昨天才用Fortran 77做完了课题。你说的‘面向对象’、‘自由’、‘开放’什么的,都是你们程序员的鬼把戏吧?它们能让我的SCI论文数量翻番吗?能让我提前评上副教

       1. 不断变革的Fortran

      2004年5月,Fortran 2003,这个新世纪里诞生的Fortran语言新标准,终于在ISO、IEC的联合工作组JTC1/SC22/WG5以及美国Fortran委员会 NCITS/J3的共同努力下,走完了编撰、修订的最后一步。不出意外的话,再过一两年,支持Fortran 2003的开发工具就会充斥Fortran世界;那些仍在坚守Fortran 77阵地的老用户们也会自然而然地把质疑的目光从Fortran 90/95投向更富有革命精神的Fortran 2003。

      要了解Fortran 2003,我们有必要先简单回顾一下Fortran语言的历史。

      1954到1957年间,世界上第一种高级程序设计语言——Fortran诞生于IBM公司。Fortran这个名字的原意是IBM Mathematical FORmula TRANslation,其设计目的在于为科研人员提供一种符合数学思维习惯的高级语言,以满足科学计算的需要。1960年代,在美苏太空竞赛的大背景 下,在国防、教育和科研领域对高性能计算工具的迫切需求下,Fortran语言蓬勃发展,成为了当时统治计算机世界的高级语言之王。

      1962年,为了统一不同公司、不同硬件平台上的Fortran语言,人们开始了Fortran语言标准化的尝试,这也是程序设计语言发展史上的第 一次标准化历程。1972年,Fortran 66标准(标准编号来自标准草案的制定时间)正式发布。但因为标准文档过于简单,约束力不强,Fortran 66标准发布后,Fortran语言的统一问题并没有得到彻底解决。

      1978年,Fortran语言标准的第一个修订版本正式发布,这就是我们熟悉的Fortran 77了。Fortran 77细致描述了Fortran语言的各种特征,让Fortran成了一种真正规范、高效和强大的结构化程序设计语言。此后,无数性能优异的Fortran 77编译器和开发工具的问世更是让Fortran 77成为了几乎所有理工科学生的必修课。

      尽管Fortran 77的影响力一直延续到了今天,但Fortran语言不断变革的历程却从未停止过。为了改变Fortran 77那种老旧的、从打孔卡片遗传来的语言风格,为了给Fortran注入更多的现代特征,人们于1991年发布了崭新的Fortran 90标准。除了自由的代码风格外,Fortran 90还为Fortran语言引入了模块、接口、自定义(派生)数据类型和运算符、可动态分配和参与复杂运算的数组、泛型过程、指针、递归等重要的语法特 征。这不但使结构化的Fortran语言更趋完善,也使其具备了少量的面向对象特性。

      1997年发布的Fortran 95标准在Fortran 90的基础上,吸收了HPF语言(High Performance Fortran,Fortran语言在并行环境下的一个变种)的优点,提高了Fortran语言在并行任务中的表达和计算能力,并进一步完善了派生类型、 指针、数组等要素的相关语法。

      以Fortran 66为基准,我们可以把后续的Fortran 77/90/95以及本文介绍的Fortran 2003均视为对Fortran语言标准的修订。在历次修订中,Fortran 77和Fortran 95是修订幅度相对较小的版本,而Fortran 90和Fortran 2003则是锐意变革的“大修”版本。如果说Fortran 90是在“形式”上让Fortran脱胎换骨的话,那么,Fortran 2003就近乎彻底地解决了Fortran语言现代化的问题:完整的面向对象机制、灵活的语法特征、统一的接口标准……这些难道还不足以让Fortran 迷们跃跃欲试吗?

       2. 面向对象的Fortran
       

      从结构化程序设计到面向对象,这是大多数高级语言的发展、演变规律,Fortran也未能免俗。在Fortran 77中,由于缺乏对数据抽象和数据封装的基本支持,人们很难引入面向对象的理念和方法。在Fortran 90/95中,尽管我们可以用派生类型(Derived Type)和模块(Module)模拟一部分面向对象的特性,但却无法实现真正意义上的封装和继承。

      对数据和相关操作的封装是面向对象的基础。传统的结构化程序设计语言大多拥有简单的数据封装能力(如Pascal语言中的record),但缺乏对 操作封装的支持。当我们为结构化程序设计语言引入面向对象机制时,在语法层面一般有两种思路:一种是引入一个全新的语法容器,允许用户借助该容器定义出封 装了数据和操作的统一数据类型,例如,C++在C语言的基础上扩展出了class的概念,并以class为中心支持面向对象编程;另一种是通过某种机制, 将原有的数据封装容器和表述操作的过程或函数捏合在一起,例如,Ada 95利用Ada 83中已有的概念,将private type和相关操作封装在package中,创建了完整的面向对象机制。Fortran 2003对Fortran 90/95的改造正是遵循着后一种思路进行的。

      首先,Fortran 2003第一次引入了过程指针(Procedure Pointer)的概念。Fortran 90/95只支持普通指针。为了实现回调机制,Fortran 90/95特意引入了用过程名充当形式参数(Dummy Procedure)的语法,但这种语法还无法解决在数据类型中内嵌相关操作的问题。在Fortran 2003中,我们可以使用过程指针将数据和操作绑定在一起:

      TYPE point
       REAL :: x, y
       PROCEDURE (testif), POINTER :: test
      END TYPE

      这种绑定是一种运行时的动态绑定,我们可以根据需要为过程指针赋值,这类似于我们在C语言的struct中嵌入函数指针。

      其次,如果与类型相关的操作在编译时已经预知,我们就可以直接使用Fortran 2003提供的类型绑定过程(Type-bound Procedure),将数据和操作关联在一起:

      TYPE point
       REAL :: x, y
      CONTAINS
       PROCEDURE :: test => my_test
      END TYPE

      这样,在同一个模块中,类型和相关操作相互关联,用户可以直接使用CALL p1%test或类似的代码来访问特定操作,这已经非常近似于Ada 95的封装机制了。

      和C++或Java语言相比,Fortran 2003的这种过程绑定方式较为靠近语言设计的底层。例如,对于绑定在point类型中的my_test过程,我们必须显示指明,该过程的第一个参数为point类型:

      SUBROUTINE my_test(a)
       TYPE(point), INTENT(IN) :: a
      END SUBROUTINE

      这里的参数a相当于C++或Java方法中隐含的this参数,其目的是将调用该操作的对象实例传入过程。我把这种显示实现this参数的做法称为 “赤裸裸的面向对象”。尽管写起来稍嫌繁琐,但这种“赤裸裸”的做法也有不少好处。例如,我们可以在Fortran 2003中使用NOPASS属性禁止传递对象实例,或通过PASS属性改变对象实例参数在过程参数表中的位置。

      Fortran 90/95已经允许用户自定义运算符过程。现在,Fortran 2003则进一步允许用户将运算符过程绑定到特定的类型,其方法和绑定普通过程类似:

      TYPE point
       REAL :: x, y
      CONTAINS
       GENERIC :: OPERATOR(+) => plus
       GENERIC :: ASSIGNMENT(=) => assign
      END TYPE

      有了完善的数据和操作封装机制,Fortran 90/95中简单的访问权限控制属性——PRIVATE和PUBLIC就不能满足要求了。Fortran 2003扩展了PRIVATE和PUBLIC的使用范围,允许PRIVATE类型中出现PUBLIC成员,同时又增加了PROTECTED属性,以限定某 个成员的取值只能由自己所属的模块修改。

      Fortran 2003增强了派生类型的初始化和构造语法。尽管我们在Fortran 2003中还不能像在C++里那样随心所欲地定义各种构造函数,但仍可以较精确地控制对象的初始化过程。此外,Fortran 2003允许我们为类型定义终结子例程(Final Subroutine),以完成对象销毁时的清理工作。终结子例程可以定义多个,像这样:

      TYPE point
       REAL :: x, y
      CONTAINS
       FINAL :: finish1, finish2
      END TYPE

      在Fortran 2003中,继承机制是通过类型扩展(Type Extension)实现的。相关的语法和大多数面向对象语言的继承机制没有什么不同:

      TYPE, EXTENDS(point) :: funny_point
       LOGICAL :: funny = .TRUE.
      END TYPE

      在扩展类型中,可以直接通过基类型的名称来引用基类型的成员,这类似于C++中引用基类成员的语法。

      单从封装和继承这两个层面看来,Fortran 2003对Fortran 90/95的扩展就是革命性的。当年,Fortran 90刚问世的时候,许多人迫不及待地宣称Fortran已经是面向对象的语言了。殊不知,Fortran 90/95中的面向对象机制还不如Visual Basic 6.0中的类模块(Class Module)来得成熟,更不要说与真正面向对象的Fortran 2003相提并论了。

       3. 自由的Fortran 

      灵活性一直是Fortran语言的一个弱项。早期的Fortran甚至不支持内存的动态分配。Fortran 90引入了指针的概念,全面支持数据的动态存取,同时也引入了泛型过程(Generic Procedure)的机制,以支持与C++的函数重载类似的功能。在此基础上,Fortran 2003通过参数化派生类型、覆盖、多态型等机制,进一步增强了Fortran语言的灵活性。例如:

      TYPE point(k, n)
       INTEGER, KIND :: k = KIND(0.0D0)
       INTEGER, LEN :: n
       REAL(KIND=k) :: x, y
       CHARACTER(LEN=n) :: name
      END TYPE

      基于上面这样的参数化派生类型(Parameterized Derived Type),我们可以在定义对象时,根据需要指定对象的具体类型参数,也可以在程序运行期间,动态指定可分配内存对象的类型参数(Deferred Type Parameter)。

      除了Fortran 90已经实现的重载(Overloading)机制以外,Fortran 2003还允许扩展类型覆盖(Overriding)基类型中的类型绑定过程。更重要的是,Fortran 2003通过抽象类型(Abstract Type)、延迟绑定(Deferred Binding)、多态实体(Polymorphic Entity)、类型选择结构(SELECT TYPE)等要素完整地实现了面向对象语言必备的多态机制。举例来说,我们可以声明下面这样的抽象类型:

      TYPE, ABSTRACT :: point 
       REAL :: x, y
      CONTAINS
       PROCEDURE(testif), DEFERRED :: test
      END TYPE
      ABSTRACT INTERFACE
       SUBROUTINE testif(p)
        CLASS(point), INTENT(in) :: p
       END SUBROUTINE
      END INTERFACE

      上述代码相当于在C++或Java语言中声明了一个抽象类,其中的test过程相当于C++语言中的一个纯虚函数,只有接口声明,而没有实现代码。在此基础上,我们可以从抽象类型point扩展出具体的子类型。

      当某个对象的具体类型在运行时才能确定时,我们可以用CLASS关键字(这里的CLASS指的是一组有继承关系的类型,与C++中的class并不等同)定义一个具有多态功能的指针或可分配对象:

      CLASS(point), POINTER :: p

      现在,指针p可以指向任何由point扩展的具体类型的对象,这种使用方式已经和我们在C++中用基类指针引用派生类对象的做法一模一样了。使用这 种具有多态性特征的实体时,我们还可以用Fortran 2003提供的内部过程SAME_TYPE_AS和EXTENDS_TYPE_OF来判定对象的类型,这是一种简单的运行时类型识别(RTTI)机制,其 功能和C++语言中的typeid关键字相仿。

      更有趣的是,Fortran 2003允许代码根据多态实体的实际类型,在运行时执行特定的程序流程:

      CLASS(point), POINTER :: p
      p => a
      SELECT TYPE ( pp => p )
      TYPE IS (point_3d)
       PRINT *, pp%z
      TYPE IS (point_2d)
       PRINT *, pp%x
      END SELECT

      这种语法在程序设计语言中比较少见。在Java或C#等具备较强的RTTI和Reflection功能的语言中,我们可以用switch语句结合类型标识实现类似的功能,如下面的C#代码:

      void foo(Point p) {
       switch(p.GetType().FullName) {
        case "Science.Point2D":
         MessageBox.Show("2D point");
         break;
        case "Science.Point3D":
         MessageBox.Show("3D point");
         break;
       }
      }

      但在Fortran这样不依赖于虚拟机和中间代码的纯编译型语言中,能够拥有如此方便的SELECT TYPE语句,实在是Fortran用户的一大幸事。

      其他一些较小的语法功能扩充也能反映出Fortran 2003制定者对语言灵活性的追求。比方说,ASSOCIATE语句可以让Fortran用户体验到比C语言的宏定义更为便捷的复杂表达式替换功能:

      ASSOCIATE ( Z => EXP(-(X**2+Y**2)) * COS(THETA) )
       PRINT *, A+Z, A-Z
      END ASSOCIATE

      再比方说,在Fortran 2003中,可以拥有ALLOCATABLE属性的变量已不再限于数组对象,参数化派生类型的对象也可以在定义时省略参数,而在动态分配时指明:

      TYPE(point(KIND(0.0D0), n=20)) :: a
      TYPE(point(KIND(0.0D0), n=:)),ALLOCATABLE :: b
      ALLOCATE(b,SOURCE=a)

      对于科学计算语言中最重要的数组(矩阵)操作,Fortran 2003也提供了更多的新功能。例如,为可动态分配的数组变量赋值时,目标数组的形状可以根据源数组的形状自动调整,并自动完成内存空间的重新分配,用户 也可以使用新增的MOVE_ALLOC内部过程强制改变某个数组的形状:

      REAL, ALLOCATABLE :: a(:), temp(:)
      ALLOCATE(a(-n:n)
      ALLOCATE(temp(-2*n:2*n))
      temp(::2) = a
      CALL MOVE_ALLOC(TO=a, FROM=temp)

      Fortran 2003允许我们为指针类型的参数增加INTENT属性,这为那些与动态数据结构(如链表)相关的算法程序提供了更多的选择空间。Fortran 2003引入了IMPORT语句,允许接口声明中引用接口所在模块内的相关定义。Fortran 2003还允许我们在USE语句中,改变被引用模块内自定义运算符的名称。

      总之,借助Fortran 2003提供的更加灵活的语法特性,我们能更容易地编写出可以适应不同数据类型、不同应用环境的可复用代码。对于Fortran语言拓展应用领域、发掘潜在用户的目标而言,这些灵活性都是至关重要和不可或缺的。

       4. 高性能的Fortran

      与其他科学计算语言或工具相比,Fortran语言在性能上历来是出类拔萃的。因为语言本身专门针对数值计算、矩阵处理等功能进行了优化,大多数 Fortran编译器产生的可执行代码在效率上甚至会超过以高效著称的C或C++语言。为了在高性能的并行处理系统(如IBM的“深蓝”和我国的“曙 光”)上获得更出色的执行效率,Fortran 95还特意吸收了HPF语言的优点,为Fortran语言增添了若干支持并行计算的语法特征(比如著名的FORALL语句和PURE过程)。

      继续改进Fortran语言的计算性能当然也是Fortran 2003的任务之一。一个最明显的例子是,Fortran 2003引入了VOLATILE属性。这个属性类似于C语言或Java语言中的volatile关键字。编写过并发或实时应用的程序员都知道这个含义为 “易变”的关键字的价值:在并发系统中,如果没有这个关键字的帮助,我们就必须时刻警惕共享数据的取值是否已被正确刷新。

      不过,相对而言,Fortran语言本身的并行计算机制仍不算十分健全。编写并发或实时程序时,Ada语言中的任务(Task)管理和同步(Synchronization)机制,或是Java语言中的多线程同步特性都可以为程序员提供更有力的支持。

      实际上,Fortran 95和Fortran 2003陆续引入并行语法的目的之一是消除标准Fortran语言与已经存在并得到广泛应用的各种Fortran语言变种之间的隔阂,允许同一份 Fortran代码在不同的语言环境间移植。至少到Fortran 2003为止,标准Fortran语言还没有能力完全替代以HPF为代表的“高性能”Fortran语言变种。仅就适应高性能并行计算环境的能力而言, HPF等Fortran变种也仍有足够的理由继续存在和发展,直到未来某一个大而全的Fortran标准把它们真正统一起来为止。

      为了适应现代CPU的时钟精度,Fortran 2003扩展了内部过程SYSTEM_CLOCK的功能,允许其COUNT_RATE参数为INTEGER或REAL类型。

      对IEEE浮点数标准(IEEE 754)的完全支持是Fortran 2003在提高计算精确度和规范性方面的又一个努力。在Fortran 2003中,IEEE标准中描述的下溢(Underflow)可以被正确识别和处理,内部模块IEEE_ARITHMETIC中也为此增加了 IEEE_SUPPORT_UNDERFLOW_CONTROL、IEEE_GET_UNDERFLOW_MODE、 IEEE_SET_UNDERFLOW_MODE等几个相关的内部过程。

      另一个可以大幅提升程序执行效率的改进是Fortran 2003新增加的异步I/O机制。也就是说,执行比较耗时的I/O操作时,程序不必阻塞在I/O语句上,可以继续执行后续的指令。这种机制类似于我们用 WIN32函数操作磁盘文件时,可以借助FILE_FLAG_OVERLAPPED标记指明I/O操作应异步进行。

      基于Fortran 2003,当我们在外部文件的OPEN语句中指明ASYNCHRONOUS=’YES’时,后续拥有ASYNCHRONOUS=’YES’属性的READ 或WRITE语句即以异步方式执行。此后,我们可以继续执行其他语句,或使用WAIT语句等待异步I/O执行完毕。

      异步I/O是高性能应用软件必备的特性之一。在Fortran 90/95的时代里,为了实现异步I/O功能,不同的开发商总会在自己的Fortran编译器或程序库中以各自不同的方式,增加对异步I/O的支持。 Fortran 2003统一异步I/O语法的做法显然有助于Fortran应用的移植和推广。

       5. 开放的Fortran

      传统意义上的Fortran语言看上去并不那么开放,这恐怕和Fortran语言向来只注重科学计算,而忽视语言通用性的习惯有关。中国的 Fortran用户最常抱怨的两件事情是:不同的Fortran编译器连接外部程序(如C语言程序或Matlab程序)的方法不尽相同,不同的 Fortran编译器对中文的支持能力也强弱有别。人们迫切希望制定Fortran标准的专家们能体谅到最终用户的苦衷,尽早将Fortran纳入开放、 规范的发展轨道。

      在开放性方面,Fortran 2003为我们带来的第一个福音是,新标准终于规范了Fortran语言与C语言的连接方式。Fortran 2003提供了一个名为ISO_C_BINDING的内部模块,该模块定义了Fortran与C语言连接时必需的类型常量。引用了 ISO_C_BINDING模块后,我们就可以将Fortran变量定义成与C语言数据结构兼容的数据类型:

      REAL(C_FLOAT), DIMENSION(100) :: ALPHA

      或者利用C_PTR、C_FUNPTR类型与C语言中的指针或函数指针交互操作:

      TYPE(C_PTR) :: BETA
      IF (.NOT. C_ASSOCIATED(BETA)) THEN
       BETA = C_LOC(ALPHA)
      END IF

      对于下面这样的C语言函数:

      int foo(void* buf, int count, int *ret)

      它对应的Fortran函数接口是:

      INTERFACE
       INTEGER (C_INT) FUNCTION foo &
       (buf, count, ret), BIND(C, NAME='foo')
        USE ISO_C_BINDING
        TYPE (C_PTR), VALUE :: buf
        INTEGER (C_INT), VALUE :: count
        TYPE (C_PTR), VALUE :: ret
       END FUNCTION
      END INTERFACE

      这样,C语言和Fortran语言就可以通过上述接口相互调用。当Fortran语言和C语言之间拥有了统一的连接方式后,Fortran语言与其 他语言之间的连接也就不再是困难重重的事了。借助ISO_C_BINDING模块,Fortran语言可以直接(在二进制层面连接)或间接(以C语言为媒 介)地与Delphi、C++、Ada、Java、C#等我们常见的通用编程语言交流、沟通。

      在国际化方面,Fortran 90已经为Fortran引入了不少国际化支持功能。Fortran 2003则全面支持ISO 10646标准,可以正确处理双字节或四字节的国际字符集。Fortran 2003程序可以通过SELECTED_CHAR_KIND内部过程指明字符数据的编码方式;打开文件时,可以在OPEN语句内利用ENCODING= ’UTF-8’或类似的方式指明文件内字符的编码;可以在读写文件时完成ASCII、ISO 10646、UTF-8之间的转换;Fortran 2003代码本身的字符集,以及标识符和字符串常量的长度范围也有所扩充。

      另一个和开放性相关的新特性是Fortran 2003对流I/O(Stream Access Input/Output)的支持。作为一种以科学计算为目的的语言,传统的Fortran只提供了读写以记录为单位的外部文件的语法。在单纯的科学计算 任务里,这种简单的I/O功能也许可以满足文件读写的需要,但当我们希望Fortran程序和外部应用交换数据的时候,有时就不得不面对如何读取没有固定 记录结构的字节流数据的问题了。在Fortran 2003发布以前,我们只能通过编译器提供的扩展功能解决问题。现在,我们可以用标准的方式,在Fortran语言中随机访问外部文件的字节数据。应当 说,直到Fortran 2003,Fortran语言才拥有了与C语言的I/O库大致相仿的I/O功能,才在I/O领域具备了通用语言的基本特征。

      当我们在C语言中通过main函数的argc和argv参数获取命令行参数的时候,也许我们不会想到,在传统的Fortran语言中,要完成类似的 任务,Fortran用户也必须求助于编译器提供的扩展功能。Fortran 2003显著增强了Fortran语言与外部环境的沟通能力。新引入的内部模块ISO_FORTRAN_ENV拥有INPUT_UNIT、 OUTPUT_UNIT、ERROR_UNIT这一组对应于标准输入输出的常量(相当于C语言里的stdin、stdout和stderr),拥有 GET_COMMAND、GET_COMMAND_ARGUMENT等获取命令行指令,以及GET_ENVIRONMENT_VARIABLE等访问环境 变量或系统参数的内部过程。这些都是Fortran语言走向开放的重要标志。

       6. 象牙塔里的Fortran

      无论Fortran 2003多么强调面向对象、灵活和开放,Fortran语言在根本上仍然是一种面向科学计算的高级程序设计语言。

      环顾一下四周,我们很容易发现,Fortran语言最常出现的地方也是科技创新最活跃、知识密集度最大的地方:在中科院大气物理研究所里,研究人员 们正使用Fortran语言编写大气数据分析软件;在国家高性能计算中心里,Fortran语言正在新安装的曙光并行计算机上执行着各种科学计算任务;在 一个又一个分子生物学、高能物理学、应用数学的国家重点实验室里,Fortran是研究者们最为倚重的工具之一;在相当数量的理工科学生的课程表中, Fortran是学生进入大学课堂后接触的第一门高级语言……

      但正如本文开头那位博士生所说的那样,国内的Fortran语言应用多半还局限在Fortran 77的层面,大多数研究者仍在使用打孔卡片式的代码风格编写Fortran程序。这件事背后的潜台词是:一方面,Fortran 77已经可以满足大多数科研人员的需要,另一方面,科研人员不是专业的程序员,不可能有充足的时间学习新语言。在这种情况下,我们有什么理由让科研人员学 习更复杂的面向对象语法并转向更强大的Fortran 95或Fortran 2003呢?

      我个人觉得,Fortran 2003为所有Fortran用户带来的不仅是新鲜的语法特性,也是一种新的选择和机遇。

      对于利用Fortran语言开发商业软件包的公司(国内这类公司较少,但国外有相当数量的软件公司在开发和销售用Fortran语言开发的工具或程 序库)而言,Fortran 2003提供的面向对象机制和开放性可以帮助他们优化大型软件的开发过程,提高软件的复用率,降低开发成本。

      对于将Fortran视为工具的科研人员来说,Fortran 2003既为我们提供了一种更自由的编程环境,也为我们提供了足够的向前兼容的保证——除了极少数“过时”或“危险”的语法特性被删除以外, Fortran 2003保持了与Fortran 77/90/95等语言版本的全面兼容。也就是说,你完全可以在Fortran 2003的环境中,一边编写你熟悉的Fortran 77代码,一边体验新的功能特性,直到你在不知不觉间喜欢上Fortran 2003为止。

      对于理工科的学生来说,Fortran 2003也没有理由被拒之门外。与老旧、呆板的Fortran 77相比,Fortran 2003的语法更现代,更容易掌握;与C++、Java、Pascal等通用语言相比,Fortran 2003中强大的数据处理和矩阵运算功能显然可以帮我们节省许多开发时间;与Mathematica、Matlab、Macsyma,Mathcad等更 “高级”的数学工具相比,Fortran 2003尽管在便捷性和可视化程度上略显不足,但Fortran语言编译后的执行效率却是这些工具软件难以企及的。

      客观地说,Fortran 2003是一种在各方面都趋于“完美”的科学计算语言,是Fortran语言走向“现代化”的重要标志;不过,这种现代化改造大都是以Ada、C++、 Java等现代主流程序设计语言为参照进行的,它们是否能与Fortran语言重视科学计算的初衷相适应,是否能赢得大多数科研人员的认可,还需要经过时 间的检验——至少,我们应当等到HP(Compaq)、IBM、Salford、Intel、Fujitsu等主要的Fortran工具提供商推出了支持 Fortran 2003的新版编译器,等到用Fortran 2003实现的程序库和应用系统越来越多的时候,再对Fortran 2003的表现做一个中肯的评价。

       7. 明天的Fortran

      根据JTC1/SC22/WG5工作组和NCITS/J3委员会的规划,2004年5月到2009年8月是下一代Fortran标准的酝酿、编撰和定稿时间。到了2010年时,Fortran语言会变成什么样呢?

      在高级程序设计语言的发展史中,我们可以很容易地找出两种截然不同的语言风格。

      第一种是LISP语言开创的“实验风格”,这种风格强调高级语言的语法逻辑应尽量服从计算机表达数据和操作的基本方式,以充分发挥计算机的“智 慧”。例如,LISP语言中用“广义表”来统一描述代码和数据,以及Smalltalk语言用“对象-消息”这样的基本语法结构来实现面向对象机制的做法 都是这种风格的完美体现。不幸的是,“实验风格”的语言尽管在表达能力和逻辑性上表现出色,但因为更接近电脑而不是更接近人,它们在与普通程序员的沟通上 总显得力不从心,无法得到大多数程序员的认可。

      第二种是Fortran语言开创的“实用风格”,这种风格强调高级语言的语法应尽可能接近人类的自然语言或特定领域(如科学计算)的思维习惯,以简 化程序员的编码或维护工作,降低程序员的学习难度。直接受Fortran影响的BASIC语言,以及间接受Fortran影响的C、Pascal、 Ada、C++、Java、C#语言都是这种风格的杰出代表。在现代软件产业中,“实用风格”的语言占据了绝对的优势,但随着软件规模的增大,它们也逐渐 暴露出了灵活度不足、表达能力不强、与计算机交流不顺畅的弱点。

      现在看来,“实验风格”和“实用风格”在一定程度上的相互融合、相互促进是未来程序设计语言发展的总体趋势。这一点可以从Python、Ruby等新生代脚本语言的蓬勃发展中见到一些端倪。

      根据这样的判断,Fortran语言在未来的几年里,是不是也会向更灵活、更富有表达能力的“实验派”靠拢呢?也许是,也许不是。但无论如何, Fortran语言注重科学计算、注重执行效率的基本特征都不会改变,语言设计者们仍要在Fortran语言天生的“科学属性”与“现代化”改造的矛盾中 谨慎前行——没办法,谁让Fortran语言生来就活脱脱是一个爱科学、讲科学、用科学的“动脑筋爷爷”呢?

      [22:55] [发表评论] http://www.linuxaid.com.cn/infos/1/0/1012979149.shtml
        慕尼黑市决定将1 万4 千台桌面型转移至免费的Linux 版本,而非商业版的开放源代码操作系统。
        市政府上周表示将使用针对市府作定制化的Debian Linux版本,该公司已经跟两家德国顾问商签约协助此次转移计划,两家公司分别为Gonicus 与Softcon。
        先前历经一年由IBM 与SuSE所提供的试用后,慕尼黑是在去年六月正式通过将市府所采用的Windows NT操作系统PC转移至Linux 操作系统。
        负责此次LiMux 专案的召集人Peter Hofmann 表示,去年夏天招标公告公布后,他们收到许多回应,最后经过多方比较后才决定挑选Debian。由于可选择的方案很多,因此不选用商用版本并不会太奇怪。
        Hofmann 表示将在年底开始正式启动转移计划。
        除了慕尼黑市政府决定转进Debian外,德国外交部与IT安全办公室,以及维也纳市(City of Vienna)也都将采用该免费的Linux 版本。
        慕尼黑的转移计划从一开始就吸引许多助益,外界曾报道微软首席执行官Steve Ballmer 为此还中断在瑞士的滑雪假期兼程赶至慕尼黑劝阻该市市长打消转移计划。
        Hofmann 也向记者表示,这期间有许多有意进行转移的机构也都打电话来询问相关细节。 [22:55] [发表评论] http://www.linuxsir.org/bbs/showthread.php?t=155029
      carlos:在 ~/.bashrc 里加入以下几行就行了。
      # enable programmable completion features
      if [ -f /etc/bash_completion ]; then
      . /etc/bash_completion
      scp的时候都会补全远程的目录和文件
      这个自动补全太激进了,不习惯,而且在某些命令下连原有的简单补全功能都失去了。
      [22:55] [发表评论] ThinkPad 健身操:通过翻转和摇动笔记本电脑控制应用程序 http://www.ibm.com/developerworks/cn/opensource/os-thinkpad/

      向使用 HDAPS 的笔记本电脑添加 Linux 和一点 Perl,即可为您的应用程序创建一个类似 Wii 的强大控制程序!

      级别: 中级

      Nathan Harrington (harrington.nathan@gmail.com), 程序员, IBM 

      2008 年 4 月 17 日

      通过移动笔记本电脑,使用合成的 X Window System 事件和嵌入式加速计控制应用程序。使用检测算法将人体动作(例如摇动)转换为模式切换命令,从而实现一种新的应用程序交互方式。开发各种工具以帮助构建使用加速计的新一代界面程序,例如面向笔记本和 iPhone 的应用程序。

      创新的触觉界面系统实现了一种全新的应用程序交互方式。使用廉价的电子游戏外围设备、嵌入式加速计和从笔记本电脑到手持电话等各种 PC 设备,可以实现控制应用程序的新方式。应用程序通常在界面控制方面比较滞后,由于 API 十分有限,应用程序的功能被局限于键盘和鼠标事件。

      本文将演示的技术和代码可以使您将传统桌面计算环境中的应用程序与支持加速计的设备连接起来。

      2003 年制造的 IBM(R) ThinkPad 和后期推出的硬盘活动保护系统(Hard Disk Active Protection System,HDAPS)。如果您不确定自己的硬件配置,请查看 Lenovo Web 站点中的详细技术细节。

      您需要一个内核支持 HDAPS 的 Linux(R) 发行版。HDAPS 驱动程序必须包含在内核中以支持加速计访问。较新的内核版本,包括 Red Hat、Debian、Gentoo 和 Ubuntu 都包含 HDAPS 驱动程序。有关如何开始使用 HDAPS 内核驱动程序的更多信息,请参考 参考资料 小节中有关 HDAPS 的文章。

      您需要使用来自 CPAN 的 Time::HiRes 模块,以便在记录数据时提供亚秒级的计时控制。此外,还需要使用 X11::GUITest 模块将合成的 X 事件发送到应用程序(参见 参考资料)。

      注意,本文介绍的技术和算法应该适用于任何具有板载加速计的笔记本电脑。对于运行除 Linux 以外的其他操作系统的 MacBook 或 ThinkPad ,应用本文给出的代码也不会太困难。手持设备和其他支持加速计的系统也可以用于实现翻转、倾斜和命令之间的转换。如果在其他操作系统中运行,那么可以使用多种方法将合成的键盘和鼠标事件发送给应用程序。如果使用的是 Microsoft(R) Windows(R),则考虑使用命令的 SendKeys 类实现应用程序访问。





      回页首


      合成的 X 事件使用 xorg 组件

      对特定于应用程序的特性进行控制,这通常是通过 API 层的功能钩子实现的。然而,很多应用程序并不具备完整的 API 集,因此需要借助鼠标和键盘输入才能全面地操作应用程序。其他的应用程序没有提供 API,而只通过传统的人机界面设备提供交互。结合本文演示的组件和算法,无需 D-Bus 或其他 API 就可以实现应用程序控制。

      要实现对 D-Bus 和没有提供 API 的应用程序的完全控制,向应用程序发送合成的 X 事件是一种重要方法。

      X11::GUITest

      您需要花费大量时间将 XTest 库函数调用集成到您的应用程序中。您需要指定键释放速率并在识别窗口中查找所有细微区别,同时跟踪键盘和鼠标状态。或者,可以使用 X11::GUITest 为您完成这些任务。X11::GUITest 模块为 XTest 库提供了一个健壮的包装器,可以显著提高事件处理效率。

      对于很多可以响应用户键盘和鼠标事件的应用程序,在使用合成事件时将会以无法预期的方式执行。您可能需要调整键盘重复率和延迟,或寻求不同于标准输入机制的新方法。例如,Google Earth 并不始终以有效的方式响应按键事件,无论重复率和速度如何。本文使用了一种可以代替等价合成输入的方法:按住导航罗盘的中心控制杆。在尝试创建合成 X 事件以执行与实际替代方法相同的功能时,您可能会在其他程序中发现类似的误差或限制。在使用通过编程方式触发的键盘和鼠标事件连接应用程序时,您需要进行实验以找出可提供最佳可用性体验的输入方法。





      回页首


      将 HDAPS 传感器数据转换为应用程序控制

      我们已经启用了传感器并设置了控制框架,因此接下来将在一个 Perl 程序内进行集成,将移动转换为操作。清单 1 展示了 hdapsGoogleEarth.pl 脚本的头部和变量声明。


      清单 1. hdapsGoogleEarth.pl 全局变量和包含内容
                      
      #!/usr/local/bin/perl -w
      # hdapsGoogleEarth.pl - control google earth by the pitch and roll of a thinkpad
      use strict;
      use Time::HiRes  qw( usleep );
      use X11::GUITest qw( :ALL );
      my $threshMove = 3;    # lower limit indicating motion
      my $shakMin = 20;      # amount of a shake required to indicate change in mode
      my $timeThreshold = 1; # number of seconds between mode changes
      my $maxMove = 25;      # maximum movement of mouse from center point
      my @avgX = ();         # array of 10 recent hdaps X values for shake detection
      my $lastTime = time;   # record time of last mode change
      my $slptim = 25000;    # microseconds to pause between data reads
      my $maxTip = 100;      # turn thinkpad on its' side to exit the program
      my $restX = 0;         # `resting' positiong of X axis accelerometer
      my $restY = 0;         # `resting' positiong of Y axis accelerometer
      my @windows;           # array of window id's associated with google earth
      my $hdapsFN = "/sys/devices/platform/hdaps/position"; # hdaps sensor
                  

      包含了必需的模块后,将设置全局变量来处理移动并保持输入模式。本文演示了以升降或移动模式控制 Google Earth。通过摇动 ThinkPad,能够在多个模式之间快速切换,从而实现更直观的导航。清单 2 可以识别并将焦点置于 Google Earth 窗口。


      清单 2. 识别并将焦点置于 Google Earth 窗口
                      
      @windows = FindWindowLike("Google Earth");
      die "No google earth windows found" unless( scalar(@windows) > 0 );
      my ( $geX, $geY, $geW, $geH, undef, undef ) = GetWindowPos( $windows[0] );
      # rose center is left 110 from geX+geW, down 135 from geY
      # zoom center is left 22 from geX+geW, down 135 from geY
      my $cntrCompX = ($geX + $geW) - 110;
      my $cntrCompY = $geY + 135;
      my $centerZoomX = ($geX + $geW) - 22;
      my $centerZoomY = $geY + 135;
      my $maxZoomTop    = $centerZoomY - $maxMove;
      my $maxZoomBottom = $centerZoomY + $maxMove;
      my $maxLeft   = $cntrCompX - $maxMove;
      my $maxRight  = $cntrCompX + $maxMove;
      my $maxTop    = $cntrCompY - $maxMove;
      my $maxBottom = $cntrCompY + $maxMove;
      my $mouseX = $cntrCompX;
      my $mouseY = $cntrCompY;
      my $controlMode = "movement";
      MoveMouseAbs( $cntrCompX, $cntrCompY );
      PressMouseButton M_LEFT;
      ($restX, $restY ) = readPosition();
                  

      第一步是使用 X11::GUITest 模块,通过 FindWindowLike 函数定位 Google Earth 窗口。有时可以识别多个 Google Earth 窗口,但是第一个窗口 ID 通常为主窗口。注意,如果第一个窗口 ID 不是 Google Earth 主窗口,程序将不能正确处理输入。如果您的机器没有将 Google Earth 主窗口指定为第一个 Google Earth 窗口 ID,则会出现问题。如果发生这种情况,在 @windows 数组中的不同位置测试窗口 ID,直至找到 Google Earth 主窗口的正确 ID。

      确定了 Google Earth 输入窗口的正确坐标并将鼠标移至适当位置之后,可通过 readPosition 确定加速计的基准。清单 3 展示了 readPosition 子例程。


      清单 3. readPosition 子例程
                      
      sub readPosition {
        my ($posX, $posY) = "";
        open(FH," $hdapsFN") or die "can't open hdaps file";
          while(my $hdapsLine = <FH>)
            $hdapsLine =~ s/(\(|\))//g; # remove parens
            ($posX, $posY) = split ",", $hdapsLine;
          }# while hdaps line read 
        close(FH);
        return( $posX, $posY );
      }#readPosition
                  

      从 HDAPS 传感器读取数据非常简单,由于其不可查找特性,每次读取数据时都需要打开和关闭文件。(有关使用特定 HDAPS 传感器的更多信息,请查阅 参考资料)。完成了基本变量声明和子例程后,程序将继续进行主程序循环,如下所示。


      清单 4. 主程序循环,第 1 部分
                      
      while(1)
        # get accelerometer values
        my ($currX, $currY) = readPosition();
        $currX -= $restX;  # adjust for rest data state
        $currY -= $restY;
        # exit loop if ThinkPad tipped past 'exit' range
        last if( abs($currX) > $maxTip || abs($currY) > $maxTip );
        my $testX = abs($currX);  # keep original values for trending
        my $testY = abs($currY);
        if( $controlMode eq "movement" ) 
          #  stay at the maximum distance to move even if severely tipped
          if( $testX > $maxMove ){ $testX = $maxMove }
          if( $testY > $maxMove ){ $testY = $maxMove }
          $mouseX = ($cntrCompX - $testX) if( $currX < -$threshMove );
          $mouseX = ($cntrCompX + $testX) if( $currX > $threshMove );
          $mouseY = ($cntrCompY - $testY) if( $currY < -$threshMove );
          $mouseY = ($cntrCompY + $testY) if( $currY > $threshMove );
          if( $mouseX < $maxLeft )  {  $mouseX = $maxLeft   }
          if( $mouseX > $maxRight ) {  $mouseX = $maxRight  }
          if( $mouseY < $maxTop )   {  $mouseY = $maxTop    }
          if( $mouseY > $maxBottom ){  $mouseY = $maxBottom }
          # reset the mouse to the center if the current reading is not past
          # the threshold
          $mouseY = $cntrCompY if( $currY < $threshMove && $currY > -$threshMove );
          $mouseX = $cntrCompX if( $currX < $threshMove && $currX > -$threshMove );
                  

      每执行一次主程序循环都将从加速计传感器中读取新的值。将从之前创建的引用状态中减去这些值,以便将类似 ‘-379,-380’ 的值转换为更为有用的 ‘0,0’(表示 ThinkPad 保持静止)。接下来,程序将检查 ThinkPad 是否从静止状态变为动态翻转,从而表示一种退出条件。这是必须的,因为全部的键盘和鼠标控制已经由应用程序接管,因此,需要使用一种物理定向(physical-orientation)方法告诉应用程序执行退出。

      如果应用程序处于移动处理模式,接下来的两行将移动边界的上限设置为 $maxMove。接下来的四行代码根据翻转 ThinkPad 而超过移动阈值($threshMove)的程度将鼠标移至相应的 X 和 Y 维上。人们很少能够始终将 ThinkPads 保持在理想水平,对于每个维度使用一个倾斜阈值有助于简化基状态检测。

      接下来的四行代码将鼠标移动限制为从每个维度中心移动的最大距离。最后,如果没有达到上面提到的移动阈值,则将鼠标位置重置到中心。如果重设中心位置,那么在倾斜超过阈值后将产生一个跳跃的移动,但是在多数应用程序中,缓慢的移动或未知的初始状态比较可取。

      清单 5 显示了一个相对简单的升降控制模式。


      清单 5. 主程序循环,第 2 部分
                      
        }else
          # zoom control - move up and down only
          $mouseY = ( $centerZoomY - $testY ) if( $currY < -$threshMove );
          $mouseY = ( $centerZoomY + $testY ) if( $currY > $threshMove  );
          if( $mouseY < $maxZoomTop ){  $mouseY = $maxZoomTop }
          if( $mouseY > $maxZoomBottom ){  $mouseY = $maxZoomBottom }
          $mouseX = $centerZoomX;
          $mouseY = $centerZoomY if( $currY < $threshMove && $currY > -$threshMove )
        }#if in zoom mode
        MoveMouseAbs( $mouseX, $mouseY);  # move the mouse after coordinates computed
                  

      类似上文的移动模式,升降控制模式将根据翻转 ThinkPad 而超过移动阈值的程度在 Y 维度移动鼠标。计算得到的移动将被限制在从 zoom 滑块的中心位置移动的最大距离。同样,如果没有达到移动阈值,则将鼠标位置重设为中心。

      计算鼠标位置之后,对于升降或移动模式,都将移动鼠标来控制应用程序。





      回页首


      通过捕捉动作切换模式

      通过使用上面的代码,您可以通过移动 ThinkPad 来控制 Google Earth 的移动或升降模式。要在模式间进行切换,需要对主程序循环的每次循环执行额外的检查。清单 6 和 7 展示了主程序逻辑的其余部分以及 shakeCheck 子例程,它将捕捉动作并切换模式。


      清单 6. 主程序循环,第 3 部分
                      
        # mode switch by shaking, only if at least timeThreshold seconds have passed
        # since last mode switch
        if( shakeCheck( $currX ) == 1 && abs($lastTime - time) > $timeThreshold)
          $lastTime = time;
          if( $controlMode eq "movement" )
            $controlMode = "zoomRotate";
            $mouseX = $centerZoomX;
            $mouseY = $centerZoomY;
          }else
            $controlMode = "movement";
            $mouseX = $cntrCompX;
            $mouseY = $cntrCompY;
          }#if movement or zoomRotate mode
          ReleaseMouseButton(M_LEFT) if( IsMouseButtonPressed(M_LEFT) );
          MoveMouseAbs( $mouseX, $mouseY);
          PressMouseButton( M_LEFT );
          print "$controlMode mode\n";
        }# if a large enough shake in X dimension detected
        usleep($slptim);
      }#while
      ReleaseMouseButton M_LEFT;   # let go of button on exit
                  

      在移动和升降模式之间切换时,将交替生成一个由 shakeCheck 子例程返回的 true 值,以及一个可接受的模式切换之间的时间间隔。可以将 $timeThreshold 配置为要求模式切换之间具有一定的时间。您可能希望将这个参数设得更大一些,同样,对于 shakeCheck 子例程中显示的 shakMin 变量也一样,如全局定义部分和清单 7 所示。


      清单 7. shakeCheck 子例程
                      
      sub shakeCheck
        my $xVal  = $_[0];
        push @avgX, $xVal;
        # build an array of 10 samples before attempting processing
        return(0) if( @avgX < 10 );
        my $currAvg = 0;
        for my $eachX ( @avgX ){ $currAvg += $eachX };
        $currAvg = $currAvg /10;
        shift @avgX;
        # if current value is a big enough deviation from average value
        return(1) if( abs($currAvg - $xVal) > $shakMin );
        return(0);
      }#shakeCheck
                  

      子例程 shakeCheck 只对 X 维构建了过去 10 次读取 HDAPS 传感器的平均值。将 X 维的当前值与平均值比较,如果它们至少偏离了 $shakMin,则设置一个摇动条件并由子例程返回 true。可以很容易地检测到一次快速摇动,这是因为,尽管移动幅度相对较小,但是加速度比较大,足以捕捉到有用的动作。





      回页首


      使用 hdapsGoogleEarth.pl 和 hdapsGoogleStreeView.pl

      要运行上面构建的 hdapsGoogleEarth.pl 程序,请启动 Google Earth 应用程序。当显示默认的地球仪时,使用 perl hdapsGoogleEarth.pl 命令启动合成 X 事件转换程序。您应当看到 Google Earth 窗口将获得焦点,同时在右上角鼠标将获取移动控制杆。拿起 ThinkPad 并开始进行导航,并注意在靠近垂直方向上向任意维度倾斜您的 ThinkPad 以便退出程序。

      查看 参考资料 小节中的代码归档文件,其中包含另一个 Perl 脚本,它通过将 ThinkPad 的倾斜和翻转转换为按键事件来控制 Google 街道视图。要使用 hdapsGoogleStreetView.pl 脚本,请确保您使用的是 Firefox Web 浏览器,并在其中打开了 Google Maps 并处于街道视图(street-view)模式。使用 perl hdapsGoogleStreetView.pl 启动应用程序,您将能够通过倾斜和翻转 ThinkPad 导航城市街道。查看源代码了解 hdapsGoogleStreetView.pl 应用程序如何使用按键代替鼠标移动来控制应用程序。

      对于诸如地图绘制软件这样需要持续输入的应用程序,非常适合应用直观的导航系统。使用本文演示的代码,您将可以通过合成的键盘和鼠标事件将这种新一代导航系统应用到任何应用程序。

      通过 Bluetooth 将您的支持加速计的手机连接到 PC,并通过翻转手机控制应用程序。将一个惯性陀螺仪连接到 ThinkPad,并通过转动、倾斜和翻转动作扫描地图。

      ; AUTHOR: HM Li, hm_li@ustc.edu ; DATE: 06-11-07 ;------------------------------------------------------------------------------- FUNCTION wblpdf, x a=1.0e-5 b=1.0e-5 RETURN, b*a^(-b)*x^(b-1.0e0)*exp(-(x/a)^b) llim=1.0e-8 ulim=1.0e-7 for i=1,20 do begin llim=llim*1.0e-1 ulim=ulim*1.0e-1 ans = IMSL_INTFCN('wblpdf', llim,ulim, RULE=1) print, llim,ulim,ans endfor echo 'Please input SOURCE Dir' read SD #类似/home/eagle/tex echo 'Please input TARGET Dir' read TD #类似/home/eagle/tmp/fortran/y DL=`expr ${#SD} + 1` find $SD -name "*tex" >xx.log #find支持同时搜所不同的文件,可以添加-o参数设置 #比如find $SD -name "aaa*" -o -name "bbb*" >xx.log exec 0< xx.log while read FN BN=`basename "$FN"` DN=`dirname "$FN"` DN=`echo $DN | cut -b $DL-` if [ ! -d $TD$DN ] mkdir -p $TD$DN cp "$FN" $TD$DN rm -f xx.log MATFOR\uffff is a set of Fortran 90/95 and C/C++ libraries that enhances your program with dynamic visualization capabilities, shortens your numerical codes and speeds up your development process. By adding a few lines of MATFOR codes to your Fortran program, you can easily visualize your computing results, perform run-time animations, or even produce a movie presentation file as you execute your program.
      http://www.ancad.com/ [22:55] [发表评论] NVidia驱动安装 以下仅限于unstable,对于某些版本有更简单的办法,请参考http://home.comcast.net/~andrex/Debian-nVidia/installation.html
    • export NVDIST=unstable #这里可以换成你的版本比如testing等
    • export KVERS=$(uname -r) #取得版本号
    • export KSRC=/usr/src/kernel-headers-$KVERS #设定kernel-headers版本号
    • apt-get -t $NVDIST install nvidia-kernel-source nvidia-kernel-common #安装必要的包
    • cd /usr/src
    • tar -zxf nvidia-kernel-source.tar.gz #解压缩源文件
    • apt-get install kernel-headers-$KVERS #安装kernel-headers
    • apt-cache policy kernel-image-$KVERS kernel-headers-$KVERS #看看两者是否对应,以上步骤后一般来说这里自会对应
    • cd /usr/src/modules/nvidia-kernel
    • debian/rules binary_modules #编译nvidia的deb包
    • dpkg -i /usr/src/nvidia-kernel-*.deb #有一次应该为dpkg -i /usr/src/modules/nvidi*.deb
    • apt-get -t $NVDIST install nvidia-glx #安装nvidia-glx包,愿意的话可以把nvidia-settings也装上
    • vi /etc/X11/XF86Config-4 #编辑XF86Config-4
    • 注释掉 Load "GLcore"和 Load "dri"
    • Driver "nv"变为Driver "nvidia"
    • 不想显示nvidia logo的话,添加Option "NoLogo" 在http://learn.tsinghua.edu.cn:8080/2003214890/publish/GNU/fvwm.html的基础上修改 字体使用xfs管理因此修改为下面格式:
      MenuStyle * Font "StringEncoding=gbk-0:xft:SimSun:Medium:Size=12:encoding=iso10646-1"
      利用gkrellm显示系统信息、监测邮箱、事件提醒以及控制XMMS等。
      效果见http://hmli.ustc.edu.cn/album/zdesktop/fvwm.jpg [22:55] [发表评论] 为群集添加灵活高效的消息传递机能

      通过使用“英特尔 MPI 库”,可以减少分布式内存应用程序的 QA 测试工作,并提供出众的灵活性。这套函数库可让您轻松构建跨越多种网络体系结构执行的应用程序。了解更多(英文)有关“英特尔 MPI 库”的信息。

    • 构建一个可执行文件,便能在多个互连结构网络上运行。网络选择通过环境变量来实现。
    • 在使用 IA-32、安腾 处理器以及含“英特尔扩展内存 64 位技术”英特尔EM64T的处理器的群集上,支持分布式应用程序。
    • 充分利用现有投资 — 可与英特尔群集工具交互操作,并支持“英特尔 C++ 与 Fortran 编译器 Linux版”。
    • 可在多种网络结构与设备上验证代码,包括基于 TCP 的以太网消息传递、基于共享内存的共享内存系统消息传递,以及基于 RDMA 的 InfiniBand 互连体系结构消息传递。
    • 多种目标平台仅使用一个测试平台,可节省测试时间与设备成本。
    • 仅需交付并维护一个版本的分布式内存应用程序。
    • 具有较高的平台灵活性,最终用户只要启动一个新的设备驱动程序,便能实现运行时结构切换。
    • 与 MPI-2/1 功能保持同步 — 涵括 MPI-1 标准,并包含许多 MPI-2 扩展。 http://www.mozilla.org/support/firefox/profile#move It's possible to move the location of a profile folder. This could be useful if you have a backed up profile folder somewhere on your hard drive and want to tell Firefox to use that as your profile. This section explains how to do this. 1. Shut down Firefox completely (File > Exit). 2. Move the profile folder to the desired location. For example, on Windows, move the profile from C:\Documents and Settings\[username]\Application Data\Mozilla\Firefox\Profiles\xxxxxxxx.default to D:\Stuff\MyProfile. If you are reading these instructions because you want to restore a previously backed up profile, this step isn't necessary. Just note the current location of the profile you want to restore. 3. Open up profiles.ini in a text editor. The file is located in the application data folder for Firefox: * On Windows XP/2000, the path is %AppData%\Mozilla\Firefox\ * On Windows 95/98/Me, the path is usually C:\WINDOWS\Application Data\Mozilla\Firefox\ * On Linux, the path is ~/.mozilla/firefox/ * On Mac OS X, the path is ~/Library/Application Support/Firefox/ 4. In profiles.ini, locate the entry for the profile you've just moved. Change the Path= line to the new location. 5. Change IsRelative=1 to IsRelative=0. 6. Save profiles.ini and restart Firefox. [22:55] [发表评论]

      Aditya Narayan , 创始人, QCD Microsystems

      2005 年 11 月 24 日
      高性能计算(HPC)正在越来越变得简单,这是由于两个原因:开放源码软件概念的采用,以及集群技术的精练。本文是两篇系列文章中的第二篇,讨论了如何使用 MPI 进行并行编程,并概要介绍了集群管理和基准测试技术。本文还介绍了如何使用 OSCAR 来构建一个 Linux 集群,这是一个用来构建健壮集群的开放源码项目。 本系列的第 1 篇 集群基础 讨论了集群的类型、用途、HPC 基础以及集群技术在 HPC 领域变得更加流行的原因。 本文介绍了并行算法,并介绍了如何编写并行程序、构建集群以及对集群进行基准测试。我们将介绍如何使用 MPI 进行并行编程,以及构建 Linux 集群的基础知识。在本文中,我们将会介绍有关 OSCAR 的内容,这是一个用来帮助构建健壮集群的开放源码项目。另外,我们还会概要介绍集群管理和基准测试的概念,并详细介绍在集群上运行标准 LINPACK 测试的步骤。 如果已经安装好了 Linux,在阅读本文之后,就可以安装 Linux 集群并进行故障排除了。下面的 参考资料 中给出的链接可以帮助您学习更多有关集群的知识。

      集群和并行编程平台

      正如在 第 1 部分 中可以看到的一样,HPC 大部分都是有关并行编程的。并行编程是一个发展相当完善的领域,在过去 20 年中,已经开发出了多种编程平台和标准。 HPC 中使用的两种主要的硬件平台是共享内存系统和分布式内存系统。详细信息请参阅 第 1 部分。 在共享内存系统 中,High Performance FORTRAN 是一种非常适合并行编程的语言。它可以有效地利用数据的并行,并将其作为一个整体数组在不同处理器上使用不同的索引来同时执行指令。因此,这只需要最少的 努力就可以提供自动的并行处理能力。(Jamaica 项目就是这样一个例子,标准的 Java 程序可以使用特殊的编译器进行重构来生成多线程的代码。然后所生成的代码就可以自动利用 SMP 体系架构的优点,并可以并行执行了。) 在分布式内存系统 上,情况会有根本的不同,这是因为内存是分布式的;必须编写能够理解硬件底层的分布式特性的代码,并且需要显式地使用消息传递在不同的节点之间交换信息。 并行虚拟机(PVM)曾经是一个非常流行的并行编程平台,但是最近 MPI 已经成为了为集群编写并行程序的事实标准。 为 Linux 上 FORTRAN、C 和 C++ 使用的高质量的 MPI 实现可以免费获得。流行的 MPI 实现有两个:

      • MPICH
      • LAM/MPI

      在本文稍后的部分中,我们将构建一个基于 MPICH 的 Linux 集群,并来看一个基于 MPI 的程序例子。 创建一个简单的 Linux 集群

      有关集群最有趣的事情之一是,如果我们有基本的 Linux 安装,并且具备一定的故障排除的技能,只需要很少的努力就可以构建基于 Linux 的集群。让我们来看一下这是如何实现的。 对于我们的集群,要使用 MPICH 和一组普通的 Linux 工作站。为了简单起见,并且重点突出其中的基本原理,我们将构建最小的裸系统,在集群环境中可以使用它来运行并行程序。 本节中给出的 7 个步骤将显示如何构建裸系统。构建健壮的集群以及集群的管理涉及很多工作,我们在本文后面进行介绍。

      步骤 1

      如 果想获得一个真正的集群,至少需要两台 Linux 机器。两个 VMware 映像也可以很好地实现这种功能。(使用 VMware,显然我们并不会期望能获得什么性能优势。实际上,其性能显然会有所下降,因为 CPU 需要进行共享。)请确保这些机器彼此之间可以使用机器名相互 ping 通。否则,就需要在 /etc/hosts 中添加适当的项。 安装 GNU C 编译器和 GNU FORTRAN 编译器。

      步骤 3a

      为所有节点配置 SSH,允许不询问密码就可以执行命令。这样做的目的是能够不需询问密码就可以执行 ssh -n host whoami 这样的命令。SSH 用作不同机器之间的通信方法。(也可以使用 rsh 来实现这种功能。)

      步骤 3b

      ssh-keygen -f /tmp/key -t dsa 可以在文件 key 中生成一个私钥,在文件 key.pub 中生成一个公钥。

      步骤 3c

      如 果正在以 root 用户的身份构建集群,并且以 root 用户的身份来运行程序(显然只有在进行实验时才会这样),那么就可以将私钥拷贝到文件 /root/.ssh/identity 中,并将公钥拷贝到集群中所有节点上的 /root/.ssh/authorized_keys 文件中。 为了确保所有的配置都能正常工作,请执行下面的命令:ssh -n hostname 'date',并查看这个命令能否成功执行,而不会出现任何错误。应该对所有节点都执行这种测试,这样就可以确保所有节点上的设置都没有问题。 注意:可能还需要修改防火墙的配置,使其允许节点彼此之间相互进行通信。

      步骤 4a

      接下来,我们将安装 MPICH。从 anl.gov 的 Web 站点(请参阅 参考资料 中的链接)上下载 UNIX 版本的 MPICH。下面是一个简要介绍。

      步骤 4b

      假设您已经将所下载的 mpich.tar.gz 放到了 /tmp 中: cd /tmp
      tar -xvf mpich.tar.gz (假设执行这个命令之后会得到一个 /tmp/mpich-1.2.6 目录)
      cd /tmp/mpich-1.2.6

      步骤 4c

      ./conhttp://hmli.ustc.edu.cn/blog/images/figure -rsh=ssh —— 这告诉 MPICH 使用 ssh 作为通信机制。

      步骤 4d

      make —— 执行完这个步骤之后,就已经安装好 MPICH 了。

      步骤 5

      要 让 MPICH 知道所有的节点,请编辑文件 /tmp/mpich-1.2.6/util/machines/machines.LINUX,并将所有节点的主机名添加到这个文件中,这样安装的 MPICH 就可以知道所有的节点了。如果以后再添加新的节点,也请修改这个文件。 将目录 /tmp/mpich-1.2.6 拷贝到集群中的所有节点上。 在 examples 中运行几个测试程序:

      • cd /tmp/mpich-1.2.6/utils/examples
      • make cpi
      • /tmp/mpich-1.2.6/bin/mpirun -np 4 cpi —— 告诉 MPICH 在 4 个处理器上运行程序;如果配置中没有 4 个处理器,也不用担心;MPICH 会创建一些进程来补偿物理硬件的缺失。

      现在集群已经准备好了!正如我们可以看到的一样,所有的重头戏都可以留给 MPI 实现来完成。正如前面介绍的一样,这是一个裸集群,所需的大部分手工工作只是确保机器之间可以彼此进行通信(我们配置了 ssh,MPICH 是手工拷贝的,等等)。

      开放源码软件集群应用程序资源

      有一点非常清楚,上面的集群非常难以维护。现在并不能方便地将文件拷贝到每个节点上、在每个要添加的节点上设置 SSH 和 MPI 以及在将节点移出集群时进行适当的修改,等等。 幸运的是,有一些优秀的开放源码软件资源可以帮助我们设置和管理健壮的产品集群。OSCAR 和 Rocks 就是两个这样的软件。我们在创建集群时所执行的大部分操作都可以使用这些程序自动实现。 图 1 是一个简单集群的示意图。


      图 1. 一个简单的示例集群
      一个简单的示例集群

      OSCAR 还可以支持使用 PXE(Portable Execution Environment)来自动安装 Linux。OSCAR 还可以帮助我们实现以下功能:

      • 在计算节点上自动安装 Linux。

      • 配置 DHCP 和 TFTP(对于使用 PXE 安装的 Linux 系统)。大部分新计算机都有一个允许使用 DHCP 服务器来引导机器的 BIOS。BIOS 有一个内建的 DHCP 客户机,它创建一个操作系统映像,并使用 TFTP 将其从 DHCP 服务器传输到要引导的机器上。这个 Linux 映像是由 OSCAR 创建的,DHCP 和 TFTP 的安装和配置都可以由 OSCAR 来处理。

      • 配置 SSH。

      • 自动设置 NFS。

      • 安装并配置 MPI(MPICH 和 LAM/MPI)。

      • 安装并配置 PVM (如果希望使用 PVM,而不是 MPI)。

      • 配置头节点和计算节点之间的子网。

      • 安装调度器(Open PBS 和 Maui),用于多个用户将作业提交到集群上的自动管理。

      • 安装 Ganglia,用于性能监视。

      • 自动配置,用于添加或删除节点。

      现在 OSCAR 可以支持多个版本的 Red Hat Linux;有关其他可以支持的发行版本,请参阅 OSCAR 的 Web 站点(请参阅 参考资料 中的链接)。根据在设置时所碰到的错误,可能需要对几个脚本进行修改。 使用 OSCAR 创建 Linux 集群

      让我们使用 OSCAR 资源来构建一个功能完备的集群。假设有两个或多个普通的工作站,它们都使用网络连接在一起。将其中的一个节点设置为头节点,其他节点都设置为计算节点。 正如在构建 Linux 集群时所做的一样,我们要详细介绍在头节点上所执行的步骤。OSCAR 可以自动配置其他节点,包括 OS 的安装。(请参阅 OSCAR 安装指南;下面是对安装过程的概念性介绍。) 在头节点上安装 Linux。确保安装 X 服务器。

      步骤 2

      mkdir /tftpboot, mkdir /tftpboot/rpm。将安装光盘中的所有 RPM 文件拷贝到这个目录中。这些 RPM 用来创建客户机映像。并非所有的 RPM 最终都需要,但是最好让它们自动构建这个映像。 确保已经安装并配置了 MySQL,并且可以从 Perl 中访问 MySQL,因为 OSCAR 将所有的配置信息都保存到了 MySQL 中,并使用 Perl 来访问这些信息。这个步骤通常是可选的,并且 OSCAR 也可以为我们执行这些步骤,但是有时这个步骤会失败,尤其是在一个尚不支持的发行版本上安装时更是如此。 下载 OSCAR 源代码并编译它: conhttp://hmli.ustc.edu.cn/blog/images/figure
      make install 启动 OSCAR 向导。假设我们想要这个集群使用 eth1 来连接集群中的节点,请使用 /opt/oscar/install_cluster eth1。 在这个步骤中,一步步地通过所有的 OSCAR 设置屏幕。确保以正确的顺序执行以下步骤:

      1. 选择包来定制 OSCAR 的安装。如果不熟悉这些包,可以暂时忽略。

      2. 安装 OSCAR 包。
      3. 构建客户机映像。这就是计算节点要使用的映像文件。
      4. 定义 OSCAR 客户机。这定义的是计算节点。我们需要指定集群中想要使用的节点的个数,以及它们所使用的子网。如果现在不确定一共有多少个节点,可以稍后再来修改。
      5. 将不同节点的 MAC 地址映射为 IP 地址。对于这个步骤,每个节点都必须在 BIOS 中使用 PXE 网络启动选项来启动。

      步骤 7

      最后,运行测试。如果一切运行良好,每个测试都应该成功。即使没有任何问题,有时第一次尝试运行时也会有些测试失败。还可以通过执行 /opt/oscar 下面的测试脚本来手工执行这些测试。 如果我们现在希望添加新的节点,可以再次启动 OSCAR 向导并添加节点。OSCAR 会使用 PXE 自动将 Linux OS 安装到这些节点上。 现在我们已经准备好集群环境了,接下来可以运行并行程序了,并且可以根据需要添加或删除新节点,并使用 Ganglia 来监视节点的状态。 当我们需要在一个具有大量用户的产品环境中对集群进行管理时,作业调度和监视就变得尤其重要了。 MPI 可以在各个节点上启动并停止进程,但是这只能限定于同一个程序。在一个典型的集群上,会有很多用户都要运行自己的程序,我们必须使用调度软件来确保它们可以最优地使用集群。 一个流行的调度系统是 OpenPBS,可以使用 OSCAR 自动安装它。使用这个调度系统,可以在集群上创建作业,并将作业提交到集群上运行。在 OpenPBS 中,还可以创建复杂的作业调度策略。 使用 OpenPBS 还可以查看正在执行的作业、提交作业以及取消作业。它还可以控制某个作业可以使用的 CPU 时间的最大值,这对于系统管理员来说非常有用。 集群管理中的一个重要方面就是监视,尤其是如果集群中有大量的节点就更是如此。此处有几种选择,例如 Ganglia(OSCAR 可以提供)和 Clumon。

      Ganglia 有一个基于 Web 的前端界面,可以提供有关 CPU 和内存使用情况的实时监视信息;可以方便地对其进行扩展,使其只监视有关某项内容的信息。例如,使用一些简单的脚本,我们就可以让 Ganglia 汇报 CPU 的温度、风扇转速等等。在接下来的几节中,我们将编写一些并行程序,并在这个集群上运行这些并行程序。 并行编程有自己的一些并行算法,它们可以充分利用底层硬件的性能。接下来让我们来了解一下这种算法的信息。让我们假设一个节点要对一组 N 个整数进行求和运算。用普通方法实现这种操作所需要的时间是 O(N)(如果对 100 个整数进行求和需要 1ms,那么对 200 个整数进行求和就需要 2ms,依此类推)。 这个问题看起来很难线性地提高其速度,但是值得注意的是,的确有这样一种方法。让我们来看一个在 4 个节点的集群上执行程序的例子,每个节点的内存中都有一个整数,程序的目的是对这 4 个整数求和。 考虑下面的步骤:

      1. 节点 2 将自己的整数发送给节点 1,节点 4 将自己的整数发送给节点 3。现在节点 1 和节点 3 都有两个整数了。
      2. 这些整数在这两个节点上分别进行求和。
      3. 节点 3 将它的部分和发送给节点 1。现在节点 1 有两个部分和了。
      4. 节点 1 对这些部分和进行求和,从而得出最终的总和。

      正如我们可以看到的一样,如果最初有 2N 个数字,这种方法在 ~N 个步骤中就可以实现求和运算。因此算法的复杂度是 O(log2N),这相对于前面的 O(N) 来讲是一个极大的改进。(如果对 128 个数字进行求和需要 1ms,那么使用这种方法对 256 个数字进行求和就只需要 (8/7) ~ 1.2ms。在前面的方法中,这需要 2ms。) 这种方法在每个步骤中都可以释放一半的计算节点。这种算法通常就称为递归二分和倍增(recursive halving and doubling)法,它就是在 MPI 中 reduce 函数调用的类背后所采用的机制,稍后我们就要讨论。 在并行编程中,有很多为实际问题所开发出的并行算法。 使用 MPI 进行并行编程来实现矩阵与向量的乘法

      现在我们已经了解了并行编程平台的基础知识,并且准备好了一个集群,接下来就要编写一个可以很好地利用这个集群的程序。我们并不编写传统的 “hello world”,而是直接跳到一个真实的例子上,并编写基于 MPI 的程序来实现矩阵与向量的乘法。 我们将使用在 并行算法 一节中介绍的算法来很好地解决这个问题。假设有一个 4X4 的矩阵,我们希望将其与另外一个 4X1 的向量进行乘法操作。我们将对矩阵乘法的标准技术稍微进行一下修改,这样就可以使用前面介绍的算法了。请参看图 2 对于这种技术的阐述。


      图 2. 向量与矩阵的乘法
      向量与矩阵的乘法

      我 们并不对第一行与第一列进行乘法操作,而是将第一列中的所有元素与向量中的第一个元素相乘,第二列的元素与向量中的第二个元素相乘,依此类推。采用这种方 法,就可以得到一个新的 4X4 矩阵。然后,将每一行中的所有 4 个元素相加,得到一个 4X1 的矩阵,这就是最后的结果。 MPI API 有多个函数可以直接解决这个问题,如清单 1 所示。


      清单 1. 使用 MPI 执行矩阵乘法
      
      To compile: 'mpicc -g -o matrix matrix.c'
      To run: 'mpirun -np 4 matrix'
      "-np 4" specifies the number of processors.
      #include <stdio.h>
      #include <mpi.h>
      #define SIZE 4
      int main(int argc, char **argv) {
         int j;
         int rank, size, root;
         float X[SIZE];
         float X1[SIZE];
         float Y1[SIZE];
         float Y[SIZE][SIZE];
         float Z[SIZE];
         float z;
         root = 0;
         /* Initialize MPI. */
         MPI_Init(&argc, &argv);
         MPI_Comm_rank(MPI_COMM_WORLD, &rank);
         MPI_Comm_size(MPI_COMM_WORLD, &size);
      /* Initialize X and Y on root node. Note the row/col alignment. This is specific  to C */
         if (rank == root) {
            Y[0][0] = 1; Y[1][0] = 2; Y[2][0] = 3; Y[3][0] = 4;
            Y[0][1] = 5; Y[1][1] = 6; Y[2][1] = 7; Y[3][1] = 8;
            Y[0][2] = 9; Y[1][2] = 10;Y[2][2] = 11;Y[3][2] = 12;
            Y[0][3] = 13;Y[1][3] = 14;Y[2][3] = 15;Y[3][3] = 16;
            Z[0] = 1;
            Z[1] = 2;
            Z[2] = 3;
            Z[3] = 4;
         MPI_Barrier(MPI_COMM_WORLD);
         /*  root scatters matrix Y in 'SIZE' parts to all nodes as the matrix Y1 */
         MPI_Scatter(Y,SIZE,MPI_FLOAT,Y1,SIZE,MPI_FLOAT,root,MPI_COMM_WORLD);
         /* Z is also scattered to all other nodes from root. Since one element is sent to
            all nodes, a scalar variable z is used. */
         MPI_Scatter(Z,1,MPI_FLOAT,&z,1,MPI_FLOAT, root,MPI_COMM_WORLD);
         /* This step is carried out on all nodes in parallel.*/
            for(j=0;j<SIZE;j++){
            X1[j] = z*Y1[j];
         /* Now rows are added, using MPI_SUM (using recursive halving and doubling algorithm,
            internal to the MPI implementation) */
         MPI_Reduce(X1,X,SIZE,MPI_FLOAT,MPI_SUM, root,MPI_COMM_WORLD);
         if (rank == 0) {
            printf("%g\n",X[0]);printf("%g\n",X[1]);printf("%g\n",X[2]);printf("%g\n",X[3]);
         MPI_Finalize();
             return 0;
      性能测试

      集 群已经构建好,可以执行程序了,接下来需要了解这些程序的执行速度到底有多快。通常我们都认为是处理器的频率决定了性能的高低。对于特定的范围来说,这个 结论是正确的;但是在不同供应商的处理器或相同供应商提供的不同处理器系列之间进行比较,没什么意义,因为不同的处理器在给定的时钟周期内所执行的任务量 是不同的。在 第 1 部分 中对向量和标量处理器进行比较时,这尤其明显。 对性能进行比较的一种更加自然的方法是运行标准测试。随着时间的推移,有一个非常出名的 LINPACK 基准测试已经成为比较性能的标准。它是由 Jack Dongarra 在十年之前开发的,现在仍在由 top500.org 使用(请参阅 参考资料 中的链接)。 这个测试要解包含 N 个线性方程的密集方程组,其中浮点操作的个数是已知的(是 N^3 级别)。这个测试非常适合用来测试那些要运行科学应用程序和模拟的计算机,因为它们都要在某些步骤上试图对线性方程进行求解。 测试的标准单位是每秒执行的浮点操作数量,即 flop 数(在这种情况中,flop 或者是一个 64 位的加法操作,或者是一个 64 位的乘法操作)。这个测试要测量的内容如下:

      • Rpeak,flop 的理论峰值。在 2005 年 6 月的报告中,IBM Blue Gene/L 的时钟峰值为 183.5 tflop(万亿 flop)。
      • Nmax,得出最高 flop 时所使用的矩阵大小 N。对于 Blue Gene 来说,这个值是 1277951。
      • Rmax,Nmax 所达到的最大 flop。对于 Blue Gene 来说,这个值是 136.8 tflop。

      为了更好地理解这些数字,请考虑下面这个事实:IBM BlueGene/L 在 1 秒之内可以完成的操作在一台家用计算机上需要执行 5 天。 现在让我们来讨论一下如何对 Linux 集群进行基准测试。除了 LINPACK 之外,其他基准测试还有 HPC Challenge Benchmark 和 NAS benchmark。 对 Linux 集群进行基准测试

      要在 Linux 集群上运行 LINPACK 基准测试,我们需要获得一个并行版本的 LINPACK,并对这个集群配置 LINPACK。我们将一步步地介绍整个过程。

      警告:下面使用了普通的线性代数库;使用它只是作为一个参考。对于一个真正的测试来说,要使用已经针对自己的环境优化过的库。 从 netlib.org 下载 hpl.tgz,这是 LINPACK 基准测试的并行(MPI)版本(请参阅 参考资料 中的链接)。 从 netlib.org 下载 blas_linux.tgz,这是预先编译好的 BLAS(Basic Linear Algebra Subprograms)。为了简单起见,可以使用一个为 Linux 准备的预先编译好的 BLAS 参考实现,但是为了能够得到更好的结果,应该使用硬件供应商所提供的 BLAS,或者使用开放源码的 ATLAS 项目进行自动优化。

      步骤 3

      mkdir /home/linpack; cd /home/linpack(我们要将所有的东西都安装到 /home 中)。 解压并展开 blas_linux.tgz,这样应该会得到一个名为 blas_linux.a 的文件。如果看到了这个文件,就可以忽略所看到的错误。 解压并展开 hpl.tgz,这样应该会得到一个目录 hpl。 将所有的配置文件(例如 Make.Linux_PII_FBLAS)从 hpl/setup 拷贝到 hpl 目录中,并将 hpl 中的拷贝重命名为 Make.LinuxGeneric。

      步骤 7

      编辑文件 Make.LinuxGeneric 中下面的内容,并修改为适合您的环境的值:

      TOPdir = /home/linpack/hpl
      MPdir = /tmp/mpich-1.2.6
      LAlib = /home/linpack/blas_linux.a
      CC = /tmp/mpich-1.2.6/bin/mpicc
      LINKER = /tmp/mpich-1.2.6/bin/mpif77 这 5 个地方指明了步骤 1 中 LINPACK 的顶级目录、MPICH 安装的顶级目录以及步骤 2 中 BLAS 参考实现的位置。 现在编译 HPL: make arch=LinuxGeneric 如果没有错误,就会得到两个文件 xhpl 和 HPL.dat,它们都在 /home/linpack/hpl/bin/LinuxGeneric 目录中。 在集群上运行 LINPACK 基准测试之前,将整个 /home/linpack 目录拷贝到集群中的所有机器上。(如果使用 OSCAR 创建的集群并配置了 NFS 共享,就可以忽略这个步骤。) 现在 cd 到在步骤 8 中所创建的可执行程序所在的目录,并运行一些测试(例如 /tmp/mpich-1.2.6/bin/mpicc -np 4 xhpl)。应该会看到使用 GFLOP 表示的执行结果。 注:上面的步骤会基于矩阵大小的缺省设置来运行一些标准测试。使用文件 HPL.dat 来对测试进行调优。有关调优的详细信息可以在文件 /home/linpack/hpl/TUNING 中找到。 IBM Blue Gene/L

      现在我们已经构建好了集群,接下来快速介绍一下 Blue Gene/L,这是一台基于集群的非常好的超级计算机。Blue Gene/L 是一项大型的工程壮举,对其进行详细介绍显然已经超出了本文的范围。现在我们只是简单介绍一下表面的东西。 三年前,地球模拟器(Earth Simulator)(向量处理器)成为世界上最快的计算机,很多人都预测集群作为一种超级计算机平台已经走向了死亡,向量处理器已经复苏了;这个结论下得太早了。Blue Gene/L 在标准的 LINPACK 基准测试中已经彻底击败了地球模拟器。

      Blue Gene/L 并不是使用常用的工作站来构建的,但是它依然使用本系列文章中所讨论的标准集群技术。它使用了一个源自于本文中使用的 MPICH 的 MPI 实现。它还可以运行 700MHz 的标准 32 位 PowerPC CPU(不过这些是基于片上系统或 SoC 技术的),这比该系列中的其他机器更能极大地降低对制冷和电源的需求。

      Blue Gene/L 是一个非常大的机器,有 65,536 个计算节点(每个节点都运行一个定制的操作系统),还有 1,024 个专用的 I/O 节点(运行 Linux 内核)。使用如此多的节点,网络就尤其重要了,Blue Gene/L 可以使用 5 种不同类型的网络,每种网络都为一个特定的目的进行了优化。 有关 Blue Gene/L 的更多信息可以在最近一期专门介绍它的 IBM Systems Journal 中找到。在 Blue Gene/L 中,我们看到了一个高度可扩展的 MPP 实现,以及基于集群的计算系统仍然会存在的清晰证据。 化学教学工具 kalzium - chemistry teaching tool for KDE Kalzium is a program which shows you the Periodic System of Elements (PSE). You can use Kalzium to search for information about the elements or to learn facts about the PSE.

      Kalzium provides you with all kinds of information about the PSE. You can look up lots of information about the elements and also use visualisations to show them.

      You can visualise the Periodic Table of the Elements by blocks, groups, acidic behavior or different states of matter. You can also plot data for a range of elements (weight, mean weight, density, IE1, IE2, electronegativity), and you can go back in time to see what elements were known at a given date. In addition, on platforms where OCaml supports native code generation, Kalzium includes a chemical equation solver.

      This package is part of the official KDE edutainment module.

      [22:55] [发表评论] http://tech.ccidnet.com/art/737/20041208/187015_1.html
      监控是集群管理的核心任务。监控数据可用于调度任务、负载平衡、向管理员报告软硬件故障,并 广泛地控制系统使用情况。监控信息必须在不影响集群性能的情况下获得。本文将讨论使用/proc文件系统和Java来获得监控数据的方法。

          Java在Linux集群中的应用

          Java技术为集群管理开发者提供了许多解决问题的办法。Java是动态、灵活、可移植的,这些不寻常的特征使得它成为了在异构网络及平台上构造集群管理的理想基础。

          Java具有广泛的例程库,很容易处理IP协议,如TCP、UDP,并可在multi -homed主机上进行网络程序设计,用它创建网络连接比用C或C++更容易。通过Java本地接口(JNI),运行在Java 虚拟机(JVM)内的Java代码能够与用其它语言编写的应用及库文件相互操作并汇编。

          在构造集群监控和管理时,Java早已是一个可选的语言。然而,Java语言通常只 被用于系统的前端或集群主机部分,而将用C语言编写的守护进程安装在集群结点上。尽管Java程序设计语言提供了许多优点,但是,对于高性能集群监控, Java能够有效地替换运行在每个结点上的C语言守护进程吗?这将是本文讨论的重点。

          高性能监控

          监控Linux集群工具传统上以秒为测量频率来提供有限量的数据。而高性能集群监控被 定义为“以intrasecond为测量频率,从结点有效地采集数据的能力”。当涉及较大集群时,监控软件的低效率问题就变得更加严重,这是因为所运行的 应用软件必须互相协调或共享全局资源。

          在一个结点上的阻隔冲突(Interference)能影响其它结点上作业的运行。 例如,一个MPI作用需要与所有参与的结点同步。一种解决办法是收集少量的数据,并以小频率传输。然而,如果是高性能监控,这种解决办法是不可接受的,因 为有较重利用率的集群应该被频繁持续地监控。本地作业调度器必须能够基于资源使用情况做快速决策。管理员经常希望收到紧急事件的立即通知,并希望观察到历 史趋势数据,如果集群不能被频繁持续地监控,那么这些要求是不可能实现的。因此,必须采取一些措施,如使用更有效的算法、增加传输的并行性、提高传输协议 及数据格式的效率、减少冗余等。

          在跟踪运行中的资源使用情况时,压缩Profiling应用有助于调试程序或优化程 序。对一个给定的应用而言,像存储器、网络、CPU这样动态资源的使用可能快速地改变着,为了能够观察应用是怎样使用这些资源的,一种可能的办法是使用高 频率的监控。

          即使用户对高频率监控没有兴趣,如果算法是有效的,不管监控频率是多少,它也将消费 很少的资源。在异构集群中这种效率将更重要,用户的作业可以被分散到较快的及较慢的结点上,慢的结点需要全部CPU来跟上较快的结点并与之同步。一个监控 程序花费在较慢结点上的CPU时间是作业的关键路径。

          集群监控主要消耗CPU周期与网络带宽这两个重要资源。然而,资源消费问题与这两个资 源是根本不同的。CPU利用问题对结点而言是完全本地化的问题,可通过创建有效的收集与合并算法来解决。网络带宽是共享资源,是规模问题,可以通过最小化 网络上传输的数据量来解决。

          为了解决这两个问题,我们将集群监控分为三个阶段:收集、合并、传输。收集阶段负责 从操作系统装载数据、分析数据值,并存储数据。合并阶段负责将来自多个数据源的数据合在一起,决定数据值是否改变并过滤它们。传输阶段负责压缩并传输数 据。本文集中讨论Linux集群监控的收集阶段。

          1.收集阶段
          Linux有几种方法来进行系统统计,每种方法都各有其优缺点。
          ◆ 使用现有的工具
          标准及非标准工具能执行一个或多个收集、合并及传输阶段,如rstatd或SNMP工具,然而标准的rstat后台程序提供的信息是有限的,速度慢而且效率低。
          ◆ 内核模块
           几个系统监控工程利用内核模块来存取监控数据。一般情况下,这是很有效的收集系统数据的方法。然而这种方法存在的问 题是,当主内核源内有其它改变时,必须保持代码一致性。一个内核模块可能与用户想使用的其它内核模块相冲突。此外,在使用监控系统之前,用户必须获得或申 请模块。
          ◆ /proc虚拟文件系统
           /proc虚拟文件系统是一个较快的、高效率执行系统监控的方法。使用/proc的主要缺点是必须保持代码分析与/proc 文件格式改变的同步。事实表明,Linux内核的改变比/proc 文件格式的改变要更频繁,所以,用/proc虚拟文件系统比用内核模块存在的问题要少。
          ◆ 混合系统
          某些监控系统采用混合方式,用内核模块收集数据,用/proc虚拟文件系统作为数据接口。

          2.合并阶段
          合并阶段的实 现可以在结点上、集群管理的主机上,或者分布在两者上。考虑到效率,我们只采用在结点上的合并。原因在于结点是监控数据的收集器与提供者。两个或多个同时 的数据请求不会引起两次操作系统调用来收集数据,而是将第一次请求获得的数据缓存,并可以提供给第二次请求调用。这种方法减少了操作系统的负担,提高了监 控系统的响应性。合并阶段也可以用于将多个数据源的数据以相互独立的收集速率结合,因为并不是所有的数据都以同样的速度改变,或者需要以同样的速率收集。

          使用在结点层上合并的另一个原因是,减少了包括传输在内的信息量。许多/proc文 件既包含动态数据也包含静态数据。删除最近一次传输后没有改变的值,一个结点发送的数据量可以大大地减少。合并不仅除去了不经常改变的动态值的传输,也解 决了从不改变的静态值的传输。

          3.传输阶段
          监控数据几 乎总是按一个层次结构组织起来。传输阶段的任务就是将层次数据进行有效的编码,形成一种能高效传输的数据格式。Java拥有的文件格式是存储层次数据的有 效方法,并且用提供的Java APIs很容易完成。S-Expressions已经被认为是传输这种数据的另一个有效的方法。

          关于传输监控数据普遍讨论的问题是,数据应该按二进制编码还是按文本格式编码。二进 制数据更容易压缩,因此也能更有效地传输。但是,当采用/proc文件系统时,监控数据通常以人们易读的格式存储。在传输之前,将数据转换为二进制格式将 需要更多的处理资源与时间。以文本格式保留收集的数据,结点资源能被用于更多非监控性的相关工作。

          采用文本格式的数据将提供如下额外的益处:
          ◆ 平台独立性
          当监控异构集群时,机器之间数据字节指令的配置不是永远相同的。文本格式的使用在代码方面解决了这个问题,而且体系结构独立不会影响更多的处理需求。
          ◆ 易读的格式
          文本数据能以人们易读的格式进行组织。如果需要的话,这种特征能容易地进行程序调试或允许用户观看数据流。
              ◆ 有效压缩
          数值数据的文本表示由来自10个字节集中的字符组成,而不是二进制下的256个字节集。它们产生的数字及模式的相对频率允许有效地使用基于压缩算法的字典及熵(平均信息量)。

          /proc虚拟文件系统

          /proc虚拟文件系统(也叫procfs)是Unix操作系统所使用的虚拟文件系统 的Linux实现,包括Sun Solaris、LinuxBSD。在/proc开始时,它以一个标准文件系统出现,并包含与正在运行的进程IDs同样名字的文件。然而,在/proc中 的文件不占用磁盘空间,它们存在于工作存储器(内存)中。/proc最初的目的是便于进程信息的存取,但是现在,在Linux中,它可被内核的每一部分使 用来报告某些事情。

          在/proc文件系统提供的成百上千的值当中,我们将集中考虑集群监控所需的最小集,它们包括:
          ◆ /proc/loadavg:包含系统负载平均值;
          ◆ /proc/meminfo:包含存储管理统计量;
          ◆ /proc/net/dev:包含网卡度量;
          ◆ /proc/stat:包含内核统计量;
          ◆ /proc/uptime:包含总的系统正常工作时间及空闲时间。

          每个文件提供的值的数量是不同的。这些文件的完整有效值列表如下。
          ◆ /proc/loadavg提供以下数据:

          值得注意的是,每次某个/proc被读时,一个句柄函数都被内核或特有模块调用,来产 生数据。数据在运行中产生,不管是读一个字符还是一个大的字块,整个文件都将被重建。这对效率是至关重要的一点,因为使用/proc的任何系统监控器将吞 下整个文件,而不是一点一点地处理它。

          Java提供了丰富的文件I/O类集,包括基于类的流、基于类的块设备,以及 J2SDK 1.4提供的新的I/O库。实验表明,一般而言,对基本的块读写文件操作,用RandomAccessFile类进行I/O是最佳的。例如,块读文件操作

          本文讨论了如何将Java语言有效地用于Linux集群结点上的高性能监控。在程序设计中,要注意以下方面:
          ◆ 采用/proc文件系统;
          ◆ 以块形式读/proc文件,而不是以行或字符形式;
          ◆ 在读文件期间保持文件打开;
          ◆ 消除不必要的数据转换;
          ◆ 在结点上合并数据;
          ◆ 以压缩形式传输数据;
          ◆ 注意与性能问题相关的语言或库。

          对高性能监控而言,内核模块不是必要条件,这点很重要,因为它在Linux版本和分类 之间提供了很大程度的可移植性,在监控器实现语言上有很多的选择。但是,/proc文件系统的性能却很依赖内核代码的效率,因此,适当地理解有关的机制将 对以任何语言编写的监控器性能有非常大的影响。 [22:55] [发表评论] This program computes Archimedes' constant Pi to arbitrary precision. It is extremely fast and the precision is only limited by your machine's main memory. [22:55] [发表评论] set locale="zh_CN"
      set charset="gb2312"
      set send_charset="us-ascii:iso-8859-1:gb2312:utf-8"
      charset-hook .* gb2312
      charset-hook !utf-8 gb2312
      set to_chars=" +TCFL"
      set index_format="%4C %Z %{%b %d} %-15.15L (%4l) %s"
      mailboxes Mailbox sent-mail
      set header=no
      auto_view text/html application/msword
      set pop_user=MyAccount@mail.ustc.edu.cn
      set pop_pass="MyPasswd"
      set pop_host="pop://email.ustc.edu.cn"
      my_hdr From: MyAccount@mail.ustc.edu.cn
      在~/.mailcap中添加
      application/msword; wvHtml --charset=gb2312 %s - | lynx --dump -stdin; nametemplate=%s. html; copiousoutput #注意:从application到copiousoutput在一行
      text/html; lynx --dump %s; nametemplate=%s.html; copiousoutput
      为了直接用Mutt看doc文件,需要安装wv以及lynx包
      详细配置可以参考这里。 [22:55] [发表评论] wcalc 命令行科学计算器

      wcalc is a command-line calculator designed to accept all valid mathematical expressions. It supports all standard mathematical operations, parenthesis, brackets, trigonometric functions, hyperbolic trig functions, logs, and boolean operators.

      If no mathematical expression is given at the commandline, wcalc enters "inter- active" mode. Interactive mode has more features. Also, files may be piped to wcalc, and they will be interpreted.

      Variables are supported and may be assigned using the = operator. To assign a variable use the form: foo = anylegalexpression Thereafter, that variable name is the same as the literal value it represents. Expressions can be stored in variables like this: foo = 'anylegalexpression' Expressions stored this way will be interpreted at evaluation time, rather than assignment-time. Note that these cannot be recursive.

      [22:55] [发表评论] Cluster简介 http://h50069.www5.hp.com/e-Delivery3/forum/WebUI/Messages/ShowTopic.aspx?RID=24cc0b9b-5248-4a51-acc7-1dac201870bf This Document is prepared for the customer who is not very clear to the CLUSTER TECHNOLOGY, and ask we What is Cluster and Why Cluster?
      You can selectively pick part of this document to answer their questions.

      ----Andy Song

      Cluster简介

      什么是Cluster?

      Cluster (群集)是紧密连接的一组计算机,用来持续性地提供高性能的计算服务。把一组计算机连在一起并非难事,但要让它们获得很高的性能就不那么容易了。 Cluster的初衷在于以没有单点故障的体系结构来达到系统的高可用性和可伸缩性,而且要求采用通用标准的计算机,而不是特殊专用的计算机部件,从而能 以较低的成本获得较好的可伸缩性。Cluster中的计算机应当具有非常好的协同性。如果其中一台发生故障,马上就有另一台去接替它的工作,如果一台计算 机的性能不足以完成某项任务,其他的系统成员就会加入进来,共同执行这项任务。应用实践证明,由通用的计算机部件协同工作,完全可能使其运算能力超过大型 主机、超级计算机和容错系统,而且具有更低的成本。

      为什么选Cluster?

      评估计算机系统体系结构的优劣的确不是一件容易的事。
      SMP (对称多道处理)、FT(容错)、MPP(海量并行处理)和Cluster(群集)以其各自的特色在市场上占有一席之地。MPP以系统的可伸缩性见长, FT的可用性比较高,而SMP和Cluster的结构在可伸缩性和可用性之间的兼顾与融合使其成为最成熟、适用范围最广的技术方案,在实际应用中可以满足 绝大多数用户的需求。
      可用性是指系统正常运行的比例,最高的理论指标值是100%,而常用的表征方法是“9”的数量。例如“3个9”就是指 99.9%的可用性,“4个9”是指99.99%的可用性。一套具有“3个9”的可用性系统,只有0.1%的时间处于不能正常运行的状态。这看起来似乎不 错,但实际上意味着在一年的时间里有9个小时系统不能正常工作。如果能够让这9个小时的停机时间都安排在非业务高峰时段,也许问题并不十分严重。但是如果 一家零售商场的业务系统在圣诞节前意外停机9个小时,那商场业主来说简直无异于一场噩梦。所以说,用户需要更多的“9”。对于不能停顿的关键业务应用,要 达到更高的可用性就应该选择Cluster。因为即使是在最坏的情况下,严重的系统故障在Cluster之中也只会表现为几分钟内系统性能的略微降低,服 务的反应速度稍微慢一点。
      近年来,Cluster和RAS(Reliability、Availability和Serviceability) 等相关领域的进步极大地改善了应用系统的可用性,减少了停机时间。Cluster技术越先进,计算部件成员之间配合就越默契,故障部件的接替与切换就更加 平衡。例如多通道I/O特性使存储或网络控制器发生故障的节点可以方便地切换到其他备用控制器上。
      在更先进的Cluster技术中,任何部件发生 故障都不会影响到系统的正常运行,甚至是在备用部件或者系统总线发生故障的情况下,计算节点同样可以通过远程方式利用其他节点的存储控制器继续执行自己的 任务。在各个计算节点都正常的情况下,也可以自动均衡所有计算资源上的负载,使整个系统的运行性能达到最佳状态。而且,与分别管理相同数量的独立单机相 比,对于Cluster之中的节点进行管理要容易得多。

      真正的Cluster减少系统停机时间,高可用性自然是功不可没。通过将单个 的服务器连接成Cluster,有可能获得3个、4个甚至5个“9”的可用性,但同时又面临着一大堆复杂的技术细节问题--设备驱动程序、磁盘卷标、IP 地址、故障接替路径、服务定义和控制脚本等等。随着Cluster中节点数量的增加,这类问题就会越来越复杂,常常使系统管理员望而生畏。事实上,有不少 用户由于追求可用性而选择Cluster,但又由于系统的复杂性和管理上的困难而导致Cluster远远没有发挥其应有的效益。
      所以说, Cluster要想凭借其高性能、高可用性和高可伸缩性而在当今的商业应用中担当重任,就必须改善自身在部署和维护方面的简便程度,让人们感到它并非高深 莫测。负载平衡、多路故障接替、多通道I/O和管理集中化等功能应当成为操作系统理所应当的普通功能,这才是真正具有实用意义的Cluster。



      Alpha主机上的CLUSTER技术

      ALPHA主机支持两种CLUSTER技术,即OPENVMS CLUSTER和TRU64 UNIX CLUSTER。TRU64 UNIX CLUSTER是运行在TRU64 UNIX系统上的CLUSTER系统,其功能和特点如下。

      COMPAQ CLUSTER技术用于双机热备份,由两台主机组成一个ASE(Available Server Environments可用服务器环境),两台主机通过公共的SCSI总线来连接共享磁盘阵列,主机之间则通过网络(ETHERNET,FDDI, 等)传递信息。两台主机各有自己的本地操作系统,而将数据放在共享盘上。可以对共享盘定义磁盘服务,挂在一台主机系统的目录下,另一台主机上看不到它并可 以给ASE中盘服务设置一个IP地址,远端客户可用这个公共的IP地址透明地访问主机系统,不需要知道自己连接的是哪台主机。当共享盘所挂的主机发生故障 时,该节点所运行的应用软件系统如数据库系统等自动被关闭,盘服务便切换到另一台主机上,应用软件系统也重新启动,客户端只需重新连接即可。ASE中的一 台主机始终处于热后备状态,并可以运行其他软件。两台主机可以定义成互为备份模式。

      COMPAQ 的TRUCLUSTER可以配置高速的内存通道互连,提供近于SMP的速度,比传统的网络互连方式减少了100倍的信息时延。TRUCLUSTER具有分 布式锁管理(DLM)能力,DLM(Distributed Lock Manager)同步对共享信息的访问,保证共享数据的完整性,为那些高度并行的应用如OPS(ORACLE PARALLEL SERVER)提供服务。COMPAQ 的TruCluster技术可以提供双机并行工作方式,即由两台或多台主机组成一个ASE系统,各主机通过公共的SCSI总线连接共享的数据盘,每台主机 都有自己的本地操作系统和本地数据库系统,共享盘上只存放应用数据。正常情况下,每台主机上的数据库并行工作,通过分布式锁管理对共享盘上的数据进行 I/O操作,系统管理员可以根据实际情况人为的将客户分担到每台主机,也可以在ASE中设置一个有公共IP地址的用户自定义登录服务,把客户对数据库的操 作平衡地分布在两台主机上以提高系统性能。

      CLUSTER的故障检测方式是用“心跳”机制,通过多种途径用多种协议检测节点是否死机。集群软件能够检测应用故障并采取相应的恢复措施,它支持人工故障恢复,支持故障节点重启动恢复,可以定义故障节点故障恢复后自动成为备份节点或主节点,以接管故障前承担的任务。


      TruCluster Server V5.0 UNIX集群软件系统


      COMPAQ 电脑公司自1992年推出世界上第一台64位的Alpha服务器及第一个64位的UNIX操作系统Tru64 UNIX(原OSF/1,Digital UNIX),现已过去7年多了。Alpha服务器系统及Tru64 UNIX操作系统在具有其先进功能的同时,也全面走向成熟。尤其是1999年4月份发布的第五版本Tru64 UNIX V5.0操作系统及Tru Cluster Server V5.0集群软件,使COMPAQ公司在64位UNIX计算环境的高可用性,高可靠性,高服务性及资源共享方面达到世界先进水平。很多功能是其它任何 UNIX厂商今天所无法提供的,成为IT行业的一枝独秀。

      美国著名的IT公司 Illuminata Inc发表了题为“Stainless Steel"即“不锈钢”的研究报告,在报告中说:“虽然COMPAQ公司将其V5.0称为钢,我们认为不锈钢更能表达它在TruCluster V5.0集群上的实用性,对故障错误的容忍性和实际应用中的优越性。”

      1983年,COMPAQ(原DEC)公司成功推出VMS Cluster集群。16年来,VMS集群的功能一直被IT界做为集群的标准。而且在此之前,没有一个UNIX 厂商的所谓的“UNIX集群”(实际上只是高可用性的故障的切换环境)可以与VMS集群相媲美。然而,TruCluster Server V5.0集群的发布,从此改变了这一局面,成为目前世界上唯一达到VMS集群水平的UNIX集群环境。

      Cluster要想凭借其高性 能、高可用性和高可伸缩性而在当今的商业应用中担当重任,就必须改善自身在部署和维护方面的简便程度,让人们感到它并非高深莫测。负载平衡、多路故障接 替、多通道I/O和管理集中化等功能应当成为操作系统理所应当的普通功能,这才是真正具有实用意义的Cluster。

      Tru64 Unix以及其中的TruCluster服务器就是以上述要求为目标进行设计开发的,你会在其中看到多道处理、多线程、磁盘卷管理、日志系统、多通道I/0、扩展TCP/IP联网以及其他许多符合开放标准的新特性。
      TruCluster 已经面世多年了,最新的版本仍然沿用了这个名字,但实现方法却截然不同了--Cluster功能已经成为Tru64 Unix之中不可分割的一个核心功能。这就是说,任何一套单独的Tru64 Unix软件,只要安装起来就已经在以Cluster的方式运行了。单一节点的Cluster本身虽然没有什么意义,但它的确使得这种技术一点也不神秘了 -Cluster就在你的系统之中。用户不需要专门对系统任何重新配置,只要把第二套系统以Memory Channel的方式连接进来,系统中的两个节点就会自动探测和识别对方,并开始以Cluster的方式运行,一套真正的、完整的Cluster就自然而 然地诞生了。虽然系统管理员仍然需要说明网络拓扑结构和其他一些细节,但大多数管理工作都是自动完成的。这就是Tru64Unix的设计理念:“最好的管 理就是不必管理”。

      TruCluster Server V5.0有哪些特点?

      单一系统形象(SSI:Single System Image)
      其它厂商的UNIX集群中,各节点有自己的操作系统,所有的应用,工具,系统设置,系统配置,集群软件的安装……等都需要在每个节点上重复进行。因此随着集群节点数目的增加,集群管理的难度超线性增长,这大大增加了集群管理负担。

      而TruCluster Server V5.0集群是将一台至八台Alpha服务器由内存通道互连组成的,虽然物理上各节点是独立的,但在逻辑上和管理上,用户看到的是一台大的虚拟机一样。它 们可共享同一个操作系统磁盘,共享任何文件系统,从同一个界面(SMS)管理所有的集群节点。所有的软件,包括操作系统,应用软件,集群软件只需安装一 次,全集群范围内即可运行。它完全达到了单一系统形象的标准。极大地减少了UNIX集群的维护管理负担。它是目前世界上唯一达到此标准的UNIX集群。

      集群文件系统(CFS)
      TruCluster Server V5.0集群是目前世界上唯一可共享文件系统的UNIX集群。各节点可共享目录,共享所文件系统。这给用户的应用环境带来极大的方便,各节点上的应用可同 时访问同一个文件系统,而保证数据的完整性,一致性。集群文件系统的使用,也使集群范围有统一的安全性,增强了集群的安全性。集群文件系统也改进了高可用 性的概念,它不再是单纯采用“停止故障机器上的服务,卸载相关的文件系统。而是提供了并行服务的机制。如C编译的,Forturm编译的,及ASU软件 等,可在各节点机上并行运行。当一个节点发生故障时,客户端的请示可自动提交到正常机器上,而实现了快速故障切换。

      共用Cluster地址
      系 统中的任何服务请求都要通过IP地址提交给特定的服务资源。在以往的Cluster系统之中,如果系统管理员要改变其中某些节点的任务,就必须对其中各个 部件的IP地址了如指掌。TurCluster服务器为其中所有的节点提供一个共用地址,服务请求可经由Memory Channel转变给运行相应服务的节点,负载分配也是由操作系统自动完成的。管理员不再面对众多的IP地址,管理工作显得轻松多了。除了简化负载管理, TruCluster共用Cluster地址的特性还使负载平衡机制成为系统之中与生俱来的功能,而不像别的系统那样把它作为一个特殊的选件来提供。

      集群别名
      TruCluster Server V5.0支持集群别名,别名可以用于识别整个集群,或集群的一部分。这样客户机联接时,只需用集群别名来访问整个集群中任何可提供服务的节点,而不必关心究竟是哪个节点提供服务。完全实现了客户端透明的访问。

      快速故障切换负载均衡
      TruCluster Server v5.0集群中提供了三种类型的高可用性的应用环境,一是Single-Instance,二是Multi-Instance,三是Cluster- aware。Single-Instance应用的高可用性是通过故障切换,重新启动应用实现的。Multi-Instance应用的高可用性是通过不同 节点上并行运行的应用实现的。Cluster-Aware的应用的高可用性,如ORACLE的OPS并行数据库服务器是通过分布式并行运行实现的。在第 二、三两种应用环境下,根据不需要故障切换,而且可负载均衡,增加对客户端的服务响应。

      统一的集群管理
      TruCluster Server V5.0软件为系统管理员提供了Cluster全局视图和完整的控制手段,管理员可以选用自己喜欢的方式来访问系统信息、执行管理系统。可用统一的方式、 统一的平台、统一的界面,在集群各个节点上看同样详细的管理信息和同样的管理功能,来管理集群就象管理单机一样。这也是目前其它UNIX厂商所没有的。

      结论
      从最简单的双节点故障接替系统到多节点的Cluster系统,用户对于可用性的追求产生了多种不同的体系结构。我们已经看到,先进的Cluster系统具有负载均衡、资源共享、管理集中化和互连性能优化等新特性。
      对 于不可间断的业务系统,更高的可用性是必不可少的,但又是不够的。有些用户的Cluster系统应用不够理想,常常是因为缺乏简单、直接的管理使用方法。 如今,康柏已经把更好的解决方案放在您的面前,可伸缩性、可靠性和可管理性已经深深地埴入UNIX的核心,这就是带有TruCluster服务器的Tru UNIX。选择Tru64 UNIX,真正的Cluster就在你浑然不觉之中与生俱来了。 [22:55] [发表评论] http://wiki.debian.org/DiskLess

      diskless helps an administrator to manage a cluster of client machines running NFS root, that is, which mount their root filesystem from a server at boot time. In most cases, the client machines also NetBoot (load their kernel from the server at boot time), so all you need to do to start a client is set the BIOS to boot from the network, then just turn it on.

      This simplifies administration of any cluster of machines, from a DebianBeowulf to a set of user workstations, since all package management can be done right on the server. But it can lead to high network traffic and CPU load and storage requirement on the server.

      Scroll down for a description of the package and its NFS management utilities, then a basic HOWTO in "Getting Started".

      The Package

      This package provides tools for managing NFS images for a cluster. An image is a directory on the server which will serve as the root directory for client machines. Fortunately, most of the files will be shared among all of the machines, so we do not need to create a separate entire image for each machine. Instead, we create a single image with all of the common files, then separate host sub-images with the /etc, /var and /tmp directories for each host. Since the clients share the same Debian packages, we can save further disk space by sharing /var/lib/dpkg as well.

      When a client machine boots, it (usually) gets its kernel from the server, which then boots and mounts the main image as its root filesystem. It then runs the /sbin/init command, which in the diskless image is a special script which mounts that machine's /etc, /var and /tmp directories, and the global /var/lib/dpkg. The diskless init script then runs the standard init script, continuing the boot process as usual.

      Getting Started

      To set up management of "diskless" NFS-root machines:

      1. Install the following packages on the server:

    • diskless

    • nfs-kernel-server

    • dhcp, dhcp3-server or rarpd

    • mknbi+

    • tftpd+

      + only needed if you want the clients to NetBoot by getting their kernel from the server as well as the NFS root filesystem.

      2. Debian no longer ships base.tgz files with the contents of all of the base packages, so you will need to create one using diskless-createbasetgz, e.g.: % mkdir /tmp/diskless % mkdir /var/lib/diskless % mkdir /var/lib/diskless/default % diskless-createbasetgz /tmp/diskless sarge \ http://http.us.debian.org/debian /var/lib/diskless/default/base.tgz

      This downloads from http.us.debian.org all of the Debian packages which make up the base files of the "sarge" (a.k.a. 3.1) release of Debian, installs them into temporary storage space in /tmp/diskless (which must be empty, so don't use /tmp), and creates a compressed tarball base.tgz in directory /var/lib/diskless/default from the scratch storage.

      3. Download one of the diskless-image packages to the /var/lib/diskless/default directory, but DO NOT INSTALL IT!

      4. Use the diskless-newimage program to create the NFS root image for your client machines from the existing base.tgz and diskless-image-*.deb file, e.g.: % cd /var/lib/diskless/default (where base.tgz and the diskless-image .deb are) % diskless-newimage /var/lib/diskless/default/root

      In the course of creating the image, you will be asked several questions, which will require that you know the IP adress by which the clients will reach the server, the name server, the mail server (likely localhost since exim is installed), and whether you want to use devfs for the /dev directory of the clients.

      5. Install and remove packages from the image, e.g.: % cp /etc/apt/sources.list /var/lib/diskless/default/root/etc/apt/sources.list % cp /etc/resolv.conf /var/lib/diskless/default/root/etc/resolv.conf % cp /etc/kernel-img.conf /var/lib/diskless/default/root/etc/kernel-img.conf % chroot /var/lib/diskless/default/root % mount -t proc /proc proc % dselect

      I recommend getting rid of lilo (since it could otherwise corrupt your server's boot record!!) and pcmcia-cs, and adding anacron. This is a convenient time to install any other packages which you know you will want on the clients.

      6. Set up the "host" sub-images' /etc, /var and /tmp directories using diskless-newhost, e.g.: % diskless-newhost /var/lib/diskless/default/root

      If 192.168.0.2 is in your /etc/hosts, then the default hostname and mailname will be set according to that file. Note that diskless-newhost can set up a host sub-image, or update an existing one.

      If you have UpdateCluster installed, and have populated the cluster.xml file (using update-cluster-add), then you can use the script diskless-rebuild-hosts to create/update all of the host sub-images automatically.

      (This script is at http://lyre.mit.edu/~powell/cluster/diskless.updatelist and will be added to the diskless package at some point.)

      7. Modify /etc/exports to allow clients to mount the image and their respective /etc, /var and /tmp directories. For example: #diskless node's root directory /var/lib/diskless/default/root 10.0.0.0/255.255.255.0(ro) #diskless nodes directories /var/lib/diskless/default/10.0.0.2 10.0.0.2(rw,no_root_squash) /var/lib/diskless/default/10.0.0.3 10.0.0.3(rw,no_root_squash) /var/lib/diskless/default/10.0.0.4 10.0.0.4(rw,no_root_squash)

      With this setup, node 10.0.0.2 will mount /var/lib/diskless/default/root as root, /var/lib/diskless/default/10.0.0.2/var as /var (likewise for /etc and /tmp), then /var/lib/diskless/default/root/var/lib/dpkg as /var/lib/dpkg.

      8. Build a client kernel with NFS-root support, or setup a NFSRootInitrd. At a minimum, this means the following options must be set:

      Networking options:

    • CONFIG_IP_PNP=Y (IP: kernel level autoconfiguration)

    • CONFIG_IP_PNP_DHCP=Y, or _BOOTP or _RARP

      File systems:

    • CONFIG_NFS_FS=Y (NFS file system support)

    • CONFIG_ROOT_NFS=Y (Root file system on NFS)

      Also, make sure the network device is built in (=Y), not a module!

      9. Set up DHCP, BOOTP or RARP on the server to give an IP address to the client machines.

      10. Boot clients using this kernel, either via floppy, CD, lilo/grub MBR on local hard drive, or NetBoot.

      (2005-12-23 16:46:01由fimbulvetr编辑)

      [22:55] [发表评论] http://www.linuxsir.org/bbs/showthread.php?t=35732 TCSH shell不同于其他的shell,因为控制结构更符合程序设计语言的格式.例如TCSH的test条件的控制结构是表达式,而不是linux命令,得到的值是逻辑值true或false,TCSH的表达式与C语言中的表达式基本相同.
      一,TCSH shell变量,脚本,参数
      用户可以在shell中定义变量,为变量赋值以及引用脚本参数.TCSH使用set,@,setenv定义一变量,也可以用相同的方法定义数值变量和数组,用户通过@命令定义的数值变量来进行算术运算,用户使用圆括号()和方括号[]定义和引用数组.脚本也可以用相同的方法操作,但是有个例外,尽管可以用echo命令输出提示符,但没有read命令处理输入,相反,必须重定向到一个变量里.
      二,脚本输入和脚本输出: $ <
      用户能够在脚本范围中定义和使用变量.在下例中,使用文本编辑器把赋值操作和echo之类的linux命令放在一个文件中.然后, 可以产生可执行文件并像其他命令一样在命令行中执行它,要记住添加可执行权限,必须使用带u+x参数的chmod命令或者带绝对参数700的chmod命令.在脚本中,可以使用echo命令去输出数据,但是,必须通过重定向标准输入把输入读入变量.在TCSH中没有linux read命令的比较版本.记住TCSH全部的脚本文件的第一行的第一个字符必须是"#"字符.
      #display "hello"
      set string="hello"
      echo The value of string is $string
      set命令和重定向符号结合$<将用户输入的任何数据读入标准的输入中.下例中,把用户输入读入string变量中.
      %set string=$<
      %echo $string
      能够把提示符放置到相同的行用作echo的输入.TCSH使用一个特殊的选项-n,将消除输出字符串中的回车符.光标将保留在输出字符串的结尾处.
      %echo -n "please enter a string"
      %cat hello
      echo -n "please enter a string:"
      set string=$<
      echo "the value of string is $string"
      %chmod u+x hello
      %hello
      please enter a string:hello
      the value of string is hello
      三,操作符
      TCSH有一系列标准的赋值,算术和关系运算以及重定向和后台操作等函数
      赋值运算符 功能说明 = 赋值操作 += 先加再赋值 -= 先减再赋值 *= 先乘再赋值 /= 先除再赋值 %= 取余再赋值 ++ 自增量1 -- 自减量1 算术运算符 说明 - 负号 + 加法 - 减法 * 乘法 / 除法 % 取余 关系运算符 说明 >= 大于等于 <= 小于等于 != 不等于 == 等于 重定向和管道符
      TCSH支持标准输入和标准输出的重定向和管道操作.如果设置了noclobber特征,要用重定向操作重写当前文件,需要用符号>!代替>
      四,控制结构
      同其他shell一样,TCSH也有一系列的控制结构控制脚本的命令的执行.while和if控制结构是最常用的控制结构.switch和foreach是更专用的控制结构.switch是if条件的限定形式,检查数值是否等于一系列可能的数值中的一个数值.foreach是循环结构的限定形式.浏览数值列表,给变量赋新的数值.
      TCSH不同的控制结构列表: 条件控制结构; 功能 if (expression) then 如果expression为真,则执行commands commands endif if (expression) then 如果expression为真,则执行command1,否则执行 command1 command2. command2 endif switch (string) 允许在几条替换命令中选择,string为不同的模式 case pattern: commands breaksw default: commands endsw 循环控制结构: 功能 while (expression) 只要expression为真,则重复执行commands, commands 直到expression为假时跳出循环 foreach variable (argument-list)迭代循环获得和argument-list中一样多的参数 commands (每次循环variable被设置为列表的下一个参数; end 操作方式同BSH) TCSH中的控制结构有别于其他的shell,因为它更接近编程语言(C).TCSH的条件表达式的值为true/false.BASH和TCSH主要区别在于TCSH的结构不可重定向或进行管道输出.
      五,测试表达式;()
      if和while控制结构把表达式用作测试.表达式测试的结果为非零(1)表示真,而零(0)表示假(跟BASH相反).测试表达式可由算术/字符串比较,但是字符串只能作相等和不相等的比较.而且表达式必须要在()括号内.
      if (expression) then command endif TCSH有一系列的运算符来分别对字符串进行测试比较.正则表达式可以包含shell脚本的指令的字符串.如:
      if ( $var =~[Hh]* ) then #如果变量$var以字母是大写/小写Hh开头,的字符串 echo information #执行命令 endif #结束 有很多测试文件的操作与BASH完全相同.如:
      if ( -r myfile ) then #测试myfile是否可读 echo info endif 测试表达式的基本操作: 字符串比较: 功能 == 是否相等,若相等返回真 != 是否不等,若不等返回真 =~ 字符串和模式进行测试是否相等(模式为任意正则表达式) !~ 字符串和模式测试是否不等(模式为任意正则表达式) 文件测试: 功能 -e 测试文件是否存在 -r 测试文件是否可读 -w 测试文件是否可写 -x 测试文件是否可执行 -d 测试文件名是否为目录 -f 测试文件是否为普通文件 -o 测试文件是否被用户所拥有 -z 测试文件是否为空 逻辑运算符: 功能 && 与运算,两个条件同时蛮族 || 或运算,有一个条件满足 ! 取反 六,TCSH内建命令
      1,数字变量:@
      在TCSH中,用@命令代替set命令来声明数字变量,然后进行算术,关系和位操作,数字和字符串变量是两个不同的对象,需要用不同的方法管理,不能把set用于数值变量的设置@命令由关键词,变量名,赋值运算符和表达式构成.如:
      %@ num=10 #注意空格 %@ sum=2 * ($num + 3) %echo $sum 2,alias
      格式:alias [name[command]]
      关键词alias 别名name 引用的命令command
      alias list ls
      alias list 'ls -l'
      3,argv
      当脚本被执行时,命令行中的单词被分析并放入argv数组中.argv[0],argv[1]...argv[n],其中argv[0]保存命令名,argv[1]保存命令的第一个参数,argv[n]命令的第n个参数.argv数组元素可缩写元素号码,前面加$.如:$argv[1]写为$1.$argv[*]写为$*.#argv参数标识符包含输入在命令行中的参数号码,可检查$#argv变量.如:
      arglist
      echo "The number of arguments entered is $#argv"
      echo "The list of arguments is : $argv[*]"
      %tcsh arglist a b c
      The number of arguments entered is 3
      The list of arguments is : a b c
      argv变量列表: 命令行参数 说明 $argv[0]或$0 命令名 $argv[n]或$n 从1($1-$)开始的第n个命令行参数 $argv[*]或$* 从1开始的所有命令行参数 $#argv或$# 命令行参数的计数 格式:bg [%job]
      bg命令把指定的任务放入后台.如果此任务已经停止,则继续执行,如果没有参数,将当前任务放入后台.(详细用法与BASH相同此处略)
      5,break
      格式:break
      break命令用于退出最接近的foreach/while循环过程.执行同一行中其他的命令.
      6,breaksw
      格式:breaksw
      可以从switch语句处中断,在endsw后继续执行.
      7,builtins
      列出全部shell的内建命令表.
      格式:cd [-p][-l][-nl -v][name]
      如果给出目录名,此命令把name设置为当前目录,如果命令中没有name,当前目录自动设置成用户主目录.用于name的"-"引用上一级目录,如果参数name没有给出子目录,或不是全路径,或使用./或../引用当前目录及父目录,那么就检查在cdpath shell变量中列出的目录来寻找该目录名.如果此操作失败,将检查shell变量中是否保存着的目录路径名.用-p选项,linux显示目录列表, 用-l,-n,-v选项与用在dirs命令中的选项完全相同.默认选项-p.
      9,continue
      此命令继续执行最靠近while/foreach语句.当前行其余的命令被执行.
      10,dirs
      格式:dirs [-l][-n|-v]
      dirs -S|-L [filename]
      dir -c
      如果不带参数,dirs将显示目录列表,列表开头被列在作侧,第一个目录是当前目录.带-l选项,用户主目录中的全部子目录被展开,输入项在到达屏幕边缘时,-n选项隐藏输入项,-v选项显示每一行的输入项入口,-c选项将清除目录列表,-S选项可以把目录列表作为一系列的cd和pushed命令保存在文件中,-L选项可以从指定的文件中将cd和pushed命令读入,该文件包含-S选项所存储的cd和pushed命令.如果没有指定的文件名,将使用赋值到dirsfile shell变量中的文件名.如果没有设置dirsfile,将使用~/.cshdirs,在启动时注册shell将对dirs -L求值,如果设置了savedirs,退出前使用 dirs -S,由于在~/.cshdirs之前,仅仅~/.tcshrc是正常来源,dirsfile应该以~/.tcshrc设置而不是以~/.login设置.
      11,echo
      格式:echo [-n] word/string
      此命令把每个单词或字符串写入shell的标准输出.可设置echostyle shell变量来仿真选项以及BSD的换码序列或者echo的System V版本.
      12,eval
      格式:eval argument...
      此命令把参数作为shell的输入,执行当前shell的上下文中的结果命令,由于分析发声在替换前,所以该命令通常用于执行命令或变量替代所产生的命令.
      13,exec
      格式:exec command
      此命令代替当前的shell执行指定的命令,并退出终端.
      14,exit
      格式: exit [expression]
      shell可以带指定的表达式的值退出,如果没有包含表达式,也可带状态变量值退出.
      15,fg
      格式:fg [%job...]
      把指定的任务带到前台,如果任务在终止状态,在带到前台的同时使他运行.job参数是使用任务号或者下列字符串之一的任务引用:' % + -
      16,foreach
      格式:foreach variable(list of values)
      commands
      foreach结构被设置为顺序引用数值列表,它类似BASH shell的for in 结构.foreach结构产生两个操作数:一个变量和一组包含在()中的数值列表.将列表中的值赋值到结构中的变量中.循环体的结尾由语句end构成.下例中脚本list输出由项目和foreach循环读取每一项当前的日期构成的一行信息,列表中的每一项被连续赋值到变量object
      set tdate=`date +%D` foreach object(milk cookies apples cheese) echo $object $tdate %tcsh list milk 04/26/03 cookies 04/26/03 apples 04/26/03 cheese 04/26/03 使用foreach循环有助于管理文件,可以模式中的shell特定字符来产生用作数值列表的文件名列表,然后所产生的文件名列表就成为foreach结构引用的列表.如果在列表中不带任何变量,可以使用命令行参数实现循环.
      #set tdate=`date +D%` foreach object($argv[*]) echo "$object $tdate" %tcsh list a b c a 04/26/03 b 04/26/03 c 04/26/03 使用argv[*]特殊参数变量,可以直接引用命令行参数.下例中,当调用shell脚本cbackuparg时,在命令行下输入C程序文件的列表,在foreach循环中,argv[*]引用命令行中的所有参数,将按顺序把各个参数赋值给变量backfile,变量argnum用于引用每个参数.显示参数和backfile的值来说明它们两个是相同的.
      cbackuparg @ argnum=1 foreach backfile ($argv[*]) cp $backfile sourcebak/$backfile echo "$backfile $argv[$argnum]" @ argnum=$argnum+1 %cbackuparg main.c lib.c io.c
      main.c main.c
      lib.c lib.c
      io.c io.c
      17,history
      history [-hr][n]
      history -S|-L|M [filename]
      history -c如果history没有任何参数,将显示开行号的历史命令列表.用作参数的号码将列出行的最后号码.如果没有任何选项参数,她将用作历史文件名;否则,将使用hisfile变量值.
      用-h选项,将以注释的形式显示不带行号的历史文件列表
      用-r选项,将反向显示,以最近的列表开始
      用-c选项,则清除历史列表
      如果用-S选项,可以把历史列表存入文件,如果savehist shell变量的第一个单词被设置为数值,历史文件将被保存为最大的行数,如果第二单词为'merge',历史列表将被合并到当前的历史文件中,而不替代历史列表,时间图章排序历史列表.
      如果用-L选项,shell将从存储的历史列表文件中读取历史列表并把她追加到当前历史列表中.
      如果用-M选项,将从历史文件读取历史列表信息,但用当前历史列表信息合并,排序历史列表.
      如果没有用这些选项给出文件名,那么,就使用赋值到histfile shell变量的文件名,如果没有设置histfile,就使用~/.history.
      18,hup
      hup [command]
      如果带有括起来的command参数,hup运行command,根据停机信号退出.当shell退出时,hup安排shell发出停机信号.注意:命令也许设置自己的停机响应,重写hup,如果没有参数(只有在shell脚本中才允许),hup使shell根据脚本的余项的停机信号退出.
      19,if-then
      if (expression) then
      command
      endif
      if-then结构把条件放入几个linux命令,该条件是expression,如果expression得出非零的数值,那么expression为真,执行if结构内的命令,如果expression得出零值那么expression为假,就不执行if结构内的命令.
      if-then结构以if关键词开始,expression表达式用()括起来,关键词then后可以跟任意数量的linux命令,以关键词endif结束if命令.注意:在TCSH中,if (expressiong)和then必须在同一行!
      echo -n "Please enter option:" set option=$< if ($option=="s") then echo List files by size ls -s endif
      %tcsh ifls
      Please enter option: S
      List files by size
      total 2
      1 monday 2 today
      20,if-then-else
      if (expressiong) then
      command
      command
      endif
      用户需要经常需要根据expression是真还是假来进行选择.关键词else允许if结构在两者之间选择,如果expression为真,那么执行第一个command,否则,执行第二个就是else后面的command.
      elsels echo Enter s to list file sizes echo otherwise all file information is listed echo -n "please enter option:" set option=$< if ($option=="s") then ls -s ls -l endif echo Good-bey
      (结果略)
      21,jobs
      jobs [-l]
      此命令列出所有活动的任务,如果带-l选项,将列出进程号,以及正常的信息.
      22,kill
      kill [-signal] %job\pid...
      kill -l
      此命令用于终止进程或者任务,如果带-signal选项,应该指定要发送的信号,默认发送的信号是SIGTERM,如果带有-l选项,则列出信号名,对于带-l选项提供的信号数,将列出与其相关的信号名.
      23,logout
      此命令用于终止注册shell,如果设置了ignoreeof,它将非常有用.
      24,nice
      nice [+ number][command]
      此命令设置shell调整优先为number,如果没有设置number,调整优先设置为4,带有指定的command,nice适当的优先运行command,number值越大,进程获得的CPU的时间就越少.
      25,nohup
      nohup [command]
      如果不带command参数,nohup指示shell忽略任何停机信号,如果带command参数,将执行此命令并忽略执行中的任何停机信号.
      26,notify
      格式:notify [%job...]
      Linux执行命令后,如果有后台任务在执行,系统将通知到目前为止已经完成的后台任务,该系统不会中断如编辑这样的操作来通知用户关于完成的任务,当某任务完成时,如果想马上知道,无论系统在作什么,可以使用notify命令指令系统通知用户,它的参数作为任务号,当任务完成时,系统将中断当前命令并通知用户任务已经完成,如:
      %notify %2
      当2号任务完成时,告诉系统通知用户.
      27,onintr
      格式 onintr [-|label]
      此命令控制shell在中断时的动作,不带任何参数,将回复shell中断默认的动作,将终止shell脚本或返回输入级的终止符,如果带-参数,则忽略全部的中断,当接受中断或当子进程终止时,带label的命令将使shell执行goto标号.
      28.popd
      格式 popd [-p][-l][-n|-v][+n]
      此命令从目录列表中删除一个目录,不带参数的命令从列表中删除顶层目录,+n删除从左起的第n层的目录.然后popd显示最终的目录列表.pushdsilent shell变量可以设置为支持此特性,-p选项可以重写pushdsilent.
      29.printenv
      printenv [name]
      此命令显示环境变量的名和值,如果带name参数,仅仅显示环境变量name的值.
      30.pushd
      pushd [-p][-l][-n|-v][name|+n]
      此命令把目录添加到存储的目录列表中,然后显示目录列表,如不带参数,除非目录为空,pushd交换顶层的两个目录,并返回0.+n旋转列表以便使第n个目录(从左起)列与顶端,但是,如果设置了dextract,pushd +n将展开第n个目录,把它压入堆栈顶层.-n旋转堆栈以便第n个目录(从右起)列于顶端,dir把dir添加到顶端的目录列表,使它成为新的当前目录.如果设置了pushtohome,不带参数的pushd命令执行pushd ~的功能,像cd的功能一样,如果dunique被设置,pushd在压入堆栈之前从堆栈中删除任何的name历程,可以设置pushdsilent shell变量来取消目录列表的显示,然后可以使用-p选项重写pushdsilent.
      31,repeat
      repeat count command
      此命令重复执行command指定的次数count.
      32,set
      set name ...
      set name = value ...
      set name = (wordlist)...
      set name[index] = word ...
      set -r
      set -r name ...
      set -r name = value ...
      set -r name = (wordlist) ...
      不带任何参数的set命令将显示全部的shell变量值,包含许多单词的变量作为放在括号中的词列出,带name参数的set命令定义一个变量并为它赋值null串,带有name和=符号分隔的值,set定义变量并给它赋值,要把wordlist作为值赋值给name变量,把列表中的词作为要赋的值放在括号中,为了将数值赋值给数组元素,,使用方括号[]指定元素的index,但是该元素必须已经存在.
      -r选项常用于引用只读变量,仅仅带-r选项的set命令将列出只读变量,与变量名一起使用,set将使此变量设置为只读,与赋值的变量一起使用,将初始化该变量,并使该变量成为不能被修改的只读变量.在TCSH中,用户必须在使用变量之前首先声明它,使用加变量名的set命令声明变量.
      变量名可以是任何字母字符包括下划线_,也可以含有数字,但是变量名不能以数字为首字符!
      33,setenv
      setenv [name[value]]
      setenv常用于定义有特定值的环境变量.如没有带value选项,setenv设置name变量为null串,如果没有带任何参数,将显示全部环境变量的名称和值.TCSH有两种类型的变量:局部变量和环境变量.局域变量是在shell内部声明的;环境变量是全局域的变量.使用setenv可以定义环境变量,使用setenv命令,变量名,以及被赋值的值,就可给环境变量赋值.其中,没有赋值运算符,如:
      %setenv greeting hello
      greeting环境变量被赋值为hello
      无论何时调用shell脚本,都将产生自己的shell,如果shell脚本被另外一个shell脚本执行,它将使自己的shell从第一脚本的shell中分离.现在有两个shell,属于第一个脚本的父shell和当执行第二个脚本是产生的子shell.在其他的shell内部执行脚本时,这个shell是第一个脚本的子shell,原来的脚本的shell是它的父shell.每个shell都拥有自己的变量,子shell不能引用父shell中的局域变量,但是能引用环境变量.子shell可以引用父shell中声明的任何环境变量.
      34,shift
      shift [variable]
      没有参数的shift命令向左移动argv数值,即argv[1]的数值被argv[2]所代替,如果argv没有被设置或者数值少于一个词时将发声错误.带有其数值为列表或数组的variable,该命令将列表和数组的数值向左移动.
      35,source
      source [-h] name [argument...]
      source读出并执行以name命名的命令,通常是shell脚本(不能把这些命令放在历史列表中).把任何参数输入argv中.用-h选项,命令被放入历史列表但是不立即执行.
      36.stop
      stop %job\ job...
      stop命令停止指定的任务或在后台执行的进程.也可以用一个数字或字符串引用一个任务,如果不存在默认的任务,那么仅仅stop不能停止当前的任务.
      37,switch
      switch (test-string) case pattern: commands breaksw case pattern: commands breaksw default: commands breaksw endsw
      switch结构在几个可能的选项中进行选择.此结构与BASH中的case结构非常类似通过把字符串与几个可能的模式进行选择,每个可能的模式都与一系列命令相关联,如果没有相匹配的项,则执行相关的命令,.switch结构以关键词switch和放在圆括号中的test-string开始,字符串常由变量求值导出,然后是一系列的模式,每个模式pattern前是关键词case,以冒号:结束,冒号后列出与选择有关的commands,以breaksw终止command,在所有被列出的模式之后,关键词endsw结束switch结构,注意,每个测试表达式的命令组的最后一个命令是breaksw,每个测试表达式被逐一测试,直到找到相匹配的内容,如果没有找到相匹配的项,则执行默认项default.用关键词
      default表示默认选择,default项是可选的.但是它有助于通知用户没有匹配的测试字符串.举例:
      lschoice echo s.List sizes echo l.List files infomation echo c.List C files echo -n "Please enter choice:" set choice=$< switch ($choice) case s: ls -s breaksw case l: ls -l breaksw case c: ls *.c breaksw default: echo Invalid Option breaksw endsw
      (输出略)
      38,time
      time [command]
      如果没有参数,此命令显示当前shell的时间累计,用一条命令作为参数,它执行命令并显示时间累计.
      39,umask
      umask [value]
      此命令指定用户文件建立掩码,掩码用八进制表示.
      40,unalias
      unalias pattern
      此命令删除其名称与pattern匹配的所有别名.
      41,unset
      格式:unset pattern
      此命令取消定义shell变量,名称可能是匹配了几个变量的pattern(尽量避免用unset *,因为它将取消所有的变量)
      42,unsetenv
      unsetenv pattern
      此命令取消定义环境变量,名称可能是匹配几个变量的pattern,也尽量避免用unsetenv *,因为它将删除所有的环境变量.
      43,wait
      此命令指示shell等待全部的后台任务的完成,在一个交互的shell环境中,可中断一个wait操作,并显示剩余的任务.
      44,where
      格式:where command
      此命令报告所有已知的命令历程,包括别名,内建和可执行的路径.
      45,which
      which command
      此命令显示shell要执行的指定的任务.
      46,while
      while(expression)
      command
      此循环重复执行命令,以关键词while开始,接着是圆括号括起来的表达式expression以end结束循环.
      while循环很容易与switch结构结合,构成菜单的驱动程序.举例:
      lschoicesw set again=yes while ($again==yes) echo "1.List sizes" echo "2.List files information" echo "3.List C files" echo "4.Quit" echo -n "Please enter choice:" set choice=$< switch ($choice) case 1: ls -s breaksw case 2: ls -l breaksw case 3: ls *.c breaksw case 4: set again=no echo good-bey breaksw default: echo Invalid Option endsw
      (输出略)
      TCSH配置
      TCSHshell可以使用户使用shell配置变量和特征配置自己的shell.也可以使用set命令设置特征.TCSH也有注册,注消以及何时进入TCSHshell的配置文件.
      一,TCSH shell 特征
      TCSH有几个特征,允许控制不同的shell操作的方法.TCSH shell特征不仅包括许多它自己的特征,而且还包括KSH/BASH shell中的特征,如,TCSH中有一个noclobber,防止重定向重写文件,,一些更常用的特征为:echo,noclobber,ignoreeof和noglob.
      通过定义和取消定义与该特性相关的变量,打开/关闭TCSH shell特征,为每个特征命名变量.例如,通过定义noclobber变量,打开noclobber特征.使用set命令定义变量,而使用unset命令取消定义变量.为了运行noclobber特征,使用set noclobber,为了关闭它,使用unset noclobber.如:
      set variable 定义变量
      unset variable 取消变量
      由于这些变量常用于打开/关闭特征,所以有时也被叫做双态切换.
      1,echo
      在echo被执行之前,设置echo启动显示命令的特征.
      set echo 打开echo特征
      unset echo 关闭echo特征
      2,ignoreeof
      设置ignoreeof启动防止用户使用CTRL+D注消用户shell的特征,它用于防止突发性的注消操作,如果此特征关闭,可以用CTRL+D注消过程.由于在标准输入中CTRL+D是结束用户输入的操作,所以很容易造成突发注消shell进程.因此,ignoreeof特征就能防止这种突发的注消,当此特征被设置后,用户必须用logout命令明确注消.
      3,noclobber
      设置noclobber启动预防现有文件不被重定向输出的特征,借助此特征,如果把输出重定向到已经存在的文件中,就不用标准的输出重写文件.原文件被保存.也许会发生这种情况:把现有文件名用作保存被重定向的输入的文件名.因此,noclobber特征使用户不会意外的重写原文件.
      %set noclobber
      %cat oldfile > newfile
      newfile: file exist
      有时,用户想用重定向输出重写某个文件,那么就可在重定向符号操作符之后放置惊叹号!实现重写操作.这将重写noclobber特性,用标准的输出代替文件内容.
      %cat oldfile >!newfile
      4,noglob
      设置noglob使某特性有效,该特征禁止用户shell中的某些字符.字符 * ? [ ] ~将不再扩展为匹配的文件名.如:
      %set noglob
      %ls myfile?*
      myfile?*
      附录:常用的TCSH shell特征:
      特征 功能
      set 打开shell特征
      unset 关闭shell特征
      echo 执行命令前显示该命令
      ignoreeof 禁止用CTRL+D注消
      noclobber 不必通过重新定向重写文件
      noglob 禁止特殊字符用于文件名扩展:* ? ~ [ ]
      notify 当完成后台任务时立即通知用户
      verbose 历史命令引用后显示命令
      二,TCSH shell变量
      正如在BASH shell中一样,也可在TCSH shell中使用特殊shell变量来匹配自己的系统.一些变量在系统初始化中定义,也可以在shell中用新的值重新定义变量,有些必须在系统初始化时定义,如最常用的特殊变量prompt变量,它允许建立自己的命令行提示符
      另外一个是history变量,该变量确定保存了多少历史命令/事件. 在TCSH shell中,许多特殊变量的名称与函数都与BASH/ZSH shell中的变量名称和函数类似.一些必须用大写表示,但是大多数用小写表示.某些特殊变量起类似的作用,但是具有完全不同的实现方法,如mail变量保存的信息与BASH shell的MAIL,MAILPATH,MAILCHECK变量保存的信息完全相同.
      1,prompt prompt2 prompt3
      这三个变量为命令行保存提示符.用户可以设置自己想要的符号/字符串作为提示符.为了设置命令行提示符,可以用
      %set prompt="+"
      这样提示符就变成了+号.也可以使用预定义的一组代码使得配置提示符更容易,在每个代码前加个%号,例如,用%/表示当前的工作目录,%t表示时间,%n表示用户名,%!表示下一个历史事件的号码,如:
      %set prompt="%/"
      /home/dirname
      代码列表:
      代码 说明
      %/ 当前运行目录
      %h,%!,! 当前历史号码
      %t 当天时间
      %n 用户名称
      %d 日期
      %w 当前月份
      %y 当前年份
      当命令分为若干行输入时,变量prompt2被用于特殊情况,为需要输入改命令而增加的行显示prompt2,prompt3提示符用于检查拼写特征是否被激活.
      2,cdpath
      cdpath变量保持目录的路径名,用cd搜索特定的子目录,这些路径名形成一个数组,就像赋值给TCSH shell的path变量的路径名数组一样,注意在路径名之间要求有空格.
      %set cdpath=(/usr/bin /var/bin /home/username)
      3,history和savehist
      正如前面了解的那样,history变量常用于确定要保存的历史事件的数量,只需给该变量赋值history应该记录的事件的最大的数值.当达到最大值时,计数器从1开始.但是当注消时,savehist变量保存存储在.history文件中事件的数量,当再次注册时,这些事件
      就成为初始化历史事件.如:
      %set history=20
      %set savehist=5
      当注册时,历史列表中将记录20个事件,但是当注消后,仅仅最后5个事件被保存在.history文件中,下一次注册时,历史列表将由以前的最后5个命令组成.
      4,mail
      在TCSH shell中,mail变量综合了BASH和ZSH shell中的MAIL,MAILCHECK,MAILPATH变量的特征.TCSH shell mail变量值是一个数组,该数组的元素既包括检查电子邮件的时间间隔,又包括检查电子邮箱文件的路径.要给这些元素赋值,可以把赋值的数组赋值给mail变量,用圆括号括起来,空格分割的一系列指定数组的新值.第一个值是再次检查电子邮件前设置等待的秒数,它类似BASH shell的MAILCHECK变量保存的数组.其余的值由电子邮箱文件的路径构成,检查该文件获取邮件.注意,这些变量保存了BASH和ZSH shell MAIL,MAILPATH变量的功能. 如:
      %set mail ( 1200 /usr/mail/user)
      mail变量被设置成每1200秒检查一次电子邮件,被检查的电子邮箱文件在/usr/mail/user目录中.
      %set mail (1200 /usr/mail/user /home/userdir)
      也可以容易的给mail数组添加更多的邮箱文件路径,注意每个元素之间的空格.
      附常用的TCSH shell配置变量:
      变量 说明
      home 用户主目录的路径名
      user 注册名
      pwd 当前运行目录的路径名
      shell 用于注册过程的程序路径名
      prompt 主提示符
      path 目录路径名列表,搜寻目录获取可执行命令
      mail mail实用程序检查该变量来获取接受信息的邮件文件名
      cdpath cd命令搜索该变量获取子目录的目录路径名
      history 历史列表中命令数量
      savehist 为下一个注册存储历史列表中的命令数量
      EXINIT EX/vi编辑器的初始化命令
      TERM 终端名
      三,TCSH shell初始化文件
      TCSH shell有3个初始化文件: .login .tcshrc .logout,.login文件是每次注册时执行的注册初始化文件, .tcshrc文件是每次进入TCSH shell时执行的shell初始化文件, 该文件在注册时执行或者用tcsh命令直接从另一个shell进入TCSH shell时执行,每次注消时执行.logout文件
      1, .login
      TCSH shell有自己注册初始化login,该文件用于配置用户shell的shell命令和特殊变量定义, .login文件相当于BASH和ZSH shell中使用的.profile文件..login文件包含setenv命令,给TERM之类的特殊环境变量赋值,可以用任何标准的编辑器编辑它,改变这些值,也可添加新的值.但是要记住:在TCSH shell中,为环境变量赋值的命令是setenv,如:
      %setenv EXINIT 'set nu ai'
      定义EXINIT变量并设置vi编辑器行计数和自动缩排的功能.
      当编辑.login文件时要十分小心,不经意的编辑可能造成错误的变量设置或者根本没有设置变量,因此,编辑之前最好备份.login文件.如果更改了.login文件,想让这些变化在当前注册期间生效,需要使用source命令重新执行该文件,source命令实际上可执行任何初始化文件,其中包括.tcshrc文件和.logout文件,如:
      %source .login
      2, .tcshrc
      每当进入TCSH shell或产生任何子shell时,就执行.tcshrc初始化文件,如果TCSHshell是用户注册的shell,那么当用户注册时, .tcshrc文件和.login文件一起运行,如果从另外一个shell进入TCSH shell, .tcshrc文件被自动执行,文件中包含的变量和别名被定义.
      实际上,每当产生一个shell时,如运行shell脚本,就执行.tcshrc文件,也就是说,每当创建一个shell时,就执行.tcshrc文件,这允许在.tcshrc中定义局部变量,在某种意义上说,局部变量可以进入任何子shell,即时像history这样的用户定义的变量也是局部变量,但要为每个产生的子shell定义特殊变量,这样,为每个子shell变量设置history,但是,每个子shell都有自己的局部history变量,用户甚至可在不影响其他子shell的变量的情况下改变一个子shell的局部history变量,在shell初始化文件中定义特殊变量可以看做是BASH shell导出变量,在BASH shell和ZSH shell中的导出变量只把自己的拷贝传送给子shell,改变拷贝不会影响原始定义..tchsrc文件也可包含别名变量和用于打开shell特征的特征变量,别名变量和特征变量是局部变量,限定于shell内部.但是.tcshrc文件在每个shell中都将定义这些变量.因此, .tcshrc文件通常保存各种命令定义的别名,如:
      .tcshrc
      set shell=/usr/bin/csh set path=$PATH (/bin /usr/bin .) set cdpath=(/home/dirname/filename /home/dirname/files) set prompt="!$pwd>" set history=20 set ignoreeof set noclobber alias rm 'rm -i' alias mv 'mv -i' alias cp 'cp -i' 与环境变量不同,局部变量用set命令定义,在.tcshrc文件中的局部变量应该使用set命令定义,用setenv命令定义的环境变量是放在.login文件中的,请记住:当改变path或cdpath的路径名时,数组中包含这些路径名,数组中的每个元素要用空格分开,如果添加新的路径名时,必须保证用空格把它和其他的路径名分开.如果已经改变了.tcshrc文件,希望这些变化在当前注册中立即生效,别忘了用source命令重复执行.tcshrc文件.
      3, .logout
      .logout文件也是初始化文件,只不过它在注消时执行,用户可以设置.logout文件以使其完成任何在注消时想要完成的操作,文件中没有定义变量,常包括关闭进程的shell命令.可以向.logout文件中添加自己的shell命令,如:
      .logout
      clear
      echo "Good-bye..."
      现在关于BASH的资料,在网上很多,我(KornLee)一直没有找到关于TCSH编程的入门资料,因此,特从我的书中摘抄下来,终于打完啦~~,请喜欢tcsh编程的兄弟们多提意见,:)
      [22:55] [发表评论] Qalculate! 一个功能非常强大的计算器,不仅仅是计算器,竟然可以解决二元方程、积分、调用gnuplot绘图、携带元素周期表、科学常数等,比以前喜欢的rcalc更加强大多了!还有一个命令行下的版本qalc,但没这个强大。
      Debian自带此包: apt-get install qalculate即可
      参看更多抓图
      Qalculate! is not your regular software replication of the cheapest available calculator. Qalculate! aims to make full use of the superior interface, power and flexibility of modern computers.
      The center of attention in Qalculate! is the expression entry, Instead of entering each number in a mathematical expression separately, you can directly write the whole expression and later modify it. Just enter an expression as you would write it on paper, press Enter and voila!
      The interpretation of expressions is flexible and fault tolerant, and if you nevertheless do something wrong, Qalculate! will tell you so. Not fully solvable expressions are however not errors. Qalculate! will simplify as far as it can and answer with an expression.
      In addition to numbers and arithmetic operators, an expression may contain any combination of variables, units, and functions. These are immediately accessible from the user interface — the menu bar, the managers, the calculator keypad, and automatic completion.
      Qalculate! also has some special tools to increase your efficiency, including a number base conversion dialog and a simple plotting interface.
      Although use of Qalculate! for simple calculations should be natural and self-explanatory, reading the rest of the manual can help you maximize your productivity and discover some maybe unexpected features. More advanced users should read on and discover a large number of customization options and the ability to create and modify your own variables, functions and units directly from the user interface. [22:55] [发表评论] 编写并行程序:多语言指南介绍 http://softwarecommunity-zho.intel.com/articles/zho/1252.htm?cid=sw:prccsd111
      编写并行程序:多语言指南介绍
      发布日期: 2007年4月12日 | 最后修改日期: 2008年1月8日

      并行编程曾一度是顶级编程人员面临大型超级计算问题困扰时的唯一关注点。但是,随着面向主流应用的多核处理器的出现,并行编程现已成为所有专业软件开发人员都必须了解和掌握的一项技术。

      并行编程也许会很难,但事实上,它只是“不一样”而已,并非“很难”。它不仅具有更为传统的串行编程的所有特点,还包含三个定义完备的附加步骤:

    • 识别并发:分析问题,以识别能够同时执行的任务。
    • 揭露并发:重新构建一个问题,确保高效完成任务。此步骤通常需要确定任务本身与组织源代码之间的依赖程度,以便任务得到高效管理。
    • 表达并发:在源代码中使用并行编程符号来表示并行算法。
    • 以上的每一步都很重要。前两步在最近一本关于并行编程设计模式的书中有详细介绍 [mattson05]。本文将重点介绍第三步:在源代码中使用并行编程符号来表示并行算法。这种符号可以是并行编程语言,也可以是通过程序库界面实施的应用编程接口 (API),或是添加到现有序列语言的语言扩展。

      选择一种独特的并行编程符号绝非易事。这些符号的学习难度参差不齐,而且极其耗时。因此,掌握几种符号并从中选择一种进行运用的做法是不切实际的。编程人员所需的是一种能够充分详细地了解不同符号的“优势”,以及各项高级特征的快捷方法,以便明智地决定学习哪种符号。

      在本文中,我们将对几种不同的并行编程符号进行高度全面概述,重点介绍其主要使用方法,并对它们的特殊优势和缺陷进行分析。我们将具体介绍以下几种符号:

    • OpenMP:针对简单并行编程的编译器指示
    • MPI:支持超高性能便携性的程序库例程
    • Java:基于领先对象的编程语言并行
    • 为了使我们的讨论尽可能地具体详实,我们在每种情况下都部署了一款知名的 π 程序的并行版本。这是一种利用梯形法则(其中被积函数和积分极限被选中)来运算的简单数值积分,因此从数学角度讲,正确的答案为 π。很多人都将它视为并行编程中最为基本的程序。在本文最后,我们还将简单介绍如何选择一款并行编程符号来使用并掌握。

      π 程序:并行梯形积分

      在微积分研究中,我们了解到一个积分在几何上可以表示为曲线下面积。也就是说,积分的近似值可以通过计算得出。我们先将积分面积划分为许多的梯级,并在每一梯级内画出一个矩形,并让它的高等于该梯级中心的被积函数值。那么这样,每个矩形面积的和就约等于该积分。

      如图 1所示:梯形积分----每一竖条都拥有固定宽度的“梯级”。每个竖条的高度便是被积函数的值。将所有竖条的面积加在一起便得出曲线下面积的近似值,即被积函数的值。

      我们可以选择一个被积函数及积分极限,那么该积分在数值上便等于 π。这样便可更加直接地进行程序正确性检验。下面我们向您展示了一个执行该算法的简单的 C 程序:

      static long num_steps = 100000;

      double step;

      void main ()

      {                 int i;                  double x, pi, sum = 0.0;

       

                       step = 1.0/(double) num_steps;

       

                       for (i=0;i<= num_steps; i++){

                                        x = (i+0.5)*step;

                                        sum = sum + 4.0/(1.0+x*x);

                       }

                       pi = step * sum;

      }

      OpenMP

      OpenMP [omp] 是一款为共享内存计算机来编写并行应用程序的行业标准 API。OpenMP 的主要目的,是使高性能计算中常见的循环导向型程序更加易于编写。OpenMP 中的各种结构可支持 SPMD、Master worker、管线,以及大多数其他并行算法 [Mattson05]。

      OpenMP 是一款非常成功的并行语言。市面上每款共享内存计算机均支持它的运行。最近,英特尔在 OpenMP 上创建了一个变量,从而实现了对集群的支持。OpenMP 还能逐步添加并行的编程方式,因此现有的顺序程序可发展为并行程序。但是,这一优势却也成了OpenMP 的最大缺陷。那是因为通过使用逐步并行,编程人员可能会错过某一程序的大规模重建,从而失去获得最大性能的机会。

      OpenMP 的标准仍在不断演进。为此,一家名为“OpenMP 体系结构评审委员会 (OpenMP Architecture Review Board)”的行业团体定期举行会晤,共同开发该语言的全新扩展。OpenMP 的下一版本(3.0 版)将包含一种任务队列能力。这将支持 OpenMP 处理更广泛的控制结构,以及更多的一般递归算法。

      OpenMP 简介

      OpenMP 基于 fork-join 的编程模式而设计。OpenMP 程序起初以一条单线程的形式开始运行。如果编程人员希望在程序中利用并行,那么就需将额外的线程进行分支,以创建线程组。这些线程在称为“并行区域”的代码区域内并行执行。在并行区域末尾,将等待所有线程全部完成工作,并将其重新结合在一起。那时,最初线程或“主”线程将继续执行,直至遇到下一个并行区域(或程序结束)。

      OpenMP 的语言结构根据编译器指示而定义,可为编译器布置任务,以实施理想的并行。在 C 和 C++ 中,这些指示根据制导语句来定义。

      OpenMP 制导语句在任何情况下的形式都相同

      #pragma omp construct_name one_or_more_clauses

      其中“construct_name”规定了编程人员希望执行的并行动作,而“clauses”则对该动作进行修改,或对线程所见的数据环境进行控制。

      OpenMP 是一种显式的并行编程语言。一旦线程创建,或者工作已经映射到该线程上,那么编程人员必须对希望执行的动作加以详述。因此,即使是 OpenMP 这样简单的 API 也有诸多结构和子句需要编程人员学习。所幸的是,仅利用整个 OpenMP 语言的一小部分子集,便可完成大量上述工作。

      可利用“parallel”结构在 OpenMP 中创建线程。

      #pragma omp parallel

      {

      …. A block of statements

      }

      独自使用时(没有修改任何子句),程序可创建出一系列线程供运行时环境选择(这些线程通常与处理器或内核的数量相等)。每条线程都将根据并行制导语句来执行语句块。该语句块可以是 C 中的任意合法语句组,但是唯一例外的是:您不能分支到并行语句块之中或之外。您只要稍微思考一下就能明白。如果线程要全面执行语句组,并且该程序的继发行为还要有意义,那么您便不能随意将线程分支到并行区域内的结构之中或之外。这是 OpenMP 的一项公共约束。我们将这种缺乏某些分支的语句块称为“结构块”。

      您可以令所有线程执行相同的语句,从而进行大量的并行编程。但是要体验 OpenMP 的全部功能,我们要做的就不止这些。我们需要在多条线程之间共享执行语句集的工作。我们将这种方式称为“工作共享”。最常见的工作分享结构是循环结构,在 C 中即为“for”循环

      #pragma omp for

      但是,这一结构仅对具有规范形式的简单循环起作用

      for(i=lower_limit; i<upper_limit; inc_exp)

      “for”结构执行循环的迭代,并将其打包至那些利用并行结构创建的早期线程组中。循环极限和循环索引 (inc_exp) 的递增表达式需在编译时完全确定,并且这些符号中使用的任何恒量都必须在线程组中保持相同。您只要思考一下就能明白。系统需要得出循环的迭代数量,然后将其映射到能够分发至线程组的集上。如果所有线程均计算相同的索引集,那么上述工作只有通过持续稳定的方式才能实现。

      请注意,“for”结构并不能创建线程,您只能借助并行结构来做到这点。为了简捷起见,您可以将并行结构和“for”结构放在一个制导语句中。

      #pragma omp parallel for

      此举可创建一个线程组,以便执行紧随其后的循环迭代。

      该循环迭代必须是独立的,因此不论迭代的执行顺序如何,或是究竟由哪些线程执行循环的哪些迭代部分,循环结果都将相同。如果一条线程写入变量,另一条线程读取变量,那么将产生循环传递相关性 (loop-carried dependence),程序也将生成错误的结果。编程人员必须仔细分析循环体,以确保没有任何循环传递相关性的发生。在很多情况下,循环传递相关性来源于保存中间结果(用于指定的循环迭代)的变量。在此情况下,您可以通过声明每条线程都将具有自己的变量值,以除去循环传递相关性。这可通过私有子句来实现。例如,如果循环使用名为“tmp”的变量来保存临时值,那么您可将以下子句添加到 OpenMP 结构中,这样它便可用于循环体内部,而不会造成任何循环传递相关性。

      private(tmp)

      另一种常见情况是循环内出现变量,并用于从每个迭代中累积数值。例如,您可以利用循环将某项计算的所有结果进行求和,得出一个数值。这在并行编程中十分常见,通常被称为“规约”。在 OpenMP 中,我们的规约子句表示为

      reduction(+:sum)

      同私有子句一样,该子句可添加到 OpenMP 结构中,用以提示编译器等待规约。这时,程序便会创建一个临时私有变量,以便为每条线程计算累积操作的部分结果。当该结构运行到最后时,每条线程的值将结合起来产生最终答案。用于该规约的操作在子句中同样进行了详细说明。在这种情况下,此操作为“+”。根据对遭受质疑的数学操作进行特性识别,OpenMP可定义用于规约的私有变量值。例如,对于“+”来说,该值为零。

      当然,OpenMP 还有更为复杂的情况,但是借助这两个结构和两个子句,我们便能够解释如何并行 π 程序。

      OpenMP π 程序

      为了简单起见,我们将统一规范所需的步骤,并且只使用默认数量的线程进行工作。在串行 π 程序中,还有一个需要并行的单循环。除因变量“x”和累积变量“sum”之外,该循环的迭代完全独立。请注意,“x”在此用于计算一个循环迭代内的临时存储。因此,我们可以通过一个私有子句将该变量定位到每条线程,以便对其进行处理

      private(x)

      从技术层面上讲,循环控制索引可创建一个循环传递相关性。但是,OpenMP 却认为该循环控制索引需要定位到每条线程之中,以使其自动实现对所有线程的私有化。

      累积变量“sum”用于计算总和。这是一个经典规约,因此我们可以使用规约子句:

      reduction(+:sum)

      将这些子句添加到“parallel for”结构中,我们便借助 OpenMP 完成了 π 程序的并行。

      #include <omp.h>

      static long num_steps = 100000; double step;

      void main ()

      {                 int i;                  double x, pi, sum = 0.0;

                       step = 1.0/(double) num_steps;

      #pragma omp parallel for private(x) reduction(+:sum)

                       for (i=0;i<= num_steps; i++){

                                        x = (i+0.5)*step;

                                        sum = sum + 4.0/(1.0+x*x);

                       }

                       pi = step * sum;

      }

      请注意,我们的 OpenMP 中同样包括标准的 include file

      #include <omp.h>

      这规定了编程人员有时需要的 OpenMP 类型和运行时程序库例程。请注意,在此程序中,我们虽没有利用该语言的这些特性,但是将 OpenMP include file 包括在内却是一个很好的想法,以避免日后在程序需要时进行修改。

      MPI,或者讯息传递界面(Message Passing Interface)是我们当今使用的一种最久的并行编程 API。MPI 程序作为一系列独立进程,主要通过收发讯息实现互动。MPI 的一大优势便是它只占用并行计算机中的极少部分硬件。它的唯一要求,便是处理器或内核共享同一简单网络,从而在任何进程组间充分地路由讯息。这也支持 MPI 在任何通用并行系统上运行----不论从对称多处理器到分布内存,还是从大规模并行超级计算机到各种集群。

      MPI 诞生于 20 世纪 90 年代早期,那时集群刚刚兴起,大规模并行处理器(MPP)占据着高性能计算的大壁江山。每个 MPP 厂商都有自己的讯息传递符号。厂商很乐意看到这种状况,因为这样可以将用户锁定在自己的产品线内,但这却让编程人员大伤脑筋。因为软件的寿命远比硬件要长。再者,由于没有一种可移植性符号,所以,每次在研发新电脑时,应用编程人员都不得不将其软件从一种讯息传递符号转换为另一种,耗费了大量精力。

      MPI 并不是第一款可移植性讯息传递库,但却是第一款由行业/国家实验室/学术人员联合创建的程序库。MPI 的创建过程集合了几乎所有的业内主要力量,并迅速成为高性能计算领域的标准讯息传递界面。现在,MPI 已走过了大约 15 个春秋,但它仍是高性能计算领域并行编程应用中应用最为常用的符号。

      目前,大多数 MPI 程序均使用单程序多数据或 SPMD 模式 [mattson05]。它的原理非常简单:所有处理单元(PE)运行同一程序。并且它们都具有一个独特的整数 ID,以确定其在处理单元集内的排序。这样,程序便可利用该排序分配工作,并决定由哪个 PE 处理哪部分工作。换句话说,程序只有一个,但是由于根据 ID 所做的选择多种多样,因而,PE 间的数据也就有可能不同;即“单程序,多数据”模式。

      MPI 概述

      MPI 是一个可靠实用的讯息传递系统,它专为支持广泛的硬件而设计,并可支持带有完整模块化设计的复杂软件架构。

      MPI 的设计理念基于通信子(communicator)。在创建一套进程时,它们可以定义群组。这样,进程组便可共享通信环境,从而更好地进行通信。这种进程组与通信环境的结合,可以定义一个独特的通信子。当您考虑在程序中使用程序库时,这一概念的力量就会凸现出来。如果程序员不细心,那么程序库开发人员创建的信息便可能与程序中用来调用程序库的信息发生干扰。但是通过通信子,程序库开发人员便可创建自己的通信环境,并确保就通过系统传递的相关信息而言,程序库的内部活动不会对其造成干扰。

      当 MPI 程序启动时,将创建默认的通信子 MPI_COMM_WORLD。该通信子作为第一个参数被传递到每个 MPI 例程中。其它的参数则用来定义信息来源,以及定义保存信息的缓冲。在这种情况下,MPI 例程就会返回一个整数值作为错误参数,以查询例程执行期间出现的所有问题。

      MPI 程序通常在靠近开始的位置上设置三个例程的调用,以设置 MPI 的使用方式。

      int my_id, numprocs;
      MPI_Init(&argc, &argv) ;
      MPI_Comm_Rank(MPI_COMM_WORLD, &my_id) ;
      MPI_Comm_Size(MPI_COMM_WORLD, &numprocs) ;

      第一个例程(MPI_Init)用来输入任何 C 程序人员都熟悉的命令行参数,并初始化 MPI 环境。后两个例程用作输入 MPI 通信子(本例中为默认的通信子),并返回调用的进程排序(rank)和进程总数。这里,排序作为该进程的唯一标识符,可从 0 一直排到进程数量减去 1。

      关于创建多少进程以及它们将在哪些处理器上运行的详细信息,都被置于 MPI 应用编程接口之外。由于支持 MPI 的平台各异,所以需要使用不同的方法。在大多数情况下,会有一个主机文件按名称顺序列出每颗处理器的信息。这些信息将传递给可用于大多数 MPI 平台的常见 shell script(称为 mpirun),以启动 MPI 程序。鉴于这一简单进程的详情在不同平台上表现各异,我们在这里就不进行讨论了。

      在每个 MPI 程序的最后都应该有一个例程来关闭环境。此函数将返回整数值错误代码。

      int MPI_Finalize();

      MPI 程序运行于这些例程之间。程序的大部分都是由规则的串行代码组成,并以您所选择的语言来表示。正如上文所述,虽然每个进程都在执行相同的代码,但是程序行为却视进程排序而有所不同。并且在进程间需要通信或其它交互的点上,还插入了 MPI 例程。MPI 的第一版上即有超过 120 个例程,最新版本(MPI 2.0)的例程数量更为庞大。但是,大多数程序仅使用 MPI 函数中一个很小的子集。因此,我们只讨论一个程序;一个执行规约并将最终规约结果返回组中各进程的例程。

      int MPI_Reduce(void* sendbuf, void* recvbuf,
      int count, MPI_Datatype datatype, MPI_OP op,
      int root, MPI_COMM comm.)

      此函数采用缓冲“sendbuf”中类型为“datatype”的“count”值,并用“op”操作来累积每个进程的结果,最后将结果置于排序为“root”的进程的“recvbuf”缓冲中。借此,MPI_Datatype 和 MPI_OP 就可直观地获得期望的数值,如“MPI_DOUBLE”或“MPI_SUM”。

      此外,借助MPI 广播讯息(MPI_Bcast)中的其它常用例程,还可定义“barrier”同步点(MPI_Barrier)、发送讯息(MPI_Send)或接收讯息(MPI_Recv)。您可以通过在线方式,或在 [mpi] 及 [mattson05] 中了解有关 MPI 的更多详情。

      MPI π 程序

      MPI π 程序是对最初串行代码进行的直接修改。为了简便起见,我们将继续在程序本身中设定步骤数量,而不是输入数值然后广播其它进程。

      程序以 MPI include 文件开始,以定义 MPI 中的数据类型、常量以及各种例程。在此之后,我们添置了标准的 3 个例程,以初始化 MPI 环境并将基本参数(进程的数量和排序)用于程序中。

      #include <mpi.h>

      static long num_steps = 100000;

      void main (int argc, char *argv[])

      {

                       int i, my_id, numprocs;

           double x, pi, step, sum = 0.0 ;

                       step = 1.0/(double) num_steps ;

                         MPI_Init(&argc, &argv) ;

                       MPI_Comm_Rank(MPI_COMM_WORLD, &my_id) ;

                       MPI_Comm_Size(MPI_COMM_WORLD, &numprocs) ;

                       my_steps = num_steps/numprocs ;

                       for (i=my_id; i<num_steps; i+numprocs)

                       {

                                        x = (i+0.5)*step;

                                        sum += 4.0/(1.0+x*x);

                       }

                       sum *= step ;

                       MPI_Reduce(&sum, &pi, 1, MPI_DOUBLE, MPI_SUM, 0,

                                         MPI_COMM_WORLD) ;

           MPI_Finalize(ierr);

       

      }

      最后,我们利用一种常用技巧将进程集合中的循环迭代进行划分。请注意,这里的循环极限已经改变,它从运行每个进程的 ID,变为了随着组中进程数量而递增的迭代数量。这是由于 MPI 中被定义的排序用作了 ID,并且排序数量可以从 0 一直到进程数量减去 1。本质上,这种简单的转换是以循环方式将循环迭代加以分配,就像我们将一副纸牌分配到不同进程中一样。

      每个进程完成后,部分总和会把得到的部分结果纳入变量“sum”中,这种规约主要包含在以下调用中:

       MPI_Reduce(&sum, &pi, 1, MPI_DOUBLE, MPI_SUM, 0,
      MPI_COMM_WORLD) ;

      相比我们上文所讨论的 MPI_Reduce 定义,这里每个参数的意义应该更加清晰。我们正在使用的部分和中,“sum”作为发送缓冲,变量“pi”作为接收缓冲。根据 MPI_Reduce 例程的第六个参数,这一数值将到达排序为“0”的进程中。“发送缓冲”包含一个带有附加累积操作(即 MPI_SUM)的 MPI_DOUBLE类型数值。最后,涉及到这一规约操作的进程会使用通信子 MPI_COMM_WORLD进行运作。

      Java 线程概述

      Java 语言在设计之初便内置了多线程支持。作为Java 技术的一个重要组成部分,线程在语言(语法)级别和 Java 虚拟机,以及类别库(class library)级别上均能够得到支持。Java 线程与 POSIX pthread有很多相似之处。Java 类别库提供的线程类别可以支持丰富的方法集,用以启动、运行或停止线程,并检查线程的状态。

      Java 的线程支持包括一套复杂的基于监控和条件变量的同步原语。在语言级别上,类别库或声明为同步的代码块中的方法并不同时运行。这种方法或模块在监控器的控制下运行,有助于确保在这些方法或模块中存取的数据能够始终处于一致状态。所有的 Java 对象都有自己的监控器,通常在第一次使用时由 JVM 展示并激活。监控器的作用非常类似于 pthread 中定义的条件变量对和 mutex。但是与 for pthread 不同的是,Java 线程处于等待状态时可能被打断,例如当它等待事件通知或在 I/O 调用过程中被拦截时就时常会发生这种情况。

      在这一简单的范例中,我们展示了如何借助“简单”Java 线程编写并行版 π 程序:

      public class PI1 {

                       static long num_steps = 100000;

                       static double step;

                       static double sum = 0.0;

                       static int part_step;

       

      static class PITask extends Thread {

                                        int part_number;

                                        double x = 0.0;

                                        double sum = 0.0;

                                        public PITask(int part_number) {

                                                         this.part_number = part_number;

                                        }

                                        public void run() {

                                                         for (int i = part_number; i < num_steps; i += part_step) {

                                                                          x = (i + 0.5) * step;

                                                                          sum += 4.0 / (1.0 + x * x);

                                                         }

                                        }

       

                       }

                       public static void main(String[] args) {

                                        int i;

                                        double pi;

                                        step = 1.0 / (double) num_steps;

                                        part_step = Runtime.getRuntime().availableProcessors();

                                        PITask[] part_sums = new PITask[part_step];

                                        for (i = 0; i < part_step; i++) {

                                                         (part_sums[i] = new PITask(i)).start();

                                        }

                                        for (i = 0; i < part_step; i++) {

                                                         try {

                                                                          part_sums[i].join();

                                                         } catch (InterruptedException e) {

                                                         }

                                                         sum += part_sums[i].sum;

                                        }

                                        pi = step * sum;

                                        System.out.println(pi);

                       }

      }

      在 Java 中启动全新线程时,我们通常会将 Thread 类细分,并定义一个定制的 run() 方法,以保证主要工作能够并行完成。在我们的范例中,此项工作可在 PITask 类的 run() 方法中实施。出于性能原因,整个积分范围被分为 part_step 片断,这些片段的数量等于可用处理器的数量。PITask 对象通过 part_number(代表积分范围中的一个片断)实现参数化;这样,run() 的主体就在选定的积分附属范围内计算部分和。当调用 start() 方法时,实际的线程同时开始启动并并发执行。我们可在面向所有附属范围的循环中进行此项工作。然后,我们运行第二个循环,通过调用其 join() 方法,等待每条衍生线程 (spawned thread) 的完成,并接着对每条线程得出的结果进行总结。在本例中,每个积分范围都明确地映射到一条单独的 Java 线程中。

      本例为我们明确创建了 Java 线程,因而,我们不得不将积分范围分成多个部分,以便在线程之间手动进行工作分区。也许人们认为这样做非常繁琐,但是如果不用这种方法,而去创建与积分范围中的步骤数量相同的线程,那么我们将会发现程序的表现实在让人无法接受。这是因为通常情况下,创建 Java 线程是一项非常昂贵的工程。

      上文中所提到的“简单”Java 线程只是 Java 多线程支持的最低级别;还有很多更高级别的线程库,旨在增强 Java 多线程功能性的基本水平,并为一些常用任务增添解决方案。从 Java 标准 1.5起便开始提供的 java.util.concurrent 程序包是一个值得我们注意的范例。该程序包包括针对基本 Java 线程的诸多增强特性,如线程池支持、atomic 变量,以及复杂的同步原语等。但是,util.concurrent 程序包的一些片断不符合 J2SE 标准,因而它仍旧只能作为独立程序库使用(称为 EDU.oswego.cs.dl.util.concurrent)。在此之中,最重要的遗失部分就是 FJTask 框架,它针对Java采用了一种 fork-join 并行概念,旨在对定积分或矩阵乘法运算等计算密集型计算实现并行处理。FJTask 是对 Thread简单的直接模拟。它通常是指“基于任务的”并行,而不是“基于线程的”并行。FJTasks 往往在同一个 Java 线程池上执行。它还支持 Thread 等级中许多最为常见的方法,包括 start()、yield() 和 join()。

      FJTask 不支持优先控制(priority control)等一些 Java 线程方法。因而,它的主要经济优势就在于它不支持任何类型的拦截操作。没有任何因素能够阻止 FJTask 中的拦截,并且极其短暂的等待/拦截也能执行得非常好。FJTask 并非设计用于支持任意同步,因为一旦开始执行,就没有任何方式能够暂挂和恢复独立任务的执行。在持续运行期间,FJTasks 也应该是有限的,而且不应该包含无限循环。FJTask 应顺利地完成运行,不应要求等待或运行阻拦式 IO。因而FJTask 和 Thread 之间存在着很大的成本差距。至少运行于 JVM 上时,FJTask可以在高性能垃圾回收(所有 FJTask 迅速成为垃圾)和良好的本地线程支持下,比 Thread 快 2 至 3 个数量级。

      在以下范例中,我们展示了如何在 FJTask 框架的帮助下编写 PI 程序:

      import EDU.oswego.cs.dl.util.concurrent.FJTask;
      import EDU.oswego.cs.dl.util.concurrent.FJTaskRunnerGroup;

       

      public class PI2 {

                       static int num_steps = 100000;

                       static double step;

                       static double sum = 0.0;

                       static int part_step;

                       static class PITask extends FJTask {

                                        int i = 0;

                                        double sum = 0.0;

                                        public PITask(int i) {

                                                         this.i = i;

                                        }

                                        public void run() {

                                                         double x = (i + 0.5) * step;

                                                         sum += 4.0 / (1.0 + x * x);

                                        }

                       }

       

                       public static void main(String[] args) {

                                        int i;

                                        double pi;

                                        step = 1.0 / (double) num_steps;

                                        try {

                                                         FJTaskRunnerGroup g = new FJTaskRunnerGroup(Runtime.getRuntime()

                                                                                           .availableProcessors());

                                                         PITask[] tasks = new PITask[num_steps];

                                                         for (i = 0; i < num_steps; i++) {

                                                                          tasks[i] = new PITask(i);

                                                         }

                                                         g.invoke(new FJTask.Par(tasks));

                                                         for (i = 0; i < num_steps; i++) {

                                                                          sum += tasks[i].sum;

                                                         }

                                                         pi = step * sum;

                                                         System.out.println(pi);

                                                         System.out.println(Math.PI);

                                        } catch (InterruptedException ie) {

                                        }

                       }

      }

      首先,与上一范例中的做法类似,我们为 PITask 类设立一个 run() 方法。但是这样,PITask 仅会计算出对应 i-th 步骤的单一值 x,而不是积分附属范围的部分和。随后,我们创建了 PITask 对象阵列,使用 FJTask.Par 对象进行打包,并通过调用 FJTaskRunnerGroup 对象上的 invoke() 加以执行。使用 FJtask.Par 对象进行打包,可指导框架并行执行线程池上的基本任务阵列(我们已将该线程池的线程数量设置为处理器的数量)。此范例中的 invoke() 方法必须等到完成阵列中的所有任务时才可使用。这就使得我们能够通过每个具体任务中所得出的独立和数值,来立即计算出总和。

      请注意:本 Java π 程序小修订版不会明确创建任何线程,也不会在线程与任务之间划分任何的工作分区。然而,大家可能已注意到,即使与上文我们在线程之间进行明确工作分区的范例相比,它的执行情况仍然非常好。这是因为所有全新 FJtask 的创建与异步执行几乎都能像调用一种方法那样快速。但是,为了获得最佳性能,我们仍然建议您为每个 FJTask 对象适当分配大量工作,以确保这些对象数量的可管理性。这将有助于减少 JVM 内垃圾收集器(garbage collector)的压力。

      选择并行编程符号

      在本文中,我们已经谈及了众多并行编程的常用符号。文中使用的程序非常简单----甚至可能过于简单了。但是,我们希望您能从如此简单的举例中很好地了解所有的并行编程符号。

      这些并行编程符号在复杂性、变更时需要的原始串行程序数量、以及共同使用时可能发生的错误等方面各不相同。鉴于您所倾向使用的并行算法类型的特性,建议您将所有这些因素都考虑在内。此外,您还需考虑:

      可移植性:您需要支持哪些平台?MPI 如此流行的原因之一就是它在哪里都能够运行。但是如果您只计划支持具有共享地址空间的硬件,那么基于线程的符号也许更加合适。

      性能:可管理的运行时和高级运行时环境大大减轻了程序员的负担。由于创建和维护软件需要较高成本,因此这些优势对您来说非常重要。但是这些优势也是需要成本的。由于低级 API (如 windows 线程、Pthreads 或 MPI)中的硬件直接面向程序员,所以需要更细致的优化。如果所有可用的内核都需要扩充,那么这样的优化就非常重要。

      串行与并行产品发布:软件拥有较长的使用周期。成功的软件开发人员所支持的产品都会拥有较长的使用期限。因此,将软件的串行和并行版本保存在一个源代码树中就会显得十分重要。如果并行编程符号需要对软件进行大量改写以支持并行,那么这就很难做到。

      熟悉程度:学习一门新的语言是非常困难的。此外,当多位开发人员学习一门不熟悉的语言时,成本也可能会非常昂贵。因此,如果并行符号是一种熟悉的串行语言的扩展,意义就会非常重大。

      测试:软件产品必须进行广泛的测试。在专业开发环境中,测试的成本很容易在最初便超过创建软件的成本。这就是递增策略在并行编程(通常使用 OpenMP)中的优势所在。借助递增并行,每当添加一个结构时,开发人员便可测试结果,并确保结果仍然与最初的串行代码保持一致。

    • [omp] OpenMP 应用编程接口 2.5 版,www.openmp.org ,2005 年
    • [Mattson05] Timothy G. Mattson、Beverly A. Sanders、Berna L. Massingill,《并行编程模式》,Addison Wesley 出版社,2005 年
    • [mpi] William Gropp、Ewing Lusk、Anthony Skjellum,“使用 MPI”,麻省理工学院出版社,1994 年
    • [JLS] Java 语言规范,http://java.sun.com/docs/books/jls 
    • [JVMS] Java 虚拟机规范,http://java.sun.com/docs/books/jvms/ 
    • [JavaAPI] java.lang.Thread 规范,http://java.sun.com/javase/6/docs/api/java/lang/Thread.html 
    • [JSR166] Doug Lea 的 util.concurrent Fork-Join 任务框架,http://gee.oswego.edu/dl/classes/EDU/oswego/cs/dl/util/concurrent/FJTask.html 
    • Tim Mattson 是一位并行程序员。在过去 20 年中,他曾利用并行计算机来制造化学反应、重新组合蛋白质、寻找石油、分析基因,以及解决众多其它科学问题。Tim 还决心在当前应用编程人员大都编写并行软件之时,开发一种比较少见的串行软件。多年来,他始终坚信寻找正确的并行编程环境是解决问题的关键所在。他尝试了无数种并行编程环境,并自行创建了一些新的环境(包括 OpenMP)。当这种方法被证实并没有他所期望的那样有效时,他迅速转换方式,并决定在人们被语言和软件工具困扰之前,帮助我们意识到需要了解专业程序员对并行编程的思考方式。为了解决这个问题,Tim 花了五年多的时间,与他人合作,共同为并行编程开发设计模式语言(《并行编程模式》,Addison Wesley 出版社,2004 年)。Tim 目前效力于英特尔,并在英特尔企业技术事业部的应用研究实验室中继续进行着并行应用编程问题的研究。

      Andrey Y Chernyshev 是英特尔公司企业解决方案软件部门的一名软件工程师。他目前在俄罗斯工作,联系方式为:andrey.y.chernyshev@intel.com

      http://www.rsinc.com/idl/ 美国RSI公司的旗帜产品IDL(InteractiveDataLanguage),交互式数据语言是进行数据分析、可视化表达与跨平台应用开发的理想工具。作为语法简单的第四代计算机语言,IDL面向矩阵、拥有丰富的分析工具包,采用高速的图形显示技术,是集可视化、交互分析、大型商业开发为一体的高级开发环境,让您的科学研究和商用开发真正做到快捷高效。 RSI公司在向用户提供完善的数据分析和可视化软件、以及根据用户需求定制应。IDL用户涵盖NASA、ESA、NOAA、Siemens、GEMedical、ArmyCorpsofEngineers、MacDonaldDettwiler等大公司及研究机构。从辅助Hubble空间望远镜进行宇宙起源探察到帮助保时捷公司的工程师进行世界顶级汽车的设计,IDL还参与了2004年火星探测计划的测试和传感器设计,JPL的科学家利用IDL对“勇气号”和“机遇号”的数据进行数据分析和图像处理。目前,IDL已经广泛应用到海洋学、气象学、医学、空间物理、地球科学、教育、天文学和商业等各个研究领域。世界上数十万的科学家、研究人员、工程师、管理者和商务人员依靠IDL加快探索进程,发布科研成果和进行软件的快速开发。 IDL最初的设计理念就旨在为使用者节省时间。IDL支持各种格式数据源、各种类型和大小的数据,使您可以将精力集中在工作上,而无需过多考虑如何处理数据。IDL能高效处理海量多维数据的能力,更加速了您的分析和研究工作的进程。某些工具如iTools(IDLIntelligentToolsTM),为您的数据处理提供了直接的、交互式的数据分析和可视化环境,使您远离编写代码的烦恼。 IDL的卓越之处在为通过内建的大量数据可视化和分析函数及成熟完备的的开发环境,使科研用户和商业开发人员用最少的时间和资源实现预定开发目标。IDL应用程序具有跨平台性,您的一次性开发成果可以被应用到多种操作系统的计算环境当中(Windows/Linux/UNIX/Mac),保障了硬件资源和软件成果的充分利用。IDL还可以与其他先进技术,如COM和JAVA,实现嵌套应用。 IDL提供了包括创建、修改、编译、调试和工程发布等功能在内的理想开发环境IDLDE。同时提供整套控件化GUI工具包,可按照符合编程人员习惯的方式快速进行程序界面设计。 IDL的开发环境 IDLDE是用户进行快速IDL代码编辑、编译、调试、运行和发布的集成开发环境,用户可以在该环境中采用命令行或编程两种方式进行方便灵活的科学数据分析和应用开发。 界面系统是一个应用程序成功与否的关键,IDL提供了一整套包含完整GUI控件的跨平台工具包,使用IDLGUIBuilder,您无需熟悉IDL控件编程知识就可以快速地完成程序设计,并以拖放式创建跨平台的图形用户界面。作为IDLDE的重要组成部分,IDLGUIBuilder还可方便地输出工程(project),并生成可执行文件。 灵活的数据输入输出 IDL支持多种数据源、数据格式、数据类型和数据大小,能够处理任何有格式或无格式数据,它还支持通用文本及图像数据(JPEG,GIF,DXF,PNG,TIF等),在NASA、TPT、NOAA等机构中大量使用的HDF、CDF和netCDF等科学数据,及医学扫描设备的标准DICOM格式数据。IDL采用动态的变量形式,您可以灵活掌握数据的精度类型,这样您就不必担心数据占用更多的内存。 从数据中获取有用信息 IDL语言面向矩阵的特性带来了快速分析超大规模数据的能力,它所具有的高级图像处理能力、交互式二维和三维图形技术、面向对象的编程方式、OpenGL图形加速功能、集成数学分析与统计软件包、完善的信号处理和图像处理功能、灵活的数据输入输出方式、跨平台图形用户界面工具包、连接ODBC兼容数据库及多种外部程序连接工具能将对您的数据进行快速展现和分析,即使是从未应用过IDL进行开发的初学者,IDL简单的语法、丰富的数据类型和面向数组的操作过程都能够让他们应用自如。 高效灵活的图形可视化方式 IDL是专为可视化大型而复杂的数据集而设计的语言。从简单的2D绘图和图像显示,到利用OpenGL硬件加速功能进行交互式的3D图形设计,以及利用支持多处理器快速渲染的功能进行体数据显示,您可以轻松地获得丰富的可视化效果。 IDL还提供了两套图形系统——直接图形和对象图形,可根据您的需要灵活选择。 强大的数据分析工具包 IDL具有强大的数据分析能力,IDL带有完善的的数学分析和统计软件包,提供强大的科学计算模型。它的图像处理软件包提供了大量方便的分析工具、地图投影及转换软件包,使您开发GIS易如反掌。 IDL提供了可缩放的TrueType字体,可以注记中文,能将结果存为标准图像格式或PostScript格式,并尽可能地使图像质量最优化。 iTools智能工具包使IDL变得更简单 iTools是针对不同数据类型、集成一系列交互式功能的智能工具包,它包括iContour、iPlot、iImage、iMap、iSurface和iVolume等多种类型,给使用者提供了无需编程便能交互式分析各种数据类型的独立工具包,IDL的使用者可以利用其进行快速简单的数据分析、可视化,生成高质量显示效果的图形等。iTools定制简单,并可嵌入到您可开发的IDL应用程序中。 与其它编程语言整合 通过IDL链接外部程序,或者将IDL作为其他语言的外部程序或图形引擎,IDL可以成为您现有开发工具的强有力补充。IDL开放性的、通用性的、跨平台的计算环境,可以整合您现有的软硬件技术并保护和利用您过去的、现有的和将来的资源。 您可以从IDL调用其它语言编写的程序或算法,也可以从其他语言调用IDL的子程序。IDL既是ActiveX控件,又是ActiveX容器。利用ActiveX技术,您可以将IDL的图形嵌入到VB,VC++等Windows程序中。利用IDL支持JAVA,网络和第三方的功能,您可以从IDL编码访问JAVA对象。您还可以通过动态链接库方式通过IDL调用C和Fortran。 科研人员使用IDL IDL已变得不可缺少,因为它能快速准确的估算和显示出现的近点角。。。采用IDL我们在三年项目进展中减少了超过一年的工作量。 PaulScowen NASA哈勃望远镜修正小组成员 把更多的时间用在科学研究上
    • IDL内建有丰富的算法库,包括已经被验证的图像处理、数学、统计以及分析程序等的运算法则,这些对研究工作的完成起到了推动作用.
    • 通过IDL强大且快速的可视化工具可以查看数据中的隐藏信息.
    • 快速查看结果.IDL是一种基于矩阵的语言,你可以迅速发布单独命令,速度可以与优化的C语言相比.
    • 达到两全其美的效果.IDL方便应用程序的管理和并具有一定的灵活性.
    • IDL可以管理你的数据.IDL支持任意格式、类型和大小的数据,这样你就可以把精力集中在数据挖掘上而不是如何读取. 分享你的工作成果
    • 和使用IDL的你的同行分享代码.IDL可以方便地用于产品在全球范围内的研究与开发.
    • 与全球范围内的任何一个人分享IDL生产的图像、动画、三维VRML场景.
    • 通过ION(IDLOntheNet)分享数据和交互式应用程序. 达到更快的速率
    • 我们提供了全球范围内特定区域的培训,包括在您所在地区进行的定制培训.我们的专业讲师会为您提供专门技术让你提高速率并把精力主要集中在科学研究上.
    • 您可以信赖RSI的技术支持.我们有超过60%的技术支持人员拥有硕士或以上学位,你可以从专业人员那里得到技术支持.在这个行业里,我们的客户满意度是最高的. 工程师使用IDL

      "ActiveX界面允许将IDL无缝结合到我的基于LabVIEW的管理和数据分析系统中去。IDL带来的图形增强功能会随着海量数据的增长而变得重要。” DavidMoor MooreGoodIdeas 美国国家仪器有限公司(NI)合作伙伴 把更多的时间用在科学研究上

    • 在获取数据的过程中利用可视化工具优化你的数据质量.
    • 用IDL进行三维可视化的生成和管理并挖掘隐藏在您的数据中的信息.
    • 通过定制影像处理过程及体积分析将生数据(rawdata)快速转化为有用的成果.
    • 结合LabVIEW和IDL的力量来缩短测试和图形化的时间. 增强已有的IDL应用程序
    • IDL强大的内嵌影像处理、运算、统计和分析程序和应用程序库使你能够快速增强、扩展以及定制LabVIEW分析功能. 分管理海量数据
    • 通过执行作为LabVIEWVI网络的一部分的IDL原代码以On-the-Fly方式处理大批输入数据.
    • 用IDL和LabVIEW来为大型可视化项目管理海量数据,已逐渐成为科学技术分析的一部分. 实现跨平台功能
    • 在Windows系统上,你可以用ActiveX控件建立一个统一的用户指令以实现IDL和LabVIEW之间的无缝结合.
    • 利用IDL和LabVIEW套接字功能,IDL提供了在Windows,UNIX,LINUX和MACOSX系统上可视化分析解决方案.
    • 计算机能够在不同的平台上用LabVIEW获取数据,用IDL实时的显示数据. 开发者使用IDL

      “我用IDL完成工作所需要写的代码比用c或者FORTRAN所写的代码要少20%。” RobertVelthuisan 莫非·李癌症中心(H.LeeMoffittCancerCenter)美国南佛罗里达大学(ResearchInstitute) 节省你的开发时间

    • 对你的应用程序进行快速建模。IDL是解释型语言(InterpretedLanguage),你能在页面上写出独立的命令并立即看到命令运行结果。IDL缩短了设计-编译-运行的周期。
    • IDL程序库包含丰富的关于影像处理、波段运算、统计以及分析的算法,借助这些算法能够快速完成你的应用程序。
    • 用IDL可快速进行可视化。IDL是一种专为大型复杂数据表进行可视化的语言,IDL为您提供从简单的二维图到OpenGL-accelerated三维图的工具。
    • 为你的终端用户建立理想的界面,利用IDL自带的完整UI工具包以及方便的拖放式GUIbuilder快速实现你的界面设计。
    • 一次写程序,多平台调用.
    • IDL能处理你提供的数据。IDL实际上能读取和写入任何格式、类型以及大小的数据,缩减了你处理输入输出文件的时间。 授权您的用户执行IDL
    • 借助一个更快的解释程序和面向数组的建构方法,IDL在进行数组运算时像优化后的C语言一样运行。
    • 从海量数据库中使用一个文本文件来定制集成程序以便有效的开发程序。借助内嵌的多线程算法,大量的计算能够在多个处理器系统上实现。 享受IDL的灵活性
    • 尽量利用已有代码。从IDL中调用以其他语言写得程序以及程序库,或者从其他语言中把IDL作为一个子程序调用。
    • 结合其他技术。IDL不仅是ActiveX控件也是ActiveX容器。将IDL图形嵌入到VB,VC++以及其他Windows应用程序中去,或者在Windows.上将某些要素例如电子程序表(spreadsheets)嵌入到IDL中去。
    • 通过ION(IDLOntheNet)在网上和别人分享交互式应用的成果,用IDL的分析和图形功能增强client/serverJava应用程序。
    • 轻松的让您的应用程序传遍海内外。我们能满足您的需要。 让我们的技术为您的工作出力
    • 想要尽快掌握IDL?我们提供了遍布全球的各种培训,包括为了您的方便在您的单位进行的培训课程。我们专业的培训讲师能帮您尽快掌握IDL,节省您的时间和金钱。
    • 没有时间或开发者?我们的咨询师可以给你很详细的关于部分或者全部应用程序的开发时间和预算的论述。
    • 你可以信赖RSI的技术支持团队。我们60%的技术支持工程师拥有硕士学位或者更高的学位,所以你可以依靠这些技术人员的支持。我们的顾客满意度在工业领域是最高的。 支持鼠标滚轮,支持中文标签
      下载地址:ftp://ftp.adobe.com/pub/adobe/reader/unix/7x/7.0/enu/AdobeReader_enu-7.0.0-1.i386.rpm
      中文字体设置:
      下载http://linuxfire.dhis.org/~easthero/CMap.tar.gz 解压替换掉/usr/local/Adobe/Acrobat7.0/Resource/CMap目录
      下载http://linuxfire.dhis.org/~easthero/Font.tar.gz 解压替换掉/usr/local/Adobe/Acrobat7.0/Resource/Font目录
      [22:55] [发表评论]
    • 下载 ntfs-3g:
      # wget http://flomertens.keo.in/debian/ntfs-3g/binary-i386/ntfs-3g_20070714-BETA-1_i 386.deb
    • 安装 ntfs-3g:
      # dpkg -i ntfs-3g_20070714-BETA-1_i386.deb
    • 编辑 /etc/fstab(其中 hda1 是 ntfs 分区,设定只允许 root 帐户写):
      /dev/hda1 /mnt/win ntfs-3g silent,umask=0222,iocharset=cp936,locale=zh_CN.GBK 0
    • 添加 fuse 模块:
      # echo fuse >>/etc/modules
      # modprobe fuse
    • 卸载 ntfs 分区:
      # umount /mnt/win
    • 重新挂载 ntfs 分区:
      # mount /mnt/win 解决W: GPG error 升级的时候出现W: GPG error: ftp://debian.ustc.edu.cn unstable Release: The following signatures couldn't be verified because the public key is not available: NO_PUBKEY F1D53D8C4F368D5D
      W: You may want to run apt-get update to correct these problems Merging Available information
      这是由于apt版本不对应造成的,以前用过experience版本,现在降级到unstable,解决办法
      apt-get install apt/unstable [22:55] [发表评论] http://bbs.lasg.ac.cn/cgi-bin/forum/topic.cgi?forum=7&topic=9
      在ultraedit-32中,我们用view菜单下view as(highlighting file type)可选择高亮显示c/c++文件、vb、html、perl、php、java、xml等多种文件的关键字,为编程和阅读带来方便。但软件没有为我们设置fortran语言关键字的高亮显示,十分不便。现在,将以下代码粘贴到ultraedit-32目录下的wordfile.txt文件中,即可高亮显示fortran语言关键字,喜欢用ultraedit-32的可以试试: /L9"Fortran" FORTRAN_LANG File Extensions = FOR FTN F F90 /C1"Keywords" access assign accept backspace block black byte complex complex* character character* close call common complex continue case double dimension data do direct default deleter err end endif enddo else elseif endfile entry equivalence external exit file form function format fmt find goto go integer integer* if iostat implicit inquire intrinsic include logical logical* open options parameter pause precision print program public real real* read rec recl return rewind rewrite status save stop subroutine save select then to type unit use unlock write /C2"FORTRAN FUNCTION" abs acos aimag aint alog alog10 amax0 amax1 amin0 amin1 amod anint asin atan atan2 cabs ccos char clog cmplx conjg cos cosh csin csqrt dabs dacos dasin datan datan2 dble dcos dcosh ddim dexp dim dint dlog dlog10 dmax1 dmin1 dmod dnint dprod dreal dsign dsin dsinh dsqrt dtan dtanh float iabs ichar idim idint idnint ifix index int isign len lge lgt lle llt log log10 max max0 max1 min min0 min1 mod sign sin sinh sngl sqrt tan tanh /C3"C/C++ Keywords" case char const catch class const_cast default defined dllexport dllimport enum extern export float for false friend mutable new namespace naked operator private protected public register reinterpret_cast short signed sizeof static struct switch static_cast typedef template this throw true try typeid typename thread union unsigned using uuid void volatile virtual while wchar_t __asm __based __cdecl __declspec __except __far __fastcall __finally __fortran __huge __inline __int16 __int32 __int64 __int8 __interrupt __leave __loadds __near __pascal __saveregs __segment __segname __self __stdcall __try __uuidof __multiple_inheritance __single_inheritance __virtual_inheritance #define #error #include #elif #if #line #else #ifdef #pragma #endif #ifndef #undef 好用的话,就赶紧用吧,不好用的话也不要想打我。(这一行不必粘贴,切切,切切!) [22:55] [发表评论] gtkterm 访问串口设备的终端 gtkterm is a simple GTK+ terminal used to communicate with the serial port.
      Its features :
    • Serial port terminal window
    • Serial port setup (speed, parity, bits, stopbits, flow control)
    • Using the termios API
    • Possible to send a file (only RAW data, no protocol)
    • End of line delay while sending a file
    • Special character wait before next line while sending a file
    • Possible to toggle control lines manually (DTR, CTS)
    • Also reads the state of control lines (RTS, CD, DSR, RI) Author: Julien Schmitt
      Homepage: http://www.jls-info.com/julien/linux/
    • #cd mpich2-1.0.1
    • #export F90=ifort F77=ifort
    • #./configure --prefix=/usr/local/mpich --enable-f90 --enable-f77
    • #make
    • #make install
    • 在/etc/bash_profile中添加:
      • export MPICH=/usr/local/mpich"
      • export PATH=$MPICH/bin:$PATH 个人配置:
      • $echo "secretword=<YouSecretWord>" > ~/.mpd.conf
      • $chmod 600 ~/.mpd.conf #各人用户目录下需要设置这个文件,并设置权限为别人禁止读写,启动mpi程序前要保证mpd已经运行,否则执行mpd & 编译运行:
      • $mpif90 program.f90
      • $mpiexec -np 2 /path/a.out #这里好像需要绝对路径,也许设置一下可以用当前路径 http://news.csdn.net/n/20070118/100777.html
        外电消息,1月16日,Sun表示正计划推出一种称为“Fortress”的全新程序设计语言。
        Sun日前悄悄把原型Fortress"解译器"(interpreter)发布为开放源代码软件。解译器是一种程序设计工具,用来逐行执行Fortress程序。
        Sun希望以Fortress取代50年前在IBM诞生的Fortran程序设计语言。Fortran至今仍活用于高效能计算机运算任务,例如气象预报。   尽管Fortress脱胎自美国国防部的超级计算机赞助计划,但也处理主流的运算问题--更轻易地促使多核处理器内的新型处理器引擎提高性能。
        Sun公司表示,随着多核运算对一般桌面系统的重要性提高,程序设计师必须转用 Fortress这类语言,以便利用硬件性能。
        Fortress试图以智能方法存储数据,以便数据在需要使用时可就近在处理器附近获取。Sun认为,这对由独立服务器通过高速网络组成的大型计算机集群(clusters)而言,尤其有用。
        Sun的Fortress解译器根据开原码BSD授权发布。但正式版Fortress的控制权仍掌握在Sun手中,所以,至少目前外部程序人员必须把他们贡献的程序交由Sun控制。
        Fortress目前只初具雏形。Sun去年9月发布alpha版Fortress语言格式,但尚未拍板定案。而且,解译程序也在初步阶段。
        未来,Sun希望除了打造解译器之外,也打造编译器(compiler),以便事先把软件译成某种计算机能解读的形式。编译软件通常执行速度比解译器快。
        另外,Sun希望将来也推出最佳化的编译器(optimizing compiler),此技术可在软件执行时调整软件的编译版,以便改善效能。 [22:55] [发表评论]

        GNU科学计算函数库GSL(GNU Scientific Library)是一个强大的C/C++数值计算函数库,它是一个自由软件,是GNU项目软件的一个部分,遵循GPL协议。目前GSL的最新版本是1.5,发布于2004年6月25日。

        常见的LINUX发行版一般不带GSL,用户可以下载安装,安装比较简单,只要按照安装说明安装即可。

        函数库提供了大量的数值计算程序,如随机函数、特殊函数和拟合函数等等。整个函数库大约有1000多个函数,几乎涵盖了科学计算的各个方面。以下是整个函数库的目录:

        Complex Numbers
        Roots of Polynomials
        Special Functions
        Vectors and Matrices
        Permutations
        Sorting
        BLAS Support , BLAS(Basic Linear Algebra Subprograms)
        Linear Algebra
        Eigensystems
        Fast Fourier Transforms
        Quadrature
        Random Numbers
        Quasi-Random Sequences
        Random Distributions
        Statistics
        Histograms
        N-Tuples
        Monte Carlo Integration
        Simulated Annealing
        Differential Equations
        Interpolation
        Numerical Differentiation
        Chebyshev Approximation
        Series Acceleration
        Discrete Hankel Transforms
        Root-Finding
        Minimization
        Least-Squares Fitting
        Physical Constants
        IEEE Floating-Point

        GSL主页上有完整的GSL参考手册,里面有详细的函数介绍。参考手册有GSL Reference Manual - HTMLGSL Reference Manual - Gzipped Postscript GNU Scientific Library Reference Manual 。内容都是一样的,电子书有600多页,文档非常详细,书的作者也是这些函数库的开发设计者。涵盖GSL使用的方方面面。

        GSL函数库的设计者都是一些经验丰富的科学家和程序员。它是面向对象设计的,C和C++程序可以非常容易的调用,而且下载的安装源码里包含有所有程序的具体算法,用户可以参考,而且也可以对此提出改进。

        GSL里面还包含完整的数学物理常数,有专门的头文件包含。

        下面举一个简单的例子sample.c:

        #include <stdio .h> #include <gsl /gsl_sf_bessel.h> int main (void) double x = 5.0; double y = gsl_sf_bessel_J0(x); printf ("J0(%g) = %.18en", x, y); return 0;

        gcc sample.c -o sample -lgsl

        运行输出:

        J0(5) = 143382920e-01

        有兴趣的可以详细阅读一下GSL Reference Manual 。 [22:55] [发表评论] Description: filesystem client based on SSH File Transfer Protocol sshfs is a filesystem client based on the SSH File Transfer Protocol. Since most SSH servers already support this protocol it is very easy to set up: i.e. on the server side there's nothing to do. On the client side mounting the filesystem is as easy as logging into the server with ssh.
        sshfs is based on FUSE (userspace filesystem framework for Linux), thus you will have to prepare fuse kernel module to be able to use it.
        Homepage: http://fuse.sourceforge.net/
        Tag: admin::filesystem, interface::shell, role::sw:client, security::cryptography [22:55] [发表评论] 2006.06.14 来自:存储在线
        Network Appliance 公司目前正在推出其功能强大的新型 Data ONTAP GX 操作系统,为采用高性能计算(HPC)应用的用户带来极高的生产效率和空前的灵活性,使NetApp变得更加简便而可靠,这些都是目前市场上其它同类产品无法媲拟的。Data ONTAP GX 是历时两年多战略设计工作的成果,它将SpinOS(被 NetApp 在收购 Spinnaker Networks 时收购)的全球命名空间功能与 Data ONTAP 7G关键的数据管理、性能和高可用性特性结合在一起。
        虽然 Data ONTAP 7G在性能、特性和功能方面都已经能很好地满足 NetApp 企业级用户的需求,能源(地震处理应用)、娱乐(电影内容制作与视觉效果渲染)和电子设计自动化(芯片设计与模拟)领域的高性能计算客户对性能的追求却永无止境。Data ONTAP GX 能够满足这些用户的需求并且通过统一的全球命名空间将多个结点作为一个单一的系统提交给应用程序,在存储结点或层次之间对数据进行透明移动,简化数据检索与管理。通过新的 FAS6070 / FAS3050 系统,HPC 客户可充分发挥Data ONTAP GX 自带的集群文件系统技术的优势,它能够跨越多个结点对个别文件或数据集进行等量划分,实现传统存储系统所无法实现的性能。举例来说,Data ONTAP GX 与新的 FAS6070 结合之后,性能可提升至6PB,实现行业内前所未有的每秒100万次以上基于 SPEC SFS 基准的运算。
        索尼图形图像运作公司研发部高级系统工程师 Steve Kowalski 表示,作为Data ONTAP GX β版的测试者,我们对其性能和稳定性印象非常深刻,我们在图像领域的技术是企业基础架构与高性能计算的结晶。Data ONTAP GX from NetApp 目前实现了很高的性能,我们希望通过 Data ONTAP GX 能够实现企业所需的特色。
        Industrial Light & Magic
        公司高级系统工程师 Michael Thompson 表示,“NetApp 并没有要求我牺牲管理的方便性和系统的可靠性来换取大规模的向外扩展与性能提升,Data ONTAP GX 留给人们的印象非常深刻,其数据吞吐量非常大,单个全球命名空间可扩展至数百万兆字节,无需客户端软件,数据在控制器和/或存储层之间的移动非常方便。所有这些使我最终相信它的确是目前最好的 HPC 存储解决方案。

        IDC 公司 HPC 研究主管 Addison Snell表示,很明显,性能对 HPC 来说是一个重要标准,但不是唯一标准,HPC 客户将管理的方便性、可扩展性和数据保护功能看成是采购决策中的关键因素。存储供应商从更广的方面了解 HPC 客户的需求,发现自己能够更加轻松地解决客户所有的这些担心。

        Data ONTAP GX 与同类竞争者之间的主要区别如下:

        • 性能突破。Data ONTAP GX 具有无限的线性扩展能力。最近的一项 SPEC SFS 测试证明其每秒计算能力在 100万次以上,较排名第二的竞争对手要快3倍以上。

        • 线性扩展能力。从小到大各种规模的模块化扩展能力,可以灵活地选择对某些卷进行等量划分,在单个文件上实现大规模吞吐。

        • 简洁又方便的管理。系统可以在单一全球命名空间下扩展至数百万兆字节。无需客户端软件,而且可以在控制器和存储层与应用程序之间方便而透明地移动数据。

        • 高可靠性。NetApp WAFL文件系统是 Data ONTAP GX 的核心并且经过全球60,000多套实际安装的检验。RAID-DP具有对多个并发磁盘故障的容错能力,而且 Data ONTAP GX 系统没有单点故障。

        NetApp产品及合作伙伴副总裁Patrick Rogers 表示,直到现在,存储解决方案对 HPC 客户仍然存在很大的计算集群制约,通过Data ONTAP GXNetApp 能够让 HPC 客户充分发挥其 Linux 计算集群的价值,在进一步简化 HPC 管理环境的同时提高其性能。

        Data ONTAP GX目前可立即向 HPC 环境下的用户供货。定价可以向 NetApp 销售和销售合作伙伴索取。

        [22:55] [发表评论] src2tex 源代码变为TeX代码 A converter from source program files to TeX format files src2tex [resp. src2latex] is a sort of text converter from BASIC, C, C++, OBJECTIVE-C, COBOL, FORTRAN, HTML, JAVA, LISP, MAKE, PASCAL, PERL, SCHEME, SHELL, TCL/TK and ASIR, MACSYMA, MAPLE, MATHEMATICA, MATLAB, MAXIMA, MuPAD, OCTAVE, REDUCE to TeX [resp. LaTeX]. However, it is not a simple pretty-printer; actually, it is designed to fulfill the following desires:

      • We want to write mathematical formulae in comment area of source program.
      • We would like to patch PS or EPS figures upon source program.
      • We need a simple and easy-to-use tool which enables to combine documentation and manual with source program.
      • We often have to translate our program from text format to TeX format when we want to quote our own program in research report, lecture note, etc. That is quite time consuming, so it should be automated. 数据包转发采用LVS-DR方式,也就是说客户端的请求通过director转发给相应的
        real server处理之后,请求的结果将由real server直接返回给客户,而不需要再
        通过director,这种方式的吞吐量相对于LVS-NAT方式较高。
        下面,将介绍director及real server上需要安装的软件以及相关设置:
        在director上:
        1、启动ip转发功能。在/etc/sysctl.conf中添加一行net.ipv4.ip_forward=1(在2.6.5内核中该行已经存在,但默认情况下为0,因此只需要将其改为1即可),然后运行sysctl -p使其生效。
        2、配置LVS
        ipvsadm -A -t 192.168.16.100:80
        ipvsadm -a -t 192.168.16.100:80 -r 192.168.16.11:80 -g
        ipvsadm -a -t 192.168.16.100:80 -r 192.168.16.22:80 -g
        3、配置ldirectord.cf,它是用于监控后台的real server状态的,能够动态的添加和
        删除真实服务器,然后修改LVS核心的虚拟服务表。
        4、配置heartbeat,主要是3个配置文件:authkeys,ha.cf,haresources
        real server上:
        1、启动环回接口上的ip:ifconfig lo:1 192.168.16.100 netmask 255.255.255.255
        2、解决ARP问题:因为DR方式下,director和RS都有一个相同的本地IP地址,而且在同一网段内,这样会带来ARP问题。我们只希望director响应该vip所对应的arp报文。而让其它的RS不进行响应。在2.6.5内核中,已经提供了arp_ignore,arp_announce来解决该问题
        修改/etc/sysctl.conf
        net.ipv4.conf.lo.arp_ignore=1
        net.ipv4.conf.lo.arp_announce=2
        net.ipv4.conf.all.arp_ignore=1
        net.ipv4.conf.all.arp_announce=2 [22:55] [发表评论] http://mlsx.xplore.cn/read.php/270.htm
        [不指定 2006/03/01 16:38 | by mlsx ]

        mozilla的bugzilla网站有一个讨论thunderbird支持中文附件的bug列表,给出了为什么thunderbird1.5后,发出的中文附件基本上不被foxmail,kmail,outlook,outlook express等其他邮件客户端识别。

        原因是这个版本在附件编码的时候遵循了一个较新的RFC2231,这个RFC涉及到了附件名编码时多行编码的处理,但是由于这个RFC比较新,大部分邮件客户端包括outlook并不支持,而大部分的webmail系统同样不支持这个解码,因此导致tb1.5发出的中文名附件到了其他系统或客户端上后变得不可辨识(例如ATT00xxx.xxx这样的)。

        修改mime的编码值,如果是Linux,进入TB后,依次选择:编辑--首先项--高级--配置编辑器 如果是Windows,进入TB后依次选择:工具->选项->高级->配置编辑器。
        在过滤器中写入:
        mail.strictly_mime.parm_folding
        把过滤出来的这行默认值2修改为0,就可以解决这个问题了。

        这次这个改动开来有点曲高和寡了,但是反过来想,如果是微软做这件事情,那也许就是另外一个情况,指不定马上所有的邮件客户端都考虑这个问题,随叫它依然还只是mozilla的产品呢? 当然这天能早点来到。

        [22:55] [发表评论] 学习使用准备毕业答辩幻灯片中,推荐
        http://prosper.sourceforge.net
        Prosper is a LaTeX class for writing transparencies. It is written on top of the seminar class by Timothy Van Zandt. It aims at offering an environment for easily creating slides for both presentations with an overhead projector and a video projector. Slides prepared for a presentation with a computer and a video projector may integrate animation effects, incremental display, and such. [22:55] [发表评论] http://www.sina.com.cn 2007年03月20日 14:58 新浪科技

          新浪科技讯 北京时间3月20日消息,据《纽约时报》报道,Fortran创始人约翰·巴库斯(John W. Backus)上周六在美国俄勒冈州的家中去世,享年82岁。Fortran由巴库斯领导的IBM团队开发完成,是第一门广泛应用的程序语言。从某种意义上讲,Fortran的出现打开了现代计算的大门。

          巴库斯的女儿卡伦·巴库斯(Karen Backus)公布了父亲去世的消息。著名计算机历史学家简·李(J.A.N. Lee)表示,1957年发布的Fortran堪称是软件行业的转折点,就像微处理器对硬件行业一样重要。Fortran改变了人机通信的方式,使得程序语言更容易被用户理解和接受。因此,Fortran一直被认为是首款大获成功的高级语言。

          上世纪50年代,巴库斯领导一个年轻的团队开发出了一门新型程序语言。从表面看来,它就像是英语速记和代数的结合。事实上,Fortran就是公式转换器(Formula Translator)的简称,同工程师及科学家日常使用的代数公式有很多相似之处。经过一段时间培训,他们就可以十分轻松地将科学和工程问题转化为计算机能够“理解”的语言。Unix 操作系统开发者之一的肯·汤普森(Ken Thompson)几年前表示,如果没有Fortran,早期阶段将有95%的程序员无法正常工作。

          另一方面,Fortran的效率非常高,大大缩小了程序开发人员之间的水平差距,这在Fortran出现之前几乎无法想象。Fortran的高效率主要源于编译器的设计,它可以准确地“捕捉”开发人员的意图,并将其转化为计算机可以处理的方式。在Fortran项目中,巴库斯解决了两个基本问题:如何让程序语言更容易被用户掌握,以及如何构造底层代码。在整个工作生涯中,他一直在积极应对这两大挑战。IBM退休研究员弗朗西斯·阿伦 (rances Allen)表示:“巴库斯做出了巨大的贡献,影响了很多人的工作,包括我在内。”

          早在青少年时期,巴库斯就是一个特立独行的人。他出生在特拉华州一个富裕的家庭,父亲是一名 股票经纪人。但是,他同家人的关系并不好,而且还是一名任性的学生。从弗吉尼亚大学退学后,巴库斯于1943年应征入伍。但由于在军队能力测试中表现优异,他被派遣到三所大学学习,内容包括工程和医学。 二战结束后,巴库斯对数学产生了浓厚的兴趣,并于1950年获得了哥伦比亚大学硕士学位。最终,他成为了IBM的一员。(马丁) [22:55] [发表评论] 一个用knoppix改的,直接在windows下面运行的debian ,绝对绿色,只50M大小。 w5676:http://www.linuxsir.org/bbs/showthread.php?t=195148
        本软件包专门是为那些想尝试一下linux,但却不方便安装linux的朋友使用。本软件包不需要安装绝对绿色只要解压后,运行linux.bat这个文件就可以了。qume是一个虚拟机软件。
        下载地址: http://cyber.86bb.com/soft/linux-tr127.zip
        dsl.iso是一个极其精减但又不缺乏应用的linux livecd映像(damn small linux)。尽管这个操作系统软件包很小不能体现出linux操作系统极其强大的功能,但麻雀虽小五脏俱全,它是一个完整的操作系统。这也恰恰体现出在linux高效的特性,也绝对能让习惯windows的用户尝一下鲜。
        hiweed:作者没有讲清楚,其实他就是把 Damn Small Linux拿过来了。 [22:55] [发表评论] http://www.chedong.com/blog/archives/001121.html

        mindmap:思维导图。是去年学到的一种整理思路的方法:将思路按照树状的结构进行线索的清理。FreeMind就是一个专门用于画mindmap的一个免费的桌面画图工具。

        下载:FreeMind是用Java写成的,需要有Java 1.4 也有Windows下的安装工具。
        http://sourceforge.net/project/showfiles.php?group_id=7118

        使用:个人感觉FreeMind的几个优点
        0 开源,免费,程序速度快;
        1 画思路图最重要的一点就是随心所欲,而FreeMind的操作:包括节点的创建等大部分操作可以通过键盘操作,可以在思路不受任何干扰的情况下进行节点的扩展操作;
        2 而完成后的思路树整理,也可以通过节点的托拽进行;
        3 新版的增加了 undo 和各种图标操作;

        更新:2月18日 被Solidot了一把;

        以下是SF对FreeMind开发人员采访的:部分摘录
        Why do you think your project has been so well received? 项目为什么成功

        Juan: It is easy to use, intuitive, and powerful.

        Dan: It fills an important gap, and in doing so, it has or at least had virtually no free or open source competition. Though it's multi-platform by means of Java, it is fast.

        Christian: The usability is the most important goal of our software. FreeMind is intuitive to use and can be controlled nearly entirely by the keyboard. Thus, you can enter your thoughts quickly and then concentrate on the map itself. But for the times that the ideas slow down, there are enough little features to discover or to play with.

        可用性是软件的关键,FreeMind初衷是完全通过键盘操作,这样你旧可以快速思考并完全关注在思路图本身上。但现在这个原则已经弱化一些,这样有很多更新奇的功能可以使用。

        Where do you see your project going? 项目的发展方向

        Dan: I imagine the project going toward an office suite, as strange as it may seem. But that does not prevent addition of features in the mind-mapping direction, like library of graphics or more visual aids.

        Christian: My main goal is the usability. As Eclipse is the master of usability, I'd like to introduce more of its spirit into FreeMind.
        我的目标是可用性,向Eclipse学习

        What's on your project wish list? 项目的需求

        Dan: FreeMind's wish list includes pasting of Rich Text Format into FreeMind, WYSIWYG editing of rich text including mathematical formulas, export to and import from more formats including presentation software like Microsoft PowerPoint and OpenOffice.org Impress, more searching options, and inclusion of bitmap images directly in mind maps (currently, images are linked only).
        可视化的编辑器:可以编辑公式之类的,可以轻松的导入/导出到PowerPoint或者OpenOffice里,更多的搜索选项,直接包含图片,目前图片只能通过链接方式。

        Cristian: My wish list contains scripting plus spreadsheet functionality and a good collaboration mode. But FreeMind has to remain easy and fast.
        我的目标是增加幻灯片模式和更好的协同写作模式,FreeMind仍保持短小/快速。

        Juan: More expressiveness (types of links, clouds, backgrounds, etc.), new icons, and better interaction.
        What are you most proud of? 项目最自豪的一面

        Dan: I'm most proud of the simplicity and elegance of the user interface. I am also proud to hear that the software has changed people's lives. It has changed my life for sure.

        Juan: The software is easy to use.
        Christian: My recent developments: undo and the plugin mechanisms, both via Design Patterns.
        设计模式中学习到的“取消”和插件模式。

        How do you coordinate the project? 如何协同开发

        Our team consists of only a few people, so everybody knows what to do. We do not assign bugs. We use email and the main open discussion forum, and patches.

        Do you work on the project full-time, or do you have another job? 花多少时间在项目上

        We all work on it part-time.

        If you work on the project part-time, how much time would you say you spend, per week, on it?

        It varies between two or three to 12 to 20, depending on the week.

        What is your development environment like? 开发环境

        Christian: Mainly I develop using Debian Etch under x86 with Eclipse. On the road, I use my Powerbook running Mac OS X 10.3.

        Dan: I run Microsoft Windows 98 and XP, using the standard Java compiler, no debugger, and XEmacs for source code editing.

        Dimitri: 866MHz Intel Pentium III, 512MB RAM, Windows 2000, Eclipse 3.0, Java SDK 1.4.2 and 1.5.0, YourKit Java Profiler 4.0.1.

        Juan: Eclipse with MTASC, Flashout, and ASDT.

        Eclipse :)
        Milestones: 里程碑

        * 0.8.0 (2005-09-06)
        * 0.7.1 (2004-02-15)
        * 0.6.1 (2003-02-08)
        * 0.5 (2002-08-24)
        * 0.4 (2001-07-06)

        Future Plans

        * Add custom attributes
        * Add filtering of nodes based on icons, texts, and values of custom attributes
        * Add WYSIWYG HTML editing of long text nodes by means of Kafenio Java editor
        * Add custom icons

        How can others contribute?

        Others can contribute suggestions and visual ideas. We need help testing the applications and reporting the results to the forums. We urgently need more documentation: tutorials and manuals. We can also use a Flash introduction, and patches that implement functions requested in Requests for Enhancements. Java developers are invited to discuss their enhancements in our Open Discussion forum. Anyone wanting to help in development is welcome.

        [22:55] [发表评论] 安装后打开/usr/share/bookmarks/bookmarks.html即可 This package is a large collection of web links (more than 1,400), and shall constantly be updated and improved with your help. The German link collection for example is already very complete.

        The numerous links are most useful to everybody, but of course especially for newbies to find their way to the vast Internet resources. Although this bookmark collection lists all kind of resources (e.g. search engines, links to online dictionaries, etc.), the majority of them are still computer and Linux oriented.

        This package also includes the Perl script bookmarks-convert that can convert different bookmark formats (netscape, lynx, html). [22:55] [发表评论] sdcv 命令行的stardict sdcv is simple, cross-platform text-base utility for work with dictionaries in StarDict's format.
        Homepage: http://sdcv.sourceforge.net/ [22:55] [发表评论]
      • HP-UX:B.11.23 U ia64 0368872039
      • f90:HP F90 v2.8
      • cc:HP aC++/ANSI C B3910B A.05.52 [Sep 05 2003] 因为安装脚本首先找gcc以及g++等,需要按照下面方式安装:
        CC='cc +DD64' CXX='aCC +DD64' F9X='f90 +DD64 +noppu' ./configure --enable-fortran --enable-cxx --enable-hdf5v1_2

        如果不加+noppu,则出现类似ld: Unsatisfied symbol "h5sset_extent_none_c_"错误,其原因在于cc -c时编译后函数接口名(比如h5sset_extent_none_c)没有添加_,但在f90编译的时候寻找的是添加_的函数接口,因此需要在cc或f90编译的时候添加编译参数解决。

        查资料显示cc添加-Dextname会使得自动对每个函数接口添加_,但实际上没成功

        man f90: +[no]ppu Postpend [do not postpend] underscores at the end of definitions of and references to externally visible symbols (+ppu). The default is +noppu for PA-RISC 32-bit object files and +ppu for PA-RISC 64-bit object files. The default is +ppu for Itanium(R) processor family architecture 32-bit and 64-bit object files. A simple jotter (outline processor) for X11/gtk-gnome
        gjots2 is a fairly simple jotter (outline processor) application for your desktop.
        You can use gjots2 to organize your jottings into a tree structure, adding thoughts and miscellany as you go. You can get it to spit out HTML, XML, postscript, pdf, man etc etc if you want (see the online manual for an example of the HTML conversion).
        I use it for all my notes on Unix, my personal bits and pieces, recipes and even PINs and passwords (encrypted with ccrypt(1), openssl(1) or gpg(1)). I also use it to write DOCBOOK XML documents.
        You can use it to "mind-map" your compositions - write down all your thoughts and then start organizing them into a tree. By manipulating the tree you can easily reorder your thoughts and structure them appropriately.
        It's a bit like the KDE program kjots but it uses the GTK-2 library.
        Homepage: http://bhepple.freeshell.org/gjots/ [22:55] [发表评论] 第一次安装Unix,结果CDE登录不进去:
        the deskdop messsafing system could not start.
        1:choose ok to the login screen
        !2:selecet failsafe session from the login screen's option menu and login
        3:check to see that the desktop is properly installed ,the hostname is correct (/etc/hosts)and that the network is properly configured
        原因是配置默认域名后,将hostname变为hostname.domain.com等,造成ping hostname不通。
        解决办法:
        创建/etc/nsswitch.conf内容为(如果没有则:cp nsswitch.file nsswitch.conf):
        hosts: files [NOTFOUND=continue] dns
        另外还要保证nsswitch.conf普通用户至少有读的权限
        如果还想继续用dns解析,清修改dns服务器的配置:
        编辑/etc/hosts文件,加入你机器的ip,hostname.domain,aliase
        然后执行hosts_to_named -f param
        在执行sig_named restart.
        参见:http://h50069.www5.hp.com/e-Delivery3/Forum/WebUI/Messages/ShowTopic.aspx?RID=b476029e-7251-4abc-a0e8-e0ff652b073d [22:55] [发表评论] http://www.linuxsir.org/bbs/showthread.php?t=237516
        http://rlehy.free.fr/
        http://blog.bs2.to/post/EdwardLee/4321
        给 Ubuntu 的 deb 包在这儿 http://rlehy.free.fr/eqe_1.2.0-1_all.deb
        eqe: Linux LaTeX equation editor
        This is a simple clone of the excellent LaTeX equation editor you can find on MacOS X. There's a zone to type LaTeX input, and it generates an image to represent it (color, font, and size are customisable). You can drag the image to other applications (like OpenOffice Impress, Mozilla, the Gimp). It also exports to any image format ImageMagick supports. It is free software, released under the GPL.
        It is composed of two parts: eqedit, which is a command line tool that generates images from LaTeX input, and eqe which wraps eqedit into a graphical user interface.
        The current version is 1.2.0. Since 1.1.1, the code and documentation have been cleaned, and an ability to customise the LaTeX template eqe/eqedit use has been added. You can consult the current README, FAQ, changelog, TODO, and copyright.
        On the following screenshot, I'm in the process of dragging an equation (with transparent background) to an OpenOffice Impress presentation. [22:55] [发表评论] extract data from scanned graphs
        g3data is used for extracting data from graphs. For example, graphs are typically published in scientific journals without tables of the actual data; g3data makes the process of extracting these data easy. http://www.acclab.helsinki.fi/~frantz/software/g3data.php UNIX 工作站上的数学工具 http://www.ibm.com/developerworks/cn/aix/library/au-unixmath.html?S_TACT=105AGX52&S_CMP=techcsdn
        数学是科学之王

        级别: 中级

        William B. Zimmerly (bill@zimmerly.com), 自由撰稿人和知识工程师, Author

        2007 年 5 月 08 日

        UNIX 有许多工具可供使用,它们可以满足您的数学启蒙要求。其中有些工具是内置的;大多数则是下载保存的。本文将向您展示 UNIX 工作站上通往数学殿堂之路。

        谈到数学,并不缺乏相关的计算机软件包。数学是程序员和分析人员的流行主题,从而导致了大量不同的工具可供选择。

        数学是科学之王。数学工作站的商业使用群体非常庞大:从基础工程到设计创意,从基因治疗到天体导航,数学统治着整个世界。帮助人们解决他们所选领域的数学问题的计算机程序并不缺乏。本文的剩余部分将描述几个商业和开放源代码系统,它们在您所从事的领域可能证明是有价值的。所描述的所有系统都有专用于它们的网页,并包括在本文的参考资料部分。

        数字计算器

        UNIX 工作站中存在的最常用数学工具以计算器和更高级的电子表格程序(如 GNU Calc)的形式出现。算术规则非常简单,所有这些工具都忠实地遵守它们。几乎每个全功能的窗口管理工具包都至少突出体现了一个计算器,有时还有多个版本的计算器。

        GNU 项目还提供了可供下载的计算工具。其中包括 GNU Calc、GNU Plot、ATLAS、Choose 和 4,000 多个其他面向数学的程序。请参见参考资料部分以获得指向完整列表的链接。

        正如您在学校中级课程中所学习到的,数学所涉及的远不只是对数字的简单运算。数字占位符的符号表示形式——诸如 x、y 和 z 等变量、笛卡儿坐标、因素分解原理以及积分和微分世界——是一个丰富和多样性领域的一部分,该领域要求提供同样丰富和多样性的计算机资源。为这些任务而设计的程序领域的最常用名称是“计算机代数系统”(Computer Algebraic Systems,CAS)。同时存在商业和开放源代码 CAS 程序可供使用,下面将描述其中一些最常用程序。

        但是,能够操作符号在大多数情况下还不足够。与原始坐标点值清单所能提供的信息相比,图形可以告诉我们更多信息。可用于计算机代数的大多数系统还突出体现了某种绘图机制,允许您可视化所标绘的数据。

        可以使用许多计算机程序来帮助您解决数字和符号数学问题,但是还有些程序可以帮助您学习数学。MetaMath 系列程序就是一个理想的起点(请参见参考资料部分)。对于初学者或通常认为自己无意从事该领域的读者,本文描述的数学和程序也是引人入胜的。只需下载和试验其中一些程序就可能会激发您成为某方面的专家,从而比任何计算机游戏都更能充实您的生活。

        商业软件包

        下面是一些最常用商业 CAS 系统的简要概述。如果您对其中任何系统感兴趣,可以通过浏览它们的网站来找到更多信息,参考资料部分列出了所有这些网站。

        Derive。Software Warehouse 是创建旨在运行于早期工作站计算机上的数学软件的最早先行者之一。该公司设立于 1979,当时 PC 革命刚起步,计算机代数系统还仅在使用分时终端的大型计算机系统上可用,该公司设计了一款名为 muMATH 的程序,以便 PC 用户能够超越简单的计算器,从而在有限的小型计算机硬件上处理符号数学问题。后来 muMATH 系统停止了使用,并被远远更高级的 Derive 系统所取代。Derive 是使用 Lisp 语言编写的,Lisp 是一种公共编程语言,尤其适合基于规则的处理,该处理是将一个抽象数学表达式变换为另一个表达式所必需的。

        Fermat。这个专有共享软件计算机代数系统是为纪念已故最著名数学家之一 Pierre de Fermat 而命名的。它在各种各样的计算机系统上运行,尤其擅长于涉及任意长度整数和小数、图、矩阵和多项式代数的算术。Fermat 运行得非常快。据该公司的广告宣称,如果您需要计算 Q 上的 400 x 400 矩阵的特征多项式,那么您就需要 Fermat。

        Maple。 Maple 数学软件包由 Waterloo Maple Inc. (Maplesoft) 开发并销售,最初由加拿大安大略省沃特卢的沃特卢大学的 Symbolic Computation Group 于 1981 年创建。Maple 是一款给人印象深刻的软件包,尤其擅长于三维绘图和以课本形式显示数学公式。它在一个动态工具中组合了界面和编程语言,可同时用于数字和符号问题的解答。许多大学已将 Maple 作为教授数学概念的标准工具;该公司提供此软件的学生版和专业版。

        MathCAD。 PTC 是一家工程设施公司,于 2006 年收购了 MathCAD 的股权。MathCAD 在简单性方面与 Maple 类似,具有允许工程师在屏幕上输入和显示各种公式以及图形和文本的界面。MathCAD 组合了一个庞大的功能库,包括微积分、拉普拉斯变换、贝塞尔函数、统计和财务函数。

        Mathematica。 Stephen Wolfram 的公司 Wolfram Research 于 20 世纪 80 年代晚期开发了 Mathematica,并重点强调了该工具的编程方面。它提供了过程式和函数式编程的灵活组合,并引入了自动重新编写公式的非确定性方法。它是一个强大的软件包,带有一个大型的多样性功能库,并提供了解决问题的独特多范例方法。

        Reduce。 Reduce 是另一个通用计算机代数系统,是由许多科学家以协作方式开发完成的。该系统于 20 世纪 60 年代由 Anthony Hearn 创建。Reduce 现已成为科学界许多人的最爱。它以收取成本回收费用的方式进行分发,并且分发版中通常包括源代码。

        开放源代码软件包

        本部分研究开放源代码的世界。下面是一些最常用的开放源代码 CAS 系统的简要概述,这些系统的源代码在常用开放源代码许可证之一下授予许可。如果您对其中任何系统感兴趣,可以通过浏览它们的网站来找到更多信息,参考资料部分列出了所有这些网站。

        Axiom。这个称为 Axiom 的开放源代码计算机代数系统是在修改后的 Berkeley Software Distribution (BSD) 许可证下发布的,它对于探索不同的数学算法非常有用。其突出特性是强类型的数学对象层次结构和对对象进行分组和控制的常用编程数据结构。Axiom 是使用自定义 A# 编程语言来编写的,对于有意探索算法设计的人来说是值得的工具。

        CoCoA。 Computations in Commutative Algebra (CoCoA) 是另一个免费计算机代数系统,用于处理超大型整数、有理数和多项式。它为自定义 C++ 程序提供了有用的数学功能库。

        Dcas。计算机代数领域几乎为数学研究的每个方面提供了丰富多彩的方法。存在许多在程序中表示数学对象的方法,而 Martin Johansen 的 Dcas 系统则证明了这些方法可以如何的千差万别。Dcas 突出体现了一种使用标识作为规则来操作代数表达式的方法。Dcas 非常值得一试;您可能会发现它是处理您所在领域问题的理想方法。

        DoCon。 称作 Haskell 的函数式编程语言展示了一个用于符号数学的程序,名为 DoCon。按照该公司网站(请参见参考资料部分)上的文档,DoCon 实现了线性代数、多项式最大公约数、因素分解、Grobner 基,并支持域上的结构(constructions on domains)——分数、多项式、留数环,等等。它是开放源代码的,可能就是用于您正打算要编写的应用程序的恰当工具。

        Eigenmath。Eigenmath 是由 George 使用 C 语言来编写的,是一个简单易用的计算机代数系统。由于有源代码可用,它成了刚开始探索计算机代数系统的学生的有用工具。

        GiNaC。 GiNaC 与大多数其他计算机代数系统不同,它没有提供用于输入表达式的图形用户界面 (GUI),而是选择让用户以本机 C++(其实现语言)来输入表达式。它使用运算符重载这种本机 C++ 面向对象技术来实现代数语法。在这个由许多陌生名称所主宰的领域,它还具有一个比较陌生的名称!

        Jscience。Jscience 软件包是一个强大的基于 Java的物理和数学函数库,它通过提供单个用于所有开发的体系结构,旨在帮助跨不同科学领域构建协同作用。至少可以这样说,这是个非常崇高的目标,但是也不排除该公司能够实现该目标。

        Macaulay。Macaulay 计算机代数系统对于多项式计算非常有用,并重点强调 Grobner 基计算。它旨在解决具有简单语法并且已描述为代数机器语言 (algebraic machine language) 的问题。

        Magma. Magma 在成本回收许可证下进行分发,是一个旨在解决代数问题的高性能系统。它突出体现了用于群论的功能以及群数据库、用于整数和多项式算术的渐近快速算法和几个用于高级运算的前沿库。

        Mathomatic。此程序没有内置的编程功能,旨在用作简单的符号数学计算器。它可以在任何系统上使用 C 编译器、标准 C 库和 UNIX make 实用程序进行编译。

        Maxima。与大多数计算机代数系统一样,Maxima 是使用 Lisp 语言编写的。Maxima 基于商业软件包 Macsyma,并包括一种完整的 ALGOL 风格的编程语言,对于教授计算机代数方面的编程概念最有用。它提供了任意精度的算术,使得整数和有理数的大小仅受到系统可用内存的限制。

        PARI/GP。PARI 是快速运行的符号函数 C 语言库,用于因素分解、代数数论、椭圆曲线、矩阵和超越函数。GP 是交互式的 Shell,用于提供对 PARI 函数的访问。通过使用 gp2c 编译器,可以为问题域创建快速运行的程序。

        SAGE。Software for Algebra and Geometry Experimentation (SAGE) 是使用 Python 语言编写的,并使用交互式的 Python Shell 作为其用户界面。SAGE 的独特之处在于,它能够用作其他各种计算机代数系统的集成器,从而允许用户利用不同软件包的各自强项。

        SINGULAR。对于交换代数、代数几何和奇点理论,SINGULAR 计算机代数系统在软件包内核以及共享库中提供了大量的算法。它还包括详尽的文档。SINGULAR 是个值得一试的系统,如果您对奇点理论感兴趣则尤其如此。

        Yacas。Yet Another Computer Algebra System (Yacas) 具有漂亮的用户界面和开放源代码软件的所有其他强项。该系统的输入可以是 ASCII 或 OpenMath;该程序还具有批处理模式。

        数学是科学之王,帮助解决您在特定领域所面对的数学问题的工具并不缺乏。无论您是处理保险单定价的保险精算师,还是确定飞向冥王星的宇宙飞船最优路线的天体导航员,都有相关程序可帮助回答您的问题。



        参考资料

        学习
        • 您可以参阅本文在 developerWorks 全球站点上的 英文原文

        • 检查以下数学资源:
            FSF/UNESCO Free Software Directory Axiom 主页 CoCoA 主页 Dcas 主页 Derive 页面 DoCon 主页 Eigenmath 主页 Fermat 主页 Jscience 主页 Macaulay 主页 Magma 主页 Maplesoft Wolfram Research Mathomatic 主页 Maxima 主页 MetaMath 主页 PARI/GP 主页 Reduce 主页 SAGE 主页 SINGULAR 网站 Yacas 主页 http和ftp方式都支持。每天早上7点自动更新
            镜像来源于debian.ustc.edu.cn,只作了i386的镜像。
            http://www.linuxsir.org/bbs/showthread.php?t=186683
            俺们山东也有了,哈哈! [22:55] [发表评论] IDL> help,/device Available Graphics Devices: CGM HP LJ NULL PCL PRINTER PS REGIS TEK X Z Current graphics device: X Segmentation fault IDL> plot,findgen(100) Segmentation fault ati显卡驱动问题,安装fglrx-driver fglrx-control并重新配置xserver-xorg后正常工作 [22:55] [发表评论] 作者:W. Borgert
            翻译:eTony
            转载请注明源于www.linuxsir.org http://www.linuxsir.org/bbs/showthread.php?t=187074 最新版本请见:http://211.92.88.40/~tony/Blog/show.php?id=95

            1. 获取帮助
            man page  或 man bash:
              读取每个命令的联机帮助 或 多数配置文件.
            command  [--help, -h]:
              大多数命令的简要帮助.
            /usr/share/doc/[package-name/]:
              在这里查找所有文档, 以及包含具体选项的 README.Debian 文件
            Web documentation
              参考, 手册, FAQ, HOWTO, 等.  http://www.debian.org/doc/
            http://lists.debian.org 处的邮件列表
              社区通常是非常用于的, 用于用户查询.
            2. 安装
            Installer
            http://www.debian.org/devel/debian-installer/ 处可以找到它的所有信息.
            CD images
              可以从 http://people.debian.org/cdimage/testing/ 处下载
            boot: expert
              例如, 设置DHCP, 或用LILO来代替GRUB
            boot: linux26 或 boot:export26
              安装时使用 2.6 内核
            3. 错误
            http://bugs.debian.org/处的错误跟踪
              有关所有已经存在和修复的错误
            特定软件包
              查看 http://bugs.debian.org/package-name/, 使用 wnpp 查询新的软件包
            reportbug
              使用电子邮件提交一个错误
            Reporting
              在 http://www.debian.org/Bugs/Reporting 处提供教程
            4. 配置
            /etc/
              所有的系统配置文件都在 /etc/ 目录下
            nano files  
              默认的文本编辑器, 也可能是 emacs ,vi, joe
            https://hostname:10000 处的 webmin
              用于系统配置的浏览器接口, 其访问在 /etc/webmin/miniserv.conf 处定义
            http://hostname:631 处的 CUPS
              打印系统的浏览器接口
            dpkg-reconfigure package-name
              重新配置软件包, 例如console-common(键盘), locales(本地化)
            update-alternatives options
              设定默认启动命令
            update-grub
              在安装了新内核以后的操作
            make-kpkg --initrd --version=2:my.1.0 --rootcmd fakeroot --uc --us kernel_image
              当需要定制内核时, 从源码构建一个内核包, 需要安装 kernel-package
            m-a a-i module kernel_image
              创建并安装第三方模块(nvidia...), 需要安装 module-assistant
            5. 守护进程和系统
            /etc/init.d/file restart
              重启一项服务, 系统守护进程
            /etc/init.d/file stop
              停止一项服务, 系统守护进程
            /etc/init.d/file start
              启动一项服务, 系统守护进程
            halt, reboot, poweroff
              停止, 重启, 关闭系统
            /var/log/
              所有的日志文件都在这个目录下
            /etc/default/
              一些守护进程和服务的默认值
            6. 重要的shell命令
            cat files
              在屏幕上显示文件内容
            cd directort
            cp files dest
              复制文件和目录
            echo string
              将字符串回显至屏幕
            gzip, bzip2 [-d]  files
              压缩, 解压 文件
            less files
              显示文件的内容
            ls files
              显示文件列表
            mkdir directory-names
              创建目录
            mv file1 file2
              移动, 重命名文件
            rm files
              删除文件
            rmdir dirs
              删除空目录
            tar [c] [x] [t] [z] [j] -f file.tar [files]
              创建, 解压, 列出归档文件的内容, z,j 是针对 .gz 和 .bz2 的
            find directories expressions
              查找文件, 如 -name name or -size +1000, 等
            grep search-string files
              在文件中, 搜索匹配字符串
            kill [-9] number
              对进程发送信号(例如, 终止它)
            ln -s file link
              为一个文件建立一个符号连接
            ps [options]
              显示当前进程
            su -[username]
              变成另一用户, 如 root
            sudo command
              普通用户以root的身份执行一个命令, 参阅 /etc/sudoers
            command >file
              将命令的输出以覆盖的方式输出到文件
            command >>file
              将命令的输出添加到文件的尾部
            cmd1 |cmd2
              把命令1的输出作为命令2的输入
            command <file
              把文件的内容作为命令的输入
            7. APT
            apt-get update
              从 /etc/apt/source.list 中源的更新软件包列表, 当源的内容改变或不能确定时,运行
            apt-cache search search-string
              查找描述如 search-string 的软件包
            apt-cache policy package-name
              显示软件包的版本和优先级
            apt-cache show package-name
              显示文件的描述信息
            apt-cache showpkg package-name
              显示软件包的依赖关系
            apt-get install package-name
              从源安装软件包及其所有依赖包
            apt-get upgrade
              将当前安装的软件包更新到最新
            apt-get dist-upgrade
               如 apt-get upgrade, 但是自动解决冲突
            apt-get remove package-names
              删除软件包, 及其所有依赖它的包
            apt-cache depends package-names
              列出指定包的所有依赖包
            apt-cache rdepends package-names
              列出依赖于给定包的所有软件包
            apt-file upgrade
              从源更新内容列表, 详见 apt-get upgrade

            apt-file search file-name
              查找包含文件的然件包
            apt-file search package-name
              列出软件包的内容
            auto-apt
              如果需要可以自动安装软件包, 可以替代 apt-file, 需要安装 auto-apt.
            aptitude
              APT 的控制台接口, 需要安装 aptitude
            synaptic
              APT的GUI接口, 需要安装synaptic
            8. DPKG
            dpkg -l [names]
              列出软件包
            dpkg -I pkg.deb
              显示软件包相关信息
            dpkg -c pkg.deb
              列出软件包的内容
            dpkg -S filename
              显示哪个包包含这个文件
            dpkg -i pkg.deb
              安装软件包
            deborphan
              显示没有被依赖(孤儿)的软件包, 需要安装deborphan
            debsums
              审计安装的软件报, 需要安装debsums
            dpkg-divert [option] file
              重写一个软件包的版本
            dpkg --compare-versions v1 gt v2
              比较版本, 用 echo $?  检查
            dpkg-query -W --showformat=format
              查询已安装软件包, 格式 例如'$ $ $\n'.
            dpkg --get-selections <file
              将选择的软件包写入一个文件
            dpkg --set-selection <file
              从文件读取软件包选择
            9. 网络
            /sbin/ifconfig
              配置网络接口
            /etc/network/
              网络配置文件, 多数与接口有关.
            ifup, ifdown device
              启动,停止网络接口, 根据上边的文件
            ssh -X user@host
              登入别的机器
            scp files user@host:path
              将文件复制到别的机器上
            catior IOR
              View components of stringified CORBA IOR.
            nameclt list[context]
              列出CORBA名称服务器上的上下文和对象
            10. WEB服务器(Apache2)
            /etc/apache2/
            /etc/apache2/sites-enabled/default
              定义默认虚拟主机
            /etc/apache2/mods-available/
               包含有效的模块文件. 若要启用一个模块, 在 /etc/apache2/mods-available/创建符号连接
            11. 数据库(postgreSQL)
            createdb
              创建一个新数据库
            dropdb
              删除一个数据库
            createuser
              创建一个数据库用户
            dropuser
              删除一个数据库用户
            /etc/postgresql/pg_hba.conf
              客户端访问配置文件
            ALTER USER name WITH PASSWORD 'password';
              通过SQL控制台 psql 来修改密码
            12. 文件和打印服务器(SAMBA)
            /etc/samba/smb.conf
              主配置文件
            smbclient
              浏览 SMB 网络资源, 例如, 下载, 上载文件 [22:55] [发表评论] 退出 Thunderbird,然后修改 prefs.js,在
            user_pref("mail.server.server2.hostname", "mail.YourImapProvider.com");
            行后面添加 user_pref("mail.server.server6.trash_folder_name", "IMAP 服务器上正确的名字");
            比如在科大服务器上为 Junk,详见:http://kb.mozillazine.org/IMAP_Trash_folder

            By default Thunderbird (and the Mozilla Suite) assume that your Trash folder is called "Trash" and not some other name, such as "Deleted Items". This can sometimes be a problem with IMAP accounts, if your IMAP server uses a different name for the dedicated Trash folder. In such cases, Thunderbird will likely create its own Trash folder (named "Trash"), while your mail server will still be using the other folder (e.g., "Deleted Items"), and you may see both at the same time in the Thunderbird folders pane. To specify a different Trash folder for an IMAP account in Thunderbird:

            1. Completely exit Thunderbird if it is running.

            2. Make a temporary backup copy of your profile folder (or at least these files inside it: "prefs.js" and, if it exists, "user.js").

            3. Open your "prefs.js" file with a text editor such as Notepad to find the server# used to represent your IMAP account. It could be "server2", "server5", "server7", or some other number depending on your own individual account setup. Look for a line similar to this, corresponding to your own IMAP acccount:

          user_pref("mail.server.server2.hostname", "mail.YourImapProvider.com");
          

          4. Insert a line like the following into "user.js", with the correct server# and correct name for the Trash folder:

           user_pref("mail.server.server#.trash_folder_name", "<correct Trash name>");
          

          For example:

           user_pref("mail.server.server2.trash_folder_name", "Deleted Items");
          

          If you want to use "Geloscht" (German for Trash) you would have to write it in the user_pref as "Gel&APY-scht", since the German Umlaute has to be encoded differently.

          5. Restart Thunderbird. You should now see the new Trash folder (e.g., "Deleted Items") showing the trash can icon. (If not, exit and restart Thunderbird.) If the old Trash folder is still showing, you should now be able to delete it. If you can't delete it through Thunderbird, then delete it though the account's webmail interface.

          6. If you deleted the Trash folder in the web frontend of your mail provider, you may need to cancel the IMAP folder subscriptions, too. It may take a while for the subscription changes to take effect.

          [edit]
        • 在/etc/hosts中添加客户端主机的主机名和地址,取消反查
        • 置空/etc/resolv.conf,取消用DNS服务器反查
        • 在/etc/resolv.conf中设定正确的DNS服务器
        • 在/etc/ssh/sshd_config中增加一行:UseDNS no,取消反查 利用 EasyWine 安装 Internet Explorer6 成功 由于某些网站(比如工行)必须用 IE 才成,被逼无奈,只好用 wine 模拟,安装 IE6 非常简单,参见:http://www.easywine.org/
          中文输入法:
          它使用xim输入法没问题
          GTK_IM_MODULE="xim" ; export GTK_IM_MODULE
          QT_IM_MODULE="xim" ; export QT_IM_MODULE
          export XIM=SCIM
          export XIM_PROGRAM=SCIM
          export QT_IM_MODULE="xim"
          export XMODIFIERS="@im=SCIM"
          export GTK_IM_MODULE="scim"
          scim -f x11 -d&
          虽然wine 很久之前就已经支持xim 中文输入,但是我一直都不能使用。 一直到现在的w ine 0.9.11 都不行,后来google 了一下,找到只要在scim 的输入法设定中,把「介面 」->「 全域设定」->「在输入法客户端视窗嵌入预先编辑字串」关闭即可 [22:55] [发表评论] 或者在vim的runtimepath中添加/usr/share/vim/addons
          比如在~/.vimrc中:
          set runtimepath=~/.vim,/var/lib/vim/addons,/usr/share/vim/vimfiles,/usr/share/vim/vim71,/usr/share/vim/vimfiles/after,/var/lib/vim/addons/after,~/.vim/after,/usr/share/vim/addons

          参见:/usr/share/doc/vim-common/changelog.Debian.gz
          debian/runtime/debian.vim.in
          - removing /usr/share/vim/addons/{,after/} from the vim runtimepath: according to the VIM policy addons should not be enabled per default, but manually using vim-addon-manager # 1、此脚本适用于debian系统,测试版本10.0.025下不包含ide的ifort、icc、idb成功 # 2、解压缩编译器包之后到data目录下用root权限执行:脚本名 rpm包名 # 3、主要作用: # a、利用alien安装rpm # b、修改编译命令及环境设置脚本,并将原始文件备份为对应的.bak文件 # c、设置/etc/profile,最后调用vim确认修改/etc/profile MOD( ) FILE=$INSTALLDIR/bin/$1 cp $FILE $FILE.bak chmod 644 $FILE.bak sed -i -e "1a INSTALLDIR=$INSTALLDIR" -e 's//$INSTALLDIR/g' $FILE if [ $# != "1" ] echo "Usage : install-intel-compiler " exit 1 elif [ $1 = "-h" ] echo "Usage : install-intel-compiler " exit 0 if [ ! -f $1 ]; then echo "$1 does not exist." exit 2 if [ ${1##*.} != rpm ]; then echo "$1 is not a rpm file" exit 3 alien -i $1 VERSION=`echo $1 | awk -F- '{print $3}'` for i in cc ifort idb echo $1 | grep $i >/dev/null if [ $? = 0 ] if [ $i = ifort ] COMP=fc COMP=$i break INSTALLDIR=/opt/intel/$COMP/$VERSION case $COMP in CMD=ifort MOD $CMD MOD ${CMD}vars.sh MOD ${CMD}vars.csh CMD=icpc MOD $CMD CMD=icc MOD $CMD MOD ${CMD}vars.sh MOD ${CMD}vars.csh CMD=idb MOD ${CMD}vars.sh MOD ${CMD}vars.csh echo ". $INSTALLDIR/bin/${CMD}vars.sh" >>/etc/profile vim /etc/profile 发信人: oseen (七是日期的期), 信区: TeX
          标 题: Debian teTeX3.0 字体配置新工具tex-cjkfonts
          发信站: 水木社区 (Tue Mar 7 13:19:28 2006), 站内
          两天加两个晚上的工作,呵呵
          写这个脚本的缘起就是上边的文章,在这里就不重复了。
          由CJK字体生成相应的用于teTeX3.0的配置文件,使之可用于latex / dvipdfm /
          dvipdfmx / xdvi / pdflatex等. 其中pdflatex/dvipdfm/xdvi使用type1字
          体,dvipdfmx使用truetype字体
          当前支持的编码是utf8和gbk
          1.(强烈推荐)先安装好dvipdfmx
          2.下载附件,执行dpkg -i tex-cjkfonts_0.3-1_i386.deb
          可能会提示缺包,按提示逐一apt-get装上
          3.主要的命令是make-fpkg和make-fpkg-sys,不带任何参数执行可输出调用方法
          这个取名仿照了debian的make-jpkg/make-kpkg命令,取意"make font
          package", make-fpkg用于生成用户主目录下的配置文件,make-fpkg-sys用于
          生成系统texmf下的配置文件
          4.make-fpkg在当前目录下生成一个tar.gz压缩包,解压到$HOME后执行
          mktexlsr;
          update-updmap;
          updmap;
          即可使用字体
          5.make-fpkg-sys在当前目录下生成一个deb包,用dpkg -i 安装这个deb包即可
          为中易公司(zhongyi)的simsun.ttf生成gbk编码的,名称为song的个人配置文件:
          make-fpkg /usr/share/fonts/truetype/simsun.ttf gbk song zhongyi
          为方正公司(founder)的fzkai.ttf生成utf8编码的,名称为kai的系统级配置文件:
          make-fpkg-sys /usr/share/fonts/truetype/fzkai.ttf utf8 kai founder
          值得提一下的是,最后一个参数是字体的制造商名字,虽然并非很有用,但加上了可严
          格符合TDS 1.1标准
          希望debian的tex用户可以帮我测试一下,尤其是使用gbk编码的用户. bug报告可以
          直接发到我的smth邮箱里
          已知的bug(汗一下,还真不少)
          1. latex-dvips-ps2pdf乱码,原因可能在ttf2pt1,查找中
          2. latex-dvipdfm无法显示斜体
          3. latex-dvipdfmx生成的pdf在windows下用adobe reader 可以正常显示。
          在linux下用adobe reader 7.0有时不能显示字体(编码正确,文字虽然不能
          看见但可复制出来)。
          推荐的pdf生成方法:
          latex -> dvipdfmx, 文件体积小,在windows下显示效果很好,可复制粘贴
          pdflatex, 加上ccmap包后也可以复制粘贴
          参考了李果正, sk8er, intron的若干脚本,谨表谢意^_^ [22:55] [发表评论]

          http://www.linuxaid.com.cn/infos/1/8/187251750.shtml

          上周五,安全专家报出Linux和Unix中广泛应用的一种压缩格式中存在一个很重要的漏洞,黑客可以利用此漏洞进入机器。虽然针对zlib库的补丁目前还没有,但几个Linux和BSD发行商已经推出了他们自己的解决办法。

          这个bug影响zlib当前的版本,1.2.2。根据丹麦的 Secunia安全公司发出的警告,黑客可以利用这个bug制造DoS (Denial-of-Service,拒绝服务)攻击,而DoS攻击利用这个库可能摧毁任何应用程序,或者允许攻击者远程种植恶意代码。Secunia 公司定级zlib漏洞为“非常关键”级别,是该公司第二最严重级别。

          这个漏洞是由Gentoo Linux的一位研究员在上周三发现的,他在自己公司的网站上贴出了一则警告。因为开源zlib计划不能给出任何补丁,Linux的商业卖主都已经按版本不同分别升级了自己发布的系统。Debian、FreeBSD、Gentoo、OpenBSD、RedHat和SuSE都发布了各自的补丁。

          p>2004年的8月在zlib压缩格式中也发现了一个类似的(虽然不如这个危险)DoS漏洞,1.2.2版的补丁在10月才发布。 [22:55] [发表评论] Fortran 编程人员经常需要维护一种以上的代码版本,或者在各种环境下运行代码。对于编程人员来说,最容易的解决办法是保留单个源文件,而所有代码变更均相互穿插在该文件中,这样就可以轻松地提取出任何版本。这样对应用到所有版本的修改只需执行一次即可。

          源代码预处理程序很早以前就被用于提供这些功能。它们允许用户在源代码中插入指令语句来影响预处理程序的输出。

          通常,这些特殊指令可能作为编译器的注释行出现。一般情况下,源代码预处理程序允许用户定义特殊变量和逻辑构造来有条件地控制文件中哪些源代码行将被传送给编译器,哪些行将被略过。此外,预处理程序的源代码行编辑功能允许用户根据所定义的字符串变量的值来指定如何更改源代码。

          在历史上,曾经将标准 C 编译器的源代码预处理程序 cpp 用于向 Fortran 编程人员提供这些功能。然而,cpp 受到 C 语言语法和源代码行格式的紧密束缚,以致于没有详细审查就不能使用。建议的 Fortran 预处理程序 fpp 将提供特定于 Fortran 的源代码功能(C 编程人员曾经期望在 UNIX 环境下实现这些功能)。

          fpp 的某些功能可能会重新应用到其他工具中。fpp 的一个实现必须解析和分析 Fortran 源代码、对 Fortran 表达式求值并生成 Fortran 输出。如果其他工具需要提供一个增强型 Fortran 程序开发环境,这些功能将是这些工具的构件。

          以下部分更详细地描述了 fpp 的功能。有关完整的详细信息,请参见 fpp(1) 手册页。

          fpp 输入源代码

          fpp 输入源代码是散布着预处理程序语句的标准 Fortran 代码。所有预处理程序语句均以一个特殊字符 # 开头。它只能在一行的第一个字符位置出现。# 后必须紧跟预处理程序命令的文本。

          预处理程序指令可能出现在 Fortran 注释内。预处理程序也会修改 Fortran 注释内的文本。

          预处理程序能够对固定格式和自由格式的源代码进行操作。固定格式的源文件以 ".F" 为扩展名,而自由格式的源文件以 ".F90" 为扩展名。请注意,固定格式文件命名约定适用于 FORTRAN 77 和 Fortran 90。在调用适当的编译器之前,会首先预处理带有此类扩展名的文件。

          如果宏展开或者字符串替换导致一行中列的宽度超过 72 列(固定格式)或者 132 列(自由格式),预处理程序将生成适当的续行。

          预处理程序变量

          预处理程序变量由指令定义并具有一个字符串值。fpp 将在源代码中任何适合替换的地方用变量的值来替换所出现的变量。变量也会出现在条件指令中,控制传送给输出的源代码行的选择。

          #define name string
          将变量 "name" 的值定义为 "string","name" 标记的每个实例 [超出 IMPLICIT 语句边界,FORMAT 语句和串文字中的文本] 的结果被 "string" 照字面意义替换。

          注意:如果是 IMPLICIT 语句边界和 FORMAT 语句中的文本,则宏只有在与该范围内的有效文字相冲突的情况下才会扩展。

          还允许使用参数执行类似于“宏”的内联替换:

          #define name (arg1 [,arg2]...) string-with-args-inserted
          #define SOLARIS_2 .TRUE.
          #define CONVERT(TO_FARENHEIT) ((TO_FARENHEIT*9)/5)+32
          预处理程序变量在从定义点到编译单元结束的整个范围内有效。(即文件的全局范围)

          可以使用以下内容通过显式方式取消预处理程序变量的定义

          #undef name
          Fortran 预处理程序接受 /* 与 */ 之间包含的 C 样式注释。

          源代码的条件选择

          这是在 cpp 条件代码构造基础上进行建模的。

          #if condition1
          block1
          [#elif condition2
          block2 ]
          ...
          [#else
          blockn ]
          #endif
          #ifdef name
          block
          #endif
          #ifndef name
          block
          #endif
          这些条件是包含预处理程序变量(由 #define 语句指定)的 fpp 表达式。请注意,条件可在圆括号内指定。这些 fpp 表达式是 cpp 表达式的超集,它们可以计算 Fortran 逻辑型。因此,".TRUE." 在 fpp 表达式中是有效的。预处理程序会评估这些条件以获得一个真或者假的结果。这些表达式无法计算浮点值或者包含内在函数。

          #define SOLARIS_2 .TRUE.
          #if (SOLARIS_2)
          CALL solaris_2 (X,Y,Z)
          #else
          CALL solaris_1 (X,Y,Z)
          #endif
          有时,在一个文件中收集预处理程序变量是很方便的。可使用以下语句来实现

          #include filename
          允许嵌套 #include。#include 语句不能出现在续行中(即包含文件中的第一个语句不能是续行)。

          预处理程序内在函数

          defined(name) 提供了一个名称的定义状态。根据该名称是否要定义来决定返回的是 TRUE 还是 FALSE。这通常在 #if 语句中使用:

          #if defined(BIG_MODEL)

          命令行选项

          fpp 通常从 Fortran 编译器驱动程序中调用。fpp 也可以独立调用。以下是 fpp 接受的一些选项:

          -Dname

          name 定义为 1。这与 fpp 当前正在处理的源文件中出现的 #define name1 这一行相同。


          -Dname=def

          这与 fpp 当前正在处理的源文件中出现的 #define name def 这一行相同。


          -Idirectory 

          对于名称不是以 "/" 开头的 #include 文件,将 directory 插入搜索路径中。directory 被插入在 "include" 目录标准列表的前面。因此,对于其名称用双引号 (") 括起来的 #include 文件,首先在包含 #include 行的文件的目录中搜索,然后在以 -I 选项命名的目录中搜索,最后在标准列表内的目录中搜索。


          -Uname 

          删除 name 的所有初始定义,其中 name 由预处理程序进行预定义。


          -Ydirectory 

          搜索 #include 文件时使用 directory 来替换目录的标准列表。

          采用 Linux 集群技术的高性能计算的基本概念简介
          http://www-128.ibm.com/developerworks/cn/linux/l-cluster1/

          Aditya Narayan , 创始人, QCD Microsystems

          2005 年 10 月 17 日

          高性能计算(HPC)正在变得越来越简单,这是由于两个原因:开放源码软件概念的采用,以及集群技术的精炼。本文是两篇系列文章中的第一篇,讨论了集群的类型、用途以及在 HPC 领域变得更加流行的原因、HPC 基础以及 Linux 在 HPC 中的角色。

          现在 Linux 集群在很多领域都已经变得非常流行了。随着集群技术的出现以及开放源码软件日益得到采纳,现在只需要传统高性能机器的很少一部分成本就可以构建一台超级计算机了。

          这两篇系列文章简要介绍采用 Linux 集群技术的高性能计算(HPC)的概念,展示如何构建集群并编写并行程序。本文是两篇系列文章中的第一篇,讨论了集群的类型、用途、HPC 基础、Linux 在 HPC 中的角色以及集群技术日益增长的原因。第 2 部分将介绍并行算法的知识,并介绍如何编写并行程序、如何构建集群以及如何进行基准测试。

          HPC 体系架构的类型

          大部分 HPC 系统都使用了并行 的概念。有很多软件平台都是面向 HPC 的,但是首先让我们先来了解一下硬件的知识。 HPC 硬件可以分为 3 类: 对称多处理器(SMP) 向量处理器

    • 对称多处理器(SMP)

      SMP 是 HPC 采用的体系架构之一,其中有多个处理器会共享内存。(在集群中,这也称为 大规模并行处理器(massively parallel processor,MPP),它们并不需要共享内存;稍后我们将更详细介绍这方面的内容。)与 MPP 相比,SMP 通常成本更高,而且可伸缩性较差。

      向量处理器

      顾名思义,在向量处理器中,CPU 被优化以便很好地处理向量数组的运算。向量处理器系统的性能很高,在 20 世纪 80 年代到 90 年代早期一度在 HPC 体系架构中占有统治地位,但是最近几年以来,集群变得更加流行了。 集群是最近几年中最为主要的一种 HPC 硬件:集群(cluster) 就是一组 MPP 的集合。集群中的处理器通常被称为 节点,它具有自己的 CPU、内存、操作系统、I/O 子系统,并且可以与其他节点进行通信。目前有很多地方都使用常见的工作站运行 Linux 和其他开放源码软件来充当集群中的节点。 接下来您将看到这些 HPC 硬件之间的区别,但是首先让我们从集群开始。 术语“集群(cluster)”在不同的地方可能会意味着不同的意义。本文重点介绍以下三种类型的集群: 故障迁移集群 负载均衡集群 高性能集群

      故障迁移集群

      最简单的故障迁移集群有两个节点:一个节点是活动的,另外一个节点是备用的,不过它会一直对活动节点进行监视。一旦活动节点出现故障,备用节点就会接管它的工作,这样就能使得关键的系统能够持续工作。

      负载均衡集群

      负载均衡集群通常会在非常繁忙的 Web 站点上采用,它们有多个节点来承担相同站点的工作,每个获取 Web 页面的新请求都被动态路由到一个负载较低的节点上。

      高性能集群

      高性能集群用来运行那些对时间敏感的并行程序,它们对于科学社区来说具有特殊的意义。高性能集群通常会运行一些模拟程序和其他对 CPU 非常敏感的程序,这些程序在普通的硬件上运行需要花费大量的时间。 图 1 解释了一个基本的集群。本系列文章的第 2 部分将展示如何创建这种集群,并为其编写程序。


      图 1. 基本的集群
      基本的集群

      网格计算 是一个更为广泛的术语,通常用来代表利用松耦合系统之间的协作来实现面向服务的架构(SOA)。基于集群的 HPC 是网格计算的一个特例,其中节点之间都是紧耦合的。网格计算的一个成功的、众所周知的项目是 SETI@home,即搜索外星智慧的项目,它使用了大约一百万台家用 PC 在屏保时的空闲 CPU 周期来分析无线电天文望远镜的数据。另外一个类似的成功项目是 Folding@Home 项目,用来进行蛋白质的折叠计算。 高性能集群的常见用途

      几乎所有的产业界都需要快速的处理能力。随着越来越便宜而且快速的计算机的出现,更多公司表现出了对利用这些技术优势的兴趣。人们对于计算处理能力的需求是没有上限的;尽管处理能力在迅速提高,但是人们的需求仍然超出计算能力所能提供的范围。

      生命科学研究

      蛋白质分子是非常复杂的链,实际上可以表示为无数个 3D 图形。实际上,在将蛋白质放到某种溶液中时,它们会快速“折叠”成自己的自然状态。不正确的折叠会导致很多疾病,例如 Alzheimer 病;因此,对于蛋白质折叠的研究非常重要。

      科学家试图理解蛋白质折叠的一种方式是通过在计算机上进行模拟。实际上,蛋白质的折叠进行得非常迅速(可能只需要 1 微秒),不过这个过程却非常复杂,这个模拟在普通的计算机上可能需要运行 10 年。这个领域只不过是诸多业界领域中很小的一个,但是它却需要非常强大的计算能力。

      业界中其他领域包括制药建模、虚拟外科手术训练、环境和诊断虚拟化、完整的医疗记录数据库以及人类基因项目。

      石油和天然气勘探

      震 动图中包含有大陆和洋底内部特性的详细信息,对这些数据进行分析可以帮助我们探测石油和其他资源。即便对于一个很小的区域来说,也有数以 TB 计的数据需要重构;这种分析显然需要大量的计算能力。这个领域对于计算能力的需求是如此旺盛,以至于超级计算机大部分都是在处理这种工作。 其他地理学方面的研究也需要类似的计算能力,例如用来预测地震的系统,用于安全性工作的多谱段卫星成像系统。

      图像呈现

      在 工程领域(例如航天引擎设计)操纵高分辨率的交互式图像在性能和可伸缩性方面历来都是一种挑战,因为这要涉及大量的数据。基于集群的技术在这些领域已经取 得了成功,它们将渲染屏幕的任务分割到集群中的各个节点上,在每个节点上都利用自己的图形硬件来呈现自己这部分屏幕的图像,并将这些像素信息传送到一个主 节点上,主节点对这些信息进行组合,最终形成一个完整的图像。 这个领域中的例子目前才不过是冰山一角;更多的应用程序,包括天体物理模拟、气象模拟、工程设计、金融建模、证券模拟以及电影特技,都需要丰富的计算资源。对于计算能力越来越多的需求我们就不再进行介绍了。 Linux 和集群如何改变了 HPC

      在基于集群的计算技术出现之前,典型的超级计算机都是向量处理器,由于它们全部采用专用的硬件和软件,因此成本通常会超过一百万美元。 随着 Linux 和其他免费的集群开放源码软件组件的出现和常用硬件处理能力的提高,这种情况现在已经发生了很大的变化。您可以利用少量的成本来构建功能强大的集群,并能够根据需要来添加其他节点。

      GNU/Linux 操作系统(Linux)已经在集群中得到了大量的采用。Linux 可以在很多硬件上运行,并且具有高质量的编译器和其他软件,例如并行文件系统和 MPI 实现在 Linux 上都是免费的。采用 Linux,用户还可以针对自己的任务负载对内核进行定制。Linux 是构建 HPC 集群的一个非常好的平台。 理解硬件:向量机与集群

      要理解 HPC 硬件,对向量计算和集群计算进行一下比较是非常有用的。二者是互相竞争的技术(地球模拟器 是一台向量超级计算机,目前仍然是最快的 10 台机器之一)。 从根本上来讲,向量处理器和标量处理器都是基于时钟周期来执行指令的;使它们产生区别的是向量处理器并行处理与向量有关的计算的能力(例如矩阵乘法),这在高性能计算中是非常常见的。为了展示这一点,假设您有两个双精度的数组 ab,并且要创建第三个数组 x,比如 x[i]=a[i]+b[i]。 任何浮点操作,例如加法和乘法,都可以通过几个步骤来实现: 进行指数调整 对结果进行取整检查等 向量处理器通过使用 流水线(pipeline) 技术在内部对这些步骤进行并行处理。假设在一个浮点加法运算中有六个步骤(与 IEEE 算术硬件一样),如图 2 所示:


      图 2. IEEE 算术硬件中的六级流水线
      IEEE 算术硬件中的六级流水线

      向 量处理器可以并行处理这六个步骤 —— 如果第 i 个数组元素是在第 4 个步骤中被添加的,那么向量处理器就会为第 (i+1) 个元素执行第 3 个步骤,为第 (i+2) 个元素执行第 2 个步骤,依此类推。正如您可以看到的一样,对于一个 6 级的浮点加运算来说,加速比非常接近于 6(在开始和结束时,这六个步骤并不是都处于活动状态的),因为在任何给定的时刻(图 2 所示的红色),这些步骤都是活动的。这样做的一大优点是并行处理都是在幕后进行的,您并不需要在程序中显式地进行编码。 对于大部分情况来说,这六个步骤都可以并行执行,这样就可以获得几乎 6 倍的性能提高。箭头表示了对第 i 个数组元素所进行的操作。 与向量处理相比,基于集群的计算采用的是完全不同的一种方法。它不使用专门优化过的向量硬件,而是使用标准的标量处理器,但是它采用了大量的处理器来并行处理多个计算任务。 集群的特性如下: 集群都是使用常见的硬件进行构建的,其成本只是向量处理器的很小一部分。在很多情况中,价格会低一个数量级以上。 集群使用消息传递系统进行通信,程序必须显式地进行编码来使用分布式硬件。 采用集群,您可以根据需要向集群中添加节点。 开放源码软件组件和 Linux 降低了软件的成本。 集群的维护成本很低(它们占用的空间较小,耗费的电力较少,对于制冷条件的需求较低)。 并行编程和 Amdahl 法则

      当在集群上实现高性能环境时,软件和硬件就需要联合起来工作。程序在编写时必须要显式地利用底层硬件的优点,如果现有的非并行程序不能很好地在集群上运行,那么这些程序必须重新进行编写。 并行程序一次要执行很多操作。其数量取决于目前正在解决的问题。假设一个程序所花费的时间中有 1/N 是不能并行处理的,那么剩余的 (1-1/N) 就是可以并行处理的部分(请参看图 3)。


      图 3. Amdahl 法则
      Amdahl 法则

      从 理论上来说,您可以采用无数的硬件来处理并行执行的部分,甚至在接近 0 的时间内完成这些任务,但是对于串行部分来说,这样做不会有任何提高。结果是,可以实现的最佳结果是使用原来的 1/N 的时间来执行整个程序,但是不可能再快了。在并行编程中,这个事实通常就称为 Amdahl 法则。 Amdahl 法则揭示了使用并行处理器来解决问题与只使用一个串行处理器来解决问题的加速比。加速比(speedup) 的定义如下:(使用多个处理器)并行执行程序所需要的时间除以(使用一个处理器)串行执行程序所需要的时间: S = ------ 其中 T(j) 是在使用 j 个处理器来执行程序时所需要的时间。 在图 3 中,如果采用足够多的节点来进行并行处理,那么 T'par 就可以非常接近于 0,但是 Tseq 却不会变化。在最好的情况中,并行程序也不可能快到原来的 1+Tpar/Tseq。

      在编写并行程序时真正困难的事情是使 N 尽量大。但是这件事情却有两面性。通常都是要试图在更为强大的计算机上来解决更大的问题,通常随着所解决问题的规模的增大(例如试图修改程序并提高可并行 的部分来优化地利用可用资源),所花费在串行部分上的时间就会减少。因此,N 值就会自动变大了。(请参看本文后面 参考资料 部分所给出的 Amdhal 法则推论。) 并行编程的方法

      现在让我们介绍两种并行编程的方法:分布式内存方法共享式内存方法

      分布式内存方法

      此处我们考虑一种主从模式非常有用: 主节点负责将任务划分到多个从节点上。 从节点负责处理自己所接收到的任务。 如果需要,从节点之间会相互进行通信。 从节点将结果返回给主节点。 主节点收集结果,并继续分发任务,依此类推。 显然,这种方法的问题就产生于分布式内存的组织。由于每个节点都只能访问自己的内存,如果其他节点需要访问这些内存中的数据,就必须对这些数据结构进行复制并通过网络进行传送,这会导致大量的网络负载。要编写有效的分布式内存的程序,就必须牢记这个缺点和主从模型。

      共享式内存方法

      在共享式内存方法中,内存对于所有的处理器(例如 SMP)来说都是通用的。这种方法并没有分布式内存方法中所提到的那些问题。而且对于这种系统进行编程要简单很多,因为所有的数据对于所有的处理器来说都 是可以使用的,这与串行程序并没有太多区别。这些系统的一个大问题是可伸缩能力:不容易添加其他处理器。 并行编程(与所有的编程技术一样)与其他科学一样,都是一门艺术,总会留下一定的空间来进行设计的改进和性能的提高。并行编程在计算中有自己特殊的地位:本系列文章的第 2 部分将介绍并行编程平台,并给出几个例子。 当文件 I/O 成为瓶颈时怎么办?

      有些应用程序通常会需要从磁盘中读写大量的数据,这通常是整个计算过程中速度最慢的一个步骤。更快的硬盘驱动器能够帮助解决一些问题,但是有时这是不够的。 如果一个物理磁盘分区是在所有节点之间共享的(例如使用 NFS),就像是在 Linux 集群中经常采用的方法一样,那么这个问题就会变得更加明显了。此时就是并行文件系统的用武之地了。

      并行文件系统(Parallel filesystem) 将数据存放在分布在多个磁盘上的文件中,这些磁盘连接到集群中的多个节点上,这些节点称为 I/O 节点。当一个程序试图读取某个文件时,可以并行地从多块磁盘上分别读取这个文件的某些部分。这可以降低某个磁盘控制器上的负载,并能够处理更多请求。 (PVFS 就是一个很好的开放源码并行文件系统;目前已经在 Linux 集群上使用标准的 IDE 硬盘实现了超过 1 GB/s 的磁盘性能。) PVFS 可以作为一个 Linux 内核模块使用,也可以编译到 Linux 内核中。底层的概念非常简单(请参看图 4): 元数据服务器负责存储文件的哪些部分存储在什么地方的信息。 多个 I/O 节点上存储了文件的各个部分(PVFS 底层可以使用任何常见的文件系统,例如 ext3 )。


      图 4. PVFS 是如何工作的
      PVFS 是如何工作的

      当集群中的计算节点想要访问并行文件系统中的一个文件时,它需要执行以下步骤: 像平常一样请求文件,请求被传送到底层的 PVFS 文件系统中。 PVFS 向元数据服务器发送一个请求(图 4 中的步骤 1、2),这会通知请求节点有关文件在各个 I/O 节点上的位置的信息。 使用这些信息,计算节点直接与所有相关的 I/O 节点进行通信,获得整个文件(步骤 3)。 这些步骤对于调用应用程序来说都是透明的;底层对所有 I/O 节点发出请求的复杂性、获取文件的内容等等,都是由 PVFS 处理的。 有关 PVFS 有一件好的事情:不需做任何修改就可以在其上运行普通文件系统的二进制形式 —— 这在并行编程领域多少是个例外。(参考资料 中介绍了其他一些并行文件系统。) 如果想在vim里面达到这个效果,在vimrc中加入一下两行:
      au BufWinEnter *.{[ch],cpp,CPP,C,s,S} exe 'set list listchars=tab:\|\ '
      au BufWinEnter *.{[ch],cpp,CPP,C,s,S} exe 'command Seetab :set list listchars=tab:\|\ '
      当你编程序时, 就会达到这个效果. 源自:http://www.vim.org/tips/tip.php?tip_id=460
      当你不想看到对齐线时 在vim的normal模式下 :set nolist
      如果你想看到对齐线时 在vim的normal模式下 :Seetab

  •