Qt初揭秘——终结篇

 我们最近花了几周时间详细介绍Qt的特性,她无疑是目前最能体现大多数程序员编程理想的优秀程序框架之一。

 尽管从市场趋势来看,智能移动终端乱战可能将由RIM Blackberry,IPhone,Android,WP,PALM继续主导,前两者在发达国家仍然占有举足轻重的地位,而Google发起的Open Handset Alliance及其力推的Android无疑将横扫新兴市场国家,WP的问题或许就出在缺少前面的特定市场定位,但的确也不能排除WP未来通吃的可能(当然这种可能性是微乎其微的)。 而Nokia面临的危机是实在的,迟到的Symbian3在中高端市场上表现依然乏力,同时在开发者社区的支持率也被大量蚕食。MeeGo的开发现状和前景亦不被多数人所看好。这就直接导致Qt如今似乎处于一个尴尬的地位:毕竟移动市场的诱惑力已远远超越了桌面市场。

 但如果历史在2008年发生扭转,Qt甚至可能还不会得到这种全面进军移动领域的机遇。在我看来,Qt在移动领域看似生不逢时,实际上此时却也是群雄逐鹿的历史转折点,Qt何去何从,我们只当拭目以待。

 我们选择编译Ryan Paul的这篇文章的原因在于他为我们展现了Qt提供给开发人员的一些更为直观的好处,事实上,ars technia在开源领域具有独特且精彩的第三方评论,无论是过去还是现在,编辑们都坚持为可爱的开源软件项目摇旗呐喊,不遗余力。下面仅给出前面两篇文章的原文地址,以及原作者近期对Qt新发行版的深度评论。

 Troll treasure: an in-depth look at Qt 4.4

 http://arstechnica.com/open-source/news/2008/05/troll-treasure-qt44-in-depth.ars/2

 Qt gets cuter: 4.6 brings expanded platform support

 http://arstechnica.com/open-source/news/2009/12/qt-gets-cuter-46-brings-expanded-platform-support.ars

 Nokia releases Qt 4.7 with terrific new mobile UI framework

 http://arstechnica.com/open-source/news/2010/09/nokias-cross-platform-development-strategy-evolves-with-qt-47.ars

 How Qt could bring better third-party software to Ubuntu

 http://arstechnica.com/open-source/news/2010/10/canonical-cto-contemplates-qt-we-think-it-has-a-lot-to-offer-ubuntu.ars

 今后,我们的Qt专题将着重于讨论技术细节。对于未来,我们只好交由历史自己去判断。

qt
Comments

关于Qt的一切(续)

