<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Program | Hessian's Blog</title><link>https://hessian.cn/cat/program</link><description>Hessian 的技术笔记：Linux、C++、网络与嵌入式</description><language>zh-CN</language><atom:link href="https://hessian.cn/cat/program/index.xml" rel="self" type="application/rss+xml"/><item><title>改hosts不生效？教你清理Chrome的DNS缓存</title><link>https://hessian.cn/p/1645.html</link><pubDate>Fri, 22 Oct 2021 18:53:23 +0800</pubDate><guid>https://hessian.cn/p/1645.html</guid><description>在进行web开发的时候，我们经常会修改hosts文件进行测试，但是偶尔会发现改了hosts文件并不能立刻生效。这是由于浏览器自身对DNS（域名指向）是有进行缓存的，除了缓存之外，由于HTTP1.1支持连接复用，如果之前打开过这个页面，那么即使清理了DNS缓存也会因为复用连接再继续连接到旧的域名指向地址。如果出现连接被复用的情况就需要手动关闭活跃连接了。&#10;</description></item><item><title>Nuxt不停机部署指南</title><link>https://hessian.cn/p/1643.html</link><pubDate>Fri, 22 Oct 2021 18:49:53 +0800</pubDate><guid>https://hessian.cn/p/1643.html</guid><description>在我们的服务器环境中有不少Nuxt应用，但是项目的配置都有问题，会导致项目部署重启的时候会不可用，提示 502 Bad Gateway。而且启动服务的时候总会有奇怪的错误信息，而真正的错误日志又看不到。&#10;</description></item><item><title>让KindEditor支持MP4视频（使用ckplayer播放器）</title><link>https://hessian.cn/p/1544.html</link><pubDate>Tue, 29 Jan 2019 01:57:38 +0800</pubDate><guid>https://hessian.cn/p/1544.html</guid><description>参考文章：https://blog.csdn.net/zhjx922/article/details/7601660&#10;KindEditor本身支持音视频文件的上传，但是对于这些文件的支持是依赖于浏览器控件的，兼容性很差，而且现在比较常见的视频文件MP4也不支持，因此本文提供了对KindEditor进行修改的办法，使其在添加视频后可直接使用CKplayer进行播放。&#10;</description></item><item><title>Vue.js 学习资料</title><link>https://hessian.cn/p/1538.html</link><pubDate>Sat, 26 Jan 2019 11:51:41 +0800</pubDate><guid>https://hessian.cn/p/1538.html</guid><description>awesome-vue （项目大集合） https://github.com/vuejs/awesome-vue&#10;前端开发之走进Vue.js http://www.jianshu.com/p/78c9e5342990&#10;ECMAScript 6入门 http://es6.ruanyifeng.com/&#10;Vue.js 指南 https://cn.vuejs.org/v2/guide/&#10;Vue.js API&#10;https://cn.vuejs.org/api&#10;vue-router https://github.com/vuejs/vue-routerhttp://router.vuejs.org/zh-cn/advanced/meta.html&#10;vue-resource&#10;https://github.com/pagekit/vue-resource&#10;vue-cli&#10;官方指南：https://cli.vuejs.org/zh/guide/ https://github.com/vuejs/vue-cli&#10;https://github.com/vuejs-templates/webpack&#10;http://vuejs-templates.github.io/webpack/&#10;https://github.com/vuejs/vue-cli&#10;https://github.com/vuejs-templates/webpack&#10;http://vuejs-templates.github.io/webpack/&#10;vuex 中文文档&#10;https://vuefe.cn/vuex/actions.html&#10;官方实例 https://github.com/vuejs/vuex/tree/dev/examples/shopping-cart&#10;vuex入门实例(中文，非官方) https://segmentfault.com/a/1190000005018970#articleHeader11&#10;</description></item><item><title>解决IE8下FlashSocket无法连接java websocket的问题</title><link>https://hessian.cn/p/1534.html</link><pubDate>Sat, 26 Jan 2019 11:40:21 +0800</pubDate><guid>https://hessian.cn/p/1534.html</guid><description>参考文章： iOS 与 Java 服务器之间 SSL 握手失败的解决：Cipher Suites&#10;Flash socket在IE8下会使用TLSv1进行通信，且Cipher suites只有有限几项jre默认不支持的。 我服务端用的是Springboot+Tomcat Embed，开启debug之后会看到cipher suite不支持的异常：not found cipher suites in common。&#10;</description></item><item><title>不改路由表实现智能选择线路，提升访问国内外网站速度</title><link>https://hessian.cn/p/1472.html</link><pubDate>Tue, 15 Jul 2014 15:39:54 +0800</pubDate><guid>https://hessian.cn/p/1472.html</guid><description>互联网发明以后，我们可以很容易的去访问世界各地的知识资源。但是受限于网络环境的原因，部分资源我们去访问的时候会很慢，或者访问不了，这时候我们可以通过跳板、隧道、虚拟私有网络等形式去进行访问。在使用虚拟私有网络的过程中，大部分软件会通过修改网关地址将所有数据都通过虚拟私有网络进行传递，然而我们很多时候访问某些特定资源，比如本地资源时并不希望数据通过虚拟私有网络，这怎么办呢？&#10;</description></item><item><title>用goproxy实现基于VPN的本地HTTP代理</title><link>https://hessian.cn/p/1461.html</link><pubDate>Sat, 05 Jul 2014 18:14:20 +0800</pubDate><guid>https://hessian.cn/p/1461.html</guid><description>我最近用VPN的时候觉得有些地方不太好用，比如说用HTTP代理的时候可以用Chrome的proxy-switchysharp插件做自动切换，这样访问国内资源时和访问国外资源时都很快。因此我用goproxy写了几行代码做了个可以指定本地出口IP的http proxy，连VPN时去掉“Send all traffic over VPN connection“选项，然后用proxy-switchysharp自动切换出口。&#10;不过现在程序还有一些问题，我尝试去访问facebook和twitter都失败了，不知道为什么，同样是https，google和stackoverflow都是正常的，求高手指点。&#10;</description></item><item><title>一个Go语言SSH客户端的例子</title><link>https://hessian.cn/p/1420.html</link><pubDate>Fri, 07 Mar 2014 18:29:26 +0800</pubDate><guid>https://hessian.cn/p/1420.html</guid><description>an example of ssh client in golang&#10;Google搜了好几个例子都用不了，好像是因为ssh库更新了，没办法只好自己摸索了。&#10;这里用的是RSA Private Key来连接，要改成用密码连接也很容易。&#10;</description></item><item><title>*HACK* 为QT的TCP socket连接绑定本地IP地址</title><link>https://hessian.cn/p/1401.html</link><pubDate>Fri, 10 Jan 2014 01:27:42 +0800</pubDate><guid>https://hessian.cn/p/1401.html</guid><description>有时候我们会在机器上同时绑定多个IP地址（可能都是在一个网卡上），但是我们却无法指定程序使用哪个IP地址去建立连接。&#10;虽然我之前的另一篇文章《在Windows/Linux下程序指定IP地址》讲过一种hack的办法，但是并不总是那么有效。就比如博主最近遇到的一个QT写的程序，不知道为什么就是bind不了，不过万幸的是我们有源代码。&#10;通过修改QT框架的QNativeSocketEngine的实现我们还是可以bind到我们需要的IP地址的。&#10;</description></item><item><title>在Windows/Linux下让程序指定出口IP地址</title><link>https://hessian.cn/p/1378.html</link><pubDate>Fri, 18 Oct 2013 01:43:00 +0800</pubDate><guid>https://hessian.cn/p/1378.html</guid><description>Windows/Unix* 系统都支持为一个网卡绑定多个IP地址，但是通常操作系统会根据路由表自动选择IP地址，应用程序使用哪个IP地址用户无法主动控制。本文分别讲解在Linux和Windows下为应用程序绑定指定IP地址的方法。&#10;</description></item><item><title>NGINX userid 分析、解码</title><link>https://hessian.cn/p/1362.html</link><pubDate>Wed, 18 Sep 2013 02:05:43 +0800</pubDate><guid>https://hessian.cn/p/1362.html</guid><description>生成userid的代码在 http/modules/ngx_http_userid_filter_module.c 大概550行左右。&#10;uid_set 是4个uint32构成的，其中比较有用的是第二个unit32，是userid的生成时间。第四个是一个递增值 以 0x03030302 为初始值，每次递增0x100。&#10;</description></item><item><title>SimpleScriptLoader for Firefox 一个简单的脚本加载工具</title><link>https://hessian.cn/p/1333.html</link><pubDate>Fri, 16 Aug 2013 01:49:39 +0800</pubDate><guid>https://hessian.cn/p/1333.html</guid><description>最近在做的一个项目需要调用JS文件对网页内容进行修改，老是用Firefox复制粘贴特别麻烦，于是乎就顺手写了个小扩展SimpleScriptLoader。这个小东西可以手动或者自动的加载指定的JS文件，非常简单易用。&#10;</description></item><item><title>广告术语 CPM、CPC、CPA 是什么意思？</title><link>https://hessian.cn/p/1328.html</link><pubDate>Tue, 23 Jul 2013 22:31:28 +0800</pubDate><guid>https://hessian.cn/p/1328.html</guid><description>1.CPM(Cost Per Mille，或者Cost Per Thousand;Cost Per Impressions) 每千人成本 网上广告收费最科学的办法是按照有多少人看到你的广告来收费。按访问人次收费已经成为网络广告的惯例。CPM(千人成本)指的是广告投放过程中，听到或者看到某广告的每一人平均分担到多少广告成本。传统媒介多采用这种计价方式。在网上广告，CPM取决于“印象”尺度，通常理解为一个人的眼睛在一段固定的时间内注视一个广告的次数。比如说一个广告 横幅的单价是1元/CPM的话，意味着每一千个人次看到这个Ban-ner的话就收1元，如此类推 ，10，000人次访问的主页就是10元。? 至于每CPM的收费究竟是多少，要根据以主页的热门程度(即浏览人数)划分价格等级，采 取固定费率。国际惯例是每CPM收费从5美元至200美元不等。 2.CPC(Cost Per Click;Cost Per Thousand Click-Through) 每点击成本 以每点击一次计费。这样的方法加上点击率限制可以〖WX)〗加强作弊的难度，而且是宣传网站站点的最优方式。但是，此类方法就有不少经营广告的网站觉得不公平，比如，虽然浏览者没有点击，但是他已经看到了广告，对于这些看到广告却没有点击的流量来说，网站成 了白忙活。有很多网站不愿意做这样的广告，据说，是因为传统媒体从来都没有这样干过。 3.CPA(Cost Per Action) 每行动成本? CPA计价方式是指按广告投放实际效果，即按回应的有效问卷或定单来计费，而不限广告投 放量。CPA的计价方式对于网站而言有一定的风险，但若广告投放成功，其收益也比CPM的计 价方式要大得多。 ? 广告主为规避广告费用风险，只有当网络用户点击旗帜广告，链接广告主网页后，才按点击 次数付给广告站点费用。</description></item><item><title>一些网站开发中常用到的Javascript项目</title><link>https://hessian.cn/p/1083.html</link><pubDate>Thu, 18 Apr 2013 12:54:51 +0800</pubDate><guid>https://hessian.cn/p/1083.html</guid><description>图片轮播 SlideJS SlidesJS is a responsive slideshow plug-in for jQuery (1.7.1+) with features like touch and CSS3 transitions. Give it a try above and check out the examples to help you get started adding SlidesJS to your project.&#10;官方地址： http://www.slidesjs.com/&#10; &#10;图片滚动（Marquee） jCarousel jCarousel是一款 jQuery 插件， 用来控制水平或垂直排列的列表项. 这些项目（可以是静态HTML内容或是Ajax加载内容）内容是可以来回滚动的（可以有动画效果）。&#10;</description></item><item><title>[转]Android技术积累：图片缓存管理</title><link>https://hessian.cn/p/1074.html</link><pubDate>Sat, 30 Mar 2013 23:02:44 +0800</pubDate><guid>https://hessian.cn/p/1074.html</guid><description>转自：http://keegan-lee.diandian.com/post/2012-12-06/40047548955&#10; &#10;如果每次加载同一张图片都要从网络获取，那代价实在太大了。所以同一张图片只要从网络获取一次就够了，然后在本地缓存起来，之后加载同一张图片时就从缓存中加载就可以了。从内存缓存读取图片是最快的，但是因为内存容量有限，所以最好再加上文件缓存。文件缓存空间也不是无限大的，容量越大读取效率越低，因此可以设置一个限定大小比如10M，或者限定保存时间比如一天。&#10;</description></item><item><title>[转]SMALI文件语法</title><link>https://hessian.cn/p/1068.html</link><pubDate>Tue, 19 Mar 2013 12:27:16 +0800</pubDate><guid>https://hessian.cn/p/1068.html</guid><description>来源地址：http://bbs.pediy.com/showthread.php?t=151769&#10;参考资料：http://code.google.com/p/smali/wiki/Registers&#10;dalvik字节码有两种类型，原始类型和引用类型。对象和数组是引用类型，其它都是原始类型。&#10;V void，只能用于返回值类型&#10;Z boolean&#10;B byte&#10;S short&#10;C char&#10;I int&#10;J long（64位）&#10;F float&#10;D double(64位)&#10;对象以Lpackage/name/ObjectName;的形式表示。前面的L表示这是一个对象类型，package/name/是该对象所在的 包，ObjectName是对象的名字，“;”表示对象名称的结束。相当于java中的package.name.ObjectName。例 如：Ljava/lang/String;相当于java.lang.String&#10;</description></item><item><title>Subversion SVN 分支 （Trunk/Branch/Tag） 在WEB项目中如何应用？</title><link>https://hessian.cn/p/1006.html</link><pubDate>Wed, 08 Aug 2012 08:55:50 +0800</pubDate><guid>https://hessian.cn/p/1006.html</guid><description>Trunk = 主干，包含所有开发代码 Branch = 分支其实是主干的copy（svn copy URL URL）。通常用来添加新功能、修改bug、创建发行版等。 Tag = 标记，通常用来做milestone标记，mark某个版本，比如bugfix前后的版本。 以上3个名词其实是版本管理中都概念，在svn中并没有对应功能实现。branch、tag实际上都是用svn copy实现。</description></item><item><title>从百度空间导入到WordPress</title><link>https://hessian.cn/p/679.html</link><pubDate>Mon, 21 May 2012 17:41:26 +0800</pubDate><guid>https://hessian.cn/p/679.html</guid><description>从此这里做主博了，于是写了个导入程序把我百度空间的东西也搬了过来，下次还得写个导入相册的。。。&#10;看了网上很多导入工具都是用的RSS来导入，会丢掉很多东西，而且一些被百度和谐掉的内容是抓取不到的，所以做了这么个工具通过采集的方式直接从HTML里抓取博客内容。&#10;</description></item><item><title>[转]php sphinx 高效率搜索引擎搭建</title><link>https://hessian.cn/p/192.html</link><pubDate>Sun, 20 May 2012 00:56:18 +0800</pubDate><guid>https://hessian.cn/p/192.html</guid><description>原文地址：http://blog.csdn.net/adparking/article/details/7207119&#10; &#10;1.下载PHP客户端安装:&#10;</description></item><item><title>ImageImagick + PHP + Apache On WINDOWS</title><link>https://hessian.cn/p/184.html</link><pubDate>Wed, 16 May 2012 14:14:19 +0800</pubDate><guid>https://hessian.cn/p/184.html</guid><description>今天帮同事安装配置php_imagick，结果装是装上了apache也能正常启动，但是程序一new Imagick()就会导致Apache崩溃。&#10;</description></item><item><title>WEB开发的福音阿，再也不用为频繁切换host苦恼了</title><link>https://hessian.cn/p/131.html</link><pubDate>Tue, 06 Sep 2011 15:32:36 +0800</pubDate><guid>https://hessian.cn/p/131.html</guid><description>刚刚发现一个霸气的 Firefox 插件 HostAdmin，地址在下面有&#10;https://addons.mozilla.org/zh-CN/firefox/addon/hostadmin/&#10;这个插件可以分析你的hosts文件，自动在firefox中提供给你选择你需要指向的IP地址，你也可以手工修改hosts文件，安装了这个插件之后hosts的修改是实时生效的。&#10;</description></item><item><title>JavaME常用小技巧集合[持续补充中]</title><link>https://hessian.cn/p/146.html</link><pubDate>Tue, 23 Aug 2011 02:20:50 +0800</pubDate><guid>https://hessian.cn/p/146.html</guid><description>1. 绘制图像缓冲区&#10;[java]&#10;Image img = Image.createImage( width, height );&#10;canvs.paint( img.getGraphics() );&#10;[/java]&#10; &#10; &#10;2. 绘制透明图案、色块&#10;[java]&#10;int [] argb = new int[width * height];&#10;for ( int i = 0; i &lt; argb.length; i++ ) {&#10;argb[i] = 0x99000000; // ARGB&#10;}&#10;graphics.drawRGB(argb, 0, width, 0, 0, width, height, true);&#10;[/java]&#10; &#10; &#10;</description></item><item><title>怎么在Netbeans里修改默认@author的内容</title><link>https://hessian.cn/p/135.html</link><pubDate>Sun, 21 Aug 2011 01:36:43 +0800</pubDate><guid>https://hessian.cn/p/135.html</guid><description>怎么在Netbeans里修改默认@author的内容&#10; &#10;1. Tools -&gt; Templates&#10;2. 点击 Template Manager 窗口右下角的Settings按钮&#10;3. 去掉 #user….. 的注释,把他改成你想要的内容&#10; &#10;搞定&#10;</description></item><item><title>如何使用Netbeans来提高开发效率</title><link>https://hessian.cn/p/105.html</link><pubDate>Thu, 04 Aug 2011 02:27:33 +0800</pubDate><guid>https://hessian.cn/p/105.html</guid><description>在Netbeans中提供了很多有用的功能，但是这些个功能我们通常很难从界面上去发现它，而且用鼠标去操作是效率极低的，尤其对一个资深的患有鼠标手的程序员来说，从键盘上把手移开去拿鼠标实在是一件痛苦的事情。&#10;</description></item><item><title>【转】编程语言/JAVA 转 Netbeans 5.5 界面英文问题解决</title><link>https://hessian.cn/p/596.html</link><pubDate>Wed, 04 May 2011 13:45:00 +0800</pubDate><guid>https://hessian.cn/p/596.html</guid><description> Netbeans 5.5 界面英文问题解决&#10;从昨晚搞到现在。Netbeans的界面语言问题终于解决了。&#10;问题：从官网下载的netbeans不论是中文版还是英文版默认的操作界面都是中文，并且字体十分恶心。&#10;目标效果：把界面语言改成英文并使系统正常支持中文。&#10;解决办法：&#10;进入netbeans-5.5etc ，其中netbeans-5.5为netbeans的安装路径。&#10;编辑netbeans.conf&#10;将其中的#command line switchs下面那行变为：&#10;netbeans_default_options=”-J-Xms128m -J-Xmx256m -J-XX:PermSize=32m -J-XX:MaxPermSize=160m -J-Xverify:none -J-Dapple.laf.useScreenMenuBar=true -J-Duser.language=zh -J-Duser.country=US –fontsize 13″&#10;说明：&#10;关于前面几个参数的解释可以参照netbeans的guide：&#10;http://www.netbeans.org/kb/55/using-netbeans/configuring.html#pgfId-1158626&#10;后面的几个参数-J-Duser.language=zh -J-Duser.country=US –fontsize 13是调用java的本身系统属性，设置语言为中文，国家为美国。这点很重要！&#10;国家是美国使netbeans的界面为英文，而语言为中文使netbeans可以支持中文，如果只需要英文则可以把language设为en，不过在调用file browser的时候会发现左边一系列windows特性的中文按钮都回变成乱码。&#10;在netbeans的toolsoptionsfonts&amp;colorssyntax下的language选项设置all languages的default的字体为一个能够支持中文的字体，如：Microsoft YaHei&#10;</description></item><item><title>Atrix 4G 英文ROM发中文短信解决办法/Unkown Source APK 许可</title><link>https://hessian.cn/p/543.html</link><pubDate>Mon, 02 May 2011 18:28:00 +0800</pubDate><guid>https://hessian.cn/p/543.html</guid><description>文件: /data/data/com.motorola.android.providers.settings/databases/settings.db&#10;第105项，‘sms_force_7bit_encoding’,值由‘1’改成‘0’ ；&#10;第107项，‘force_only_market_apps’, 值由‘1’ 改成 ‘0’；&#10;</description></item><item><title>[转]netbeans 输出窗口中文乱码解决方法</title><link>https://hessian.cn/p/511.html</link><pubDate>Tue, 21 Dec 2010 02:46:00 +0800</pubDate><guid>https://hessian.cn/p/511.html</guid><description> src:http://fanchi.javaeye.com/blog/315875&#10; &#10;找到 etcnetbeans.conf&#10;添加-J-Dfile.encoding=UTF-8参数&#10;netbeans_default_options=”-J-Dfile.encoding=UTF-8&#10;</description></item><item><title>[转]使用线程创建的三种方式实现j2me联网功能</title><link>https://hessian.cn/p/363.html</link><pubDate>Thu, 03 Jun 2010 10:53:00 +0800</pubDate><guid>https://hessian.cn/p/363.html</guid><description>src: http://www.javaeye.com/topic/420224&#10;在j2me联网时，在eclipse控制台下有一个警告：“若要避免潜在的死锁，应该在commandAction()处理程序之外的其他线程中执行可能 会阻塞的，操作（如网络连接）。 为了避免潜在的死锁，我们经常把把联网的代码部分写到一个线程中去执行。 而实际应用中，网络连接的事务也都是使用一个单独的线程进行的。</description></item><item><title>[转]新京报观察：IE6必须死 却没人做得到</title><link>https://hessian.cn/p/421.html</link><pubDate>Tue, 09 Mar 2010 10:22:00 +0800</pubDate><guid>https://hessian.cn/p/421.html</guid><description>src: http://www.donews.com/Content/201003/ce107084fcb3466ca88b6a2d1b7fc0c6.shtm&#10;观察家&#10;上周末，一群黑衣人聚集在美国丹佛市某会所内，举行了一场葬礼。葬礼现场烛光摇曳，鲜花环绕，悼词卡片放在逝者的棺材周 围。唯一古怪的是，棺材中的“逝者”没有头，它的头部被一张光盘封套取代———上面的遗容是IE6的徽标。这是一场为IE6浏览器举办的非官方葬礼——尽 管据说微软官方的IE6开发小组也送来了卡片，怀念“那段美好的时光”。&#10;</description></item><item><title>[转]深入理解MIDP的界面类体系</title><link>https://hessian.cn/p/638.html</link><pubDate>Fri, 08 Jan 2010 17:51:00 +0800</pubDate><guid>https://hessian.cn/p/638.html</guid><description>因为在MIDP手机编程中，没有控制台的概念，所以所有的MIDP手机软件都必须有自己的界面，下面就熟悉一下MIDP的界面类体系。&#10;首先说明的是，MIDP的标准界面类都位于javax.microedition.lcdui包中，使用时一定要记得引入。&#10;</description></item><item><title>[转]常用 JDBC 驱动名字和 URL 列表</title><link>https://hessian.cn/p/627.html</link><pubDate>Mon, 28 Sep 2009 11:01:00 +0800</pubDate><guid>https://hessian.cn/p/627.html</guid><description>ODBC  driver&#10;sun.jdbc.odbc.JdbcOdbcDriver&#10;jdbc:odbc:name&#10;用 COM.ibm.db2.jdbc.net.DB2Driver 连接到 DB2 数据库&#10;一个 DB2 URL 的示例:&#10;jdbc:db2://aServer.myCompany.com:50002/name&#10;用 com.sybase.jdbc.SybDriver连接到 Sybase 数据库&#10;一个 Sybase URL 的示例:&#10;jdbc:sybase:Tds:aServer.myCompany.com:2025&#10;</description></item><item><title>Comet：基于 HTTP 长连接的“服务器推”技术</title><link>https://hessian.cn/p/506.html</link><pubDate>Fri, 05 Dec 2008 10:02:00 +0800</pubDate><guid>https://hessian.cn/p/506.html</guid><description>src:http://www.ibm.com/developerworks/cn/web/wa-lo-comet/&#10;周 婷 (zhouting@cn.ibm.com), 软件工程师, IBM 中国软件开发技术实验室&#10;2007 年 8 月 31 日&#10;很 多应用譬如监控、即时通信、即时报价系统都需要将后台发生的变化实时传送到客户端而无须客户端不停地刷新、发送请求。本文首先介绍、比较了常用的“服务器 推”方案，着重介绍了 Comet － 使用 HTTP 长连接、无须浏览器安装插件的两种“服务器推”方案：基于 AJAX 的长轮询方式；基于 iframe 及 htmlfile 的流方式。最后分析了开发 Comet 应用需要注意的一些问题，以及如何借助开源的 Comet 框架－pushlet 构建自己的“服务器推”应用。&#10;</description></item><item><title>号称目前最快的 Web 服务器软件 — Cherokee</title><link>https://hessian.cn/p/557.html</link><pubDate>Thu, 04 Dec 2008 09:54:00 +0800</pubDate><guid>https://hessian.cn/p/557.html</guid><description> Cherokee 号称是目前最快的 Web 服务器软件，在性能上，甚至比 Nginx 还略胜一筹。与 Apache、Lighttpd、Nginx 等其他同类软件的对比，大家不妨看看这个测试页面。其易用性做得也很不错。&#10;Cherokee 的功能包括支持 FastCGI、SCGI、PHP、CGI、TLS 及 SSL 加密连接，虚拟主机，授权认证，实时编码，载入均衡，与 Apache 兼容的 log 文件等等。&#10;Cherokee 内含一个名为 cherokee-admin 的工具，执行后，允许管理员直接通过浏览器进入 http://localhost:9090/ 对其进行管理和配置。比如，开启或关闭服务器，进行一般选项的设定，配置虚拟服务器、信息源、图标、Mime 类型等项目。&#10;</description></item><item><title>Firefox3 已经正式发布了，Firebug新版本在哪里？</title><link>https://hessian.cn/p/326.html</link><pubDate>Fri, 20 Jun 2008 21:12:00 +0800</pubDate><guid>https://hessian.cn/p/326.html</guid><description>Firebug 1.2 Beta Recommended for Firefox 3. Firebug 1.2 focuses on performance improvements and support for Firefox 3. The 1.2 features are complete and we are actively fixing bugs. Please read the 1.2 release notes before installing.&#10;原来firebug首页1.1beta下载链接已经被去掉了，不知是什么原因，我猜测可能是准备发布正式版本了吧&#10;</description></item><item><title>[推荐]C代码优化方案</title><link>https://hessian.cn/p/461.html</link><pubDate>Fri, 16 May 2008 13:10:00 +0800</pubDate><guid>https://hessian.cn/p/461.html</guid><description>地址：http://blog.csdn.net/quanming1119/archive/2005/08/10/450545.aspx&#10;华中科技大学计算机学院&#10;姓名：    王全明&#10;QQ：       375288012&#10;</description></item><item><title>[转]LZW数据压缩算法的原理分析</title><link>https://hessian.cn/p/593.html</link><pubDate>Mon, 12 May 2008 13:30:00 +0800</pubDate><guid>https://hessian.cn/p/593.html</guid><description>src:http://www.cnblogs.com/jillzhang/archive/2006/11/06/551298.html&#10;   我希望通过本文的介绍，能给那些目前不太了解lzw算法和该算法在gif图像中应用，但渴望了解它的人一些启发和帮助。抛砖引玉而已，更希望园子里面兄弟提出宝贵的意见。&#10;1.LZW的全称是什么?&#10;   Lempel-Ziv-Welch (LZW).&#10;2. LZW的简介和压缩原理是什么？&#10;   LZW压缩算法是一种新颖的压缩方法，由Lemple-Ziv-Welch 三人共同创造，用他们的名字命名。它采用了一种先进的串表压缩，将每个第一次出现的串放在一个串表中，用一个数字来表示串，压缩文件只存贮数字，则不存贮 串，从而使图象文件的压缩效率得到较大的提高。奇妙的是，不管是在压缩还是在解压缩的过程中都能正确的建立这个串表，压缩或解压缩完成后，这个串表又被丢 弃。&#10;   LZW算法中，首先建立一个字符串表，把每一个第一次出现的字符串放入串表中，并用一个数字来表示，这个数字与此字符串在串表中的位置有关，并将这个数字 存入压缩文件中，如果这个字符串再次出现时，即可用表示它的数字来代替，并将这个数字存入文件中。压缩完成后将串表丢弃。如"print" 字符串，如果在压缩时用266表示，只要再次出现，均用266表示，并将"print"字符串存入串表中，在图象解码时遇到数字266，即可从串表中查出 266所代表的字符串"print"，在解压缩时，串表可以根据压缩数据重新生成。&#10;3.在详细介绍算法之前，先列出一些与该算法相关的概念和词汇&#10;   1)’Character’: 字符，一种基础数据元素，在普通文本文件中，它占用1个单独的byte，而在图像中，它却是 一种代表给定像素颜色的索引值。&#10;   2)’CharStream’：数据文件中的字符流。&#10;   3)’Prefix’:前缀。如这个单词的含义一样，代表着在一个字符最直接的前一个字符。一个前缀字符长度可以为0,一个prefix和一个character可以组成一个字符串(string),&#10;   4)’Suffix’: 后缀，是一个字符，一个字符串可以由(A,B)来组成，A是前缀,B是后缀,当A长度为0的时候，代表Root，根&#10;   5)’Code:码,用于代表一个字符串的位置编码&#10;   6)’Entry’，一个Code和它所代表的字符串(string)&#10;4.压缩算法的简单示例，不是完全实现LZW算法，只是从最直观的角度看lzw算法的思想&#10;    对原始数据ABCCAABCDDAACCDB进行LZW压缩&#10;    原始数据中，只包括4个字符(Character),A,B,C,D,四个字符可以用一个2bit的数表示，0-A,1-B,2-C,3-D,从最直观的角度看，原始字符串存在重复字符：ABCCAABCDDAACCDB，用4代表AB,5代表CC，上面的字符串可以替代表示为:45A4CDDAA5DB,这样是不是就比原数据短了一些呢！&#10;5.LZW算法的适用范围&#10;   为了区别代表串的值(Code)和原来的单个的数据值(String)，需要使它们的数值域不重合，上面用0-3来代表A-D,那么AB就必须用大于3的 数值来代替，再举另外一个例子，原来的数值范围可以用8bit来表示，那么就认为原始的数的范围是0～255，压缩程序生成的标号的范围就不能为 0～255（如果是0-255，就重复了）。只能从256开始，但是这样一来就超过了8位的表示范围了，所以必须要扩展数据的位数，至少扩展一位，但是这样不是增加了1个字符占用的空间了么？但是却可以用一个字符代表几个字符，比如原来255是8bit,但是现在用256来表示254，255两个数，还是划得来的。从这个原理可以看出LZW算法的适用范围是原始数据串最好是有大量的子串多次重复出现，重复的越多，压缩效果越好。反之则越差，可能真的不减反增了。&#10;6.LZW算法中特殊标记&#10;   随着新的串(string)不断被发现，标号也会不断地增长，如果原数据过大，生成的标号集（string table)会越来越大，这时候操作这个集合就会产生效率问题。如何避免这个问题呢?Gif在采用lzw算法的做法是当标号集足够大的时候，就不能增大 了，干脆从头开始再来，在这个位置要插入一个标号，就是清除标志CLEAR，表示从这里我重新开始构造字典，以前的所有标记作废，开始使用新的标记。&#10;这时候又有一个问题出现，足够大是多大？这个标号集的大小为比较合适呢？理论上是标号集大小越大，则压缩比率就越高，但开销也越高。 一般根据处理速度和内存空间连个因素来选定。GIF规范规定的是12位，超过12位的表达范围就推倒重来，并且GIF为了提高压缩率，采用的是变长的字 长。比如说原始数据是8位，那么一开始，先加上一位再说，开始的字长就成了9位，然后开始加标号，当标号加到512时，也就是超过9为所能表达的最大数据 时，也就意味着后面的标号要用10位字长才能表示了，那么从这里开始，后面的字长就是10位了。依此类推，到了2^12也就是4096时，在这里插一个清 除标志，从后面开始，从9位再来。&#10;GIF规定的清除标志CLEAR的数值是原始数据字长表示的最大值加1，如果原始数据字长是8，那么清除标志就是256，如果原始数据字长为4那么就是16。另外GIF还规定了一个结束标志END，它的值是清除标志CLEAR再加1。由于GIF规定的位数有1位（单色图），4位（16色）和8位（256色），而1位的情况下如果只扩展1位，只能表示4种状态，那么加上一个清除标志和结束标志就用完了，所以1位的情况下就必须扩充到3位。其它两种情况初始的字长就为5位和9位。此处参照了http://blog.csdn.net/whycadi/&#10;7.用lzw算法压缩原始数据的示例分析&#10;   输入流，也就是原始的数据为:255,24,54,255,24,255,255,24,5,123,45,255,24,5,24,54………………&#10;   这个正好可以看到是gif文件中像素数组的一部分，如何对它进行压缩&#10;   因为原始数据可以用8bit来表示，故清除标志Clear=255+1 =256,结束标志为End=256+1=257，目前标号集为&#10;   0 1 2 3 ………………………………………………………………………255 CLEAR END&#10;   第一步,读取第一个字符为255,在标记表里面查找，255已经存在，我们已经认识255了，不做处理&#10;   第二步,取第二个字符，此时前缀为A,形成当前的Entry为(255,24),在标记集合不存在，我们并不认识255,24好，这次你小子来了，我就记住你，把它在标记集合中标记为258,然后输出前缀A,保留后缀24，并作为下一次的前缀（后缀变前缀)&#10;第三步，取第三个字符为54，当前Entry(24,54),不认识，记录(24,54)为标号259,并输出24,后缀变前缀&#10;    第四部：取第四个字符255,Entry=(54,255),不认识，记录(54,255)为标号260,输出54,后缀变前缀&#10;   第五步   取第5个字符24，entry=(255,24),啊，认识你，这不是老258么，于是把字符串规约为258，并作为前缀&#10;   第六步 取第六个字符255,entry=(258,255)，不认识，记录(258,255)为261,输出258,后缀变前缀&#10;   …….&#10;一直处理到最后一个字符,&#10;用一个表记录处理过程&#10;   CLEAR=256,END=257&#10;第几步 前缀 后缀 Entry 认识(Y/N) 输出 标号 1 255 （，255） 2 255 24 (255,24)       N 255 258 3 24 54 (24,54)       N 24 259 4 54 255    (54,255)       N 54 260 5 255 24 (255,24)       Y 6 258 255 (258,255)       N 258 261 7 255 255 (255,255)       N 255 262 …..&#10;上面这个示例有些不能完整体现，另外一个例子是&#10;原输入数据为:A B A B A B A B B B A B A B A A C D A C D A D C A B A A A B A B …..&#10;采用LZW算法对其进行压缩，压缩过程用一个表来表述为:&#10;注意原数据中只包含4个character,A,B,C,D&#10;用两bit即可表述，根据lzw算法，首先扩展一位变为3为,Clear=2的2次方+1=4; End=4+1=5;&#10;初始标号集因该为&#10;0 1 2 3 4 5 A B C D Clear End 而压缩过程为:&#10;第几步 前缀 后缀 Entry 认识(Y/N) 输出 标号 1 A （，A） 2 A B (A,B)       N A 6 3 B A (B,A)       N B 7 4 A B    (A,B)       Y 5 6 A (6,A)       N 6 8 6 A B (A,B)       Y 7 6 A (6,A)      Y 8 8 B (8,B)        N 8 9 9 B B (B,B)        N B 10 10 B B (B,B)        Y 11 10 A (10,A)        N 10 11 12 A B (A,B)        Y …..&#10;当进行到第12步的时候，标号集应该为&#10;0 1 2 3 4 5 6 7 8 9 10 11 A B C D Clear End AB BA 6A 8B BB 10A 8.LZW算法的伪代码实现&#10;</description></item><item><title>[转]如何修复 “Internet Explorer 无法打开 Internet 站点….”</title><link>https://hessian.cn/p/556.html</link><pubDate>Wed, 09 Apr 2008 14:56:00 +0800</pubDate><guid>https://hessian.cn/p/556.html</guid><description>src:http://www.nirmaltv.com/2007/08/08/how-to-fix-internet-explorer-cannot-open-the-internet-site-operation-aborted-error/&#10;How to Fix “Internet Explorer Cannot Open the Internet Site- Operation Aborted” Error&#10;Of late few of my blog readers using Internet explorer pointed out to me that there was some error happening while loading my blog in IE. Around 25% of my readers use Internet Explorer to read my blog. I check my blog frequently in IE and many times I too encountered this error, but initially I thought it was some error in my browser. The error is really frustrating as it shows only in IE and not in Firefox or Opera or any other browser for that matter.&#10;</description></item><item><title>[转]如何正确的理解CSS的float浮动属性？</title><link>https://hessian.cn/p/481.html</link><pubDate>Thu, 03 Apr 2008 13:42:00 +0800</pubDate><guid>https://hessian.cn/p/481.html</guid><description>src:http://www.52css.com/article.asp?id=228&#10;首先我们了解到，CSS网页布局的原理，就是按照HTML代码中对象声明的顺序，以流布局的方式来显示它，而流布局就不得不说到float浮动技术， 在HTML中的所有对象，默认分为两种：块元素(block element)、内联元素(inline element)，虽然也存在着可变元素，但只 是随上下文关系确定该元素是块元素或者内联元素。关于块元素和内联元素可以参考这里。&#10;</description></item><item><title>[转]IE中标签使用float属性 后背景不能正常显示原因及解决</title><link>https://hessian.cn/p/644.html</link><pubDate>Wed, 02 Apr 2008 03:04:00 +0800</pubDate><guid>https://hessian.cn/p/644.html</guid><description>src:http://hi.baidu.com/anjingmin/profile&#10;IE浏览器对于CSS的支持很不完整，如下代码，在FireFox能够正常显示出背景，但是在IE中却不可以。&#10;HTML:&#10;&lt;div class=”titlebody”&gt;&#10;&lt;div class=”cqsub”&gt;&#10;&lt;div class=”cqsubtitle”&gt;培养方案&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;div class=”cqsub”&gt;&#10;&lt;div class=”cqsubtitle”&gt;学籍指导&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;CSS:&#10;.cqsub{&#10;width:50%;&#10;float:left;&#10;}&#10;.titlebody{&#10;background-image:url(‘../img/subb.jpg’);&#10;background-repeat:repeat-y;&#10;}&#10;由于在cqsub类中使用了float:left;属性，而IE在使用这个属性的时候，如果没有定义上层的高度，在计算的时候会出现错误，导致定义的背景图片不能显示。&#10;解决方法：在.titlebody中添加height:1px;的定义，迫使IE浏览器重新计算其高度，从而正常显示背景。但是此时FireFox中会老老实实地采用高度为1px的定义，这显然有问题的。因此还必须使用CSS Hack方法，添加代码：&#10;[xmlns] .titlebody{&#10;height:auto;&#10;}&#10;这行代码只能由FireFox解释，对IE6.0及以下版本完全透明，从而达到兼容的目的。&#10;以上代码在FireFox，IE6.0,DreamWeaver8中调试通过。G.K语：…. TNND 个恶心的Internet Explorer 搞得我累死, 弄了一晚上才找到解决办法 实在是郁闷之极&#10;</description></item><item><title>PHP 中的 XML 拉模式解析</title><link>https://hessian.cn/p/643.html</link><pubDate>Wed, 26 Mar 2008 02:45:00 +0800</pubDate><guid>https://hessian.cn/p/643.html</guid><description>src:http://www.wujianrong.com/archives/2007/04/php_xml.html&#10;PHP 5 引入了新的类 XMLReader，用于读取可扩展标记语言（Extensible Markup Language，XML）。与 SimpleXML 或文档对象模型（Document Object Model，DOM）不同，XMLReader 以流模式进行操作。即它从头到尾读取文档。在文档后面的内容编译完成之前，可以先处理已编译好的文档前面的内容,从而实现非常快速、非常高效、非常节省地使用内存。需要处理的文档越大，这个特点就越发重要。&#10;</description></item><item><title>GCC编译优化设置</title><link>https://hessian.cn/p/319.html</link><pubDate>Thu, 20 Mar 2008 10:25:00 +0800</pubDate><guid>https://hessian.cn/p/319.html</guid><description>检查你的gcc版本： # gcc –version&#10;* 获取你的cpu的型号： # cat /proc/cpuinfo&#10;* 在/etc/下建立make.conf文件，并根据cpu的型号写入不同内容(注意你的gcc版本必须在3.0以上)：</description></item><item><title>C/C++ 经典算法实例</title><link>https://hessian.cn/p/416.html</link><pubDate>Mon, 17 Mar 2008 18:30:00 +0800</pubDate><guid>https://hessian.cn/p/416.html</guid><description>二分查找的代码.&#10;int bfind(int* a,int len,int val)&#10;{&#10;int m = len/2;&#10;int l = 0;&#10;int r = len;&#10;while(l!=m &amp;&amp; r!= m)&#10;{&#10;if(a[m] &gt; val)&#10;{&#10;r = m;&#10;m = (m+l)/2;&#10;}&#10;else if(a[m] &lt; val)&#10;{&#10;l = m;&#10;m = (m+r)/2;&#10;}&#10;else&#10;return m;&#10;}&#10;return -1; //没有找到&#10;}&#10;写出在母串中查找子串出现次数的代码.&#10;</description></item><item><title>优化 PHP 建议</title><link>https://hessian.cn/p/372.html</link><pubDate>Mon, 03 Mar 2008 13:30:00 +0800</pubDate><guid>https://hessian.cn/p/372.html</guid><description>src: http://www.phpchina.com/78/viewspace_25713.html&#10;1.如果一个方法可静态化，就对它做静态声明。速率可提升至4倍。&#10;2.echo 比 print 快。&#10;3.使用echo的多重参数（译注：指用逗号而不是句点）代替字符串连接。&#10;4.在执行for循环之前确定最大循环数，不要每循环一次都计算最大值。&#10;</description></item><item><title>[转]重构之美－走在Web标准化设计的路上[深入结构：合理运用div和span。]</title><link>https://hessian.cn/p/316.html</link><pubDate>Mon, 21 Jan 2008 17:40:00 +0800</pubDate><guid>https://hessian.cn/p/316.html</guid><description>src:http://yuntian.cnblogs.com/archive/2006/03/27/359542.html&#10;特意上网搜索了一下，关于div，说法很多。&#10;把div看成是布局元素这种观点我想是最多的，类似有“用div代替table进行布局”、“实战CSS+DIV布局”等等等等，太多了，还有不少 人延用Dreamweaver的定义，称div为层，按Photoshop的层的概念来使用……有朋友干脆就直接称div和span为辅助布局元素。&#10;</description></item><item><title>[转] 让FireBug 工作于 Firefox 3</title><link>https://hessian.cn/p/308.html</link><pubDate>Sun, 13 Jan 2008 15:12:00 +0800</pubDate><guid>https://hessian.cn/p/308.html</guid><description>src:http://devlicio.us/blogs/brendantompkins/archive/2007/11/20/getting-firebug-to-work-with-firefox-3-beta-1.aspx Getting FireBug to work with FireFox 3 Beta 1 Just grabbed my copy of FireFox 3 Beta 1 today.. After installation, most of the extensions that I’ve come to rely on aren’t working, which is understandable. One extension, FireBug, is a tool that I simply cannot work without. It’s the best tool I’ve ever found for debugging HTML, CSS, HTTP and JavaScript, bar none. If you’re a web developer working without it, you may find that you’re spending way more time than you have to debugging browser issues.&#10;</description></item><item><title>[转]JavaScript类的继承</title><link>https://hessian.cn/p/479.html</link><pubDate>Mon, 07 Jan 2008 15:11:00 +0800</pubDate><guid>https://hessian.cn/p/479.html</guid><description>利用共享prototype实现继承&#10;继承是面向对象开发的又一个重要概念，它可以将现实生活的概念对应到程序逻辑中。例如水果是一个类，具有一些公共的性质；而苹果也是一类，但它们属于水果，所以苹果应该继承于水果。&#10;在JavaScript中没有专门的机制来实现类的继承，但可以通过拷贝一个类的prototype到另外一个类来实现继承。一种简单的实现如下：&#10;fucntion class1(){&#10;      //构造函数&#10;}&#10;</description></item><item><title>[转]MD5算法的C++实现 &lt;一&gt;</title><link>https://hessian.cn/p/310.html</link><pubDate>Tue, 11 Dec 2007 18:38:00 +0800</pubDate><guid>https://hessian.cn/p/310.html</guid><description>转自：http://www.cnblogs.com/flying_bat/archive/2007/09/25/905133.html&#10;百度太可恶了…..文章长度限制…这么厉害…..&#10;哼…..我不贴内容了还不行么&#10;源代码下载：点击下载</description></item><item><title>[转]md5加密算法c实现，七分注释</title><link>https://hessian.cn/p/653.html</link><pubDate>Tue, 11 Dec 2007 17:55:00 +0800</pubDate><guid>https://hessian.cn/p/653.html</guid><description>转自：http://blog.csdn.net/coder0621/archive/2007/03/23/1539208.aspx&#10;记得当初自己刚开始学习md5的时候，从网上搜了很多关于算法的原理和文字性的描述的东西，但是看了很久一直没有搞 懂，搜c的源代码又很少。直到后来学习rsa算法的时候，从网上下了1991年的欧洲的什么组织写的关于rsa、des、md5算法的c源代码（各部分代 码混在一块的，比如rsa用到的随机大素数就是用机器的随机时间的md5哈希值获得的）。我才彻底把md5弄明白了。这里的代码就是我从那里面分离出来 的，代码的效率和可重用性都是很高的。整理了一下希望对需要的朋友能够有帮助。&#10;</description></item><item><title>[转]Debug 命令</title><link>https://hessian.cn/p/494.html</link><pubDate>Sun, 09 Dec 2007 00:33:00 +0800</pubDate><guid>https://hessian.cn/p/494.html</guid><description>转自：http://hi.baidu.com/skying0802/blog/item/76758411ad099b13b8127b3f.html&#10;</description></item><item><title>CSS Framework（CSS框架）</title><link>https://hessian.cn/p/404.html</link><pubDate>Thu, 22 Nov 2007 00:34:00 +0800</pubDate><guid>https://hessian.cn/p/404.html</guid><description>转自：http://dev.collin.cn/detail/46.html&#10;对于如今的软件开发人员来说，各类五花八门的框架是满天飞，尤其是web开发领域，RoR、Spring、Struts、Zend等等，但要说到CSS框架，知道的人并不多，CSS也有框架吗？有，而且对web开发人员非常有帮助。&#10;</description></item><item><title>[转]磨练构建正则表达式模式的技能</title><link>https://hessian.cn/p/408.html</link><pubDate>Mon, 12 Nov 2007 21:49:00 +0800</pubDate><guid>https://hessian.cn/p/408.html</guid><description>转自:http://www.ibm.com/developerworks/cn/aix/library/au-expressions.html&#10;</description></item><item><title>[转]澄清Java（接口与继承）</title><link>https://hessian.cn/p/321.html</link><pubDate>Sat, 10 Nov 2007 20:16:00 +0800</pubDate><guid>https://hessian.cn/p/321.html</guid><description>计算机学院研二的兄弟与我讨论Java，一见面，几个问题全是关于接口，接口有什么用？为什么要用接口？什么时候该使用接口？很庆幸他们不是问我 Java如何连接SQL Server，或者是如何开发J2EE应用，这类问题有杀伤力，避之则吉。今年计算机学院本科有个毕业设计课题是做J2ME，选这个题目的学生在5月末都还在苦着脸研究java.util.*这个包，这个这个……唉。&#10;</description></item><item><title>php中的MVC模式运用</title><link>https://hessian.cn/p/381.html</link><pubDate>Sat, 10 Nov 2007 19:51:00 +0800</pubDate><guid>https://hessian.cn/p/381.html</guid><description>首先我来举个例子:&#10;一个简单的文章显示系统&#10;简单期间,我们假定这个文章系统是只读的，也就是说这个例子将不涉及文章的发布，现在开始了。&#10;由于只涉及数据库的读取，所以我定义了两个interface&#10;</description></item><item><title>[转]PHP 中实现 Factory 模式</title><link>https://hessian.cn/p/341.html</link><pubDate>Sat, 10 Nov 2007 19:50:00 +0800</pubDate><guid>https://hessian.cn/p/341.html</guid><description>转自:http://blog.chinaunix.net/u/10599/showart_329537.html&#10;有这么一种观点：似乎没有 “Factory 模式”一说，GoF 的 23 个模式中与 Factory 相关的有两个：Factory Method 和 Abstract Factory ，《深入浅出设计模式》中则定义了一个 Simple Factory 模式。而本人( Hick ) 翻阅了一下相关资料，Robert C. Martin 的《Agile Software Development: Principles, Patterns, and Pracitces》直接提的是“Factory 模式”。具体情况有兴趣的可以去详细考证。&#10;“Factory 模式允许我们之依赖于抽象接口就能够创建出具体对象的实例”，是 DIP (依赖倒置原则)的体现。我们能够通过给一个工厂（factory）不同的需求来生产不同但是相似的产品(实例化对象)。&#10;嘿嘿，人说，最好的文档就是代码。我不仅仅这样说，我还可以证明给你看(在这里的显示效果不好，建议拷贝到 PHP 编辑器中看)，下面分别是《PHP 手册》、《Core PHP Programming》和《PHP 5 Power Programming》中 Factory 模式的实例解析：&#10;&lt;?php&#10;/**&#10;* factory 模式&#10;* * factory 的概念不像 Singleton 等模式那样， factory 模式比较&#10;* 灵活。通常根据不同的要求能够"生产不同对象"(实例化类)就可以&#10;* 归为 factory 模式或者其变体。&#10;*/&#10;/**&#10;* 先用手册中一个简单的例子说明 factory 模式&#10;* * 注意下面这段代码并不可执行，因为需要定义相应的数据库[Driver]类。&#10;*/&#10;class DbFactory&#10;{&#10;   // factory 方法&#10;   public static function factory($type)&#10;   {&#10;   // 注意这里的包含文件应该是相关数据库的[Driver]类&#10;   if (include_once ‘Drivers/‘ . $type . ‘.php‘) {&#10;   $classname = ‘Driver_‘ . $type;&#10;   return new $classname;&#10;   } else {&#10;   throw new Exception (‘Driver not found‘);&#10;   }&#10;   }&#10;}&#10;// 生成数据库(MySQL)连接对象，&#10;$DbCon = DbFactory::factory(‘MySQL‘);&#10;// $DbCon = DbFactory::factory(‘SQLite’);&#10;/**&#10;* "Core PHP Programming" 中的例子&#10;*/&#10;class Factory&#10;{&#10;   private $registeredClasses = array();&#10;      static private $instance = NULL;&#10;   private function __construct() {}&#10;   static function getInstance()&#10;   {&#10;   if(self::$instance == NULL)&#10;   {&#10;   self::$instance = new Factory();&#10;   }&#10;   return self::$instance;&#10;   }&#10;   function registerClass($id, $creator_func)&#10;   {&#10;   $this-&gt;registeredClasses[$id] = $creator_func;&#10;   }&#10;   function createObject($id, $args)&#10;   {&#10;   if(!isset($this-&gt;registeredClasses[$id]))&#10;   {&#10;   return(NULL);&#10;   }&#10;   return($this-&gt;registeredClasses[$id]($args));&#10;   }&#10;}&#10;class MyClass&#10;{&#10;   private $created;&#10;   public function __construct()&#10;   {&#10;   $created = time();&#10;   }&#10;   public function getCreated()&#10;   {&#10;   return($this-&gt;created);&#10;   }&#10;}&#10;function MyClassCreator()&#10;{&#10;   return(new MyClass());&#10;}&#10;$factory = Factory::getInstance();&#10;$factory-&gt;registerClass(1234, "MyClassCreator");&#10;$instance = $factory-&gt;createObject(1234, array());&#10;/**&#10;* "PHP 5 Power Programming" 中的对 factory 模式的诠释&#10;* * 一个 Factory 类通常都有一个方法负责接受参数，根据参数的不同来决定&#10;* "生产"哪个类的实例。下面拿网站的用户作为例子，作为实际运用：把网站&#10;* 用户分成匿名用户，普通(注册)用户，管理员。我们在类中进行用户的权限&#10;* 控制—这样能够更好的展现 factory 类在整个类体系中所扮演的角色。&#10;*/&#10;/**&#10;* 基类 User&#10;*/&#10;abstract class User {&#10;   public $name = null;&#10;      public function __construct($name)&#10;   {&#10;   $this-&gt;name = $name;&#10;   }&#10;      function getName()&#10;   {&#10;   return $this-&gt;name;&#10;   }&#10;      // 权限控制方法&#10;   function hasReadPermission()&#10;   {&#10;   return true;&#10;   }&#10;      function hasModifyPermission()&#10;   {&#10;   return false;&#10;   }&#10;      function hasDeletePermission()&#10;   {&#10;   return false;&#10;   }&#10;}&#10;// 匿名用户类&#10;class GuestUser extends User {}&#10;// 注册用户类&#10;class CustomerUser extends User {&#10;   function hasModifyPermission()&#10;   {&#10;   return true;&#10;   }&#10;}&#10;// 管理员类&#10;class AdminUser extends User {&#10;   function hasModifyPermission()&#10;   {&#10;   return true;&#10;   }&#10;   function hasDeletePermission()&#10;   {&#10;   return true;&#10;   }&#10;}&#10;/**&#10;* 用户 factory 类&#10;*/&#10;class UserFactory {&#10;   private static $users =    array("Andi"=&gt;"admin", "Hick"=&gt;"guest",&#10;   "Derick"=&gt;"customer");&#10;   static function Create($name)&#10;   {&#10;   if (!isset(self::$users[$name])) {&#10;   // 如果不存在对应的用户类，则提示错误&#10;   }&#10;   switch (self::$users[$name]) {&#10;   case "guest": return new GuestUser($name);&#10;   case "customer": return new CustomerUser($name);&#10;   case "admin": return new AdminUser($name);&#10;   default: // 默认应该报错&#10;   }&#10;   }&#10;}&#10;// 使用 factory 类实例化用户&#10;$HickUser = UserFactory::Create(‘Hick‘);&#10;echo $HickUser-&gt;name;&#10;?&gt;</description></item><item><title>[转]PHP 中实现 Singleton 模式和 Monostate 模式</title><link>https://hessian.cn/p/489.html</link><pubDate>Sat, 10 Nov 2007 19:49:00 +0800</pubDate><guid>https://hessian.cn/p/489.html</guid><description> 转自:http://blog.chinaunix.net/u/10599/showart_329555.html&#10;通常来说，类和对象(类的实例)之间是一对多的关系。但是某些情况下，我们只&#10;需要一个类的一个实例。比如多个实例的多样性反倒会带来一些不可控因素，多&#10;次的实例化，是一种资源的浪费，降低了效率；又如他们是工厂对象(factory&#10;object)，用来创建系统中的其他对象，等等。这时候，较好的处理方式就是让类&#10;的实例具有单一性：保障这个类在运行过程中最多生成一个实例( Singleton 模&#10;式)，或者让所有的实例保持一致( Monostate 模式)。&#10;PHP 下实现 Singleton 模式示例：&#10;&lt;?php&#10;class Singleton&#10;{&#10;   private static $instance;&#10;   private function __construct()&#10;   {&#10;   }&#10;   public static function instance()&#10;   {&#10;   if(self::$instance == null)&#10;   {&#10;   self::$instance = new Singleton();&#10;   }&#10;   return self::$instance;&#10;   }&#10;}&#10;?&gt; 创建 singleton 类实例就只能够是这样了：&#10;$instance = Singleton::instance();&#10;// 这样是错误的： $instance = new Singleton(); 详细分析一下 PHP 下实现的 singleton 模式的特征：&#10;1. 一个 static, private 属性：用来保存一个实例，static 保证类不被实例化&#10;也能够被类方法调用, private 保证它不被类的实例等改变。&#10;2. 一个 private 的构造方法：不允许该类在本类之外的地方实例化。&#10;3. 一个 static, public 方法：负责创建实例并保证其唯一性。static 使该方&#10;法可以不被实例化即可被调用。&#10;跟下面的 monostate 比，它的优点在于：&#10;1. 适应任何类，满足上面的三个特征即可。&#10;2. 可以统购派生创建，给定一个类，可以创建它的一个 singleton 子类。&#10;缺点：&#10;1. singleton 特性不能够被继承，其子类就不是 singleton 类了。&#10;2. 使用不通明，使用者必须知道它使用的是一个 singleton 类，而不能够通过&#10;new 来实例化。&#10;monostate 模式的基本原理就是让 monostate 类的所有实例使用起来是同一个实&#10;例一样。实际上把类的所有属性都使用 static 声明即可：&#10;&lt;?php class monostate {    private static $itsX = 0;       public function __construct()    {       }       public function setX($x)    {    self::$itsX = $x;    }       public function getX()    {    return self::$itsX;    } } ?&gt; 具体就不再详细介绍，其优缺点基本上刚好跟 singleton 模式相反。&#10;参考资料：《敏捷软件开发：原则、模式与实践》&#10;</description></item><item><title>[转]五种常见的PHP设计模式</title><link>https://hessian.cn/p/569.html</link><pubDate>Sat, 10 Nov 2007 19:14:00 +0800</pubDate><guid>https://hessian.cn/p/569.html</guid><description>转自:http://blog.csdn.net/kenwyn/archive/2007/03/26/1541443.aspx&#10;设计模式只是为 Java 架构师准备的 —— 至少您可能一直这样认为。实际上，设计模式对于每个人都非常有用。如果这些工具不是 “架构太空人” 的专利，那么它们又是什么？为什么说它们在 应用程序中非常有用？本文解释了这些问题。PHP&#10;</description></item><item><title>[转] 榨干 PHP，提高效率</title><link>https://hessian.cn/p/487.html</link><pubDate>Mon, 22 Oct 2007 00:56:00 +0800</pubDate><guid>https://hessian.cn/p/487.html</guid><description>原文地址：http://www.phpchina.com/bbs/thread-13409-1-1.html&#10;这篇杂文翻译整理自网络各路文档资料(见最末的参考资料)，尤其是 Ilia Alshanetsky (佩服之至) 在多个 PHP 会议上的演讲，主要是各类提高 PHP 性能的技巧。为求精准，很多部分都有详细的效率数据，以及对应的版本等等。偷懒，数据就不一一给出了，直接给结论，如果需要看原文档，请到文末「参考资料」部分。橙色标题为推荐部分。&#10;</description></item><item><title>关于css class与id的命名 比较通用的名字</title><link>https://hessian.cn/p/496.html</link><pubDate>Thu, 11 Oct 2007 01:38:00 +0800</pubDate><guid>https://hessian.cn/p/496.html</guid><description>转自:http://jakewljoxygen.spaces.live.com/blog/cns!9b827d074e559d7f!438.entry&#10;</description></item><item><title>关于web 标准的一些内容</title><link>https://hessian.cn/p/327.html</link><pubDate>Thu, 20 Sep 2007 13:50:00 +0800</pubDate><guid>https://hessian.cn/p/327.html</guid><description>HTML 的未来，第一部分&#10;http://www.ibm.com/developerworks/cn/xml/x-futhtml1&#10;HTML 的未来，第二部分&#10;http://www.ibm.com/developerworks/cn/xml/x-futhtml2.html&#10;Quote 这两期文章介绍了 WHATWG HTML 5 和 W3C XHTML 2.0 的主要特点。这两个计划完全不同：草根组织 WHATWG 希望渐进式地改进 HTML 4 和 XHTML 1.0，而联盟支持的 XHTML 2.0 对 HTML 语言进行了彻底重构。&#10;虽 然不同，这两种方法仍然有可比性。WHATWG 规范的一些初步成果已经在浏览器中实现，WHATWG 的一些工作就是对 HTML 事实扩展的描述。其中一些重要的部分，如 XMLHttpRequest 将进入 W3C 的 Rich Client Activity 规范。WHATWG 在 Web 标准世界中还是有效的催化剂。&#10;把目光放远一些，XHTML 2.0 方法为 Web 提供了全新的词汇表，那时候 XML 的模块化处理、CSS 和 ECMAScript 将很快成为常见的事物。嵌入设备如电话和数字电视没有必要支持杂乱无章的遗留 Web HTML，可以毫无负担地利用纯 XML 词汇表 XHTML 2.0 的优势。此外，可访问性和国际化的新特性使 XHTML 2.0 成为第一个被认为具有通用性的 XML 文档词汇表，从而成为很多基于标记的工作的坚实而经济的基础。&#10;与过去一样，HTML 的未来也是不确定的，有人可能称之为混乱，但是我相信 XHTML 2.0 最终将得到广泛的接受和采纳。如果这是 Web 上惟一的 XML 词汇表，可能会有一些问题，但是因为浏览器准备应付 SVG、XForms 和其他技术，所以 XHTML 2.0 看起来仅仅是另一个基于 XML 的词汇表而已。&#10;</description></item><item><title>[原创] 一个用来删除线性表重复元素的算法</title><link>https://hessian.cn/p/650.html</link><pubDate>Thu, 13 Sep 2007 22:48:00 +0800</pubDate><guid>https://hessian.cn/p/650.html</guid><description>由于我C不行,所以就用PHP来实现了,嘿嘿&#10;这个程序应该还可以再优化, 哪位高人给指点一下吧&#10;有线性表 L0,L1,L2 三个线性表&#10;要求将三个线性表中重复的元素删除,已知线性表的元素类型为 整型 且 按值的大小 升序排列&#10;</description></item><item><title>C++ 编程注意事项</title><link>https://hessian.cn/p/307.html</link><pubDate>Thu, 23 Aug 2007 02:44:00 +0800</pubDate><guid>https://hessian.cn/p/307.html</guid><description>条款1：尽量用const和inline而不用#define 条款2：尽量用&lt;iostream&gt;而不用&lt;stdio.h&gt; 条款3：尽量用new和delete而不用malloc和free 条款4：尽量使用c++风格的注释 条款5：对应的new和delete要采用相同的形式 条款6：析构函数里对指针成员调用delete 条款7：预先准备好内存不够的情况 条款8: 写operator new和operator delete时要遵循常规 条款9: 避免隐藏标准形式的new 条款10: 如果写了operator new就要同时写operator delete 条款11: 为需要动态分配内存的类声明一个拷贝构造函数和一个赋值操作符 条款12: 尽量使用初始化而不要在构造函数里赋值 条款13: 初始化列表中成员列出的顺序和它们在类中声明的顺序相同 条款14: 确定基类有虚析构函数 条款15: 让operator=返回*this的引用 条款16: 在operator=中对所有数据成员赋值 条款17: 在operator=中检查给自己赋值的情况 条款18: 争取使类的接口完整并且最小 条款19: 分清成员函数，非成员函数和友元函数 条款20: 避免public接口出现数据成员 条款21: 尽可能使用const 条款22: 尽量用“传引用”而不用“传值” 条款23: 必须返回一个对象时不要试图返回一个引用 条款24: 在函数重载和设定参数缺省值间慎重选择 条款25: 避免对指针和数字类型重载 条款26: 当心潜在的二义性 条款27: 如果不想使用隐式生成的函数就要显式地禁止它 条款28: 划分全局名字空间 条款29: 避免返回内部数据的句柄 条款30: 避免这样的成员函数：其返回值是指向成员的非const指针或引用， 但成员的访问级比这个函数要低 条款31: 千万不要返回局部对象的引用，也不要返回函数内部用new初始化 的指针的引用 条款32: 尽可能地推迟变量的定义 条款33: 明智地使用内联 条款34: 将文件间的编译依赖性降至最低 条款35: 使公有继承体现 "是一个" 的含义 条款36: 区分接口继承和实现继承 条款37: 决不要重新定义继承而来的非虚函数 条款38: 决不要重新定义继承而来的缺省参数值 条款39: 避免 "向下转换" 继承层次 条款40: 通过分层来体现 "有一个" 或 "用…来实现" 条款41: 区分继承和模板 条款42: 明智地使用私有继承 条款43: 明智地使用多继承 条款44: 说你想说的；理解你所说的 条款45: 弄清C++在幕后为你所写、所调用的函数 条款46: 宁可编译和链接时出错，也不要运行时出错 条款47: 确保非局部静态对象在使用前被初始化 条款48: 重视编译器警告 条款49: 熟悉标准库 条款50: 提高对C++的认识&#10;</description></item><item><title>!论如何覆盖#usrbar 附 百度 space.css 格式化代码</title><link>https://hessian.cn/p/339.html</link><pubDate>Sat, 18 Aug 2007 18:21:00 +0800</pubDate><guid>https://hessian.cn/p/339.html</guid><description>被百度这个 #usrbar 搞得有点郁闷了….&#10;谁给出个主意?&#10;从数据类型上看 貌似z-index最大也就65535了, 而space.css优先级又比自定义css要高&#10;(space.css载入晚)&#10;</description></item><item><title>[转] 各种浏览器CSS hack方法</title><link>https://hessian.cn/p/417.html</link><pubDate>Sun, 12 Aug 2007 13:01:00 +0800</pubDate><guid>https://hessian.cn/p/417.html</guid><description>转自:http://xinple.org/?p=208&#10;         现在浏览器多了，做web页面还是比较痛苦的，当然，如果你不在乎自己做的页面在有些浏览器上面惨不忍睹那也是种不错的心态(至少少了点头痛的机会)，可是你老板或者上司或者你的用户同意吗？-__!          下面我就介绍我知道的hack方法吧。我现在比较常用的，并且感觉用的不动脑子的方法是：&#10;#yourId/.yourClass {/*normal*/} * html #yourId/.yourClass {/*IE6 and below*/} *+html #yourId/.yourClass {/*IE7 only*/} @media all and (min-width:0px){ #yourId/.yourClass { /*opera*/ } } 用法：直接写CSS，用firefox作为第一浏览器看效果，然后IE6下不一样，就用* HTML重写那个ID容器或者类；如果IE 7不一样，就用*+HTML重写，如果opera下面不一样，就用@media那个，当然这写重写的需要放在原来的后面。呵呵，就这么简单。这个方法用了之后可能会上瘾，可是会有诸如增加CSS文件容量等不爽，甚至有时候还会出现直接用这个写几段不同的。所以还是建议能熟悉了解个浏览器具体是在什么属性上支持不一样(例如border宽度IE6认为是不能算在width里面的，但是firefox是认为算width一起的)，先尽力写几个浏览器通用的CSS，不到必不得已不用这个hack方法。&#10;原理：firefox认为是CSS语法错误，所以忽略。但是不同IE版本识别不同，不忽略，所以能实现hack，并且*+HTML还能通过W3C验证，呵呵，爽吧。opera那个就不多说了，也是类似原理，但是看起来比较崩溃，要说明的是，firefox下没问题的话，opera基本也没什么问题的，所以不太会用到这个hack。&#10;还需要其他浏览器hack方法？抱歉，我就知道这么多，因为我电脑上只有这么几个浏览器，呵呵，公司要求或者我自己想要把握的用户群够了。&#10;         ————————————-&#10;另外就是!important这个方法了(firefox遇到这个优先级就最高，但是IE6不认，所以下面重新定义可以覆盖)，不过这个貌似是以前甚至现在都很多人在用的，但是我个人感觉不是很爽，不能像上面的那样明确的搞定某个浏览器。比如现在IE7对规范CSS支持已经比IE6好了不知道多少，但是还是会有和firefox有的差异，所以用important的方式，控制起来并不像上面的那么一目了然。&#10;</description></item><item><title>计算代码行数的小程序</title><link>https://hessian.cn/p/397.html</link><pubDate>Thu, 19 Jul 2007 20:57:00 +0800</pubDate><guid>https://hessian.cn/p/397.html</guid><description>/******************************************&#10;*   使用方法….在命令行下运行&#10;*   lineamount.exe &gt; 要输出行数的文件名&#10;*   输入含有要统计的文件路径的文件&#10;*&#10;*******************************************/&#10;#include "stdafx.h"&#10;#include "stdio.h"&#10;#include &lt;iostream&gt;&#10;#include &lt;string&gt;&#10;#include &lt;fstream&gt;&#10;</description></item><item><title>INTRODUCTION TO JavaScript Functions</title><link>https://hessian.cn/p/617.html</link><pubDate>Mon, 09 Jul 2007 01:04:00 +0800</pubDate><guid>https://hessian.cn/p/617.html</guid><description>作者：F. Permadi&#10;译者：Sheneyan(子乌)&#10;英文原文： INTRODUCTION TO JavaScript Functions&#10;中文译文(包括示例)：javascript的函数&#10;子乌注：一篇相当不错的function入门文章，个人感觉相当经典。&#10;</description></item><item><title>【转】为什么要 SET NAMES</title><link>https://hessian.cn/p/338.html</link><pubDate>Fri, 06 Jul 2007 22:45:00 +0800</pubDate><guid>https://hessian.cn/p/338.html</guid><description>大家都知道&#10;SET NAMES x&#10;相当于&#10;SET character_set_client = x;&#10;SET character_set_results = x;&#10;SET character_set_connection = x;&#10;以下从MySQL5.0官方文档上摘录了相关内容，并翻译，说明了相关系统变量的用处：&#10;</description></item><item><title>自动创建selectbox的多级联动下拉框</title><link>https://hessian.cn/p/594.html</link><pubDate>Sun, 01 Jul 2007 09:13:00 +0800</pubDate><guid>https://hessian.cn/p/594.html</guid><description>by GiK&#10;这里面用到了我前面写的那个数据存取对象&#10;&lt;script type="text/javascript"&gt;&#10;function $(o) {&#10;return document.getElementById(o);&#10;}&#10;game = {&#10;code : new String(),&#10;lv    : new Number(),&#10;set   : function(code){&#10;    this.code = code;&#10;    switch(code.substr(0,3)){&#10;        case ‘001’:&#10;            game.lv = 3;&#10;            break;&#10;        case ‘002’:&#10;            game.lv = 2;;&#10;            break;&#10;    }&#10;}&#10;}&#10;&lt;?php&#10;$code = array_flip(LJSConfig::$game_level);&#10;?&gt;&#10;game.set(‘&lt;?= array_shift($code) ?&gt;’);&#10;var server_code = "001002003001";&#10;comboBox = {&#10;    target   : $(‘catbox’),//where to add the selectbox&#10;    sels : new Object(),&#10;        init : function(){&#10;    this.sels.length = new Number(0);&#10;    for(var i=0; i&lt;4; i++){&#10;        this.sels[i] = document.createElement("select");&#10;        this.sels[i].id = "sl" + i;//set element id&#10;        if(i == 0){&#10;        this.sels[i].onchange = function(){&#10;          comboBox.selectChange(this.id.charAt(this.id.length – 1));&#10;          comboBox.hide(game.lv);&#10;        }&#10;        } else {&#10;        this.sels[i].onchange = function(){&#10;          comboBox.selectChange(this.id.charAt(this.id.length – 1));&#10;        }&#10;        }&#10;        this.sels.length++;&#10;        this.target.appendChild(this.sels[i]);&#10;    }&#10;    this.createOptions("0",this.sels[0]);&#10;    this.selectChange(0,1);&#10;    },&#10;        selectChange : function (level)&#10;{&#10;    level = new Number(level); //change type to number&#10;    var selectObj = this.sels[level];&#10;    if(level == 0){&#10;      game.set(selectObj.value);&#10;    }&#10;    if( level &gt;= game.lv )&#10;    {return;}&#10;        var nextSelectObj = this.sels[level+1];&#10;    nextSelectObj.options.length = 0;//clear next select box&#10;    nextSelectObj.style.display = "";&#10;    var currentCode = selectObj.value;&#10;    this.createOptions(currentCode,nextSelectObj);&#10;        if( ( level + 1 ) &lt; game.lv )&#10;      comboBox.selectChange( level + 1 ,nextSelectObj);&#10;},&#10;        createOptions : function( code, sel){&#10;    var datas = code == "0" ? cat.getlevel(1) : cat.getsub( code );&#10;    for(var item in datas)&#10;    {&#10;      if(item != ‘len’)&#10;      {&#10;        var op = document.createElement("option");&#10;        op.text = datas[item].name;&#10;        op.value = item;&#10;        if(server_code &amp;&amp; item == server_code.substr(0,item.length)){&#10;          op.selected = ‘true’;&#10;        }&#10;        sel.options.add( op );&#10;      }&#10;    }&#10;    },&#10;        hide : function(level){&#10;    for(var i = this.sels.length; i &gt; level; i–){&#10;        if(this.sels[i])&#10;         this.sels[i].style.display = "none";&#10;    }&#10;    }&#10;}&#10;comboBox.init();&#10;&lt;/script&gt;&#10;</description></item><item><title>[转] JQUERY中简单使用AJAX</title><link>https://hessian.cn/p/604.html</link><pubDate>Thu, 28 Jun 2007 10:49:00 +0800</pubDate><guid>https://hessian.cn/p/604.html</guid><description> 转自：http://www.cnblogs.com/ewebapp/archive/2006/11/07/jquery-using-ajax.html&#10;JQuery第14天里说到了Ajax:同时给了几个读取数据的例子,jquery没有Prototypre的严谨与规范,但利于普通开发的快速上手,也算是各有千秋吧,要是结合两者,我想更是事倍功倍,虽然说两者加起来快近80K,但这个年代带宽应该不是问题了,AJAXModule&#10;I’m trying something a little different today. It took me a while to figure out why I couldn’t open a free account with YouTube for about 3 weeks but now that it’s all straightened out I thought I’d upload a video where I walk you through some of the basic ways you could use jquery to add AJAX functionality to your site.&#10;The video is short because my understanding of YouTube is that I have to limit the file to 10 minutes. Not everything I’ve said in the tutorial is 100% correct. There are minor mistakes such as the part where I call cgi a “server side script” when it would be more accurate to say “server side language”. Cut me some slack… woodya?英文全文 Demos » AJAX Plugin&#10;Loaded from an HTML File Code:&#10;$("div#html").load("ajax-test.html"); Loaded from an XML File Code:&#10;$.get("ajax-test.xml",function(xml){&#10;var text = $("title",xml).text();&#10;$("div#xml").html("&lt;h1&gt;"+text+"&lt;/h1&gt;");&#10;}); Loaded from a Dynamic HTML File Code:&#10;$("div#dhtml").load("html.cgi",{name:"John"}); Loaded from a Dynamic XML File Code:&#10;$.post("XML.cgi",{&#10;name: "John"&#10;},function(xml){&#10;var text = $("title",xml).text();&#10;$("div#dxml").html("&lt;h2&gt;"+text+"&lt;/h2&gt;");&#10;}); Loaded from a Text File Code:&#10;$.get("ajax-test.txt",function(txt){&#10;$("div#txt").html("&lt;h1&gt;"+txt+"&lt;/h1&gt;");&#10;});</description></item><item><title>【原创】一个简单数据存取的对象</title><link>https://hessian.cn/p/527.html</link><pubDate>Mon, 25 Jun 2007 03:39:00 +0800</pubDate><guid>https://hessian.cn/p/527.html</guid><description>最近刚好要做个有联动的分类选择，就写了下面这个东西，令人郁闷的javascript&#10;cat = {&#10;data : function (code,name,price,discount){&#10;    this.code = code;&#10;    this.name = name;&#10;    this.price = price;&#10;    this.discount = discount;&#10;},&#10;get : function(code){&#10;    if (!code || code.length % 3 != 0 || code.length &lt; 3)&#10;    {&#10;      return false;&#10;    }&#10;    if(cat.getlevel(code.length / 3)[code]){&#10;      return cat.getlevel(code.length / 3)[code];&#10;    } else {&#10;      return false;&#10;    }&#10;},&#10;</description></item><item><title>[C相关]链表的c语言实现</title><link>https://hessian.cn/p/504.html</link><pubDate>Mon, 25 Jun 2007 01:41:00 +0800</pubDate><guid>https://hessian.cn/p/504.html</guid><description> 准备：动态内存分配&#10;一、为什么用动态内存分配&#10;但我们未学习链表的时候，如果要存储数量比较多的同类型或同结构的数据的时候，总是使用一个数组。比如说我们要存储一个班级学生的某科分数，总是定义一个float型（存在0.5分）数组：&#10;float score[30];&#10;但是，在使用数组的时候，总有一个问题困扰着我们：数组应该有多大？&#10;在很多的情况下，你并不能确定要使用多大的数组，比如上例，你可能并不知道该班级的学生的人数，那么你就要把数组定义得足够大。这样，你的程序在运行时就 申请了固定大小的你认为足够大的内存空间。即使你知道该班级的学生数，但是如果因为某种特殊原因人数有增加或者减少，你又必须重新去修改程序，扩大数组的 存储范围。这种分配固定大小的内存分配方法称之为静态内存分配。但是这种内存分配的方法存在比较严重的缺陷，特别是处理某些问题时：在大多数情况下会浪费 大量的内存空间，在少数情况下，当你定义的数组不够大时，可能引起下标越界错误，甚至导致严重后果。&#10;那么有没有其它的方法来解决这样的外呢体呢？有，那就是动态内存分配。&#10;所谓动态内存分配就是指在程序执行的过程中动态地分配或者回收存储空间的分配内存的方法。动态内存分配不象数组等静态内存分配方法那样需要预先分配存储空 间，而是由系统根据程序的需要即时分配，且分配的大小就是程序要求的大小。从以上动、静态内存分配比较可以知道动态内存分配相对于静态内存分配的特点：&#10;1、不需要预先分配存储空间；&#10;2、分配的空间可以根据程序的需要扩大或缩小。&#10;二、如何实现动态内存分配及其管理&#10;要实现根据程序的需要动态分配存储空间，就必须用到以下几个函数&#10;1、malloc函数&#10;malloc函数的原型为：&#10;void *malloc (unsigned int size)&#10;其作用是在内存的动态存储区中分配一个长度为size的连续空间。其参数是一个无符号整形数，返回值是一个指向所分配的连续存储域的起始地址的指针。还有 一点必须注意的是，当函数未能成功分配存储空间（如内存不足）就会返回一个NULL指针。所以在调用该函数时应该检测返回值是否为NULL并执行相应的操 作。&#10;下例是一个动态分配的程序例题（1）：&#10;#include &lt;stdio.h&gt;&#10;#include &lt;stdlib.h&gt;&#10;#include &lt;malloc.h&gt;&#10;main()&#10;{&#10;int count,*array; /*count是一个计数器，array是一个整型指针，也可以理解为指向一个整型数组的首地址*/&#10;if((array=(int *) malloc(10*sizeof(int)))==NULL)&#10;{&#10;printf("不能成功分配存储空间。");&#10;exit(1);&#10;}&#10;for (count=0;count&lt;10;count++) /*给数组赋值*/&#10;array[count]=count;&#10;for(count=0;count&lt;10;count++) /*打印数组元素*/&#10;printf("%2d",array[count]);&#10;free(array);&#10;}&#10;上例中动态分配了10个整型存储区域，然后进行赋值并打印。例中if((array(int *) malloc(10*sizeof(int)))==NULL)语句可以分为以下几步：&#10;1）分配10个整型的连续存储空间，并返回一个指向其起始地址的整型指针&#10;2）把此整型指针地址赋给array&#10;3）检测返回值是否为NULL&#10;2、free函数&#10;由于内存区域总是有限的，不能不限制地分配下去，而且一个程序要尽量节省资源，所以当所分配的内存区域不用时，就要释放它，以便其它的变量或者程序使用。这时我们就要用到free函数。&#10;其函数原型是：&#10;void free(void *p)&#10;作用是释放指针p所指向的内存区。&#10;其参数p必须是先前调用malloc函数或calloc函数（另一个动态分配存储区域的函数）时返回的指针。给free函数传递其它的值很可能造成死机或其它灾难性的后果。&#10;注意：这里重要的是指针的值，而不是用来申请动态内存的指针本身。例：&#10;int *p1,*p2;&#10;p1=malloc(10*sizeof(int));&#10;p2=p1;&#10;……&#10;free(p2) /*或者free(p2)*/&#10;malloc返回值赋给p1，又把p1的值赋给p2，所以此时p1，p2都可作为free函数的参数。&#10;malloc函数是对存储区域进行分配的。&#10;free函数是释放已经不用的内存区域的。&#10;所以由这两个函数就可以实现对内存区域进行动态分配并进行简单的管理了。&#10;本节课后&#10;问题：&#10;1、free函数有什么用处？&#10;2、stdio.h、stdlib.h、malloc.h 这三个头文件在程序例题（1）中起到了什么作用？&#10;3、#include &lt;stdio.h&gt;和#incluce "stdio.h"有什么不同？&#10;体会：&#10;1、对照程序例题（1）体会“(array=(int *) malloc(10*sizeof(int)))==NULL”这一句的写法。&#10;目的：&#10;1、为什么要“动态分配内存”，如何做到“动态内存分配”。&#10;</description></item><item><title>补码是什么？</title><link>https://hessian.cn/p/449.html</link><pubDate>Wed, 20 Jun 2007 09:18:00 +0800</pubDate><guid>https://hessian.cn/p/449.html</guid><description>用[ｘ]表示机器数（原码），ｘ是真值（二进制）&#10;   ｘ＝+0.1001,则[ｘ]原＝0.1001&#10;ｘ＝-0.1001,则[ｘ]原＝1.1001&#10;</description></item><item><title>计算机寄存器</title><link>https://hessian.cn/p/654.html</link><pubDate>Wed, 20 Jun 2007 09:11:00 +0800</pubDate><guid>https://hessian.cn/p/654.html</guid><description>寄存器是中央处理器内的其中组成部份。寄存器是有限存贮容量的高速存贮部件，它们可用来暂存指令、数据和位址。在中央处理器的控制部件中，包含的寄存器有指令寄存器(IR)和程序计数器(PC)。在中央处理器的算术及逻辑部件中，包含的寄存器有累加器(ACC)。&#10;寄存器（Register）&#10;</description></item><item><title>What is Atlas?</title><link>https://hessian.cn/p/480.html</link><pubDate>Wed, 20 Jun 2007 09:05:00 +0800</pubDate><guid>https://hessian.cn/p/480.html</guid><description>阿特拉斯，希腊神话中的巨神，以肩膀扛顶着天。后代，也引伸有能担负重责大任的人，有人也因之称他为宇宙神。 VeriSign通过它的一个崭新的技术平台—高级交易查询信令系统(ATLAS)来提供服务,ATLAS是一个综合性的处理平台，其设计宗旨是扩展 其Internet的核心基础设施、域名系统(DNS)，支持迅速发展中的通过Internet提供的语音、数据和多媒体服务。通过Solaris 10 OS和Sun Fire x64服务器的采用，ATLAS每天管理着数以百亿计的处理业务，且提供高于99.999％的数据完整性和服务，阻止如“拒绝服务”等来自 Internet的恶意攻击。&#10;</description></item><item><title>[转]Windows API</title><link>https://hessian.cn/p/521.html</link><pubDate>Wed, 20 Jun 2007 09:01:00 +0800</pubDate><guid>https://hessian.cn/p/521.html</guid><description>1.什么是Windows API? Windows 这个多作业系统除了协调应用程式的执行、分配内存、管理系统资源…之外， 她同时也是一个很大的服务中心，调用这个服务中心的各种服务(每一种服务就是一个函数)，可以帮应用程式达到开启视窗、描绘图形、使用周边设备…等目的， 由於这些函数服务的对象是应用程式(Application)， 所以便称之为 Application Programming Interface，简称 API 函数。WIN32 API也就是MicrosoftWindows 32位平台的应用程序编程接口。</description></item><item><title>关于Qt</title><link>https://hessian.cn/p/552.html</link><pubDate>Wed, 20 Jun 2007 08:55:00 +0800</pubDate><guid>https://hessian.cn/p/552.html</guid><description>Qt是一个多平台的C++图形用户界面应用程序框架。它提供给应用程序开发者建立 艺术级的图形用户界面所需的所用功能。Qt是完全面向对象的很容易扩展，并且 允许真正地组件编程。&#10;</description></item><item><title>[转]session和cookie的最深刻理解</title><link>https://hessian.cn/p/547.html</link><pubDate>Wed, 20 Jun 2007 08:53:00 +0800</pubDate><guid>https://hessian.cn/p/547.html</guid><description>对SESSION的争论好象一直没有停止过，不过幺麽能理解SESSION的人应该占90以上。 但还是讲讲，别嫌老~ 有一些人赞成用SESSION，有一些人不赞成。但这个问题到底要怎么说。不妨听听我的看法</description></item><item><title>COOKIE详解</title><link>https://hessian.cn/p/639.html</link><pubDate>Mon, 18 Jun 2007 14:24:00 +0800</pubDate><guid>https://hessian.cn/p/639.html</guid><description>Cookies，有些人喜欢它们，有些人憎恨它们。但是，很少有人真正知道如何使用它们。现在你可以成为少数人中的成员－可以自傲的Cookie 大师。–&gt;&#10;</description></item><item><title>[转][MS]使用JS读取XML文件</title><link>https://hessian.cn/p/458.html</link><pubDate>Sat, 16 Jun 2007 17:24:00 +0800</pubDate><guid>https://hessian.cn/p/458.html</guid><description>我的xml文件Login.xml如下.&#10;&lt;?xml version="1.0" encoding="utf-8" ?&gt;&#10;&lt;Login&gt;&#10;    &lt;Character&gt;&#10;        &lt;C Text="热血" Value="0"&gt;&lt;/C&gt;&#10;        &lt;C Text="弱气" Value="1"&gt;&lt;/C&gt;&#10;        &lt;C Text="激情" Value="2"&gt;&lt;/C&gt;&#10;        &lt;C Text="冷静" Value="3"&gt;&lt;/C&gt;&#10;        &lt;C Text="冷酷" Value="4"&gt;&lt;/C&gt;&#10;    &lt;/Character&gt;&#10;    &lt;Weapon&gt;&#10;        &lt;W Text="光束剑" Value="0"&gt;&lt;/W&gt;&#10;        &lt;W Text="光束配刀" Value="1"&gt;&lt;/W&gt;&#10;    &lt;/Weapon&gt;&#10;    &lt;EconomyProperty&gt;&#10;        &lt;P Text="平均型" Value="0"&gt;&lt;/P&gt;&#10;        &lt;P Text="重视攻击" Value="1"&gt;&lt;/P&gt;&#10;        &lt;P Text="重视敏捷" Value="2"&gt;&lt;/P&gt;&#10;        &lt;P Text="重视防御" Value="3"&gt;&lt;/P&gt;&#10;        &lt;P Text="重视命中" Value="4"&gt;&lt;/P&gt;&#10;    &lt;/EconomyProperty&gt;&#10;&lt;/Login&gt; 现在我需要对这个xml文件的内容进行操作.&#10;首先,我们需要加载这个xml文件,js中加载xml文件,是通过XMLDOM来进行的.&#10;</description></item><item><title>服务器变量：$_SERVER 详解</title><link>https://hessian.cn/p/405.html</link><pubDate>Thu, 14 Jun 2007 17:10:00 +0800</pubDate><guid>https://hessian.cn/p/405.html</guid><description>服务器变量：$_SERVER 其实这些东西手册里都有的，，，，，，，，，，，但我还是没事找事的放上来。。。我找抽吗？也许&#10;注: 在 PHP 4.1.0 及以后版本使用。之前的版本，使用 $HTTP_SERVER_VARS。 $_SERVER 是一个包含诸如头部(headers)、路径(paths)和脚本位置(script locations)的数组。数组的实体由 web 服务器创建。不能保证所有的服务器都能产生所有的信息；服务器可能忽略了一些信息，或者产生了一些未在下面列出的新的信息。这意味着，大量的这些变量在 CGI 1.1 specification 中说明，所以您应该仔细研究它。</description></item><item><title>北京二手手机怎么买？ 有内容！</title><link>https://hessian.cn/p/634.html</link><pubDate>Sun, 03 Jun 2007 18:17:00 +0800</pubDate><guid>https://hessian.cn/p/634.html</guid><description>北京的二手手机市场比较多，但是其中比较著名的应该是公主坟周边的飞新马二手商城，还有木樨园和西直门等三家二手手机市场&#10;西直门地区二手手机市场&#10;适合卖手机&#10;</description></item><item><title>【转】推荐的C++书籍以及阅读顺序</title><link>https://hessian.cn/p/342.html</link><pubDate>Sat, 02 Jun 2007 11:07:00 +0800</pubDate><guid>https://hessian.cn/p/342.html</guid><description>当读者有一定c/c++基础&#10;推荐的阅读顺序:&#10;level 1&#10;从&lt;&lt;essential c++&gt;&gt;开始，短小精悍，可以对c++能进一步了解其特性&#10;以&lt;&lt;c++ primer&gt;&gt;作字典和课外读物，因为太厚不可能一口气看完&#10;</description></item><item><title>在数据库中存储层次数据</title><link>https://hessian.cn/p/371.html</link><pubDate>Fri, 25 May 2007 15:03:00 +0800</pubDate><guid>https://hessian.cn/p/371.html</guid><description>作者：Gijs Van Tulder&#10;翻译：ShiningRay @ NirvanaStudio 无论你要构建自己的论坛，在你的网站上发布消息还是书写自己的cms [1]程序，你都会遇到要在数据库中存储层次数据的情况。同时，除非你使用一种像XML [2]的数据库，否则关系数据库中的表都不是层次结构的，他们只是一个平坦的列表。所以你必须找到一种把层次数据库转化的方法。&#10;存储树形结构是一个很常见的问题，他有好几种解决方案。主要有两种方法：邻接列表模型和改进前序遍历树算法&#10;</description></item><item><title>树形结构问题的一种解决办法</title><link>https://hessian.cn/p/415.html</link><pubDate>Fri, 25 May 2007 15:01:00 +0800</pubDate><guid>https://hessian.cn/p/415.html</guid><description>在一个标准的树形结构里面，一般要想知道的操作基本上有查询子树和查询所有父树（路径），还有就是查询子树自身的深度问题，通过前些日子的总结发现一种结构可以很好的满足这些要求。&#10;id parentID   name        path&#10;———————————-&#10;1     0              图书          0,1&#10;2     1             管理类       0,1,2&#10;3     2            名家作品     0,1,2,3&#10;4     2            国内          0,1,2,4&#10;5     2            外国          0,1,2,5&#10;6     0            文学类       0,6&#10;7     6            小说          0,6,7&#10;</description></item><item><title>patTemplate模板类的使用实例</title><link>https://hessian.cn/p/512.html</link><pubDate>Wed, 23 May 2007 17:51:00 +0800</pubDate><guid>https://hessian.cn/p/512.html</guid><description>&#10;前面讲了一个phplib的使用，作为模板驱动的代表patTemplate一样有着稳定，快速开发等等的优点，下面介绍一个简单实用的例子，我们使用test.php来解析模板test.html 并使用patTemplate作为模板引擎&#10;test.html 模板文件：&#10;&lt;patTemplate:tmpl name="article"&gt; &lt;html&gt; &lt;head&gt; &lt;title&gt;A patTemplate example&lt;/title&gt; &lt;/head&gt; &lt;body&gt; &lt;h3&gt;{HEADLINE}&lt;/h3&gt; {CONTENT} &lt;/body&gt; &lt;/html&gt; &lt;/patTemplate:tmpl&gt; 其中的变量headlinecontent是需要我们通过patTemplate来解析过来的&#10;test.php文件：&#10;&lt;?PHP //包含进模板类文件&#10;include("includes/patTemplate.php");  &#10;// 初始化模板对象&#10;$tmpl = new patTemplate();  &#10;// 设定模板文件目录&#10;$tmpl-&gt;setBasedir("templates");  &#10;// 设定使用的模板文件&#10;$tmpl-&gt;readTemplatesFromFile("example1.tmpl.html");  &#10;// 向模板添加变量&#10;$tmpl-&gt;addVar("article", "HEADLINE", "This is the headline"); $tmpl-&gt;addVar("article", "CONTENT", "And this is the content…");  &#10;// 最终解析并显示模板&#10;$tmpl-&gt;displayParsedTemplate("article"); ?&gt;   这是最简单的一个例子，当然如果你熟悉PHPLIB的话，那么也可以轻松的在patTemplate里面使用象PHPLIB一样的循环结构，后面再介绍吧</description></item><item><title>JavaScript中类的定义[2]</title><link>https://hessian.cn/p/389.html</link><pubDate>Sun, 20 May 2007 22:04:00 +0800</pubDate><guid>https://hessian.cn/p/389.html</guid><description>4.使用prototype原型对象定义类成员 使用prototype对象来定义类成员可以避免每实例化一个对象就创建一次类成员的缺点。　当new一个function时，prototype对象的成员将自动赋给所创建的对象。 Demo2： 是一个JavaScript对象，可以为prototype对象添加、修改、删除方法和属性。从而为一个类添加成员定义。 ＜script language=”JavaScript” type=”text/javascript”＞&#10;＜!– //定义一个只有一个属性caption的类　function cls(){ this.caption=1; } //使用函数的prototype属性给类定义新成员　cls.prototype.showcaption = function(){ alert(this.caption); } //创建cls的一个实例　var obj=new cls(); //调用通过prototype原型对象定义的showcaption方法　obj.showcaption();&#10;//–＞&#10;＜/script＞ prototype&#10;</description></item><item><title>JavaScript中类的定义[3]</title><link>https://hessian.cn/p/606.html</link><pubDate>Sun, 20 May 2007 22:04:00 +0800</pubDate><guid>https://hessian.cn/p/606.html</guid><description>5.较好的自定义类的方式 前面已经介绍了如何定义一个类，如何初始化一个类的实例，且类可以在function定义的函数体中添加成员，又可以用prototype定义类的成员，编程的代码显得混乱。&#10;如何以一种清晰的方式来定义类呢？下面给出了一种类的实现模式。 在JavaScript中，由于对象灵活的性质，在构造函数中也可以为类添加成员，在增加灵活性的同时，也增加了代码的复杂度。&#10;为了提高代码的可读性和开发效率，可以采用这种定义成员的方式，而使用prototype对象来替代，这样function的定义就是类的构造函数，符合传统意义类的实现：类名和构造函数名是相同的。&#10;例如： cls.prototype，不仅代码体积变大，而且易读性还不够。为了进一步改进，可以使用无类型对象的构造方法来指定prototype对象，从而实现类的成员定义： function cls(){ //构造函数&#10;} //成员定义 cls.prototype.someProperty=”sample”; cls.prototype.someMethod=function(){ //方法实现代码 } 虽然上面的代码对于类的定义已经清晰了很多，但每定义一个属性或方法，都需要使用一次&#10;cls，构造函数直接用类名来实现，而成员使用无类型对象来定义，以列表的方式实现了所有属性和方法，并且可以在定义的同时初始化属性的值。这也更象传统意义面向对象语言中类的实现。只是构造函数和类的成员定义被分为了两个部分，这可看成JavaScript中定义类的一种固定模式，这样在使用时会更加容易理解。 //定义一个类cls function cls(){ //构造函数 }&#10;//通过指定prototype对象来实现类的成员定义 class1.prototype={ someProperty:”sample”, someMethod:function(){ //方法代码 }, …//其他属性和方法. } 上面的代码用一种很清晰的方式定义了&#10;注意：在一个类的成员之间互相引用，必须通过this指针来进行，例如在上面例子中的someMethod方法中，如果要使用属性someProperty，必须通过this.someProperty的形式，因为在JavaScript中每个属性和方法都是独立的，它们通过this指针联系在一个对象上。&#10;</description></item><item><title>JavaScript中类的定义</title><link>https://hessian.cn/p/422.html</link><pubDate>Sun, 20 May 2007 22:03:00 +0800</pubDate><guid>https://hessian.cn/p/422.html</guid><description>&#10;      1.类的定义机制 1&gt;用function关键字定义“类“。&#10;2&gt;function内部通过this指针定义“类“的成员。&#10;3&gt;function类似于其他语言中的构造函数(constructor)。&#10;demo1： function cls()&#10;{      this.txt = “111”;      this.display = function(){ alert(“this is a test method”); } } var obj=new cls(); 2.理解用new创建对象的过程&#10;通过new cls()获得对象obj，对象obj便自动获得了属性txt和方法display。</description></item><item><title>[原创]JOOMLA模板一例</title><link>https://hessian.cn/p/362.html</link><pubDate>Wed, 16 May 2007 14:10:00 +0800</pubDate><guid>https://hessian.cn/p/362.html</guid><description>body {&#10;margin: 0px;&#10;background:#666666 url(../images/bg.jpg) repeat-y scroll center;&#10;color:#cccc99;&#10;font-size:12px;&#10;font-family: Arial, PMingLiU, Sans-Serif;&#10;}&#10;a:link, a:visited {&#10;color:#cccc33;&#10;text-decoration: none;&#10;font-weight: normal;&#10;}&#10;a:hover{color:#ff6600;text-decoration: underline;}&#10;#wrap{&#10;margin:0 auto;&#10;}&#10;#header{&#10;min-height:90px;&#10;}&#10;#headercnt{&#10;position: relactive;&#10;top:10px;&#10;height:70px;&#10;overflow:hidden;&#10;}&#10;#mainbox{&#10;margin:0 auto;&#10;width:700px;&#10;}&#10;#logo {&#10;position: relactive;&#10;left: 0;&#10;top: 0;&#10;float: left;&#10;width: 200px;&#10;height: 75px;&#10;background: url(../images/jeek-logo.gif) 0 0 no-repeat;&#10;margin-left: 15px;&#10;margin-top: 5px;&#10;}&#10;#tabarea{&#10;margin:0 auto;&#10;width:100%;&#10;min-height:24px;&#10;background:url(../images/heading.gif);&#10;background-repeat:repeat-x;&#10;text-align: center;&#10;}&#10;#tabarea ul {&#10;margin: 0;&#10;padding: 0;&#10;list-style:none;&#10;}#tabarea li {&#10;float: left;&#10;padding:0;&#10;margin: 4px 0px 0px 15px;&#10;font-size:14px;&#10;}&#10;#tabarea li a{&#10;color:#ffff00;&#10;font-weight:bold;&#10;}&#10;#patharea{&#10;margin:0 auto;&#10;width:100%;&#10;min-height:22px;&#10;background-color:#333300;&#10;text-align: left;&#10;}&#10;#patharea .breadcrumbs{&#10;float:left;&#10;width:72%;&#10;margin-left:15px;&#10;}&#10;#pathRight{&#10;margin:0 auto;&#10;float:left;&#10;width:25%;&#10;background-color:#333300;&#10;text-align: left;&#10;}&#10;#pathRight #mod_search_searchword{&#10;font-size:12px;&#10;padding:0;&#10;margin:2px;&#10;color:#999999;&#10;background:#333300;&#10;width:140px;&#10;height:14px;&#10;border-top:solid 1px #666666;&#10;border-left:solid 1px #666666;&#10;border-right:solid 1px #cccccc;&#10;border-bottom:solid 1px #cccccc;&#10;}&#10;#pathRight .button{&#10;font-size:12px;&#10;padding:0;&#10;height:16px;&#10;margin:0px;&#10;color:#999999;&#10;background:#333300;&#10;border-top:solid 1px #cccccc;&#10;border-left:solid 1px #cccccc;&#10;border-right:solid 1px #666666;&#10;border-bottom:solid 1px #666666;&#10;}&#10;#bodybox{&#10;clear:both;&#10;}&#10;#leftcol{&#10;float:left;&#10;text-align:left;&#10;margin:0px;&#10;width:25%;&#10;}&#10;#leftcol table{&#10;margin:0 0 10px 10px;&#10;width:100%;&#10;text-align:left;&#10;}&#10;#mod_login_username,#mod_login_password{&#10;width:85%;&#10;height:14px;&#10;color:gray;&#10;border:dotted 1px;&#10;background:#663333;&#10;}&#10;#leftcol .poll{&#10;margin:0 0 10px 5px;&#10;width:100%;&#10;text-align:left;&#10;}&#10;#leftcol ul{&#10;margin:0;&#10;padding:0 0 10px 10px;&#10;list-style-position:inside;&#10;}&#10;#leftcol li{&#10;width:90%;&#10;height:14px;&#10;overflow:hidden;&#10;}&#10;#maincol{&#10;float:left;&#10;margin:0px;&#10;width:73%;&#10;min-height:600px;&#10;text-align:left;&#10;border-left:dashed 1px #999999;&#10;}&#10;#system-message{&#10;border:solid 4px #660000;&#10;background:yellow;&#10;color:red;&#10;font-weight:bold;&#10;padding-left:10px;&#10;}&#10;#bigbox{&#10;width:98%;&#10;margin-left:3px;&#10;float:left;&#10;}&#10;#boxtop{&#10;border-bottom:dashed 1px #999999;&#10;float:left;&#10;width:100%;&#10;}&#10;#boxtop ul{&#10;list-style-position:inside;&#10;margin:5px 0 5px 5px;&#10;padding:0 0 0 5px;&#10;}&#10;#boxtop li{&#10;width:90%;&#10;height:14px;&#10;overflow:hidden;&#10;}&#10;#boxtop_l{&#10;width:50%;&#10;padding-top:5px;&#10;float:left;&#10;}&#10;#boxtop_r{&#10;width:49%;&#10;padding-top:5px;&#10;float:left;&#10;border-left:dashed 1px #999999;&#10;}&#10;#boxmiddle{&#10;float:left;&#10;}&#10;.pagination span{&#10;margin-left:4px;&#10;}&#10;.pagination a{&#10;margin-left:4px;&#10;}&#10;#footer{&#10;color:gray;&#10;clear:both;&#10;border-top:solid 1px black;&#10;}&#10;#footer #line{&#10;width:100%;&#10;clear:both;&#10;height:15px;&#10;border-top:solid 1px #999999;&#10;}&#10;&lt;?php&#10;/**&#10;* @copyright Copyright (C) 2005 – 2007 Open Source Matters. All rights reserved.&#10;* @license GNU/GPL, see LICENSE.php&#10;* Joomla! is free software. This version may have been modified pursuant&#10;* to the GNU General Public License, and as distributed it includes or&#10;* is derivative of works licensed under the GNU General Public License or&#10;* other free or open source software licenses.&#10;* See COPYRIGHT.php for copyright notices and details.&#10;*/&#10;?&gt;&#10;&lt;!DOCTYPE html PUBLIC “-//W3C//DTD XHTML 1.0 Transitional//EN” “http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd”&gt;&#10;&lt;html xmlns=”http://www.w3.org/1999/xhtml” xml:lang=”&lt;?php echo $this-&gt;language; ?&gt;” lang=”&lt;?php echo $this-&gt;language; ?&gt;” &gt;&#10;&lt;head&gt;&#10;&lt;jdoc:include type=”head” /&gt;&#10;&lt;link href=”templates/&lt;?php echo $this-&gt;template ?&gt;/css/test.css” rel=”stylesheet” type=”text/css” /&gt;&#10;&lt;/head&gt;&#10;&lt;body&gt;&#10;&lt;div id=”top”&gt;&lt;/div&gt; &lt;!– 页面边框头部 –&gt;&#10;&lt;div id=”wrap” align=”center”&gt;&#10;&lt;div id=”mainbox”&gt;&#10;&lt;div id=”header”&gt;&#10;&lt;div id=”logo”&gt;&lt;/div&gt;&#10;&lt;div id=”headcnt”&gt;&#10;&lt;jdoc:include type=”modules” name=”headerContent” /&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;div id=”tabarea” align=”center”&gt;&#10;&lt;div id=”navbar”&gt;&#10;&lt;jdoc:include type=”modules” name=”tabArea” /&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;div id=”patharea”&gt;&#10;&lt;jdoc:include type=”modules” name=”pathArea” /&gt;&#10;&lt;div id=”pathRight”&gt;&#10;&lt;jdoc:include type=”modules” name=”pathRight” /&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;div id=”bodybox”&gt;&#10;&lt;div id=”framehead”&gt;&lt;/div&gt; &lt;!– 正文部分边框头 –&gt;&#10;&lt;div id=”leftcol”&gt;&#10;&lt;jdoc:include type=”modules” name=”leftColum” /&gt;&#10;&lt;/div&gt;&#10;&lt;div id=”maincol”&gt;&#10;&lt;div id=”bigbox”&gt;&#10;&lt;jdoc:include type=”message” /&gt;&#10;&lt;?php if($this-&gt;countModules(‘boxTopLeft or boxTopRight’)): ?&gt;&#10;&lt;div id=”boxtop”&gt;&#10;&lt;?php if($this-&gt;countModules(‘boxTopLeft’)): ?&gt;&#10;&lt;div id=”boxtop_l”&gt;&lt;jdoc:include type=”modules” name=”boxTopLeft” /&gt;&lt;/div&gt;&#10;&lt;?php endif; ?&gt;&#10;&lt;?php if($this-&gt;countModules(‘boxTopRight’)): ?&gt;&#10;&lt;div id=”boxtop_r”&gt;&lt;jdoc:include type=”modules” name=”boxTopRight” /&gt;&lt;/div&gt;&#10;&lt;?php endif; ?&gt;&#10;&lt;/div&gt;&#10;&lt;?php endif; ?&gt;&#10;&lt;div id=”boxmiddle”&gt;&#10;&lt;jdoc:include type=”modules” name=”boxMiddle” /&gt;&#10;&lt;jdoc:include type=”component” /&gt;&#10;&lt;/div&gt;&#10;&lt;div id=”boxbottom”&gt;&lt;jdoc:include type=”modules” name=”boxBottom” /&gt;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;div id=”framefoot”&gt;&lt;/div&gt; &lt;!– 正文部分边框底部 –&gt;&#10;&lt;/div&gt;&#10;&lt;div id=”footer”&gt;&#10;&lt;div id=”line”&gt;&lt;/div&gt;&#10;&lt;jdoc:include type=”modules” name=”footer” /&gt;&#10;&lt;/div&gt;&lt;!– 底部 通常放版权信息的位置 –&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;div id=”bottom”&gt;&lt;/div&gt; &lt;!– 页面边框底部 –&gt;&#10;&lt;/body&gt;&#10;&lt;/html&gt;&#10;</description></item><item><title>[转] 关于到底什么是 WEB标准</title><link>https://hessian.cn/p/459.html</link><pubDate>Mon, 14 May 2007 09:15:00 +0800</pubDate><guid>https://hessian.cn/p/459.html</guid><description>看来基本上得到大家的认可，关于分歧的部分和没有讲到的部分我们在深入探讨，&#10;CSS的并发连接和服务器负载问题处理，也应该是web标准认识关心的。&#10;到底SEO，IA，交互设计，用户体验算不算是Web标准的范畴，我明确一点&#10;</description></item><item><title>[原创] PDO 的简单使用</title><link>https://hessian.cn/p/590.html</link><pubDate>Sat, 12 May 2007 10:38:00 +0800</pubDate><guid>https://hessian.cn/p/590.html</guid><description>&lt;?php&#10;$hostname    =    "localhost";    //指定主机名&#10;$database    =    "db_book";        //指定数据库名称&#10;$usernmae    =    "root";            //指定用户名&#10;$password    =    "44444";    //指定密码&#10;$dsn = "mysql:dbname=" . $database . ";host=" . $hostname;&#10;//数据源描述&#10;try {&#10;    $conn    =    new PDO($dsn,$usernmae,$password);        //创建PDO对象 参数 : 数据源,用户名,密码&#10;}&#10;catch (PDOException $e) {&#10;    echo "Connecting failed: " . $e-&gt;getMessage();&#10;    //抛出异常&#10;}&#10;</description></item><item><title>C/S 与 B/S 区别</title><link>https://hessian.cn/p/498.html</link><pubDate>Fri, 11 May 2007 17:24:00 +0800</pubDate><guid>https://hessian.cn/p/498.html</guid><description>C/S 与 B/S 区别&#10;Client/Server是建立在局域网的基础上的.Browser/Server是建立在广域网的基础上的.&#10;１．硬件环境不同:&#10;C/S 一般建立在专用的网络上, 小范围里的网络环境, 局域网之间再通过专门服务器提供连接和数据交换服务.&#10;B/S 建立在广域网之上的, 不必是专门的网络硬件环境,例与电话上网, 租用设备. 信息自己管理. 有比C/S更强的适应范围, 一般只要有操作系统和浏览器就行&#10;２．对安全要求不同&#10;C/S 一般面向相对固定的用户群, 对信息安全的控制能力很强. 一般高度机密的信息系统采用C/S 结构适宜. 可以通过B/S发布部分可公开信息.&#10;B/S 建立在广域网之上, 对安全的控制能力相对弱, 面向是不可知的用户群.&#10;３．对程序架构不同&#10;C/S 程序可以更加注重流程, 可以对权限多层次校验, 对系统运行速度可以较少考虑.&#10;B/S 对安全以及访问速度的多重的考虑, 建立在需要更加优化的基础之上. 比C/S有更高的要求 B/S结构的程序架构是发展的趋势, 从MS的.Net系列的BizTalk 2000 Exchange 2000等, 全面支持网络的构件搭建的系统. SUN 和IBM推的JavaBean 构件技术等,使 B/S更加成熟.&#10;４．软件重用不同&#10;C/S 程序可以不可避免的整体性考虑, 构件的重用性不如在B/S要求下的构件的重用性好.&#10;B/S 对的多重结构,要求构件相对独立的功能. 能够相对较好的重用.就入买来的餐桌可以再利用,而不是做在墙上的石头桌子&#10;５．系统维护不同&#10;系统维护是软件生存周期中,开销大, ——-重要&#10;C/S 程序由于整体性, 必须整体考察, 处理出现的问题以及系统升级. 升级难. 可能是再做一个全新的系统&#10;B/S 构件组成,方面构件个别的更换,实现系统的无缝升级. 系统维护开销减到最小.用户从网上自己下载安装就可以实现升级.&#10;６．处理问题不同&#10;C/S 程序可以处理用户面固定, 并且在相同区域, 安全要求高需求, 与操作系统相关. 应该都是相同的系统&#10;B/S 建立在广域网上, 面向不同的用户群, 分散地域, 这是C/S无法作到的. 与操作系统平台关系最小.&#10;７．用户接口不同&#10;C/S 多是建立的Window平台上,表现方法有限,对程序员普遍要求较高&#10;B/S 建立在浏览器上, 有更加丰富和生动的表现方式与用户交流. 并且大部分难度减低,减低开发成本.&#10;８．信息流不同&#10;C/S 程序一般是典型的中央集权的机械式处理, 交互性相对低&#10;B/S 信息流向可变化, B-B B-C B-G等信息、流向的变化, 更象交易中心&#10;</description></item><item><title>再什么是构件</title><link>https://hessian.cn/p/532.html</link><pubDate>Fri, 11 May 2007 17:20:00 +0800</pubDate><guid>https://hessian.cn/p/532.html</guid><description>中科永联高级技术培训中心（www.itisedu.com）&#10;      构件是系统中实际存在的可更换部分，它实现特定的功能，符合一套接口标准并实现一组接口。构件代表系统中的一部分物理实施，包括软件代码（源代码、二进制代码或可执行代码）或其等价物（如脚本或命令文件）。在图中，构件表示为一个带有标签的矩形。&#10;部署构件的示例&#10;可执行文件 例如 .exe 文件 链接库 例如 .dll 文件 Applet 例如 Java 中的 .class 文件 Web 页面 例如 .htm 和 .html 文件 数据库表 工作产品构件的示例&#10;源代码文件 例如 C++ 和 CORBA IDL 中的 .h、.cpp 和 .hpp 文件，或 Java 中的 .java 文件 二进制文件 例如链接到可执行文件的 .o 文件和 .a 文件。 SOM 文件 IDL 和一些绑定 编译文件 例如 UNIX 中的 makefile 使用&#10;设计中的类和对象被作为部署构件进行实施。您需要确定如何将设计类映射为代码；这应该在项目专用的设计指南中有所说明。&#10;有关如何将设计类映射为代码的详细信息，请参见活动：实施构件。另请参见指南：类。&#10;      实施构件与修改构件在项目的配置管理环境中进行。实施员在为他们提供的专用开发工作区（请参见活动：创建开发工作区）中，按照工件：工作单所指定的内容开展工作。在该工作区中，创建源元素并将其置于配置管理之下，或者在通常的检出、编辑、构建、单元测试、检入周期中进行修改（请参见活动：进行变更）。完成某个构件集（根据一个或多个工作单的定义以及即将生成的工作版本要求）后，实施员将把有关新的和修改过的构件交付（请参见活动：交付变更内容）到子系统集成工作区，以便与其他实施员的工作进行集成。最后，实施员可以在方便的时候对专用开发工作区进行更新（或者重新调整基线），使该工作区与子系统集成工作区保持一致（请参见活动：更新工作区）。&#10;当实施类时，应遵循编程指南。&#10;实施的主要基础是具有公有操作、属性与关联关系的类。务必要注意，并不是所有公有操作、属性与关联关系都在设计过程中定义。&#10;实施的辅助基础是用例实现，用例实现显示了类和对象如何通过交互来执行用例。&#10;最好以递增的方式实施类；编译、链接和运行一些回归测试，每天进行三两次。&#10;在从零开始实施一个类之前，可考虑修改现有的实施类（一般可通过建立子类或进行实例化来修改）。&#10;实施操作 要实施操作，请执行以下步骤： 选择算法 选择适合算法的数据结构 根据需要定义新的类和操作 编写操作代码 选择算法&#10;许多操作都十分简单，可以从该操作及其规约中立即实施。&#10;之所以需要特殊算法，主要是为了实施定义了规约的复杂操作，并优化那些以简单但却低效的算法为定义的操作。&#10;选择适合算法的数据结构&#10;选择算法包括选择算法所基于的数据结构。许多实施数据结构是容器类，例如数组、列表、队列、栈、集合、无序单位组，以及这些类的各种不同形式。许多面向对象的语言和编程环境都提供了具有这些可复用构件的类库。&#10;根据需要定义新的类和操作&#10;比如，可以使用新类来保存中间结果，也可对类添加新的低级操作来分解复杂操作。通常，这些操作是类的私有操作，所以在类之外看不见这些操作。&#10;编写操作代码&#10;要编写操作的代码，可从接口语句开始，例如 C++ 中的成员函数声明、Ada 中的子程序规约或 Visual Basic 中的方法。请遵循编程指南。&#10;实施构件工作流程明细&#10;实施状态 对象的状态可通过引用其属性值来实施，而不必作特殊说明。这种对象的状态转移将隐含于变化的属性值中，而变化的行为通过条件语句来编程。 但对于复杂行为，该方法不能令人满意，因为它往往会导致复杂的结构；而当添加更多状态或当行为发生变化时，将很难更改这些结构。&#10;如果构件（或其组成部分）的行为随状态而定，则通常会有一个或多个状态图来说明组成该构件的模型元素的行为。这些状态图可用作实施过程中的重要输入。有关详细信息，请参见指南：状态图。 状态图中所示的状态机将表现对象的状态，并详尽说明状态转移及所需的行为。可以通过以下几种方法来实施状态机：&#10;对于简单的状态机，定义一项列举可能状态的属性，然后使用该属性在 Java 或 C++ 中的 switch 语句中选择进入消息的行为。但这种方法不太适用于复杂的状态机，它可能会导致运行时性能降低。如需此方法的示例，请参见 [DOUG98]，第 4 章 4.4.3 对于较复杂的状态机，可使用状态模式。有关状态模式的说明，请参见 [GAM94]。[DOUG98]，第 6 章 6.2.3 状态模式也说明了这种方法 表驱动法对于极复杂的状态机十分有效，其特点是易于变更。当使用这种方法时，各个状态在表中都有相应的条目，这些条目将输入映射到后继状态和相关的转移动作。如需此方法的示例，请参见 [DOUG98]，第 6 章 6.2.3 状态表模式。 要实施具有并行子状态的状态机，可以将状态管理委派给主动对象（每个对象都被委派一个并行子状态），因为并行子状态代表了独立的计算（但仍可能进行交互）。每个子状态均可通过上述方法之一来进行管理。&#10;通过委托关系复用实施 如果一个类或一个类的某些部分可通过复用现有类来实施，则应通过委托关系（而不要继承）来实现。&#10;委托表示一个类借助于其他类来得以实施。该类通过使用变量来引用其他类的对象。当调用某操作时，该操作将调用被引用对象（属于被复用的类）中的操作，以实际执行该操作。这样，它就将职责委派给了其他类。&#10;实施关联关系 单向关联关系将作为指针（包含对象引用的属性）来进行实施。如果多重性为一，则将单向关联关系当作简单指针来实施。如果多重性为多个，则将其当作指针集来实施。但如果“多”端是有序排列的，则可以使用列表，而不使用集合。&#10;双向关联关系将作为属性，使用单向关联关系的技术在两个方向上实施。&#10;限定关联关系将作为限定对象中的查询表（如一个 Smalltalk Dictionary 类）来实施。查询表中的选择器值是限定词，而目标值是另一个类的对象。&#10;如果必须按顺序访问限定词的值，就应将限定词组织成经过排序的数组或树。在这种情况下，访问时间将与 log N 成比例，其中 N 为限定词值的数目。&#10;如果限定词取自于一个紧凑的有限集，就可以将限定词的值映射到一个整数范围，并将关联关系当作数组来有效地进行实施。如果关联关系已基本上填满（而不是稀疏填充），此方法会更加有效；而对于完全填满的有限集，它可以算是理想的方法。&#10;许多面向对象的语言和编程环境都提供了具有可复用构件的类库，可用于实施不同种类的关联关系。&#10;实施属性 可以作为内置基本变量、可复用的构件类或定义一个新类来实现属性。定义新类通常是较为灵活的方法，但它却会带来不必要的间接性。例如，实施雇员的社会保障号时，既可将它作为类型“字符串”的属性，也可将它作为一个新类。&#10;属性的备选实施。&#10;另一种可能的情况是：属性组组成了新类，如下例所示。这两种实施都是正确的。&#10;将 Line 中的属性当作 Point 类的关联关系来实施。&#10;向设计提供反馈 在以上任何步骤中，如果发现了设计错误，都必须向设计提供返工反馈。如果所需的变更较小，就可以由同一个人来设计并实施类，而无需提出正式的变更请求。他可在设计中进行变更。&#10;如果所需的变更影响到几个类（例如在公有操作中的变更），则应向 CCB（变更控制委员会）提交正式的变更请求。请参见活动：修复缺陷。&#10;评估代码 在开始单元测试之前，可以先作一些检查。测试是一项花费较多的工作，因此最好先执行以下几项检查： 始终对代码进行编译。将编译器的警告等级设置到最详细的程度。 通过想像对操作进行检查。通读代码，尽可能考虑到所有情况，发现各种异常情况。一旦进行了新的实施活动，就需进行此项工作。 使用工具检查代码中是否存在错误。例如，使用静态代码规则检查程序。 © 1987 – 2001 Rational Software Corporation。版权所有。</description></item><item><title>又关于什么是框架</title><link>https://hessian.cn/p/400.html</link><pubDate>Fri, 11 May 2007 17:18:00 +0800</pubDate><guid>https://hessian.cn/p/400.html</guid><description>中科永联高级技术培训中心（www.itisedu.com）&#10;      框架（Framework）是整个或部分系统的可重用设计，表现为一组抽象构件及构件实例间交互的方法;另一种定义认为，框架是可被应用开发者定制的应用骨架。前者是从应用方面而后者是从目的方面给出的定义。       可以说，一个框架是一个可复用的设计构件，它规定了应用的体系结构，阐明了整个设计、协作构件之间的依赖关系、责任分配和控制流程，表现为一组抽象类以及其实例之间协作的方法，它为构件复用提供了上下文(Context)关系。因此构件库的大规模重用也需要框架。       构件领域框架方法在很大程度上借鉴了硬件技术发展的成就，它是构件技术、软件体系结构研究和应用软件开发三者发展结合的产物。在很多情况下，框架通常以构件库的形式出现，但构件库只是框架的一个重要部分。框架的关键还在于框架内对象间的交互模式和控制流模式。       框架比构件可定制性强。在某种程度上，将构件和框架看成两个不同但彼此协作的技术或许更好。框架为构件提供重用的环境，为构件处理错误、交换数据及激活操作提供了标准的方法。       应用框架的概念也很简单。它并不是包含构件应用程序的 小片程序，而是实现了某应用领域通用完备功能（除去特殊应用的部分）的底层服务。使用这种框架的编程人员可以在一个通用功能已经实现的基础上开始具体的系 统开发。框架提供了所有应用期望的默认行为的类集合。具体的应用通过重写子类(该子类属于框架的默认行为)或组装对象来支持应用专用的行为。       应用框架强调的是软件的设计重用性和系统的可扩充性,以缩短大型应用软件系统的开发周期，提高开发质量。与传统的基于类库的面向对象重用技术比较，应用框架更注重于面向专业领域的软件重用。应用框架具有领域相关性，构件根据框架进行复合而生成可运行的系统。框架的粒度越大，其中包含的领域知识就更加完整。       框架，即framework。其实就是某种应用的半成品，就是一组组件，供你选用完成你自己的系统。简单说就是使用别人搭好的舞台，你来做表演。而且，框架一般是成熟的，不断升级的软件。&#10;       框架的概念最早起源于Smalltalk环境，其中最著名的框架是Smalltalk 80的用户界面框架MVC(Model -View-Controller)。随着用户界面框架Interviews [Linton 89]和ET++ [Weinand 89] 的开发和发布，框架研究越来越受到研究人员的重视。虽然框架研究最初起源于用户界面领域，但它还被成功地应用到其他领域中，如操作系统 [Russo 90]、火警系统 [Molin 96a，Molin 96b] 等。Taligent公司于1992年成立后，框架研究受到了广泛的重视。该公司计划基于框架来开发一个完整的面向对象操作系统。另外，该公司还发布了一 套支持快速应用开发的工具集CommonPoint，其中包括了上百个面向对象框架 [Andert 94,Cotter 95]。&#10;框架目前还没有统一的定义，其中Ralph Johnson所给出的定义基本上为大多数研究人员所接受：       一个框架是一个可复用设计，它是由一组抽象类及其实例间协作关系来表达的 [Johnson 98]。&#10;      这个定义是从框架内涵的角度来定义框架的，当然也可以从框架用途的角度来给出框架的定义：&#10;      一个框架是在一个给定的问题领域内，一个应用程序的一部分设计与实现[Bosch 97]。&#10;      从以上两个定义可以看出，框架是对特定应用领域中的应用系统的部分设计和实现，它定义了一类应用系统(或子系统)的整体结构。框架将应用系统划分为类和对象，定义类和对象的责任，类和对象如何互相协作，以及对象之间的控制线程。这些共有的设计因素由框架预先定义，应用开发人员只须关注于特定的应用系统特有部分。框架刻画了其应用领域所共有的设计决策，所以说框架着重于设计复用，尽管框架中可能包含用某种程序设计语言实现的具体类。&#10;      一个基于框架开发的应用系统包含一个或多个框架，与框架相关的构件类，以及与应用系统相关的功能扩展。与应用系统相关的扩展包括与应用系统相关的类和对象。应用系统可能仅仅复用了面向对象框架的一部分，或者说，它可能需要对框架进行一些适应性修改，以满足系统需求。&#10;      面向对象的框架作为一种可复用的软件，在基于框架的软件开发过程中会涉及到框架的开发和利用两个方面的工作。框架的开发阶段在于产生领域中可复用的设计。 该阶段的主要结果是框架以及与框架相关的构件类。该阶段的一个重要活动是框架的演变和维护。象所有软件一样，框架也易于变化。产生变化的原因很多，如应用 出错，业务领域变化，等等。&#10;      不论是哪一种技术，最终都是为业务发展而服务的。从业务的角度来讲。首先，框架的是为了企业的业务发展和战略规划而服务的，他服从于企业的愿景 （vision）；其次，框架最重要的目标是提高企业的竞争能力，包括降低成本、提高质量、改善客户满意程度，控制进度等方面。最后，框架实现这一目标的 方式是进行有效的知识积累。软件开发是一种知识活动，因此知识的聚集和积累是至关重要的。框架能够采用一种结构化的方式对某个特定的业务领域进行描述，也 就是将这个领域相关的技术以代码、文档、模型等方式固化下来。&#10;一、框架要解决的问题&#10;      框架要解决的最重要的一个问题是技术整合的问题，在J2EE的 框架中，有着各种各样的技术，不同的软件企业需要从J2EE中选择不同的技术，这就使得软件企业最终的应用依赖于这些技术，技术自身的复杂性和技术的风险 性将会直接对应用造成冲击。而应用是软件企业的核心，是竞争力的关键所在，因此应该将应用自身的设计和具体的实现技术解耦。这样，软件企业的研发将集中在 应用的设计上，而不是具体的技术实现，技术实现是应用的底层支撑，它不应该直接对应用产生影响。&#10;      要理解这一点，我们来举一些例子：&#10;      一个做视频流应用的软件企业，他为电广行业提供整体的解决方案。他的优势在于将各种各样的视频硬件、服务器、和管理结合起来，因此他扮演的是一个集成商的 角色。因此他的核心价值在于使用软件技术将不同的硬件整合起来，并在硬件的整合层面上提供一个统一的管理平台。所以他的精力应该放在解决两个问题：&#10;      如何找到一种方法，将不同的硬件整合起来，注意，这里的整合并不是技术整合，而是一种思路上的整合。首先要考虑的绝对不是要使用什么技术，而是这些硬件需 要提供哪些服务，需要以什么样的方式进行管理。因此，这时候做的事情实际上是对领域进行建模。例如，我们定义任何一种硬件都需要提供两种能力，一种是统一 的管理接口，用于对所有硬件统一管理；另一种是服务接口，系统平台可以查询硬件所能够提供的服务，并调用这些服务。所以，设计的规范将会针对两种能力进 行。&#10;      另一个问题是如何描述这个管理系统的规范。你需要描述各种管理活动，以及管理中所涉及的不同实体。因为管理系统是针对硬件的管理，所以它是构架在硬件整合平台之上的。&#10;      在完成业务层面的设计之后，我们再来看看具体的技术实现。光有规范和设计是不够的，我们还需要选择一个优秀的技术。由于是对不同硬件的整合，我们想到采用Java提供的JMX技术。JMX技术适合用来进行系统整合，它定义了一个通用的规范，并给出了远程管理端口的一些默认实现。JMX已经经过了实践的检验，不少的应用服务器都采用了以JMX为基础的结构，例如有名的JBoss。JMX已经是一个很好的开始了，但是我们还需要在JMX的基础上再做一些工作。&#10;二、什么要用框架？&#10;      因为软件系统发展到今天已经很复杂了，特别是服务器端软件，设计到的知识，内容，问题太多。在某些方面使用别人成熟的框架，就相当于让别人帮你完成一些基 础工作，你只需要集中精力完成系统的业务逻辑设计。而且框架一般是成熟，稳健的，他可以处理系统很多细节问题，比如，事物处理，安全性，数据流控制等问 题。还有框架一般都经过很多人使用，所以结构很好，所以扩展性也很好，而且它是不断升级的，你可以直接享受别人升级代码带来的好处。&#10;      框架一般处在低层应用平台（如J2EE）和高层业务逻辑之间的中间层。&#10;      软件为什么要分层？&#10;      为了实现“高内聚、低耦合”。把问题划分开来各个解决，易于控制，易于延展，易于分配资源…总之好处很多啦：）。&#10;三、为什么要进行框架开发?       框架的最大好处就是重用。面向对象系统获得的最大的复用方式就是框架，一个大的应用系统往往可能由多层互相协作的框架组成。       由于框架能重用代码，因此从一已有构件库中建立应用变得非常容易，因为构件都采用框架统一定义的接口，从而使构件间的通信简单。       框架能重用设计。它提供可重用的抽象算法及高层设计，并能将大系统分解成更小的构件，而且能描述构件间的内部接口。这些标准接口使在已有的构件基础上通过 组装建立各种各样的系统成为可能。只要符合接口定义，新的构件就能插入框架中，构件设计者就能重用构架的设计。       框架还能重用分析。所有的人员若按照框架的思想来分析事务，那么就能将它划分为同样的构件，采用相似的解决方法，从而使采用同一框架的分析人员之间能进行沟通。       采用框架技术进行软件开发的主要特点包括： 领域内的软件结构一致性好； 建立更加开放的系统； 重用代码大大增加，软件生产效率和质量也得到了提高； 软件设计人员要专注于对领域的了解，使需求分析更充分； 存储了经验，可以让那些经验丰富的人员去设计框架和领域构件，而不必限于低层编程； 允许采用快速原型技术； 有利于在一个项目内多人协同工作；       大粒度的重用使得平均开发费用降低，开发速度加快，开发人员减少，维护费用降低，而参数化框架使得适应性、灵活性增强。 四、与框架相关的概念 1. 白盒与黑盒框架       框架可分为白盒(White-Box)与黑盒(Black-Box)两种框架。        基于继承的框架被称为白盒框架。所谓白盒即具备可视性，被继承的父类的内部实现细节对子类 而言都是可知的。利用白盒框架的应用开发者通过衍生子类或重写父类的成员方法来开发系统。子类的实现很大程度上依赖于父类的实现，这种依赖性限制了重用的 灵活性和完全性。但解决这种局限性的方法可以是只继承抽象父类，因为抽象类基本上不提供具体的实现。白盒框架是一个程序骨架，而用户衍生出的子类是这个骨 架上的附属品。       基于对象构件组装的框架就是黑盒框架。应用开发者通过整理、组装对象来获得系统的实现。用户只须了解构件的外部接口，无须了解内部的具体实现。另外，组装比继承更为灵活，它能动态地改变，继承只是一个静态编译时的概念。       在理想情况下，任何所需的功能都可通过组装已有的构件得到，事实上可获得的构件远远不能满足需求，有时通过继承获得新的构件比利用已有构件组装新构件更容 易，因此白盒和黑盒将同时应用于系统的开发中。不过白盒框架趋向于向黑盒框架发展，黑盒框架也是系统开发希望达到的理想目标。 2. 热点、食谱以及好莱坞原则        成功的框架开发需要确定领域专用的“热点” (Hot spot)。应用开发者在框架的基础上进行开发，只须扩展框架的某些部分，“热点”就是在应用领域的一种扩展槽，开发者根据自己的需要填充这些扩展槽。 “热点”使框架具有灵活性，如在具体的实现中，扩展槽可以被看成是一些抽象类，开发者通过重写抽象方法获得具体实现。       “食谱” (Cookbook)就是描述如何使用框架方法的文档。在“食谱”中包含了许多“烹饪”方法，这些“烹饪”方法相当于一些具体的操作步骤，描述了为解决某一专门问题如何使用框架的详细方法。框架的内部设计和实现细节通常不出现在“食谱”中。       框架的一个重要特征就是用户定义的方法经常被框架自身调用，而不是从用户的应用代码中调用。这种机制常称为“好莱坞原则”(Hollywood Principle)或“别调用我们，我们会调用您”。&#10;五、常见的JAVA框架有什么？&#10;WAF：&#10;全称：WEB APPLICATION FRAMEWORK&#10;主要应用方面：EJB层，（WEB层也有，但是比较弱）。&#10;主要应用技术：EJB等&#10;出处：java.sun.com/blueprints/code/index.html"&gt;http://java.sun.com/blueprints/code/index.html&#10;简述：这是SUN在展示J2EE平台时所用的例子PetStore(宠物商店系统)里面的框架。是SUN蓝皮书例子程序中提出的应用框架。它实现了 MVC和其他良好的设计模式。SUN的网站上有技术资料，最好下载PetStore来研究，WEBLOGIC里自带此系统，源码在beaweblogic700samplesserversrcpetstore。这是学习了解J2EE的首选框架。&#10;免费。&#10;Struts:&#10;主要应用方面：WEB层。&#10;主要应用技术：JSP,TagLib,JavaBean,XML等&#10;出处：http://jakarta.apache.org/struts/index.html&#10;简述：这是APACHE的开源项目，目前应用很广泛。基于MVC模式，结构很好，基于JSP。Jbuilder8里已经集成了STRUTS1.02的制作。&#10;免费。&#10;简述WAF+STRUTS结合的例子：WEB层用STRUTS，EJB层用WAF：&#10;JSP(TagLib)——&gt;ActionForm——&gt;Action ——&gt;&#10;Event——&gt;EJBAction——&gt;EJB    ——&gt;DAO——&gt;Database JSP（TagLib） (forward) &lt;——Action &lt;——EventResponse&lt;——                 Turbine：&#10;主要应用方面：WEB层。&#10;主要应用技术：servlet等&#10;出处：http://jakarta.apache.org/turbine/index.html&#10;简述：这是APACHE的开源项目。基于SERVLET。据说速度比较快，基于service（pluggable implementation可插拔的执行组件）的方式提供各种服务。&#10;免费。&#10;COCOON：&#10;主要应用方面：WEB层。&#10;主要应用技术：XML，XSP，servlet等&#10;出处：http://cocoon.apache.org/2.0/&#10;简述：这是APACHE的一个开源项目。基于XML，基于XSP（通俗地说，XSP是在XML静态文档中加入Java程序段后形成的动态XML文档。）。特点是可以与多种数据源交互，包括文件系统，数据库，LDAP，XML资源库，网络数据源等。&#10;免费。&#10;ECHO：&#10;主要应用方面：WEB层。&#10;主要应用技术：servlet等&#10;出处：http://www.nextapp.com/products/echo/&#10;简述：nextapp公司的一个开源项目。基于SERVLET。页面可以做的很漂亮，结合echopoint，可以作出很多图形效果（里面用了jfreechart包）。使用SWING的思想来作网页，把HTML当作JAVA的类来做。但是大量使用Session，页面分帧（Frame）很多,系统资源消耗很大。&#10;免费。&#10;JATO：&#10;全称：SUN ONE Application Framework&#10;主要应用方面：WEB层。&#10;主要应用技术：JSP,TagLib,JavaBean等&#10;出处：http://www.sun.com/&#10;简述：这是SUN推出的一个商业性框架，一看名字就知道是结合SUN ONE的平台推出的。我下载了JATO2.0看了一下，感觉有些简单，使用了JSP＋TagLib+JavaBean。如他的DOC所说JATO是适合用在小的WEB应用里。&#10;免费。&#10;TCF：&#10;全称：Thin-Client Framework&#10;主要应用方面：JAVA GUI。&#10;主要应用技术：JAVA application等&#10;出处：http://www.alphaworks.ibm.com/tech/tcf&#10;简 述：这是IBM出的一个框架。基于MVC模式，基于JAVA Application。推荐一篇介绍文章：java/j-tcf1/index.shtml"&gt;http://www- 900.ibm.com/developerWorks/cn/java/j-tcf1/index.shtml&#10;收费：每个企业对象license:2000美元。</description></item><item><title>VC++编程实现对火焰的计算机动态仿真</title><link>https://hessian.cn/p/541.html</link><pubDate>Fri, 11 May 2007 17:07:00 +0800</pubDate><guid>https://hessian.cn/p/541.html</guid><description>摘要：本文通过对真实火焰物理特性的分析，建立了火焰动态燃烧的数学模型，并在此数学模型基础之上借助于DirectDraw技术对图形显示的加速，在VC++ 6.0下对火焰作了效果非常逼真的计算机动态仿真。&#10;</description></item><item><title>关于什么是架构</title><link>https://hessian.cn/p/429.html</link><pubDate>Fri, 11 May 2007 17:03:00 +0800</pubDate><guid>https://hessian.cn/p/429.html</guid><description>中科永联高级技术培训中心（www.itisedu.com）&#10;    软件架构（software architecture）是一系列相关的抽象模式，用于指导大型软件系统各个方面的设计。 软件架构是一个系统的草图。软件架构描述的对象是直接构成系统的抽象组件。各个组件之间的连接则明确和相对细致地描述组件之间的通讯。在实现阶段，这些抽象组件被细化为实际的组件，比如具体某个类或者对象。在面向对象领域中，组件之间的连接通常用接口_(计算机科学)来实现。&#10;    软件体系结构是构建计算机软件实践的基础。与建筑师设定建筑项目的设计原则和目标，作为绘图员画图的基础一样，一个软件架构师或者系统架构师陈述软件构架以作为满足不同客户需求的实际系统设计方案的基础。&#10;      软件构架是一个容易理解的概念，多数工程师（尤其是经验不多的工程师）会从直觉上来认识它，但要给出精确的定义很困难。特别是，很难明确地区分设计和构架：构架属于设计的一方面，它集中于某些具体的特征。&#10;      在“软件构架简介”中，David Garlan 和 Mary Shaw 认为软件构架是有关如下问题的设计层次：“在计算的算法和数据结构之外，设计并确定系统整体结构成为了新的问题。结构问题包括总体组织结构和全局控制结 构；通信、同步和数据访问的协议；设计元素的功能分配；物理分布；设计元素的组成；定标与性能；备选设计的选择。”[GS93]&#10;       但构架不仅是结构；IEEE Working Group on Architecture 把其定义为“系统在其环境中的最高层概念”[IEEE98]。构架还包括“符合”系统完整性、经济约束条件、审美需求和样式。它并不仅注重对内部的考虑，而且还在系统的用户环境和开发环境中对系统进行整体考虑，即同时注重对外部的考虑。&#10;      在 Rational Unified Process 中，软件系统的构架（在某一给定点）是指系统重要构件的组织或结构，这些重要构件通过接口与不断减小的构件与接口所组成的构件进行交互。&#10;     从和目的、主题、材料和结构的联系上来说，软件架构可以和建筑物的架构相比拟。一个软件架构师需要有广泛 的软件理论知识和相应的经验来事实和管理软件产品的高级设计。软件架构师定义和设计软件的模块化，模块之间的交互，用户界面风格，对外接口方法，创新的设 计特性，以及高层事物的对象操作、逻辑和流程。&#10;是一般而言，软件系统的架构（Architecture）有两个要素：&#10;·它是一个软件系统从整体到部分的最高层次的划分。&#10;一个系统通常是由元件组成的，而这些元件如何形成、相互之间如何发生作用，则是关于这个系统本身结构的重要信息。&#10;详细地说，就是要包括架构元件（Architecture Component）、联结器（Connector）、任务流（Task-flow）。所谓架构元素，也就是组成系统的核心"砖瓦"，而联结器则描述这些元件之间通讯的路径、通讯的机制、通讯的预期结果，任务流则描述系统如何使用这些元件和联结器完成某一项需求。&#10;·建造一个系统所作出的最高层次的、以后难以更改的，商业的和技术的决定。&#10;在建造一个系统之前会有很多的重要决定需要事先作出，而一旦系统开始进行详细设计甚至建造，这些决定就很难更改甚至无法更改。显然，这样的决定必定是有关系统设计成败的最重要决定，必须经过非常慎重的研究和考察。&#10;      历史&#10;      早在1960年代，诸如E·W·戴克斯特拉就已经涉及软件架构这个概念了。自1990年代以来，部分由于在 Rational Software Corporation 和Microsoft内部的相关活动，软件架构这个概念开始越来越流行起来。&#10;      卡内基梅隆大学和加州大学埃尔文分校在这个领域作了很多研究。卡内基·梅隆大学的Mary Shaw和David Garlan于1996年写了一本叫做 Software Architecture perspective on an emerging discipline的书，提出了软件架构中的很多概念，例如软件组件、连接器、风格等等。 加州大学埃尔文分校的软件研究院所做的工作则主要集中于架构风格、架构描述语言以及动态架构。&#10;计算机软件的历史开始于五十年代，历史非常短暂，而相比之下建筑工程则从石器时代就开始了，人类在几千年的建筑设计实践中积累了大量的经验和教训。建筑设计基本上包含两点，一是建筑风格，二是建筑模式。独特的建筑风格和恰当选择的建筑模式，可以使一个独一无二。&#10;下面的照片显示了中美洲古代玛雅建筑，Chichen-Itza大金字塔，九个巨大的石级堆垒而上，九十一级台阶（象征着四季的天数）夺路而出，塔顶的神殿耸入云天。所有的数字都如日历般严谨，风格雄浑。难以想象这是石器时代的建筑物。&#10;图1、位于墨西哥Chichen-Itza（在玛雅语中chi意为嘴chen意为井）的古玛雅建筑。（摄影：作者） 软件与人类的关系是架构师必须面对的核心问题，也是自从软件进入历史舞台之后就出 现的问题。与此类似地，自从有了建筑以来，建筑与人类的关系就一直是建筑设计师必须面对的核心问题。英国首相丘吉尔说，我们构造建筑物，然后建筑物构造我 们（We shape our buildings, and afterwards our buildings shape us）。英国下议院的会议厅较狭窄，无法使所有的下议院议员面向同一个方向入座，而必须分成两侧入座。丘吉尔认为，议员们入座的时候自然会选择与自己政见 相同的人同时入座，而这就是英国政党制的起源。Party这个词的原意就是"方"、"面"。政党起源的关键就是建筑物对人的影响。&#10;在软件设计界曾经有很多人认为功能是最为重要的，形式必须服从功能。与此类似地，在建筑学界，现代主义建筑流派的开创人之一Louis Sullivan也认为形式应当服从于功能（Forms follows function）。&#10;几乎所有的软件设计理念都可以在浩如烟海的建筑学历史中找到更为遥远的历史回响。最为著名的，当然就是模式理论和XP理论。&#10;架构的目标是什么&#10;正如同软件本身有其要达到的目标一样，架构设计要达到的目标是什么呢？一般而言，软件架构设计要达到如下的目标：&#10;·可靠性（Reliable）。软件系统对于用户的商业经营和管理来说极为重要，因此软件系统必须非常可靠。&#10;·安全行（Secure）。软件系统所承担的交易的商业价值极高，系统的安全性非常重要。&#10;·可扩展性（Scalable）。软件必须能够在用户的使用率、用户的数目增加很快的情况下，保持合理的性能。只有这样，才能适应用户的市场扩展得可能性。 ·可定制化（Customizable）。同样的一套软件，可以根据客户群的不同和市场需求的变化进行调整。&#10;·可扩展性（Extensible）。在新技术出现的时候，一个软件系统应当允许导入新技术，从而对现有系统进行功能和性能的扩展&#10;·可维护性（Maintainable）。软件系统的维护包括两方面，一是排除现有的错误，二是将新的软件需求反映到现有系统中去。一个易于维护的系统可以有效地降低技术支持的花费&#10;·客户体验（Customer Experience）。软件系统必须易于使用。&#10;·市场时机（Time to Market）。软件用户要面临同业竞争，软件提供商也要面临同业竞争。以最快的速度争夺市场先机非常重要。&#10;架构的种类&#10;根据我们关注的角度不同，可以将架构分成三种：&#10;·逻辑架构、软件系统中元件之间的关系，比如用户界面，数据库，外部系统接口，商业逻辑元件，等等。&#10;比如下面就是笔者亲身经历过的一个软件系统的逻辑架构图&#10;图2、一个逻辑架构的例子&#10;从上面这张图中可以看出，此系统被划分成三个逻辑层次，即表象层次，商业层次和数据持久层次。每一个层次都含有多个逻辑元件。比如WEB服务器层次中有HTML服务元件、Session服务元件、安全服务元件、系统管理元件等。&#10;·物理架构、软件元件是怎样放到硬件上的。&#10;比如下面这张物理架构图描述了一个分布于北京和上海的分布式系统的物理架构，图中所有的元件都是物理设备，包括网络分流器、代理服务器、WEB服务器、应用服务器、报表服务器、整合服务器、存储服务器、主机等等。&#10;图3、一个物理架构的例子 ·系统架构、系统的非功能性特征，如可扩展性、可靠性、强壮性、灵活性、性能等。&#10;系统架构的设计要求架构师具备软件和硬件的功能和性能的过硬知识，这一工作无疑是架构设计工作中最为困难的工作。&#10;此外，从每一个角度上看，都可以看到架构的两要素：元件划分和设计决定。 首先，一个软件系统中的元件首先是逻辑元件。这些逻辑元件如何放到硬件上，以及这些元件如何为整个系统的可扩展性、可靠性、强壮性、灵活性、性能等做出贡献，是非常重要的信息。&#10;其次，进行软件设计需要做出的决定中，必然会包括逻辑结构、物理结构，以及它们如何影响到系统的所有非功能性特征。这些决定中会有很多是一旦作出，就很难更改的。&#10;根据作者的经验，一个基于数据库的系统架构，有多少个数据表，就会有多少页的架构设计文档。比如一个中等的数据库应用系统通常含有一百个左右的数据表，这样的一个系统设计通常需要有一百页左右的架构设计文档。       构架描述       为了讨论和分析软件构架，必须首先定义构架表示方式，即描述构架重要方面的方式。在 Rational Unified Process 中，软件构架文档记录有这种描述。&#10;构架视图       我们决定以多种构架视图来表示软件构架。每种构架视图针对于开发流程中的涉众（例如最终用户、设计人员、管理人员、系统工程师、维护人员等）所关注的特定方面。&#10;      构架视图显示了软件构架如何分解为构件，以及构件如何由连接器连接来产生有用的形式 [PW92]，由此记录主要的结构设计决策。这些设计决策必须基于需求以及功能、补充和其他方面的约束。而这些决策又会在较低层次上为需求和将来的设计决策施加进一步的约束。&#10;典型的构架视图集       构架由许多不同的构架视图来表示，这些视图本质上是以图形方式来摘要说明“在构架方面具有重要意义”的模型元素。在 Rational Unified Process 中，您将从一个典型的视图集开始，该视图集称为“4+1 视图模型”[KRU95]。它包括： 用例视图：包括用例和场景，这些用例和场景包括在构架方面具有重要意义的行为、类或技术风险。它是用例模型的子集。 逻辑视图：包括最重要的设计类、从这些设计类到包和子系统的组织形式，以及从这些包和子系统到层的组织形式。它还包括一些用例实现。它是设计模型的子集。 实施视图：包括实施模型及其从模块到包和层的组织形式的概览。 同时还描述了将逻辑视图中的包和类向实施视图中的包和模块分配的情况。它是实施模型的子集。 进程视图：包括所涉及任务（进程和线程）的描述，它们的交互和配置，以及将设计对象和类向任务的分配情况。只有在系统具有很高程度的并行时，才需要该视图。在 Rational Unified Process 中，它是设计模型的子集。 配置视图：包括对最典型的平台配置的各种物理节点的描述以及将任务（来自进程视图）向物理节点分配的情况。只有在分布式系统中才需要该视图。它是部署模型的一个子集。 构架视图记录在软件构架文档中。您可以构建其他视图来表达需要特别关注的不同方面：用户界面视图、安全视图、数据视图等等。对于简单系统，可以省略 4+1 视图模型中的一些视图。&#10;      构架重点       虽然以上视图可以表示系统的整体设计，但构架只同以下几个具体方面相关： 模型的结构，即组织模式，例如分层。 基本元素，即关键用例、主类、常用机制等，它们与模型中的各元素相对。 几个关键场景，它们表示了整个系统的主要控制流程。 记录模块度、可选特征、产品线状况的服务。       构架视图在本质上是整体设计的抽象或简化，它们通过舍弃具体细节来突出重要的特征。在考虑以下方面时，这些特征非常重要：&#10;系统演进，即进入下一个开发周期。 在产品线环境下复用构架或构架的一部分。 评估补充质量，例如性能、可用性、可移植性和安全性。 向团队或分包商分配开发工作。 决定是否包括市售构件。 插入范围更广的系统。 构架模式       构架模式是解决复发构架问题的现成形式。构架框架或构架基础设施（中间件）是可以在其上构建某种构架的构件集。许多主要的构架困难应在框架或基础设施中进行解决，而且通常针对于特定的领域：命令和控制、MIS、控制系统等等。&#10;构架模式示例&#10;      [BUS96] 根据构架模式最适用的系统的特征将其分类，其中一个类别处理更普遍的结构问题。下表显示了 [BUS96] 中所提供的类别和这些类别所包含的模式。&#10;类别 模式 结构 层 管道和过滤器 黑板 分布式系统 代理 交互系统 模型-视图-控制器 表示-抽象-控制 自适应系统 反射 微核       软件构架是一个容易理解的概念，多数工程师（尤其是经验不多的工程师）会从直觉上来认识它，但要给出精确的定义很困难。特别是，很难明确地区分设计和构架：构架属于设计的一方面，它集中于某些具体的特征。&#10;      在“软件构架简介”中，David Garlan 和 Mary Shaw 认为软件构架是有关如下问题的设计层次：“在计算的算法和数据结构之外，设计并确定系统整体结构成为了新的问题。结构问题包括总体组织结构和全局控制结 构；通信、同步和数据访问的协议；设计元素的功能分配；物理分布；设计元素的组成；定标与性能；备选设计的选择。”[GS93]&#10;       但构架不仅是结构；IEEE Working Group on Architecture 把其定义为“系统在其环境中的最高层概念”[IEEE98]。构架还包括“符合”系统完整性、经济约束条件、审美需求和样式。它并不仅注重对内部的考虑， 而且还在系统的用户环境和开发环境中对系统进行整体考虑，即同时注重对外部的考虑。&#10;      在 Rational Unified Process 中，软件系统的构架（在某一给定点）是指系统重要构件的组织或结构，这些重要构件通过接口与不断减小的构件与接口所组成的构件进行交互。&#10;为阐明其含义，下面将详述其中的两个；完整说明请参见 [BUS96]。模式以下列广泛使用的形式来表示：&#10;模式名 环境 问题&#10;影响，描述应考虑的不同问题方面 解决方案&#10;基本原理 结果环境 示例 模式名&#10;层&#10;环境&#10;需要进行结构分解的大系统。&#10;问题&#10;必须处理不同抽象层次的问题的系统。例如：硬件控制问题、常见服务问题和针对于不同领域的问题。最好不要编写垂直构件来处理所有抽象层次的问题。否则要在不同的构件中多次处理相同的问题（可能会不一致）。&#10;影响&#10;系统的某些部分应当是可替换的 构件中的变化不应波动 相似的责任应归为一组 构件大小 — 复杂构件可能要进行分解 解决办法&#10;将系统分成构件组，并使构件组形成层叠结构。使上层只使用下层（决不使用上层）提供的服务。尽量不使用非紧邻下层提供的服务（不跳层使用服务，除非中间层只添加通过构件）。&#10;示例：&#10;1. 通用层&#10;严格的分层构架规定设计元素（类、构件、包、子系统）只能使用下层提供的服务， 服务可以包括事件处理、错误处理、数据库访问等等。 相对于记录在底层的原始操作系统级调用，它包括更明显的机制。&#10;2. 业务系统层&#10;上图显示了另一个分层示例，其中有垂直特定应用层、水平层和基础设施层。注意：此处的目标是采用非常短的业务“烟囱”并实现各种应用程序间的通用性。 否则，就可能有多个人解决同一问题，从而导致潜在的分歧。&#10;有关该模式的深入讨论，请参见指南：分层。&#10;模式名&#10;黑板&#10;环境&#10;没有解决问题的确定方法（算法）或方法不可行的领域。例如 AI 系统、语音识别和监视系统。&#10;问题&#10;多个问题解决顾问（知识顾问）必须通过协作来解决他们无法单独解决的问题。各顾问的工作结果必须可以供所有其他顾问访问，使他们可以评估自己是否可以参与解决方案的查找并发布其工作结果。&#10;影响&#10;知识顾问参与解决问题的顺序不是确定的，这可能取决于问题解决策略 不同顾问的输入（结果或部分解决方案）可能有不同的表示方式 各顾问并不直接知道对方的存在，但可以评估对方发布的工作 解决办法&#10;多名知识顾问都可访问一个称为“黑板”的共享数据库。黑板提供监测和更新其内容的接口。控制模块/对象激活遵循某种策略的顾问。激活后，顾问查看黑板，以确定它是否能参与解决问题。如果顾问决定它可以参与，控制对象就可以允许顾问将其部分（或最终）解决方案放置于黑板上。&#10;示例：&#10;以上显示了使用 UML 建模的结构或静态视图。 它将成为参数化协作的一部分，然后会绑定到实参上对模式进行实例化。&#10;构架风格 软件构架（或仅是构架视图）可以具有名为构架风格 的属性，该属性减少了可选的形式，并使构架具有一定程度的一致性。样式可以通过一组模式或通过选择特定构件或连接器作为基本构件来定义。对给定系统，某些 样式可作为构架描述的一部分记录在构架风格指南（Rational Unified Process 中设计指南文档的一部分）中。样式在构架的可理解性与完整性方面起着主要的作用。&#10;构架设计图 构架视图的图形描述称为构架设计图。对于以上描述的各种视图，设计图由以下统一建模语言图组成 [UML99]： 逻辑视图：类图、状态机和对象图。 进程视图：类图与对象图（包括任务 – 进程与线程）。 实施视图：构件图。 部署视图：配置图。 用例视图：用例图描述用例、主角和普通设计类；顺序图描述设计对象及其协作关系。 构架设计流程 在 Rational Unified Process 中，构架主要是分析设计工作流程的结果。当项目再次进行此工作流程时，构架将在一次又一次迭代中不断演化、改进、精炼。由于每次迭代都包括集成和测试，所以在交付产品时，构架就相当强壮了。构架是精化阶段各次迭代的重点，构架的基线通常会在此阶段结束时确定。&#10;架构师&#10;软体设计师中有一些技术水平较高、经验较为丰富的人，他们需要承担软件系统的架构设计，也就是需要设计系统的元件如何划分、元件之间如何发生相互作用，以及系统中逻辑的、物理的、系统的重要决定的作出。&#10;这样的人就是所谓的架构师（Architect）。在很多公司中，架构师不是一个专门的和正式的职务。通常在一个开发小组中，最有经验的程序员会负责一些架构方面的工作。在一个部门中，最有经验的项目经理会负责一些架构方面的工作。&#10;但是，越来越多的公司体认到架构工作的重要性，并且在不同的组织层次上设置专门的架构师位置，由他们负责不同层次上的逻辑架构、物理架构、系统架构的设计、配置、维护等工作。 卡内基梅隆大学软件研究所关于软件架构的定义&#10;</description></item><item><title>PHP中的面向对象编程（OOP）</title><link>https://hessian.cn/p/393.html</link><pubDate>Fri, 11 May 2007 16:55:00 +0800</pubDate><guid>https://hessian.cn/p/393.html</guid><description>这里介绍了在PHP中的面向对象编程(OOP，Object Oriented Programming)。将向你演示如何通过使用一些OOP的概念和PHP的技巧来减少编码和提高质量。祝你好运！ 面向对象编程的概念： 不同的作者之间说法可能不一样，但是一个OOP语言必须有以下几方面：</description></item><item><title>[转]你对PHP6认识多少？</title><link>https://hessian.cn/p/503.html</link><pubDate>Thu, 10 May 2007 09:00:00 +0800</pubDate><guid>https://hessian.cn/p/503.html</guid><description> 去年在巴黎举行的PHP开发者大会中，PHP6开发的消息开始流传开来，&#10;于PHP大会讨论的PHP6，将有很大幅度的变化，但这只是草案阶段，&#10;并不代表所有会议的机率都会随着PHP6的发布而包含记录中所有的变更&#10;也就是说，在发布PHP6之前，还是会有异动的情形，但是可以确定的是&#10;下面所列的数项变化，将会随着PHP6一同面世（当然不是百分百乐，）&#10;赶快来看看这些新特性吧&#10;1.支持Unicode&#10;支持Unicode是有其必然，虽然Unicode占用较多的空间，但Unicode带来&#10;的便利性，远超过占用空间的缺点，尤其在国际化的今天，硬件设备越来&#10;越强大，网速也大幅度的提升，这么一点小小的缺点是可以忽略的。另外&#10;一点，PHP也可以在.ini文件中设定是否开启支持Unicode，决定权在你自己，&#10;这是一个不错的点子，关掉Unicode的支持，PHP的性能并不会有大幅度的&#10;提升，主要的影响在于需要引用字符串的函数。&#10;2.Register Globals 将被移除&#10;这是一个重要的决定，说多新进的PHP开发者会觉得Register Globals满&#10;方便的，但是却忽略了Register Globals会带来程序上安全性的隐患，大&#10;多数的主机上此项功能是关闭的，印象中从PHP4.3.x版开始时，此项默认&#10;设置值即是关闭状态，PHP6正式移除Register Globals也代表着如果程序&#10;是由PHP3时代的产物，将完全无法使用，除了改写一途外，别无他法。相&#10;信现在的PHP世界里，仍使用PHP3时代所产生的程序应该是少之又少。&#10;3.Magic Quotes 将消失&#10;Magic Quotes主要是自动转义需要转义的字符，此项功能移除叶符合大多&#10;数PHP开发者的心声。&#10;4.Safe Mode 取消&#10;老实说，这个模式不知道哪里不好，取消就取消吧，反正也用不到&#10;5.’var’ 别名为 ‘public’&#10;在类中的var声明变成public的别名，相信是为了兼容PHP5而作的决定，&#10;PHP6现在也可以称作为OO语言了。&#10;6.通过引用返回将出错&#10;现在透过引用返回编译器将会报错 例如$a =&amp; new b()、function &amp;c()，&#10;OO语言默认就是引用，所以不需要再使用&amp;了。&#10;7.zend.ze1 compatbility mode 将被移去&#10;Zend.ze1相容模式将被移去，PHP5是为兼容旧有PHP4，所以在.ini中可选择是否&#10;开启相容模式，原因在于PHP5使用的是第二代解析引擎，但是相容模式并不是百&#10;分之百能解析PHP4语法，所以旧时代的产物，移除。&#10;8.Freetype 1 and GD 1 support 将不见&#10;这两个是很久的Libs，所以不再支持，GD1早已被现在的GD2取代了。&#10;9.dl() 被移到 SAPI 中&#10;dl()主要是让设计师加载extension Libs，现在被移到 SAPI 中&#10;10.Register Long Array 去除&#10;从PHP5起默认是关闭，再PHP6中正式移除。&#10;11.一些Extension的变更&#10;例如 XMLReader 和 XMLWriter 将不再是以Extension的方式出现，他们将被移入&#10;到PHP的核心之中，并且默认是开启，ereg extension将被放入PECL，代表着它将&#10;被移出PHP核心，这也是为了让路给新的正则表达式extension，&#10;此外，Fileinfo extension 也将被导入PHP的核心之中。&#10;12.APC将被导入核心&#10;这是一个提高PHP性能的功能，现在它将被放入PHP核心中，并且可以选择是否启用APC&#10;13.告别ASP风格的起始标签&#10;原来是为了取悦ASP开发者转向使用PHP，现今已经不再需要这种做法了，&#10;最后，别期望PHP6的性能可以全面超过PHP5，有可能的是PHP6的执行效率会比&#10;PHP5还要来的慢的，但是可以预期的是，PHP开发小组将会努力的完善PHP5，超&#10;越PHP5。&#10;那么，对PHP6有兴趣的朋友现在可以到PHP官方网站上下载，试试这些功能是否真的已经&#10;在PHP6中体现出来了，下载地址http://snaps.php.net/</description></item><item><title>JavaScript 不只是脚本</title><link>https://hessian.cn/p/535.html</link><pubDate>Tue, 08 May 2007 10:47:00 +0800</pubDate><guid>https://hessian.cn/p/535.html</guid><description>发一篇关于JavaScript的文章，因为JS或者说这中界面技术太有用了。Hoho&#10;JavaScript似乎一直都当作是解析型的脚本语言，程序开发人员往往对此不懈一顾。认为一个脚本也没有太多的难度，那似乎为不懂程序的人专门设计的东西，不值得真正搞开发的去研究和应用。&#10;</description></item><item><title>ASP,PHP与.NET伪造HTTP-REFERER方法及防止伪造REFERER方法探讨</title><link>https://hessian.cn/p/440.html</link><pubDate>Sat, 05 May 2007 14:53:00 +0800</pubDate><guid>https://hessian.cn/p/440.html</guid><description>HTTP-REFERER这个变量已经越来越不可靠了，完全就是可以伪造出来的东东。&#10;以下是伪造方法：&#10;ASP:&#10;dim http set http=server.createobject("MSXML2.XMLHTTP") ‘//MSXML2.serverXMLHTTP也可以&#10;Http.open "GET",url,false Http.setRequestHeader "Referer","http://www.dc9.cn/" Http.send()</description></item><item><title>Hash 算法及其应用</title><link>https://hessian.cn/p/314.html</link><pubDate>Sat, 05 May 2007 04:21:00 +0800</pubDate><guid>https://hessian.cn/p/314.html</guid><description>什么是 Hash Hash 的重要特性 Hash 函数的实现 主要的 Hash 算法 Hash 算法的安全问题 Hash 算法的应用 结 论 Hash， 一般翻译做“散列”，也有直接音译为"哈希"的，就是把任意长度的输入（又叫做预映射， pre-image），通过散列算法，变换成固定长度的输出，该输出就是散列值。这种转换是一种压缩映射，也就是，散列值的空间通常远小于输入的空间，不 同的输入可能会散列成相同的输出，而不可能从散列值来唯一的确定输入值。&#10;</description></item><item><title>嗅探原理与反嗅探技术详解</title><link>https://hessian.cn/p/434.html</link><pubDate>Sat, 05 May 2007 04:20:00 +0800</pubDate><guid>https://hessian.cn/p/434.html</guid><description>渗透实验室：大皮球 一．嗅探器的基础知识 1．1 什么是嗅探器？ 嗅探器的英文写法是Sniff，可以理解为一个安装在计算机上的窃听设备它可以用来窃听计算机在网络上所产生的众多的信息。简单一点解释：一部电话的窃听装置, 可以用来窃听双方通话的内容，而计算机网络嗅探器则可以窃听计算机程序在网络上发送和接收到的数据。</description></item><item><title>PHP中的日期处理</title><link>https://hessian.cn/p/317.html</link><pubDate>Fri, 04 May 2007 21:08:00 +0800</pubDate><guid>https://hessian.cn/p/317.html</guid><description>by Allan Kent 我正打算用PHP编写一种帮助处理系统。我发现我必须知道处理完最后一位客户的问题后已经过去了多长时间？当我过去用ASP时解决这个问题相当简单，ASP有相应的函数DateDiff可以给出两个日期间间隔多少月、多少天和多少秒。当我搜寻完PHP手册后我发现PHP并没有类似的函数。</description></item><item><title>基于PHP的AJAX技术实现文件异步上传</title><link>https://hessian.cn/p/346.html</link><pubDate>Fri, 04 May 2007 20:54:00 +0800</pubDate><guid>https://hessian.cn/p/346.html</guid><description>　异步的文件上传是在现代的AJAX实现的Web应用里面经常要遇到，必须解决的问题。但是标准的AJAX类（XmlHttpRequest）无法实现传输文件的功能。因此，这里讨论的内容就是如何在AJAX的技术的基础之上构建异步的文件上传功能。在这个功能当中需要使用到内置的框及（IFRAME）来传输文件。这个功能实现的效果是页面在上传文件的时候，用户还可以使用该页面并且填写文件描述。</description></item><item><title>一个别人PHP的分页类</title><link>https://hessian.cn/p/410.html</link><pubDate>Fri, 04 May 2007 20:53:00 +0800</pubDate><guid>https://hessian.cn/p/410.html</guid><description>&lt;?&#10;/**&#10;* filename: ext_page.class.php&#10;* @package:phpbean&#10;* @author :feifengxlq&lt;feifengxlq#gmail.com&gt;&lt;[url=http://www.phpobject.net/]http://www.phpobject.net/[/url]&gt;&#10;* @copyright :Copyright 2006 feifengxlq&#10;* @license:version 2.0&#10;* @create:2006-5-31&#10;* @modify:2006-6-1&#10;* @modify:feifengxlq 2006-11-4&#10;* description:超强分页类，四种分页模式，默认采用类似baidu,google的分页风格。&#10;* 2.0增加功能：支持自定义风格，自定义样式，同时支持PHP4和PHP5,&#10;* to see detail,please visit [url=http://www.phpobject.net/blog/read.php]http://www.phpobject.net/blog/read.php[/url]?&#10;* example:&#10;* 模式四种分页模式：&#10;    require_once(‘../libs/classes/page.class.php’);&#10;    $page=new page(array(‘total’=&gt;1000,’perpage’=&gt;20));&#10;    echo ‘mode:1&lt;br&gt;’.$page-&gt;show();&#10;    echo ‘&lt;hr&gt;mode:2&lt;br&gt;’.$page-&gt;show(2);&#10;    echo ‘&lt;hr&gt;mode:3&lt;br&gt;’.$page-&gt;show(3);&#10;    echo ‘&lt;hr&gt;mode:4&lt;br&gt;’.$page-&gt;show(4);&#10;    开启AJAX：&#10;    $ajaxpage=new page(array(‘total’=&gt;1000,’perpage’=&gt;20,’ajax’=&gt;’ajax_page’,’page_name’=&gt;’test’));&#10;    echo ‘mode:1&lt;br&gt;’.$ajaxpage-&gt;show();&#10;    采用继承自定义分页显示模式：&#10;    demo:http://www.phpobject.net/blog&#10;*/&#10;class page {&#10;/**&#10;   * config ,public&#10;   */&#10;var $page_name=”PB_page”;//page标签，用来控制url页。比如说xxx.php?PB_page=2中的PB_page&#10;var $next_page=’&gt;’;//下一页&#10;var $pre_page='&lt;‘;//上一页&#10;var $first_page=’First’;//首页&#10;var $last_page=’Last’;//尾页&#10;var $pre_bar='&lt;&lt;‘;//上一分页条&#10;var $next_bar=’&gt;&gt;’;//下一分页条&#10;var $format_left='[‘;&#10;var $format_right=’]’;&#10;var $is_ajax=false;//是否支持AJAX分页模式</description></item><item><title>VXD,KMD,WDM基本概念</title><link>https://hessian.cn/p/418.html</link><pubDate>Wed, 18 Apr 2007 07:34:00 +0800</pubDate><guid>https://hessian.cn/p/418.html</guid><description>作者:陆麟&#10;来来来,一起进入这黑黑的驱动程序世界.:)&#10;这里要讲的是Vxd,Kernel Mode Driver,和WDM的一些基本问题.&#10;什么是VxD?&#10;VxD乃 VIRTUAL X DRIVER.哎,说了也白说.其实就是虚拟设备驱动程序.是系统用于对各种硬件资源识别,管理,维护运作的扩展.VXD和VMM(虚拟机管理器)一起合作,维持着系统的运作.VxD模式从WIN3X时代就开始了.一直到了WIN98还一直在MS的WIN系列操作系统中起主导作用.VxD运作在INTEL系列CPU保护模式下的RING0.拥有对硬件的最高控制权.&#10;</description></item><item><title>Visual C++ MFC 简明教程 [3]</title><link>https://hessian.cn/p/560.html</link><pubDate>Wed, 18 Apr 2007 07:08:00 +0800</pubDate><guid>https://hessian.cn/p/560.html</guid><description>CButton类 在上一讲中所讨论的CStatic控制是唯一不响应用户时间的控制。Windows中所有的其它控制都可响应用户事件。第一，当用户处理它们时， 它们会自动更新其外观(例如，当用户单击按钮时，按钮会自己加亮以给用户一个反馈)。第二，每个不同的控制都要发送信息给你的代码以使程序能响应用户的需 要。例如，当单击按钮时，按钮就会发送一个命令消息。如果你编写代码接收消息，则你的代码就能响应用户事件。 为了理解这个过程，我们从CButton控制开始。下面的代码说明了建立按钮的过程： // button1.cpp #include #define IDB_BUTTON 100 // Declare the application class class CButtonApp : public CWinApp { public: virtual BOOL InitInstance(); }; // Create an instance of the application class CButtonApp ButtonApp; // Declare the main window class class CButtonWindow : public CFrameWnd { CButton *button; public: CButtonWindow(); }; // The InitInstance function is called once // when the application first executes BOOL CButtonApp::InitInstance() { m_pMainWnd = new CButtonWindow(); m_pMainWnd-&gt;ShowWindow(m_nCmdShow); m_pMainWnd-&gt;UpdateWindow(); return TRUE; } // The constructor for the window class CButtonWindow::CButtonWindow() { CRect r; // Create the window itself Create(NULL, "CButton Tests", WS_OVERLAPPEDWINDOW, CRect(0,0,200,200));</description></item><item><title>Visual C++ MFC 简明教程 [1]</title><link>https://hessian.cn/p/469.html</link><pubDate>Wed, 18 Apr 2007 07:07:00 +0800</pubDate><guid>https://hessian.cn/p/469.html</guid><description>Visual C++ MFC 简明教程 第一部分：MFC导论 Visual C++ 不仅仅是一个编译器。它是一个全面的应用程序开发环境，使用它你充分利用具有面向对象特性的 C++ 来开发出专业级的 Windows 应用程序。为了能充分利用这些特性，你必须理解 C++ 程序设计语言。掌握了C++，你就必须掌握 Microsoft 基本类库 (MFC) 的层次结构。该层次 结构包容了 Windows API 中的用户界面部分，并使你能够很容易地以面向对象的方式建立 Windows 应用程序。这种层次结构适用于所有版本的 Windows 并彼此兼容。你用 MFC 所建立的代码是完全可移植的。 该教程将向你介绍MFC的基本概念和术语以及事件驱动程序设计方法。在本节中，你将会输入、编译和运行一个简单的MFC程序。下一节中将向你详细解释这些代码。第三部分讨论了MFC控制和如何定制它们。第四部分将介绍消息映射，你将会处理MFC的事件。</description></item><item><title>Visual C++ MFC 简明教程 [2]</title><link>https://hessian.cn/p/336.html</link><pubDate>Wed, 18 Apr 2007 07:07:00 +0800</pubDate><guid>https://hessian.cn/p/336.html</guid><description>窗口对象 MFC 定义了两个类型的窗口: 1) 框架窗口，它是一个全功能的窗口，可以改变大小、最小化、最大化等等; 2) 对话框窗口，它不能改变大小。框架窗口是典型的主应用程序窗口。 在下面的代码中，从 CFrameWnd 中继承了一个新的类 CHelloWindow: 11 // Declare the main window class 12 class CHelloWindow : public CFrameWnd 13 { 14 CStatic* cs; 15 public: 16 CHelloWindow(); 17 }; 它包括一个新的构造函数，同时还有一个指向程序中所使用的唯一用户界面控制的数据成员。你多建立的每个应用程序在主窗口中都会有唯一的一组控制。 因此，继承类将有一个重载的构造函数以用来建立主窗口所需要的所有控制。典型情况下，该类会包含有一个析构函数以便在窗口关闭时来删除他们。我们这里没有 使用析构函数。在第四讲中，我们将会看到继承窗口类也会说明一个消息处理函数来处理这些控制在响应用户事件所产生的消息。 典型地，一个应用程序将有一个主应用程序窗口。因此，CHelloApp 应用程序类定义了一个名为 m_pMainWnd 成员变量来指向主窗口。为了建立该程序的主窗口，InitInstance 函数(第18至26行)建立了一个 CHelloWindow 事例，并使用 m_pMainWnd 来指向一个新的窗口。我们的 CHelloWindow 对象是在第22行建立的: 18 // The InitInstance function is called each 19 // time the application first executes. 20 BOOL CHelloApp::InitInstance() 21 { 22 m_pMainWnd = new CHelloWindow(); 23 m_pMainWnd-&gt;ShowWindow(m_nCmdShow); 24 m_pMainWnd-&gt;UpdateWindow(); 25 return TRUE; 26 } 只建立一个简单的框架窗口是不够的。还要确保窗口能正确地出现在屏幕上。首先，代码必须要调用窗口的 ShowWindow 函数以使窗口出现在屏幕上(第23行)。其次，程序必须要调用 UpdateWindow 函数来确保窗口中的每个控制和输出能正确地出现在屏幕上(第24行)。 你可能奇怪，ShowWindow 和 UpdateWindow 函数是在哪儿定义的。例如，如果你要查看以便了解它们，你可能要查看 MFC 的帮助文件中的 CFrameWnd 定义部分。但是 CFrameWnd 中并不包含有这些成员函数。CFrameWnd 是从 CWnd 类继承来的。你可以查看 MFC 文档中的 CWnd，你会发现它包含有200多个不同的成员函数。显然，你不能在几分钟内掌握这些函数，但是你可以掌握其中的几个，如 ShowWindow 和UpdateWindow。 现在让我们花几分钟来看一下 MFC 帮助文件中的 CWnd::ShowWindow 函数。为此，你你可以单击帮助文件中的 Search 按钮，并输入“ShowWindow”。找到后，你会注意到，ShowWindow 只有一个参数，你可以设置不同的参数值。我们把它设置成我们程序中 CHelloApp 的数据成员变量 m_nCmdShow (第23行)。m_nCmdShow 变量是用来初始化应用程序启动的窗口显示方式的。例如，用户可能在程序管理器中启动应用程序，并可通过应用程序属性对话框来告知程序管理器应用程序在启动 时要保持最小化状态。m_nCmdShow 变量将被设置成 SW_SHOWMINIMIZED，并且应用程序会以图标的形式来启动，也就是说，程序启动后，是一个代表该程序的图标。m_nCmdShow 变量是一种外界与应用程序通讯的方式。如果你愿意，你可以用不同的 m_nCmdShow 值来试验 ShowWindow 的效果。但要重新编译程序才能看到效果。 第22行是初始化窗口。它为调用 new 函数分配内存。在这一点上，程序在执行时会调用CHelloWindow的构造函数。该构造函数在每次带类的事例被分配时都要调用。在窗口构造函数的内 部，窗口必须建立它自己。它是通过调用 CFrameWnd 的 Create 成员函数来实现的(第31行): 27 // The constructor for the window class 28 CHelloWindow::CHelloWindow() 29 { 30 // Create the window itself 31 Create(NULL, 32 "Hello World!", 33 WS_OVERLAPPEDWINDOW, 34 CRect(0,0,200,200)); 建立函数共传递了四个参数。通过查看 MFC 文档，你可以了解不同类型。NULL 参数表示使用缺省的类名。第二个参数为出现在窗口标题栏上的标题。第三个参数为窗口的类型属性。该程序使用了正常的、可覆盖类型的窗口。在下一讲中将详细 介绍类型属性。第四个参数指出窗口应该放在屏幕上的位置和大小，左上角为(0,0), 初始化大小为 200×200个象素。如果使用了 rectDefault，则 Windows 会为你自动放置窗口及大小。 因为我们的程序太简单了，所以它只在窗口中建立了一个静态文本控制。见第35至40行。下面将详细介绍。</description></item><item><title>【转】谁说 C宏 是 智者的利刃，愚者的恶梦!</title><link>https://hessian.cn/p/438.html</link><pubDate>Wed, 18 Apr 2007 03:56:00 +0800</pubDate><guid>https://hessian.cn/p/438.html</guid><description>水平不高不低的C++程序员最喜欢挂在嘴上的一句话就是：C宏，万恶之首，错误的开端，应该被废弃。&#10;请注意，我用了一句不敬的修饰语“水平不高不低的”。为什么这么说？因为水平低都插不上话，都在在静静地听老前辈布道呢。水平高的，比如Bane Stroustrup老人家，也只是说若干种场合下C++语言能够提供比C macro更好的解决方案，而没有完全否定C macro的价值。但是话就怕传来传去，一传就走样。久而久之，就被传成上面那句话。其实说来也很好笑：java程序员经常说java比C++好，说C+ +手动释放内存老搞内存泄漏；C++程序员便反驳说，那是你水平低不会用。但是谈到C宏，水平不高不低的C++程序员居然也走java的老路了——明明是 自己不会用，自己知道的少，却把责任推卸到C宏上。你自己笨我管不着，但是错误的言论如果误导后人就不好了吧。:)&#10;本文就举几个简单的使用C宏的例子，如果这些例子用C++不用宏的语法能更好的解决，那么你一定要回复blog告诉我，这样下次我就不乱说话了。否则，笑笑很生气，后果很严重。:)&#10;</description></item><item><title>递归的应用 — 最简单分形图形实现</title><link>https://hessian.cn/p/376.html</link><pubDate>Wed, 18 Apr 2007 03:50:00 +0800</pubDate><guid>https://hessian.cn/p/376.html</guid><description>作者：吉林大学　胡卓玮&#10;下载本文源代码&#10;图一 例子代码运行结果     大家在C/C++学习时都会遇到递归，课本上以汗诺塔为例进行讲解，然后大家都希望自己找到一个递归的实例。本文以一个最简单的分形图形来讲解递归的实现过程。&#10;    先来看看绘制这个分形图形的思路。如图二所示，给定两点（p1和p2）确定一条直线，计算这条直线的长度，如果长度小于预先设定的极限值则将这两个点用直 线相连，否则，取其1/3处点（点1）、2/3处点（点2），以及中点上方一个点（点3），这个点与第1点、第2点构成的直线与直线p1p2的夹角为60 度。判断这五个点按照顺序形成的四条直线的长度是否小于预先设定的极限值，如果小于，则在将相应的两个点相连在屏幕上显示一条直线，否则继续对相应两点形 成的直线进行以上判断。&#10;</description></item><item><title>启程动态数组V2.0</title><link>https://hessian.cn/p/522.html</link><pubDate>Wed, 18 Apr 2007 03:49:00 +0800</pubDate><guid>https://hessian.cn/p/522.html</guid><description>作者：黄建雄&#10;下载源代码&#10;简介&#10;大量数据的管理是很多程序员的心病，很难找到一个速度快、效率高、支持超大规模数据的表，在1.0版本的基础上，启程花血本写下了这个强化了数据插入 与删除的修正版，启程动态数组是一个功能强大的列表形数据管理链表，利用它可以轻松实现超大数据量的随机插入、删除、修改等操作，它另外一个特点就是速度 极快，内存利用率高。&#10;大量数据的管理必然需要占用大量的内存空间，如果这些数据占用的空间大小是随各种条件变化的，我们就不能使用数组来管理这些数据了（道理就不多说 了），这时我们需要一个动态数组。MFC提供了一个很好的动态数组类CArray，对于少量数据，使用CArray就足够好用了，但是对于大量数据 （10W级）它就力不从心了，因为它的本质就是一个数组，只不过对常用的插入、删除等操作进行了一个复杂的包装。为了解决这个问题，启程动态数组开创性地 将链表与数组巧妙的结合起来，既有数组的高速随机索引的优点，又有链表的数据量灵活多变的特点。&#10;</description></item><item><title>URL编码</title><link>https://hessian.cn/p/467.html</link><pubDate>Wed, 18 Apr 2007 03:48:00 +0800</pubDate><guid>https://hessian.cn/p/467.html</guid><description>作者： Chandrasekhar Vuppalapati 翻译：eastvc&#10;下载源代码&#10;本文的目的是设计一个完成URL编码的C++类。在我曾经的项目中，我需要从VC++ 6.0应用程序中POST数据，而这些数据需要进行URL编码。我在MSDN中查找能根据提供的字符串生成URL编码的相关类或API，但我没有找到，因 此我必须设计一个自己的URLEncode C++类。&#10;</description></item><item><title>简单快速的哈夫曼编码</title><link>https://hessian.cn/p/304.html</link><pubDate>Wed, 18 Apr 2007 03:48:00 +0800</pubDate><guid>https://hessian.cn/p/304.html</guid><description>作者：Hatem Mostafa 译者：happyparrot&#10;下载源代码&#10;介绍&#10;本文描述在网上能够找到的最简单，最快速的哈夫曼编码。本方法不使用任何扩展动态库，比如STL或者组件。只使用简单的C函数，比如：memset，memmove，qsort，malloc，realloc和memcpy。&#10;</description></item><item><title>VC++中用内存映射文件</title><link>https://hessian.cn/p/613.html</link><pubDate>Wed, 18 Apr 2007 03:37:00 +0800</pubDate><guid>https://hessian.cn/p/613.html</guid><description>在软件的开发过程中，有时需要控制一些程序使他们不能同时运行，也就是多个程序间互斥运行（还包括禁止同一程序运行多个实例）。针对这一问题，我们在Visual C++6.0中利用内存映射文件实现了多个程序间的互斥运行。内存映射文件可以创建一个没有和磁盘文件相联系的内存对象，将文件的信息映射到一个进程的地址空间上，我们可以访问该文件中的数据，就如同它位于内存中一样。同时，在程序设计中可以给内存映射文件对象起一个名字，这个名字在整个系统中是唯一的，这个名字可以在多个进程之间共享，通过名字共享能实现进行信息交换，进而实现多个程序间的互斥运行。&#10;</description></item><item><title>如何将一个文件分割成多个小文件</title><link>https://hessian.cn/p/632.html</link><pubDate>Wed, 18 Apr 2007 03:28:00 +0800</pubDate><guid>https://hessian.cn/p/632.html</guid><description>   你也许会遇到到这样一个问题？当你有一个较大的软件，而无法用一张软盘将其全部拷下时，你也许会想到该将它分解开，分盘拷回去后，再将它们合并起来。现在的这种分割工具很多，你想自己动手做一个适合自己的分割工具么？下面就让我用以前用VC做的一个＜袖珍文件分割器＞的例程来告诉你吧！程序运行后界面如下图： 基本构成思想：文件分割的基本思想比我之前发表的另一篇文章＜如何将多个文件合并为一个可执行程序＞的构成思想简单多了，它主要也分为分割文件和合并分割后的文件二大部分。分割文件，将原文件按指定分割大小进行等分，然后顺序读取其指定分割大小数据后到写到各自的新建文件中。合并文件，将各分割后的文件顺序读取后，写入到一个文件中既可。</description></item><item><title>用Visual C++操作INI文件</title><link>https://hessian.cn/p/331.html</link><pubDate>Wed, 18 Apr 2007 03:27:00 +0800</pubDate><guid>https://hessian.cn/p/331.html</guid><description>在我们写的程序当中,总有一些配置信息需要保存下来,以便完成程序的功能,最简单的办法就是将这些信息写入INI文件中,程序初始化时再读入.具体应用如下:&#10;</description></item><item><title>PE 格式学习总结（四）– PE文件中的资源</title><link>https://hessian.cn/p/354.html</link><pubDate>Wed, 18 Apr 2007 03:23:00 +0800</pubDate><guid>https://hessian.cn/p/354.html</guid><description>    程序所用到的各种资源，比如 bmp,cursor,menu,对话框等都存在PE文件中。&#10;    我们将详细介绍关于资源的各种结构，通过一个例子来说明资源及其相关结构是怎么放在PE文件中的。以及如何在遍历PE文件中的所有资源。我们只最终找到这些资源在文件中的位置和长度。而不具体分析某种资源的格式，比如有个BMP的资源，我们不分析BMP格式。</description></item><item><title>PE 格式学习总结（三）– PE文件中的输入函数</title><link>https://hessian.cn/p/382.html</link><pubDate>Wed, 18 Apr 2007 03:22:00 +0800</pubDate><guid>https://hessian.cn/p/382.html</guid><description>    关于输入部分，我们将详细介绍关于输入函数的各种结构，通过一个例子来说明输入函数及其相关结构是怎么放在PE文件中的。以及如何在PE文件中找到这些东西。</description></item><item><title>PE 格式学习总结（二）– PE文件中的输出函数</title><link>https://hessian.cn/p/649.html</link><pubDate>Wed, 18 Apr 2007 03:17:00 +0800</pubDate><guid>https://hessian.cn/p/649.html</guid><description>    一般来说输出函数都是在dll中。我们将详细介绍关于输出函数的各种结构，通过一个例子来说明输出函数及其相关结构是怎么放在PE文件中的。以及如何在PE文件中找到这些东西。</description></item><item><title>PE 格式学习总结（一）– PE文件概述</title><link>https://hessian.cn/p/328.html</link><pubDate>Wed, 18 Apr 2007 03:16:00 +0800</pubDate><guid>https://hessian.cn/p/328.html</guid><description>零 前言     PE格式，是Windows的可执行文件的格式。Windows中的 exe文件，dll文件，都是PE格式。PE 就是Portable Executable 的缩写。Portable 是指对于不同的Windows版本和不同的CPU类型上PE文件的格式是一样的，当然CPU不一样了，CPU指令的二进制编码是不一样的。只是文件中各种 东西的布局是一样的。&#10;</description></item><item><title>Delphi数据库编程技巧</title><link>https://hessian.cn/p/603.html</link><pubDate>Wed, 18 Apr 2007 03:08:00 +0800</pubDate><guid>https://hessian.cn/p/603.html</guid><description>　我原来在万千的新闻组(news://news.webking.com.cn/)Delphi版上闲逛那段时间，发现经常有人提出一些数据库方面的技巧性问题，问题其实不难，但是要一个简单的解决方案，可能也破费思量，特别在此简单谈谈：&#10;</description></item><item><title>[转]visual c++对大型数据文件的读取</title><link>https://hessian.cn/p/401.html</link><pubDate>Wed, 18 Apr 2007 02:59:00 +0800</pubDate><guid>https://hessian.cn/p/401.html</guid><description>　笔者前不久曾遇到一个问题，解决之后的经验愿与大家分享。问题是这样的，有一批数据文件，数据格式如下：&#10;日期,开盘,最高,最低,收盘,成交量,成交金额 1996年5月13日,636.96,636.96,636.96,636.96,0,0,&#10;</description></item><item><title>用拷贝钩子实现对文件夹的监控</title><link>https://hessian.cn/p/579.html</link><pubDate>Wed, 18 Apr 2007 02:49:00 +0800</pubDate><guid>https://hessian.cn/p/579.html</guid><description>本文原出处已不知。原作：webber84， 经ccrun(老妖)修改并在BCB在调试通过。&#10;ICopyHook 是一个用于创建拷贝钩子处理程序COM接口，它决定一个文件夹或者打印机对象是否可以被移动，拷贝，重命名或删除。Shell在执行这些操作之前，会调用 ICopyHook接口的CopyCallback方法对它们进行验证。CopyCallback返回一个int值指示Shell是否应该继续执行这个操 作。返回值IDYES表示继续，而返回值IDNO和IDCANCEL则表示终止。&#10;</description></item><item><title>钩子的应用: 程序运行监视</title><link>https://hessian.cn/p/635.html</link><pubDate>Wed, 18 Apr 2007 02:48:00 +0800</pubDate><guid>https://hessian.cn/p/635.html</guid><description> 作者：Victor Chen&#10;来自：C++ 爱好者&#10;http://www.cppfans.com&#10;——————————————————————————–&#10;程序介绍:&#10;利用这个程序:&#10;1.可以监视在你的电脑运行的程序, 把在你的电脑运行过的程序的时间和名字记录下来;&#10;2.可以阻止你规定的禁用程序的执行, 比如不让玩游戏。&#10;3.这个程序需要加入注册表, 在系统启动时就运行, 达到监视的目的。注册表大概都不陌生，就是这里:&#10;HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindowsCurrentVersionRun&#10;</description></item><item><title>软件看门狗–别让你的程序没有响应</title><link>https://hessian.cn/p/539.html</link><pubDate>Wed, 18 Apr 2007 02:48:00 +0800</pubDate><guid>https://hessian.cn/p/539.html</guid><description>原作者姓名 陆其明&#10;文章原始出处 http://hqtech.nease.net&#10;正文&#10;一．概述&#10;一些重要的程 序，必须让它一直跑着；而且还要时时关心它的状态——不能让它出现死锁现象。当然，如果一个主程序会出现死锁，肯定是设计或者编程上的失误。我们首要做的 事是，把这个Bug揪出来。但如果时间紧迫，这个Bug又“飘忽不定”，那么，我们还是先写一个软件“看门狗”，暂时应一下急吧。&#10;</description></item><item><title>Windows下DLL编程技术及应用</title><link>https://hessian.cn/p/523.html</link><pubDate>Wed, 18 Apr 2007 02:41:00 +0800</pubDate><guid>https://hessian.cn/p/523.html</guid><description>摘 要: 本文介绍了DLL技术在Windows编程中的基本运用方法及应用，给出了直接内存&#10;访问及端口I/O的两个实用DLL的全部源代码。&#10;关键词: DLL Windows编程 内存访问 I/O&#10;</description></item><item><title>在Windows桌面创建快捷方式</title><link>https://hessian.cn/p/598.html</link><pubDate>Wed, 18 Apr 2007 02:27:00 +0800</pubDate><guid>https://hessian.cn/p/598.html</guid><description>API提供了一个叫做IShellLink的COM接口允许我们创建快捷方式。为在桌面创建快捷方式，我们创建一个IShellLink对象，设置它的属性，然后把这个link保存到desktop目录。&#10;下面的例子代码演示了怎样创建一个快捷方式。在这个例子里，这个快捷方式保存在C:根目录下。&#10;//———————————————————————-&#10;#define NO_WIN32_LEAN_AND_MEAN&#10;#include &lt;shlobj.h&gt;&#10;#include &lt;vcl.h&gt;&#10;#pragma hdrstop&#10;</description></item><item><title>Visual C++中实现对图像数据的读取显示</title><link>https://hessian.cn/p/324.html</link><pubDate>Wed, 18 Apr 2007 02:21:00 +0800</pubDate><guid>https://hessian.cn/p/324.html</guid><description>在利用VC进行数据库编程时，经常需要处理数据库中的图像数据，将该图像从数据库中读取出来并显示，图像数据与 文本字段不同，它是作为OLE字段在数据库中存储，通过数据集对象的成员变量自动交换得到的图像数据，得到的数据并不能直接显示，如何处理图像数据，一直 是数据库编程中的一个难点，目前关于VC进行数据库编程的资料不少，但很少涉及图像数据的操作，笔者针对一现状，结合自己开发的一个项目，解决了如何显示 数据库中的图像这一问题，本文以操作ACESS数据库为例子，讲解一下自己的实现思路，希望对爱好VC编程的朋友们有所帮助，以起到抛砖引玉的作用。&#10;</description></item><item><title>几种VC++数据库开发技术的比较</title><link>https://hessian.cn/p/441.html</link><pubDate>Wed, 18 Apr 2007 02:21:00 +0800</pubDate><guid>https://hessian.cn/p/441.html</guid><description>　从功能简单的数据库(如Jet Engine)到复杂的大型数据库系统(如oracle)，VC++6.0都提供了一些编程接口。本文主要介绍以下五种:&#10;</description></item><item><title>Visual C++ 中的ODBC编程</title><link>https://hessian.cn/p/562.html</link><pubDate>Wed, 18 Apr 2007 02:20:00 +0800</pubDate><guid>https://hessian.cn/p/562.html</guid><description> ODBC（Open Database Connectivity，开放式数据库连接），是一种用来在相关或不相关的数据库管理系统（DBMS）中存取数据的标准应用程序接口（API）。本文给 出Windows 95 环境下用Visual C++ 进行ODBC 编程的具体方法及技巧。&#10;</description></item><item><title>利用Active X控件开发串口通信软件</title><link>https://hessian.cn/p/309.html</link><pubDate>Wed, 18 Apr 2007 02:18:00 +0800</pubDate><guid>https://hessian.cn/p/309.html</guid><description>　摘要：本文介绍了在Microsoft Visual C++ 6.0环境下通过对Active X控件的编程来实现串口的通信的一般方法。&#10;一、 引言&#10;当我们在Windows操作系统下开发串行通信程序时通常不得不面对许多复杂的API函数，因为在Windows操作系统下不能直接对设备端口进行操 作，也不能在系统级（Ring 3级别）使用任何DOS或BIOS中断，如要对端口进行编程则只能以文件的形式来对端口进行操作，这就使开发人员不得不面对非常烦琐的API函数编程。本 文对此提出了另外一种封装性很好的使用Microsoft Visual C++ 6.0自带的"Microsoft Communications Control，version 6.0"Active X控件的编程方法，通过对该控件的正确使用，我们可以比较轻松地编写出所需的串行通信程序。&#10;</description></item><item><title>通过COM技术实现Windows外壳编程</title><link>https://hessian.cn/p/373.html</link><pubDate>Wed, 18 Apr 2007 02:16:00 +0800</pubDate><guid>https://hessian.cn/p/373.html</guid><description>　摘要：本文介绍了一种有别于通常的Windows外壳编程方法。采用COM技术，通过Windows提供的外壳接口实现对其的编程。&#10;一、 引言&#10;在Windows环境下，不论是使用Visual C++还是Delphi或是其他一些软件开发工具，尽管存在着差别，但有一点是相同的：都是运行于Windows操作系统之下的。在程序开发过程中也经常 要在自己的应用程序中加入一些Windows系统本身就有的功能，比如文件的拷贝、删除、查找以及运行程序等等。而这些功能在Windows操作系统下都 是具备的，显然如果能直接从系统中调用这些功能将不仅仅减少程序的大小和开发人员的工作量，而且由于是直接通过操作系统来完成这些功能，将会大大减小这部 分程序出现异常错误的概率。Windows系统虽说也存在不少错误，但常用功能的错误还是比较少的，而且通过补丁程序可以更低限度减少系统错误，因此程序 员可以将调试检错的注意力放在应用程序的其他地方，对于调用系统功能这部分代码则可以不必投入太大的精力去调试，因为这部分调试的工作在操作系统发布的时 候就已经由微软做好了。&#10;</description></item><item><title>PHP V5.2 中的新增功能，第 2 部分: 使用新输入过滤扩展功能</title><link>https://hessian.cn/p/626.html</link><pubDate>Wed, 18 Apr 2007 02:11:00 +0800</pubDate><guid>https://hessian.cn/p/626.html</guid><description>2007 年 4 月 17 日&#10;在 “PHP V5.2 中的新增功能” 这一系列的第 2 部分中，了解如何有效使用新的 PHP V5.2 提供的新输入过滤扩展功能。这是一项急需的功能，它将允许您验证表单和其他输入介质的输入而无需依赖第三方软件。阅读本文后，您将能有效地过滤输入以提高应用程序的安全性。&#10;</description></item><item><title>PHP V5.2 中的新增功能，第 1 部分: 使用新的内存管理器</title><link>https://hessian.cn/p/490.html</link><pubDate>Wed, 18 Apr 2007 02:10:00 +0800</pubDate><guid>https://hessian.cn/p/490.html</guid><description>2007 年 4 月 10 日&#10;了解如何使用 PHP V5.2 中引入的新内存管理器并开始精通于跟踪和监视内存使用情况。这将使您可以在 PHP V5.2 中更加有效地使用更多的内存。&#10;PHP V5.2：开始&#10;</description></item><item><title>掌握 Ajax，第 1 部分: Ajax 简介</title><link>https://hessian.cn/p/533.html</link><pubDate>Wed, 18 Apr 2007 01:59:00 +0800</pubDate><guid>https://hessian.cn/p/533.html</guid><description>五年前，如果不知道 XML，您就是一只无人重视的丑小鸭。十八个月前，Ruby 成了关注的中心，不知道 Ruby 的程序员只能坐冷板凳了。今天，如果想跟上最新的技术时尚，那您的目标就是 Ajax。&#10;</description></item><item><title>SQL的基本命令和几个常用函数汇总</title><link>https://hessian.cn/p/365.html</link><pubDate>Wed, 18 Apr 2007 01:58:00 +0800</pubDate><guid>https://hessian.cn/p/365.html</guid><description>&#10;–创建对象(表、视图、存储过程、函数)命令]&#10;CREATE TABLE/VIEW/PROCEDURE/FUNCTION&#10;–创建表&#10;CREATE TABLE tabTestVB (VbName varchar(10),value numeric(10))&#10;GO&#10;CREATE TABLE tabTestVB1&#10;(VbName varchar(10),value1 numeric(10))&#10;GO&#10;–插入数据（两种方式）&#10;INSERT INTO tabTestVB(VbName,value)&#10;SELECT ‘AAA’,123&#10;INSERT INTO tabTestVB1(VbName,value1)&#10;SELECT ‘AAA’,456&#10;</description></item><item><title>CSS下拉菜单</title><link>https://hessian.cn/p/430.html</link><pubDate>Wed, 18 Apr 2007 01:42:00 +0800</pubDate><guid>https://hessian.cn/p/430.html</guid><description>&lt;!DOCTYPE html PUBliC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"&gt;&#10;&lt;html xmlns="http://www.w3.org/1999/xhtml" lang="zh-CN"&gt;&#10;&lt;head&gt;&#10;&lt;meta http-equiv="Content-Type" content="text/html; charset=gb2312" /&gt;&#10;&lt;title&gt;css菜单演示&lt;/title&gt;&#10;&lt;style type="text/css"&gt;&#10;&lt;!–&#10;*{margin:0;padding:0;border:0;}&#10;body {&#10;   宋体, serif;&#10;        ;&#10;}&#10;</description></item><item><title>[转]Session详解</title><link>https://hessian.cn/p/475.html</link><pubDate>Wed, 18 Apr 2007 01:32:00 +0800</pubDate><guid>https://hessian.cn/p/475.html</guid><description>摘要：虽然session机制在web应用程序中被采用已经很长时间了，但是仍然有很多人不清楚session机制的本质，以至不能正确的应用这一 技术。本文将详细讨论session的工作机制并且对在Java web application中应用session机制时常见的问题作出解答。&#10;</description></item><item><title>[转] 编 程 之 道</title><link>https://hessian.cn/p/495.html</link><pubDate>Wed, 18 Apr 2007 01:27:00 +0800</pubDate><guid>https://hessian.cn/p/495.html</guid><description>编 程 之 道&#10;Geoffrey James&#10;第一篇 静寂的空宇&#10;第二篇 古代的大师&#10;第三篇 设计&#10;第四篇 编码&#10;第五篇 维护&#10;第六篇 管理&#10;第七篇 公司里的学问&#10;第八篇 硬件和软件&#10;第九篇 尾声&#10;</description></item><item><title>WinPcap 教程</title><link>https://hessian.cn/p/658.html</link><pubDate>Mon, 16 Apr 2007 04:58:00 +0800</pubDate><guid>https://hessian.cn/p/658.html</guid><description>原文出处：http://winpcap.polito.it/docs/man/html/index.html 作者: Loris Degioanni (degioanni@polito.it), NetGroup, Politecnico di Torino http://winpcap.polito.it 概述： 这 篇教程将会指引读者逐步了解WinPcap编程, 从简单的基础函数(获取网络接口列表, 捕捉数据包)到更高级的内容(处理发送队列, 网络流量统 计). 教程中包括一些代码片断, 以及一些简单但完整的例子, 读者可以参考这些例子更好的理解教程的内容. 这些例子全部用C语言写成, 所以基本的 C语言编程知识是必要. 同时, 因为这篇教程的内容是与底层网络紧密相连的, 所以笔者假设读者已经具备有关网络和协议的相关知识. 译者的话： WinPcap 是一套免费的, 基于Windows的网络接口API, 它在底层网络操作方面对程序员很有帮助. 这篇文档翻译自 "WinPcap Documentation 3.0" 中的 "WinPcap tutorial: a step by step guide to program WinPcap" 一部分. 这篇教程对初学者的帮助很大, 尤其是简短清晰的例 子, 但这篇教程只是整个文档的一小部分, 我认为你仍然需要参考文档的其它部分来了解各种结构等信息. 教程中注有前缀 "Y-" 的部分是译者为了让 读者更明白作者的意思添加的, 原文中没有. 1. 获取网络接口列表 通常, 一个基于WinPcap的应用程序所要做的第一件 事, 就是获得适合的网络接口的列表. Libpcap中的pcap_findalldevs()函数就是干这活的: 这个函数然回一个pcap_if结 构的列表, 每个元素都记录了一个接口的信息. 其中, name和description以人类可以阅读的形式, 记录了设备的信息. 下面的源代码输出可用的网络接口的列表, 并且在没有找到任何借口的情况下输出错误信息：</description></item><item><title>杀毒软件编程精华——特征码扫描技术</title><link>https://hessian.cn/p/551.html</link><pubDate>Mon, 16 Apr 2007 04:52:00 +0800</pubDate><guid>https://hessian.cn/p/551.html</guid><description>特征码扫描技术是反病毒技术中的常规武器，虽然特征码扫描技术有着一定的局限性，但是，改进的基于特征码扫描技术的广 谱特征串过滤技术却有着无比的优越性和广阔的应用前景。但是，无论是上面提到的哪种技术，最终都难以逃脱扫描算法的效率要求。而学过《数据结构》的读者应 该知道一种快速的字符串扫描算法叫做“模式匹配算法”，这种算法可以对字符串进行快速扫描。但是，深入进去就会发现，我们的特征码扫描算法中经常会用到通 配符，如：%和*（这里我令%匹配一个字符，*匹配32个字符），对于这样一些非常规的串，没有现成的算法可以引用。笔者在做防治木马技术的研究中，对常 规的模式匹配算法进行了改进，写出了如下的快速查找算法，暂且命名为“半回溯的模式匹配算法”，以与常规的“无回溯的模式匹配算法”区别。&#10;这里，我之所以称之为“半回溯”，就是因为在对通配符进行匹配时要进行适当的回溯，以减少因为采用通配符所带来的过长推进，虽然这是一种带有回溯的算法， 但是实际上它的效率并不比“无回溯的模式匹配算法”低多少，其对算法的效率不能构成真正的威胁。这个算法比较抽象，如果没有基础的读者最好先回头看一下 《数据结构》的教材中的“无回溯的模式匹配算法”，会对您接下来对算法的理解产生很大的帮助。光说不练，不是好汉，下面我们就开始艰辛而又刺激的模式匹配 算法之旅。&#10;对于“无回溯的模式匹配算法”，我不想做过多的说明，因为相关书籍上已经说得够明白了。下面，我们一起来看一下带通配符的半回溯的匹配算法（用%号匹配一个字符，用*匹配32个字符）：&#10;1.[初始化]&#10;i=1; j=1;&#10;counter1=0; counter2=0;&#10;2.[利用next[i]反复进行比较，直到i等于m+1]&#10;循环 当i&lt;=m且j&lt;=n时，反复执行&#10;若（p[i]!=’*’且p[i]==t[j]）&#10;则i=i+1; j=j+1; 否则若p[i]==’%’&#10;则 i=i+1; j=j+1; counter1=counter1+1;&#10;否则若p[i]==’*’&#10;则i=i+1; j=j+32; counter2=counter2+1;&#10;否则若next[i]&gt;0&#10;则i=next[i] j=j – (counter1+counter2*32);counter1=0;counter2=0;&#10;否则&#10;i=1; j=j – (counter1+counter2*32);j++;counter1=0;counter2=0;&#10;其中，counter1是用来统计%的个数，而counter2用来统计*的个数，其中m是子串的长度，n是被搜索串的长度。每次碰到子串中有%的时候就 自动将counter1加一，若是碰到counter2就自动将counter2加一。i用来指明子串的当前的比较的位置，而j用来指明被搜索串当前比较 的位置，如果一旦子串与被搜索串不能满足搜索条件，就要将被搜索串的比较位置进行回溯，以回到被通配符漏过的字符的个数，以便重新匹配。&#10;这里，涉及到了与“无回溯的模式匹配算法”中相同的要使用的Next数组，其中，Next数组的计算方法如下：&#10;1.[初始化]&#10;j=0; i=1;&#10;next[1]=0;&#10;2.[反复比较计算next[i+1]&#10;循环 当i&lt;m时，反复执行&#10;(1)[找出p1p2…pi中最大的相同的前缀和后缀，并将长度送j]&#10;循环 当j&gt;0且p[i]!=p[j] 且p[i]!=’%’且p[j]!=’%’时，反复执行&#10;j=next[j]&#10;(2)[计数器加1]&#10;i=i+1; j=j+1;&#10;(3)[计算next[i]]&#10;若p[i]==p[j]或p[i]==’%’或p[j]==’%’&#10;则next[i]=next[j];&#10;否则next[i]=j;&#10;Next数组的计算方法，与“无回溯匹配算法”稍有不同，因为%用来匹配一个字符，所以对于%的处理，可以看作比较的字符相等的情况来处理，而对*的比较，无论如何一个字符都不可能与一个32字符的字符串相等，所以对于*始终认为不相等。&#10;这个算法的描述，无论我作何解释，读者总会感觉到有一些抽象，而难于真正理解。下面，笔者写了一个简单的程序，来对这个算法进行测试，希望对您会有所帮 助。这个程序是在VC6.0的控制台下运行的，非常简单，基本上就上将以上的算法翻译成了C++语言。源程序可以在附书光盘中找到，名称为“带通配符的无 回溯模式匹配算法源程序”。&#10;在这个程序中，首先就是要建立一个子串和被搜索串，并确定算法中提到的m和n的值，如下所示。&#10;//被搜索的串&#10;char* t="nihaoaxishanchangshanchangaoyejiehhe*%dfisd%shanchashanchanghongioejw";&#10;//子串&#10;char* p="shanchang%*%hong";&#10;//next数组中元素的个数等于子串的长度&#10;int next[16];&#10;int i,j;&#10;//initialize variable&#10;j=0;i=1;next[0]=0;&#10;接下来，要计算next数组的值，对上面的算法进行翻译，得到如下代码。&#10;//计算next数组的循环&#10;while(i&lt;16)&#10;{&#10;while(j&gt;0&amp;&amp;p[i-1]!=p[j-1]&amp;&amp;p[i-1]!=’%’&amp;&amp;p[j-1]!=’%’)&#10;j=next[j-1];&#10;i++;&#10;j++;&#10;if(p[i-1]==p[j-1]||p[i-1]==’%’||p[j-1]==’%’)&#10;next[i-1]=next[j-1];&#10;else&#10;next[i-1]=j;&#10;}&#10;有了至关重要的next数组之后，就要使用改进了的模式匹配算法，从被搜索串中搜索出子串，代码如下：&#10;//模式匹配的循环&#10;i=1;&#10;j=1;&#10;int counter1=0,counter2=0;&#10;while(i&lt;=16&amp;&amp;j&lt;=69)&#10;{&#10;if(p[i-1]!=’*’&amp;&amp;p[i-1]==t[j-1])&#10;{i++;j++;}&#10;else if(p[i-1]==’%’)&#10;{&#10;i++;&#10;j++;&#10;counter1++;&#10;}&#10;else if (p[i-1]==’*’)&#10;{&#10;i++;&#10;j+=32;&#10;counter2++;&#10;}&#10;else if (next[i-1]&gt;0)&#10;{&#10;i=next[i-1];&#10;j-=(counter1+counter2*32);&#10;counter1=0;&#10;counter2=0;&#10;}&#10;else {&#10;i=1;&#10;j-=(counter1+counter2*32);&#10;j++;&#10;counter1=0;&#10;counter2=0;&#10;}&#10;//如果I等于17，说明对子串的搜索已经走到尽头，并搜索到了子串，跳出循环。&#10;if(i==17) break;&#10;}&#10;如果您需要使用这个算法进行特征码的查找，可以直接将其中的计算next数组和模式匹配的部分进行移植。&#10;到这里，基本上将要说的都说完了，可能您对这个算法还是有一些迷惑，如果您对其的正确性有疑问的话，可以使用上面的程序，对不同的子串和被搜索串进行操 作。另外，如果您对next数组不太了解，还是建议您找出教材来好好看一下。本算法的效率是比较高的，至于它的计算复杂度，我想在这里我就不能做过多的说 明了，有兴趣的读者，或者从事反病毒研究的读者，希望能对你们有一定的帮助，同时，如果有不对的地方，可以在黑防的论坛上面提一下，以期获得改进。&#10;后记：对于一个真正的程序员来说，其任务决不应该仅仅只是机械地拖拖控件，动动鼠标。更重要的应该是编程开始前的软件的整体安排和设计，而相关算法设计也 应该是非常重要的一部分。对于一个扫描软件来说，其扫描算法的设计也定是其精华所在。本文专门对算法进行相关分析，希望能够对您有所启发。&#10;</description></item><item><title>CGI扫描器的原理和实现过程</title><link>https://hessian.cn/p/395.html</link><pubDate>Sun, 15 Apr 2007 19:32:00 +0800</pubDate><guid>https://hessian.cn/p/395.html</guid><description>有很多网站为了安全起见，在WEB Server前面架了防火墙，或者做了TCP/IP过滤，对外只开放TCP 80 端口。从入侵者角度来看，要入侵那 么从80上跑的CGI入手是比较可行的，当然也可以用别的办法，例如旁敲侧击，呵呵。从网管角度来看，一是要保证CGI的安全性，另外网络的整体安全性也 是很重要的。针对基于80端口入侵、防范而出的CGI扫描器数不胜数，但基本上原理都一样。&#10;CGI扫描器原理说起来其实非常简单，可以用四句话来概括：&lt;1&gt;连接目标WEB SERVER；&lt;2&gt;发送一个特殊的请求；&lt;3&gt;接收目标服务器返回数据；&lt;4&gt;根据返回数据判断目标服务器是否有此CGI漏洞。&#10;当管理的服务器达到一定数量的时候，手工检测自己的服务器是否存在各种各样的CGI漏洞，那就太消耗时间和精力了，所以一个网管手上有个比较好用的 CGI漏洞扫描器还是必要的。OK！今天我们就自己来动手用C写一个简单的CGI扫描器，帮助自己在日常工作中检测服务器：））&#10;</description></item><item><title>用VC++编写CGI程序</title><link>https://hessian.cn/p/530.html</link><pubDate>Sun, 15 Apr 2007 18:58:00 +0800</pubDate><guid>https://hessian.cn/p/530.html</guid><description>近年来,Internet与Intranet迅猛发展,企业纷纷建立自己的Intranet,以加强企业内部的联系,促进与外部世界的沟通,增强企业的竞 争能力。通过建立自己的Internet服务器,企业能在网络上发布广告,介绍本公司的情况与产品,收集顾客意见,以及建立虚拟电子商场等。大家都知道写 一个HTML超文本文件放在World Wide Web服务器上,即可通过各种浏览器访问你的主页,但是如何使你的静态主页能响应客户的动作,并与本地的数据库联系,将数据库的相应内容传送给远端的浏览 器呢?这就需要通过CGI接口进行联系。&#10;CGI全名是Common Gateway Interface,它是WWW服务器调用外部程序的接口通过CGI,WW W服务器能完成一些本身所力不能及的工作。&#10;</description></item><item><title>Windows操作平台下CGI的实现</title><link>https://hessian.cn/p/364.html</link><pubDate>Sun, 15 Apr 2007 18:31:00 +0800</pubDate><guid>https://hessian.cn/p/364.html</guid><description>华中理工大学图像识别与人工智能研究所     龚建勇 实现WWW服务器与客户的交互可以有多种途径,如CGI、ISAPI、JAVA、ASP等,CGI是一种大家都比较熟悉的一种实现上述功能的有效途径,本文将就如何在Windows平台下实现CGI功能作一介绍。</description></item><item><title>病毒的本质</title><link>https://hessian.cn/p/609.html</link><pubDate>Fri, 13 Apr 2007 04:24:00 +0800</pubDate><guid>https://hessian.cn/p/609.html</guid><description>by Koms Bomb/CVC.GA 本文的目的，就是想说明写病毒其实是多么的容易。 一，病毒神话 我们先看看让大家“兴奋”、“激动”的病毒技术。 1，CIH，简直成了神话，CIH的作者也成为无数人的偶像。这神话，是AVer吹出来的，这偶像，只是中国人盲目崇拜的延续，外国人没这臭毛病。看看这个病毒里究竟有什么？1K多点的代码，再厉害能有什么？我觉得这个病毒唯一比较好的地方就是它的非常优化。这种优化，其实说白了也不难，只要稍微有些汇编编程经验，再加上一部指令手册（至少要有指令长度），再有足够的耐心，都可以做到。其它还有什么？进入Ring 0？早已有之，再说稍微懂些保护模式的人都知道利用GDT/IDT/LDT是可以进行特权转换的，常识问题。感染后文件大小不变？稍微了解PE格式的人都知道PE里有多少空地。使用VxD技术？Flash BIOS？只要能找到这些资料，有什么难的？VxD无非就是玩一些int 20h，Flash BIOS无非是写一些端口。调用中断，写端口，谁不会？但怎么调中断，写哪些端口，则需要知道相关的资料。我就写不出VxD为基础的病毒，我也不会Flash BIOS，因为我没有这方面的资料。 再看看时下“热门”的病毒技术。 2，跨平台病毒。跨Windows和Linux，同样是X86指令，有什么特殊的吗？基本上这种跨平台病毒，公用一部分变形之类的和OS无关的代码，而和OS有关的则是分开的。比如在Windows上就调用API，而在Linux上则用int 80h（没搞错中断号吧，我对Linux没什么研究）。其实就相当于两个病毒的合并。只要有了相关系统调用的资料，这种病毒显然很容易。其实写出针对不同CPU的病毒也不难，只要针对不同的文件感染不同的代码，然后把另外OS或CPU的代码做为数据不执行就行。顺便说一句，跨平台有什么用？有几个Linux机器上有PE文件的？又有几个Windows上有ELF文件的？ 3，.net病毒。有什么新鲜吗？Java不是也有病毒吗？只要掌握MSIL汇编，写一个真正的.net病毒并不难。值得一提的是前一阵炒得火热的两个.net病毒其实根本难登大雅之堂。29A的那个是用X86汇编写的，稍微有点头脑的都知道，.net是架构在MSIL上的，是一种中间语言，X86汇编根本就和.net无关。我没仔细看这个病毒的代码，但我估计无非是对EPE格式有一些不同于PE的操作，总体来说，还是PE病毒。那个“17岁天才少女”的C#病毒，算是.net病毒吧，但值得一吹吗？你，说的就是你，去看看C#语法，再略微看一些.net framework，相信你也可以用C#写出一个可以把自己通过邮件发出去的程序，这就是时髦的.net病毒。 4，metamorphism。简直被AVer吹上天了。这东西说白了其实就是对自身代码进行重新编码。过程是，反汇编自己的代码，重新改写（比如mov eax,esi可以写成push esi;pop eax等等），插入垃圾代码。当然最好还要在下一代中删除垃圾代码。怎样判断垃圾代码？显然看到一条指令的目的操作数在以后没有被当作源操作数，就可以认为是垃圾。这东西玩弄的是机器代码技巧，只要在手边摆一部Intel的指令手册，再加上足够的耐心，想对代码重新编码，不难。但写这东西确实很繁琐，可以说是非常繁琐，写出的代码也很大，没有实用价值。以后有空我可能会重新考虑一个semi-metamorphism，也不难，但力求小，如果engine超过8K，我将放弃。</description></item><item><title>向其他进程注入代码的三种方法[1]</title><link>https://hessian.cn/p/529.html</link><pubDate>Fri, 13 Apr 2007 03:44:00 +0800</pubDate><guid>https://hessian.cn/p/529.html</guid><description>     本文章翻译自Robet Kuster的Three Ways to Inject Your Code into Another Process一文，原版地址见下面。本文章版权归原作者所有。&#10;     如果转载该译文,请保证文章的完整性，并注明来自www.farproc.com&#10;袁晓辉   &#10;2005/5/20&#10;</description></item><item><title>向其他进程注入代码的三种方法[2]</title><link>https://hessian.cn/p/305.html</link><pubDate>Fri, 13 Apr 2007 03:44:00 +0800</pubDate><guid>https://hessian.cn/p/305.html</guid><description>     这是什么意思？每个进程都有一个特殊的寄存器，这个寄存器指向下一条要执行的指令的内存地址，即32位Intel和AMD处理器上所谓的EIP寄存器。因为EIP是个特殊的寄存器，所以你不能像访问通用寄存器（EAX，EBX等）那样来访问它。换句话说，你找不到一个可以用来寻址EIP并且对它进行读写的操作码（OpCode）。然而，EIP同样可以被JMP，CALL，RET等指令隐含地改变（事实上它一直都在改变）。让我们举例说明32位的Intel和AMD处理器上CALL/RET是如何工作的吧：&#10;</description></item><item><title>windows C语言网络编程快速入门</title><link>https://hessian.cn/p/486.html</link><pubDate>Tue, 10 Apr 2007 15:01:00 +0800</pubDate><guid>https://hessian.cn/p/486.html</guid><description>Windows下C语言网络编程快速入门&#10;   C语言的学习，一般的方式是，先学C，然后是C++，最好还要有汇编语言和微机原理基础，然后才是Visual C++。这样的方式，对学习者来说，要花费很多时间和耐力。而在学校教学中，也没有时间深入学习Windows编程的实用技术了。&#10;</description></item><item><title>全力提升 TIniFile 的读取速度</title><link>https://hessian.cn/p/656.html</link><pubDate>Mon, 09 Apr 2007 22:48:00 +0800</pubDate><guid>https://hessian.cn/p/656.html</guid><description> 全力提升 TIniFile 的读取速度&#10;软件保存设置一般是写入本地目录，或者写入注册表。前者使用的文件格式很多，多为 IniFile (现在 XML 也开始流行)。后者是将信息储存在注册表中，并通过的 TRegistry 或者标准的 WindowsAPI 来读写。后者有个很大的好处：不需要对多用户系统进行考虑，Windows 可以很好的控制多用户的切换。但缺点是往往卸载软件不将注册表中生成的记录信息删除干净。而制作绿色软件的作者多采用 IniFile 方式保存信息。&#10;</description></item><item><title>VC小技巧15则</title><link>https://hessian.cn/p/493.html</link><pubDate>Mon, 09 Apr 2007 21:13:00 +0800</pubDate><guid>https://hessian.cn/p/493.html</guid><description>一、 一次只运行一个程序实例&#10;下列两种方式都可以实现，建议采用第二种方式：&#10;1、 if( FindWindow(NULL,"程序标题"))          exit(0);&#10;2、BOOL CDemoTBarEApp::InstanceIsRun()&#10;{&#10;HANDLE m_hMutex;&#10;m_hMutex = ::CreateMutex(NULL, TRUE, _T("YourApplication"));&#10;ASSERT(m_hMutex);&#10;if (GetLastError() == ERROR_ALREADY_EXISTS)&#10;{&#10;m_hMutex = NULL;&#10;return TRUE;//实例已经运行&#10;}&#10;return FALSE;//实例未运行&#10;}&#10;</description></item><item><title>【转】浅谈Object Pascal的指针</title><link>https://hessian.cn/p/621.html</link><pubDate>Sat, 07 Apr 2007 16:23:00 +0800</pubDate><guid>https://hessian.cn/p/621.html</guid><description>大家都认为，C语言之所以强大，以及其自由性，很大部分体现在其灵活的指针运用上。因此，说 指针是C语言的灵魂，一点都不为过。同时，这种说法也让很多人 产生误解，似乎只有C语言的指针才能算指针。Basic不支持指针，在此不论。其实，Pascal语言本身也是支持指针的。从最初的Pascal发展至今 的Object Pascal，可以说在指针运用上，丝毫不会逊色于C语言的指针。</description></item><item><title>类的定义和使用</title><link>https://hessian.cn/p/447.html</link><pubDate>Sat, 07 Apr 2007 15:08:00 +0800</pubDate><guid>https://hessian.cn/p/447.html</guid><description>转自:http://mrmzy.bokee.com/tb.b?diaryId=15467469&#10;unit Unit1;&#10;interface&#10;uses&#10;Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,&#10;Dialogs, StdCtrls;&#10;type&#10;TForm1 = class(TForm)&#10;    Label1: TLabel;&#10;    Label2: TLabel;&#10;    Label3: TLabel;&#10;    Label4: TLabel;&#10;    Edit1: TEdit;&#10;    Edit2: TEdit;&#10;    Edit3: TEdit;&#10;    Edit4: TEdit;&#10;    Label5: TLabel;&#10;    Edit5: TEdit;&#10;    Button1: TButton;&#10;    Button2: TButton;&#10;    Button3: TButton;&#10;    Label6: TLabel;&#10;    Label7: TLabel;&#10;    procedure Button1Click(Sender: TObject);&#10;    procedure Button2Click(Sender: TObject);&#10;    procedure Button3Click(Sender: TObject);&#10;private&#10;    { Private declarations }&#10;public&#10;    { Public declarations }&#10;end;&#10;var&#10;Form1: TForm1;&#10;type&#10;    Tstudent=class&#10;    private&#10;      name:string;&#10;      yy:real;&#10;      math:real;&#10;      hx:real;&#10;      total:real;&#10;    public&#10;      procedure getname(nm:string);virtual;&#10;      procedure getyy(cj:real);virtual;&#10;      procedure getmt(cj:real);virtual;&#10;      procedure gethx(cj:real);virtual;&#10;      procedure caculat();virtual;&#10;      function returntotal():real;virtual;&#10;end;&#10;implementation&#10;function Tstudent.returntotal():real;&#10;begin&#10;returntotal:=total;&#10;end;&#10;procedure Tstudent.getname(nm:string);&#10;begin&#10;if name&lt;&gt;nm then&#10;    name:=nm;&#10;end;&#10;procedure Tstudent.getyy(cj:real);&#10;begin&#10;if yy&lt;&gt;cj then&#10;    yy:=cj;&#10;end;&#10;procedure Tstudent.getmt(cj:real);&#10;begin&#10;if math&lt;&gt;cj then&#10;    math:=cj;&#10;end;&#10;procedure Tstudent.gethx(cj:real);&#10;begin&#10;if hx&lt;&gt;cj then&#10;    hx:=cj;&#10;end;&#10;procedure Tstudent.caculat();&#10;begin&#10;total:=yy+math+hx;&#10;end;&#10;{$R *.dfm}&#10;procedure TForm1.Button1Click(Sender: TObject);&#10;var&#10;student:Tstudent;&#10;begin&#10;if (edit1.Text=”) or (edit2.Text=”) or (edit3.Text=”) or (edit4.Text=”) then&#10;     edit5.Text:=’请检查输入！’&#10;else&#10;     begin&#10;       student:=Tstudent.Create;&#10;       student.getname(edit1.Text);&#10;       student.getyy(strtofloat(edit2.Text));&#10;       student.getmt(strtofloat(edit3.Text));&#10;       student.gethx(strtofloat(edit4.Text));&#10;       student.caculat();&#10;       edit5.Text:=floattostr(student.returntotal());&#10;     end&#10;end;&#10;procedure TForm1.Button2Click(Sender: TObject);&#10;begin&#10;edit1.Text:=”;&#10;edit2.Text:=”;&#10;edit3.Text:=”;&#10;edit4.Text:=”;&#10;edit5.Text:=”;&#10;end;&#10;procedure TForm1.Button3Click(Sender: TObject);&#10;begin&#10;close;&#10;end;&#10;end.&#10;</description></item><item><title>BC++B 可视化组件库VCL中的对象、组件与控件</title><link>https://hessian.cn/p/531.html</link><pubDate>Sat, 07 Apr 2007 14:53:00 +0800</pubDate><guid>https://hessian.cn/p/531.html</guid><description>     图2 – 1为可视组件库的分层结构的简图，图中显示出了树状分层结构的五个主要的分支。&#10;2.4.1 TObject分支&#10;     下面几部分分别对包含于五个主要分支中的类做出简要地描述，为完整地说明VCL对象的分层结构，引用了包含于产品中的VCL对象分层结构图。&#10;     所有的VCL对象都派生于TObject，其方法定义了构造、析构、消息处理等基本特征。VCL对象的许多强大的功能都建立在TObject给出的这些方法的基础之上。通过提供下列方法，TObject封装了所有VCL对象最基本的通用特征：&#10;· 在对象被创建或销毁时响应的能力。&#10;· 对象的类型和实例信息，及有关对象发布的属性的运行时类型信息（RTTI）&#10;· 支持消息处理。&#10;     TObject是许多简单类的直接祖先。在这一分支中所包含的类有一个共同的重要的特性，它们都是暂时的。这是指，这些类都没有用来在对象被销毁之前保存状态的方法，它们不是固有的。&#10;     在这一分支中一个较主要的类为异常（Exception）类。它提供一组内嵌的异常类用于自动处理除数为零的错误、文件I/O错误、非法的类型匹配及许多其他的异常情况。&#10;     包含于TObject分支的还有一些封装数据结构的类，例如：&#10;· TBits，存储了一个布尔型“数组”的类。&#10;· TList，链接列表的类。&#10;· TStack ，包含一个“后进先出”的指针数组的类。&#10;· TQueue，包含一个“先进先出”的指针数组的类。&#10;     此外，你还可以发现一些封装了外部对象的类，如TPrinter，它封装了Windows打印机接口，TRegistry，它封装了底层系统注册及其函数。&#10;     TStream是这一分支里其他类型的典型例子。TStream是流对象的基类，可以与如磁盘文件、动态内存等等各种存储介质进行读写操作。&#10;     可以看到，这一分支中包含许多不同类，对于一个开发者来说，这些类都非常有用。&#10;</description></item><item><title>C++ string(字符串)详解</title><link>https://hessian.cn/p/483.html</link><pubDate>Sat, 07 Apr 2007 14:53:00 +0800</pubDate><guid>https://hessian.cn/p/483.html</guid><description>好了，进入正题………&#10;首先，为了在我们的程序中使用string类型，我们必须包含头文件 。如下：&#10;＃i nclude&lt;string&gt; //注意这里不是string.h string.h是C字符串头文件&#10;</description></item><item><title>VCL库函数</title><link>https://hessian.cn/p/318.html</link><pubDate>Sat, 07 Apr 2007 14:53:00 +0800</pubDate><guid>https://hessian.cn/p/318.html</guid><description> //—————————– Suntenghe 整理——————–&#10;1.内存分配&#10;2.文件操作&#10;3.磁盘目录管理&#10;4.字符串操作&#10;5.类型转换&#10;6.时间和日期管理&#10;</description></item><item><title>10年编程无师自通</title><link>https://hessian.cn/p/320.html</link><pubDate>Sat, 07 Apr 2007 14:51:00 +0800</pubDate><guid>https://hessian.cn/p/320.html</guid><description>原文：Teach Yourself Programming in Ten Years&#10;作者：Peter Norvig&#10;翻译：郭晓刚（foosleeper@163.net）&#10;最后修订日期：2004-3-19&#10;2005-01-12增加了新的译本链接。&#10;</description></item><item><title>优秀IT书籍100本</title><link>https://hessian.cn/p/640.html</link><pubDate>Sat, 07 Apr 2007 14:51:00 +0800</pubDate><guid>https://hessian.cn/p/640.html</guid><description>1.vc++技术内幕第四版 (潘爱民) ftp://210.32.157.56/课件/c++primer/vc++技术内幕IV(潘爱民).rar 2.C++经典对话系列 中文：http://www.jka77.com/book/cvst_cn.chm</description></item><item><title>C中const的使用</title><link>https://hessian.cn/p/576.html</link><pubDate>Sat, 07 Apr 2007 14:49:00 +0800</pubDate><guid>https://hessian.cn/p/576.html</guid><description> 基本解释&#10;const是一个C语言的关键字，它限定一个变量不允许被改变。使用const在一定程度上可以提高程序的健壮性，另外，在观看别人代码的时候，清晰理解const所起的作用，对理解对方的程序也有一些帮助。&#10;虽然这听起来很简单，但实际上，const的使用也是c语言中一个比较微妙的地方，微妙在何处呢？请看下面几个问题。&#10;问题：const变量 &amp; 常量&#10;为什么我象下面的例子一样用一个const变量来初始化数组，ANSI C的编译器会报告一个错误呢？&#10;const int n = 5;&#10;int a[n]; 答案与分析:&#10;1）、这个问题讨论的是“常量”与“只读变量”的区别。常量肯定是只读的，例如5， “abc”，等，肯定是只读的，因为程序中根本没有地方存放它的值，当然也就不能够去修改它。而“只读变量”则是在内存中开辟一个地方来存放它的值，只不过这个值由编译器限定不允许被修改。C语言关键字const就是用来限定一个变量不允许被改变的修饰符（Qualifier）。上述代码中变量n被修饰为只读变量，可惜再怎么修饰也不是常量。而ANSI C规定数组定义时维度必须是“常量”，“只读变量”也是不可以的。&#10;2)、注意：在ANSI C中，这种写法是错误的，因为数组的大小应该是个常量，而const int n,n只是一个变量（常量 != 不可变的变量，但在标准C++中，这样定义的是一个常量，这种写法是对的），实际上，根据编译过程及内存分配来看，这种用法本来就应该是合理的，只是ANSI C对数组的规定限制了它。&#10;3)、那么，在ANSI C 语言中用什么来定义常量呢？答案是enum类型和#define宏，这两个都可以用来定义常量。 问题：const变量 &amp; const 限定的内容&#10;下面的代码编译器会报一个错误，请问，哪一个语句是错误的呢？&#10;typedef char * pStr;&#10;char string[4] = "abc";&#10;const char *p1 = string;&#10;const pStr p2 = string;&#10;p1++;&#10;p2++; 答案与分析：&#10;问题出在p2++上。&#10;1)、const使用的基本形式： const char m; 限定m不可变。&#10;2)、替换1式中的m, const char *pm; 限定*pm不可变，当然pm是可变的，因此问题中p1++是对的。&#10;3)、替换1式char, const newType m; 限定m不可变，问题中的charptr就是一种新类型，因此问题中p2不可变，p2++是错误的。&#10;问题：const变量 &amp; 字符串常量&#10;请问下面的代码有什么问题？&#10;char *p = "i’m hungry!";&#10;p[0]= ‘I’; 答案与分析：&#10;上面的代码可能会造成内存的非法写操作。分析如下， “i’m hungry”实质上是字符串常量，而常量往往被编译器放在只读的内存区，不可写。p初始指向这个只读的内存区，而p[0] = ‘I’则企图去写这个地方，编译器当然不会答应。&#10;问题：const变量 &amp; 字符串常量2&#10;请问char a[3] = "abc" 合法吗？使用它有什么隐患？ 答案与分析：&#10;在标准C中这是合法的，但是它的生存环境非常狭小；它定义一个大小为3的数组，初始化为“abc”，，注意，它没有通常的字符串终止符”，因此这个数组只是看起来像C语言中的字符串，实质上却不是，因此所有对字符串进行处理的函数，比如strcpy、printf等，都不能够被使用在这个假字符串上。&#10;问题5：const &amp; 指针&#10;类型声明中const用来修饰一个常量，有如下两种写法，那么，请问，下面分别用const限定不可变的内容是什么?&#10;1)、const在前面&#10;const int nValue； //nValue是const&#10;const char *pContent; //*pContent是const, pContent可变&#10;const (char *) pContent;//pContent是const,*pContent可变&#10;char* const pContent; //pContent是const,*pContent可变&#10;const char* const pContent; //pContent和*pContent都是const 2)、const在后面，与上面的声明对等&#10;int const nValue； // nValue是const&#10;char const * pContent;// *pContent是const, pContent可变&#10;(char *) const pContent;//pContent是const,*pContent可变&#10;char* const pContent;// pContent是const,*pContent可变&#10;char const* const pContent;// pContent和*pContent都是const 答案与分析：&#10;const和指针一起使用是C语言中一个很常见的困惑之处，在实际开发中，特别是在看别人代码的时候，常常会因为这样而不好判断作者的意图，下面讲一下我的判断原则：&#10;沿着*号划一条线，如果const位于*的左侧，则const就是用来修饰指针所指向的变量，即指针指向为常量；如果const位于*的右侧，const就是修饰指针本身，即指针本身是常量。你可以根据这个规则来看上面声明的实际意义，相信定会一目了然。&#10;另外，需要注意：对于const (char *) ; 因为char *是一个整体，相当于一个类型(如 char)，因此，这是限定指针是const。 另＝＝＝＝＝＝＝&#10;const用于函数时出现三个位置:&#10;例如:&#10;const returnVal   function (const list_array)const;&#10;形式不过如此&#10;第一个const意思是:返回值是常量&#10;第二个const意思是:函数过程中不能修改list_array的值&#10;第三个const意思是:函数过程不能隐式的修改function参数的值&#10;＝＝＝&#10;const char*, char const*, char*const的区别问题几乎是C++面试中每次都会有的题目。 事实上这个概念谁都有只是三种声明方式非常相似很容易记混。 Bjarne在他的The C++ Programming Language里面给出过一个助记的方法： 把一个声明从右向左读。 char * const cp; ( * 读成 pointer to ) cp is a const pointer to char const char * p; p is a pointer to const char; char const * p; 同上因为C++里面没有const*的运算符，所以const只能属于前面的类型。 另:下面定义的一个指向字符串的常量指针： char * const prt1 = stringprt1; 其中，ptr1是一个常量指针。因此，下面赋值是非法的。 ptr1 = stringprt2; 而下面的赋值是合法的： *ptr1 = "m"; 因为指针ptr1所指向的变量是可以更新的，不可更新的是常量指针ptr1所指的方向(别的字符串)。&#10;下面定义了一个指向字符串常量的指针： const * ptr2 = stringprt1; 其中，ptr2是一个指向字符串常量的指针。ptr2所指向的字符串不能更新的，而ptr2是可以更新的。因此， *ptr2 = "x"; 是非法的，而： ptr2 = stringptr2; 是合法的。 所以，在使用const修饰指针时，应该注意const的位置。定义一个指向字符串的指针常量和定义一个指向字符串常量的指针时，const修饰符的位置不同，前者const放在*和指针名之间，后者const放在类型说明符前。&#10;</description></item><item><title>[转]TCP/IP 网络基础(v 0.2b)</title><link>https://hessian.cn/p/392.html</link><pubDate>Sat, 07 Apr 2007 14:46:00 +0800</pubDate><guid>https://hessian.cn/p/392.html</guid><description>作者：北南南北&#10;来自：LinuxSir.Org&#10;赞助： pandonny、etony、Linuxfish ……..&#10;简介：本文简要的讲了讲TCP/IP的一点基础，包括TCP/IP网络模型；网络分类及切割，以及服务和端口等基础知识；需要声明的是，我并不懂TCP/IP的原理，我只是写一点比较表面的东西。&#10;</description></item><item><title>关于meta标签的使用</title><link>https://hessian.cn/p/574.html</link><pubDate>Sat, 07 Apr 2007 14:45:00 +0800</pubDate><guid>https://hessian.cn/p/574.html</guid><description>meta是用来在HTML文档中模拟HTTP协议的响应头报文。meta 标签用于网页的&lt;head&gt;与&lt;/head&gt;中， meta 标签的用处很多。meta 的属性有两种：name和http-equiv。name属性主要用于描述网页，对应于content（网页内容），以便于搜索引擎机器人查找、分类（目前几乎所有的搜索引擎都使用网上机器人自动查找meta值来给网页分类）。这其中最重要的是 description（站点在搜索引擎上的描述）和keywords（分类关键词），所以应该给每页加一个meta值。比较常用的有以下几个：</description></item><item><title>解析C语言复杂声明</title><link>https://hessian.cn/p/399.html</link><pubDate>Sat, 07 Apr 2007 14:39:00 +0800</pubDate><guid>https://hessian.cn/p/399.html</guid><description>C语言所有复杂的指针声明，都是由各种声明嵌套构成的。如何解读复杂指针声明呢？右左法则是一个既著名又常用的方法。不过，右左法则其实并不是C标准里面的内容，它是从C标准的声明规定中归纳出来的方法。C标准的声明规则，是用来解决如何创建声明的，而右左法则是用来解决如何辩识一个声明的，两者可以说是相反的。右左法则的英文原文是这样说的：&#10;</description></item><item><title>关于(*(void(*)())0)()</title><link>https://hessian.cn/p/622.html</link><pubDate>Sat, 07 Apr 2007 14:38:00 +0800</pubDate><guid>https://hessian.cn/p/622.html</guid><description>    前段时间看了这本C Traps and Pitfalls，看到里面有这样的一个语句：&#10;   (*(void(*)())0)();&#10;    初看此语句，让我头皮发麻，不寒而栗呀，我看了好半天书，也只是一知半解，后来在下面两个论坛上分别发一个帖子问了一下：&#10;http://bbs.chinaunix.net/viewthread.php?tid=891271&amp;extra=page%3D2&#10;http://www.vckbase.com/bbs/viewtopic2.asp?rid=2869084&amp;sf=92&amp;forumID=1&amp;pg=4&#10;</description></item><item><title>细说字体 Sans Serif 与 Serif</title><link>https://hessian.cn/p/485.html</link><pubDate>Sat, 07 Apr 2007 14:38:00 +0800</pubDate><guid>https://hessian.cn/p/485.html</guid><description>拜读了 LGJ Font Notes 的 Serif VS. Sans Serif 注1 一文，顿时胸中豁然开朗，&#10;终于明白了什么是Sans Serif字体，什么是Serif字体，什么地方应该使用Sans Serif字体，&#10;什么地方又应该使用Serif字体。这些问题，不管是对Web Designer还是普通用户，&#10;了解它我觉得还是十分必要的，比如在很多浏览器中就涉及相应的设置。&#10;Quote:</description></item><item><title>C语言全局变量和局部变量</title><link>https://hessian.cn/p/448.html</link><pubDate>Sat, 07 Apr 2007 14:29:00 +0800</pubDate><guid>https://hessian.cn/p/448.html</guid><description>引子—&#10;         变量可以在程序中三个地方说明: 函数内部、函数的参数定义中或所有的函数外部。根据所定义位置的不同, 变量可分为局部变量、形式参数和全程变量。从空间角度来看，变量可以分为全局变量和局部变量，而从时间角度来分的 可以有静态存储变量和动态存储变量之分。&#10;</description></item><item><title>实现C语言高效编程的四大秘技</title><link>https://hessian.cn/p/499.html</link><pubDate>Sat, 07 Apr 2007 14:29:00 +0800</pubDate><guid>https://hessian.cn/p/499.html</guid><description>第1招：以空间换时间&#10;计算机程序中最大的矛盾是空间和时间的矛盾，那么，从这个角度出发逆向思维来考虑程序的效率问题，我们就有了解决问题的第1招——以空间换时间。&#10;</description></item><item><title>系统钩子和DLL</title><link>https://hessian.cn/p/584.html</link><pubDate>Sat, 07 Apr 2007 14:28:00 +0800</pubDate><guid>https://hessian.cn/p/584.html</guid><description>系统钩子和DLL&#10;钩子的本质是一段用以处理系统消息的程序，通过系统调用，将其挂入系统。钩子的种类有很多，每种钩子可以截获并处理相应的消息，每当特定的消息发出，在到 达目的窗口之前，钩子程序先行截获该消息、得到对此消息的控制权。此时在钩子函数中就可以对截获的消息进行加工处理，甚至可以强制结束消息的传递。&#10;在本程序中我们需要捕获在任意窗口上的键盘输入，这就需要采用全局钩子以便拦截整个系统的消息，而全局钩子函数必须以DLL（动态连接库）为 载体进行封装，VC6中有三种形式的MFC DLL可供选择，即Regular statically linked to MFC DLL（标准静态链接MFC DLL）、Regular using the shared MFC DLL（标准动态链接MFC DLL）以及Extension MFC DLL（扩展MFC DLL）。 在本程序中为方便起见采用了标准静态连接MFC DLL。&#10;三、键盘钩子程序示例&#10;本示例程序用到全局钩子函数，程序分两部分：可执行程序KeyHook和动态连接库LaunchDLL。&#10;1、首先编制MFC扩展动态连接库LaunchDLL.dll:&#10;（1）选择MFC AppWizard(DLL)创建项目LaunchDLL；在接下来的选项中选择Regular statically linked to MFC DLL（标准静态链接MFC DLL）。&#10;（2）在LaunchDLL.h中添加宏定义和待导出函数的声明：&#10;#define DllExport __declspec(dllexport)&#10;……&#10;DllExport void WINAPI InstallLaunchEv();&#10;……&#10;class CLaunchDLLApp : public CWinApp&#10;{&#10;public:&#10;CLaunchDLLApp();&#10;</description></item><item><title>用BCB在windows桌面创建快捷方式</title><link>https://hessian.cn/p/384.html</link><pubDate>Thu, 05 Apr 2007 23:34:00 +0800</pubDate><guid>https://hessian.cn/p/384.html</guid><description>API提供了一个叫做IShellLink的COM接口允许我们创建快捷方式。为在桌面创建快捷方式，我们创建一个IShellLink对象，设置它的属性，然后把这个link保存到desktop目录。 下面的例子代码演示了怎样创建一个快捷方式。在这个例子里，这个快捷方式保存在C:Drive目录下。 //———————————————————————- include &lt;shlobj.h&gt; void __fastcall TForm1::Button1Click(TObject *Sender) { if(OpenDialog1-&gt;Execute()) CreateShortCut(OpenDialog1-&gt;FileName); } //———————————————————————- void TForm1::CreateShortCut(const AnsiString &amp;file) { IShellLink* pLink; IPersistFile* pPersistFile; if(SUCCEEDED(CoInitialize(NULL))) { if(SUCCEEDED(CoCreateInstance(CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER, IID_IShellLink, (void **) &amp;pLink))) { pLink-&gt;SetPath(file.c_str()); pLink-&gt;SetDescription(“Woo hoo, look at Homer“s shortcut“); pLink-&gt;SetShowCmd(SW_SHOW); if(SUCCEEDED(pLink-&gt;QueryInterface(IID_IPersistFile, (void **)&amp;pPersistFile))) { WideString strShortCutLocation(“C:\bcbshortcut.lnk“); pPersistFile-&gt;Save(strShortCutLocation.c_bstr(), TRUE); pPersistFile-&gt;Release(); } pLink-&gt;Release(); } CoUninitialize(); } } //———————————————————————- 上面的例子只是把快捷方式文件保存到了c:drive目录下，但没保存到desktop目录下。 要让快捷方式出现在桌面上，只须把快捷方式文件保存到desktop目录下。首先我们要找到windows的desktop目录，请参阅判断 windows的Desktop及相关目录这一节。一旦我们知道了desktop所在的目录，我们就能将快捷方式文件保存到desktop目录下。然后 windows就能将快捷方式图标显示到桌面上。下面是经过改进了的例子： //———————————————————————- void TForm1::CreateShortCut(const AnsiString &amp;file) { IShellLink* pLink; IPersistFile* pPersistFile; LPMALLOC ShellMalloc; LPITEMIDLIST DesktopPidl; char DesktopDir[MAX_PATH]; if(FAILED(SHGetMalloc(&amp;ShellMalloc))) return; if(FAILED(SHGetSpecialFolderLocation(NULL, CSIDL_DESKTOPDIRECTORY, &amp;DesktopPidl))) return; if(!SHGetPathFromIDList(DesktopPidl, DesktopDir)) { ShellMalloc-&gt;Free(DesktopPidl); ShellMalloc-&gt;Release(); return; } ShellMalloc-&gt;Free(DesktopPidl); ShellMalloc-&gt;Release(); if(SUCCEEDED(CoInitialize(NULL))) { if(SUCCEEDED(CoCreateInstance(CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER, IID_IShellLink, (void **) &amp;pLink))) { pLink-&gt;SetPath(file.c_str()); pLink-&gt;SetDescription(“Woo hoo, look at Homer“s shortcut“); pLink-&gt;SetShowCmd(SW_SHOW); if(SUCCEEDED(pLink-&gt;QueryInterface(IID_IPersistFile, (void **)&amp;pPersistFile))) { WideString strShortCutLocation(DesktopDir); strShortCutLocation += “\bcbshortcut.lnk“; pPersistFile-&gt;Save(strShortCutLocation.c_bstr(), TRUE); pPersistFile-&gt;Release(); } pLink-&gt;Release(); } CoUninitialize(); } } //———————————————————————- 不要陷于COM的泥沼之中 创建快捷方式包括一些对COM的使用。不要让你陷入到COM的复杂之中。COM只是创建和使用对象的一种方法。在这个例子里我们可以考虑不使用COM而是用等价的C++技术。 COM code C++ psuedo-equivalent IShellLink* pLink; TShellLink *Link; IPersistFile* pPersistFile; TPersistFile *PersistFile; CoInitialize();</description></item><item><title>堆和栈的区别</title><link>https://hessian.cn/p/343.html</link><pubDate>Thu, 05 Apr 2007 21:28:00 +0800</pubDate><guid>https://hessian.cn/p/343.html</guid><description>作者: 芊珑发布日期: 2006-2-10 查看数: 125 出自: http://www.cnitexam.com 一、预备知识—程序的内存分配 一个由c/C++编译的程序占用的内存分为以下几个部分 1、栈区（stack）— 由编译器自动分配释放 ，存放函数的参数值，局部变量的值等。其操作方式类似于数据结构中的栈。 2、堆区（heap） — 一般由程序员分配释放， 若程序员不释放，程序结束时可能由OS回收 。注意它与数据结构中的堆是两回事，分配方式倒是类似于链表，呵呵。 3、全局区（静态区）（static）—，全局变量和静态变量的存储是放在一块的，初始化的全局变量和静态变量在一块区域， 未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。 – 程序结束后有系统释放 4、文字常量区 —常量字符串就是放在这里的。 程序结束后由系统释放 5、程序代码区—存放函数体的二进制代码。</description></item><item><title>联高软件：BCB编程经验几则</title><link>https://hessian.cn/p/312.html</link><pubDate>Thu, 05 Apr 2007 21:25:00 +0800</pubDate><guid>https://hessian.cn/p/312.html</guid><description>问：怎么实现TRichEdit的自动滚行？象某些阅读器那样的功能。 答：用ScrollWindowEx或者ScrollWindowEx就可以了。 ScrollWindow(RichEdit1- &gt;Handle, 0, -1, NULL, NULL); //向下滚1个像素 ScrollWindow(RichEdit1- &gt;Handle, 0, 1, NULL, NULL); //向上滚1个像素</description></item></channel></rss>