﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-HelloWorld 善战者,求之于势,不责于人;故能择人而任势。-随笔分类-其他</title><link>http://www.blogjava.net/zhaochengming/category/28878.html</link><description> 知止而后有定，定而后能静，静而后能安，安而后能虑，虑而后能得。物有本末，事有终始。知所先后，则近道矣。</description><language>zh-cn</language><lastBuildDate>Mon, 02 Jul 2012 21:13:01 GMT</lastBuildDate><pubDate>Mon, 02 Jul 2012 21:13:01 GMT</pubDate><ttl>60</ttl><item><title>待整理</title><link>http://www.blogjava.net/zhaochengming/archive/2012/07/02/381966.html</link><dc:creator>helloworld2008</dc:creator><author>helloworld2008</author><pubDate>Mon, 02 Jul 2012 02:11:00 GMT</pubDate><guid>http://www.blogjava.net/zhaochengming/archive/2012/07/02/381966.html</guid><wfw:comment>http://www.blogjava.net/zhaochengming/comments/381966.html</wfw:comment><comments>http://www.blogjava.net/zhaochengming/archive/2012/07/02/381966.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zhaochengming/comments/commentRss/381966.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhaochengming/services/trackbacks/381966.html</trackback:ping><description><![CDATA[（1）.cmd下不能用，应该是path的问题 <br /><br />我的电脑-&gt; 属性-&gt; 高级-&gt; 环境变量 <br />看看系统变量的path中这个是不是还在：%SystemRoot%\<strong style="background-color: #ff66ff; color: black">system32</strong>;%SystemRoot%;%SystemRoot%\<strong style="background-color: #ff66ff; color: black">System32</strong>\Wbem; <br />不在就加进去，记住，别删了原来的！ <br />双击一闪而过，正常，执行完了当然退出，它执行速度快嘛<br /><br /><img src ="http://www.blogjava.net/zhaochengming/aggbug/381966.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhaochengming/" target="_blank">helloworld2008</a> 2012-07-02 10:11 <a href="http://www.blogjava.net/zhaochengming/archive/2012/07/02/381966.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>事务日志已满和'PRIMARY' 文件组已满的解决方案 .    http://blog.csdn.net/jwdream2008/article/details/5703780</title><link>http://www.blogjava.net/zhaochengming/archive/2012/05/30/379562.html</link><dc:creator>helloworld2008</dc:creator><author>helloworld2008</author><pubDate>Wed, 30 May 2012 07:37:00 GMT</pubDate><guid>http://www.blogjava.net/zhaochengming/archive/2012/05/30/379562.html</guid><wfw:comment>http://www.blogjava.net/zhaochengming/comments/379562.html</wfw:comment><comments>http://www.blogjava.net/zhaochengming/archive/2012/05/30/379562.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zhaochengming/comments/commentRss/379562.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhaochengming/services/trackbacks/379562.html</trackback:ping><description><![CDATA[<h3><span class="link_title"><a href="http://blog.csdn.net/jwdream2008/article/details/5703780">事务日志已满和'PRIMARY' 文件组已满的解决方案 </a></span></h3>
<div class="article_manage"><span class="link_postdate">2010-06-30 10:23</span> <span class="link_view" title="阅读次数">1297人阅读</span> <span class="link_comments" title="评论次数"><a href="http://blog.csdn.net/jwdream2008/article/details/5703780#comments">评论</a>(0)</span> <span class="link_collect"><a title="收藏" href="javascript:void(0);">收藏</a></span> <span class="link_report"><a title="举报" href="http://blog.csdn.net/jwdream2008/article/details/5703780#report">举报</a></span> </div>
<div id="article_content" class="article_content">
<p>&nbsp;&nbsp; 昨天突然有客户反应系统无法正常的操作了！感到很震惊啊，系统一直运行正常啊，怎么会突然出问题。于是赶紧跟踪调查终于发现了问题的根源。</p>
<p>&nbsp;问题一：数据库 'XXXX' 的事务日志已满。若要查明无法重用日志中的空间的原因，请参阅 sys.databases 中的&nbsp;&nbsp; log_reuse_wait_desc 列</p>
<p>&nbsp; 问题二：无法为数据库 'XXX' 中的对象 ''PK_tbl_XXXX' 分配空间，因为 'PRIMARY' 文件组已满。请删除不需要的文件、删除文件组中的对象、将其他文件添加到文件组或为文件组中的现有文件启用自动增长，以便增加可用磁盘空间。"</p>
<p>&nbsp; 对于解决这两个问题的解决方案如下（在网上搜索了一把，问题解决了。现在整理了如下）：</p>
<p>&nbsp;<span style="color: #ff0000"><strong>问题一的解决方法：</strong></span></p>
<p><strong>方法1：&nbsp; </strong><span style="color: #000000"><strong>MSSQL2005日志的收缩</strong><br /></span><span style="color: #800000; font-weight: bold">１</span><span style="color: #000000">.右键在清除日志的数据库，如&#8220;TestDB&#8221;，点击</span><span style="color: #ff0000">[</span><span style="color: #ff0000">新建查询（Q）</span><span style="color: #ff0000">]</span><span style="color: #000000"><br /></span><span style="color: #800000; font-weight: bold">２</span><span style="color: #000000">.输入以下SQL语句，其中&#8220;TestDB&#8221;是数据库名称<br /></span><span style="color: #0000ff">&nbsp;&nbsp; DUMP</span><span style="color: #000000"> </span><span style="color: #0000ff">TRANSACTION</span><span style="color: #000000"> TestDB </span><span style="color: #0000ff">WITH</span><span style="color: #000000"> NO_LOG３.执行该SQL，成功后继续以下操作<br /></span><span style="color: #800000; font-weight: bold">４</span><span style="color: #000000">.右键该数据库节点，点击</span><span style="color: #ff0000">[</span><span style="color: #ff0000">任务（T）</span><span style="color: #ff0000">]</span><span style="color: #000000"> </span><span style="color: #808080">-&gt;</span><span style="color: #000000"> </span><span style="color: #ff0000">[</span><span style="color: #ff0000">收缩（S）</span><span style="color: #ff0000">]</span><span style="color: #000000"> </span><span style="color: #808080">-&gt;</span><span style="color: #000000"> </span><span style="color: #ff0000">[</span><span style="color: #ff0000">文件（F）</span><span style="color: #ff0000">]</span><span style="color: #000000"><br /></span><span style="color: #800000; font-weight: bold">５</span><span style="color: #000000">.在弹出的&#8220;收缩文件&#8221;对话框中，将&#8220;文件类型（T）&#8221;选为&#8220;日志&#8221;，将&#8220;收缩操作&#8221;选中&#8220;在释放未使用的空间前重新组织页（O）&#8221;<br /></span><span style="color: #800000; font-weight: bold">６</span><span style="color: #000000">.在&#8220;将文件收缩到（K）&#8221;文本框中输入后面提示的最小大小的数值，点击</span><span style="color: #ff0000">[</span><span style="color: #ff0000">确定</span><span style="color: #ff0000">]</span><span style="color: #000000">即可。</span></p>
<p>&nbsp;</p>
<p><span style="color: #000000"><strong><span style="color: #333333">方法2：下面的所有库名都指你要处理的数据库的库名</span></strong><span style="color: #000000"><br /></span><span style="color: #800000; font-weight: bold">1</span><span style="color: #000000">.清空日志<br /></span><span style="color: #0000ff">DUMP</span><span style="color: #000000"> </span><span style="color: #0000ff">TRANSACTION</span><span style="color: #000000"> 库名 </span><span style="color: #0000ff">WITH</span><span style="color: #000000"> NO_LOG<br /></span><span style="color: #800000; font-weight: bold">2</span><span style="color: #000000">.截断事务日志：<br /></span><span style="color: #0000ff">BACKUP</span><span style="color: #000000"> </span><span style="color: #ff00ff">LOG</span><span style="color: #000000"> 库名 </span><span style="color: #0000ff">WITH</span><span style="color: #000000"> NO_LOG<br /></span><span style="color: #800000; font-weight: bold">3</span><span style="color: #000000">.收缩数据库文件(如果不压缩,数据库的文件不会减小<br />企业管理器</span><span style="color: #008080">--</span><span style="color: #008080">右键你要压缩的数据库--所有任务--收缩数据库--收缩文件</span><span style="color: #008080"><br />--</span><span style="color: #008080">选择日志文件--在收缩方式里选择收缩至XXM,这里会给出一个允许收缩到的最小M数,直接输入这个数,确定就可以了</span><span style="color: #008080"><br />--</span><span style="color: #008080">选择数据文件--在收缩方式里选择收缩至XXM,这里会给出一个允许收缩到的最小M数,直接输入这个数,确定就可以了</span><span style="color: #008080"><br /></span><span style="color: #000000"><br />也可以用SQL语句来完成 <br /></span><span style="color: #008080">--</span><span style="color: #008080">收缩数据库</span><span style="color: #008080"><br /></span><span style="color: #0000ff">DBCC</span><span style="color: #000000"> SHRINKDATABASE(库名)<br /></span><span style="color: #008080">--</span><span style="color: #008080">收缩指定数据文件,1是文件号,可以通过这个语句查询到:select * from sysfiles</span><span style="color: #008080"><br /></span><span style="color: #0000ff">DBCC</span><span style="color: #000000"> SHRINKFILE(</span><span style="color: #800000; font-weight: bold">1</span><span style="color: #000000">)<br /></span><span style="color: #800000; font-weight: bold">4</span><span style="color: #000000">.为了最大化的缩小日志文件(如果是sql </span><span style="color: #800000; font-weight: bold">7.0</span><span style="color: #000000">,这步只能在查询分析器中进行)<br />a.分离数据库:<br />企业管理器</span><span style="color: #008080">--</span><span style="color: #008080">服务器--数据库--右键--分离数据库</span><span style="color: #000000"><br />b.在我的电脑中删除LOG文件</span></span></p>
<p><span style="color: #000000"><span style="color: #000000">c.附加数据库:<br />企业管理器</span><span style="color: #008080">--</span><span style="color: #008080">服务器--数据库--右键--附加数据库</span><span style="color: #000000"><br />此法将生成新的LOG，大小只有500多K<br />或用代码： <br />下面的示例分离 pubs，然后将 pubs 中的一个文件附加到当前服务器。<br />a.分离<br /></span><span style="color: #0000ff">EXEC</span><span style="color: #000000"> sp_detach_db </span><span style="color: #008000">@dbname</span><span style="color: #000000"> </span><span style="color: #808080">=</span><span style="color: #000000"> </span><span style="color: #ff0000">'</span><span style="color: #ff0000">库名</span><span style="color: #ff0000">'</span><span style="color: #000000"><br />b.删除日志文件<br />c.再附加<br /></span><span style="color: #0000ff">EXEC</span><span style="color: #000000"> sp_attach_single_file_db </span><span style="color: #008000">@dbname</span><span style="color: #000000"> </span><span style="color: #808080">=</span><span style="color: #000000"> </span><span style="color: #ff0000">'</span><span style="color: #ff0000">库名</span><span style="color: #ff0000">'</span><span style="color: #000000">, <br /></span><span style="color: #008000">@physname</span><span style="color: #000000"> </span><span style="color: #808080">=</span><span style="color: #000000"> </span><span style="color: #ff0000">'</span><span style="color: #ff0000">c:/Program Files/Microsoft SQL Server/MSSQL/Data/库名.mdf</span><span style="color: #ff0000">'</span><span style="color: #000000"><br /></span><span style="color: #800000; font-weight: bold">5</span><span style="color: #000000">.为了以后能自动收缩,做如下设置:<br />企业管理器</span><span style="color: #008080">--</span><span style="color: #008080">服务器--右键数据库--属性--选项--选择"自动收缩"</span><span style="color: #000000"><br /></span><span style="color: #008080">--</span><span style="color: #008080">SQL语句设置方式:</span><span style="color: #008080"><br /></span><span style="color: #0000ff">EXEC</span><span style="color: #000000"> sp_dboption </span><span style="color: #ff0000">'</span><span style="color: #ff0000">库名</span><span style="color: #ff0000">'</span><span style="color: #000000">, </span><span style="color: #ff0000">'</span><span style="color: #ff0000">autoshrink</span><span style="color: #ff0000">'</span><span style="color: #000000">, </span><span style="color: #ff0000">'</span><span style="color: #ff0000">TRUE</span><span style="color: #ff0000">'</span><span style="color: #000000"><br /></span><span style="color: #800000; font-weight: bold">6</span><span style="color: #000000">.如果想以后不让它日志增长得太大<br />企业管理器</span><span style="color: #008080">--</span><span style="color: #008080">服务器--右键数据库--属性--事务日志</span><span style="color: #008080"><br />--</span><span style="color: #008080">将文件增长限制为xM(x是你允许的最大数据文件大小)</span><span style="color: #000000"><br /></span><span style="color: #008080">--</span><span style="color: #008080">SQL语句的设置方式:</span><span style="color: #008080"><br /></span><span style="color: #0000ff">alter</span><span style="color: #000000"> </span><span style="color: #0000ff">database</span><span style="color: #000000"> 库名 modify </span><span style="color: #0000ff">file</span><span style="color: #000000">(name</span><span style="color: #808080">=</span><span style="color: #000000">逻辑文件名,maxsize</span><span style="color: #808080">=</span><span style="color: #800000; font-weight: bold">20</span><span style="color: #000000">)</span></span></p>
<p><span style="color: #000000"><span style="color: #000000"><span style="color: #ff0000">特别注意</span>：<span style="color: #008080">--</span><span style="color: #008080">最好备份日志，以后可通过日志恢复数据。。。</span><span style="color: #008080"><br /></span><span style="color: #000000">以下为日志处理方法<br />一般不建议做第4,6两步<br />第4步不安全,有可能损坏数据库或丢失数据<br />第6步如果日志达到上限,则以后的数据库处理会失败,在清理日志后才能恢复.<br /></span></span></span></p>
<p><span style="color: #000000"><span style="color: #ff0000"><strong>问题二的解决方案：</strong></span></span></p>
<p><span style="color: #000000"><span style="color: #000000">解决方法：<br />1.检查你的磁盘剩余空间是否足够,如果没有磁盘剩余空间,则清理磁盘,腾出空间</span></span></p>
<p><span style="color: #000000"><span style="color: #000000">2.检查你的磁盘分区格式<br />如果是FAT16,则数据文件最大只能是2G<br />如果是FAT32,则数据文件最大只能是4G<br />改为NTFS分区则没有这种限制</span></span></p>
<p><span style="color: #000000"><span style="color: #000000">3.检查一下你有没有限制数据库文件的大小<br />企业管理器--右键你的数据库--属性--文件增长限制--如果有限制大小,取消限制</span></span></p>
<p><span style="color: #000000"><span style="color: #000000">4.检查你的SQL版本,如果你用MSDE,则限制了数据文件最大是2G</span></span></p>
<p><span style="color: #000000"><span style="color: #000000">5.你也可以为 primary 组添加新的数据文件来解决这个问题<br />alter database 库名 add file(NAME = 逻辑文件名,FILENAME = 'c:/实际文件名.ndf'</span></span></p>
<p><span style="color: #000000"><span style="color: #000000">&nbsp;或者 选中数据库-&gt;属性-&gt;文件：添加一个新文件</span></span><span style="color: #000000"><br /></span></p></div><img src ="http://www.blogjava.net/zhaochengming/aggbug/379562.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhaochengming/" target="_blank">helloworld2008</a> 2012-05-30 15:37 <a href="http://www.blogjava.net/zhaochengming/archive/2012/05/30/379562.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>QQ空间技术架构之深刻揭密  http://www.infoq.com/cn/articles/qzone-architecture?utm_source=bshare&amp;utm_campaign=bshare&amp;utm_medium=qzone&amp;bsh_bid=97043184</title><link>http://www.blogjava.net/zhaochengming/archive/2012/05/30/379502.html</link><dc:creator>helloworld2008</dc:creator><author>helloworld2008</author><pubDate>Tue, 29 May 2012 16:32:00 GMT</pubDate><guid>http://www.blogjava.net/zhaochengming/archive/2012/05/30/379502.html</guid><wfw:comment>http://www.blogjava.net/zhaochengming/comments/379502.html</wfw:comment><comments>http://www.blogjava.net/zhaochengming/archive/2012/05/30/379502.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zhaochengming/comments/commentRss/379502.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhaochengming/services/trackbacks/379502.html</trackback:ping><description><![CDATA[<p>4.26日晚间，腾讯大讲堂&#183;深圳首站《QQ空间技术架构之峥嵘岁月》活动在腾讯总部腾讯大厦多功能厅举办，腾讯Web前端研发领域专家、腾讯最早的专职Web开发团队核心成员、Qzone核心架构研发总监徐晓在两小时的演讲中揭开了QQ空间技术架构背后的秘密。</p>
<p>正式分享之前，徐晓介绍了QQ空间目前的海量服务数据规模（图1）：</p>
<ol><li>拥有5.5亿的活跃用户</li><li>过万台的设备</li><li>数千万级别的同时在线</li><li>数十亿级别的全站PV</li><li>P级的UGC存储量</li><li>每天千亿级别的服务请求</li></ol>
<p><img alt="" src="http://www.infoq.com/resource/articles/qzone-architecture/zh/resources/image2.png" width="550" _href="img://image2.png" _p="true" /></p>
<p><strong>图1&#8212;&#8212;QQ空间海量服务数据规模</strong></p>
<p>接下来，徐晓把QQ空间成长和发展的历程分成三个阶段：石器时代、冷兵器时代和现代战争时代，分享了QQ空间从开始甚至难以生存，到逐步发展成国内最大的SNS社区产品背后的酸甜苦辣。</p>
<h2>石器时代&#8211;从十万在线到百万在线</h2>
<p>石器时代是QQ空间1.0到3.0稳健上线的过程。</p>
<p>徐晓说：&#8220;QQ空间在石器时代遇到的最大难题就是如何生存？如何让这个襁褓中的产品活下来？如何积累第一批宝贵的用户资源？&#8221;， 2005年QQ空间首发，最初是采用传统的发放邀请码的方式征集第一批用户。第一款QQ空间是嵌在独立的客户端软件中，看似是个客户端，其实是一个浏览器内核，里面都是HTML页面，以网站的方式存在。 当初的架构非常简单，采用了Apache搭建Web Server，Mysql保存最终数据。用户通过{uin}.qzone.qq.com(uin就是用户的QQ号码)这样的方式访问自己的空间。最开始上线时，仅邀请了电信用户。但上线之后才发现很多北方网通用户也非常希望来体验。但如果让北方网通用户跨网来访问电信的服务，那将是一个非常糟糕的体验。因为当时的跨网之间的带宽是非常有限的。</p>
<p>为了满足网通用户的需求，QQ空间团队在网通搭建了一套与电信一模一样的服务，电信的用户数据只存在电信的服务器上，网通用户数据只存在网通服务器上。看似异地分布，其实两部分数据是互相独立、不能冗余的。在用户注册开通空间时，就确定了他的数据存在于哪个服务器上。</p>
<p>用户访问空间的逻辑抽象来说是这样的（如图2）：用户通过浏览器发起请求访问我们的第一个CGI，这个CGI再串行的获取用户数据，比如：装扮数据，日志数据等。等获取到全部数据之后，这个CGI再将所有的数据拼装成一个完整的HTML页面输出给用户。</p>
<p><img alt="" src="http://www.infoq.com/resource/articles/qzone-architecture/zh/resources/image3.png" width="550" _href="img://image3.png" _p="true" /></p>
<p><strong>图2&#8212;&#8212;Qzone2.0典型载入逻辑</strong></p>
<p>但同时，空间第一版的独立客户端也带来了各种问题和烦恼：</p>
<p><strong>第一：非常不利于定位问题。</strong></p>
<p>一旦页面元素填写失败，定位问题将是一件麻烦的事情。因为它不是Web页面，所以只能用其他抓包软件，比如Ethereal（Wireshark的前身）来抓取网络包做分析。但那个时候网络抓包工具的能力还比较弱，没有高亮和HTML语法检测等功能，所以整体环境比较受限。</p>
<p><strong>第二：服务接入层压力大。</strong></p>
<p>由于不仅要接受用户的请求，还要向后访问不同的数据。当后端某一个接口超时严重的情况下，很多用户的请求都会被挂起。这样就会消耗更多的连接资源，对Web服务器CPU的消耗很大。</p>
<p><strong>第三：服务集群没有发挥出应有的服务能力</strong></p>
<p>当时共用30-40台服务器，也只能支持50万左右的用户。无奈之下，团队想了一个没办法的办法：有意限制超过五十万用户，提出了一个排队等待机制，学习海底捞模式，当在线人数达到50w的时候，QQ空间会给用户展示一个Flash小游戏，让用户在等待的时候玩小游戏。</p>
<p>针对当时存在的种种问题，团队做了以下改进来解决：</p>
<p><strong>第一：采用Web RIA。</strong></p>
<p>当时大量使用了Ajax技术来减轻服务器的负载。其中一个极端的例子是：整个空间首页都是采用JS绘制，这样能够将用户访问的CGI足够轻量化。尽量简化了CGI逻辑，让CGI程序运行更加强壮、效率更高。同时，当服务异常时，还可以通过JS脚本绘制一个错误信息给予用户提示。而且，采用JS开发效率更高，调试更方便。 Web RIA化后，降低了服务器CPU消耗的40%，节约了DC的输出带宽约30%（部分JS脚本都可以被浏览器Cache住）。</p>
<p><strong>第二：采用动静分离策略。</strong></p>
<p>静态资源都放在自研的Web服务器qhttpd上，它具备当时ApacheSelect模型的两个数量级以上的接入能力。</p>
<p><strong>第三：采用自研的Web Server：Qzhttp，主要用于动态分离的动态服务的需要。</strong></p>
<p>由于Qzhttp是腾讯自研的、轻量的、更适合业务自己逻辑的Web Server，从而保证了它的高性能，它的接入能力比Apache (非FastCGI模式)提高了3倍。</p>
<p><strong>石器时代做的最大的优化：</strong></p>
<p>当用户申请QQ空间多个服务时，每个服务都有独立的存储和处理逻辑。只有当所有的服务处理完成，才会由QQ空间框架服务器返回给用户。这样对于同时依赖日志、相册、音乐、留言的服务就会产生两大问题：</p>
<ol><li>短板效应一损俱损；</li><li>具体业务容量无法差异化。</li></ol>
<p>针对这两个问题，做了首页载入性能优化及首页内容静态化系统两方面的优化：</p>
<p>研究用户访问模型。拉取展现与UGC内容的变更比例是7：1。用户之间互访频繁，看他人与看自己的比例是5：1.。通过以上数据，可以看出用户的UGC更新很少，但是用户之间互相访问很频繁。根据用户的这种访问模型，空间团队研发了一套静态化系统（图3）。这套系统会将用户首页的内容全部Cache，然后根据用户的访问，以及用户自己UGC内容的更改，采用一定策略更新静态化系统的Cache数据。 通过增加首页内容静态化系统，首页展现速度从5s提升到3s，用户也不用再玩小游戏进行等待。同时在设备没有扩容的前提下，同时在线用户访问数突破100w。</p>
<p><img alt="" src="http://www.infoq.com/resource/articles/qzone-architecture/zh/resources/image4.png" width="550" _href="img://image4.png" _p="true" /></p>
<p><strong>图3&#8212;首页内容静态化系统</strong></p>
<p>通过不断的改进和优化，QQ空间3.0于2006年中稳健上线。</p>
<h2>冷兵器时代&#8212;&#8212;功能的磨砺</h2>
<p>冷兵器时代是在线人数从百万阵营向千万阵营过渡的过程。这个阶段做的更多的是功能的磨砺，提高可用性的过程。</p>
<p>但与此同时，QQ空间团队又面临了新的问题：</p>
<ol><li>网通，教育网用户体验很差；</li><li>版本迭代快速，导致外网bug不断；版本发布之后，所有开发必须留守2个小时；</li><li>后端服务质量不稳定，导致服务经常宕机。</li></ol>
<p>之前有谈到，空间的用户数据是分布在电信与网通两套体系中的。但由于公司在网通的服务设备有限，随着用户量的不断增加，很快就达到了网通设备服务的上限。网通不能扩容设备，但用户量还在不断增加。面对这种情况，只好将网通和电信的数据合并为一套。当网通用户访问服务的时候，会通过一个代理将用户的请求转发到内网电信服务上。采用这种方式，提供了一套通用的解决方案，可以解决海外，网通，教育网，铁通等运营商的问题。</p>
<p>但这种跨网访问的静态资源下载量非常大，静态资源请求次数 : CGI请求数接近10：1，所以采用CDN提供静态资源下载，来提高用户访问速度。具体逻辑是：根据用户客户端IP判断用户属于哪一个ISP服务商，通过URL方式将用户的静态资源访问定向到该ISP的服务设备上。</p>
<p>这样，跳出CDN系统的拘束、优化思路，解决了大部分教育网用户问题，同时多级支持的思路成为公共方案。 但同时还是有很多的故障：</p>
<ol><li>低ARPU、低成本、低价机器、大集群</li><li>版本迭代快每周发布版本</li><li>用户对故障和低效的容忍度非常低 通过调研，我们发现用户对Web的容忍度是很低的（如图4）：</li></ol>
<p><img alt="" src="http://www.infoq.com/resource/articles/qzone-architecture/zh/resources/image5.png" width="550" _href="img://image5.png" _p="true" /></p>
<p><strong>图4&#8212;&#8212;用户容忍度曲线</strong></p>
<p>一般页面在1s内打开，用户会感觉体验非常流畅。所以我们通过以下策略来保证服务质量：</p>
<ol><li>区分关键路径,对关键路径的服务质量我们要求4个9以上，非关键路径的服务失败之后做有损体验；</li><li>采用动态超时时间控制算法，保证整个程序在可控的时间内做出响应；</li><li>多级容错机制，从后端服务到CGI，到前台JS脚本都对错误做了容错处理；</li><li>采用柔性可用策略,失败接口采用默认数据。</li></ol>
<p>为了保证版本的服务质量，空间采用了灰度发布策略。新特性可能按照用户尾号发布,每次新特性只对一小部分人可见。一段时间内的用户反馈后，不断修复和改进问题，再逐步扩大用户群对新特性的可见性，最后新特性才对全量用户可见。同时，也通过控制JS版本号来达到了灰度发布的目的。</p>
<p>通过这些优化，QQ空间成功踏入千万级在线的阵营，QQ空间5.0正式上线。其中主要变化：后端服务进行了重构，前端页面也进行了优化。</p>
<h2>现代战争时代&#8211;数千万在线向亿级在线</h2>
<p>经过反复的改进和优化，QQ空间服务质量大幅提高，但是，新的问题还是随之而来：</p>
<p>不满足于发日志、传照片的用户，想要玩游戏、使用某些web工具。同时，公司其它团队要在QQ空间上开发应用，但QQ空间的应用配置都写死在QQ空间平台逻辑里面。为配合其他团队上线，发版本需要一周，工作不可并行，非常耗时，受到了很大挑战。针对这种情况，我们采取了两大措施：平台和应用架构分离（如图5）、简单配置后上线（如图6）。</p>
<p><img alt="" src="http://www.infoq.com/resource/articles/qzone-architecture/zh/resources/image6.png" width="550" _href="img://image6.png" _p="true" /></p>
<p><strong>图5&#8212;&#8212;平台和应用架构分离</strong></p>
<p><img alt="" src="http://www.infoq.com/resource/articles/qzone-architecture/zh/resources/image7.png" width="550" _href="img://image7.png" _p="true" /></p>
<p><strong>图6&#8212;&#8212;简单配置后上线</strong></p>
<p><strong>如果某天深圳的IDC不可用了怎么办？</strong></p>
<p>为了解决这个问题，空间团队做了全国IDC的异地部署，采用&#8220;一点写，多点读&#8221;模式的架构模型，将服务部署到深圳、上海、天津和西安。深圳是一个写入点，通过QQ空间自己的一套同步系统同步到全国各个IDC（如图7）。同时QQ空间提供了全方位的立体监控，7*24小时对服务做监控。</p>
<p><img alt="" src="http://www.infoq.com/resource/articles/qzone-architecture/zh/resources/image8.png" width="550" _href="img://image8.png" _p="true" /></p>
<p><strong>图7&#8212;&#8212;IDC分布</strong></p>
<p><strong>如何快速发现和解决用户的问题？</strong></p>
<p>定位用户问题需要花很大的时间成本，这就要求团队做很多的监控工作：服务器流量监控、接口调用监控、前端测速监控、前端调用错误监控。</p>
<p>同时，在千万级到亿级在线的过程中，团队要有全国甚至全球的分布和匹配分布的运营能力；出问题可以快速切割，全方位的立体化监控能力；各个逻辑层持续优化能力。只有持续优化，用户才能感知到性能的增加，用户才会增加。</p>
<p>经过无数次的推敲和不断优化，QQ空间的服务能力已经能够支持千万级别的用户在线请求，并且能够给用户提供7*24小时的不间断服务。向亿级在线阵营冲刺也将指日可待！</p>
<h2>总结</h2>
<p><strong>百万在线：</strong></p>
<p>当时如何撑住服务，让用户进来，从而积累QQ空间第一批用户，根据用户模型进行优化，让QQ空间架构有更好的接入能力，做到高性能。</p>
<p><strong>千万在线：</strong></p>
<p>通过各层的柔性服务和灰度发布的策略，让服务更加稳定，让用户数量级再上一个新台阶。</p>
<p><strong>亿级在线：</strong></p>
<p>服务要有更灵活、更敏捷的变更手段。同时有更好的监控和可运营的能力。</p>
<p><img alt="" src="http://www.infoq.com/resource/articles/qzone-architecture/zh/resources/image9.png" width="550" _href="img://image9.png" _p="true" /></p>
<p>接下来是半个小时的Q&amp;A环节，同学们踊跃提问，徐晓做出了详细专业的解答。最后，徐晓和大家分享了&#8220;腾讯《海量服务之道》系列的优质课程和秉承的原则&#8221;：</p>
<p><img alt="" src="http://www.infoq.com/resource/articles/qzone-architecture/zh/resources/image10.png" width="550" _href="img://image10.png" _p="true" /></p>
<p>Qzone是全球第二大SNS社区，仅次于Facebook。徐晓说：&#8220;海量服务的价值观和用户对我们的厚爱造就了现在的QQ空间。我们会持续的发展，攻克各种难题，不断前进。&#8221;</p>
<p>4月26日21:00，两个小时的QQ空间技术架构分享圆满结束！</p>
<p>欢迎大家继续期待腾讯大讲堂对外讲座&#183;第八期《云网络能带给我们什么》 。更多精彩，尽在腾讯大讲堂：<a href="http://djt.qq.com/">DJT.QQ.COM</a>。</p>
<hr />

<p>给InfoQ中文站投稿或者参与内容翻译工作，请邮件至<a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#101;&#100;&#105;&#116;&#111;&#114;&#115;&#64;&#99;&#110;&#46;&#105;&#110;&#102;&#111;&#113;&#46;&#99;&#111;&#109;">editors@cn.infoq.com</a>。也欢迎大家通过新浪微博（<a href="http://www.weibo.com/infoqchina">@InfoQ</a>）或者腾讯微博（<a href="http://t.qq.com/infoqchina">@InfoQ</a>）关注我们，并与我们的编辑和其他读者朋友交流。</p><img src ="http://www.blogjava.net/zhaochengming/aggbug/379502.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhaochengming/" target="_blank">helloworld2008</a> 2012-05-30 00:32 <a href="http://www.blogjava.net/zhaochengming/archive/2012/05/30/379502.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>NSIS安装制作基础教程（转）  http://esoft.bokee.com/5393076.html</title><link>http://www.blogjava.net/zhaochengming/archive/2008/03/04/183686.html</link><dc:creator>helloworld2008</dc:creator><author>helloworld2008</author><pubDate>Tue, 04 Mar 2008 05:59:00 GMT</pubDate><guid>http://www.blogjava.net/zhaochengming/archive/2008/03/04/183686.html</guid><wfw:comment>http://www.blogjava.net/zhaochengming/comments/183686.html</wfw:comment><comments>http://www.blogjava.net/zhaochengming/archive/2008/03/04/183686.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zhaochengming/comments/commentRss/183686.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhaochengming/services/trackbacks/183686.html</trackback:ping><description><![CDATA[<h2 class="diaryTitle">NSIS安装制作基础教程</h2>
<strong>关键词</strong>： <a href="http://tag.bokee.com/tag/NSIS" target="_blank">NSIS</a> &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
<p>
<p class="Content-body" align="left" twffan="done"><strong>NSIS简介：</strong><br />
　　NSIS 是&#8220;Nullsoft 脚本安装系统&#8221;（Nullsoft Scriptable Installation System）的缩写，它是一个免费的 Win32 安装、卸载系统。它的特点：脚本简洁高效；系统开销小；当然进行安装、卸载、设置系统设置、解压文件等等更不在话下，几乎可以做所有的事情。更多的功能请阅读蓝色网际的《NSIS帮助文档》。<br />
　　对于制作NSIS的使用教程，蓝色网际是NSIS方面的专家，她的《NSIS帮助文档》就是一本NSIS的圣经，而对初学者来说，最头疼的莫过于一大堆看不懂的代码，对他们来说无异于一本天书。缘于此，特草此基础教程，希望NSIS专家们勿见笑，不当之处欢迎批评指正以期完善，也希望给初学者作个铺垫。<br />
<br />
<strong>工具：</strong>NIS Edit＋Nullsoft Installation System（NSIS）<br />
<br />
<strong>思路：</strong>脚本向导＋修改代码＝个性化安装包<br />
<br />
<strong>步骤：</strong><br />
<br />
　　<strong>一、利用向导制作安装包</strong><br />
<br />
　　01、安装上述两款，启动NIS Edit，在&#8220;文件&#8221;菜单中&#8220;新建脚本：向导&#8221;&#8594;下一步&#8221;，如图1。</p>
<p class="Content-body" align="center" twffan="done"><img alt=" " src="http://esoft.bokee.com/inc/NSIS001.gif" onload="function anonymous()&#13;&#10;{&#13;&#10; img_auto_size(this,450,true);&#13;&#10;}" align="baseline" twffan="done" /></p>
<p class="Content-body" align="left" twffan="done">　　02、设置应用程序信息，如软件名称、版本、出版人等，如图2。当然最一个网站可以留空，如果设置了，则安装包会生成一个对应网址的&#8220;Internet 快捷方式&#8221;。 <br />
</p>
<div class="Content-body" align="center" twffan="done"><a title="在新窗口打开图片" href="http://www.netboy365.com/attachments/month_0511/ID-01041-002.gif" target="_blank"></a></div>
<p class="Content-body" align="center" twffan="done"><img alt=" " src="http://esoft.bokee.com/inc/NSIS002.gif" onload="function anonymous()&#13;&#10;{&#13;&#10; img_auto_size(this,450,true);&#13;&#10;}" align="baseline" twffan="done" /></p>
<div class="Content-body" align="left" twffan="done"><br />
　　03、设置程序选项，如安装包图标、安装程序文件、安装包语言[这里选&#8220;SimChinese&#8221;]、用户图形界面及压缩方式等，我们可以选用默认值，也可以点击对应项目的按钮或下拉菜单更改设置，如图3。<br />
</div>
<div class="Content-body" align="center" twffan="done"><a title="在新窗口打开图片" href="http://www.netboy365.com/attachments/month_0511/ID-01041-003.gif" target="_blank"></a></div>
<p class="Content-body" align="center" twffan="done"><img alt=" " src="http://esoft.bokee.com/inc/NSIS003.gif" onload="function anonymous()&#13;&#10;{&#13;&#10; img_auto_size(this,450,true);&#13;&#10;}" align="baseline" twffan="done" /></p>
<div class="Content-body" align="left" twffan="done">　　04、设置安装目录及授权信息，如图4后&#8220;下一步&#8221;。 <br />
</div>
<p class="Content-body" align="center" twffan="done"><img alt=" " src="http://esoft.bokee.com/inc/NSIS004.gif" onload="function anonymous()&#13;&#10;{&#13;&#10; img_auto_size(this,450,true);&#13;&#10;}" align="baseline" twffan="done" /></p>
<div class="Content-body" twffan="done">　　05、选定程序文件，即我们要打包的文件，可以使用默认的&#8220;Mainsection&#8221;，也可以根据需要进行更改或新建组别，如果组比较多时，你也可以设置是否&#8220;允许用户选择要安装的组件&#8221;，如图5。 <br />
</div>
<p class="Content-body" align="center" twffan="done"><img alt=" " src="http://esoft.bokee.com/inc/NSIS005.gif" onload="function anonymous()&#13;&#10;{&#13;&#10; img_auto_size(this,450,true);&#13;&#10;}" align="baseline" twffan="done" /></p>
<a title="在新窗口打开图片" href="http://www.netboy365.com/attachments/month_0511/ID-01041-005.gif" target="_blank"></a>
<div class="Content-body" twffan="done">　　完毕后进行&#8220;添加文件&#8221;操作，选定我们要打包的文件，如图6，完成自动后返回的图5的界面，执行下一步操作。<br />
</div>
<p class="Content-body" align="center" twffan="done"><img alt=" " src="http://esoft.bokee.com/inc/NSIS006.gif" onload="function anonymous()&#13;&#10;{&#13;&#10; img_auto_size(this,450,true);&#13;&#10;}" align="baseline" twffan="done" /></p>
<div class="Content-body" twffan="done">　　06、设置开始菜单中文件夹名称及快捷方式，这里我们使用默认值，如图7，按&#8220;下一步&#8221;。 <br />
</div>
<p class="Content-body" align="center" twffan="done"><img alt=" " src="http://esoft.bokee.com/inc/NSIS007.gif" onload="function anonymous()&#13;&#10;{&#13;&#10; img_auto_size(this,450,true);&#13;&#10;}" align="baseline" twffan="done" /></p>
<div class="Content-body" twffan="done"><br />
　　07、指定安装后要运行的程序，同上用默认值并设置相关运行参数及描述，如果你和我一样懒的话，或不想在安装运行任何程序，则留空即可，如图8。 <br />
</div>
<div class="Content-body" align="center" twffan="done"><a title="在新窗口打开图片" href="http://www.netboy365.com/attachments/month_0511/ID-01041-008.gif" target="_blank"></a></div>
<p class="Content-body" align="center" twffan="done"><img alt=" " src="http://esoft.bokee.com/inc/NSIS008.gif" onload="function anonymous()&#13;&#10;{&#13;&#10; img_auto_size(this,450,true);&#13;&#10;}" align="baseline" twffan="done" /></p>
<div class="Content-body" twffan="done"><br />
　　08、这步是有关卸载程序的相关信息，如卸载时的提示、卸载的图标等，如图9。<br />
</div>
<div class="Content-body" align="center" twffan="done"><a title="在新窗口打开图片" href="http://www.netboy365.com/attachments/month_0511/ID-01041-009.gif" target="_blank"></a></div>
<p class="Content-body" align="center" twffan="done"><img alt=" " src="http://esoft.bokee.com/inc/NSIS009.gif" onload="function anonymous()&#13;&#10;{&#13;&#10; img_auto_size(this,450,true);&#13;&#10;}" align="baseline" twffan="done" /></p>
<div class="Content-body" twffan="done"><br />
　　09、至此完成向导，如图10，钩选&#8220;保存脚本&#8221;、&#8220;转换文件路径到相关路径&#8221;及&#8220;编译脚本&#8221;。 <br />
</div>
<div class="Content-body" align="center" twffan="done"><a title="在新窗口打开图片" href="http://www.netboy365.com/attachments/month_0511/ID-01041-010.gif" target="_blank"></a></div>
<p class="Content-body" align="center" twffan="done"><img alt=" " src="http://esoft.bokee.com/inc/NSIS010.gif" onload="function anonymous()&#13;&#10;{&#13;&#10; img_auto_size(this,450,true);&#13;&#10;}" align="baseline" twffan="done" /></p>
<div class="Content-body" twffan="done"><br />
　　提示保存脚本路径并自动编译脚本，我们可以按或F9运行安装程序进行预览，向导产生的安装包效果图如图11所示。<br />
</div>
<div class="Content-body" align="center" twffan="done"><a title="在新窗口打开图片" href="http://www.netboy365.com/attachments/month_0511/ID-01041-011.gif" target="_blank"></a></div>
<p class="Content-body" align="center" twffan="done"><img alt=" " src="http://esoft.bokee.com/inc/NSIS011.gif" onload="function anonymous()&#13;&#10;{&#13;&#10; img_auto_size(this,450,true);&#13;&#10;}" align="baseline" twffan="done" /></p>
<div class="Content-body" twffan="done"><br />
<br />
　　<strong>二、修改代码以个性化安装包</strong><br />
<br />
　　10、选择可修改之处。软件LOGO[如图11A]、安装包标题[图11B]、图11C、图12、图13。<br />
<br />
　　图11见上楼　图12如下<br />
</div>
<p class="Content-body" align="center" twffan="done"><img alt=" " src="http://esoft.bokee.com/inc/NSIS012.gif" onload="function anonymous()&#13;&#10;{&#13;&#10; img_auto_size(this,450,true);&#13;&#10;}" align="baseline" twffan="done" /></p>
<div class="Content-body" twffan="done"><br />
　　图13如下 <br />
</div>
<div class="Content-body" align="center" twffan="done"><a title="在新窗口打开图片" href="http://www.netboy365.com/attachments/month_0511/ID-01041-013.gif" target="_blank"></a></div>
<p class="Content-body" align="center" twffan="done"><img alt=" " src="http://esoft.bokee.com/inc/NSIS013.gif" onload="function anonymous()&#13;&#10;{&#13;&#10; img_auto_size(this,450,true);&#13;&#10;}" align="baseline" twffan="done" /></p>
<div class="Content-body" twffan="done"><br />
　　11、修改代码<br />
<br />
　　①、修改软件LOGO：在源代码&#8220; MUI Settings&#8221;后面添加下列代码：<br />
</div>
<div class="UBBPanel" twffan="done">
<div class="UBBTitle" twffan="done">&nbsp;<img alt=" " src="http://esoft.bokee.com/inc/code.gif" onload="function anonymous()&#13;&#10;{&#13;&#10; img_auto_size(this,450,true);&#13;&#10;}" align="baseline" twffan="done" />程序代码</div>
<div class="UBBContent" twffan="done">!define MUI_WELCOMEFINISHPAGE_BITMAP "G:\temp\ pwr.bmp" </div>
</div>
<div class="Content-body" twffan="done"><br />
<br />
　　注释：引号内为位图的路径，位图大小大约为165*298<br />
<br />
　　效果图如图14所示 <br />
</div>
<div class="Content-body" align="center" twffan="done"><a title="在新窗口打开图片" href="http://www.netboy365.com/attachments/month_0511/ID-01041-014.gif" target="_blank"></a></div>
<p class="Content-body" align="center" twffan="done"><img alt=" " src="http://esoft.bokee.com/inc/NSIS014.gif" onload="function anonymous()&#13;&#10;{&#13;&#10; img_auto_size(this,450,true);&#13;&#10;}" align="baseline" twffan="done" /></p>
<div class="Content-body" twffan="done"><br />
　　②、修改安装包标题，在同上位置添加下列代码：<br />
</div>
<div class="UBBPanel" twffan="done">
<div class="UBBTitle" twffan="done">&nbsp;<img alt=" " src="http://esoft.bokee.com/inc/code.gif" onload="function anonymous()&#13;&#10;{&#13;&#10; img_auto_size(this,450,true);&#13;&#10;}" align="baseline" twffan="done" />程序代码</div>
<div class="UBBContent" twffan="done">!define MUI_WELCOMEPAGE_TITLE "\r\n PDF2all 5.35d 汉化版" </div>
</div>
<div class="Content-body" twffan="done"><br />
<br />
　　注释：\r\n为换行标志<br />
<br />
　　效果图上楼如图14所示。<br />
<br />
　　③、修改图11C中的说明，同上位置添加下列代码：<br />
</div>
<div class="UBBPanel" twffan="done">
<div class="UBBTitle" twffan="done">&nbsp;<img alt=" " src="http://esoft.bokee.com/inc/code.gif" onload="function anonymous()&#13;&#10;{&#13;&#10; img_auto_size(this,450,true);&#13;&#10;}" align="baseline" twffan="done" />程序代码</div>
<div class="UBBContent" twffan="done">!define MUI_WELCOMEPAGE_TEXT "　　pdf2all是一个转换器的集合，它能转换包括doc2pdf （Word to PDF），xls2pdf （Excel Sheet到PDF），ppt2pdf（PowerPoint到PDF），mdb2pdf （Access到PDF），ps2pdf（PostScript到PDF），pdf2jpg（PDF到JPEG），pdf2bmp（PDF到BMP），pdf2tiff（PDF到TIFF），pdf2eps（PDF到EPS），pdfMerge（合并PDF文件），pdf2ppt（PDF到PowerPoint）。\r\n\r\n　　软件汉化：高芳銮 (Raindy)\r\n\r\n　　$_CLICK" </div>
</div>
<div class="Content-body" twffan="done"><br />
<br />
　　效果图如图14所示。<br />
<br />
　　④、对图12中的修改，在源代码：<br />
</div>
<div class="UBBPanel" twffan="done">
<div class="UBBTitle" twffan="done">&nbsp;<img alt=" " src="http://esoft.bokee.com/inc/code.gif" onload="function anonymous()&#13;&#10;{&#13;&#10; img_auto_size(this,450,true);&#13;&#10;}" align="baseline" twffan="done" />程序代码</div>
<div class="UBBContent" twffan="done">ShowInstDetails show <br />
ShowUnInstDetails show</div>
</div>
<div class="Content-body" twffan="done"><br />
<br />
　　后添加：<br />
</div>
<div class="UBBPanel" twffan="done">
<div class="UBBTitle" twffan="done">&nbsp;<img alt=" " src="http://esoft.bokee.com/inc/code.gif" onload="function anonymous()&#13;&#10;{&#13;&#10; img_auto_size(this,450,true);&#13;&#10;}" align="baseline" twffan="done" />程序代码</div>
<div class="UBBContent" twffan="done">BrandingText "　软件汉化：高芳銮 (Raindy)" </div>
</div>
<div class="Content-body" twffan="done"><br />
<br />
　　效果图如图15所示。 <br />
</div>
<div class="Content-body" align="center" twffan="done"><a title="在新窗口打开图片" href="http://www.netboy365.com/attachments/month_0511/ID-01041-015.gif" target="_blank"></a></div>
<p class="Content-body" align="center" twffan="done"><img alt=" " src="http://esoft.bokee.com/inc/NSIS015.gif" onload="function anonymous()&#13;&#10;{&#13;&#10; img_auto_size(this,450,true);&#13;&#10;}" align="baseline" twffan="done" /></p>
<div class="Content-body" twffan="done"><br />
　　⑤、在完成添加&#8220;汉化说明&#8221;，只要在源代码：<br />
</div>
<div class="UBBPanel" twffan="done">
<div class="UBBTitle" twffan="done">&nbsp;<img alt=" " src="http://esoft.bokee.com/inc/code.gif" onload="function anonymous()&#13;&#10;{&#13;&#10; img_auto_size(this,450,true);&#13;&#10;}" align="baseline" twffan="done" />程序代码</div>
<div class="UBBContent" twffan="done">; Finish page </div>
</div>
<div class="Content-body" twffan="done"><br />
<br />
　　后添加：<br />
</div>
<div class="UBBPanel" twffan="done">
<div class="UBBTitle" twffan="done">&nbsp;<img alt=" " src="http://esoft.bokee.com/inc/code.gif" onload="function anonymous()&#13;&#10;{&#13;&#10; img_auto_size(this,450,true);&#13;&#10;}" align="baseline" twffan="done" />程序代码</div>
<div class="UBBContent" twffan="done">!define MUI_FINISHPAGE_SHOWREADME "$INSTDIR\汉化说明.txt" <br />
!define MUI_FINISHPAGE_SHOWREADME_TEXT "汉化说明" </div>
</div>
<div class="Content-body" twffan="done"><br />
<br />
　　效果所示 <br />
</div>
<div class="Content-body" align="center" twffan="done"><a title="在新窗口打开图片" href="http://www.netboy365.com/attachments/month_0511/ID-01041-016.gif" target="_blank"></a></div>
<p class="Content-body" align="center" twffan="done"><img alt=" " src="http://esoft.bokee.com/inc/NSIS016.gif" onload="function anonymous()&#13;&#10;{&#13;&#10; img_auto_size(this,450,true);&#13;&#10;}" align="baseline" twffan="done" /></p>
<div class="Content-body" twffan="done"><br />
　　⑥、闪屏界面，可以在源代码中加入下列代码即可：<br />
<br />
　　A、普通效果<br />
</div>
<div class="UBBPanel" twffan="done">
<div class="UBBTitle" twffan="done">&nbsp;<img alt=" " src="http://esoft.bokee.com/inc/code.gif" onload="function anonymous()&#13;&#10;{&#13;&#10; img_auto_size(this,450,true);&#13;&#10;}" align="baseline" twffan="done" />程序代码</div>
<div class="UBBContent" twffan="done">Function .onInit <br />
SetOutPath $TEMP <br />
File /oname=spltmp.bmp "G:\Temp\Nsisres\splash.bmp" <br />
<br />
splash::show 2300 $TEMP\spltmp <br />
<br />
Pop $0 <br />
<br />
FunctionEnd</div>
</div>
<div class="Content-body" twffan="done"><br />
<br />
　　B、渐隐闪屏<br />
</div>
<div class="UBBPanel" twffan="done">
<div class="UBBTitle" twffan="done">&nbsp;<img alt=" " src="http://esoft.bokee.com/inc/code.gif" onload="function anonymous()&#13;&#10;{&#13;&#10; img_auto_size(this,450,true);&#13;&#10;}" align="baseline" twffan="done" />程序代码</div>
<div class="UBBContent" twffan="done">Function .OnInit <br />
InitPluginsDir <br />
File /oname=$PLUGINSDIR\splash.bmp "G:\Temp\Nsisres\splash.bmp" <br />
advsplash::show 1500 800 600 -1 $PLUGINSDIR\splash <br />
Functionend</div>
</div>
<div class="Content-body" twffan="done"><br />
<br />
　　⑦、背景音乐[贯穿安装过程]<br />
</div>
<div class="UBBPanel" twffan="done">
<div class="UBBTitle" twffan="done">&nbsp;<img alt=" " src="http://esoft.bokee.com/inc/code.gif" onload="function anonymous()&#13;&#10;{&#13;&#10; img_auto_size(this,450,true);&#13;&#10;}" align="baseline" twffan="done" />程序代码</div>
<div class="UBBContent" twffan="done">Var hmci <br />
Function .OnInit <br />
InitPluginsDir <br />
SetOutPath $PLUGINSDIR <br />
File "G:\Temp\Nsisres\music.mp3"　　[说明：源MP3的存放路径] <br />
System::Call msvfw32.dll::MCIWndCreate(i 0, i 0,i 0x0070, t "$PLUGINSDIR\music.mp3") i .r0 <br />
SendMessage $0 0x0465 0 "STR:play repeat" <br />
System::Call user32.dll::ShowWindow(i r0, i 0) <br />
StrCpy $hmci $0 <br />
Functionend <br />
<br />
Section <br />
;add your codes <br />
SendMessage $hmci 0x0010 0 0 <br />
Sectionend</div>
</div>
<div class="Content-body" twffan="done"><br />
<br />
<br />
　　<strong>后语：</strong><br />
<br />
　　以上仅是NSIS制作安装包最基本的操作，供初学者入门之用，故云&#8220;初级篇&#8221;。希望不会怡笑大方，更希望蓝MM、陈敏毅老大等NSIS高手的中高级教程。<br />
<br />
<br />
<br />
<br />
　　<strong>精品代码</strong>　(^-^)<br />
<br />
　　<strong>1、闪屏效果（渐现渐隐）</strong><br />
</div>
<div class="UBBPanel" twffan="done">
<div class="UBBTitle" twffan="done">&nbsp;<img alt=" " src="http://esoft.bokee.com/inc/code.gif" onload="function anonymous()&#13;&#10;{&#13;&#10; img_auto_size(this,450,true);&#13;&#10;}" align="baseline" twffan="done" />程序代码</div>
<div class="UBBContent" twffan="done">Function .OnInit <br />
InitPluginsDir <br />
File /oname=$PLUGINSDIR\splash.bmp c:\test.bmp <br />
advsplash::show 1500 800 600 -1 $PLUGINSDIR\splash <br />
Functionend </div>
</div>
<div class="Content-body" twffan="done"><br />
<br />
<br />
　　<strong>2、背景音乐1（贯穿安装全过程）</strong><br />
</div>
<div class="UBBPanel" twffan="done">
<div class="UBBTitle" twffan="done">&nbsp;<img alt=" " src="http://esoft.bokee.com/inc/code.gif" onload="function anonymous()&#13;&#10;{&#13;&#10; img_auto_size(this,450,true);&#13;&#10;}" align="baseline" twffan="done" />程序代码</div>
<div class="UBBContent" twffan="done">Function .OnInit <br />
InitPluginsDir <br />
SetOutPath $PLUGINSDIR <br />
File "c:\a.mp3" <br />
System::Call msvfw32.dll::MCIWndCreate(i 0, i 0,i 0x0070, t "$PLUGINSDIR\a.mp3") i .r0 <br />
SendMessage $0 0x0465 0 "STR:play repeat" <br />
System::Call user32.dll::ShowWindow(i r0, i 0) <br />
StrCpy $hmci $0 <br />
Functionend <br />
<br />
Section <br />
;add your codes <br />
SendMessage $hmci 0x0010 0 0 <br />
Sectionend</div>
</div>
<div class="Content-body" twffan="done"><br />
<br />
<br />
　　<strong>3、背景音乐2</strong><br />
</div>
<div class="UBBPanel" twffan="done">
<div class="UBBTitle" twffan="done">&nbsp;<img alt=" " src="http://esoft.bokee.com/inc/code.gif" onload="function anonymous()&#13;&#10;{&#13;&#10; img_auto_size(this,450,true);&#13;&#10;}" align="baseline" twffan="done" />程序代码</div>
<div class="UBBContent" twffan="done">Section/Function <br />
SetOutPath $PLUGINSDIR <br />
File $WINDIR\MEDIA\chimes.wav <br />
BgImage::Sound /NOUNLOAD /WAIT "$PLUGINSDIR\chimes.wav" <br />
BgImage::Clear /NOUNLOAD <br />
Sectionend/Functionend</div>
</div>
<div class="Content-body" twffan="done"><br />
<br />
<br />
　　<strong>4、闪屏效果[渐隐]＋背景音乐[全程]</strong><br />
</div>
<div class="UBBPanel" twffan="done">
<div class="UBBTitle" twffan="done">&nbsp;<img alt=" " src="http://esoft.bokee.com/inc/code.gif" onload="function anonymous()&#13;&#10;{&#13;&#10; img_auto_size(this,450,true);&#13;&#10;}" align="baseline" twffan="done" />程序代码</div>
<div class="UBBContent" twffan="done">outfile test.exe <br />
Var hmci <br />
<br />
Function .OnInit <br />
InitPluginsDir <br />
SetOutPath $PLUGINSDIR <br />
File "c:\a.mp3" <br />
System::Call msvfw32.dll::MCIWndCreate(i 0, i 0,i 0x0070, t "$PLUGINSDIR\a.mp3") i .r0 <br />
SendMessage $0 0x0465 0 "STR:play repeat" <br />
System::Call user32.dll::ShowWindow(i r0, i 0) <br />
StrCpy $hmci $0 <br />
<br />
File /oname=$PLUGINSDIR\splash.bmp c:\test.bmp <br />
advsplash::show 1500 800 600 -1 $PLUGINSDIR\splash <br />
<br />
Functionend <br />
<br />
Section <br />
;add your codes <br />
sleep 5000 <br />
SendMessage $hmci 0x0010 0 0 <br />
Sectionend </div>
</div>
<div class="Content-body" twffan="done"><br />
<br />
<br />
　　<strong>5、如何把安装页面中的&#8220;Setup将安装&#8230;&#8230;&#8221;中的Setup改成别的字</strong><br />
<br />
　　只需在<br />
</div>
<div class="UBBPanel" twffan="done">
<div class="UBBTitle" twffan="done">&nbsp;<img alt=" " src="http://esoft.bokee.com/inc/code.gif" onload="function anonymous()&#13;&#10;{&#13;&#10; img_auto_size(this,450,true);&#13;&#10;}" align="baseline" twffan="done" />程序代码</div>
<div class="UBBContent" twffan="done">!insertmacro MUI_PAGE_DIRECTORY</div>
</div>
<div class="Content-body" twffan="done"><br />
<br />
　　前面添加一行<br />
</div>
<div class="UBBPanel" twffan="done">
<div class="UBBTitle" twffan="done">&nbsp;<img alt=" " src="http://esoft.bokee.com/inc/code.gif" onload="function anonymous()&#13;&#10;{&#13;&#10; img_auto_size(this,450,true);&#13;&#10;}" align="baseline" twffan="done" />程序代码</div>
<div class="UBBContent" twffan="done">!define MUI_DIRECTORYPAGE_TEXT_TOP "你需要的文字" </div>
</div>
<div class="Content-body" twffan="done"><br />
<br />
<br />
　　<strong>6、设置了自定义安装、卸载图标</strong><br />
</div>
<div class="UBBPanel" twffan="done">
<div class="UBBTitle" twffan="done">&nbsp;<img alt=" " src="http://esoft.bokee.com/inc/code.gif" onload="function anonymous()&#13;&#10;{&#13;&#10; img_auto_size(this,450,true);&#13;&#10;}" align="baseline" twffan="done" />程序代码</div>
<div class="UBBContent" twffan="done">!define MUI_ICON "G:\Temp\Nsisres\Win 安装.ico"<br />
!define MUI_UNICON "G:\Temp\Nsisres\Win 卸载.ico"</div>
</div>
<img src ="http://www.blogjava.net/zhaochengming/aggbug/183686.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhaochengming/" target="_blank">helloworld2008</a> 2008-03-04 13:59 <a href="http://www.blogjava.net/zhaochengming/archive/2008/03/04/183686.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>