﻿<?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>C++博客-xiaoguozi's Blog-随笔分类-开源</title><link>http://www.cppblog.com/guojingjia2006/category/11667.html</link><description>Pay it forword - 我并不觉的自豪，我所尝试的事情都失败了······习惯原本生活的人不容易改变，就算现状很糟，他们也很难改变，在过程中，他们还是放弃了······他们一放弃，大家就都是输家······让爱传出去，很困难，也无法预料，人们需要更细心的观察别人，要随时注意才能保护别人，因为他们未必知道自己要什么·····</description><language>zh-cn</language><lastBuildDate>Tue, 19 Mar 2013 14:22:16 GMT</lastBuildDate><pubDate>Tue, 19 Mar 2013 14:22:16 GMT</pubDate><ttl>60</ttl><item><title>九种引人瞩目的开源大数据技术</title><link>http://www.cppblog.com/guojingjia2006/archive/2013/03/19/198572.html</link><dc:creator>小果子</dc:creator><author>小果子</author><pubDate>Tue, 19 Mar 2013 01:59:00 GMT</pubDate><guid>http://www.cppblog.com/guojingjia2006/archive/2013/03/19/198572.html</guid><wfw:comment>http://www.cppblog.com/guojingjia2006/comments/198572.html</wfw:comment><comments>http://www.cppblog.com/guojingjia2006/archive/2013/03/19/198572.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/guojingjia2006/comments/commentRss/198572.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/guojingjia2006/services/trackbacks/198572.html</trackback:ping><description><![CDATA[<div><p><span style="font-family: 微软雅黑">越来越多的公司开始聚焦于大数据技术领域，而开源恰恰是大数据技术的灵魂。以下将为您介绍九大引人注目的开源大数据技术，请拭目以待：</span></p> <p><span style="font-family: 微软雅黑"><strong>1.Apache Hadoop</strong></span></p> <p><img style="cursor: pointer" alt="" src="http://cms.csdnimg.cn/articlev1/uploads/allimg/120615/120_120615112136_1.gif" height="136" width="535" border="0" />&nbsp;</p> <p><span style="font-family: 微软雅黑"><a href="http://hadoop.apache.org/">Apache hadoop</a>是 一个开源的分布式计算框架，最初由Doug为支持其开源Web搜索引擎Nutch所创立。通过集成MapReduce技术，Hadoop将大数据分布到多 个数据节点上进行处理。Hadoop遵循Apache  2.0许可证，可以轻松处理结构化、半结构化和非结构化数据，一举成为现在非常流行的大数据解决方案，</span></p> <p><strong><span style="font-family: 微软雅黑">2.R语言</span></strong>&nbsp;</p> <p><span style="font-family: 微软雅黑"><a href="http://www.r-project.org/">R语言</a>是一种开源编程语言，专门为数据统计和数据可视化而设计。R语言最初由Ross Ihaka和Robert Gentleman在奥克兰大学设计出来，之后迅速成为大数据领域的重要工具。R语言遵循GPL许可证。</span></p> <p><strong><span style="font-family: 微软雅黑">3.Cascading</span></strong></p> <p><img style="width: 537px; height: 140px; cursor: pointer" alt="" src="http://cms.csdnimg.cn/articlev1/uploads/allimg/120615/120_120615112912_1.png" height="277" width="688" border="0" /></p> <p><span style="font-family: 微软雅黑"><a href="http://www.cascading.org/">Cascading</a>是 一个针对Java开发人员的应用框架，可以快速、轻松地基于Apache  Hadoop开发数据分析和数据管理应用。Cascading是Hadoop的抽象层，可以屏蔽MapReduce的复杂性，支持任何基于JVM的编程语 言在Hadoop集群上执行数据处理任务。Cascading最初由Chris  Wensel开发，用于作为MapReduce的替代API。Cascading遵循GNU许可证，一般用于广告定位、日志分析、Web数据挖掘和ETL 应用。</span></p> <p><strong><span style="font-family: 微软雅黑">4.Scribe</span></strong></p> <p><span style="font-family: 微软雅黑"><a href="https://github.com/facebook/scribe">Scribe</a>于2008年发布，是一个由Facebook开发的日志聚合服务器软件，用于实时从大量服务器汇集日志数据。Scribe遵循Apache 2许可证，扩展性极佳，每天可应对数百亿日志记录的挑战。</span></p> <p><strong><span style="font-family: 微软雅黑">5.ElasticSearch</span></strong></p> <p><img style="width: 527px; height: 134px; cursor: pointer" alt="" src="http://cms.csdnimg.cn/articlev1/uploads/allimg/120615/120_120615113226_1.PNG" height="178" width="599" border="0" /></p> <p><span style="font-family: 微软雅黑"><a href="http://www.elasticsearch.org/">ElasticSearch</a>是一款由Shay Banon开发，遵循Apache许可证的开源搜索服务器。ElasticSearch基于分布式计算，对于实时搜索可以提供很好的可扩展性解决方案。许多公司已经对ElasticSearch表示认可，比如StumbleUpon和Mozilla。</span></p> <p><strong><span style="font-family: 微软雅黑">6.Apache HBase</span></strong></p> <p><span style="font-family: 微软雅黑"><a href="http://hbase.apache.org/">Apache HBase</a>是一个使用Java语言编写的、以谷歌BigTable技术为基础的开源非关系型列式分布数据库，可运行在HDFS文件系统之上。HBase提供了很好的存储容错能力和快速访问大量稀疏文件的能力。HBase遵循Apache 2许可证。</span></p> <p><strong><span style="font-family: 微软雅黑">7.Apache Cassandra</span></strong></p> <p><img style="cursor: pointer" alt="" src="http://cms.csdnimg.cn/articlev1/uploads/allimg/120615/120_120615113508_1.png" height="100" width="500" border="0" /></p> <p><span style="font-family: 微软雅黑"><a href="http://cassandra.apache.org/">Cassandra</a>是由Facebook开发的另一个开源NoSQL数据库，遵循Apache 2许可证。由于对HBa</span><span style="font-family: 微软雅黑">se的喜爱，Facebook开始逐渐放弃使用Cassandra，但许多公司，如Netflix依然使用Cassandra数据库为其后端流媒体服务提供动力。</span></p> <p><strong><span style="font-family: 微软雅黑">8.MongoDB</span></strong></p> <p><img style="cursor: pointer" alt="" src="http://cms.csdnimg.cn/articlev1/uploads/allimg/120615/120_120615112252_1.png" height="166" width="500" border="0" /></p> <p><span style="font-family: 微软雅黑"><a href="http://www.mongodb.org/">MongoDB</a>是 一个基于分布式文件存储的数据库，由C++语言编写。旨在为Web应用提供可扩展的高性能数据存储解决方案。MongoDB是非常流行的JSON文档式 NoSQL数据库，许多公司都非常认同MongoDB。MTV  Networks、craigslist和迪斯尼互动传媒集团，纽约时报以及Etsy都是MongoDB的客户。MongoDB遵循GNU  Affero通用许可证，语言驱动遵循Apache许可证，10gen公司提供商业化的MongoDB许可证。</span></p> <p><strong><span style="font-family: 微软雅黑">9.Apache CouchDB</span></strong></p> <p><span style="font-family: 微软雅黑"><a href="http://couchdb.apache.org/">CouchDB</a>也 是一个流行的开源NoSQL数据库，它以文档方式（JSON）存储数据。CouchDB使用JavaScript语言作为查询语言，集成 MapReduce技术。IBM Lotus Notes的开发人员Damien  Katz在2005年构建了CouchDB，用于大规模对象的数据存储系统。CouchDB遵循Apache  2许可证，英国广播公司（BBC）使用CouchDB存储动态内容，瑞士瑞信银行（Credit Suisse）的商品部也采用了它。</span></p></div><img src ="http://www.cppblog.com/guojingjia2006/aggbug/198572.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/guojingjia2006/" target="_blank">小果子</a> 2013-03-19 09:59 <a href="http://www.cppblog.com/guojingjia2006/archive/2013/03/19/198572.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Yii RBAC(转)</title><link>http://www.cppblog.com/guojingjia2006/archive/2013/01/15/197298.html</link><dc:creator>小果子</dc:creator><author>小果子</author><pubDate>Tue, 15 Jan 2013 11:38:00 GMT</pubDate><guid>http://www.cppblog.com/guojingjia2006/archive/2013/01/15/197298.html</guid><wfw:comment>http://www.cppblog.com/guojingjia2006/comments/197298.html</wfw:comment><comments>http://www.cppblog.com/guojingjia2006/archive/2013/01/15/197298.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/guojingjia2006/comments/commentRss/197298.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/guojingjia2006/services/trackbacks/197298.html</trackback:ping><description><![CDATA[<div><h2>写在前面</h2> <ul><li>以下内容适合Yii 1.0.x，其他版本可能有略微的差别。 </li><li>根据您的评论和反馈，本文会不断进行修改和补充，以方便新学习者。 </li></ul> <h2><a name="t1"></a>开始准备</h2> <p>Yii提供了强大的配置机制和很多现成的类库。在Yii中使用RBAC是很简单的，完全不需要再写RBAC代码。所以准备工作就是，打开编辑器，跟我来。</p> <h2><a name="t2"></a>设置参数、建立数据库</h2> <p>在配置数组中，增加以下内容：</p> <div style="line-height: 12px; font-family: courier new; font-size: 12px;"> <table style="width: 100%; border-width: 0px; padding: 0px;" border="0" cellspacing="0"> <tbody> <tr> <td><span style="color: #4682b4;">&#8216;</span><span style="color: #4682b4;">components</span><span style="color: #4682b4;">&#8216;</span> <span style="color: #ff0000;">=</span><span style="color: #ff0000;">&gt;</span> <strong><span style="color: #00008b;">array</span></strong><span style="color: #000000;">(</span></td> </tr> <tr> <td><span style="color: #008000;">//</span><span style="color: #008000;">&#8230;&#8230;</span></td> </tr> <tr> <td><span style="color: #4682b4;">&#8216;</span><span style="color: #4682b4;">authManager</span><span style="color: #4682b4;">&#8216;</span><span style="color: #ff0000;">=</span><span style="color: #ff0000;">&gt;</span><span style="color: #000000;">array</span><span style="color: #000000;">(</span></td> </tr> <tr> <td><span style="color: #4682b4;">&#8216;</span><span style="color: #4682b4;">class</span><span style="color: #4682b4;">&#8216;</span><span style="color: #ff0000;">=</span><span style="color: #ff0000;">&gt;</span><span style="color: #4682b4;">&#8216;</span><span style="color: #4682b4;">CDbAuthManager</span><span style="color: #4682b4;">&#8216;</span><span style="color: #000000;">,</span><span style="color: #008000;">//认证类名称</span></td> </tr> <tr> <td><span style="color: #4682b4;">&#8216;</span><span style="color: #4682b4;">defaultRoles</span><span style="color: #4682b4;">&#8216;</span><span style="color: #ff0000;">=</span><span style="color: #ff0000;">&gt;</span><span style="color: #000000;">array</span><span style="color: #000000;">(</span><span style="color: #4682b4;">&#8216;</span><span style="color: #4682b4;">guest</span><span style="color: #4682b4;">&#8216;</span><span style="color: #000000;">)</span><span style="color: #000000;">,</span><span style="color: #008000;">//默认角色</span></td> </tr> <tr> <td><span style="color: #4682b4;">&#8216;</span><span style="color: #4682b4;">itemTable</span><span style="color: #4682b4;">&#8216;</span> <span style="color: #ff0000;">=</span><span style="color: #ff0000;">&gt;</span> <span style="color: #4682b4;">&#8216;</span><span style="color: #4682b4;">pre_auth_item</span><span style="color: #4682b4;">&#8216;</span><span style="color: #000000;">,</span><span style="color: #008000;">//认证项表名称</span></td> </tr> <tr> <td><span style="color: #4682b4;">&#8216;</span><span style="color: #4682b4;">itemChildTable</span><span style="color: #4682b4;">&#8216;</span> <span style="color: #ff0000;">=</span><span style="color: #ff0000;">&gt;</span> <span style="color: #4682b4;">&#8216;</span><span style="color: #4682b4;">pre_auth_item_child</span><span style="color: #4682b4;">&#8216;</span><span style="color: #000000;">,</span><span style="color: #008000;">//认证项父子关系</span></td> </tr> <tr> <td><span style="color: #4682b4;">&#8216;</span><span style="color: #4682b4;">assignmentTable</span><span style="color: #4682b4;">&#8216;</span> <span style="color: #ff0000;">=</span><span style="color: #ff0000;">&gt;</span> <span style="color: #4682b4;">&#8216;</span><span style="color: #4682b4;">pre_auth_assignment</span><span style="color: #4682b4;">&#8216;</span><span style="color: #000000;">,</span><span style="color: #008000;">//认证项赋权关系</span></td> </tr> <tr> <td><span style="color: #000000;">)</span><span style="color: #000000;">,</span></td> </tr> <tr> <td><span style="color: #008000;">//</span><span style="color: #008000;">&#8230;&#8230;</span></td> </tr> </tbody> </table> </div> <p>那这三个数据表怎么建立呢？很简单，去看framework/web/auth/schema.sql。注意要和你的自定义的表名称对应起来。比如SQL文件中的AuthItem你要修改为pre_auth_item。然后在数据库中运行这个SQL文件中的语句。</p> <h2><a name="t3"></a>了解概念</h2> <p>你可能要问，剩下的代码呢？我告诉你，没有啦。RBAC系统就这样建立起来了。但是为了使用它，你需要了解它的运行机制。我会尽量讲的啰嗦一点&#8230;&#8230;（官方的RBAC文档在<a href="http://www.yiiframework.com/doc/guide/zh_cn/topics.auth" target="_blank">这里</a>，但是我曾经看了4-5遍才明白。）</p> <h3><a name="t4"></a>三个概念</h3> <p>你需要了解的是，授权项目可分为<em>operations</em>（行动）,<em>tasks</em>（任务）和 <em>roles</em>（角色）。</p> <p>一个用户拥有一个或者多个角色，比如，我们这里有三个角色：<strong>银行行长</strong>、<strong>银行职员</strong>、<strong>顾客</strong>。我们假设：</p> <ul><li><strong>张行长 </strong>有角色：银行行长、银行职员、顾客（人家自己可以存钱嘛）。 </li><li><strong>王职员 </strong>有角色：银行职员、顾客。 </li><li><strong>小李 </strong>有角色：顾客。 </li></ul> <p>那么，相应的，只要顾客可以做的事情，小李就可以做，王职员和张行长也可以。银行职员可以做的事情，王职员和张行长都可以做，小李就不可以了。</p> <p>比如，一个&#8220;顾客&#8221;可以存钱，那么拥有&#8220;顾客&#8221;角色的张行长、王职员、小李都可以存钱。&#8220;银行职员&#8221;可以打印顾客的交易记录，那么有&#8220;银行职员&#8221;角 色的张行长和王职员都可以，而小李不行，必须找一个有&#8220;银行职员&#8221;角色的人才可以打印详细的交易记录。一个&#8220;银行行长&#8221;才可以进入银行钱库提钱，那么只有 张行长可以，因为它才有&#8220;银行行长&#8221;的角色。</p> <p>这就是基于角色的认证体系，简称RBAC。</p> <h3><a name="t5"></a>角色的继承</h3> <p>角色是可以继承的，比如我们规定如下：</p> <ul><li>凡是&#8220;银行行长&#8221;都是&#8220;银行职员&#8221;，也就是说，只要银行职员可以做的事情，银行行长都可以做。 </li><li>凡是&#8220;银行职员&#8221;都是顾客，同上，顾客可以做的事情银行职员也可以做。 </li></ul> <p>那么角色关系就变成了：</p> <ul><li><strong>张行长 </strong>有角色：银行行长。 </li><li><strong>王职员 </strong>有角色：银行职员。 </li><li><strong>小李 </strong>有角色：顾客。 </li></ul> <p>这样更简单了，这就是角色的继承。</p> <h3><a name="t6"></a>任务的继承</h3> <p>一个任务（task）是可以包含另外一个任务的，我们举个例子，比如&#8220;进入银行&#8221;。</p> <p>我们设定&#8220;顾客&#8221;这个角色有&#8220;进入银行&#8221;的权限。也就是说，&#8220;顾客&#8221;可以执行&#8220;进入银行&#8221;的任务。接下来，我们假设&#8220;进入柜台&#8221;是进入银行的父权 限，也就是说，&#8220;进入柜台&#8221;包含&#8220;进入银行&#8221;。只要能&#8220;进入柜台&#8221;的人都可以&#8220;进入银行&#8221;。我们把&#8220;进入柜台&#8221;这个任务权限给&#8220;银行职员&#8221;。</p> <p>那么从角色上来说，王职员可以进入银行，因为王职员的角色是&#8220;银行职员&#8221;，而&#8220;银行职员&#8221;包含了&#8220;顾客&#8221;的角色。那么&#8220;顾客&#8221;可以进行的&#8220;任务&#8221;对于&#8220;银行职员&#8221;来说也是可以进行的。而&#8220;顾客&#8221;可以&#8220;进入银行&#8221;，那么王职员也可以&#8220;进入银行&#8221;。这是角色的继承带来的。</p> <p>我们再假设有个<strong>赵领导</strong>，是上级领导，可以进入柜台进行视察。那么，我们的任务关系是：</p> <ul><li><strong>赵领导</strong> 有任务：进入柜台。 </li></ul> <p>那么，赵领导就可以&#8220;进入银行&#8221;。因为&#8220;进入银行&#8221;是被&#8220;进入柜台&#8221;包含的任务。只要可以执行&#8220;进入柜台&#8221;的人都可以执行&#8220;进入银行&#8221;。这就是任务的继承。</p> <h3><a name="t7"></a>关于行动</h3> <p>行动是不可划分的一级。也就是说。而一个行动是不能包含其他行动的。假设我们有个行动叫&#8220;从银行仓库中提钱&#8221;。我们把这个行动作包含&#8220;进入柜台&#8221;。那么只要可以执行&#8220;从银行仓库中提钱&#8221;的角色都可以执行&#8220;进入柜台&#8221;这个任务。</p> <h3><a name="t8"></a>三者关系</h3> <ul><li>一个角色可以包含另外一个或者几个角色。 </li><li>一个角色可以包含另外一个或者几个任务。 </li><li>一个角色可以包含另外一个或者几个行动。 </li><li>一个任务可以包含另外一个或者几个任务。 </li><li>一个任务可以包含另外一个或者几个行动。 </li><li>一个行动只能被角色或者任务包含，行动是不可以包含其他，也不可再分。 </li></ul> <p>这样，就形成了一个权限管理体系。关于&#8220;任务&#8221;和&#8220;行动&#8221;，你不必思考其字面上的意义。这两者就是形成两层权限。</p> <h2><a name="t9"></a>进行赋权</h2> <p>我们建立了RBAC权限管理，就需要进行对权限的WEB管理。这些就需要你自己写代码了。</p> <p>根据不同种类的项目调用下列方法之一定义授权项目：</p> <ul><li><a href="http://www.yiiframework.com/doc/api/CAuthManager#createRole">CAuthManager::createRole</a> </li><li><a href="http://www.yiiframework.com/doc/api/CAuthManager#createTask">CAuthManager::createTask</a> </li><li><a href="http://www.yiiframework.com/doc/api/CAuthManager#createOperation">CAuthManager::createOperation</a> </li></ul> <p>一旦我们拥有一套授权项目，我们可以调用以下方法建立授权项目关系：</p> <ul><li><a href="http://www.yiiframework.com/doc/api/CAuthManager#addItemChild">CAuthManager::addItemChild</a> </li><li><a href="http://www.yiiframework.com/doc/api/CAuthManager#removeItemChild">CAuthManager::removeItemChild</a> </li><li><a href="http://www.yiiframework.com/doc/api/CAuthItem#addChild">CAuthItem::addChild</a> </li><li><a href="http://www.yiiframework.com/doc/api/CAuthItem#removeChild">CAuthItem::removeChild</a> </li></ul> <p>最后，我们调用下列方法来分配角色项目给各个用户：</p> <ul><li><a href="http://www.yiiframework.com/doc/api/CAuthManager#assign">CAuthManager::assign</a> </li><li><a href="http://www.yiiframework.com/doc/api/CAuthManager#revoke">CAuthManager::revoke</a> </li></ul> <p>下面我们将展示一个例子是关于用所提供的API建立一个授权等级：</p> <blockquote> <pre>$auth=Yii::app()-&gt;authManager;  <br />$auth-&gt;createOperation('createPost','create a post'); <br />$auth-&gt;createOperation('readPost','read a post'); <br />$auth-&gt;createOperation('updatePost','update a post'); <br />$auth-&gt;createOperation('deletePost','delete a post');  <br /><br />$bizRule='return Yii::app()-&gt;user-&gt;id==$params["post"]-&gt;authID;'; <br />$task=$auth-&gt;createTask('updateOwnPost','update a post by author himself',$bizRule); <br />$task-&gt;addChild('updatePost');  <br /><br />$role=$auth-&gt;createRole('reader'); <br />$role-&gt;addChild('readPost');  <br /><br />$role=$auth-&gt;createRole('author'); <br />$role-&gt;addChild('reader'); <br />$role-&gt;addChild('createPost'); <br />$role-&gt;addChild('updateOwnPost'); <br /><br />$role=$auth-&gt;createRole('editor'); <br />$role-&gt;addChild('reader'); <br />$role-&gt;addChild('updatePost');  <br /><br />$role=$auth-&gt;createRole('admin'); <br />$role-&gt;addChild('editor'); <br />$role-&gt;addChild('author');<br />$role-&gt;addChild('deletePost');  <br /><br />$auth-&gt;assign('reader','readerA'); <br />$auth-&gt;assign('author','authorB'); <br />$auth-&gt;assign('editor','editorC'); <br />$auth-&gt;assign('admin','adminD');</pre> </blockquote> <pre>也就是说，你需要自己写一个管理界面，来列出你的角色、任务、行动，然后可以在这个界面上进行管理。比如增加、删除、修改。</pre> <h2><a name="t10"></a>权限检查</h2> <p>假设你在你的管理界面进行了赋权，那么可以在程序里面进行权限检查：</p> <pre>if(  Yii::app()-&gt;user-&gt;checkAccess('createPost')  )</pre> <pre>{</pre> <blockquote> <pre>// 这里可以显示表单等操作</pre> </blockquote> <pre>} else　{</pre> <blockquote> <pre>// 检查没有通过的可以跳转或者显示警告</pre> </blockquote> <pre>}</pre> <pre>上面的代码就检查了用户是否可以执行&#8220;createPost&#8221;，这createPost可能是一个任务，也可以是一个行动。</pre> <h2><a name="t11"></a>其他的</h2> <p>对于很多说Yii权限体系RBAC不好用的人其实都没有看懂文档。综合我的体验，我感觉Yii框架的RBAC是我用过的框架里面最好用的。而且是需要自己写代码最少的。</p> <p>Yii的RBAC有更加高级的用法，比如&#8220;业务规则&#8221;，&#8220;默认角色&#8221;。你可以去参考官方文档。</p> <p>我知道，会有部分人仍旧不理解RBAC，或者不会用Yii的RBAC。没有关系，你可以在下方的评论框里提问。</p> <p>happy Yii ！</p></div><img src ="http://www.cppblog.com/guojingjia2006/aggbug/197298.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/guojingjia2006/" target="_blank">小果子</a> 2013-01-15 19:38 <a href="http://www.cppblog.com/guojingjia2006/archive/2013/01/15/197298.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>yii 源码调试笔记(1)---theme - module - controller about layout</title><link>http://www.cppblog.com/guojingjia2006/archive/2013/01/11/197181.html</link><dc:creator>小果子</dc:creator><author>小果子</author><pubDate>Thu, 10 Jan 2013 16:03:00 GMT</pubDate><guid>http://www.cppblog.com/guojingjia2006/archive/2013/01/11/197181.html</guid><wfw:comment>http://www.cppblog.com/guojingjia2006/comments/197181.html</wfw:comment><comments>http://www.cppblog.com/guojingjia2006/archive/2013/01/11/197181.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/guojingjia2006/comments/commentRss/197181.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/guojingjia2006/services/trackbacks/197181.html</trackback:ping><description><![CDATA[<div>string(79) "D:\Program Files\Apach\htdocs\novemweb\themes\classic\views/admin/default\index" string(81) "D:\Program Files\Apach\htdocs\novemweb\themes\classic\views/admin/layouts/column1" string(78) "D:\Program Files\Apach\htdocs\novemweb\themes\classic\views/admin/layouts/main" string(81) "D:\Program Files\Apach\htdocs\novemweb\protected\modules\admin\views/layouts/main"  <div id="content"> 	<h1>admin/default/index</h1>  <p> This is the view content for action "index". The action belongs to the controller "DefaultController" in the "admin" module. </p> <p> You may customize this page by editing <tt>D:\Program Files\Apach\htdocs\novemweb\themes\classic\views\admin\default\index.php</tt> </p>test--------------</div></div><br /><img src ="http://www.cppblog.com/guojingjia2006/aggbug/197181.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/guojingjia2006/" target="_blank">小果子</a> 2013-01-11 00:03 <a href="http://www.cppblog.com/guojingjia2006/archive/2013/01/11/197181.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>使用awstats自动分析Nginx日志(转)</title><link>http://www.cppblog.com/guojingjia2006/archive/2013/01/06/197024.html</link><dc:creator>小果子</dc:creator><author>小果子</author><pubDate>Sun, 06 Jan 2013 10:05:00 GMT</pubDate><guid>http://www.cppblog.com/guojingjia2006/archive/2013/01/06/197024.html</guid><wfw:comment>http://www.cppblog.com/guojingjia2006/comments/197024.html</wfw:comment><comments>http://www.cppblog.com/guojingjia2006/archive/2013/01/06/197024.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/guojingjia2006/comments/commentRss/197024.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/guojingjia2006/services/trackbacks/197024.html</trackback:ping><description><![CDATA[<div>转自: https://www.akii.org/use-awstats-automatic-analysis-nginx-log.html<br />使用awstats可以分析apache日志，同样也可以分析nginx日志。本文将详细介绍自动定时切割nginx的访问日志，并使用awstats来定时分析nginx的日志的实现方法。</div><div><h2><strong>前言</strong></h2> <p>本文中使用的是awstats 7.0版本。<br /> 此版本增加了对win7的支持以及一些更新的特性。</p> <blockquote><p>New features/improvements:<br /> - Detect Windows 7.<br /> - Can format numbers according to language.<br /> - More mime types.<br /> - Added geoip_asn_maxmind plugin.<br /> - Geoip Maxmind city plugin have now override file capabilities to complete<br /> missing entries in geoip maxmind database.<br /> - Added graphgooglechartapi to use online Google chart api to build graph.<br /> - Can show map of country to report countries when using graphgooglechartapi.<br /> - Part of codes was change to use more functions and have a cleaner code.<br /> - Added parameter to ignore missing log files when merging for a site on<br /> multiple servers where a single server may not have created a log for a given day.<br /> - Update robots database.<br /> - Added Download tracking where certain mime types are defined as downloads<br /> and HTTP status 206 is tracked as download continuation</p></blockquote> <p>Awstats 是在 SourceForge 上发展很快的一个基于 Perl 的 WEB 日志分析工具，一个充分的日志分析让  Awstats 显示您下列资料:</p> <ul><li> 访问次数、独特访客人数,</li><li> 访问时间和上次访问,</li><li> 使用者认证、最近认证的访问,</li><li> 每周的高峰时间(页数,点击率,每小时和一周的千字节),</li><li> 域名/国家的主机访客(页数,点击率,字节,269域名/国家检测, geoip 检测),</li><li> 主机名单,最近访问和未解析的 IP 地址名单</li><li> 大多数看过的进出页面,</li><li> 档案类型,</li><li> 网站压缩统计表(mod_gzip 或者 mod_deflate),</li><li> 使用的操作系统 (每个操作系统的页数,点击率 ,字节, 35 OS detected),</li><li> 使用的浏览器,</li><li> 机器人访问(检测 319 个机器人),</li><li> 蠕虫攻击 (5 个蠕虫家族),</li><li> 搜索引擎，利用关键词检索找到你的地址,</li><li> HTTP 协议错误(最近查阅没有找到的页面),</li><li> 其他基于 URL 的个性报导,链接参数, 涉及综合行销领域目的.</li><li> 贵网站被加入&#8221;最喜爱的书签&#8221;.次数.</li><li> 屏幕大小(需要在索引页补充一些 HTML 标签).</li><li> 浏览器的支持比例:  Java, Flash, RealG2 reader, Quicktime reader, WMA reader, PDF  reader.</li><li> 负载平衡服务器比率集群报告.</li></ul> <p>Awstats 的运行是需要 PERL 环境的支持，从 awstats 的文档来看，它对 Apache HTTP Server   的支持是非常完美的，而当我们把 Web 服务器换成 Nginx 后，要运行 awstats 变得很麻烦。首先 Nginx 本身对 Perl   的支持是比较弱的，甚至官方也不建议使用；另外在日志格式上有需要修改后才能运行。</p> <h2><strong>日志切割</strong></h2> <p>本文主要介绍通过让 awstats 对日志统计的结果生成静态页面，然后通过 Nginx 输出以达到统计 Nginx  访问日志的效果，其中还包括如何让 Nginx 自动切割日志文件。对于nginx的日志，我的做法是按天切割。然后存入日期形式的目录中并压缩。</p> <p>需要注意的是，nginx的日志应该遵循以下格式，才可以被awstats识别，如定义日志格式</p> <div><div id="highlighter_888201"  shell"=""><table border="0" cellpadding="0" cellspacing="0"><tbody><tr><td><div number1="" index0=""  alt2"="">1</div><div number2="" index1=""  alt1"="">2</div><div number3="" index2=""  alt2"="">3</div></td><td><div><div number1="" index0=""  alt2"=""><code plain"="">log_format&nbsp; main&nbsp; </code><code string"="">'$remote_addr - $remote_user [$time_local] "$request" '</code></div><div number2="" index1=""  alt1"=""><code spaces"="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code string"="">'$status $body_bytes_sent "$http_referer" '</code></div><div number3="" index2=""  alt2"=""><code spaces"="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code string"="">'"$http_user_agent" "$http_x_forwarded_for"'</code><code plain"="">;</code></div></div></td></tr></tbody></table></div></div> <p>使用日志格式</p> <div><div id="highlighter_628218"  shell"=""><table border="0" cellpadding="0" cellspacing="0"><tbody><tr><td><div number1="" index0=""  alt2"="">1</div></td><td><div><div number1="" index0=""  alt2"=""><code plain"="">access_log&nbsp; </code><code plain"="">/home/www/logs/access</code><code plain"="">.log&nbsp; main;</code></div></div></td></tr></tbody></table></div></div> <p>这里需要有一个小技巧的提示：把log_format这段代码放在你nginx的http的定义段中，可以在下面的每一个server中引用此格式。不必在每个server里面都去定义格式。<br /> 本文不讲如何安装nginx，稍后我将发布我的lnmp一键安装包(linux nginx mysql php)。全编译+优化自动化安装，使用php-fpm运行php的fastcgi进程。</p> <p>我写了一个定时切割日志的脚本。每天0:00开始执行，切割昨天的日志（交由awstats分析），压缩前天的日志（压缩日志可减小存储空间，为防 止awstats没有分析完就被压缩，所以只压缩前天的日志）。如果你的nginx和log文件放的路径和我的不一样，请对应修改。</p> <div><div id="highlighter_666635"  shell"=""><table border="0" cellpadding="0" cellspacing="0"><tbody><tr><td><div number1="" index0=""  alt2"="">1</div></td><td><div><div number1="" index0=""  alt2"=""><code plain"="">vim cut_log.sh</code></div></div></td></tr></tbody></table></div></div> <p>输入以下内容</p> <div><div id="highlighter_698905"  shell"=""><table border="0" cellpadding="0" cellspacing="0"><tbody><tr><td><div number1="" index0=""  alt2"="">1</div><div number2="" index1=""  alt1"="">2</div><div number3="" index2=""  alt2"="">3</div><div number4="" index3=""  alt1"="">4</div><div number5="" index4=""  alt2"="">5</div><div number6="" index5=""  alt1"="">6</div><div number7="" index6=""  alt2"="">7</div><div number8="" index7=""  alt1"="">8</div><div number9="" index8=""  alt2"="">9</div><div number10="" index9=""  alt1"="">10</div><div number11="" index10=""  alt2"="">11</div><div number12="" index11=""  alt1"="">12</div><div number13="" index12=""  alt2"="">13</div><div number14="" index13=""  alt1"="">14</div></td><td><div><div number1="" index0=""  alt2"=""><code preprocessor=""  bold"="">#!/bin/bash</code></div><div number2="" index1=""  alt1"=""><code comments"=""># This script run at 00:00</code></div><div number3="" index2=""  alt2"=""><code comments"=""># cut yesterday log and gzip the day before yesterday log files.</code></div><div number4="" index3=""  alt1"=""><code comments"=""># yesterday logs to awstats</code></div><div number5="" index4=""  alt2"="">&nbsp;</div><div number6="" index5=""  alt1"=""><code comments"=""># The Nginx logs path</code></div><div number7="" index6=""  alt2"=""><code plain"="">logs_path=</code><code string"="">"/home/www/logs/"</code></div><div number8="" index7=""  alt1"=""><code plain"="">date_dir=${logs_path}$(</code><code functions"="">date</code> <code plain"="">-d </code><code string"="">"yesterday"</code> <code plain"="">+</code><code string"="">"%Y"</code><code plain"="">)/$(</code><code functions"="">date</code> <code plain"="">-d </code><code string"="">"yesterday"</code> <code plain"="">+</code><code string"="">"%m"</code><code plain"="">)/$(</code><code functions"="">date</code> <code plain"="">-d </code><code string"="">"yesterday"</code> <code plain"="">+</code><code string"="">"%d"</code><code plain"="">)/</code></div><div number9="" index8=""  alt2"=""><code plain"="">gzip_date_dir=${logs_path}$(</code><code functions"="">date</code> <code plain"="">-d </code><code string"="">"-2 day"</code> <code plain"="">+</code><code string"="">"%Y"</code><code plain"="">)/$(</code><code functions"="">date</code> <code plain"="">-d </code><code string"="">"-2 day"</code> <code plain"="">+</code><code string"="">"%m"</code><code plain"="">)/$(</code><code functions"="">date</code> <code plain"="">-d </code><code string"="">"-2 day"</code> <code plain"="">+</code><code string"="">"%d"</code><code plain"="">)/</code></div><div number10="" index9=""  alt1"="">&nbsp;</div><div number11="" index10=""  alt2"=""><code functions"="">mkdir</code> <code plain"="">-p $date_dir</code></div><div number12="" index11=""  alt1"=""><code functions"="">mv</code> <code plain"="">${logs_path}*access.log $date_dir</code></div><div number13="" index12=""  alt2"=""><code plain"="">/usr/local/nginx/sbin/nginx</code> <code plain"="">-s reopen</code></div><div number14="" index13=""  alt1"=""><code plain"="">/usr/bin/gzip</code> <code plain"="">${gzip_date_dir}*.log</code></div></div></td></tr></tbody></table></div></div> <p>然后让它每天0时起开始进行，执行crontab -e加入以下代码再按:wq保存退出，这里我将此脚本放在/root/下，切记要给它可执行权限（chmod +x cut_log.sh）.</p> <div><div id="highlighter_56696"  shell"=""><table border="0" cellpadding="0" cellspacing="0"><tbody><tr><td><div number1="" index0=""  alt2"="">1</div></td><td><div><div number1="" index0=""  alt2"=""><code plain"="">00 00 * * * </code><code plain"="">/bin/bash</code> <code plain"="">/root/cut_log</code><code plain"="">.sh</code></div></div></td></tr></tbody></table></div></div> <p>这样就可以每天凌里自动切割昨天的日志到以日期为目录结构的目录中。可以留存以后查询。留着昨天的日志交给下面的awstats来分析，压缩前天的日志（前天的已经被分析过了）。</p> <h2><strong>安装和配置awstats</strong></h2> <p>下载最新的 awstats，我使用的是迄今为止最新的7.0版本</p> <p>安装到/usr/local下，这个路径是习惯。大部分人保持的良好习惯。</p> <div><div id="highlighter_444650"  shell"=""><table border="0" cellpadding="0" cellspacing="0"><tbody><tr><td><div number1="" index0=""  alt2"="">1</div><div number2="" index1=""  alt1"="">2</div><div number3="" index2=""  alt2"="">3</div></td><td><div><div number1="" index0=""  alt2"=""><code plain"="">wget http:</code><code plain"="">//awstats</code><code plain"="">.sourceforge.net</code><code plain"="">/files/awstats-7</code><code plain"="">.0.</code><code functions"="">tar</code><code plain"="">.gz</code></div><div number2="" index1=""  alt1"=""><code functions"="">tar</code> <code plain"="">-zxvf awstats-7.0.</code><code functions"="">tar</code><code plain"="">.gz</code></div><div number3="" index2=""  alt2"=""><code functions"="">mv</code> <code plain"="">awstats-7.0 </code><code plain"="">/usr/local/awstats</code></div></div></td></tr></tbody></table></div></div> <p>修改权限，wget下载下来的包中权限是非root的，赋予过权限之后，.pl的文件也就可以运行了。</p> <div><div id="highlighter_780887"  shell"=""><table border="0" cellpadding="0" cellspacing="0"><tbody><tr><td><div number1="" index0=""  alt2"="">1</div><div number2="" index1=""  alt1"="">2</div><div number3="" index2=""  alt2"="">3</div><div number4="" index3=""  alt1"="">4</div></td><td><div><div number1="" index0=""  alt2"=""><code functions"="">chown</code> <code plain"="">-R root:root </code><code plain"="">/usr/local/awstats</code></div><div number2="" index1=""  alt1"=""><code functions"="">chmod</code> <code plain"="">-R =rwX </code><code plain"="">/usr/local/awstats</code></div><div number3="" index2=""  alt2"=""><code functions"="">chmod</code> <code plain"="">+x </code><code plain"="">/usr/local/awstats/tools/</code><code plain"="">*.pl</code></div><div number4="" index3=""  alt1"=""><code functions"="">chmod</code> <code plain"="">+x </code><code plain"="">/usr/local/awstats/wwwroot/cgi-bin/</code><code plain"="">*.pl</code></div></div></td></tr></tbody></table></div></div> <p>然后执行 tools 目录中的 awstats_configure.pl 配置向导，创建一个新的统计</p> <p>运行(注意这里要在当前目录运行。否则会有一些关于标准目录的提示。)</p> <div><div id="highlighter_545974"  shell"=""><table border="0" cellpadding="0" cellspacing="0"><tbody><tr><td><div number1="" index0=""  alt2"="">1</div><div number2="" index1=""  alt1"="">2</div></td><td><div><div number1="" index0=""  alt2"=""><code functions"="">cd</code> <code plain"="">/usr/local/awstats/tools</code></div><div number2="" index1=""  alt1"=""><code plain"="">.</code><code plain"="">/awstats_configure</code><code plain"="">.pl</code></div></div></td></tr></tbody></table></div></div> <p>将会有如下一些提示：</p> <div><div id="highlighter_691818"  shell"=""><table border="0" cellpadding="0" cellspacing="0"><tbody><tr><td><div number1="" index0=""  alt2"="">1</div><div number2="" index1=""  alt1"="">2</div><div number3="" index2=""  alt2"="">3</div><div number4="" index3=""  alt1"="">4</div><div number5="" index4=""  alt2"="">5</div><div number6="" index5=""  alt1"="">6</div><div number7="" index6=""  alt2"="">7</div><div number8="" index7=""  alt1"="">8</div><div number9="" index8=""  alt2"="">9</div><div number10="" index9=""  alt1"="">10</div></td><td><div><div number1="" index0=""  alt2"=""><code plain"="">-----&gt; Running OS detected: Linux, BSD or Unix</code></div><div number2="" index1=""  alt1"="">&nbsp;</div><div number3="" index2=""  alt2"=""><code plain"="">-----&gt; Check </code><code keyword"="">for</code> <code plain"="">web server </code><code functions"="">install</code></div><div number4="" index3=""  alt1"="">&nbsp;</div><div number5="" index4=""  alt2"=""><code plain"="">Enter full config </code><code functions"="">file</code> <code plain"="">path of your Web server.</code></div><div number6="" index5=""  alt1"=""><code plain"="">Example: </code><code plain"="">/etc/httpd/httpd</code><code plain"="">.conf</code></div><div number7="" index6=""  alt2"=""><code plain"="">Example: </code><code plain"="">/usr/local/apache2/conf/httpd</code><code plain"="">.conf</code></div><div number8="" index7=""  alt1"=""><code plain"="">Example: c:\Program files\apache group\apache\conf\httpd.conf</code></div><div number9="" index8=""  alt2"=""><code plain"="">Config </code><code functions"="">file</code> <code plain"="">path (</code><code string"="">'none'</code> <code plain"="">to skip web server setup):</code></div><div number10="" index9=""  alt1"=""><code plain"="">&gt;none </code><code comments"="">#这里添none并回车，因为我们没有使用apache</code></div></div></td></tr></tbody></table></div></div> <p>回车之后下一个选项</p> <div><div id="highlighter_8026"  shell"=""><table border="0" cellpadding="0" cellspacing="0"><tbody><tr><td><div number1="" index0=""  alt2"="">1</div><div number2="" index1=""  alt1"="">2</div><div number3="" index2=""  alt2"="">3</div><div number4="" index3=""  alt1"="">4</div><div number5="" index4=""  alt2"="">5</div><div number6="" index5=""  alt1"="">6</div><div number7="" index6=""  alt2"="">7</div><div number8="" index7=""  alt1"="">8</div><div number9="" index8=""  alt2"="">9</div><div number10="" index9=""  alt1"="">10</div><div number11="" index10=""  alt2"="">11</div></td><td><div><div number1="" index0=""  alt2"=""><code plain"="">Your web server config </code><code functions"="">file</code><code plain"="">(s) could not be found.</code></div><div number2="" index1=""  alt1"=""><code plain"="">You will need to setup your web server manually to </code><code functions"="">declare</code> <code plain"="">AWStats</code></div><div number3="" index2=""  alt2"=""><code plain"="">script as a CGI, </code><code keyword"="">if</code> <code plain"="">you want to build reports dynamically.</code></div><div number4="" index3=""  alt1"=""><code plain"="">See AWStats setup documentation (</code><code functions"="">file</code> <code plain"="">docs</code><code plain"="">/index</code><code plain"="">.html)</code></div><div number5="" index4=""  alt2"="">&nbsp;</div><div number6="" index5=""  alt1"=""><code plain"="">-----&gt; Update model config </code><code functions"="">file</code> <code string"="">'/usr/local/awstats/wwwroot/cgi-bin/awstats.model.conf'</code></div><div number7="" index6=""  alt2"=""><code spaces"="">&nbsp;</code><code plain"="">File awstats.model.conf updated.</code></div><div number8="" index7=""  alt1"="">&nbsp;</div><div number9="" index8=""  alt2"=""><code plain"="">-----&gt; Need to create a new config </code><code functions"="">file</code> <code plain"="">?</code></div><div number10="" index9=""  alt1"=""><code plain"="">Do you want me to build a new AWStats config</code><code plain"="">/profile</code></div><div number11="" index10=""  alt2"=""><code functions"="">file</code> <code plain"="">(required </code><code keyword"="">if</code> <code plain"="">first </code><code functions"="">install</code><code plain"="">) [y</code><code plain"="">/N</code><code plain"="">] ?</code></div></div></td></tr></tbody></table></div></div> <p>#这里选Y，创建一个新的配置文件</p> <div><div id="highlighter_583825"  shell"=""><table border="0" cellpadding="0" cellspacing="0"><tbody><tr><td><div number1="" index0=""  alt2"="">1</div><div number2="" index1=""  alt1"="">2</div><div number3="" index2=""  alt2"="">3</div><div number4="" index3=""  alt1"="">4</div><div number5="" index4=""  alt2"="">5</div><div number6="" index5=""  alt1"="">6</div></td><td><div><div number1="" index0=""  alt2"=""><code plain"="">-----&gt; Define config </code><code functions"="">file</code> <code plain"="">name to create</code></div><div number2="" index1=""  alt1"=""><code plain"="">What is the name of your web site or profile analysis ?</code></div><div number3="" index2=""  alt2"=""><code plain"="">Example: www.mysite.com</code></div><div number4="" index3=""  alt1"=""><code plain"="">Example: demo</code></div><div number5="" index4=""  alt2"=""><code plain"="">Your web site, virtual server or profile name:</code></div><div number6="" index5=""  alt1"=""><code plain"="">&gt;akii.org&nbsp; </code><code comments"="">#这里输入你要分析的域名，或是随便一个你易记的配置名并回车</code></div></div></td></tr></tbody></table></div></div> <p>接下来要定义你的配置文件存放的路径，可用默认</p> <div><div id="highlighter_293190"  shell"=""><table border="0" cellpadding="0" cellspacing="0"><tbody><tr><td><div number1="" index0=""  alt2"="">1</div><div number2="" index1=""  alt1"="">2</div><div number3="" index2=""  alt2"="">3</div><div number4="" index3=""  alt1"="">4</div><div number5="" index4=""  alt2"="">5</div></td><td><div><div number1="" index0=""  alt2"=""><code plain"="">-----&gt; Define config </code><code functions"="">file</code> <code plain"="">path</code></div><div number2="" index1=""  alt1"=""><code plain"="">In </code><code functions"="">which</code> <code plain"="">directory </code><code keyword"="">do</code> <code plain"="">you plan to store your config </code><code functions"="">file</code><code plain"="">(s) ?</code></div><div number3="" index2=""  alt2"=""><code plain"="">Default: </code><code plain"="">/etc/awstats</code></div><div number4="" index3=""  alt1"=""><code plain"="">Directory path to store config </code><code functions"="">file</code><code plain"="">(s) (Enter </code><code keyword"="">for</code> <code plain"="">default):</code></div><div number5="" index4=""  alt2"=""><code plain"="">&gt; </code><code comments"="">#直接回车，使用默认路径/etc/awstats</code></div></div></td></tr></tbody></table></div></div> <p>回车后的提示</p> <div><div id="highlighter_413648"  shell"=""><table border="0" cellpadding="0" cellspacing="0"><tbody><tr><td><div number1="" index0=""  alt2"="">1</div><div number2="" index1=""  alt1"="">2</div><div number3="" index2=""  alt2"="">3</div><div number4="" index3=""  alt1"="">4</div><div number5="" index4=""  alt2"="">5</div><div number6="" index5=""  alt1"="">6</div><div number7="" index6=""  alt2"="">7</div><div number8="" index7=""  alt1"="">8</div><div number9="" index8=""  alt2"="">9</div><div number10="" index9=""  alt1"="">10</div><div number11="" index10=""  alt2"="">11</div><div number12="" index11=""  alt1"="">12</div><div number13="" index12=""  alt2"="">13</div><div number14="" index13=""  alt1"="">14</div><div number15="" index14=""  alt2"="">15</div><div number16="" index15=""  alt1"="">16</div><div number17="" index16=""  alt2"="">17</div><div number18="" index17=""  alt1"="">18</div><div number19="" index18=""  alt2"="">19</div></td><td><div><div number1="" index0=""  alt2"=""><code plain"="">-----&gt; Create config </code><code functions"="">file</code> <code string"="">'/etc/awstats/awstats.akii.org.conf'</code></div><div number2="" index1=""  alt1"=""><code spaces"="">&nbsp;</code><code plain"="">Config </code><code functions"="">file</code> <code plain"="">/etc/awstats/awstats</code><code plain"="">.akii.org.conf created.</code></div><div number3="" index2=""  alt2"="">&nbsp;</div><div number4="" index3=""  alt1"=""><code plain"="">-----&gt; Add update process inside a scheduler</code></div><div number5="" index4=""  alt2"=""><code plain"="">Sorry, configure.pl does not support automatic add to </code><code functions"="">cron</code> <code plain"="">yet.</code></div><div number6="" index5=""  alt1"=""><code plain"="">You can </code><code keyword"="">do</code> <code plain"="">it manually by adding the following </code><code functions"="">command</code> <code plain"="">to your </code><code functions"="">cron</code><code plain"="">:</code></div><div number7="" index6=""  alt2"=""><code plain"="">/usr/local/awstats/wwwroot/cgi-bin/awstats</code><code plain"="">.pl -update -config=akii.org</code></div><div number8="" index7=""  alt1"=""><code plain"="">Or </code><code keyword"="">if</code> <code plain"="">you have several config files and prefer having only one </code><code functions"="">command</code><code plain"="">:</code></div><div number9="" index8=""  alt2"=""><code plain"="">/usr/local/awstats/tools/awstats_updateall</code><code plain"="">.pl now</code></div><div number10="" index9=""  alt1"=""><code plain"="">Press ENTER to </code><code keyword"="">continue</code><code plain"="">... </code><code comments"="">#按回车继续</code></div><div number11="" index10=""  alt2"="">&nbsp;</div><div number12="" index11=""  alt1"=""><code plain"="">A SIMPLE config </code><code functions"="">file</code> <code plain"="">has been created: </code><code plain"="">/etc/awstats/awstats</code><code plain"="">.akii.org.conf</code></div><div number13="" index12=""  alt2"=""><code plain"="">You should have a </code><code functions"="">look</code> <code plain"="">inside to check and change manually main parameters.</code></div><div number14="" index13=""  alt1"=""><code plain"="">You can </code><code keyword"="">then</code> <code plain"="">manually update your statistics </code><code keyword"="">for</code> <code string"="">'yuyuanchun.com'</code> <code plain"="">with </code><code functions"="">command</code><code plain"="">:</code></div><div number15="" index14=""  alt2"=""><code plain"="">&gt; perl awstats.pl -update -config=akii.org</code></div><div number16="" index15=""  alt1"=""><code plain"="">You can also build static report pages </code><code keyword"="">for</code> <code string"="">'akii.org'</code> <code plain"="">with </code><code functions"="">command</code><code plain"="">:</code></div><div number17="" index16=""  alt2"=""><code plain"="">&gt; perl awstats.pl -output=pagetype -config=akii.org</code></div><div number18="" index17=""  alt1"="">&nbsp;</div><div number19="" index18=""  alt2"=""><code plain"="">Press ENTER to finish... </code><code comments"="">#回车完成配置文件的创建</code></div></div></td></tr></tbody></table></div></div> <p>完成配置文件的创建后，我们还要修改一下。因为我们是按天切割的日志，切割完成后交由awstats去分析。并不是让awstats去分时正在时时 增长的也就是正在被写入的日志，这样的好处是不至于遗漏数据，并且分析已经切割完成的日志，更不用担心会有冲突。坏处是我一天切割一次日志，你要等第二天 才能看昨天的一些详细数据。</p> <p>修改/etc/awstats/awstats.akii.org.conf，执行：</p> <div><div id="highlighter_810222"  shell"=""><table border="0" cellpadding="0" cellspacing="0"><tbody><tr><td><div number1="" index0=""  alt2"="">1</div></td><td><div><div number1="" index0=""  alt2"=""><code functions"="">vi</code> <code plain"="">/etc/awstats/awstats</code><code plain"="">.akii.org.conf</code></div></div></td></tr></tbody></table></div></div> <p>找到</p> <div><div id="highlighter_683035"  shell"=""><table border="0" cellpadding="0" cellspacing="0"><tbody><tr><td><div number1="" index0=""  alt2"="">1</div></td><td><div><div number1="" index0=""  alt2"=""><code plain"="">LogFile=</code><code string"="">"/var/log/httpd/mylog.log"</code></div></div></td></tr></tbody></table></div></div> <p>修改为：</p> <div><div id="highlighter_673331"  shell"=""><table border="0" cellpadding="0" cellspacing="0"><tbody><tr><td><div number1="" index0=""  alt2"="">1</div></td><td><div><div number1="" index0=""  alt2"=""><code plain"="">LogFile=</code><code string"="">"/home/www/logs/%YYYY-24/%MM-24/%DD-24/akii.org_access.log"</code></div></div></td></tr></tbody></table></div></div> <p>如果你的日志路径和我的不一样，请修改成对应的日志文件名。以上的完整路径是切割后保存的nginx日志文件。其中%YYYY-24/%MM-24/%DD-24表示年月日都减去24小时，也就是昨天的日志目录。修改完成后按:wq保存退出。</p> <p>接下来可以测试一下awstats分析日志了（前提是你已经有了切割过的日志，没有的话可以先退行一下切割日志的脚本/root/cut_log.sh）</p> <p>首先，还要创建一个awstats用于记录数据的目录</p> <div><div id="highlighter_653449"  shell"=""><table border="0" cellpadding="0" cellspacing="0"><tbody><tr><td><div number1="" index0=""  alt2"="">1</div></td><td><div><div number1="" index0=""  alt2"=""><code functions"="">mkdir</code> <code plain"="">-p </code><code plain"="">/var/lib/awstats</code></div></div></td></tr></tbody></table></div></div> <p>然后运行awstats的wwwroot目录中的awatsts.pl来测试一下</p> <div><div id="highlighter_211542"  shell"=""><table border="0" cellpadding="0" cellspacing="0"><tbody><tr><td><div number1="" index0=""  alt2"="">1</div></td><td><div><div number1="" index0=""  alt2"=""><code plain"="">/usr/local/awstats/wwwroot/cgi-bin/awstats</code><code plain"="">.pl -update -config=akii.org</code></div></div></td></tr></tbody></table></div></div> <p>你如果看到类似下面的提示就说明配置文件都正确了。</p> <div><div id="highlighter_50440"  shell"=""><table border="0" cellpadding="0" cellspacing="0"><tbody><tr><td><div number1="" index0=""  alt2"="">1</div><div number2="" index1=""  alt1"="">2</div><div number3="" index2=""  alt2"="">3</div><div number4="" index3=""  alt1"="">4</div><div number5="" index4=""  alt2"="">5</div><div number6="" index5=""  alt1"="">6</div><div number7="" index6=""  alt2"="">7</div><div number8="" index7=""  alt1"="">8</div><div number9="" index8=""  alt2"="">9</div><div number10="" index9=""  alt1"="">10</div><div number11="" index10=""  alt2"="">11</div><div number12="" index11=""  alt1"="">12</div><div number13="" index12=""  alt2"="">13</div></td><td><div><div number1="" index0=""  alt2"=""><code plain"="">Create</code><code plain"="">/Update</code> <code plain"="">database </code><code keyword"="">for</code> <code plain"="">config </code><code string"="">"/etc/awstats/awstats.akii.org.conf"</code> <code plain"="">by AWStats version 7.0 (build 1.964)</code></div><div number2="" index1=""  alt1"=""><code plain"="">From data </code><code keyword"="">in</code> <code plain"="">log </code><code functions"="">file</code> <code string"="">"/home/www/logs/2010/07/24/akii.org_access.log"</code><code plain"="">...</code></div><div number3="" index2=""  alt2"=""><code plain"="">Phase 1 : First bypass old records, searching new record...</code></div><div number4="" index3=""  alt1"=""><code plain"="">Direct access after last parsed record (after line 43260)</code></div><div number5="" index4=""  alt2"=""><code plain"="">Jumped lines </code><code keyword"="">in</code> <code functions"="">file</code><code plain"="">: 43260</code></div><div number6="" index5=""  alt1"=""><code spaces"="">&nbsp;</code><code plain"="">Found 43260 already parsed records.</code></div><div number7="" index6=""  alt2"=""><code plain"="">Parsed lines </code><code keyword"="">in</code> <code functions"="">file</code><code plain"="">: 0</code></div><div number8="" index7=""  alt1"=""><code spaces"="">&nbsp;</code><code plain"="">Found 0 dropped records,</code></div><div number9="" index8=""  alt2"=""><code spaces"="">&nbsp;</code><code plain"="">Found 0 comments,</code></div><div number10="" index9=""  alt1"=""><code spaces"="">&nbsp;</code><code plain"="">Found 0 blank records,</code></div><div number11="" index10=""  alt2"=""><code spaces"="">&nbsp;</code><code plain"="">Found 0 corrupted records,</code></div><div number12="" index11=""  alt1"=""><code spaces"="">&nbsp;</code><code plain"="">Found 0 old records,</code></div><div number13="" index12=""  alt2"=""><code spaces"="">&nbsp;</code><code plain"="">Found 0 new qualified records</code></div></div></td></tr></tbody></table></div></div> <p>统计分析完成后，结果还在 Awstats 的数据库中。在 Apache 上，可以直接打开 Perl 程序的网页查看统计。  但本文开始时已经提到，Nginx 对 Perl 支持并不好，所以我们要换个方法，利用 awstats   的工具将统计的结果生成静态文件，具体的步骤如下：</p> <ul><li>首先在 webroot 目录下创建一个文件夹。例：/home/www/awstats</li><li>写一个脚本，定期执行让 Awstats 把静态页面生成到该目录中</li></ul> <p>先生成存放awstats生成的静态文件的目录，我这里用的是/home/www/awstats</p> <div><div id="highlighter_170519"  shell"=""><table border="0" cellpadding="0" cellspacing="0"><tbody><tr><td><div number1="" index0=""  alt2"="">1</div></td><td><div><div number1="" index0=""  alt2"=""><code functions"="">mkdir</code> <code plain"="">-p </code><code plain"="">/home/www/awstats</code></div></div></td></tr></tbody></table></div></div> <p>我们来写一个脚本</p> <div><div id="highlighter_641756"  shell"=""><table border="0" cellpadding="0" cellspacing="0"><tbody><tr><td><div number1="" index0=""  alt2"="">1</div></td><td><div><div number1="" index0=""  alt2"=""><code plain"="">vim </code><code plain"="">/root/awstats</code><code plain"="">.sh</code></div></div></td></tr></tbody></table></div></div> <p>然后输入以下内容</p> <div><div id="highlighter_644924"  shell"=""><table border="0" cellpadding="0" cellspacing="0"><tbody><tr><td><div number1="" index0=""  alt2"="">1</div><div number2="" index1=""  alt1"="">2</div><div number3="" index2=""  alt2"="">3</div><div number4="" index3=""  alt1"="">4</div><div number5="" index4=""  alt2"="">5</div></td><td><div><div number1="" index0=""  alt2"=""><code preprocessor=""  bold"="">#!/bin/bash</code></div><div number2="" index1=""  alt1"=""><code functions"="">mkdir</code> <code plain"="">-p </code><code plain"="">/home/www/awstats/akii</code><code plain"="">.org</code></div><div number3="" index2=""  alt2"=""><code plain"="">/usr/local/awstats/tools/awstats_buildstaticpages</code><code plain"="">.pl -update&nbsp; \</code></div><div number4="" index3=""  alt1"=""><code plain"="">-config=akii.org -lang=cn -</code><code functions"="">dir</code><code plain"="">=</code><code plain"="">/home/www/awstats/akii</code><code plain"="">.org&nbsp; \</code></div><div number5="" index4=""  alt2"=""><code plain"="">-awstatsprog=</code><code plain"="">/usr/local/awstats/wwwroot/cgi-bin/awstats</code><code plain"="">.pl</code></div></div></td></tr></tbody></table></div></div> <p>上述命令的具体意思如下：</p> <ul><li>/usr/local/awstats/tools/awstats_buildstaticpages.pl	Awstats  静态页面生成工具</li><li>-update -config=akii.org			更新配置项</li><li>-lang=cn				语言为中文</li><li>-dir=/home/www/awstats	统计结果输出目录</li><li>-awstatsprog=/usr/local/awstats/wwwroot/cgi-bin/awstats.pl	Awstats  日志更新程序路径。</li></ul> <p>然后在你的nginx的配置文件中，在你想要安置awstats或默认的ip或域名的server段中，加入关于awstats和icon的两个目录配置。</p> <p>如一个完整案例：</p> <div><div id="highlighter_660898"  shell"=""><table border="0" cellpadding="0" cellspacing="0"><tbody><tr><td><div number1="" index0=""  alt2"="">1</div><div number2="" index1=""  alt1"="">2</div><div number3="" index2=""  alt2"="">3</div><div number4="" index3=""  alt1"="">4</div><div number5="" index4=""  alt2"="">5</div><div number6="" index5=""  alt1"="">6</div><div number7="" index6=""  alt2"="">7</div><div number8="" index7=""  alt1"="">8</div><div number9="" index8=""  alt2"="">9</div><div number10="" index9=""  alt1"="">10</div><div number11="" index10=""  alt2"="">11</div><div number12="" index11=""  alt1"="">12</div><div number13="" index12=""  alt2"="">13</div><div number14="" index13=""  alt1"="">14</div><div number15="" index14=""  alt2"="">15</div><div number16="" index15=""  alt1"="">16</div><div number17="" index16=""  alt2"="">17</div><div number18="" index17=""  alt1"="">18</div><div number19="" index18=""  alt2"="">19</div></td><td><div><div number1="" index0=""  alt2"=""><code plain"="">server {</code></div><div number2="" index1=""  alt1"=""><code plain"="">listen&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 80;</code></div><div number3="" index2=""  alt2"=""><code plain"="">server_name&nbsp; localhost;</code></div><div number4="" index3=""  alt1"=""><code plain"="">root </code><code plain"="">/home/www</code><code plain"="">;</code></div><div number5="" index4=""  alt2"=""><code plain"="">index index.html;</code></div><div number6="" index5=""  alt1"="">&nbsp;</div><div number7="" index6=""  alt2"=""><code plain"="">location ~ ^</code><code plain"="">/awstats/</code> <code plain"="">{&nbsp;&nbsp;&nbsp;&nbsp; </code><code comments"=""># awstats&nbsp; 静态页面目录</code></div><div number8="" index7=""  alt1"=""><code spaces"="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code plain"="">root&nbsp;&nbsp; </code><code plain"="">/home/www/awstats</code><code plain"="">;</code></div><div number9="" index8=""  alt2"=""><code spaces"="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code plain"="">autoindex on; </code><code comments"="">#可以目录浏览你的多个域名的目录用于分析</code></div><div number10="" index9=""  alt1"=""><code spaces"="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code plain"="">index&nbsp; index.html;</code></div><div number11="" index10=""  alt2"=""><code spaces"="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code plain"="">access_log off;</code></div><div number12="" index11=""  alt1"=""><code plain"="">}</code></div><div number13="" index12=""  alt2"="">&nbsp;</div><div number14="" index13=""  alt1"=""><code plain"="">location ~ ^</code><code plain"="">/icon/</code> <code plain"="">{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </code><code comments"=""># 图标目录</code></div><div number15="" index14=""  alt2"=""><code spaces"="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code plain"="">root&nbsp;&nbsp; </code><code plain"="">/usr/local/awstats/wwwroot</code><code plain"="">;</code></div><div number16="" index15=""  alt1"=""><code spaces"="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code plain"="">index&nbsp; index.html;</code></div><div number17="" index16=""  alt2"=""><code spaces"="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code plain"="">access_log off;</code></div><div number18="" index17=""  alt1"=""><code plain"="">}</code></div><div number19="" index18=""  alt2"=""><code plain"="">}</code></div></div></td></tr></tbody></table></div></div> <p>接下来可以测试一下脚本是否可以正确执行</p> <p>还是别忘了给它可执行权限</p> <div><div id="highlighter_826775"  shell"=""><table border="0" cellpadding="0" cellspacing="0"><tbody><tr><td><div number1="" index0=""  alt2"="">1</div><div number2="" index1=""  alt1"="">2</div></td><td><div><div number1="" index0=""  alt2"=""><code functions"="">chmod</code> <code plain"="">+x </code><code plain"="">/root/awstats</code><code plain"="">.sh</code></div><div number2="" index1=""  alt1"=""><code plain"="">/root/awstats</code><code plain"="">.sh</code></div></div></td></tr></tbody></table></div></div> <p>如果你看到它生成了一堆网页，那就说明成功了。</p> <p>输出信息部分例如</p> <div><div id="highlighter_321786"  shell"=""><table border="0" cellpadding="0" cellspacing="0"><tbody><tr><td><div number1="" index0=""  alt2"="">1</div><div number2="" index1=""  alt1"="">2</div><div number3="" index2=""  alt2"="">3</div><div number4="" index3=""  alt1"="">4</div><div number5="" index4=""  alt2"="">5</div><div number6="" index5=""  alt1"="">6</div></td><td><div><div number1="" index0=""  alt2"=""><code plain"="">Launch update process : </code><code string"="">"/usr/local/awstats/wwwroot/cgi-bin/awstats.pl"</code> <code plain"="">-config=akii.org -update -configdir=</code></div><div number2="" index1=""  alt1"=""><code plain"="">......</code></div><div number3="" index2=""  alt2"=""><code plain"="">Build keywords page: </code><code string"="">"/usr/local/awstats/wwwroot/cgi-bin/awstats.pl"</code> <code plain"="">-config=akii.org -staticlinks -lang=cn -output=keywords</code></div><div number4="" index3=""  alt1"=""><code plain"="">Build errors404 page: </code><code string"="">"/usr/local/awstats/wwwroot/cgi-bin/awstats.pl"</code> <code plain"="">-config=akii.org -staticlinks -lang=cn -output=errors404</code></div><div number5="" index4=""  alt2"=""><code plain"="">20 files built.</code></div><div number6="" index5=""  alt1"=""><code plain"="">Main HTML page is </code><code string"="">'awstats.akii.org.html'</code><code plain"="">.</code></div></div></td></tr></tbody></table></div></div> <p>然后可以把它加入自动运行了。</p> <h2><strong>配置awstats脚本自动运行</strong></h2> <div><div id="highlighter_799610"  shell"=""><table border="0" cellpadding="0" cellspacing="0"><tbody><tr><td><div number1="" index0=""  alt2"="">1</div></td><td><div><div number1="" index0=""  alt2"=""><code functions"="">crontab</code> <code plain"="">-e</code></div></div></td></tr></tbody></table></div></div> <p>加入</p> <div><div id="highlighter_408861"  shell"=""><table border="0" cellpadding="0" cellspacing="0"><tbody><tr><td><div number1="" index0=""  alt2"="">1</div></td><td><div><div number1="" index0=""  alt2"=""><code plain"="">00 1 * * * </code><code plain"="">/root/awstats</code><code plain"="">.sh</code></div></div></td></tr></tbody></table></div></div> <p>然后保存退出。</p> <p>这样就可以每天在凌晨自动分割日志，并且开始自动用awstats分析nginx的日志了。</p> <h2><strong>认证访问</strong></h2> <p>如果你想给你的awstats加上访问密码，可以见这里：<a href="https://www.akii.org/nginx-auth_basic-website-dir.html" target="_blank">nginx为目录或网站加上密码认证</a></p> <p>原创文章，写的辛苦。如果你要转载，请保留出处及链接。</p> <p>参考资料:<a href="http://www.ibm.com/developerworks/cn/linux/l-cn-awstats-nginx/index.html" target="_blank">http://www.ibm.com/developerworks/cn/linux/l-cn-awstats-nginx/index.html</a></p></div><img src ="http://www.cppblog.com/guojingjia2006/aggbug/197024.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/guojingjia2006/" target="_blank">小果子</a> 2013-01-06 18:05 <a href="http://www.cppblog.com/guojingjia2006/archive/2013/01/06/197024.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>MongoDb Architecture</title><link>http://www.cppblog.com/guojingjia2006/archive/2012/12/19/196438.html</link><dc:creator>小果子</dc:creator><author>小果子</author><pubDate>Wed, 19 Dec 2012 03:52:00 GMT</pubDate><guid>http://www.cppblog.com/guojingjia2006/archive/2012/12/19/196438.html</guid><wfw:comment>http://www.cppblog.com/guojingjia2006/comments/196438.html</wfw:comment><comments>http://www.cppblog.com/guojingjia2006/archive/2012/12/19/196438.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/guojingjia2006/comments/commentRss/196438.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/guojingjia2006/services/trackbacks/196438.html</trackback:ping><description><![CDATA[<div>本文图片来自 Ricky Ho 的博文 <a href="http://horicky.blogspot.jp/2012/04/mongodb-architecture.html" target="_blank">MongoDB 构架</a>（<a title="查看 MongoDB 的全部文章" href="http://blog.nosqlfan.com/tags/mongodb" target="_blank">MongoDB</a> Architecture），这是个一听就感觉很宽泛的话题，但是作者在文章中确实对 MongoDB 由内至外的<a title="查看架构的全部文章" href="http://blog.nosqlfan.com/tags/%e6%9e%b6%e6%9e%84" target="_blank">架构</a>进行了剖析。本文截取了其文章中的几张重点架构示意图片进行简单描述。希望对大家有用。</div><div><strong>MongoDB 数据文件内部结构</strong></div><img alt="" src="http://www.cppblog.com/images/cppblog_com/guojingjia2006/p1.png" height="848" width="1222" /><br /><div><ol><li>MongoDB 在数据存储上按命名空间来划分，一个 collection 是一个命名空间，一个索引也是一个命名空间</li><li>同一个命名空间的数据被分成很多个 Extent，Extent 之间使用双向链表连接</li><li>在每一个 Extent 中，保存了具体每一行的数据，这些数据也是通过双向链接连接的</li><li>每一行数据存储空间不仅包括数据占用空间，还可能包含一部分附加空间，这使得在数据 update 变大后可以不移动位置</li><li>索引以 BTree 结构实现</li></ol></div><div>&nbsp; <strong>在 MongoDB 中实现事务</strong></div><img alt="" src="http://www.cppblog.com/images/cppblog_com/guojingjia2006/Picture1.png" height="892" width="1283" /><br /><div>众所周知，MongoDB 只支持对单行记录的原子性修改，并不支持对多行数据的原子操作。但是通过上图中的变态操作，实际你也可以自己实现事务。其步骤如图所未：     <ul><li>第 1 步：先记录一条事务记录，将要修改的多行记录的修改值写到里面，并设置其状态为 init（如果这时候操作中断，那么在重新启动时，会判断到他处于 init 状态，从而将其保存的多行修改操作应用到具体的行上）</li><li>第 2 步：然后更新具体要修改的行，将刚才写的事务记录的标识写到它的 tran 字段中</li><li>第 3 步：将事务记录的状态从 init 变成 pending（如果在这时候操作中断，那么在重新启动时，会判断到它的状态是  pending 的，这时候查看其所有对应的多条要修改的记录，如果其 tran 有值，那么就进行第 4 步，如果没值，说明第 4  步已经执行过了，直接将其状态从 pending 变成 commited 了就行）</li><li>第 4 步：将需要修改的多条记录的相应值修改了，并且 unset 掉之前的 tran 字段</li><li>第 5 步：将事务记录那一条的状态从 pending 变成 commited，事务完成</li></ul>     <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;其实上面的步骤并不罕见，在支持事务的 DBMS 中，其事务原子性提交的保证大多都与上面类似。其实事务记录的 tran 那条记录，就类似于这些 DBMS 中的 redolog 一样。</p></div><div>&nbsp; <strong>MongoDB 数据同步</strong></div><img alt="" src="http://www.cppblog.com/images/cppblog_com/guojingjia2006/Picture2.png" height="490" width="945" /><br /><div><div><div>上图是 MongoDB 采用 Replica Sets 模式的同步流程     <ul><li>红色箭头表示写操作写到 Primary 上，然后异步同步到多个 Secondary 上</li><li>蓝色箭头表示读操作可以从 Primary 或 Secondary 任意一个上读</li><li>各个 Primary 与 Secondary 之间一直保持心跳同步检测，用于判断 Replica Sets 的状态</li></ul>     <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong>分片机制</strong></p><p><strong><img alt="" src="http://www.cppblog.com/images/cppblog_com/guojingjia2006/Picture3.png" height="825" width="1204" /></strong></p><p><br /><strong></strong></p><div><ul><li><strong>MongoDB 的分片是指定一个分片 key 来进行，数据按范围分成不同的 chunk，每个 chunk 的大小有限制</strong></li><li><strong>有多个分片节点保存这些 chunk，每个节点保存一部分的 chunk</strong></li><li><strong>每一个分片节点都是一个 Replica Sets，这样保证数据的安全性</strong></li><li><strong>当一个 chunk 超过其限制的最大体积时，会分裂成两个小的 chunk</strong></li><li><strong>当 chunk 在分片节点中分布不均衡时，会引发 chunk 迁移操作</strong></li></ul><strong>     <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong>服务器角色</strong></p></strong></div><strong><img alt="" src="http://www.cppblog.com/images/cppblog_com/guojingjia2006/Picture4.png" height="761" width="1248" /></strong><p>&nbsp;</p><p><strong></strong></p><div><strong>&nbsp;上面讲了分片的标准，下面是具体在分片时的几种节点角色     <ul><li>客户端访问路由节点 mongos 来进行数据读写</li><li>config 服务器保存了两个映射关系，一个是 key 值的区间对应哪一个 chunk 的映射关系，另一个是 chunk 存在哪一个分片节点的映射关系</li><li>路由节点通过 config 服务器获取数据信息，通过这些信息，找到真正存放数据的分片节点进行对应操作</li><li>路由节点还会在写操作时判断当前 chunk 是否超出限定大小，如果超出，就分列成两个 chunk</li><li>对于按分片 key 进行的查询和 update 操作来说，路由节点会查到具体的 chunk 然后再进行相关的工作</li><li>对于不按分片 key 进行的查询和 update 操作来说，mongos 会对所有下属节点发送请求然后再对返回结果进行合并</li></ul>     <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;更多详细内容请看原文：<a href="http://horicky.blogspot.jp/2012/04/mongodb-architecture.html" target="_blank">MongoDB Architecture</a></p></strong></div><p>&nbsp;</p></div></div></div><img src ="http://www.cppblog.com/guojingjia2006/aggbug/196438.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/guojingjia2006/" target="_blank">小果子</a> 2012-12-19 11:52 <a href="http://www.cppblog.com/guojingjia2006/archive/2012/12/19/196438.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>aio,epoll,libevent,boost::asio解决的问题</title><link>http://www.cppblog.com/guojingjia2006/archive/2012/11/09/194979.html</link><dc:creator>小果子</dc:creator><author>小果子</author><pubDate>Fri, 09 Nov 2012 07:56:00 GMT</pubDate><guid>http://www.cppblog.com/guojingjia2006/archive/2012/11/09/194979.html</guid><wfw:comment>http://www.cppblog.com/guojingjia2006/comments/194979.html</wfw:comment><comments>http://www.cppblog.com/guojingjia2006/archive/2012/11/09/194979.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/guojingjia2006/comments/commentRss/194979.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/guojingjia2006/services/trackbacks/194979.html</trackback:ping><description><![CDATA[<div> 		aio是linux2.6以后内核实现的异步IO，或者说他才是真正意义上的异步IO。<br /> epoll作为select的linux的替代品，解决了selectfd_set的限制。性能优于select。而在max平台上替代方案是kqueue。<br /> libevent是一个跨平台异步解决方案，他根据不同的平台提供了不同的异步方案，采用Reactor模型实现。<br /> Boost::asio是一个跨平台的网络及底层IO的C++<a href="http://www.2cto.com/kf" target="_blank">编程</a>库，实现了对TCP、UDP、ICMP、串口的支持。对于读写方式，ASIO支持同步和异步两种方式。采用了epoll来实现，插入了大量的信号处理。Asio库不需要单独便于，但是测试过程中对boost::system的依赖可能会需要编译部分boost中的库。<br /> muduo采用Reactor模型实现的网络库，只支持<a href="http://www.2cto.com/os/linux/" target="_blank">Linux</a>   2.6.x下的并发非阻塞TCP网络编程，不跨平台，不支持udp和ipv6。吞吐量方面muduo比libevent2快18%，在事件处理效率方 面，muduo与libevent2总体比较接近，muduo吞吐量比boost.asio高15%以上。性能方面作为解决大数据吞吐量很有优势，但是对 平台和网络协议支持方面是一个问题。<br /> ACE也是很经典的网络库，出自《C++网络编程》作者之手，设计精妙程度堪称一流，支持协议范围也很广，但是使用复杂度和学习复杂度较高，一直有&#8220;学我者生，用我者死&#8221;的评价。<br /> 需要注意的是他们的定位不同，aio和epoll主要是对异步提供解决方案不是网络库不提供网络支持，而libevent也是主要解决IO的问题只提供简单的http支持，asio和muduo还有ACE一样是高性能网络库。</div><img src ="http://www.cppblog.com/guojingjia2006/aggbug/194979.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/guojingjia2006/" target="_blank">小果子</a> 2012-11-09 15:56 <a href="http://www.cppblog.com/guojingjia2006/archive/2012/11/09/194979.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Nodejs 入门</title><link>http://www.cppblog.com/guojingjia2006/archive/2012/07/17/183810.html</link><dc:creator>小果子</dc:creator><author>小果子</author><pubDate>Mon, 16 Jul 2012 16:17:00 GMT</pubDate><guid>http://www.cppblog.com/guojingjia2006/archive/2012/07/17/183810.html</guid><wfw:comment>http://www.cppblog.com/guojingjia2006/comments/183810.html</wfw:comment><comments>http://www.cppblog.com/guojingjia2006/archive/2012/07/17/183810.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/guojingjia2006/comments/commentRss/183810.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/guojingjia2006/services/trackbacks/183810.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 关于                       本书致力于教会你如何用Node.js来开发应用，过程中会传授你所有所需的&#8220;高级&#8221;JavaScript知识。本书绝不是一本&#8220;Hello World&#8221;的教程。                             状态                       你正在阅读的已经是本书的最终版。因此，只...&nbsp;&nbsp;<a href='http://www.cppblog.com/guojingjia2006/archive/2012/07/17/183810.html'>阅读全文</a><img src ="http://www.cppblog.com/guojingjia2006/aggbug/183810.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/guojingjia2006/" target="_blank">小果子</a> 2012-07-17 00:17 <a href="http://www.cppblog.com/guojingjia2006/archive/2012/07/17/183810.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>免费的C++图形和游戏库</title><link>http://www.cppblog.com/guojingjia2006/archive/2012/06/15/178934.html</link><dc:creator>小果子</dc:creator><author>小果子</author><pubDate>Fri, 15 Jun 2012 06:29:00 GMT</pubDate><guid>http://www.cppblog.com/guojingjia2006/archive/2012/06/15/178934.html</guid><wfw:comment>http://www.cppblog.com/guojingjia2006/comments/178934.html</wfw:comment><comments>http://www.cppblog.com/guojingjia2006/archive/2012/06/15/178934.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/guojingjia2006/comments/commentRss/178934.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/guojingjia2006/services/trackbacks/178934.html</trackback:ping><description><![CDATA[<div><a style="text-decoration: none;" name="fb_share" type="button_count" href="http://www.facebook.com/sharer.php?u=http%3A%2F%2Fzoomzum.com%2F6-free-c-graphics-and-game-libraries%2F&amp;t=6%20Free%20C%2B%2B%20Graphics%20and%20Game%20Libraries%20%7C%20ZoomZum&amp;src=sp"><span "=""><span fbconnectbutton_small"="" style="cursor:pointer;">Share</span></span></a>       <div style="display:inline;float:left; margin:24px 20px 10px 0px">   </div> 						 						<p>C++ is a multi paradigm, free form complied, general purpose  and thus a very powerful language used basically forthe purpose&nbsp;of  programming. This language is regarded as an&nbsp;intermediatelevel language  .The main reason for this is that it consists of both high level as well  aslow level&nbsp;features.</p> <p>It is one of the most popularprogramming languages&nbsp;due to many  reasons. It has application domains which include system  software,&nbsp;device drivers, application software and many other including  client applications and&nbsp;entertainment software&nbsp;of which the best example  is a video game.</p> <p><a href="http://zoomzum.com/wp-content/uploads/2012/06/C++-Programming.png"><img size-full=""  wp-image-8618"="" title="C++-Programming" src="http://zoomzum.com/wp-content/uploads/2012/06/C++-Programming-e1339530183581.png" alt="" height="380" width="407" /></a></p>  <p>In this list we introduces some highly useful C++ graphics and game  libraries. These libraries has provides a great interface to add these  functionality to their project or application easily. C++ users would  love to use these libraries for their next project.</p> <p>Today we are going to share C++ graphic and games Libraries for  developers, i hope these libraries would help developers a lot in their  next project to make impressive and attractive layout for  theirnest&nbsp;applications. Visit this list and share your thought in  our&nbsp;comment&nbsp;section below.</p>   <h3>1) A<a href="http://www.antigrain.com/index.html" target="_blank">ntigrain</a></h3> <p>Anti-Grain&nbsp;Geometry&nbsp;(AGG) is an Open Source, free of charge graphic  library, written in industrially standard&nbsp;C++. The terms and conditions  of use&nbsp;AGG&nbsp;are described on&nbsp;The License&nbsp;page.&nbsp;AGG&nbsp;doesn&#8217;t depend on any  graphic API or technology. Basically, you can think of&nbsp;AGG&nbsp;as of a  rendering engine that produces pixel images in memory from some  vectorial data.</p> <p><a href="http://zoomzum.com/wp-content/uploads/2012/06/antigrain.png"><img size-full=""  wp-image-8610"="" title="antigrain" src="http://zoomzum.com/wp-content/uploads/2012/06/antigrain-e1339525678913.png" alt="" height="352" width="580" /></a></p> <h3>2)&nbsp;<a href="http://www.amanith.org/project.html" target="_blank">Amanith</a></h3> <p><strong>AmanithVG SRE</strong>&nbsp;is a pure  software solution that grants a superlative vector graphics quality  without to sacrifice performance on any kind of architecture / platform.  Thanks to its original polygon rasterization algorithm and dedicated  optimized scanline fillers, this engine constitues the fastest OpenVG  software rendering solution available on the market.</p> <p><a href="http://zoomzum.com/wp-content/uploads/2012/06/amanith.png"><img size-full=""  wp-image-8611"="" title="amanith" src="http://zoomzum.com/wp-content/uploads/2012/06/amanith-e1339526279685.png" alt="" height="352" width="580" /></a></p> <h3>3)&nbsp;<a href="http://www.codehead.co.uk/cbfg/" target="_blank">Codehead</a></h3> <p><a href="http://zoomzum.com/wp-content/uploads/2012/06/codehead.png"><img size-full=""  wp-image-8612"="" title="codehead" src="http://zoomzum.com/wp-content/uploads/2012/06/codehead-e1339526688721.png" alt="" height="352" width="580" /></a></p> <h3>4)&nbsp;<a href="http://www.oscilloscope-lib.com/" target="_blank">Oscilloscope Lib</a></h3> <p><a href="http://zoomzum.com/wp-content/uploads/2012/06/lib.png"><img size-full=""  wp-image-8613"="" title="lib" src="http://zoomzum.com/wp-content/uploads/2012/06/lib-e1339527087595.png" alt="" height="352" width="580" /></a></p> <h3>5)&nbsp;<a href="http://www.libsdl.org/" target="_blank">Lib SDL</a></h3> <p>Simple DirectMedia Layer is a  cross-platform multimedia library designed to provide low level access  to audio, keyboard, mouse, joystick, 3D hardware via OpenGL, and 2D  video framebuffer. It is used by MPEG playback software, emulators, and  many popular games, including the award winning Linux port of  &#8220;Civilization: Call To Power.&#8221;</p> <p><a href="http://zoomzum.com/wp-content/uploads/2012/06/libsdl.png"><img size-full=""  wp-image-8614"="" title="libsdl" src="http://zoomzum.com/wp-content/uploads/2012/06/libsdl-e1339527400685.png" alt="" height="352" width="580" /></a></p> <h3>6)&nbsp;<a href="http://www.ogre3d.org/" target="_blank">Ogre 3d</a></h3> <p>OGRE (<strong>O</strong>bject-Oriented&nbsp;<strong>G</strong>raphics&nbsp;<strong>R</strong>endering&nbsp;<strong>E</strong>ngine)  is a scene-oriented, flexible 3D engine written in C++ designed to make  it easier and more intuitive for developers to produce applications  utilising hardware-accelerated 3D graphics. The class library abstracts  all the details of using the underlying system libraries like Direct3D  and OpenGL and provides an interface based on world objects and other  intuitive classes.</p> <p><a href="http://zoomzum.com/wp-content/uploads/2012/06/ogre3d.png"><img size-full=""  wp-image-8615"="" title="ogre3d" src="http://zoomzum.com/wp-content/uploads/2012/06/ogre3d-e1339528030232.png" alt="" height="352" width="580" /></a></p><p>转自:<div>http://zoomzum.com/6-free-c-graphics-and-game-libraries/</div><br /><a href="http://zoomzum.com/wp-content/uploads/2012/06/ogre3d.png"></a></p></div><img src ="http://www.cppblog.com/guojingjia2006/aggbug/178934.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/guojingjia2006/" target="_blank">小果子</a> 2012-06-15 14:29 <a href="http://www.cppblog.com/guojingjia2006/archive/2012/06/15/178934.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Android 自动接听来电 </title><link>http://www.cppblog.com/guojingjia2006/archive/2012/06/07/177946.html</link><dc:creator>小果子</dc:creator><author>小果子</author><pubDate>Thu, 07 Jun 2012 09:20:00 GMT</pubDate><guid>http://www.cppblog.com/guojingjia2006/archive/2012/06/07/177946.html</guid><wfw:comment>http://www.cppblog.com/guojingjia2006/comments/177946.html</wfw:comment><comments>http://www.cppblog.com/guojingjia2006/archive/2012/06/07/177946.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/guojingjia2006/comments/commentRss/177946.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/guojingjia2006/services/trackbacks/177946.html</trackback:ping><description><![CDATA[<div><p>网上找到的,HTC One X,三星i9000 cm9 4.0.4测试通过,在此记录一下，大伙需要的话就拿去吧..</p> <p><br /> </p> <p>1. Android 2.3(不包括)以下，通过获取aidl远程服务接口TelephoneyManager来调用它的answerRingingCall方法(ps: 关于此方法具体做法，由于时间关系，我这里就不详细说啦，大家Google一下吧)</p>  <div bg_java"=""><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TelephonyManager&nbsp;tm&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;(TelephonyManager)&nbsp;getSystemService(TELEPHONY_SERVICE);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Class&nbsp;c&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;Class.forName(tm.getClass().getName());<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Method&nbsp;m&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;c.getDeclaredMethod(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">getITelephony</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m.setAccessible(</span><span style="color: #0000FF; ">true</span><span style="color: #000000; ">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ITelephony&nbsp;telephonyService;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;telephonyService&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;(ITelephony)&nbsp;m.invoke(tm);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;Silence&nbsp;the&nbsp;ringer&nbsp;and&nbsp;answer&nbsp;the&nbsp;call!</span><span style="color: #008000; "><br /></span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;telephonyService.silenceRinger();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;telephonyService.answerRingingCall();</span></div></div><br /> <br />  <p><br /> </p> <p>2. Android  2.3(包括)以上，如果照样使用TelephoneyManager获取到的answerRingingCall方法的话，就会抛没有 android.permission.MODIFY_PHONE_STATE权限异常，其实你已经配了这个权限的了，但是不好意思，你的App不是系统 软件，没有系统签名，所以还是不能调用，除非，你root了你的手机，把你的app装到系统软件里面去，所以这里使用另外一种方法实现自动接听这个行为 了，详细如下:</p> <p>刚开始我用这段代码的，发现三星机型可以，但HTC(如: G10 , One X)不行，</p> <div bg_java"=""><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000; ">&nbsp;Intent&nbsp;intent&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;Intent(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">android.intent.action.MEDIA_BUTTON</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br />&nbsp;KeyEvent&nbsp;keyEvent&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;KeyEvent(KeyEvent.ACTION_DOWN,&nbsp;&nbsp;KeyEvent.KEYCODE_HEADSETHOOK);<br />&nbsp;intent.putExtra(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">android.intent.extra.KEY_EVENT</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,keyEvent);<br />&nbsp;sendOrderedBroadcast(intent,</span><span style="color: #000000; ">"</span><span style="color: #000000; ">android.permission.CALL_PRIVILEGED</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br />&nbsp;intent&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;&nbsp;Intent(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">android.intent.action.MEDIA_BUTTON</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br />&nbsp;keyEvent&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;KeyEvent(KeyEvent.ACTION_UP,&nbsp;KeyEvent.KEYCODE_HEADSETHOOK);<br />&nbsp;intent.putExtra(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">android.intent.extra.KEY_EVENT</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,keyEvent);<br />&nbsp;sendOrderedBroadcast(intent,</span><span style="color: #000000; ">"</span><span style="color: #000000; ">android.permission.CALL_PRIVILEGED</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);</span></div></div><br />  <br /> <br />  <p>后来又google到了这段代码，经过测试，完全好使..</p><br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000; ">Intent&nbsp;localIntent1&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;Intent(Intent.ACTION_HEADSET_PLUG);<br />localIntent1.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);<br />localIntent1.putExtra(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">state</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">1</span><span style="color: #000000; ">);<br />localIntent1.putExtra(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">microphone</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">1</span><span style="color: #000000; ">);<br />localIntent1.putExtra(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">name</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">Headset</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br />CallingActivity.</span><span style="color: #0000FF; ">this</span><span style="color: #000000; ">.sendOrderedBroadcast(localIntent1,</span><span style="color: #000000; ">"</span><span style="color: #000000; ">android.permission.CALL_PRIVILEGED</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br /><br />Intent&nbsp;localIntent2&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;Intent(Intent.ACTION_MEDIA_BUTTON);<br />KeyEvent&nbsp;localKeyEvent1&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;KeyEvent(KeyEvent.ACTION_DOWN,KeyEvent.KEYCODE_HEADSETHOOK);<br />localIntent2.putExtra(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">android.intent.extra.KEY_EVENT</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,localKeyEvent1);<br />CallingActivity.</span><span style="color: #0000FF; ">this</span><span style="color: #000000; ">.sendOrderedBroadcast(localIntent2,</span><span style="color: #000000; ">"</span><span style="color: #000000; ">android.permission.CALL_PRIVILEGED</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br /><br />Intent&nbsp;localIntent3&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;Intent(Intent.ACTION_MEDIA_BUTTON);<br />KeyEvent&nbsp;localKeyEvent2&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;KeyEvent(KeyEvent.ACTION_UP,KeyEvent.KEYCODE_HEADSETHOOK);<br />localIntent3.putExtra(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">android.intent.extra.KEY_EVENT</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,localKeyEvent2);<br />CallingActivity.</span><span style="color: #0000FF; ">this</span><span style="color: #000000; ">.sendOrderedBroadcast(localIntent3,</span><span style="color: #000000; ">"</span><span style="color: #000000; ">android.permission.CALL_PRIVILEGED</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br /><br />Intent&nbsp;localIntent4&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;Intent(Intent.ACTION_HEADSET_PLUG);<br />localIntent4.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);<br />localIntent4.putExtra(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">state</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">);<br />localIntent4.putExtra(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">microphone</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">1</span><span style="color: #000000; ">);<br />localIntent4.putExtra(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">name</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">Headset</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br />CallingActivity.</span><span style="color: #0000FF; ">this</span><span style="color: #000000; ">.sendOrderedBroadcast(localIntent4,</span><span style="color: #000000; ">"</span><span style="color: #000000; ">android.permission.CALL_PRIVILEGED</span><span style="color: #000000; ">"</span><span style="color: #000000;">);</span></div></div><img src ="http://www.cppblog.com/guojingjia2006/aggbug/177946.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/guojingjia2006/" target="_blank">小果子</a> 2012-06-07 17:20 <a href="http://www.cppblog.com/guojingjia2006/archive/2012/06/07/177946.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ndk</title><link>http://www.cppblog.com/guojingjia2006/archive/2012/05/05/173741.html</link><dc:creator>小果子</dc:creator><author>小果子</author><pubDate>Sat, 05 May 2012 07:02:00 GMT</pubDate><guid>http://www.cppblog.com/guojingjia2006/archive/2012/05/05/173741.html</guid><wfw:comment>http://www.cppblog.com/guojingjia2006/comments/173741.html</wfw:comment><comments>http://www.cppblog.com/guojingjia2006/archive/2012/05/05/173741.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/guojingjia2006/comments/commentRss/173741.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/guojingjia2006/services/trackbacks/173741.html</trackback:ping><description><![CDATA[<div>ffmpeg&nbsp; =&gt; http://abitno.me/compile-ffmpeg-android-ndk<br /><div>http://hi.baidu.com/lizhengjun2010/blog/item/08b7fb1b79dc9befe1fe0b09.html</div></div><img src ="http://www.cppblog.com/guojingjia2006/aggbug/173741.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/guojingjia2006/" target="_blank">小果子</a> 2012-05-05 15:02 <a href="http://www.cppblog.com/guojingjia2006/archive/2012/05/05/173741.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>phpunit</title><link>http://www.cppblog.com/guojingjia2006/archive/2012/05/04/173650.html</link><dc:creator>小果子</dc:creator><author>小果子</author><pubDate>Fri, 04 May 2012 03:39:00 GMT</pubDate><guid>http://www.cppblog.com/guojingjia2006/archive/2012/05/04/173650.html</guid><wfw:comment>http://www.cppblog.com/guojingjia2006/comments/173650.html</wfw:comment><comments>http://www.cppblog.com/guojingjia2006/archive/2012/05/04/173650.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/guojingjia2006/comments/commentRss/173650.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/guojingjia2006/services/trackbacks/173650.html</trackback:ping><description><![CDATA[<div><p><span style="font-size:16px">最近研究php的单元测试功能，在centos下和widows下安装了phpunit</span></p><p><span style="font-size:16px">首先要保证你装的php中安装了pear</span></p><p><span style="font-size:16px">linux下输入命令pear 回车可看一下是否安装了</span></p><p><span style="font-size:16px">windows下可以用dos进入到php的安装目录 ，输入命令pear 回车可看一下是否安装了&nbsp;</span></p><p><span style="font-size:16px">在默认情况下php中都会安装的</span></p><p><strong><span style="font-size:16px">pear的安装</span></strong></p><p><span style="font-size:16px">wwindows下用dos进入php的安装根目录 &nbsp;运行go-pear，r然后输入两次yes 然后 后边的选项直接用回车</span><img src="http://hiphotos.baidu.com/1024114660/pic/item/211bcaf50675a637ddc4749f.jpg" border="0"  alt="" /></p><p><span style="font-size:16px">然后我们要添加Channel</span></p><p><span style="font-size:16px">pear channel-discover pear.phpunit.de</span></p><p><span style="font-size:16px">pear channel-discover components.ez.no</span></p><p><span style="font-size:16px">pear channel-discover pear.symfony-project.com</span></p><p><img src="http://hiphotos.baidu.com/1024114660/pic/item/bc4ae4a5c5a602ae9052ee85.jpg" border="0"  alt="" /><br /><span style="font-size:16px">我在这个地方遇到了&nbsp;.lock 访问权限的错误而安装失败，这是我们可以在PEAR文件夹下删除此文件</span></p><p><span style="font-size:16px">接下来执行pear install phpunit/PHPUnit，此时我遇到了下图所示的问题，包依赖</span></p><p><span style="font-size:16px">很简单 我们把这些包用pear install命令安装了 即可</span></p><p><img src="http://hiphotos.baidu.com/1024114660/pic/item/4f3e7534c47c89d2a61e1286.jpg" border="0"  alt="" /></p><p><img src="http://hiphotos.baidu.com/1024114660/pic/item/8a31ce54f091e09db745ae80.jpg" border="0"  alt="" /></p><p><span style="font-size:16px">可能执行完这个之后你的phpunit还是提示安装失败</span></p><p><img src="http://hiphotos.baidu.com/1024114660/pic/item/b234530bcebc2e4694ca6b2a.jpg" border="0"  alt="" /></p><p><span style="font-size:16px">它提示我们要更新pear包</span></p><p><span style="font-size:16px">pear upgrade-all&nbsp;</span></p><p><span style="font-size:16px">按照提示操作，可能会提示你更新Channel，那么更新即可</span></p><p><img src="http://hiphotos.baidu.com/1024114660/pic/item/def524ff7938b0685c60081d.jpg" border="0"  alt="" /></p><p><span style="font-size:16px">此时在执行pear install phpunit/PHPUnit 可以看到提示安装成功了</span><img src="http://img.baidu.com/hi/jx2/j_0058.gif"  alt="" /></p><p><img src="http://hiphotos.baidu.com/1024114660/pic/item/ec302d25db86a5584c088d1f.jpg" border="0"  alt="" /><img src="http://hiphotos.baidu.com/1024114660/pic/item/4b996d002929625f1d958319.jpg" border="0"  alt="" /><br /><br /><span style="font-size:16px">我们会发现在PEAR目录下多了PHPUnit 这表明安装成功，另外在安装pear的时候回修改php.ini文件</span></p><p><span style="font-size:16px">;***** Added by go-pear</span></p><p><span style="font-size:16px">include_path=".;E:\webserver\php\pear"</span></p><p><span style="font-size:16px">;*****</span></p><p><span style="font-size:16px">小提示：直接输入pear可现实pear命令下的所有选项</span></p><p><span style="line-height: 28px;">phpunit 使用手册&nbsp;</span><a href="http://www.phpunit.de/manual/3.5/en/index.html">http://www.phpunit.de/manual/3.5/en/index.html</a></p></div><img src ="http://www.cppblog.com/guojingjia2006/aggbug/173650.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/guojingjia2006/" target="_blank">小果子</a> 2012-05-04 11:39 <a href="http://www.cppblog.com/guojingjia2006/archive/2012/05/04/173650.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>yii 路由</title><link>http://www.cppblog.com/guojingjia2006/archive/2012/03/20/168433.html</link><dc:creator>小果子</dc:creator><author>小果子</author><pubDate>Tue, 20 Mar 2012 12:59:00 GMT</pubDate><guid>http://www.cppblog.com/guojingjia2006/archive/2012/03/20/168433.html</guid><wfw:comment>http://www.cppblog.com/guojingjia2006/comments/168433.html</wfw:comment><comments>http://www.cppblog.com/guojingjia2006/archive/2012/03/20/168433.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/guojingjia2006/comments/commentRss/168433.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/guojingjia2006/services/trackbacks/168433.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 分类：             YII               2011-11-21 16:57     737人阅读     评论(0)     收藏     举报                   &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;http://www.localyii.com/testwebap/index.php?r=testmod/default/i...&nbsp;&nbsp;<a href='http://www.cppblog.com/guojingjia2006/archive/2012/03/20/168433.html'>阅读全文</a><img src ="http://www.cppblog.com/guojingjia2006/aggbug/168433.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/guojingjia2006/" target="_blank">小果子</a> 2012-03-20 20:59 <a href="http://www.cppblog.com/guojingjia2006/archive/2012/03/20/168433.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>开源项目潜力无限 OpenStack全面爆发</title><link>http://www.cppblog.com/guojingjia2006/archive/2012/01/04/163551.html</link><dc:creator>小果子</dc:creator><author>小果子</author><pubDate>Wed, 04 Jan 2012 07:47:00 GMT</pubDate><guid>http://www.cppblog.com/guojingjia2006/archive/2012/01/04/163551.html</guid><wfw:comment>http://www.cppblog.com/guojingjia2006/comments/163551.html</wfw:comment><comments>http://www.cppblog.com/guojingjia2006/archive/2012/01/04/163551.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/guojingjia2006/comments/commentRss/163551.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/guojingjia2006/services/trackbacks/163551.html</trackback:ping><description><![CDATA[<p>如果一切按计划进行，红帽(Red Hat)将成为第一家年收入超过10亿美元的开源软件厂商。这对于开源软件社区将是一个转折点。开源软件社区一直认为他们基于社区的开发方法是可行的、甚至是优越的、可替代传统的软件的开发方式。</p>
<p>红帽CEO吉姆&#183;怀特赫斯特(Jim Whitehurst)称，我认为，我们将看到产生技术创新的地方将发生一个根本的转变，从几家软件公司的实验室转向庞大的开源软件的努力。</p>
<p>随着Linux、Apache Web server、Perl、Apache、Hadoop、OpenOffice、GIMP和几十个其它的开源软件计划给商业性软件带来更大的压力，开源软件在过去的几年里肯定给专有软件世界带来了混乱。但是，明天的开源软件的重量级产品是什么？下面是在2012年需要密切关注的五个项目。这些项目可能构成新的业务和新的行业的基础。这些项目也可能是仅仅因为能够更容易地或者更廉价地完成任务而受到了开发者和管理者的关注。</p>
<p><strong>1.Nginx</strong></p>
<p>在过去10年的大部分时间里，Web服务器软件的选择一直是稳定的。Apache一直在大多数Web服务器上应用，而微软的IIS(互联网信息服务)用于许多其它的服务器。然而，在过去的几年里，第三个进入这个市场的Nginx的应用一直在增长，因为这个软件能够轻松处理高容量的通讯。</p>
<p>据Nginx软件开发人员预测，Nginx目前已经在5000万个不同的互联网域名上运行，大约占整个互联网的10%。Nginx特别广泛地应用于通讯量非常大的网站，如Facebook、Zappos、Groupon、Hulu、Dropbox和WordPress。毫不奇怪，这个软件的创建者伊戈尔&#183;西索夫(Igor Sysoev)在2004年设计Nginx软件的时候就是专门为处理大量同时使用网络的用户设计的，每台服务器最多有1万个连接。该公司共同创始人安德鲁&#183;阿莱克谢耶夫(Andrew Alexeev)称，这是一个非常精细的架构。Nginx公司提供商业版本的Nginx软件。</p>
<p>即将到来的一年将是Nginx的一个好年景。Nginx去年从一些风险投资公司那里获得了300万美元，其中包括戴尔CEO迈克尔&#183;戴尔(Michael Dell)支持的风险投资公司。Nginx与Jet-Stream合作为软件厂商的CDN(内容交付网络)软件包提供Nginx软件。该公司还与亚马逊合作为AWS(亚马逊Web服务)云服务优化Nginx软件。</p>
<p>除了用于大型网站运营之外，阿莱克谢耶夫预计Nginx将更广泛地用于新兴的云计算和共享的服务市场。他说，预计在明年推出的Nginx软件的下一个重要的发布版将更适合共享的托管环境。这个软件将能够更好地应对分布式拒绝服务攻击并且将配置额外的安全功能。</p>
<p><strong>2.OpenStack</strong></p>
<p>OpenStack项目进入云计算领域的时间比较晚。但是，这个项目有一个不可缺少的功能：可伸缩性。</p>
<p>OpenStack项目政策委员会主席乔纳森&#183;布赖斯(Jonathan Bryce)称，我们正在谈论使用OpenStack运行一个拥有100台服务器或者1000台服务器的云。那里的其它选择确实没有考虑到这个规模。</p>
<p>自从2010年推出以来，OpenStack迅速赢得了惠普、英特尔和戴尔等云计算领域的IT公司的支持。OpenStack的贡献者喜欢把自己的工作称作增长速度最快的开源软件项目，参加者包括144家公司和2100多人。戴尔推出一个名为戴尔OpenStack云解决方案的软件包，把OpenStack与戴尔自己的服务器和软件结合在了一起。惠普也推出一个采用这个技术的测试版的公共云服务。</p>
<p>OpenStack的核心的计算组件是在美国航天局艾姆斯研究中心(Ames Research Center)为存储大量空间图片的一个内部云开发的。据曾经负责开发OpenStack云控制器前艾姆斯研究中心CIO克里斯&#183;坎普(Chris Kemp)称，美国航天局管理人员原来试图使用Eucalyptus软件项目平台，但是，发现这个软件很难升级到需要的水平。</p>
<p>管理的托管提供商Rackspace的首席技术官约翰&#183;安格斯(John Engates)说，为了帮助更广泛地应用，OpenStack正在配置许多新的功能，使这个软件更适合企业应用。一个名为&#8220;Keystone&#8221;的项目允许机构把OpenStack与自己的身份管理系统结合起来，或者与基于微软主动目录或者其它LDAP(轻型目录访问协议)的身份管理系统结合起来。此外，开发人员也正在为这个软件开发一个前端门户。Rackspace还将把这个项目剥离为一个完全独立的实体，希望它成为更多的云提供商的一个诱人的选择。</p>
<p>安格斯称，2011年将是这个产品打基础的一年。但是，我认为，2012年我们将真正开始利用这个基础在许多私有云和公共云中使用。</p>
<p><strong>3.Stig</strong></p>
<p>过去的一年是Cassandra、MongoDB、CouchDB和无数其它非关系数据库的应用显著增长的一年。但是，在9月份举行的&#8220;NoSQL Now&#8221;会议上，人们更多谈论的是尚未发布的数据存储Stig。如果幸运的话，我们将在2012年看到Stig。</p>
<p>Stig的维护者称，Stig是为社交网络网站的独特的工作量设计的。Stig是社交网络网站Tagged的软件工程师杰森&#183;卢卡斯(Jason Lucas)创建的。他把这个技术称作分布式图表数据库。Stig旨在支持大量互动的和社交网络应用。这个数据商店的架构允许进行推论性的搜索，允许用户和应用程序查找信息的不同部分的联系。由于Stig是用Haskell功能编程语言编写的，它能够轻松地把自己的工作量分散到多台服务器。</p>
<p>Stig仍然有一些神秘感，因为它到目前为止还没有发布。但是，观察人士预测，它适合社交网络和其它保持广泛的数据的应用。卢卡斯解释说，社交网络的需求从一开始就与其它类型的工作不同，因此将受益于适合它需求的数据库。如果不能升级到行星的规模，你在这个领域就不能成为一个相关的服务。</p>
<p>Stig目前在Tagged网站的一台服务器上运行，不过，该公司预计将把Stig扩大应用为该公司唯一的数据库。开发人员原计划在12月开放这个软件的源代码，但是，后来推迟到2012年的某个时候。</p>
<p>咨询公司Kelly-McCreary &amp; Associates的语义解决方案设计师丹&#183;麦克里(Dan McCreary)说，我看到的情况是非常有趣的。他赞扬这个数据库的功能语言架构。这个架构将使这个数据库在多台服务器上部署更方便。</p>
<p><strong>4.Linux Mint</strong></p>
<p>尽管开源软件支持者的多年宣传，Linux从来没有广泛应用于台式电脑。但是，一直有一个用户友好的Linux发布版作为替代微软Windows的软件在使用。在最近几年，Canonical公司的Ubuntu已经完成了自己的任务，尽管日益流行的Linux Min也许会因为更容易使用而超过Ubuntu。</p>
<p>软件工程师克莱门特&#183;勒费布尔(Clement Lefebvre)在评估了在线论坛中的各种Linux发布版之后首先创建了Linux Mint。勒费布尔在这个工作中产生了在这个理想的发布版中应该有什么功能的想法。就像Canonical为自己非常流行的Ubuntu感谢Debian Linux发布版一样，勒费布尔把Ubuntu作为Linux Mint的基础。现在，Linux Mint项目得到了捐献者的资金、自己网站的广告收入和来自用户搜索的收入。最后一项收入是通过与DuckDuckGo建立的一个有争议的合作实现的。</p>
<p>Linux Mint是仅需要桌面操作系统而不想了解更多的Linux工作原理的用户设计的。这个方法使安装和运行这个软件非常容易，维护也不成问题。更胜过Ubuntu的是，Linux Mint强调轻松的使用性，在新功能证明自己值得使用之前，一般不使用新的功能。</p>
<p>例如，Linux Mint避开有些争议的&#8220;Unity&#8221;桌面界面。Canonical应用这个界面更轻松地把Ubuntu移植到移动平台。相反，Linux Mint坚持使用更知名的和更成熟的Gnome界面。</p>
<p>事实上，由于Ubuntu的伤害，这种严格坚持可用性的做法也许有助于Linux Mint。Linux Mint称它的操作系统是全球排名第四位的桌面操作系统，仅次于Windows、苹果Mac和Ubuntu。在过去的一年里，Linux Mint在DistroWatch Linux新闻网站产生的网页浏览量甚至超过了Ubuntu。这个指标反映了Linux发布版的流行程度。毫无疑问，2012年将看到Linux Mint更多的增长。</p>
<p><strong>5. Gluster</strong></p>
<p>红帽能够给存储软件领域带来它曾给Unix操作系统市场带来的那种革命性的变化吗?今年10月，红帽收购了开源软件公司Gluster。这家公司制作的开源软件GlusterFS且文件系统能够把商品化SATA(串行高级技术附件)硬盘和NAS(网络附加存储)系统连接到大规模的可伸缩的存储池。红帽计划使用它占领Linux操作系统市场的方法统治存储领域。</p>
<p>据红帽CEO吉姆&#183;怀特赫斯特称，存储软件市场每年收入达40亿美元，不过，这不是红帽对这个技术感兴趣的原因。相反，红帽感兴趣的是找到一种能够使云迁移更方便的存储技术。他说，我们寻找一些开源软件能够作为更强大的技术创新的方式的地方。我们正在寻找一些能够盈利的地方。在这方面，还没有其它的解决方案。</p>
<p>这个软件已经有一些增长势头，至少在管理员下载和测试这个软件方面是如此。在过去的一年里，GlusterFS的下载量增长了300%。在今年11月，这个软件的下载次数超过了3.7万次。</p><img src ="http://www.cppblog.com/guojingjia2006/aggbug/163551.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/guojingjia2006/" target="_blank">小果子</a> 2012-01-04 15:47 <a href="http://www.cppblog.com/guojingjia2006/archive/2012/01/04/163551.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>YII</title><link>http://www.cppblog.com/guojingjia2006/archive/2011/12/02/161321.html</link><dc:creator>小果子</dc:creator><author>小果子</author><pubDate>Fri, 02 Dec 2011 05:16:00 GMT</pubDate><guid>http://www.cppblog.com/guojingjia2006/archive/2011/12/02/161321.html</guid><wfw:comment>http://www.cppblog.com/guojingjia2006/comments/161321.html</wfw:comment><comments>http://www.cppblog.com/guojingjia2006/archive/2011/12/02/161321.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/guojingjia2006/comments/commentRss/161321.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/guojingjia2006/services/trackbacks/161321.html</trackback:ping><description><![CDATA[<a href="http://www.yiiframework.com/">http://www.yiiframework.com/</a><br /><a href="http://www.yiiframework.com/doc/guide/1.1/zh_cn/quickstart.what-is-yii">http://www.yiiframework.com/doc/guide/1.1/zh_cn/quickstart.what-is-yii</a><br /><a href="http://yp.oss.org.cn/blog/show_resource.php?resource_id=774">http://yp.oss.org.cn/blog/show_resource.php?resource_id=774</a><br /><a href="http://www.yiieye.com/book_cn/">http://www.yiieye.com/book_cn/</a><br /><a href="http://blog.csdn.net/dxxgiupel/article/details/5803864">http://blog.csdn.net/dxxgiupel/article/details/5803864</a><br /><a href="http://wenku.baidu.com/view/7d7d65ecaeaad1f346933fb5.html">http://wenku.baidu.com/view/7d7d65ecaeaad1f346933fb5.html</a><br />
<div>http://www.yiichina.org/news/43/<br /><br /><a href="http://blog.csdn.net/hy840429/article/details/5415218">http://blog.csdn.net/hy840429/article/details/5415218</a></div><img src ="http://www.cppblog.com/guojingjia2006/aggbug/161321.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/guojingjia2006/" target="_blank">小果子</a> 2011-12-02 13:16 <a href="http://www.cppblog.com/guojingjia2006/archive/2011/12/02/161321.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>常用链接</title><link>http://www.cppblog.com/guojingjia2006/archive/2010/08/12/123165.html</link><dc:creator>小果子</dc:creator><author>小果子</author><pubDate>Thu, 12 Aug 2010 03:56:00 GMT</pubDate><guid>http://www.cppblog.com/guojingjia2006/archive/2010/08/12/123165.html</guid><wfw:comment>http://www.cppblog.com/guojingjia2006/comments/123165.html</wfw:comment><comments>http://www.cppblog.com/guojingjia2006/archive/2010/08/12/123165.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/guojingjia2006/comments/commentRss/123165.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/guojingjia2006/services/trackbacks/123165.html</trackback:ping><description><![CDATA[linux内核:<a href="http://www.kernel.org/pub/linux/kernel/v2.6/">http://www.kernel.org/pub/linux/kernel/v2.6/</a><br>STLPort:<a  href="http://sourceforge.net/projects/stlport/">http://sourceforge.net/projects/stlport/</a><br><br> <img src ="http://www.cppblog.com/guojingjia2006/aggbug/123165.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/guojingjia2006/" target="_blank">小果子</a> 2010-08-12 11:56 <a href="http://www.cppblog.com/guojingjia2006/archive/2010/08/12/123165.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>sun java 环境变量(转)</title><link>http://www.cppblog.com/guojingjia2006/archive/2010/08/11/123070.html</link><dc:creator>小果子</dc:creator><author>小果子</author><pubDate>Wed, 11 Aug 2010 07:27:00 GMT</pubDate><guid>http://www.cppblog.com/guojingjia2006/archive/2010/08/11/123070.html</guid><wfw:comment>http://www.cppblog.com/guojingjia2006/comments/123070.html</wfw:comment><comments>http://www.cppblog.com/guojingjia2006/archive/2010/08/11/123070.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/guojingjia2006/comments/commentRss/123070.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/guojingjia2006/services/trackbacks/123070.html</trackback:ping><description><![CDATA[安装jdk，可以选择源方式安装和手动安装，这里我两种方法都说下。
<p>方案一：通过源安装</p>
<p>1、安装</p>
<p>打开终端，执行以下命令，或使用Adept/新立得软件管理器，在其中分别搜索"sun-java6-jre"和"sun-java6-jdk"并
标记安装。</p>
<p>$ sudo apt-get install sun-java6-jdk</p>
<p>提示：安装过程中需要你回答是否同意使用协议（终端中红蓝色的提示界面），此时按tab键至OK，再按回车即可正常安装。</p>
<p>设置当前默认的java编译器：</p>
<p>$ sudo update-alternatives --config java</p>
<p>a、如果你的系统上预装有openjdk，将出现如下显示的信息：</p>
<p>现有 2 个可选项，它们都提供了&#8220;java&#8221;&lt;<br>
<br>
&nbsp;&nbsp;&nbsp; 选择&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 可选项<br>
-----------------------------------------------<br>
&nbsp;+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1&nbsp;&nbsp;&nbsp; /usr/lib/jvm/java-6-openjdk/jre/bin/java<br>
*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; 2&nbsp;&nbsp;&nbsp; /usr/lib/jvm/java-6-sun/jre/bin/java<br>
<br>
要维持缺省值[*]，按回车键，或者键入选择的编号：</p>
<p>输入 有包含 "sun" 的行的前面的数字。如上面显示，则输入2，然后回车确定。</p>
<p>b、如果你系统没有java环境，则出现如下显示信息：</p>
<p>只有一个程序提供 java<br>
（/usr/lib/jvm/java-6-openjdk/jre/bin/java）。无须做任何配置。</p>
<p>&nbsp;</p>
<p>$ sudo update-alternatives --config javac</p>
<p>a、如果你的系统上预装有openjdk，将出现如下显示的信息：</p>
<p>现有 2 个可选项，它们都提供了&#8220;javac&#8221;&lt;<br>
<br>
&nbsp;&nbsp;&nbsp; 选择&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 可选项<br>
-----------------------------------------------<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1&nbsp;&nbsp;&nbsp; /usr/lib/jvm/java-6-sun/bin/javac<br>
*+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2 &nbsp;&nbsp; /usr/bin/gcj-wrapper-4.3<br>
<br>
要维持缺省值[*]，按回车键，或者键入选择的编号：</p>
<p>输入 有包含 "sun" 的行的前面的数字。如上面显示，则输入1，然后回车确定。</p>
<p>b、如果你系统没有java环境，则出现如下显示信息：</p>
<p>只有一个程序提供 java<br>
（/usr/bin/gcj-wrapper-4.3）。无须做任何配置。</p>
<p>&nbsp;</p>
<p>2、配置java环境变量</p>
<p>$ sudo gedit /etc/environment</p>
<p><br>
在其中添加如下两行：<br>
----------------------------------------------------------------------------<br>
CLASSPATH=.:/usr/lib/jvm/java-6-sun/lib<br>
JAVA_HOME=/usr/lib/jvm/java-6-sun</p>
<p>------------------------------------------------------------------------------</p>
2、安装
<p>将下载下来的bin文件复制到/opt目录下（假设你下载后的bin文件放在/home/yourname下）， 终端执行：<br>
<br>
$ sudo cp /home/yourname/jdk-6u13-linux-i586.bin /opt 。<br>
<br>
安装执行：<br>
<br>
$ sudo /opt/jdk-6u13-linux-i586.bin 。<br>
<br>
安装过程中会提示是否同意协议，按下q退出浏览，然后输入"yes"，等安装完毕后会自动在/opt<br>
<br>
文件夹下创建一个jdk1.6.0_13的文件夹，安装的文件都放在该目录下。</p><img src ="http://www.cppblog.com/guojingjia2006/aggbug/123070.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/guojingjia2006/" target="_blank">小果子</a> 2010-08-11 15:27 <a href="http://www.cppblog.com/guojingjia2006/archive/2010/08/11/123070.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>