(前文见此)

 网页内容和本地代码的紧密集成

 Qt4.4另一个令人非常兴奋的特性在于新的QtWebKit模块,它允许开发人员实现HTML内容和本地工具组件的无缝结合。WebKit是一种基于KDE社区KHTML框架的开源HTML渲染器,最初是由苹果为Safari开发的。WebKit轻量、可移植、且易于嵌入的特性使得其越来越多地被Nokia、Adobe、Google等公司引入到其产品中。

 全新的QWebView工具组件通过一系列携带signal和property的高层Qt API来展现web功能,其底层是一种完全基于WebKit的HTML渲染引擎。QWebView工具组件可以在Designer工具中像其它工具组件一样被轻松置入Qt form中。它支持从本地或远程URIs或字符串中载入HTML内容。

 QtWebKit允许开发人员能够轻松地将其本地代码方法和JavaScript紧密结合,并通过本地代码对QWebView中上下文的JavaScript代码进行评估。这就意味着其支持一种双向集成:开发人员能够将本地Qt工具组件嵌入至网页内容中,甚至可以给JavaScript函数绑定Qt signals。Trolltech开发人员Kent Hansen的博客在上周明确展示了QWebKit是如何在本地代码中使用的:他演示了一种如何把Qt Designer用户接口描述文件动态集成到QWebView中,并使用QtScript演示了整个过程。正如上述概念所示,他能把Qt tutorials中的一张截图替换成具有完整功能的应用程序版本,并直接嵌入至HTML页面。

 如同hansen展示的这种开发技术已经大大扩展了Qt在未来的潜力。这种方法可以用于构建快速原型,并为应用程序提供更多扩展能力。正如我们今年早前一篇文章中介绍的关于在linux中利用WebKit创建RIAs的主题,Trolltech的方法比起Adobe的AIR这种完全自给自足的模式使得RIAs开发更为灵活、更具有扩展性并且更加易于代码重用。

 除了提供HTML渲染功能以外,QWebKit也提供一种用于处理其它面向浏览器功能如代理、cookies、网络以及SSL支持的完整组件堆栈。Trolltech的开发人员Benjamin Meyer已经在开发一种完全基于Qt的名叫Arora的工具,它是一种可用于概念验证(Proof of Concept )的网页浏览器。 

 

 Qt4.4中的WebKit版本大约于六个月前发布。Meyer声称Trolltech计划将为Qt 4.5提供更多基于新版WebKit的改进。苹果的WebKit最近在Acid 3的CSS测试中达到了百分之百通过,且在最近几个月又加入了大量绚丽丰富的特性,如CSS渐变(gradients)和图像倒影(reflection)功能。

 Trolltech同时计划在Qt工具组件中实现对标准浏览器插件如Flash、Java applets的支持,以使其能够嵌入至Qt应用程序中。规划中的另一个特性是开发一种基于Qt的API以简化对网页内容的操作,如标准DOM API,但更加轻量级。关于QtWebKit的更多细节,请查阅Trolltech白皮书。(译注:Trolltech白皮书非周期性发布,经验证源地址已无效,目前在http://qt.nokia.com/files/pdf可以看到所有的pdf资源,包括Qt4.4的whitepaper,如果对Qt的roadmap感兴趣可以查看这里http://qt.nokia.com/developer/qt-roadmap,当然最佳的做法是加入官方maillist,我们将在文后提供相关信息)

 QGraphicsView工具组件

 QGraphicsView canvas工具组件在Qt4.4中得到了重大改进,包括对全部本地Qt工具组件的支持。具有完整交互功能的工具组件能被直接添加进canvas中并向其它任何canvas绘制组件一样运行。这种特性能够实现工具组件的移动动画,并提供更加复杂的视觉效果。Trolltech的开发人员实现了对输入重定向的完整支持,这意味着用户可以和基于QGraphicsView canvas的Qt工具组件任意交互,甚至当这些组件处于各种动画效果时亦如此。

 “Graphics View并不会自身提供工具组件如QLineEdit或者QComboBox,相反,你应当把现有的工具组件嵌入到场景中(事实上,任何用户自定义的工具组件皆能如此),这一功能可以通过调用QGraphicsScene::addWidget()实现。”Trolltech的Andreas Hanssen的博客在去年阐述了这种功能。“如果你还想传入Qt::Window标识,”你的工具组件甚至将类似QMdiSubWindow一样获得窗口装饰效果。你可以拖动、自定义大小、旋转、缩放或者结合工具组件和其它组件生成极具想象力的修饰或效果转换。

 QGraphicsView支持添加Qt工具组件的功能为更加丰富的用户界面创造了无穷的潜力:这些界面将不再受传统布局框架的局限。工具组件可以在角度变换中漂浮、自由旋转、或者根据用户交互信息变换。桌面上存在大量可供canvas工具组件渲染的位置将提供更多的实用性。例如,在KDE桌面环境中将把这种特性应用于Plasma desktop shell。(译注:Plasma即是KDE的桌面组件)

 当我们在去年首次试验这种新特性时,我们查看了Trolltech的示例代码以确定它是如何工作的,之后我们创建了一个测试应用程序以展示在QGraphcisView中变更角度以缩放和渲染一个QWebView工具组件。这一过程非常易于操作,且仅需要少量代码即可实现。

 

 在我们的测试中发现了极少量的技术缺陷问题,如下拉列表菜单工具组件的定位bug——似乎在4.4发行版中得到修复。开发人员目前已经在很大程度上修正了我们之前测试中提出的性能问题,并且很负责地对这一问题做出更进一步的改进。

 用Phonon播放音乐

 Phonon是一种跨平台的多媒体抽象层,它提供了一些轻量级的API以支持简单的音频或视频片段的录放功能。它支持多后台运行,并且允许应用程序能够实现跨平台地多媒体处理功能,而非不得不去单独处理特定平台的实现细节问题。

 Phonon最初是由KDE开发社区为KDE4开发的,且其最初只支持Xine后台(译注:一种类UNIX平台上的GPL多媒体播放引擎)运行。后来Trolltech决定将其引入Qt,因此他们开发了其他后台支持如GStreamer、Windows的DirecShow 9以及Mac Os X的QuickTime 7。Trolltech已经把这些后台的上行数据流和Phonon集成以便能够得到KDE社区的持续性开发和维护支持。

 由于Trolltech引入的这些后台引擎使得Phonon能够与Windows和Mac OS X等操作系统中的本地多媒体框架无缝整合,Phonon自然将支持相关平台提供的任何解码器和多媒体格式。由于Phonon提供自身独立的抽象层,同样的代码可在Qt应用程序中实现基本多媒体操作的跨平台重用。

 

 其它零碎工作

 在一篇文章内完成Qt4.4所有改进特性的讨论几乎是无法实现的任务,至此我们也只是提供了一些最为显著的特性概览。一些其它同样精彩的特性,如新的并发框架——它可以简化多线程Qt应用程序开发,以及一个支持XQuery标准实现内容操作的XML框架。Qt4.4同时还包括了大量的性能改进和大范围的bug修复工作。

 正如我们上周注意到的,Qt4.4已经被KDE所采用并将用于几个KDE4.1发行版的新特性中。采用Qt作为其跨平台桌面音乐端软件的社交音乐网站Last.fm,也已经在测试Qt4.4,新的Qt发行版将使Last.fm有潜力为Windows Mobile移动设备提供客户端应用软件。

 (正文完)

 编后:下篇文章中,我们将继续贴出其它部分的Qt在线资料。

qt
Comments

关于Qt的一切

 Qt在中国程序员人群中兴起较早,Trolltech亦对中国市场颇为重视。2005年,Trolltech在北京成立代表处,旨在向中国用户提供Qtopia相关的销售服务、培训以及技术支持。同年Qt官网也首次加入双语页面——英语和汉语两种版本(而非现在的多国语言)。

 不甚了解Qt的同学可能会对Qt的功能产生怀疑:Qt难道不是简单的GUI框架吗?为了能更好的解答这个问题,我特从ArsTechnica.com编译了一篇由Ryan Paul撰写的关于深度透视Qt4.4的文章,尽管Qt开发团队刚刚发布了4.7.1的新版本,我依然认为Qt今后的发展趋势将是沿着2005年夏天Qt4.0发布所带来革命性影响的延续,这也是软件工程理论与实践证明目前最好的技术框架之一。同时文后我们也将推荐其它几篇Qt阶段性介绍的文章,值得注意的是,作者原文较为冗长,我们将分两期刊出,以飨读者。

 Troll精品:深度解析Qt4.4(原题:Troll treasure:an in-depth look at Qt4.4) 

 文/图 Ryan Paul 编译 mp77

 Trolltech刚刚宣布了Qt4.4的官方发布版(译注:这里是指2008年5月),这是对Trolltech出品的最受欢迎的、跨平台的应用程序框架的一次备受期待的更新。Qt多许可证分发的模式允许其即可用于开源项目,亦可进行专有的商业开发。她广泛应用于Linux平台,并为KDE桌面环境提供了基础工具包。同时,Qt亦用于许多商业软件如Skype,GoogleEarth以及Adobe Photoshop套件中。

 Qt4.4最受瞩目的更新内容主要包括了多媒体抽象层、基于WebKit的HTML渲染器、一种新的并发框架以及支持基于工具包内的drawing canvas技术渲染工具组件。这也是Qt首次包含对Windows CE和Windows Mobile的支持。

 去年在测试Qt4.4预释放版时我们曾经向您提供了一些早期的功能预览。在目前开发工作已经全部完成、功能较完备的情况下,我们进一步审视了Qt4.4。最终,我们进行了大量测试以探究这些新技术的实现原理。同时,我们也和Trolltech的首席执行官Benoit Schillings一起讨论了Qt4.4,Benoit Schillings向我们分享了一些关于Qt4.4的技术内幕,并且给出了Qt未来版本趋势的一些建议。

 桥接桌面与移动设备的鸿沟

 Qt支持所有主流的桌面操作系统,包括Linux、Mac OS X和Windows。她使用本地API渲染工具组件,这就意味着大多数的Qt应用程序具有基于操作系统的外观一致性。Trolltech同时提供了Qtopia——一个基于Linux移动操作系统的综合开发平台,Qtopia亦被广泛应用于如Sony Mylo、一些Motorola mobile phone handsets中。Qt4.4通过引入对Windows CE的完整支持扩充了自身的可移植性。开发人员现在可以用Qt编写任何一段应用程序代码,就可以完全移植到任何所支持的操作系统中去。

 Qt为Windows CE提供了大量功能,且能很好地适用于创建基于图形的触摸式用户界面。开发人员声称Qt表现出良好的性能和对本地外观和平台体验的强力支持。Trolltech同时发布了可以使Qt与Visual Studio紧密集成的工具,这样能够让现有Windows CE程序员轻松适应这个应用程序框架。

 

 Qt支持Windows CE所带来的潜在好处是,其允许程序员能够将现有的KDE或Qt程序移植到更多的环境中,这将大大扩展目前开源软件在操作系统支持方面的生态系统。我确信自己会非常乐意在Windows Mobile设备中运行基于Qtopia的软件如FBReader,Trolltech的开发人员也已经在实验性地将相对复杂的KDE4应用程序移植到Windows Mobile中。例如,Thomas Hartmann在上个月撰写的博客展示了一种基于KDE4软件的移植,这个软件是一种复杂地图系统绘制系统,它能够在多种Windows设备中流畅地运行。

这种来自Qt更高级别的可移植性吸引了移动设备巨头Nokia,后者正在进行对Trolltech的收购进程中(译注:收购已于2008年结束)。

 这项交易仍然处于欧盟审查之中。今年早先的一项声明指出,Nokia宣称将力促Qt成为一种跨平台的软件开发平台,它将可以在大多数移动和桌面平台上运行。 Nokia也已计划将Qt引入S60和Maemo移动操作系统的(译注:这项计划目前已实现)。

 (未完待续)

qt
Comments

末世之争

 两个看似低端的桌面软件之争最近颇引人瞩目,原因在于双方的用户均数以亿计,随着事态发展也着实影响了一批“用户”。事实上,在桌面软件行将消亡的最后数年里,崇尚“人治”的国家出现此类闹剧倒也不足为奇了。

 然而,作为中国最早成功的一批程序员,当事双方的核心人物在关键时刻均撇下职业道德,各种攻击、口水、宣传战甚至是技术对抗…另一方面,我们对两家公司囊括了本应在国内水平“较高”的技术人员感到遗憾:显然这些本应最具创造性的群体,为了温饱被迫向资本低头,争相研究竞争对手毫无质量的代码和技术细节,这也是各种令人感到“震惊”的破解功能层出不穷的原因之一。

 我们知道,由于政策的原因,原汁原味的国外优秀互联网服务通常被拒国墙之外,取而代之的是风投支持的各类“仿品”。这就直接导致国内互联网知识产权几乎真空,各种服务类软件同质化严重,利益冲突自然就不可避免了。这一点,在两年多前一篇关于facebook的文章就已经表明了我们的观点。

 今天回家打开新闻,发现讨论最热烈的不是“反垄断”就是“企业责任”,这些声音或是来自利益相关方,或是来自死读书的外行学者。可以说,在互联网领域知识产权问题没有彻底解决的今天,“反垄断”根本就是笑话,打跑了大流氓,只会令小流氓们心情舒畅一会而已。至于所谓的企业责任,拿360系列来说,安全引擎来自比特梵德,虽然声称完全免费,但如此庞大的装机量却无法掩盖国内安全环境恶化的事实。对用户唯一存在客观“价值”的恐怕是免去微软正版认证过程的系统补丁在线更新了。至于其它各种辅助管理、优化、清理功能其实是模仿自几款国内著名的共享软件,只是某些大资本的到来使得原本颇具活力的共享软件日渐凋零了。至于腾讯,史无前例的用户规模让它变得无限可能。然而掌握越来越多资源的腾讯似乎也成了靠资本指路的傀儡,这一点在业界也早已有所共识。

 事情最终总是会向应当发展的方向去发展。我认为,腾讯应摒弃大门户时代一站式服务的守旧观念,争取把自己所掌握的资源整合成开放服务平台,才有可能适应未来国际化竞争的要求。而360这类辅助软件消亡得越快,说明我国互联网环境发展得越好,也许正是某些人也意识到了这一点,才最终导致了此次公开冲突。

Comments

Qt来了!

 我们将把Qt(官方发音/kjuːt/,也有读作(/ˈkjuːti/)应用程序框架编程作为一个新的技术类固定专题。Qt是易于学习的,但却很难精通,大概主要是因为她把标准C++作为宿主语言的原因,不过这也恰恰成就了Qt不可阻挡的发展势头。

 历史

 1991年,挪威人Haavard Nord和Eirik Chambe-Eng设想开发一个跨平台的应用程序框架,从而方便程序员开发出能够同时运行在不同平台环境下的应用程序。仅三年时间梦想即成为现实,两人合作成立了Quasar Technologies公司专注于跨平台应用程序框架开发,这家公司也就是后来的Trolltech奇趣科技的前身。而对于Trolltech,除了旗下Qt框架和一整套嵌入式Linux开发平台Qtopia之外,著名的Linux桌面环境KDE就是基于Qt开发的。

 2008年6月,芬兰手机厂商Nokia收购了Trolltech,其主要目的是将Qt框架技术与自身Symbian平台紧密整合。目前基于Qt的Nokia Qt SDK也已于早前正式发布。

 如果说在移动平台领域S60似乎是岌岌可危的话,Qt未受丝毫影响,如AutoDesk计算机辅助设计系列软件、Google Earth、Adobe Photoshop Album甚至欧洲航天局、Skype等都使用了基于Qt的应用程序框架。

 设立专题的原因

 我们通常采用windows 7和microsoft visual studio 2010 ult作为主要开发环境,同时采用opensuse或其它Linux发行版作为测试环境,时间充足的话,也可能会尝试基于Nokia Qt SDK的移动设备软件开发。实际上,Qt大有作为的还是Linux及其嵌入式领域,而我们还是主要关注有关基于Qt的win32桌面软件,但并不表示我们将其视作MFC等类似这些经典框架的替代品,实际上通过早期了解后,我们发现Qt有她所擅长且表现出色的领域,但也并非全能。

 开发平台的选择

 上文指出我们将主要关注Qt在Windows系列平台上的表现,那么采用Microsoft主打的最新IDE及其编译程序是有必要的。至于一些其它方法,例如构建MinGW编译环境,就显得过于简略而给人一种直奔结果的感觉。当然我们可以将MinGW设置为Qt creator这种跨平台IDE的主编译环境,甚至可以在Qt creator中设置MSVC为主编译环境。类似这种组合可能比VS+Qt这种“重量级”组合轻巧的多,对开发过程而言也注定方便的多。然而我们还是建议选择自己喜爱的环境来工作,这不仅仅能保证基本的编码效率,更重要的是能保持一个良好的心情来面对复杂问题求解。

qt
Comments

遁鸽记(下)

 等我再回到学校,仍能在阳台的台阶上看见雨点。白鸽依然蜷缩在角落里,这次是不停发抖,不过脚绳被去掉了。

 后来得知,白鸽被剪去了羽翼,由于操作不慎竟导致出血。仔细看下两边仍有一大片风干的血迹,墙角里铺的两页纸也沾满了血渍。据说后来还擦上了用于外伤的药……

 我颇有些无语,之前担心极擅飞翔的信鸽到了人的手里会被养成鸡,不想一语成谶,只怕连鸡都不如了。

 我对白鸽和雨点之间的关系比较好奇。雨点自从在阳台上看见白鸽就从没彻夜不归过,平时天气好时也只飞出去几个小时。白鸽缺乏活力,雨点则相反,吃东西喝水都要活跃得多。天冷的时候两只鸽子喜欢趴在地上睡,倒少见金鸡独立了。

 从资料上看,一个鸽舍内当然是雌雄自然配对,但当雌雄数量不平衡时,也可能发生同性配对的情况。

 雨点因为白鸽的境遇而对我们感到不满,有时趁阳台门没关溜进屋内拉几泡屎就跑,这种行为对于白鸽是万万不敢越雷池一步的。

 鸽屎多且难以处理,我拿纸擦了几次就感到不耐烦了,决定教训一下雨点。

 我们阳台上有只基本不怎么用的垃圾筐,我把雨点“关”在角落里。白鸽看上去比较着急,在筐子旁边走来走去,它竭力想钻到筐子后面去——显然这不可能,因为筐子就在墙角下放着。

 鸽子毕竟是天生要飞的,雨点当然不用担心,白鸽只剩下一对剪得破碎不堪的翅膀,见到人时更加吓得到处跑,连一只纸箱也飞不上去。

 遗憾的是,本文名为“遁鸽记”,却无法见证一个令人期待的终局,遂匆忙收于此。只希望白鸽终有一日能归予原主,复回天空。

Comments

遁鸽记(上)

[nggallery id=3 template=galleryview images=5]

 10月10日晨,突降暴雨。

  醒来发现天色仍很暗,电话开机一瞅——10点钟,又见阳台门被各种风敲得噼里啪啦,这才知道碰上难得的诡异天气了。到了中午,和阿仝吃饭回来,正要开写一个新专题。见德锋指着阳台门外道:咱们这来了只鸽子!遂隔着门窗看,确实,这雨来的十分突然,白鸽躲进阳台避雨也属正常,又见左足上似乎有足环,毕竟也是有主的了。

 不会,众人决定邀鸽入室,但也知道执行起来有难度。这时佩哥二话不说冲出阳台,一把扑向白鸽,小白估计也是被雨打的秀逗的不行,等缓过神来时右脚已被栓到床边了。

 仔细看了看白鸽的足环——中国种鸽880155,虽然查不出什么门道,恐怕也没少受鸽主的悉心照顾了。然而雨一直下,只好先将就一晚了。

 晚饭出去给白鸽找玉米吃,无奈整天围着南门外叫嚷“热棒棒(平声)”的老太们竟没来做生意,只好在村里找了两只馒头回来。德锋已经从食堂带了粘玉米,众人把“大餐”铺好放至桌下,白鸽不但不理,更往衣柜下钻去。这一钻就再没出来过。

 夜,鸽子咳嗽不停,可能患了病,不过似乎不严重。

 次日上课回来,白鸽依旧畏缩,摆了一夜的“大餐”似乎没怎么动过,倒是上面沾了一泡鸽屎。

 鸽子乃飞翔物,并非鸡鸭之流,我提议至少迁至阳台圈养再说。

 白鸽重见天日心情也好了些,开始吃些大米,还有数天前剩的馒头了。

 又过了两日,这次是翘了科社回来,瞥了眼鸽子——没异常。于是剥了一把馍渣撒在台阶上,平时白鸽见我走远了才会来吃,就顺手把阳台门关上。

 一会回头看看,窗台上俨然不止白鸽一只——竟有只雨点也站在白鸽不远处。我惊异,但也不敢贸然去阳台。雨点转头看看白鸽脚上的绳子(普及下,鸽子的眼睛长在脑袋两边,故需要不停转动脑袋来感知景深信息),显然对窗台上新撒的馍渣更感兴趣。

 两只鸽子吃食的场面显然更有活力一些,然而即使我的出现也没惊飞雨点,现在我开始对两只鸽子的性别感兴趣了。

 鸽子的御寒能力不俗,因此德锋找来的纸箱始终没能派上用场,此外要说的是,鸽子的消化系统简直简单的可以,仅仅几天时间阳台就堆满了鸽子粪。

 雨点喜欢在台阶上玩金鸡独立,这时脑袋差点就能缩到身体里去,想到白鸽可能也差不多,只是腿脚不太灵便……

 晚上两只鸽子贴在一起睡。

 一天中午回来继续剥馍渣(雨点对馍渣的兴趣要远超过大米,这似乎也影响了白鸽起初的饮食习惯),无意中发现白鸽在轻啄雨点的脖子(这个鸽子有时也会对自己做同样的动作,但互相做的还真没见过)。

 雨点在台阶下踱步时会时不时扇动一下翅膀,有时想飞到台阶上,但大部分尝试竟以失败告终……

 这天我怀揣馍渣来到阳台,雨点已经在台阶上原地扑扇了好几下,突然从3楼一个滑翔就没影了。

(未完待续)

Comments

又见银幕和谐

 之前的确听过《驯龙记》在国内上映的消息。Dream works虽然不比Disney/Pixar量产出诸多经典,但诸如马达加斯加、史莱克等已经完全可以与“总动员”系列比肩了,这还不包括变形金刚这种烧钱机器在更大范围内的影响力。  影片宣扬的是一种普世的和谐,类似的主题近年来在银幕上经久不衰,动画片就更是如此了。驯龙记的故事也是精彩的,毕竟有儿童畅销书作后盾。从影片角色设定的角度来说,影片中的“龙”是与众不同的:多了些Q气,少了些邪气,关键是此消彼长得恰到好处,为上座率打下了坚实的基础。  然而这部《驯龙记》却没能在名气上继承前辈们的衣钵,尽管在观影过程中让人给予了它愈多的厚望。问题在于,影片太注重于“和谐”的表达,尤其是到了影片中后期已然看点全无。就像人们刚刚被引起了政治、环境等方面的思考兴趣,却突然产生了大一统结局。这里又让人想起了宫崎吾朗的名著改编《地海战记》,原著当然是巨著,而这部毁誉参半的影片却因为极其含蓄的表达受到批评。实际上,对于“平衡”的理解,影片有义务留给观众思考的空间。这样的话,若干年后,人们突然发现,内涵电影终于被捧为经典。

Comments

一种数字图像无损压缩算法——基于动态规划方法

前言

 本文是基于9月29日的算法设计与分析课程上所讨论的内容总结而成的。因为受到ppt版面所限,原题目中并无“数字”两字,考虑到准确性这里重新补上。由于时间比较仓促且能力所限,意识到有些问题在课堂上可能没有阐述清楚,因此在这里把已经提到的和未能提到的问题汇总成篇,以备参考。

 我本人的参考书是福州大学王晓东的《计算机算法设计与分析(第3版)》(下称“王书”),本课对应于原书第三章第七节的部分内容,当然课堂上我们曾提出王书中有部分不妥之处,并提出了初步的改进建议,这里仍将保留该部分内容。

问题提出

 众所周知,数字图像压缩问题是随着网络通信技术的不断发展而提出的。通常把图像数据压缩方案分为两类:有损图像压缩和无损图像压缩。有损图像压缩通常能够达到很高的压缩率,但是其在采样和频域变换过程中损失了部分像素真值,从而导致图像质量有一定下降。当前常见的数字图像压缩技术有JPEG、MPEG(主要应用于运动图像压缩)等。无损图像压缩从字面意思上理解就是不会降低图像质量,但压缩率会变得不太稳定:典型的无损图像压缩实现有两个步骤:去相关性和编码。去相关性的目的就是为了减少图像冗余,这包含字、字节甚至是二进制位的冗余消除,当然消除冗余后的图像数据需要重新编码并给出相应的索引表,从而实现压缩和解压缩。

 这里给出一种数字图像无损压缩方案。假设数字图像像素点灰度值序列为{p1,p2,…,pn},其中整数pi(1≤i≤n)表示像素点i的灰度值,其范围通常为0~255。将像素点序列{p1,p2,…,pn}分割成m个连续段S1,S2,…,Sm。第i个像素段Si中(1≤i≤m),有l[i]个像素,且该段中的所有像素灰度值只用b[i]位表示。确定像素序列{p1,p2,…,pn}的最优分段,使得依次分段所需的存储空间最小。

初步分析

 设t[i]=∑l[k],1≤k≤i-1,1≤i≤m,则第i个像素段Si为Si={Pt[i]+1,…,Pt[i]+l[i]},1≤i≤m。另设hi=上界(log(max(Pk+1))),其中t[i]+1≤k≤t[i]+l[i],则有hi≤b[i]≤8。故bi可用3个二进制位表示。另设1≤l[i]≤255,则需用8位表示l[i],其中1≤i≤m。因此第i个像素段所需的存储空间为l[i]×b[i] +11位。故对于全部像素序列{p1, p2,…, pn},需要∑l[i]×b[i]+11m,1≤i≤m。

确定最优子结构

 设l[i],b[i],1≤i≤m是{p1,p2,…,pn}的一个最优分段。显然,l[1],b[1]是{p1,…,pl[1]}的一个最优分段,且l[i],b[i],2≤i≤m是{pl[1]+1,…,pn}的一个最优分段。

 这部分的证明应用反证法,大体思路如下:已知{p1,p2,…,pn}有最优分段l[i],bi ,最优总存储空间为Θ。假设上述结论中的l[1],b[1]和l[i],b[i],2≤i≤m不全是相应序列的最优分段,由上部分最后一个公式可得该分段存储空间Θ’>Θ,这与已知l[i],bi 为最优分段相矛盾,故假设不成立。

重叠子问题和状态转移方程

设s[i],1≤i≤n是像素序列{p1,p2,…,pn}的最优分段所需的存储位数。由最优子结构性质知:

s[i]=min{s[i-k]+k*bmax(i-k+1,i)}+11,其中bmax(i,j)=上界(log(max{Pk}+1)),1≤k≤min(i,256)。

动态规划算法设计

[code]Compress(n,p,s,l,b)  for i <- 1 to n   b[i] <- length(p[i]); //length:log(p[i])   bmax <- b[i];   s[i] <- s[i-1] + bmax;   l[i] <- 1;   for j <- 2 to i and Lmax //Lmax=256    if bmax < b[i-j+1]     then bmax <- b[i-j+1];    if s[i] > s[i-j] + j * bmax     then  s[i] <- s[i-j] +j*bmax;      l[i] <- j;   s[i] <- s[i] + header; //header=11[/code]

计算复杂度

 空间复杂度O(n)。

 时间复杂度分析:

[code]for i <- 1 to n   …   for j <- 2 to i and Lmax //Lmax=256    …[/code]

因此亦为O(n)。

构造最优解

 在构造出最优解之前我们先举例给出上述动态规划算法的结果。例如:

 输入像素序列:196,120,48,5,2,1。 那么计算后得出:s={19,27,35,43,51,55},l={1,2,3,4,5,3},b={8,7,6,3,2,1}。由王书P71第二句知:“最优分段的最后一段的段长度和像素位数分别存储于l[n]和b[n]中”。简单验证可知,l的定义是正确的,但是b无法满足无损压缩的要求。这是因为,由王书算法计算后得出,{5,2,1}为最优分段的第二段,同时该段像素位数为1位,显然,1位空间仅能保留像素1的信息,而前面的5、2均会丢失。这就是我们指出的王书中可能存在的错误。如果沿用书中的动态规划算法,那么正确的描述应为:最优分段的最后一段的段长度存储于l[n]中,其相应的像素位数应是max{b[n-l[n]+1],…,b[n]}。其前一段的段长度应为l[n-l[n]],而对应的像素位数如下:max{b[n-l[n-l[n]]+1],…b[n-l[n]]}。

 鉴于上述描述比较繁琐,又考虑到保证原算法的正确性,我们给出如下改进的动态规划算法:

[code] declaration B[n]    // global Compress(n,p,s,l,b)  for i <- 1 to n   b[i] <- length(p[i]); //length:log(p[i])   bmax <- b[i];   B[i] <- b[i];   s[i] <- s[i-1] + bmax;   l[i] <- 1;   for j <- 2 to i and Lmax //Lmax=256    if bmax < b[i-j+1]     then bmax <- b[i-j+1];    if s[i] > s[i-j] + j * bmax     then  s[i] <- s[i-j] +j*bmax;      l[i] <- j;      for k<- i-j+1 to i       B[i]<-bmax;   s[i] <- s[i] + header; //header=11[/code] 其中数组B是一个全局量,我们用于存储最优分段中的像素位信息,同时在构造最优解的过程中用B替换b作为输入参数,经验证,该程序可以实现题目预设的目标。

结论

 我们应用动态规划方法解决了一个较为普通的最优化问题。事实上这种思想可以应用于许多具有类似特征的问题求解中。当然,我们学习动态规划的目的并非是为了求解类似算法竞赛难度的各类习题,而是将这种思想结合进平时对实际问题的解决中,这样的话,我想,DP的魅力将是无穷的。

Comments

缘分又尽了…

 为什么要加个“又”呢,因为这已经不知道是我第几次afk了。

 鉴于此,现大概回顾一下前几次的情况:

 05年9月,史诗般的安其拉之战摆在眼前,06高考更摆在眼前,考虑再三之后还是忍痛割爱,转去踢实况了…

 06年8月,一区红龙军团自筹公会失败,追随古殿前辈征战新魔剑亚服…到西大后因为各种条件限制最终放弃,亚服更是没坚持多久。不过9月wow推出随机战场,即转战至新7区。

 在古加尔的近两年里经历过MC、BWL、TAQ、NAXX各种开荒,以及TBC初期的疯狂之后,08年初,自筹公会再次失败…后转经达文格尔,至灰谷,开始休闲之旅。

 09年初,决定考研,处理并删除所有已知账号角色(原一区红龙军团号因时间久远忘记除外)。

 如今,因cwlk回归二十多天之后,又要面临afk了。总结一下原因,大概每次afk都是形势所迫。至于回归,固然与04年起就充满期待并做足准备的事实密不可分,然而多数情况里的直接原因恐怕都差不多了。

 我真的不想再做无谓的“回归”了。但试想一下,如果已经过去的数千小时没有wow,又会去做些什么。(未完)

Comments