Category Archives: 软件技术

软件相关的技术,问题,经验和故事

CMake编译Qt

貌似有个CMake教程上说过“不要使用CMake编译Qt”,原因是Qt有自己的QMake,用CMake会费时费力,不过为了能把所有工程采用同样的编译方式,还是尝试了一下,的确很麻烦。 首先需要下载Qt SDK,因为打算用VS2010编译,所以下载了everywhere的4.7b2版本(注意:4.6.3不支持2010,强编会出错,4.7b2静态编译也会有同样的问题,估计正式版会有改善吧) 编译整体还是比较简单的 把VS目录下的vcvars32.bat复制到qt目录下 打开控制台,首先运行vcvars32.bat configure –platform win32-msvc2010 nmake 等待N长时间编译完成,真的非常长时间 编译结果6G,保留bin,include,lib目录即可 4.7的编译有个缺点就是所有路径都是完整路径会写死,且不能选择编译结果的输出路径,所以要是打算多次编译一定要确定好目录,否则会很麻烦。 然后写一个简单的CMakeLists.txt文件: #Project Name PROJECT(BookStar) SET(QT_FOLDER D:/qt-4.7.0-b2) # include directories INCLUDE_DIRECTORIES(inc                     ${PROJECT_BINARY_DIR}                     ${QT_FOLDER}/include) # lib directories LINK_DIRECTORIES(${QT_FOLDER}/lib)  # source SET(SRCS     src/main.cpp     src/mainwindow.cpp        ${MOCS} … Continue reading

Posted in 软件技术 | Tagged , | Leave a comment

绕过CMake无法编译zlib的问题

最近研究CMake,发现如gtest,zlib这些项目都支持CMake,于是拿来编译了一下,gtest一切正常,zlib则是windows下正常,Ubuntu下出了问题 CMake Error at lib/zlib/CMakeLists.txt:65 (message): You must remove lib/zlib/zconf.h from the source tree.  This file is included with zlib but CMake generates this file for you automatically in the build directory. 到zlib目录下干掉zconf.h,在重新编译: Scanning dependencies of target zlib Linking C … Continue reading

Posted in 软件技术 | Tagged , , , | Leave a comment

正点下班1.5发布

正点下班是我在Android下开发的第一款软件,可以说是练手之作。它的功能非常简单,就是提醒你下班时间到了。功能上有点类似闹钟,但因为工作时间每天相对固定,比如8小时或者9小时,所以它可以更快捷,基本是一次点击,等待提醒就可以了。 1.5版增加如下特性: 兼容Android 1.5即API Level 3 增加取消当前闹钟的设置,之前没有这个,一旦不小心开了闹铃就只有关机一途,实在汗。。。。 解决由于关机导致闹钟失效的问题。主要是设置了一个BOOT的BroadcastReceiver,每次启动机器会自动将闹铃重新设置 修改配置界面为标准界面。之前竟然不知道Android还有专用的Preference XML,这次换上 修改主界面采用倒计时方法,毫秒级的,那位朋友着急下班可以不时看看:) 下面是一段文字广告: 无辜男员工:我上班是动态时间又要打卡,以前常常搞不清楚几点下班,现在有了正点下班,上班时候运行一下,下班就会自动提醒我,再也不用无偿加班了:) 狗头专家:你可能认为这就是一款闹钟软件,但你会每日为下班时间定闹钟吗?当然不会,因为又要算下班时间,又要一堆的手机设置,太复杂了。正点下班没有这些问题,一键搞定下班提醒,方便,舒心。 无辜女员工:太方便了,自从用了正点下班,在无后顾之忧,上班也变轻松了,你看,脸上的小痘痘都没有了:〉 最后,一如既往,正点下班也是一款开源软件,可以通过以下网址获取到所有代码: http://code.google.com/p/jee-android

Posted in 公告通知 | Tagged , , | Leave a comment

VeryCD拦截自定义协议分析

