踏踏实实干工作,推进开源大发展!
  • Linux 2.6 内核的嵌入式系统应用 *

    2008-05-15 15:38:32

      随着多媒体技术与通讯技术相结合的信息技术的快速发展和互联网的广泛应用,PC 时代也过渡到了后PC时代。在数字信息技术和网络

    技术高速发展的后PC时代,嵌入式技术越来越与人们的生活紧密结合。

     操作系统为 用户使用计算机及其外部设备提供最基本的接口程序,管理计算机上的资源。随着应用领域的扩大,为了适应不同的应用场合,考虑到系统的灵活性、可伸缩性以及 可裁剪性,一种以应用为中心、以计算机技术为基础、软硬件可裁剪、适应应用系统对功能、可靠性、成本、体积、功耗要求严格的专用计算机系统——嵌入式操作 系统随之延生。

      Linux 操作系统是一种性能优良、源码公开且被广泛应用的免费操作系统,由于其体积小、可裁减、运行速度高、良好的网络性能等优点,可以作为嵌入式操作系统。随着 2.6内核的发布,Linux向现有主流的RTOS提供商在嵌入式系统市场提出了巨大挑战,例如VxWorks和WinCE,具有许多新特性,将成为更优 秀的嵌入式操作系统。

      Linux的低成本和开放性,为其在嵌入式系统领域的应用营造了肥沃的土壤。本文着重介绍Linux 2.6内核的新特性及其嵌入式应用中的优势,并将其移植到嵌入式平台中,成功支持H.264编解码多媒体系统。

    1 Linux 2.6内核针对嵌入式开发显著特点

      实时可靠性是嵌入式应用较为普遍的要求,尽管Linux 2.6 并不是一个真正的实时操作系统,但其改进的特性能够满足响应需求。Linux 2.6 已经在内核主体中加入了提高中断性能和调度响应时间的改进,其中有三个最显著的改进:采用可抢占内核、更加有效的调度算法以及同步性的提高[4]。在企业服务器以 及嵌入式系统应用领域,Linux 2.6 都是一个巨大的进步。在嵌入式领域,Linux 2.6 除了提高其实时性能,系统的移植更加方便,同时添加了新的体系结构和处理器类型——包括对没有硬件控制内存管理方案的 MMU-less系统的支持,可以支持大容量内存模型、微控制器,同时还改善了I/O子系统,增添更多的多媒体应用功能[4]

    1.1 可抢占内核

      在先前的内核版本中(包括2.4内核)不允许抢占以核心态运行的任务(包括通过系统调用进入内核模式的用户任务),只能等待它们自己主动释放CPU。这样必然导致一些重要任务延时以等待系统调用结束。

      一个内核任务可以被抢占,为的是让重要的用户应用程序可以继续运行。这样做最主要的优势是极大地增强系统的用户交互性。

      2.6内核并不是真正的RTOS(Real Time Operation System),其在内核代码中插入了抢占点,允许调度程序中止当前进程而调用更高优先级的进程,通过对抢占点的测试避免不合理的系统调用延时。2.6内 核在一定程度上是可抢占的,比2.4内核具备更好的响应性。但也不是所有的内核代码段都可以被抢占,可以锁定内核代码的关键部分,确保CPU的数据结构和 状态始终受到保护而不被抢占。

      软件需要满足最终时间限制与虚拟内存请求页面调度之间是相互矛盾的。慢速的页错误处理将会破坏系统的实时响应性,而2.6内核可以编译无虚拟内存系统避免这个问题,这是解决问题的关键,但要求软件设计者有足够的内存来保证任务的执行。

    1.2 有效的调度程序

      2.6版本的 Linux内核使用了由 Ingo Molnar开发的新的调度器算法,称为O(1)算法,如图1所示。它在高负载情况下执行得极其出色,并且当有很多处理器并行时也可以很好地扩展[2]。 过去的调度程序需要查找整个ready task队列,并且计算它们的重要性以决定下一步调用的task,需要的时间随task数量而改变。O(1)算法则不再每次扫描所有的任务,当task就 绪时被放入一个活动队列中,调度程序每次从中调度适合的task,因而每次调度都是一个固定的时间。任务运行时分配一个时间片,当时间片结束,该任务将放 弃处理器并根据其优先级转到过期队列中。活动队列中任务全部调度结束后,两个队列指针互换,过期队列成为当前队列,调度程序继续以简单的算法调度当前队列 中的任务。这在多处理器的情况更能提高SMP的效率,平衡处理器的负载,避免进程在处理器间的跳跃。

     

    图1 O(1)调度算法

    1.3 同步原型与共享内存

      多进程应用程序需要共享内存和外设资源,为避免竞争采用了互斥的方法保证资源在同一时刻只被一个任务访问。Linux内核用一个系统调 用来决定一个线程阻塞或是继续执行来实现互斥,在线程继续执行时,这个费时的系统调用就没有必要了。Linux2.6所支持的Fast User-Space Mutexes 可以从用户空间检测是不是需要阻塞线程,只在需要时执行系统调用终止线程。它同样采用调度优先级来确定将要执行的进程[4]。多处理器嵌入式系统各处理器 之间需要共享内存,对称多处理技术对内存访问采用同等优先级,在很大程度上限制了系统的可量测性和处理效率。Linux2.6 则提供了新的管理方法——NUMA(Non Uniform Memory Access)。NUMA根据处理器和内存的拓扑布局,在发生内存竞争时,给予不同处理器不同级别权限以解决内存抢占瓶颈,提高吞吐量。

    1.4 POSIX线程及NPTL

      新的线程模型基于一个1:1的线程模型(一个内核线程对应一个用户线程),包括内核对新的 NPTL(Native POSIX Threading Library)的支持,这是对以前内核线程方法的明显改进。2.6内核同时还提供POSIX signals和POSIX high-resolution timers。POSIX signals不会丢失,并且可以携带线程间或处理器间的通信信息。嵌入式系统要求系统按时间表执行任务,POSIX timer可以提供1kHz的触发器使这一切变得简单,从而可以有效地控制进度。

    1.5 微控制器的支持

      Linux2.6内核加入了多种微控制器的支持。无MMU的处理器以前只能利用一些改进的分支版本,如uClinux,而2.6内核已 经将其整合进了新的内核中,开始支持多种流行的无MMU微控制器,如Dragonball、ColdFire、Hitachi H8/300。Linux在无MMU控制器上仍旧支持多任务处理,但没有内存保护功能。同时也加入了许多流行的控制器的支持,如S3C2410等。

    1.6 面向应用

      嵌入式应用有用户定制的特点,硬件设计都针对特定应用开发,这给系统带来对非标准化设计支持的问题(如IRQ的管理)。为了更好地实 现,可以采用部件化的操作系统。Linux2.6采用的子系统架构将功能模块化,可以定制而对其他部分影响最小。同时Linux2.6提供了多种新技术的 支持以实现各种应用开发,如Advanced Linux Sound Architecture(ALSA)和Video4Linux等,对多媒体信息处理更加方便;对USB2.0的支持,提供更高速的传输,增加蓝牙无线接口、音频数据链接和面向链接的数据传输L2CAP,满足短距离的无线连接的需要;而且在2.6内核中还可以配置成无输入和显示的纯粹无用户接口系统。

    2 应用研究

      在S3C2410开发板上移植嵌入式Linux 2.6.11.7内核系统,应用于构建H.264多媒体系统。

    2.1 建立交叉编译环境

      在RedHat9的主机上进行内核移植开发,首先需要建立交叉编译环境。由于2.6内核中采用了一些新的特性和指令,需要采用较新的工 具集, 采用binutils-2.15、gcc-3.4.2、glibc-2.2.5、linux-2.6.8、glibc-linuxthreads- 2.2.5来建立交叉编译工具链,建立之后将工具链路径加入系统路径$PATH中。

    2.2 内核修改

      Linux 2.6.11.7内核加入了对S3C2410芯片的支持,不再需要任何补丁文件。修改内核源码中Makefile的交叉编译选项ARCH=arm, CROSS_COMPILE=arm-linux-。针对硬件配置,需要在arch/arm/mach-s3c2410/devs.c或者 smdk2410.c中添加FLASH的分区信息s3c_nand_info,如表1。

    表1 NAND FLASH分区表

    分区名 起始地址 大 小
    Vivi 0x00000000 0x00020000
    Param 0x00020000 0x00010000
    Kernel 0x00030000 0x001c0000
    Root 0x00200000 0x00200000
    Usr 0x00400000 0x03c00000

      然后在s3c_device_nand中增加.dev={.platform_data= &s3c_nand_info},在arch/arm/mach-s3c2410/mach-smdk2410.c中的__initdata部分 增加&s3c_device_nand,使内核在启动时初始化NAND FLASH信息。

    2.3 内核编译加载

      对内核进行适当的配置是一个量体裁衣的过程。由于2.6内核会根据本地系统配置进行初始设置,可以导入内核源码默认s3c2410的配 置文件,方便加载内核基本配置,然后再选择所需选项。对MTD配置选择支持MTD设备驱动以及NAND FLASH驱动;选择支持要用到的各类文件系统(DEVFS、TMPFS、CRAMFS、YAFFS、EXT2、NFS)以及网络设备和协议,本系统加载 了网络芯片CS8900以及USB支持;在H.264多媒体系统中还需要加载Frame buffer以支持LCD显示功能。使用交叉编译工具编译内核源码后, 会在arch/arm/boot/下生成名为zImage的内核映像,在Boot loader的命令提示模式下使用下载命令完成内核加载到开发板的存储设备FLASH中。编译过程(相对以前版本的编译过程,2.6内核编译有所简化):

      make mrproper

      make menuconfig(字符界面,或者用make xconfig图形界面,但需要Qt库的支持,而make gconfig则需要GTK库的支持)

      make

      make bzImage

    2.4 文件系统

      Linux采用文件系统组织系统中的文件和设备,为设备和用户程序提供统一接口。Linux 支持多种文件系统,本系统使用CRAMFS格式的只读根文件系统,而将FLASH中的USER区使用支持可读写的YA FFS文件系统格式,方便添加自己的应用程序。

      在根文件系统中,为保护系统的基本设置不被更改,采用CRAMFS格式。采用DEVFS来实现基本设备的建立挂载,同时使用 BusyBox也是一个缩小根文件系统的办法,提供了系统的基本指令;还需要建立一些必备的目录,添加所需配置文件,如fstab、inittab等;还 有一个重要的工作就是添加系统应用必备的动态函数库。使用生成工具mkcramfs 将整个根文件目录里的内容制作成映像文件。

      mkcramfs rootfs rootfs.ramfs

      YAFFS文件系统格式的支持需要将驱动加入到内核代码树下fs/yaffs/,修改内核配置文件,就可以在内核编译中加载对该文件系 统的支持。使用mkyaffs工具将NAND FLASH分区格式化为YAFFS分区,将mkyaffsimage生成的应用程序镜像烧写进YAFFS分区,在启动时通过写入fstab自动加载 YAFFS分区即可。

    2.5 网络设备驱动

      系统中采用CS8900A的10M网络芯片,它使用S3C2410的nGCS3和IRQ_EINT9,相应修改 linux/arch/arm/mach-s3c2410/irq.c,并在mach-smdk2410.c的smdk2410_iodesc[]中增加 {SMDK2410_ETH_IO,S3C2410_CS2, SZ_1M, MT_DEVICE},内核源码中加入芯片的驱动程序drivers/net/arm/cs8900.h和cs8900.c,并且配置网络设备驱动的 Makefile和Kconfig文件,加入CS8900A的配置选项,这样可以在内核编译时加载网络设备的驱动。

      在Linux2.6应用的同时,也要看到其与以前版本内核比较存在的一些问题。在内核的编译时间、内核镜像大小、内核占用RAM空 间大小、系统启动时间相对Linux2.4而言都存在不同程度的不足,但在硬件条件日益进步的现今可以接受,而且一部分也是由于功能加强必然带来的。虽然 Linux并非一个真正的实时操作系统,但2.6内核的改进能够满足大部分的应用需求,所以Linux2.6内核将会在嵌入式系统领域大展身手。

    参考文献

    1 Alessandro Rubini,Jonathan Corbet著,魏永明,骆刚,姜 君译.Linux设备驱动[M].

      北京:中国电力出版社,2004

    2 Anand K Santhanam. 走向Linux2.6[EB/OL]. Dec. 2003.

      http://www-128.ibm.com/deve loperworks/cn/linux/ l-inside/index.html

    3 S3C2410X 32-Bit RISC Microprocessor User´s Manual[Z]. SAMSUNG Electronics. Revision 1.2

    4 Brandon White. Linux 2.6: A Breakthrough for Embedded

      Systems[EB/OL].http://linuxdevices.com/articles/AT7751365763.html Sep.9,2003

    5 Karim Yaghmour. Building Embedded Linux Systems[M]. O’Reilly. April, 2003

    来自:IT168

  • PHP开发框架的现状和展望

    2008-05-09 09:54:33

      Ruby on Rails催生变革

      在RoR流行之前,PHP领域也有不少开发框架,例如Mojavi、WACT、PHPMvc和Seagull等。这些框架虽然也采用了MVC模式、数据库抽象层等技术。但由于当时PHP本身不像现在这样流行,所以这些框架都没有得到大量应用,最终归于沉寂。

      而在感受到RoR提供的快速开发能力后,PHP社区像被注入了兴奋剂。各种应用技术和开发框架层出不穷。

      新一代框架的诞生

      PHP社区在被RoR震晕后,没有陷入过多的争论。而是立即行动起来,开始了新一代框架的设计。首先出现的第一批框架几乎都是RoR的克隆。例 如PHP on Trax(连名字都借鉴Ruby on Rails)和TaniPHP、Akelos等。这些框架最大的特点就是力求100%克隆RoR,不管是采用的架构、设计模式,还是使用方法。

      这几个框架一开始确实吸引了开发者的注意,但随着开发者的深入了解,这些框架头上的光环逐步褪色。晦涩难懂的架构、糟糕的性能,以及太多的限制,让这些框架难以在实际项目中运用。

      此时,许多PHP开发者认为可以借鉴RoR的设计思想,但不应照搬RoR的结构和实现。为此,一些同样推崇快速开发的框架开始在PHP社区出现。这些框架中,CakePHP和Symfony可谓佼佼者。

      CakePHP(http://www.cakephp.org/)

      CakePHP充满了RoR的影子,从ActiveRecord模式到视图的布局管理都和RoR非常相似。而且CakePHP一开始也尝试实现与 RoR一样的许多东西。但CakePHP的开发团队后来发现PHP语言和Ruby语言存在巨大区别,因此RoR中的许多设计即便能够在PHP中实现,也是缺乏实用价值的。

      CakePHP在发展中逐步走出了RoR的阴影,开始探索更能发挥PHP语言本身优势的架构和实现。因此有一段时间CakePHP的API发生了剧烈的变化,以致其他开发者纷纷停下脚步处于观望状态。

      但由于前期一些架构的不合理和对RoR太多的模仿,导致CakePHP的核心部分越来越难以理解,运行性能也不尽人意。而且CakePHP将一个庞大的数据库操作对象作为所有业务对象的基础。这虽然利于快速开发,但却导致对业务逻辑对象的测试非常困难。

      对于较小型的项目,CakePHP非常理想。出色的快速开发能力、丰富的API和详尽的文档都可以帮助开发者很快完成工作。但随着项目规模的增加,CakePHP的局限性也变得突出。

      Symfony(http://www.symfony-project.com/)

      Symfony是一个非常成熟的框架,大量利用了已有的开源项目。Symfony使用Mojavi的核心代码实现了框架的MVC模式,利用 Propel作为数据库抽象层。Symfony不仅功能强大,而且对Ajax有全面的支持。加上官方网站提供的大量文档和教程,并拥有一个活跃的社区,因 此受到许多开发者的欢迎。

      但是,Symfony最大的问题也在于使用了太多风格迥异的开源项目来组合成框架。由于Mojavi和Propel本身都相当复杂,因此Symfony的结构非常复杂,难以理解和学习。

      不过对于希望选择一个框架作为企业内部系统基础架构的企业来说,Symfony的成熟度、丰富的文档和活跃的社区都是值得考虑的。毕竟企业内部系统更为看重的是稳定性和长期的支持。

    商业利益与大道至简

      看到PHP开发框架的潜在商业价值后,Zend.com联合IBM宣布将要推出一个真正能够发挥PHP优势的开发框架。一时间,这个消息在整个PHP社区引起了地震。大家都开始期盼这个具有“官方”背景的开发框架能够为PHP开发者指出一条正确的道路。

      不过世事难测,就在Zend Framework团队公布几个代码片断后,立即就有开发者指出这些代码片段是不可能实现的。事实证明这些代码片段不过是美好的理想。限于PHP语言本身的能力,Zend Framework最终没有实现当初承诺提供的类似RoR中ActiveRecord模式的实现品。

      Zend Framework(http://framework.zend.com/)

      Zend Framework大量应用了PHP5中面向对象的新特征:接口、异常、抽象类、SPL等等。这些东西的应用让Zend Framework具有高度的模块化和灵活性。同时,因为严格遵循“针对接口编程”和“单一对象职责”等原则,让Zend Framework很有希望成为一个出色的企业应用开发框架。

      但不幸的是Zend Framework直到今天,也没有做出更多的突破。在使用Zend Framework开发时,框架对应用程序自身最重要的领域逻辑分离没有提供任何帮助。如果希望开发出真正健壮的企业应用,仍然需要开发者做出相当的努 力,并且在Zend Framework之上建造自己的基础设施。

      针对这点,批评者指出Zend Framework虽然大量应用PHP5的新特征,但却没有将这些相对于PHP4的优势转化为能够为开发者提供帮助的东西。

      对于简单和小型的项目来说,Zend Framework不但不能提高开发效率。反而因为在框架中应用了大量面向对象设计和PHP5的新特征,对开发者提出了更高的要求,间接增加了项目的开发成本。而对于较大的项目和企业应用,Zend Framework倒是一个不错的基础。但要创建一个成功的应用,仍然需要付出不小的努力。并且要时刻注意Zend Framewok的性能问题。

      Code Igniter(http://www.codeigniter.com/)

      Code Igniter可以说是一匹黑马。Code Igniter出现之时正是Symfony和CakePHP大行其道、Zend Framework万众期待的时刻。可凭借着独特的设计思想,Code Igniter吸引了大批开发者。这点从其火爆的官方论坛就可得到证实。

      Code Igniter推崇“简单就是美”这一原则。没有花哨的设计模式、没有华丽的对象结构,一切都是那么简单。几行代码就能开始运行,再加几行代码就可以进行输出。大部分日常开发中用到的东西都可以立即找到,并且可以很容易的使用。Code Igniter可谓是“大道至简”的典范。

      但是,Code Igniter本身的实现不太理想。内部结构过于混乱,虽然简单易用,但缺乏扩展能力。因此在发展到1.5系列版本时,作者不得不通过增加各种hooks来为框架提供扩展能力。

      国内PHP开发框架

      国内虽然过去也曾有开发者发布过一些框架,但这些框架要么太过简单,要么和某一类型的应用紧密耦合,缺乏通用性。直到进入2006年,随着PHP在国内的大量应用和追捧,真正的国产PHP开发框架才陆续发布。

      FCS(http://fcs.org.cn/)

      FCS是从Java的Struts 结构移植过来的中文PHP开发框架,使用面向对象的开发结构和MVC模式,并且模拟实现了Struts的标签库,借鉴了国外一些不错的思想,尤其是Java框架方面,因此熟悉Java的开发人员相对比较容易上手,其模版引擎、缓存机制、认证机制和扩展性方面均表现不凡。

      在借鉴国外优秀思想的同时,FCS也更多地考虑了国内的应用开发需要。PHP4兼容、完全支持UTF-8,以及PATHINFO支持等,更加有利于国内的主机环境和开发需要。秉着易用和易扩展的原则,FCS采用容易理解的项目、模块和操作机制加上内置的一些自动化操作方法,让应用开发变得更加简单,其功能可以通过基类库以及各种插件的形式灵活扩展,从而满足日益增长的业务需求。正是因为具备良好的开发结构,使得FCS在开发大型应用的时候并不会显得有很多障碍,基于构件的方式,以及配合框架的项目管理机制同样可以让你在处理大型应用的时候一展所长。

    FCS力求精简的代码和全中文化的文档、注释,有利于国内PHP开发人员学习和掌握,不过根据目前的情况来看,官方的文档和社区支持目前还比较缺乏,而且对Ajax的支持还不够全面,因此国内的应用成熟度还不够。

      FleaPHP(http://www.fleaphp.org/)

      FleaPHP从发展上看,是一个具有一定历史的框架。在过去三年中,FleaPHP是作者发布了从PFC1到PFC3系列和flea1试验框架后,推出的第一个真正成熟、稳定的开发框架。

      与许多其他框架不同,FleaPHP设计之初,就是围绕快速开发和充分利用PHP自身优势两个重点展开的。因此FleaPHP最大的特点就是极高的模块化程度和扩展能力。

      FleaPHP框架的核心非常小,但通过灵活的配置,可以组合出各种类型的基础架构。对于简单的脚本页面,FleaPHP不需要载入MVC模式,只需要为应用程序提供业务逻辑和数据库服务。而对于复杂的应用程序,FleaPHP可以完成从MVC模式调用、访问控制、数据验证到文件上传、图片处理等各种各样的任务。

      正是因为这种出色的定制和扩展能力,FleaPHP真正接近了“满足从简单应用到企业开发的各种需求”这个目标。而且与许多其他框架不同, FleaPHP是一个完全在实际开发中精炼出来的框架。因此伴随着FleaPHP的发展,各种各样的实际应用也相继出现。在FleaPHP官方网站上,可以看到各种各样的实际应用。从最简单的企业宣传网站,到复杂的社区网站、企业内部系统等等,不一而足。

      FleaPHP作为一个完全国产的框架,具有完全中文化的文档、代码注释,并且在扩展功能上也注重考虑国内开发者的实际需求。因此相对于国外的各种框架,FleaPHP更容易被国内开发者所接受。

      但是,也正因为处在国内,FleaPHP面临比国外同行多得多的困难。缺乏足够的贡献者、无礼的责难,以及充满怀疑的眼光,这些都让 FleaPHP的开发团队成员需要更多的奉献精神。而且由于缺乏足够的贡献者,FleaPHP框架目前在文档和扩展功能方面,与其他成熟框架相比还有不小的差距。

      并且与其他所有的PHP开发框架一样,FleaPHP也没有找到帮助开发者分离应用程序领域逻辑的途径。虽然有指导文档,但对于初级开发者来说,一个可以拿来就用的领域逻辑基础会显得很实用。

      反思与进取

      RoR带来的冲击波还远为平息,但PHP开发者们已经在开始反思一味追随RoR的脚步是否真的能够为PHP开发带来质变?

      RoR之所以能够取得如此巨大的成功,除了RoR本身的设计思想外,还有一个重要原因就是RoR充分利用了Ruby这种语言的特长。将Ruby 动态语言的优势发挥得淋漓尽致。而在PHP中如果只是单纯照搬RoR中设计,则要处处遇到PHP语言本身的限制。为了绕开这些限制,开发者不得不用一些难以理解的技巧来解决问题。但这样一来通常会导致框架的结构变得晦涩难懂、性能受到损害。

      在这种反思中,Code Igniter、FleaPHP等框架就是对这个问题的最好回答。只有充分利用PHP语言本身的优势,才能真正让PHP开发变得更简单、更有趣。

      发展到今天,各种PHP开发框架虽然具有各自的特色,但几乎都是为了提高开发效率而努力。但是,虽然其中部分框架注意到了提高应用程序可维护性的问题,但都没有为领域逻辑分离这个至关重要的问题提出解决方案。而这正是这些框架在未来的发展目标。

      对于简单的Web应用和复杂的企业应用,两者之间的差别就注定了采用一种固定的架构是无法满足需求的。因此像FleaPHP这样能够提供自定义架构能力的框架,可以让开发者尝试用一个框架的不同组合来解决从简单到复杂的不同程度的需求。

      未来,PHP将成为Web开发领域中越来越重要的平台。因此我们相信会出现更多更好的开发框架。虽然作为开发者来说,并不一定需要采用某一个框架来解决问题。但正是因为这些不断出现的框架,我们对使用PHP开发Web应用的理解和把握得到了一次次的推动。  
  • 解答Ubuntu 8.04 中gvfs-fuse-daemon的疑惑

    2008-04-30 16:37:12

      这两天很多刚刚装好Ubuntu 8.04 的朋友给我反映说,他们打开系统监视器后在文件系统中看到一个叫 gvfs-fuse-daemon 的“奇怪”设备,其挂载点为"~/.gvfs",类型为"fuse.gvfs-fuse-daemon"。

      gvfs-fuse-daemon 还“占用“了大量的磁盘空间,而且更奇怪的是 gvfs-fuse-daemon 这个设备的磁盘空间占用的情况和“/”目录是一样的,进入到这个“奇怪”磁盘的挂载点去里看,里面没有任何文件。种种疑惑我都会在下文给大家解答!

      什么是GVFS

      GVFS是GNOME新一种虚拟文件系统。GVFS是用来代替过时的Gnome VFS虚拟文件系统。GVFS算是Gnome 2.22中一个比较大的改动,也Gnome 2.22中一个主要的新特性。而Ubuntu 8.04 也把这一新的特性集成了。  
      gvfs-fuse-daemon 怎么在这里



      细心的Ubuntuer可能已经发现了系统监视器里多出来了一个gvfs-fuse-daemon的“奇怪”设备,在以前的发行版里都没有见过个设备,而且这个设备还“占据”了很大一部分磁盘空间。这是因为让不支持 gvfs 的一些程序也能利用 gvfs 的强大功能, gvfs-fuse-daemon 把 gvfs 上的文件挂载到 ~/.gvfs目录下.我们在系统监视器看到的它占用的空间都是虚拟出来的,它并没有占用这么大的物理空间。

      GVFS包括两个部分

      GIO,是一个新的共享库,其为GLib中的一部分,负责为GVFS提供API接口

      GVFS本身,这是一个新的软件包后端封装载有各种类型的文件系统和协议,比如sftp, dav, smb, obexftp等等.
     
      GVFS有什么用

      GVFS带来了一系列的新功能,由于篇幅有限我就说几个大家平时常用的。 gvfs-fuse-daemon 可以把网络连接挂载在本地系统的"~/.gvfs"目录上,让你在操作是时候就像是在本地上系统上操作一样。同时你所挂载的网络以及别的文件系统将会被保存在"~/.gvfs"目录下。你还可以在最新的Nautilus中,你可以直接使用cdda://协议来访问CD,CD音轨将以WAV文件的形式可以直接得到。下面常用的FTP协议为例简单介绍GVFS的作用。




      在Nautilus中输入ftp://ftp.ubuntu.com后,FTP的目录就挂载在了 /home/ownlinux/.gvfs 目录上了(即为“~/.gvfs 目录”)。



    远程的FTP目录也被自动挂载到了桌面上

     


    卸载该目录也很新简单,只需要点击鼠标右键然后点卸载

     


    同时也被挂载到了computer:///目录上,即为文件浏览器中“计算机”的那个目录

      后记:我只是简单的给大家介绍了一下 gvfs-fuse-daemon ,主要目的就让大家对 gvfs-fuse-daemon 有一定的了解。其实系统监视器告诉你它”占用“的空间都是虚拟出来,不要被它“庞大”的体积吓倒。GVFS的功能远远不止我说的这些,由于篇幅有限,我就是一一介绍了。我会在以后的使用过程中给大家进一步的讲解。 
  • 用Java快速开发Linux GUI应用

    2008-04-29 09:12:15

      1、为什么要用Java开发Linux GUI应用

      1.1 Linux GUI应用开发现状

      目前Linux操作系统在市场上呈现一种"叫好不叫座"的局面,在一定的程度上与在其上运行的好用的应用程序数量太少有着的密切的关系。尽管能在Linux上运行的应用程序已经很多,但大多数都较难安装与使用,而且很多不是很稳定。

      要改善Linux应用程序的易用性,大量采用GUI(图形用户界面)是一个必然的趋势。但是目前Linux平台GUI应用程序的开发仍然不太容易。尽管有不少的开放源码开发工具在极力增强其GUI应用程序开发能力,但是由于标准不统一、资料太少等原因很难推广。Kylix等商业开发工具尽管具有大公司的技术实力支撑,但由于价格等因素也难以很快推广。这种局面不尽快打破,Linux的应用就不可能得到很快的普及。

      综上所述,目前Linux应用软件开发领域急需一种容易学习、成本低、效率高的GUI应用程序开发方法。

      1.2 Java的特点

      自1995年Sun Microsystem推出Java语言以来,Java语言与Java技术均得到了飞速的发展。因其强大的网络功能、良好的跨平台特性、较高的开发效率成为国内外软件开发领域的一种强大工具。

      目前Java程序已经能运行在从Windows系列、Unix系列、Mac OS系列到Linux等几乎所有操作系统平台上,而且特别重要的是它已经能做到"一次编写,到处运行";另一方面,与C++等传统程序设计语言相比,用Java来开发GUI应用程序的难度已经大大降低;加上Java语言所具有的纯面向对象、网络功能强大等特性,使得Java非常适于用来编制应用软件。

      1.3 用Java开发Linux GUI应用的优点

      正由于Java语言的特点以及Linux操作系统的发展现状,使得用Java语言来开发Linux平台GUI应用程序成为了一种很好的方法。

      一方面,用Java语言在Linux平台上开发GUI应用程序对于习惯了在Windows平台上用Java编程的程序员来说无须改变编程习惯。因为Java有良好的跨平台特性,在Linux下编程与在Windows下编程没什么两样,如果用纯Java编程,则程序中使用的类、属性、方法等等都不用改变,甚至还可以在Windows下编辑、编译好Java程序再直接移植到Linux下执行。

      另一方面,由于在Linux平台上存在大量的优秀的开放源代码软件开发工具,包括用于Java程序开发的如NetBeans等工具,这样如果在Linux平台上用这些开放源代码软件开发工具进行Java软件开发,其所需的成本可以比在Windows下进行开发低得多。当然在Linux下也存在像Borland Jbuilder、IBM Visual Age等商业Java软件开发工具,它们都具有强大的功能、完备的文档,更有利于在Linux上进行Java软件开发。

      2、用Java开发Linux GUI应用的基本方法

      2.1 开发环境的安装与配置

      *JDK的安装

      要Linux平台上开发Java应用,最基本的方式需要下载一个JDK,这是由Sun公司免费提供的一个Java软件开发包。下载得到的文件一般形如j2sdk1.3-linux.rpm.bin,首先将其拷贝到合适的目录(如/usr/src或/usr/local等)下,执行. /j2sdk1.3-linux.rpm.bin,会产生一个j2sdk1.3-linux.rpm文件,这是一个典型的RPM软件包,再用RPM软件包管理工具就可直接安装JDK,在安装过程中会提示许可信息,同意其协议就可很顺利地安装了。

      *路径的配置

      为了做到在任意路径下均可直接执行Java编程相关命令,需要修改/etc/profile文件,在其中设置路径。具体方法是在其中加入这样一行:

      PATH="$PATH/usr/jdk1.3"

      这里/usr/jdk1.3是JDK的安装路径。

      2.2 基本开发过程

      ①编辑源程序

      在Linux下有很多优秀的程序编辑器软件,例如在控制台下有著名的Emacs、vi、 jed等,在X window下有Xemacs、gedit、kedit等,这些软件通常都有语法着色、自动缩进等非常适合于程序编辑的功能。要在Linux系统下开发 Java程序,首先需要用这些编辑器编辑Java源程序。至于具体用哪种编辑器要依个人的喜好而定,反正可用的软件很多。

      ②编译源程序

      正确的编辑好Java源程序后,需要对其进行编译,以生成字节码文件。假定源程序文件名为Test.java,则可用如下形式:

      javac Test.java

      ③调试运行程序

      执行守编译命令后,对于源程序中的每一个类,系统将产生一个字节码文件,文件名为对应的类名,而其扩展名为class。一般地,每一个Java程序中应该有一个主类,该类是整个程序的入口。开发Java程序的下一步就是调试运行,仍以上面提到的情况为例,运行该Java程序的方法为:

      java Test

      事实上解释器将解释执行Test.class文件并按其中的调用解释执行其它字节码文件。

      2.3 基本开发方法

      其实无论在什么平台下,GUI应用程序的基本开发方法都是相似的。一般都包括下面这样四个步骤:

      ①创建容器

      首先要创建一个GUI应用程序,需要创建一个用于容纳所有其它GUI组件元素的载体,Java中称为容器。典型的包括窗口(Window)、框架(Frame/JFrame)、对话框(Dialog/JDialog)、面板(Panel/JPanel)等。只有先创建了这些容器,其它界面元素如按钮(Button/JButton)、标签(Label/JLabel)、文本框(TextField/JTextField)等才有地方放。

      ②添加组件

      为了实现GUI应用程序的功能,为了与用户交换,需要在容器上添加各种组件/控件。这需要根据具体的功能要求来决定用什么组件。例如,如果需要提示信息,可用标签(Label/JLabel);如果需要输入少量文本,可用文本框(TextField/JTextField);如果需要输入较多文本,可用文本区域(TextArea/JTextArea);如果需要输入密码,可用密码域(JPasswordField)等等。

      ③安排组件

      与传统的Windows环境下的GUI软件开发工具不同,为了更好地实现跨平台,Java程序中各组件的位置、大小一般不是以绝对量来衡量,而 是以相对量来衡量。例如有时候,程序的组件的位置是按"东/East"、"西/West"、"南/South"、"北/North"、"中 /Center"这种方位来标识的。因此,在组织界面时,除了要考虑所需的组件种类外,还需要考虑如何安排这些组件的位置与大小。这一般是通过设置布局管 理器(Layout Manager)及其相关属性来实现的。事实上上述按方位来安排组件就是采用了Java中多种布局管理器里的BorderLayout布局管理器。

      ④处理事件

      为了完成一个GUI应用程序所应具备的功能,除了适当地安排各种组件产生美观的界面外,还需要处理各种界面元素事件,以便真正实现与用户的交 换,完成程序的功能。在Java程序中这一般是通过实现适当的事件监听者接口来完成的。比如如果需要响应按钮事件,就需要实现 ActionListener监听者接口;如果需要响应窗口事件,就需要实现WindowListener监听者接口。

      3、开发实例

      下面是一个在Linux下用Java开发GUI应用程序的实例。该程序的主要功能是提供一个用于输入用户名与密码以登录到某一系统的界面,如果 用户输入相关信息后单击"登录"按钮,系统将在窗口的下半部分显示所输入的用户名与密码信息,如果单击"退出"按钮,程序将停止运行。如下图1所示:

      本程序没有提供很强的功能,目的只在于介绍在Linux上用Java编写GUI应用程序的基本方法。以下是程序的源代码,其中的注释说明了GUI应用具体的创建步骤:

      //以下三行用于引入添加组件、设置布局管理器及处理事件所需的软件包

      

          import java.awt.*;

      import java.awt.event.*;

      import javax.swing.*;

      //下行说明主类派生自JFrame/框架类,要实现ActionListener接口以处理动作事件

      class LoginFrame extends JFrame implements ActionListener {

      //以下四行用于声明要加到框架窗口中的所有组件

      JLabel UserLabel,PasswordLabel,UserResult,PasswordResult;

      JTextField User;

      JPasswordField Password;

      JButton LoginButton,ExitButton;

      public LoginFrame() {

      super("登录");//调用父类构造方法,设置窗口标题

      setSize(300,200);//设置窗口大小

      getContentPane().setLayout(new GridLayout(5,2,10,10));//设置布局管理器,将窗口分成5行2列,行、列间保留10个像素的空白

      //以下8行具体创建组件实例

      UserLabel=new JLabel("用户名称:");

      PasswordLabel=new JLabel("用户密码:");

      UserResult=new JLabel(" ");

      PasswordResult=new JLabel(" ");

      User=new JTextField(10);

      Password=new JPasswordField(10);

      LoginButton=new JButton("登录");

      ExitButton=new JButton("退出");

      //以下两行设置用于保存结果的标签的前景色属性

      UserResult.setForeground(Color.blue);

      PasswordResult.setForeground(Color.blue);

      //以下两行为"登录"按钮与"退出"按钮注册监听者

      LoginButton.addActionListener(this);

      ExitButton.addActionListener(this);

      //以下八行将所有组件加入到框架窗口中

      getContentPane().add(UserLabel);

      getContentPane().add(User);

      getContentPane().add(PasswordLabel);

      getContentPane().add(Password);

      getContentPane().add(LoginButton);

      getContentPane().add(ExitButton);

      getContentPane().add(UserResult);

      getContentPane().add(PasswordResult);

      //以下一行用于窗口事件监听者注册

      addWindowListener(new WindowManager());

      setVisible(true);//使框架窗口变为可见

      }

      //以下函数用于处理按钮动作事件

      public void actionPerformed(ActionEvent evt)

      {

      if(evt.getSource()==LoginButton)//表明按下了"登录"按钮

      {

      UserResult.setText("用户名称:"+User.getText());

      PasswordResult.setText("用户密码:"+Password.getPassword());

      }

      else

      if(evt.getSource()==ExitButton)//表明按下了"退出"按钮

      {

      dispose();

      System.exit(0);

      }

      }

      //以下为系统主函数,是程序的入口

      public static void main(String args[]) {

      LoginFrame mainFrame = new LoginFrame();//创建框架窗口实例

      }

      }

      class WindowManager extends WindowAdapter//窗口事件监听者类

      {

      public void windowClosing(WindowEvent evt)//本方法用于窗口关闭事件

      {

      JFrame frame=(JFrame)(evt.getSource());

      frame.dispose();

      System.exit(0);

      }

      }

      4、总结

      用Java语言来开发Linux平台的图形用户界面应用程序,容易理解、容易学习、环境要求低、开发效率高,而且开发出来的应用程序可移植性 好,可以直接移植到其它平台上运行而不会发生多大变化。这对于快速开发Linux GUI应用软件,丰富Linux平台应用软件的种类,增强Linux应用软件功能,从而更好地普及Linux系统的应用都有巨大的推动作用。

    来自:IT专家网
  • Phusion Passenger/mod_rails令Rails部署变得更容易

    2008-04-25 09:50:44

      一个旨在从Apache网页服务器上更便捷的部署Ruby on Rails的新项目诞生了。Phusion Passenger/mod_rails似乎已经实现了这个目标,并得到了Rails官方和很多人的推荐。我们采访了Phusion Passenger的创建者之一,Ninh Bui,想了解一下项目背后的故事和它未来的发展方向。

      首先,我们想弄清楚名字的问题──这个项目的网站是modrails.com,但是名字却起为Phusion Passenger。Ninh Bui是这么解释的:

    Phusion是我们公司的名字,然而Phusion Passenger是mod_rails官方的名称。大多数社区的朋友都会从mod_rails这个名字中了解它的用途,因为它的命名方式为传统的mod_*,所以我们由此保留了这个别名。

    尽管起初我们打算就只叫它mod_rails,但是Ruby on Rails核心团队和我们都认为“Passenger”(乘客)要比用一个Rails词汇更贴切。特别是,我们想让Phusion Passenger(也就是mod_rails)为用户带来的体验与(火车)乘客是一致的:只要坐在那里,便可享受乘坐的乐趣;-)。

      另一个问题是关于Phusion Passenger所发放的许可:

    对于许可来说,我们使用的是GPLv2,并附加了一个额外的条款。大家通常都会对许可产生误解,也正好趁此机会把这些问题一并加以解释:我们实际上已经允许社区对源代码做更广泛的应用,而不是限制这个许可。

    同样,我们有很多在开源社区工作的经验,我们是与它一起成长的。我们相信,将开源的开发模式与商业公司的驱动结合起来,会令我们提供更好的产品。换句话说,我们认为,对于商业机构来说,这是一种回馈社区最好的方式。

    拿Phusion Passenger为例,它的设计和开发是为了追求产品环境(production environments)下的稳定与高效。然而,可能会有人在部署的时候遇到问题,或者需要某些特定的功能。我们会为这些人提供付费的商业技术支持。我 们团队的技术专家在各个领域都有着丰富的经验──特别是基于Linux的环境下──并且对Ruby的内在机理、Ruby on Rails和Passenger都很熟悉。

      我们都很好奇,Phusion Passenger在应对Rails部署中类似的解决方案时是如何进行叠加的:

    与Swifiply、Mongrel Cluster等不同,Phusion Passenger的应用池(application pool)是在当前流量的基础上进行自动管理的。还有就是,如果Rails应用程序崩溃了,它会自动重启。这意味着,配置或者进程监控都是多余的,而且这 会削减系统管理的成本。有很多种配置选项是可用的,它们都被记录在用户指南中了。

      我们感兴趣的是,究竟如何用Phusion Passenger去部署和重新部署Rails应用程序。

    只要花费你两分钟的时间,不过这要看你的网速如何了;-)。开个玩笑。用Phusion Passenger更新并且重新部署你的Rails应用程序只需再上传一次应用程序,并调用restart.txt。要做的,就这么多。如果你想重新启动 Apache(我认为大多数人可能都想这么做;-)),就必须做第二步。

    从技术角度来讲,第二步是用来更新restart.txt文件中时间戳的,Phusion Passenger会根据那个时间戳决定是否重启你的Rails应用程序。

      Rails部署并不是Phusion开发者试图解决的唯一的问题。当运行很多Rails进程时,内存占用过多也是一个问题。每 个Ruby进程都必须把Ruby和Rails函数库载入到内存中──因为这些是不同的进程,此时它是没有被共享的(Ruby代码是储存在堆栈中的,所以不 像共享的函数库,在不同进程中是无法共享的)。

      Phusion的一位开发人员,Hongli Lai试图通过Unix系统函数fork()让Ruby不同进程之间共享数据。它的核心思想是首先获取一个设置好函数库的Ruby进程,然后通过fork()让进程去获取其他的进程。在进程中调用fork(),可以说是一种非常有效复制进程的方式。这两个进程基本上是一样的,在它们的地址空间中包含有相同的数据。但是,这不是共享内存,而是系统的虚拟内存,操作系统调用了一个名为Copy On Write(写 时复制,简写成COW)的方法让不同进程可以读取相同的数据,但是却没有修改它们私有的拷贝。只要数据是只读的,那么有一份数据就够用了。不过,一旦进程 开始对数据进行了修改,数据的拷贝就只能归属于这个进程了。很明显,共享只读数据(例如函数库代码或其他类似的)是一种非常可行的方法。

      然而,对于使用垃圾回收的编程语言来说,存在一个问题:完整的垃圾回收会遍历堆栈,并将所有遍历到的对象作标记。这里面很重要的一个词是“作标记”──在对象上插上一面旗。如果这些对象中的任何一个被其他进程(通过fork())共享了,COW便会起作用,并将数据拷贝过来──这意味者数据不会再被共享,所有进程都拥有它自己的拷贝。

      Hongli Lai针对这个问题的解决方案是令Ruby的垃圾回收器COW的更友好,也就是说,回收的时候不会再引起数据的拷贝。Ninh对这个问题和它与Phusion产品之间的关联进行了详细的阐述:

    COW垃圾回收器已经基本上完成了。我们现在正准备发布并建立它的官网。而且,我们还在屯特大学(University of Twente)的ir. Hans Scholten帮助下撰写了一篇相关的论文。未来几周内,我们就会发布一个版本。我们理解大家可能不太喜欢为Ruby打补丁,所以我们付出很多额外的努 力来确保安装尽可能的简单,而且要完全独立,不要涉及任何的系统文件。

    我们会把它同“Ruby企业版”(是的,我们很清楚这个名字,但是请允许我们在Railsconf上对它作详细说明;-))一 起发布。恳请大家对我们有一些耐心,我们向你保证,那将是非常值得关注的东西。还有一点要注意的是,Ruby企业版是完全与标准Ruby版(1.8)向后 兼容的。

    如果Phusion Passenger被应用到Ruby企业版上,那么Passenger会自动使用COW语义。这可令Rails应用程序大幅节省使用的内存。实际上,先前的测试已经表明平均会节省33%的内存使用量。

    认真的读者将会注意到,Ruby企业版是以一种透明的方式完成这些工作的,而且同样为程序开发者提供了在运行时打开和关闭GC优化的功能。因为这个原因,Ruby企业版应当算作Ruby的一个超集(superset)。

    由此,我们不得不改变Ruby堆栈的执行方式。它现在使用了一组作了标记的位阈(bitfield),而不是在对象中对二进制 位(bit)进行标记。它的性能有些不确定,这要取决于应用程序和工作量的大小。在一些Rails应用程序中,我们进行了测试,有的提高了5%,有的提高 了20%,有的则是0%,也就是说,性能没有变化。如果您想了解更多的相关内容,我们会在Railsconf上对这个现象作详细的阐述,或者日程上允许的 话,可能会提前给大家讲讲。

      如果大家想试用一下Phusion Passenger,Phusion网站上提供了一个基础视频教程或者直接查看安装文档。Phusion Passenger是一个开源项目,你可以到Phusion Passenger的GitHub的repository中获取源代码。

  • 如何使用Linux加密软件Cryptmount

    2008-04-23 16:49:04

      Cryptmount是一种Linux加密工具,能够进行强大的文件加密,让没有权限的Linux用户更方便地进行管理和让管理员轻松创建高级的设置。你能够加密整个硬盘分区或者通过把每一个加密的文件系统存储在一个文件中来创建若干个加密的分区。Cryptmoun还能够用来加密交换空间。加密的卷需要根权限才能创建。然后,普通用户能够打开和关闭加密的卷,不需要根权限。

      Cryptmoun的功能还有:

      ·用户能够改变自己的口令

      ·加密的文件系统能够在启动时或者根据需要进行初始化。因此,加密的文件系统很容易管理。这种文件系统只是偶尔需要。

      ·加密的访问密钥是兼容OpenSSL的。Cryptmount支持把访问密钥存储在移动介质上。

      ·它提供对脚本的支持。

      Cryptmount是一种前台的和标准的Linux加密工具、映射机和dm-crypt加密工具。它使用Linux内核中的环回(loopback)设备在文件中创建加密的文件系统。但是,用户并不需要知道这些事情,因为Cryptmount为这种文件提供了一个友好的外观。

      在为一个加密卷进行初始化设置时,第一步是运行Cryptmount设置指令。它创建一个加密密钥,要求得到位置和规格,创建正确的 /etc/cryptmount/cmtab目录,然后再要求你创建一个口令。接下来,没有权限的用户就可以使用了。这种用户仅需要知道口令和两个指令: cryptmount [卷名]和cryptmount --卸载[卷名]。如果你确实要做得更漂亮一些,你可以创建一些菜单图标供用户点击。

    来自:IT专家网 作者:王娟
  • 实现Linux个性化面版时钟显示

    2008-04-23 14:09:42

      默认情况下,GNOME桌面的面版的时钟小程序只有少许的可控制选项,我们只能选择12/24制式,或者选择日期/秒针的显示。

      现在,这则小技巧让你完全自由的控制你的时钟显示。

      首先打开终端或按Alt+F2,运行gconf-editor,定位至:/apps/panel/applets

      找到你的“时钟”Applet,像我这里是applet_1,再定位到prefs。

      现在,你只要以HTML语法和 strftime格式,就能定义你想要的样式和效果,在custom_format处输入定义的样式,并在format处改成custom,就可立即生效。



    图1 配置界面

      比如,我输入:%Y %B %d %A%H: %M,并将format设定为:custom。那么效果将会如下图所示:



    图2 面板显示

      当然我定义的比较难看,大家可以根据自己的喜好,设定出喜欢的样式。下面是strftime的格式参考:

      %a 星期几的缩写。

      %A 星期几的全名。

      %b 月份名称的缩写。

      %B 月份名称的全名。

      %c 本地端日期时间较佳表示字符串。

      %d 用数字表示本月的第几天 (范围为 00 至 31)。

      %H 用 24 小时制数字表示小时数 (范围为 00 至 23)。

      %I 用 12 小时制数字表示小时数 (范围为 01 至 12)。

      %j 以数字表示当年度的第几天 (范围为 001 至 366)。

      %m 月份的数字 (范围由 1 至 12)。

      %M 分钟。

      %p 以 ‘AM’ 或 ‘PM’ 表示本地端时间。

      %S 秒数。

      %U 数字表示为本年度的第几周,第一个星期由第一个周日开始。

      %W 数字表示为本年度的第几周,第一个星期由第一个周一开始。

      %w 用数字表示本周的第几天 ( 0 为周日)。

      %x 不含时间的日期表示法。

      %X 不含日期的时间表示法。

      %y 二位数字表示年份 (范围由 00 至 99)。

      %Y 完整的年份数字表示,即四位数。

      %Z 时区或名称缩写。
  • 十分钟快速架设Linux下的WebMail

    2008-04-23 09:47:17

      目前,网上能找到不少WebMail软件,但多为商业软件,动辄支持百万级用户。它们虽然功能很强,但对
    一般单位来讲,有点儿"大材小用"。那么,能否找到这样一个WebMail:免费的、对中文支持较好、能够让用户既保留原有使用习惯又能通过Web界面收发邮件?

        Open WebMail由Perl编写,遵循GPL版权,可运行于多种版本Linux/Unix上,对系统要求低,只需拥有支持CGI的Web Server和Perl 5.005及以上版本即可,无需数据库支持,安装容易,维护方便。作为一个轻量级的Webmail软件,Open WebMail较好地实现了收发邮件的各项功能,完全能满足一般的应用。它对系统要求低,维护方便,非常适合在科研院所、大专院校中使用。笔者所在实验室 (运行环境为:邮件服务器 DELL L667r,配置为PⅢ667MHz/128M/15GB,RedHat6.2/Apache 1.3.12/Perl 5.005_03,用户数120人左右)已使用它半年多,运行良好,得到了用户的认可。

        下面就以RedHat 6.2为例,介绍一下Open WebMail 的安装方法。我们假设所有软件存放于/tmp目录,所有操作以Root身份进行。

        1、准备工作

        从网站下载如下软件包:

        CGI.pm-2.74.tar.gz

        MIME-Base64-2.12.tar.gz

        Authen-PAM-0.12.tar.gz

        ispell-3.1.20.tar.gz

        hc-30.tar.gz

        以CGI.pm为例,安装方法如下:

        cd /tmp

        tar -zxvf CGI.pm-2.74.tar.gz

        cd CGI.pm-2.74

        perl Makefile.PL

        make

        make install

        其它软件包的安装类似。

        2、下载openwebmail-X.XX.tgz ,做如下操作:

        cd /home/httpd

        tar -zxvBpf /tmp/openwebmail- X.XX.tgz

        mv data/openwebmail html/

        rmdir data

        3、配置

        (1)在/home/httpd/cgi-bin/ openwebmail目录下修改 openwebmail.pl、openwebmail-main.pl、openwebmail-prefs.pl、spellcheck.pl和 checkmail.pl,把其中的/usr/local/www/cgi-bin/ openwebmail改为/home/httpd/ cgi-bin/openwebmail 。

        (2)修改 auth_unix.pl 把shadow文件设为 /etc/shadow

        (3)修改 /home/httpd/cgi-bin/ openwebmail/etc/openwebmail.conf,根据机器配置调整mailspooldir、ow_htmldir、 ow_cgidir、spellcheck 等参数,并设定 Webmail 的缺省参数,如邮件夹限额、闲置时间、背景、缺省签名档等。

        (4)修改/etc/sendmail.cf,在Trusted users中加入Thttpd_user,其中httpd_user根据系统设置来定,如nobody或apache。

        4、测试:打开浏览器,输入 your_server/cgi-bin/openwebmail /openwebmail.pl 即可。

      来自:IT168 服务器学院
  • Ubuntu 8.04 LTS RC之升级手册

    2008-04-18 15:20:07

      Ubuntu 8.04 LTS RC本计划于今日发布,不过因为软件包打包的一个小问题,要延误一天.

      这只是针对全新安装的用户来说的,假如你只是想将原有的Ubuntu系统升级至最新的Ubuntu 8.04 LTSTS,那么你可以开始行动了!因为网络上已经准备好了!本文是从Ubuntu 7.10下进行升级,Ubuntu 7.04、Ubuntu6.10等系统类似.

      一、准备工作

      在升级至Ubuntu 8.04 RC时,请确保你备份了重要文件,以避免升级失败带来的损失。

      另外请保证根目录有大量剩余空间(至少2GB以上),因为升级过程中将下载大量新版本的软件包(视你原系统的软件包数量),最后,保证网络畅通即可。

      二、开始升级

      打开你的终端,输入update-manager -c -d(不需要sudo),然后“更新管理器”即会启动,进行发行版的检测。如果正常的话,将会显示“新发行版 ‘8.04 LTS’ 可用”。如下图:



      点击“升级”后,将会弹出发布说明,你会看到你升级的目标,Ubuntu 8.04 Hardy Heron 的Release Candidate,确认后,再点“升级”。



      接下来都是比较智能的升级过程,只有很少的交互动作。

      需要注意的是,在获取完新的软件包,开始安装之前,你随时可以“取消”升级,如果一旦软件包下载完毕开始升级了,你就不能再取消了。

      更新升级工具,从网上下载最新的升级工具,以确保升级顺利。



      准备升级



      如果你事先没有修改过sources.list的话,将会出现下面的对话框,毫无疑问,选择“是”,这样软件源都将更新为hardy的版本。



    自动设定完源后,就开始更新软件频道,相当于我们在终端下执行apt-get update。



    更新完后会有软件包支持方面的提示



      经过短暂的计算以后,更新管理器将会显示升级的详细信息,包括将被删除的软件包,将新进的软件包和将升级的软件包。

      值得注意的是,大概是中文翻译的问题,升级的时间是有误的。应该是2小时0分,它居然显示2天0小时,这个错误从6.10开始就被“继承”下来了。



      接着就开始获取新的软件包了,这是你最后能后悔的时候,不想升级就点“取消”吧。过了这里就要跟旧的Ubuntu说拜拜了,当然你也可以强制重启来取消升级。



      经过了“1天28小时”以后,软件包获取完毕,正式开始升级。这次显示正常了,依软件包的数量,大概需要30分钟到1个小时之间。



      经过了又一段漫长的等待,终于快安装完成了,最后一个步骤是:清理废旧软件包。



      确保列表里的软件包你都不需要了,然后移除吧!



      不要犹豫了,现在就重启吧!



      假如,一切顺利的话!重启后,登入你的帐户,全新的Firefox 3将会自动打开,并以Welcome to Ubuntu 8.04 LTS的主页来欢迎你!



      恭喜你进入Ubuntu 8.04的世界!

      后记:

      我自Ubuntu 6.10开始使用Ubuntu,每当新版本发布时,我也都采用这种升级方式。不过从6.10到7.04,从7.04到7.10的两次升级,均未成功过,只好完全重装。

      不过这次从7.10升级至8.04,非常顺利,升级后的系统非常稳定,之前所有的应用都完整的继承了下来(Apache2、Mysql等)。

      不知能否说明Ubuntu的版本升级功能越来越完善了呢?还有待大家的考验!

    来自:Linux论坛
  • Java技术:嵌入式LINUX中的JVM研究

    2008-04-17 09:19:48

      Linux具有内核可裁剪、效率高、稳定性好、移植性好、源代码开放等优点,还内含了完整的TCP/IP网络协议栈,很适合在嵌入式领应用。专用的嵌入式Linux系统往往只有几M到十几M,包含内核和特定的硬件驱动程序和应用程序,能够被嵌入式设备的FLASH容纳。但是,其复杂的系统体制,简单有限的开发手段,使Linux下的应用程开发受到了很大的限制。

      JAVA语言的优势在于其强大WORA(平台无关性)能力,为程序员提供了很方便的跨平台程序设计能力。而JVM则具有了针对不同平台,对同一JAVA代码进行编译和运行的功能。这样程序员的编程真正意义上抛开了操作系统和计算机平台之间的壁垒,实现了程序的通用性。

      将JVM和嵌入式LINUX接合起来,开发适合嵌入式系统硬件和软件要求的JVM,能够极大地简化嵌入式LINUX上软件开发的复杂度,能够在任何地方,任何PC上用JAVA进行开发而不需要专门的硬件环境进行调试。这将是嵌入式系统软件开发上的革新。

  • GNU/Linux 中的教学辅助软件简介

    2008-04-16 13:38:28

      随着台湾友人发布Ubuntu小学教材,瑞士日内瓦所有学校的电脑将只安装Ubuntu Linux 操作系统,引起了业内对Linux在教学方面的关注,同时也有人提出了质疑.Linux能提供教学方面的解决方案吗?Linux下有教学辅助软件吗?现在马上在下文为大家进行解答.

      我们知道学习有时候也很枯燥,在学习的过程中孩子很容易感到疲倦.为了改善这一现象,恐怕只有让孩子们在游戏的过程中学习才能有效的解决.以下软件开发者在开发的时候就已经把这一系列的问题考虑到了.

      为儿童设计的多功能学习启蒙软件:

      GCompris — GCompris是一套用于年龄介于2 -10的儿童的学习启蒙软件,该软件是以在游戏中学习的思路开发。这个软件化分不同的类别(如,计算机,数学,游戏),其中有很多不同的任务。在完后这些任务的过程中会拓宽知识面,这里面的许多些任务都有实际用途,例如在一个杂货店里何如花钱等等。该程度界面友好,有很多卡通的图标,非常适合这一目标年龄段。虽然这套软件还处于发展阶段,但它目前已经包含约80个练习。



      GCompris运行时的界面

      Childsplay — Childsplay为专为年纪小的学生设计,该软件能在游戏中引导他们学习数学、英语。大多数游戏是游戏任务是锻炼大脑我的记忆力的。在视听效果方面Childsplay做得相应不错,充多地调到眼睛和耳朵配合在到学习中,Childsplay在这方面的细化比GCompris做得要优秀一点,但练习的内容要比GCompris少一点。



    Childsplay 运行时的界面

      数学类:

      kmplot — 此应用程序是一个功能强大的坐标系统(你是可以自由选择:图中的参数和函数,如笛卡尔,极坐标)



    kmplot 运行时的界面
     
      tuxmath — 为小孩们设计的在游戏中学习数的软件,何果运算正确可以阻止小行星走向我们,否则该小行星将摧毁我们的城市。



    tuxmath  运行时的界面
     
      化学类:

      kalzium — 是一张元素周期表,我们可以通过它查看元素原子量和质量等等信息,并配有与之相关的图片.通过它还可以知该元素是哪个国家的哪位科学家最先发现的。该软件还包含一个模块,根据给定的公式可以计算出化合物的的摩尔质量。



    kalzium 运行时的界面

      地理学类:

      kgeography — 一个KDE下学习地理学的软件,其包含20多种地图

      googleearth —  是一个应用为主的软件,但还比它还好的用来查看全球地理的软件吗?当然把它用在教学中也是一个不错的选择。

      天文学类:

      celestia —  celestia是一个用3D方法来模拟外太空的软件,通过它,我们可家中也在太空中自由翱翔.此应用程序具备丰富的数据库,很多天体,都能在其三维环境中看到。

      Linux下用于教的软件远不至这些,由于篇幅的因原我在这里就不在一一介绍了,点击下面的链接查看更多Linux下用于教学辅助的软件

      http://bbs.ownlinux.cn/viewthread.php?tid=238&extra=page%3D1

      瑞士日内瓦所有学校的电脑将只安装Ubuntu Linux 操作系统后,势必会有更多开发人员在Linux平台下的从事教育辅助软件的开发工作,与此同时,更多更好的教学辅助软件的出现,也能有效地带动更多的学校的把计算机的操作系统过度到Linux平台,二者相互促进,使之进入一种良性循环.

      来自:www.Ownlinux.cn 作者:Ownlinux
  • Radiant:基于Ruby on Rails的内容管理系统

    2008-04-08 10:13:06

      Radiant是一个开源的CMS[内容管理系统],建立于Ruby on Rails。Radiant是为一些小的开发团队而创建的[Publishing for Small Teams],因为它的相关操作需要一些编程知识。Radiant的操作界面很简洁,这为创建设计和内容提供了较高的灵活性。



      Radiant主要由三部分组成:页面,代码片断(比如包含PHP)和布局,这三个部分共同创建了一个系统核心,维持整个系统的运转。

      Radiant提供了一个灵活的网站结构,页面可以根据任何等级安排。 Radiant有一个专门的可定制的页面编写语言Radius(类似HTML),它可以用来建立页面和布局且其中包含其它页面内容的展示,这和wordpress及其他开源平台一样,拥有较高的可定制性,但是相对来说Radiant的可定制性要比WordPress更高。与此同时,它还具有智能的缓存机制。

  • 值得一试的Granular Linux发行版

    2008-04-07 11:18:07

      Linux.com的文章介绍了Granular Linux,一款基于PCLinuxOS的桌面导向的发行版,首要目标是易于使用和界面友好。

      作者在一台1.60GHz Pentium 4、512内存的电脑山进行了测试: live CD安装很简单,根据它的提示一步步进行就可以。拷贝文件只用了不到5分钟,完全安装不到15分钟。

      Granular支持两种菜单样式:KBFX是Granular自己的,Kickoff则是类似SUSE的。它的默认桌面是KDE,默认视频播放器是Kaffeine,MPlayer可选,使用Synaptic软件包管理工具。

      作者的总结是“依靠一张单碟上包容的程序,Granular Linux提供了能满足普通终端用户需要的大部分软件,没有安装的应用程序也可以通过Synaptic增加。但它在我电脑上测试中出现的显卡上的一些小问题和声卡上的严重问题显示Granular还有许多缺陷,尤其是绝大多数发行版都能在这台电脑上正常工作。但是作为Granular 1.0 的预览版,这或多或少可以原谅。

      对于哪些有兴趣尝试新发行版的用户来说,Granular Linux值得试用。”。
  • Linux - Wine上运行MS Office 2007教程

    2008-04-03 09:48:12

      三个月前,国外的Wine Review小组首次将Microsoft Office 2007通过Wine运行在Linux上。  

      不过因为方法异常烦琐,作者没把方法公布出来.现在,随着Wine的不断进步,任何人都可以方便地将Microsoft Office 2007运行在Linux上了!

      想在你的Linux上运行起Wine,先看看你的系统是不是具备以下条件:

      Wine 0.9.58。
      CrossOver Games。
      对,你需要最新的Wine 0.9.58和一份CrossOver Games。放心,我们不需要购买CrossOver Games,只需要下载一份它的7天试用版即可,只需要其中一个文件。
      Wine最新版的deb包(Debian/Ubuntu)可以访问下面的页面下载并安装:
      http://wine.budgetdedicated.com/archive/index.html
      下载CrossOver Games的7天试用版可访问:
      http://www.codeweavers.com/products/cxgames/download_trial/
      OK,假设你一切都准备好了(包括Microsoft Office 2007的安装镜像),那么开始吧!
      0、创建干净的Wine环境
      打开终终端,运行winecfg,将会自动创建wine的运行环境。假如你之前运行过旧版本的wine,首先得rm -r ~/.wine。
      在winecfg中,建议设定默认屏幕分辨率,如设置成1024×768。
      1、设置必备dll文件
      首先删除~/.wine/drive_c/windows/system32/rpcrt4.dll,然后将CrossOverGames目录下(默认是/opt/cxgames)的/opt/cxgames/lib/wine/rpcrt4.dll.so复制至~/.wine/drive_c/windows/system32,命名为rpcrt4.dll。
      第二步删除~/.wine/drive_c/windows/system32下的msxml3.dll文件。再运行winecfg,在library页面将msxml3.dll和rpcrt4.dll加入并设置为native。
      确保替换和删除成功后,即可开始安装。
      2、安装MSXML和Office 2007
      先访问 Microsoft XML Parser (MSXML)下载Microsoft XML解析器,然后在终端下运行以下命令来安装:
      $ msiexec /i msxml3.msi
      接着,插入你的Office 2007光盘,输入以下命令挂载它:
      mount -t iso9660 -o unhide /dev/cdrom /media/cdrom0
      或者用以下命令挂载ISO:
      mount -t iso9660 -o loop ****.iso /media/cdrom0
      然后开始安装吧!
      $ cd /media/cdrom0
      /media/cdrom0$ wine setup.exe
      经过了漫长的等待以后,就到你的应用程序菜单中去运行Microsoft Office 2007吧!

      在作者的试用下,Word和Excel运行良好,其他套件有错误不能运行。不知道是否是个别情况?




      
      来源:LinuxDesktop.cn
  • MySQL:使用源码分发版还是二进制分发版

    2008-03-26 10:01:29

      选择了MySQL的安装版本后,要做的第二项决策是你是使用源码分发版还是二进制分发版。大多数情况,如果你的平台上已经有了一个二进制分发版,你可能使用二进制分发版。大多数平台可以使用原格式二进制分发版,例如Linux使用RPM文件,Mac OS X使用DMG安装软件包。也可以使用Zip文件或压缩tar文件。

      选择二进制分发版的理由:

      · 二进制分发版比源码分发版更容易安装。

      · 为了满足不同用户的需求,我们提供了两种不同的二进制版本:一个是编译过的带非事务储存引擎(小的快速库),另一个配置了最重要的扩展选项,例如事务安全表。两个版本均从相同的源码分发版编译而来。所有本地MySQL客户端均可以连接任一版本的MySQL服务器。

      扩展MySQL库分发版标有-max后缀,配置了与mysqld-max相同的选项。

      如果想要使用MySQL-Max RPM,必须首先安装标准MySQL-server RPM。

      在某些环境下,最好安装源码分发版MySQL:

      · 你想要在某个明显的位置安装MySQL。标准二进制分发版可以安装到任何地方,但你想更加灵活地将MySQL组件放到某个地方。

      · 你想要将mysqld配置一些标准二进制分发版中未包括的一些特殊特征。下面是一些你想要使用的最常用的选项:

      ◆--with-innodb(在所有MySQL 5.1库版本中默认使用)

      ◆--with-berkeley-db(只适合部分平台)

      ◆--with-libwrap

      ◆--with-名d-z-libs(适合部分二进制)

      ◆--with-debug[=full]

      · 你想要将mysqld配置一些标准二进制分发版中已经包括的一些特殊特征。例如,一般编译过的分发版支持所有字符集。如果你想要一个更小的MySQL服务器,可以重新编译只支持你需要的字符集。

      · 你有一个专用编译器(例如pgcc)或想要使用更好地优化适用你的处理器的编译器选项。二进制分发版编译的选项适合同一处理器族的各种处理器。

      · 你想要使用BitKeeper库中的最新源码,以访问所有最新漏洞修复。例如,如果你发现了漏洞并将它报告给MySQL开发小组,漏洞修复传递给源码库,你便可以访问它。发布实际发行后才会出现漏洞修复。

      · 如果你想要阅读(或修改)构成MySQL的C和C++代码,你应该拿到源码分发版。源码总是最终的手册。

      · 源码分发版也比二进制的分发版包含更多的测试和实例。
  • 开源ETL工具kettle之建立缓慢增长维

    2008-03-24 11:00:22

      摘要:本文主要介绍使用kettle 来建立一个Type 2的Slowly Changing Dimension 以及其中一些细节问题

      1. Kettle 简介

      Kettle是一个强大的,元数据驱动的ETL工具被设计用来填补商业和IT之前的差距,将你公司的数据变成可增长的利润.

      我们先来看看Kettle能做什么:

    1. Data warehouse population with built-in support for slowly changing dimensions, junk dimensions and much, much more.
    2. Export of database(s) to text-file(s) or other databases
    3. Import of data into databases, ranging from text-files to excel sheets
    4. Data migration between database applications
    5. Exploration of data in existing databases. (tables, views, synonyms, )
    6. Information enrichment by looking up data in various information stores (databases, text-files, excel sheets, )
    7. Data cleaning by applying complex conditions in data transformations
    8. Application integration

      本系列文章主要介绍如下几点:

    1. 数据仓库内建支持缓慢增长维SCD ,
    2. 在数据转换中使用复杂条件判断来清理数据
    3. 如何使用kettle 来处理增量更形
    4. 将Kettle 集成到你的应用程序里
    5. 使用kettle中应该注意的一些地方

      2. Kettle 文档

      最好的kettle教程就在你身边,我们下载的kettle-version. zip 文件里其实已经包括了非常多的示例和文档,在你的kettle文件夹下,docs 文件夹下包含了所有的文档,samples文件夹下包含了一些示例,后面的介绍中一部分示例都来自kettle自带的这个示例文件夹下。docs里面最主要的是Spoon-version-User-Guide. zip ,里面记录了kettle 的技术性文档,包括支持的操作系统,数据库平台,文本格式,图形化的界面,其中最重要的是所有的转换对象(Transformation Core Objects) 和Job对象(Job Core Objects) 的解释,包括截图和每一个参数的解释。

      3. Kettle与Slowly Changing Dimension

      我们使用kettle自带的samples文件下的示例,来看kettle如何支持SCD的。
    打开samples / jobs / Slowly Changing Dimension 文件夹,发现里面有三个文件,
    create - populate - update slowly changing dimension.kjb
    DimensionLookup - update dimension table 2.ktr
    DimensionLookup - update dimension table.ktr
    其中后缀以 .kjb 结尾的是kettle 的job 文件导出的格式,而以ktr 结尾的是kettle 的transformation 导出的格式,打开其中的DimensionLookup - update dimension table.ktr , 出现如下所示 :


     
        图1
    1. 最左边的是产生测试数据,如果是实际环境的话应该是连接真实的数据库,产生的真实数据格式打开如下:


    图2

    2 第二个步骤Dummy 就是把前面的数据合并起来,Dummy 步骤本身不做任何事情,不过由于前面有四个输入指向它,所以它在第二步的作用等同于数据合并。

    3 第三个步骤是取得系统参数(get system date) , 它取得当前系统时间的日期,并且格式是当天的 00:00:00 , 如图所示



      4. 最后一步是真正的重点,执行Dimension Lookup / Update 步骤来更新和插入数据,以此来实现Type 1 ,2 ,3 的不同Slowly Changing Dimension


       
    图4


    图5

       在开始介绍Dimension Lookup / Update 之前,先看看在执行这个步骤之前的输入和输入:
       输入:

    字段名
    数据类型
    说明
    id
    int
    前面步骤的输入
    name
    Varchar(50)
    前面步骤的输入
    firstname
    Varchar(50)
    前面步骤的输入
    updated
    time
    从第三步来的时间参数

    输出:
    字段名
    数据类型
    说明
    id
    INT
    来自输入
    name     
    varchar(50)
    来自输入
    firstname
    varchar(50)
    来自输入
    customer_tk
    BIGINT
    代理主键
    version
    INT
    版本变更号
    Date_from
    datetime
    有效期起始日期
    Date_to
    Datetime
    有效期失效日期


       注意: 上图中所使用的是mysql 5 数据库做测试,所以数据类型一栏都是mysql 的数据类型,如果你使用其他数据库,可能数据类型会有所不同,其中的datetime 的格式 yyyy/mon/day hh:mm:ss:sss

      我们再来看看当我们第一次运行以后出现的数据输出:


     
    图6

    注意图6中所有的 version 值都是 1 
    Date_from 都是 1900/01/01 00:00:00.000
    Date_to   都是 2199/12/31 23:59:59.000      这两列都是根据图4下面部分定义的
    Id , name , firstname 都是测试数据,从前面步骤来的.

      然后我们修改图1中generate row 的部分数据(一共两条),并且只有测试数据变了的情况下,我们再次运行转换,查看数据输出:



    图7

    注意到其中customer_tk 并没有什么变化,仍然在产生类似序列的输出
    Version 的值中出现了 2 , 并且只有在我们改变的数据中
    在出现了改变的行中的date_from 变成了2007/11/28/ 00:00:00.000
    在出现了改变的行中原来数据的date_to 变成了 2007-11-28 00:00:00.000
    Id 列没有变化,(变化了也没用,图5中的中间部分 Field 选项卡没有选id)
    Name , firstname 有两个值变了(我们手工改变的)

    Dimension Lookup / Update 参数解释 
     
    Step name
    步骤的名称,在一个转换中必须是唯一的
    Update the dimension?
    当找到符合条件记录的时候更新这条记录,如果这个复选框没有选择,找到了符合条件记录的时候就是插入新纪录而不是更新
    Connection
    数据库连接的名字
    Target schema
     
    Target table
    要更新的维表的名称
    Commit size
    批处理更新的记录数
    Cache size in rows
    这是把维表的数据放在缓存中用来提高数据查找速度从而减少数据库查询的次数
    注意只有最近一次的记录会被放在缓存中,如果记录数超过缓存大小,最有最有关的最近的最高版本号记录会被放在缓存中
    如果把cache size 设置成0 ,kettle会一直把记录放在缓存中直到JVM没有内存了,如果你这样设置要确保维的记录数不要太大
    设置成 1 表示不使用缓存
    Keys tab
    设置在流中的主键和目标维表的业务主键,当两个键相等时认为这条记录匹配
    Fields tab
    设定要更新的字段,当主键记录匹配的时候,只有设定更新的字段不一样才认为是这条记录是不一样的,需要更新或者插入(注意图5的中间部分,Fields tab 右边设定的是Insert ,所以实现的是Type2 的SCD)
    Technical key field
    维的主键,也可以叫做代理主键(Surrogate Key)
    Creation of technical key
    指定技术主键的生成方式,对于你数据库连接不适合的方式会自动被去掉,一共有三种:
    1 .Use table maximum + 1 : 使用当前表最大记录数加一的方式产生新主键,注意新的最大值会被缓存,所以不用每次需要产生新记录的时候就计算
    2 . Use sequence : 使用一个数据库支持的序列来产生技术主键(比如Oracle ,你也可以看到图4中这一条是灰色的因为使用的是mysql 数据库)
    3. Use auto increment field : 使用一个数据库支持的自动增长来产生技术主键(比如DB2)
    Version field
    使用这个字段来储存版本号
    Stream Datafield
    你可以指定维记录最后一次被更改的时间,它能指定你要更新的维的精度,如果不指定,就会默认是系统时间
    Date range start field
    维记录其实有效时间
    Table daterange end
    维记录失效时间
    Get Fields button
    指定所有你想要更新的字段,除了你指定的主键
    SQL button
    产生sql 来创建维表

      官方文档中提到的注意事项:

    1. Stream date field : 如果你不想每次都改变时间的范围,你需要添加一个额外的这个字段,比如你打算每天的午夜来进行ETL过程,可以考虑加一个Join 步骤”Yesterday 23:59:59” 作为输入的时间字段.
    2. 这必须是一个Date 字段(不能是转换后的字符串,即使他们有相同的格式也不行),我们(Kettle 的开发小组)把功能实现隔离出来,如果你需要的话自己要先转换.
    3. 对于Date range start and end fields : 你只能指定一个表示年的数据,而不是时间戳,如果你输入YYYY(比如2100) ,这将会被当成一个时间戳来用: YYYY-01-01 00:00:00.000 ,(注意图6中的格式)

      另外需要注意的地方:

    1. Technical key field : 其他一些ETL工具(比如OWB)也许叫做代理主键,只是名字上不同而已.
    2. SQL Button : 当你在目标数据库中还没有建立维表的时候,你点击SQL Button ,Kettle 会弹出如下对话框帮你建立维表,你会发现它默认帮你在代理主键和业务主键上建立索引。



    图8

      3 Creation of technical key : 在这个选项的第二种实现方式上,Use sequence ,这个要视你数据库支持而定,mysql 就不支持,Oracle 支持sequence , 但是你要自己创建和管理这个sequence , 如果这个sequence 的值因某种外部因素改变了,你要自己确定sequence 产生的值处于何种状态,如果可以的话尽量不要用,尽量用第一种:table maximum + 1 ,这种方式永远不要担心数据库的不同和实现方式的不同,而且简单易懂。

      4 Stream Datefield

      4.1 这个选项是用来控制时间的精度的,有的时候我们可能只是一个月进行一次ETL,这个时候Datefield 显然没有必要到秒的精度,而且这个选项严重影响你后面如果使用缓慢增长维的sql 的复杂度,因为你需要先把时间的精度调到你需要的精度,比如你使用的数据是到秒的精度,但是你实际需要的只是天的精度,你在sql 里面有大量的时间都浪费在toString( stream date field) ,然后把这个字符串substring() ,执行效率会低一些.

      4.2 不要轻易改这个精度,一旦你确定了精度问题,不要尝试改变它,尤其是当精度变细的时候,你可能会损失掉已经存在与数据库中的数据的精度,如果你只是从 “Today 00:00:00.000” 改成 “Today 23.59.59.000” 的情况,需要手动处理好已经存在的数据格式问题.

      4.3 执行ETL的时间可能决定这个值,如果你一天可能存在5次执行ETL过程(包括自动执行或者手工执行)那么你显然不希望时间的精度是按天来计算的(比如Today 00.00.00这种格式)

      4.4 精度的损失并不可怕:考虑一下你的应用场景,比如我们要做表,列出2006年11月份和2006年12月份的所有销售总和,结合上图中的customer 的例子,假设是按客户聚合的, 我们对于customer 的精度要求只要求到月,没有要求到天,如果我们执行ETL的过程是一个星期执行一次,可能一个客户在一个星期内改变了三次他的名字(虽然不是个好例子,完全是为了配合上面的图),而只有最后一次的改变被记录了下来,这完全跟你执行ETL的频度有关,但是考虑到用户需求,只要精度到月就够了,即使这种精度有数据损失也完全没关系,所以你如何指定你的Stream date field 的精度主要是看用户需求的精度。

    4.5 如果以上四点你觉得只是一堆让你头疼的字符串,那你完全可以把stream date field 设置成空(默认的到时间戳的精度)
    执行Type 2 SCD
    1. “Update the dimension?” 选中
    2. 在Field tabs 里面,对于每一个你想要保持全部记录的字段都要选择Insert 方式.

      错误处理和依赖问题

      如果你运行了这个转换,你会发现你的输出中有一条customer_tk为1,version为1的数据,你在图6和图7中没有看到这条数据是因为我不想一开始把这条数据跟SCD的实现混在一起,SCD的实现本身并不会告诉你要添加这条数据,这完全是跟数据建模有关系,为了理解这个问题,我们看一下如下情况该如何处理:

      一个产品销售的记录是作为一个立方体的主要事实表,它包括一个客户维,现在因为某种原因客户维需要删除掉一部分数据,但是对映的产品销售记录却要保存起来,该如何处理外键约束的问题?

      SCD实现本身并不会考虑这个问题,因为它跟维表没有什么关系,你要处理的是事实表里面那些引用了维表的记录,如果你没有这个空行(它唯一的一个值就是id ,而且是为了满足主键约束,version那个字段有没有值不重要),事实表中的记录就不好处理这种情况,因为你把它赋予任何一个值都是不合适的。这种方法是为了处理像数据依赖(外键的关系)和错误处理比较常见的方法。 
  • Shell编程:Linux系统环境程序设计之路

    2008-03-20 09:26:36

      别的高级语言都有函数的感念,当然shell编程也有这个概念,当写一个比较大型的shell程序的时候,如果没有函数,则会到处都是重复的代码。当然也可以调用别的脚本,但是速度会比较慢。所以函数是必不可少并且非常重要的一个东西。

      定义函数的格式

      function_name(){...}

      例子:

      //~ fun_s

      show(){

      echo "show $*"

      }

      echo $*

      echo "after function"

      show c d

      echo $*

      exit 0

      /////////////////////////////

      $./fun_s a b

      结果是

      a b

      after function

      c d

      a b

      从上面的例子可以看出,当脚本调用函数的时候,脚本程序的位置参数会被替换成函数的位置参数,并且函数调用结束后还原。

      return:

      //~ return_s

      #!/bin/bash

      first(){

      echo "is return"

      }

      second(){

      echo "before return"

      return "0"

      echo "after return"

      }

      return_value="$(first)"

      echo $return_value

      second&echo "return 0"  echo "return other"

      exit 0

      //////////////////////////////////////

      输出

      is return

      before return

      return 0

      该例子说明可以捕获函数内echo的字符串,如echo $(first) , 函数在return后不会再执行下面的语句。

      second&echo "return 0"  echo "return other" 该句的输出为 return 0。这里有人可能会和C语言混淆,因为在C语言里0表示的是false。而这里的0表示函数执行成功,可以理解为true,所以会输出return 0。

      命令

      break,continue 和c语言基本类似

      echo 了解一点即可echo -n 输出没有换行。

      eval:

      例子:

      //~ eval_s

      #!/bin/bash

      var1=abcd

      var2=var1

      eval var3=\$$var2

      echo $var3

      exit 0

      ///////////////////////////

      eval相当于一个额外的$,它给出一个变量值的值,如例子里先是$var2使var3变成\$var1,又var1=abcd,所以var3变为abcd,连续解析了两次变量。

      export:

      看下面两个例子可以很好的说明export的作用。

      //~ export1_s

      #!/bin/bash

      var1="this is var1"

      var2="this is var2"

      export var2

      ./export2_s

      exit 0

      ///////////////////////////

      //~ export2_s

      #!/bin/bash

      echo "$var1"

      echo "$var2"

      exit 0

      /////////////////////////

      输出:

      this is var2

      输出结果说明var1为空而var2却有值,这正是export起的作用,把var2变成了一个环境变量。

      再看个例子:

      #!/bin/bash

      echo $var1

      echo $var2

      echo $var3

      exit 0

      //////////////////////////

      //~ set-a_s

      #!/bin/bash

      set -a

      var1="var1"

      var2="var2"

      var3="var3"

      ./set-a2_s

      exit 0

      //////////////////////////

      //~ set-a2_s

      输出:

      var1

      var2

      var3

      set -a的作用就是把它之后声明的所有变量都export

      printf:

      和C语言里的printf用法很相似的一个命令,使用非常方便。

      set:

      //~ set_s

      #!/bin/bash

      fun1()

      {

      echo "a b c d"

      }

      set $(fun1)

      echo $1

      echo $(date)

      set $(date)

      echo $1

      exit 0

      ///////////////////////

      输出: a 2008年 03月 06日 星期四 03:57:55 CST 2008年

      date的输出是几个由空格分隔的值,set的作用能分隔出每个域。

      shift:

      就是让$2变$1,$3变$2,依此类推。

      trap:

      非常有用的一个命令,用于指定接受到信号后进行的动作,系统定义了非常多的信号类型,用trap -l命令可以查看所有的信号。

      常见的几个信号有:

      INT(2) 中断,按下ctrl+c组合键引发的

      QUIT(3) 退出,按下ctrl+\引发

      例子:

      //~ trap_s

      #!/bin/bash

      trap var=2 INT

      echo "please enter ctrl+c"

      var=1

      while [ $var = 1 ]

      do

      echo "in while"

      sleep 1

      done

      exit 0

      /////////////////////////

      这个例子在我按下ctrl+c后改变了var的值,所以跳出循环,程序结束。

      shell下的程序设计非常强大,你可以用它做出很多小工具,让你的使用linux系统更加流畅。shell还有非常多的功能文中没有提到,需要大家发现问题后再自己去解决。
  • 9步措施,扩大你的Firefox浏览面积!

    2008-03-17 13:14:59

      觉得自己的显示器太小,浏览网页时总感觉看不完么?或者你装了太多插件,使得你的Firefox过于臃肿么?


      那么你真的应该尝试一下下面的9种方法,它们将让你的浏览面积迅速增大。


    1.小号的图标


      你真的需要那些大号的图标?在导航栏上右键,点击定制,将使用小图标打上勾即可。

    2.微菜单

     


      点此安装这个附加软件,它将把你的菜单整合到一个按钮里。

    3.隐藏菜单栏

      当你需要菜单栏时,按ALT键即可。点此下载

    4.隐藏标签栏

      这个附加软件能隐藏你的标签栏。当你的标签多起来时,这显得相当有用。在这里下载它

    5.Vertigo

      当你拥有一台20寸或更大的宽屏显示器时,Vertigo能将你的标签栏侧放,更好的利用屏幕空间。

     


    6.全屏浏览

      Firefox自带的全屏功能已经很强大了,不过如果你想体验真正的全屏,你可以尝试一下这个附加软件。你的整个屏幕将只有页面。

    7.MiniFirefox

      这个附加软件将自动隐藏很多不常用的界面元素。

    8.Firefox UI Tweaker

      这个强大的扩展软件,能让你对Firefox做出成千上万的修改。

    9.Little Fox

      如果你的界面上有太多元素,那么这款插件一定适合你。它将主题进行重新修正后,各项界面元素都得以缩小。安装它,使用Little Fox主题,重启你的浏览器,你就会发现它把Firefox弄得多小了。虽然对眼睛来说不那么舒服,但真的能提升很多空间。

  • Fedora 8中yum设置的点点滴滴

    2008-03-12 09:59:07

      首先谈下自己的系统现状:转投Fedora后觉得 Fedora比Ubuntu好,不想引起争论,只是觉得Fedora走的很超前,很多东西都是Fedora出了后才在ubuntu上找到相似的影子的。但是Fedora的源是他的硬伤,还有就是他的包依赖没有ubuntu做得好。

      正文:
      
      推荐安装时选择中文,即使你喜欢用英文界面的操作系统,例如我,因为要是默认用英文安装的话,很多中文字体不会装上,中文输入法也不会装上,后期设置很麻烦。用中文语言安装后,进如系统,将语言设置成英语即可实现英文操作系统,再在系统中设置下就可以在英文环境下用中文输入法了,设置如下:



      现在设置源吧,首先你要google一下livna的源,把它加进去 。如下:
    su
    Password:
    # rpm -ivh http://rpm.livna.org/livna-release-8.rpm
    安装fastestmirror插件。
    yum install yum-fastestmirror
    好了,该到设置yum了:
    gedit  /etc/yum/yum-updatesd.conf
    其配置如下:

    [main]
    # how often to check for new updates (in seconds)
    run_interval = 604800
    #多久检查更新,我设置成了7天
    # how often to allow checking on request (in seconds)
    updaterefresh = 600
    #更新刷新周期,这个是为了避免服务器负担太重,建议保持默认,或者设置大点。
    # how to send notifications (valid: dbus, email, syslog)
    emit_via = dbus
    # should we listen via dbus to give out update information/check for
    # new updates
    dbus_listener = yes
    #以下三项为:是否自动安装更新,是否自动下载更新,是否自动下载依赖,建议全部设置成no,否则系统会在后台自动更新,导致前台的所有安装和更新程序被锁死。
    # automatically install updates
    do_update = no
    # automatically download updates
    do_download = no
    # automatically download deps of updates
    do_download_deps = no

    设置fastestmirror
    默认的fastestmirror并不是每次都能找到最快的源。
    要进行一点算是优化的设置:
    gedit /etc/yum/pluginconf.d/fastestmirror.conf
    配置如下:

    [main]
    enabled=1
    verbose=0
    socket_timeout=1
    hostfilepath=/var/cache/yum/timedhosts.txt
    maxhostfileage=1
    #设置成1,即每一天刷新一次镜像的速度
    maxthreads=15
    #exclude=.gov, facebook

      做了如上设置后也许你还是连不上最快的镜像,这时就要RP和刷新了
    yum clean all

      这样可以清除镜像的记录,让yum重新刷新

      看下system monitor里面的网卡速度,平均100K,比设置前的3~4K快多了


  • 开源Apache Camel简化SOA实施进程

    2008-03-09 13:57:43

      在过去的几年中,整合技术得到了突飞猛进的发展。XML/REST/Web 服务/面向服务架构(SOA)的革命不断的促使工程师们和软件公司去创造丰富的协议、适配器、传输器、容器、标准,最佳实践···应有尽有。

      无可否认的,现有的这些代码是非常复杂的、多样化的,几乎没有什么它们不可以做到的事情。但这些软件包都是从技术上来建立的,从而使得如何有效的使用其功能成为了读者很大的挑战。

      目前,众多读者都完成了这一项挑战。丰富的经验和成千上万的成功案例促进了许多基础架构设计模式定义的形成,从而帮助开发者在整合时能够开门见山,少走弯路。其中,有一套设计模式在业界引起了注意,那就是Hohpe 和 Woolf's企业整合模式。这些模式包含了一些技术上无关的词汇来描述大量整合的解决方案。他们并不是侧重于低层次的编程,而是采取自上而下的方案来开发一个异步的、以信息为基础的架构。

      一致的词汇是很好的,而易于使用的框架在实际建立基础架构的时候岂不是更好吗?

      这正是Apache的开源Camel项目背后的理念。现在,行之有效的并且真实的一套模式已可以获得了,很明显,下一步就是要去创造一个能够以最简单的方式来实施这个模式的驱动器。

      Camel 是一个代码先行的工具,它允许开发者在无须学习厂商定制和复杂的底层技术的情况下进行精密的大规模集成。Camel使用Java领域说明性专用语言来连接信息系统和配置路由和调解规则,在POJO基础上实施企业整合模式。这样,就能使得开发人员不必阅读一页又一页的诸如JMS或JBI之类的技术规范,也不用处理较低级别的Spring框架就可以直接设计和建立面向服务架构(SOA)。

      Apache Camel是从Apache其他项目尤其是Apache ActiveMQ 以及Apache ServiceMix的代码和灵感有机的衍生出来的。该项目的成员们发现:人们在许多不同的情况下都想要建立或是使用企业集成模式书中的模式。因此,Camel团队就这样明确的目的开始建立这样的框架。

      Camel 概况:

      建立Camel的第一步是解偶底层框架中的模式。一些人想要利用企业服务总线(ESB)中的模式,还有一些人则选择Message Broker中的模式,而其他人需要使用应用程序自身的模式或信息提供者间进行对话。仍然有一些人想要在Web服务框架下或是其他沟通平台上使用。比起将此路由代码与特定的Message Broker或企业服务总线(ESB)绑定来说,Camel选择提取此代码作为独立的框架, 这样一来它就能被应用到任何的项目中去。Camel有一个脚本――不管是在Servlet, 或是Web服务包中,全面企业服务总线(ESB),还是信息应用程序中,任何地方都可以做到重新利用。

      Camel的最初也是主要的优势在于开发团队无须为了连接系统在容器上下功夫。很多人会认为从容器上下功夫是一个正确的途径,甚至是当成对勇气的考验,但对于越来越多的团队来说这些阻碍成为了不必要的障碍。有了Apache Camel,开发人员就能在完成任务的过程中将无关的任务减少到最低。如果其他要求得到保证的话,Camel还可以在JBI容器中实施,但这并不是必要的。

      为了简化编程,Camel还支持特定的Java和XML域语言,使得企业集成模式你那个在所有的Java IDE或Spring XML中使用。这种更高层次的提取能更有效的解决问题。

      Camel重新利用了许多Spring 2 的特性,如说明性交易,控制配置倒置,以及众多为了与JMS和JDBC,Java Persistence API (JPA)结合工作的实用层面的东西。这提高了抽取的水平,简化了编程,减少了需要编写的XML,但如果人们要是追根究底花些功夫的话,也会发现其实Camel仍然暴露了线级访问。

      Camel示例

      我们分别解释不同的方式实现Apache Camel的配置,首先将使用Java DSL(领域特定语言),接下来是Spring XML配置。

      Java DSL 配置

      如下的列子就是实现了当你想在一个目录结构中从JMS对列里得到信息。首先,我们需要创建一个CamelContext对象:

      CamelContext context = new DefaultCamelContext();

      这里远不止一种方法向CamelContext添加组件。你也可以在我们创建好路由之后再添加组件,正如一下示例所示:

      

    context.addRoutes(new RouteBuilder() {
      public void configure() {
      from("test-jms:queue:test.queue").to("file://test");
      // set up a listener on the file component
      from("file://test").process(new Processor() {
      public void process(Exchange e) {
      System.out.println("Received exchange: " + e.getIn());
      }
      });
      }
      });
      或者明确的加入JMS组件,如下所示:  
    ConnectionFactory connectionFactory = new ActiveMQConnectionFactory("vm://localhost?broker.persistent=false");
      // note we can explicity name the component
      context.addComponent("test-jms", JmsComponent.jmsComponentAutoAcknowledge(connectionFactory));
      下次你必须要启动Camel context。如果你使用Spring去配置Camel context这将会为你实现自动化过程,如果你是使用纯Java的话那就必须用先调用start()的方法:

      camelContext.start();

      这将启动所有的配置路由规则。

      当我们完全启动CamelContext后我们可以输入一些对象至Camel。

      在通常的使用中,更多的情况往往是通过一些功能组件,外部系统将一些信息或是事件直接输入到Camel中,但是在这里我们将使用CamelTemplate,这也是一个最简单的方法用以测试之前的配置是否正确。

      CamelTemplate template = new CamelTemplate(context);

      这时我们可以使用CamelTemplate通过JMS发送一些测试消息:  

    for (int i = 0; i < 10; i++) {
      template.sendBody("test-jms:queue:test.queue", "Test Message: " + i);
      }
      我们从CamelTemplate中发送对象(此时通常为文本对象)纳入CamelContext中并提供给测试组件:jms:queue:test.queue。这些文本对象会自动修改进JMS信息中,并在JMS对列中以test.queue张贴出来。当我们创建好路线我们配置好FileComponent去接收test.queue。

      FileComponent文件将从对列中提取信息并保存在一个名为test的目录中。每一条信息都会存放在一个与其目的地或是信息ID相对应的文件中。

      最后,我们配置自己的listener并从FileComponent获得通知,以文本的形式打印出来。

      Spring XML配置

      这个示例将使用Spring XML配置实现文件的转换,利用XQuery从目录中将结果发送至JMS 对列。它从目录中选取文件进行解析,然后使用XQuery进行转换,再发送至消息对列。当然,为了更清楚的看到生成文件,我们也会有一些别的方法去从JMS对列中选取内容再写到一个输出目录中。

      运行示例

      让我们用Camel Maven插件来运行这段示例。举例来说,通过开源软件的源代码版或可执行版即可实现以下操作:  

    cd examples/camel-example-spring-xquery
      mvn camel:run
      你现在应该可以看到在target/outputFiles目录下所生成的文件内容,这就是从JMS对列中所读出的转化信息。

      代码走查

      需要做的是用那些定义在类下的 META-INF/spring/camelContext.xml文件正常启动Spring应用。这是应用Camel的XML配置进行配置CamelContext的规范Spring XML文档。

      请务必注意这段XML示例文件底部,我们明确的配置了ActiveMQ组件以及关于如何连接代理的详细内容。

      关键的Spring XML代码内容如下所示:

    <camelContext useJmx="true" xmlns="http://activemq.apache.org/camel/schema/spring">

       <!-- lets parse files, transform them with XQuery and send them to JMS -->
       <route>
         <from uri="file:src/data?noop=true"/>
         <to uri="xquery:myTransform.xquery"/>
         <to uri="jms:MyQueue"/>
       </route>

       <!-- now lets write messages from the queue to a directory -->
       <route>
         <from uri="jms:MyQueue"/>
         <to uri="file:target/outputFiles"/>
       </route>

    </camelContext>

    <!-- lets configure the default ActiveMQ broker URL -->
    <bean id="jms" class="org.apache.camel.component.jms.JmsComponent">
       <property name="connectionFactory">
         <bean class="org.apache.activemq.ActiveMQConnectionFactory">
           <property name="brokerURL" value="vm://localhost?broker.persistent=false"/>
         </bean>
       </property>
    </bean> 
      希望这篇文章能够让你真正认识到使用Apache Camel来实现企业应用整合是一件多么实际的事。

1001/512345>
Open Toolbar