Profilo di agentzhHuman & MachineFotoBlogElenchiAltro Strumenti Guida

Blog


26 marzo

解决 RealPlayer 在 ubuntu 中没声音的问题

记得一个月前我徒弟就报告过 RealPlayer 在 ubuntu 中光有图像没有声音的问题;没想到现在我自己却撞上了。好在经过反复的 Google,终于找到了下面的解决方法:

* 首先安装 ALSA OSS 驱动程序:

$ sudo apt-get install alsa-oss

* 然后编辑启动脚本 (/usr/lib/realplay-10.0.8/realplay) 并将第 73 行从

$REALPLAYBIN “$@”

改成

aoss $REALPLAYBIN “$@”

对于我自己的 feisty fawn 而言,装的是 RealPlayer 10.0.7 版,需要修改的 realplay 文件中的那行位于第 70 行,而不是 73 行,呵呵。现在播放 .rmvb 文件终于有声音了!好棒哦~~~不必再通过用 VirtualBox 跑 WinXP 来看电影了,呵呵。

25 marzo

毕业设计开发周记(第 3 周)

过去一周工作的完成情况

过去的这一周大部分时间用来找工作了,呵呵。好在工作比想象中的好找, 所以也没有花费我太多的精力。

这些日子在毕业设计项目上取得了以下进展:

  • Makefile::Parser 开辟了 gmake-db分支
  • 在 GNU make database 的基础上设计出了 GNU make AST 的结构。它由下列几个类组成:
    • Makefile::AST

      总的 AST 类,提供节点的添加与查询,比如 add_implicit_rule,apply_implicit_rules,add_explicit_rule,apply_explicit_rules,add_var,add_auto_var,get_var,还有许多其他工具函数,比如计算变量最终值的方法 eval_var_value,有关局部变量作用域 Pad 的 enter_scopeleave_scope 方法,等等。

    • Makefile::AST::Rule::Base

      它是 AST 中规则节点的基类,包含 normal_prereqs,order_prereqs,commands,colon 这些属性。

    • Makefile::AST::Rule

      该类表示非隐式规则以及隐式规则“应用”之后的形式,从 Makefile::AST::Rule::Base 继承,并新增了 targetother_targets 属性。

    • Makefile::AST::Rule::Implicit

      该类表示 AST 中的隐式规则节点,从 Makefile::AST::Rule::Base 继承,并新增了 targets,match_anything,is_terminal 等属性。

    • Makefile::AST::StemMatch

      该类封装了含 % 的文件模式的匹配与 stem 替换算法。

    • Makefile::AST::Variable

      它表示 AST 中的变量节点,包含 name,value,flavor,origin 等属性。

  • 添加了 ast-basic.t,ast-rule.t,ast-var.t,和 ast-stem.t 脚本用于对 AST 及其相关类进行单元测试。
  • 实现了 Makefile::Parser::GmakeDB 类,用于解析由 make -qp 命令生成的 GNU make database,并构造出对应的 Makefile::AST 对象(即 GNU Make AST).

    有趣的是,GNU make 生成的 database 报表也是完全合法的 Makefile 格式,而且只使用最最基本的语法结构,因此 Makefile::Parser::GmakeDB 直接使用 MDOM::Document::Gmake 进行解析。

  • 实现了 Makefile::AST::Evaluator 类,用于按照 GNU make 的语义“执行”给定的 GNU make AST。

    值得一提的是,包括显隐式规则的应用在内的拓朴图的构建算法其实大部分实现在了 Makefile::AST 及其子节点类中了。

  • `make -pq`,Makefile::Parser::GmakeDB,和 Makefile::AST::Evaluator 三者串联了起来,组装成了一个完整的 make 工具,即 pgmake-db.

    该工具可以运行基于 IPC 的 GNU make 测试集。目前已通过了 sanity/func-refs.t 测试文件中 95% 以上的测试用例。

下一周的工作计划