一般来说,我们通过注册自定义协议,可以在浏览器中通过链接方式自动打开客户端程序。 不过,如果没有客户端程序就会导致无法访问的页面错误,如何才能够判断自定义协议在本地没有被注册,并弹出客户端的安装提示呢? 新装系统以后,意外发现VeryCD可以在没有安装eMule的时候会弹出提示,效果如下:   于是做了一点研究,希望能够实现一样的效果。 VeryCD网页采用YUI库,多数自定义的js都是以编号结尾如:group.js.r23406,不知道是不是使用YUI压缩的结果,如上图的对话框代码集中在footer.js.r23406中,大概的流程: 首先,在页面初始化时,所有ed2k://的link设置click事件。 然后,在click事件中创建IE2EM.IE2EMUrlTaker对象,该对象好像是为了处理如上图中“复制选中的链接”的功能。该对象应该是在eMule安装时注册的,所以在没有安装时会导致异常,在异常catch中,显示如上的对话框。 最后,如果用户选择下载则跳转页面到下载页面,如果选择已安装,则设置Cookie。 但不知道为什么,VeryCD在网页上特别做了浏览器类型判断,非IE的浏览器中不显示该对话框,所以在如Firefox,Chrome这些浏览器中只是不下载,什么反应都没有。 基本来说,VeryCD就是通过尝试创建客户端的ActiveX控件,在失败时弹出安装提示。 该方法的缺点是,只对IE有效,因为其他浏览器并不支持ActiveX控件,所以无论是否安装都会导致异常,这也可以解释为什么VeryCD特别在网页上判断浏览器类型,并对其他浏览器进行了屏蔽。

Posted in 软件技术 | Tagged , | Leave a comment

多层压缩等于不压缩?

从网上下了一个东西,zip的压缩包 解压是55个zip压缩包 再解压是55个rar的分卷压缩包 再解压才是真正的文件 一般压缩文件就是为减小文件个数,压缩文件占用的空间,那么如此多层的压缩当然是目的当然是进一步减少文件的大小了,那么效果如何呢?以此为例,如下表: 原文件大小 273,156,452 字节 Zip压缩 272,770,342 字节 7z压缩 274,608,539 字节 多层压缩 273,152,780 字节 大概是因为原文件本来就做过压缩的缘故,多层压缩的结果只使文件缩小了不到4K,而zip单次压缩的结果更优。 当然这只是一个特例,但也说明多层压缩未必能进一步缩小文件大小,所以请勿再作如此麻烦的事情了:)

Posted in 七嘴八舌, 软件技术 | Tagged | Leave a comment

又上了名字空间的套

在做一个XML的XSL,原XML如下: <?xml version="1.0" encoding="utf-16"?> <book version="5.0" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:xi="http://www.w3.org/2001/XInclude" xmlns="http://docbook.org/ns/docbook">   <info>     <title>test</title>     <author>       <personname>         <othername>Unknown</othername>       </personname>     </author>     <bibliosource>Unknown</bibliosource>   </info> </book> 制作的XSL: <?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">     <xsl:template match="info">         <xsl:value-of … Continue reading

Posted in Jeebook, XML | Tagged , , | Leave a comment

XHTML解析的实体问题

我在《集成Html Tidy》一文中说过使用HtmlTidy转换HTML以方便使用XML解析器解析,事实上,并没有那么简单,随便解析几个XHTML就会碰到解析异常的问题,错误是“Reference to undeclared entity ‘nbsp’”。 查找原因发现,在XML中,除了&lt; &gt; &amp; &apos; &quot;以外,其他如&nbsp;之类的实体必须通过DTD或其他方式定义。Html Tidy转换出的XHTML并没有显式定义这些实体,而是采用类似以下的定义: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 在这个DTD中会定义如&nbps;之类的实体,但由于需要到W3C的网站上去获取这些定义,所以XML解析器默认会忽略这些定义,就导致没有定义的异常。 不过在.net中提供了XmlResolver类帮助处理这种情况,而我们需要做的就是重写这个类,并将XHTML中定义的DTD重新指向我们指定的某个位置,如上的情况操作如下: 1. 下载http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd 2. 将下载的dtd作为资源放入程序中 3. 重写XmlResolver类,增加判断,当传入的路径为"-//W3C//DTD XHTML 1.0 Transitional//EN" 时就以流方式返回资源中的DTD 4. 创建XmlReader,并将重载的XmlResolver设置在XmlReader中 5. 使用该XmlReader装载解析XHTML 完成以上步骤,再解析XHTML就不会再有异常出现了。当然XHTML的DTD定义不止这一种,为了兼容起见,最好将所有的DTD定义都按以上的步骤加入程序中。 具体实现代码可以参考我的开源项目:Page Releaser

Posted in PageReleaser, 我爱开源 | Tagged , , | Leave a comment

UrlRewritingNET实现URL Rewrite

在asp.net中实现URL Rewrite,除了IIS本身带的URL Rewrite Module以外,还有很到其他的解决方案,比如UrlRewritingNET。 UrlRewritingNET号称除了文件扩展名Rewrite需要IIS支持以外,其他所有操作都不需要IIS设置,这当然对虚拟主机的网站来说是非常便利的。 下面看看怎么来部署UrlRewritingNET: 1. 首先将下载的dll放置到bin目录 2. 修改Web.config,增加UrlRewritingNET的相关配置如下: <?xml version="1.0"?> <configuration>     <configSections>         <section name="urlrewritingnet"                  requirePermission="false"                  type="UrlRewritingNet.Configuration.UrlRewriteSection, UrlRewritingNet.UrlRewriter"/>     </configSections>     <urlrewritingnet rewriteOnlyVirtualUrls="true"                    contextItemsPrefix="QueryString"                      defaultProvider="RegEx"                      xmlns="http://www.urlrewriting.net/schemas/config/2006/07">         <rewrites>             <add name="category"                  … Continue reading

Posted in Jeebook, 软件技术 | Tagged , | Leave a comment

HTML页面之间的参数传递的局限性

动态网页传递参数比较简单,如果想在HTML之间传递参数就需要一点技巧,摘录两种方法如下: 采用字符串解析的: /* *函数功能:从href获得参数 *sHref:   http://www.cscenter.com.cn/arg.htm?arg1=d&arg2=re *sArgName:arg1, arg2 *return:  the value of arg. d, re */ function GetArgsFromHref(sArgName) {      var sHref= document.location.href;     var args  = sHref.split("?");     var retval = "";     if(args[0] == sHref) /*参数为空*/     { … Continue reading

Posted in Jeebook, 软件技术 | Tagged , , | Leave a comment

实现HTML的简单压缩

PageReleaser需要一种HTML的压缩算法,Google了很久,发现如果只是简单去除空白和注释的话,使用XLinq就可以轻易的实现 先看看MSDN是怎么说的: 一种常用方案是读取缩进的 XML,在内存中创建一个没有任何空白文本节点(即不保留空白)的 XML 树,对该 XML 执行某些操作,然后保存带缩进的 XML。在序列化带格式的 XML 时,只保留 XML 树中有意义的空白。这是 LINQ to XML 的默认行为。 另一个常见的情况是读取和修改已经有意缩进的 XML。您可能不想以任何方式更改这种缩进。若要在 LINQ to XML 中执行此操作,您要在加载或解析 XML 时保留空白,并在序列化 XML 时禁用格式设置。 简单的说,XDocument载入时,默认使用LoadOptions::None,自动去掉XML的空白;保存时,默认使用SaveOptions::None,自动格式化XML。 也就是说,使用XDocument将一个HTML文档打开什么也不作就保存,其实等于实现了HTML的格式化。 而如果在保存时,使用SaveOptions::DisableFormatting参数,看似要保存XML的空白,由于载入时所有空白都被删掉了,其实等于删除了所有空白,于是去掉空白就这样实现了。 至于删掉注释也很简单,只是需要注意,一般页面嵌入JavaScript会使用注释节点包裹,需要例外处理。 整个HTML压缩代码如下: var nodes = from s in doc.DescendantNodes() where … Continue reading

Posted in C#, PageReleaser, XML | Tagged , , | Leave a comment