下一周可能没有太多时间用来 hack 了,因为需要应付学校的结欠考试。但是顺着上一周的工作继续往下走应该是很容易的。我立刻能想到的工作有:

  • 添加 Makefile::AST::Command 类,用于将 Makefile 命令相关的处理封装起来,并为之添加文件名和行号的属性支持(file 和 line).
  • Makefile::AST::Variable 类添加 file 和 line 属性,以便能通过 func-refs.t 中余下的那些测试。
  • pgmake-db 通过尽可能多的 GNU make 测试集,同时根据 GNU make Manual 设计更多的有关变量和规则应用的综合测试用例,从而不断地完善 AST 的结构以及 AST 执行组件(evaluator)。
16 marzo

毕业设计开发周记(第 2 周)


过去一周计划的完成情况

  • 将已有的基于 Test::Base 的 GNU make 测试集加入到了 Makefile::DOM 模块的  SVN 仓库 的 gmake 分支 ,并进行简单的重构:

    http://svn.openfoundry.org/mdom/branches/gmake/t/

  • 放弃了整合 Adam Beauchamp 的状态机模式补丁的计划,因为我还是比较喜欢目前的解析策略。

  • 暂时取消了发布 Makefile::DOM 0.01 的计划。因为 Makefile::DOM 的设计还有许多问题,它的设计与实现均需要 未来用 Makefile::Parser 和 GNU make 测试集来进行指引和验证。

  • Makefile::Parser 0.11 的基础上比较完整地实现了下列 GNU make makefile 内建函数:

    subst, patsubst, strip, findstring, filter, filter-out, sort, word, words, wordlist, firstword, lastword, dir, notdir, suffix, basename, addsuffix, addprefix, join, wildcard, realpath, abspath, shell, if, and, or, error, warning, info, foreach

    另外还实现了所谓的“替换引用”(Substitution References),比如:

        $(c_files:.c=.o)

    它们的实现代码直接添加进了 Makefile::Parser 的 SVN 仓库的 trunk/ .

    限于 Makefile::Parser 旧引擎不支持“递归展开变量”,下列 GNU make 内建函数暂时无法恰当地实现:

    origin, value, call, flavor, and eval

    已支持函数的测试目前放置在 Makefile::DOM 的 gmake 分支中:

    http://svn.openfoundry.org/mdom/branches/gmake/t/gmake/sanity/func-refs.t

  • Makefile::Parser 模块实现了  plmake  脚本。 它是基于该模块的 make 命令行工具。该工具使得我可以在实现 GNU make 内建函数的时候运行基于  t::Gmake 的测试台。TDD 万岁!

  • Makefile::Parser 模块的 POD 文档中简单地提及了全新实现的基本计划,并对其中过时的和不准确的地方进行了更新。

  • 上述对 Makefile::Parser trunk 的扩展与改进先后以 0.12, 0.13, 0.14, 0.15, 0.16, 和 0.17 版的形式发布到了 CPAN.

  • 发布了 Makefile::GraphViz 的一些更新版本(当前 CPAN 上版本号为 0.16), 稍稍改进了一下 POD 文档,同时提升了所需的 Makefile::Parser 的最低版本号。

下一周及以后的工作计划

  • 继续发挥 Makefile::Parser 0.xx 旧引擎的余热, 借助于  plmake 实现基本的基于拓仆图的目标更新算法以及一些 GNU make 命令行选项。

  • 利用  plmake  编写 和运行更多的基于  t::Gmake 的 GNU make 测试,不断改进 Makefile::Parser 0.xx 的相关部件。

  • 利用 GNU make 的 -p 选项(即 --print-data-base 选项)取得它内部的数据库结构信息,以此为基础设计 出下一代 Makefile::Parser (即 1.x.x)所使用的 Makefile AST 结构。

  • 针对 Makefile AST 设计出纯 Perl 的运行时(Runtime),同时对 GNU make 进行包装,使之能 作为 makefile AST 生成器来使用。由此可以得到全功能的以 GNU make 为前端的 pgmake, 从而可以运行 GNU make 测试集。

    以 GNU make 为前端的 pgmake 的使命是为了得到纯 Perl 的 GNU make runtime (或者说是 AST Evaluator)

  • 另一种复用 GNU make 的技巧是将之用作纯的 Runtime. 具体做法是,从 Makefile AST 发射出 makefile 源代码,它只使用最最基本的 Makefile 语法结构,然后用下面的命令让 GNU make 去执行它:

        make -Rr -f foo.mk

    这儿的 foo.mk 便是 AST Dumper 生成的``基本 Makefile''.

    利用这种技术,我们可以得到以 GNU make 为后端,以 Makefile::DOM 和全新版 Makefile::Parser 为前端的 pgmake。同样也可以去运行整个 GNU make 测试集。

    该版本的 pgmake 的使命是驱动并验证 Makefile::DOM 和 Makefile::Parser 1.x.x 这两个模块的开发工作。

07 marzo

毕业设计开发周记(第 1 周)


从现在起,每周三我都将为毕业设计拟定下一周的工作计划,同时对前一周的相关工作进行总结。

过去一周已完成的工作

  • 先后发布了 Makefile::GraphViz 0.11, 0.12 和 0.13 版,主要是旧内核的例行维护,包括 为 gvmake 脚本添加了有用的 -a 选项(从而能绘制 Makefile 中所有的根目标),以及修复了 RT bug #24828#15070

  • 开发了针对 Module::Install 的脚本 releng , 用于自动化 CPAN 模块发布前繁杂的准备工作。

    我的 Makefile 项目涉及多个 CPAN 模块,每个模块需要发布的版本又是不计其数,因此 releng 脚本无疑会为我节省大量的时间。

  • 基于 Linux::Smaps 开发了一个在 Linux 上统计任意 shell 命令所占用的最大内存量的脚本,名为 smem . 测试显示,Ubuntu 的 System Monitor 使用的也是来自 smaps 的内存占用信息。我在该脚本中首次实用了 Perl 的 fork 函数(一直想用都没用上,因为前面一直用的都是 Windows)。

    鄙视 Linux 内核,因为至今它都没有完整地实现 getrusage 函数 , 从而使得 GNU time 在 Linux 上只能用来计时。同样的原因,CPAN 上的 BSD::Resource 在 Linux 上也没有太大的用处。

    我的 smem 脚本可用于统计 Makefile 项目中各模块的内存占用情况。

下一周的工作计划

  • 修改和应用 Adam Beauchamp 今年 1 月 13 日提供的针对 Makefile::Parser 的补丁到 SVN 仓库branches/states/ 分支 。 该补丁将使得 Makefile::Parser 内核基于标准的状态机模式。

  • branches/states 分支 成熟以后,将之融合到主流的 trunk/, 然后在不影响 Makefile::GraphViz 测试集的前提下,发布为 Makefile::Parser 0.12 版。随后取消 states/ 分支。

  • 开辟 /branches/refs 分支,以比较完整地实现 GNU make 的函数引用(function reference)和变量引用(variable reference),主要面向 RT bug #18229

  • 在 /branches/refs/ 分支成熟后,融合进主流的 trunk/,并发布新的 Makefile::Parser 至 CPAN.

  • 在最近的 Makefile::Parser 模块的 POD 文档中交代全新实现的基本计划。

  • 将已有的基于 Test::Base 的 GNU make 测试集加入到 Makefile::DOM 模块的 SVN 仓库gmake 分支 ,并进行简单的重构:

      t/Shell.pm
    t/Gmake.pm
    t/lib/Test/Make/Gmake.pm
    t/lib/Test/Make/Base.pm
    t/lib/Test/Make/Util.pm
    t/lib/Test/Util.pm
    t/gmake/syntax/
    t/gmake/features/
    t/gmake/...
  • 将新补充的测试用例添加进 Makefile::DOM 的单元测试集,将失败的测试标成``SKIP'',并为各个主要 .pm 文件添加 POD 文档,直至发布该模块的第 一个 CPAN 版本 0.0.1

  • 编写 newpm 脚本以自动为我创建 .pm 文件的代码和 POD 文档的骨架。