[?]|登录|免费注册®
高级...

浏览选项

  • 手机网站排名
  • 手机网用户圈
  • UA设置:(默认)
  • 设置浏览参数
  • 重新下载页面

[+](无标题)

?博客园_首页代码改变世界uuid:a43c6e56-9b52-42f9-a7d1-ee0600f885f7;id=53462014-08-22T21:05:55Zfeed.cnblogs.comhttp://www.cnblogs.com/edisonchou/p/3930414.html走向面试之经典的数据库基础:二、SQL进阶之case、子查询、分页、join与视图 - Edison Chou一、CASE的两种用法1.1等值判断->相当于switch case (1)具体用法模板: CASE expression WHEN value1 THEN returnvalue1 WHEN value2 THEN returnvalue2 WHEN valu...2014-08-22T18:00:00Z2014-08-22T18:00:00ZEdison Chouhttp://www.cnblogs.com/edisonchou/<p><strong>一、CASE的两种用法</strong></p><p><strong>1.1&nbsp;等值判断-&gt;相当于switch case</strong></p><p>  (1)具体用法模板:</p><p>    CASE <strong>expression</strong></p><p>&nbsp;      WHEN <strong>value1</strong> THEN returnvalue1</p><p>&nbsp;      WHEN <strong>value2</strong> THEN returnvalue2</p><p>&nbsp;      WHEN <strong>value3</strong> THEN returnvalue3</p><p>      &nbsp;ELSE defaultreturnvalue</p><p>    END&nbsp;</p><p>  (2)具体使用示例:</p><p>  假设我们有一个论坛网站,其中有一张User表{ UId,Name,Level },Level是一个int类型,代表了用户等级类型,例如:1代表骨灰,2代表大虾等;我们就可以用CASE来对其进行等值判断了:</p><div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"><span style="color: #0000ff;">select</span> Name,Rank<span style="color: #808080;">=</span><span style="color: #000000;">(<br/> </span><span style="color: #ff00ff;">case</span> <span style="color: #0000ff;">Level</span><br/> <span style="color: #0000ff;">when</span> <span style="color: #800000; font-weight: bold;">1</span> <span style="color: #0000ff;">then</span> <span style="color: #ff0000;">'</span><span style="color: #ff0000;">骨灰</span><span style="color: #ff0000;">'</span><br/> <span style="color: #0000ff;">when</span> <span style="color: #800000; font-weight: bold;">2</span> <span style="color: #0000ff;">then</span> <span style="color: #ff0000;">'</span><span style="color: #ff0000;">大虾</span><span style="color: #ff0000;">'</span><br/> <span style="color: #0000ff;">when</span> <span style="color: #800000; font-weight: bold;">3</span> <span style="color: #0000ff;">then</span> <span style="color: #ff0000;">'</span><span style="color: #ff0000;">菜鸟</span><span style="color: #ff0000;">'</span><br/> <span style="color: #0000ff;">end</span><span style="color: #000000;"><br/>) <br/></span><span style="color: #0000ff;">from</span> <span style="color: #ff00ff;">User</span></div><p><strong>1.2 条件判断-&gt;相当于if else if else</strong></p><p>  (1)具体用法模板:</p><p>    CASE</p><p>      WHEN <strong>condition1</strong> THEN returnvalue1</p><p>      WHEN <strong>condition2</strong> THEN returnvalue2</p><p>      WHEN <strong>condition3</strong> THEN returnvalue3</p><p>      ELSE defaultreturnvalue</p><p>    END</p><blockquote><p><strong>注意:</strong>then后面返回的数据类型要一致, returnvalue1、 returnvalue2、 returnvalue3的数据类型必须一致。</p></blockquote><p>  (2)具体使用示例:</p><p>  假设我们有一张Score成绩表,里面记录有所有同学的成绩,此时我们想要对所有成绩进行一个评级,比如成绩如果&gt;=90那么则评为A级,&gt;=80且&lt;90则评为B级,这里我们怎来写呢?</p><div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"><span style="color: #0000ff;">select</span> studentId,rank<span style="color: #808080;">=</span><span style="color: #000000;">( <br/> </span><span style="color: #ff00ff;">case</span><br/> <span style="color: #0000ff;">when</span> english <span style="color: #808080;">between</span> <span style="color: #800000; font-weight: bold;">90</span> <span style="color: #808080;">and</span> <span style="color: #800000; font-weight: bold;">100</span> <span style="color: #0000ff;">then</span> <span style="color: #ff0000;">'</span><span style="color: #ff0000;">A</span><span style="color: #ff0000;">'</span><br/> <span style="color: #0000ff;">when</span> english <span style="color: #808080;">between</span> <span style="color: #800000; font-weight: bold;">80</span> <span style="color: #808080;">and</span> <span style="color: #800000; font-weight: bold;">89</span> <span style="color: #0000ff;">then</span> <span style="color: #ff0000;">'</span><span style="color: #ff0000;">B</span><span style="color: #ff0000;">'</span><br/> <span style="color: #0000ff;">when</span> english <span style="color: #808080;">between</span> <span style="color: #800000; font-weight: bold;">70</span> <span style="color: #808080;">and</span> <span style="color: #800000; font-weight: bold;">79</span> <span style="color: #0000ff;">then</span> <span style="color: #ff0000;">'</span><span style="color: #ff0000;">C</span><span style="color: #ff0000;">'</span><br/> <span style="color: #0000ff;">when</span> english <span style="color: #808080;">between</span> <span style="color: #800000; font-weight: bold;">60</span> <span style="color: #808080;">and</span> <span style="color: #800000; font-weight: bold;">69</span> <span style="color: #0000ff;">then</span> <span style="color: #ff0000;">'</span><span style="color: #ff0000;">D</span><span style="color: #ff0000;">'</span><br/> <span style="color: #0000ff;">when</span> english <span style="color: #808080;">&lt;</span> <span style="color: #800000; font-weight: bold;">60</span> <span style="color: #0000ff;">then</span> <span style="color: #ff0000;">'</span><span style="color: #ff0000;">E</span><span style="color: #ff0000;">'</span><br/> <span style="color: #0000ff;">else</span> <span style="color: #ff0000;">'</span><span style="color: #ff0000;">缺考</span><span style="color: #ff0000;">'</span><br/> <span style="color: #0000ff;">end</span><span style="color: #000000;"><br/>)<br/></span><span style="color: #0000ff;">from</span> Score</div><p><strong>二、子查询的用法</strong></p><p><strong>2.1 子查询初步</strong></p><p>  就像使用普通的表一样,被当作结果集的查询语句被称为子查询。所有可以使用表的地方几乎都可以使用子查询来代替。例如:我们如果要找到所有计科一班的同学信息,可以首先通过T_Class表找到计科一班的Id,然后再在T_Student表中找到所有ClassId为计科一班Id的行即可。</p><div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"><span style="color: #0000ff;">select</span> <span style="color: #808080;">*</span> <span style="color: #0000ff;">from</span> T_Student <span style="color: #0000ff;">where</span> ClassId<span style="color: #808080;">=</span><span style="color: #000000;"><br/>(<br/> </span><span style="color: #0000ff;">select</span> Id <span style="color: #0000ff;">from</span> T_Class <span style="color: #0000ff;">where</span> Name<span style="color: #808080;">=</span><span style="color: #ff0000;">'</span><span style="color: #ff0000;">计科一班</span><span style="color: #ff0000;">'</span><span style="color: #000000;"><br/>)</span></div><p><strong>2.2 单值子查询</strong></p><p>  只有返回且仅返回一行、一列数据的子查询才能当成单值子查询。例如我们上面提到的例子,子查询中只返回了一个ClassId,这就是单值子查询。当子查询跟随在=、!=、&lt;、&lt;=、&gt;、&gt;=,&lt;&gt; 之后,或子查询用作表达式,只能使用单值子查询。</p><p><strong>2.3 多值子查询</strong></p><p>  如果子查询是多行单列的子查询,这样的子查询的结果集其实是一个集合,那么可以使用in关键字代替=号。例如:我们如果想快速地在T_Student表中删除计科一班和计科二班的所有学生记录,我们可以使用in关键字:</p><div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"><span style="color: #0000ff;">delete</span> <span style="color: #0000ff;">from</span> T_Student <span style="color: #0000ff;">where</span> ClassId <span style="color: #808080;">in</span><span style="color: #000000;"><br/>(<br/> </span><span style="color: #0000ff;">select</span> Id <span style="color: #0000ff;">from</span> T_Class <span style="color: #0000ff;">where</span> Name<span style="color: #808080;">=</span><span style="color: #ff0000;">'</span><span style="color: #ff0000;">计科一班</span><span style="color: #ff0000;">'</span> <span style="color: #808080;">or</span> Name<span style="color: #808080;">=</span><span style="color: #ff0000;">'</span><span style="color: #ff0000;">计科二班</span><span style="color: #ff0000;">'</span><span style="color: #000000;"><br/>)</span></div><p><strong>2.4 Exists&mdash;你存在我深深的脑海里</strong></p><p>  exists是用来判断是否存在的,当exists查询中的查询存在结果时则返回真,否则返回假。not exists则相反。</p><p>  exists做为where 条件时,是<strong>先对where 前的主查询询进行查询,然后用主查询的结果一个一个的代入exists的查询进行判断</strong>,如果为真则输出当前这一条主查询的结果,否则不输出。</p><p>  exists后面的查询称为相关子查询,即<strong>子查询的查询条件依赖于外层父查询中的某个属性值</strong>,其处理过程一般为:先取外层查询中的第一个元组,根据它与内层查询中的相关属性值处理内层查询,若where子句返回true,则将此元组放入结果表中,然后取外层查询中的下一个元组,重复这个过程直到全部检查完毕为止。</p><p>  例如:我们有一张人员信息表,里边有一个人员类型Id字段(pTypeId),它是一个外键,对应着人员类型表的主键ptId。如果我们有以下的SQL语句,使用Exists关键字则可以有如下的理解:</p><div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"><span style="color: #0000ff;">select</span> <span style="color: #808080;">*</span> <span style="color: #0000ff;">from</span> Employee e <span style="color: #0000ff;">where</span> <span style="color: #808080;">exists</span><span style="color: #000000;"> <br/>(</span><span style="color: #0000ff;">select</span> <span style="color: #808080;">*</span> <span style="color: #0000ff;">from</span> EmployeeType et <span style="color: #0000ff;">where</span> e.pTypeId<span style="color: #808080;">=</span>et.ptId)</div><p>  那么,在这句SQL的执行过程中,我们可以将其理解为一个双重的for循环,外边是主表的循环遍历,然后将其放到一个temp变量中,再进入从表的for循环,并与从表的项进行一个一个的按照匹配规则(这里是e.pTypeId=et.ptId)进行匹配,如果有匹配成功则返回true,否则返回false。</p><p><img style="display: block; margin-left: auto; margin-right: auto;" src="http://images.cnitblog.com/blog/381412/201408/230055453937284.jpg" alt="" width="861" height="170" /></p><p><strong>三、手写分页SQL代码</strong></p><p>  这里假设每页的页大小为10条记录</p><p><strong>3.1 利用Top N进行简单分页</strong></p><p>  (1)如果我们要获取第一页的数据,也就是前10个:</p><div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"><span style="color: #0000ff;">select</span> <span style="color: #0000ff;">top</span> <span style="color: #800000; font-weight: bold;">10</span> * <span style="color: #0000ff;">from</span> Account</div><p>  (2)现在我们要获取第一页之后的数据,也就是第20个~最后一个:</p><div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"><span style="color: #0000ff;">select</span> <span style="color: #808080;">*</span> <span style="color: #0000ff;">from</span> Account <span style="color: #0000ff;">where</span> Id <span style="color: #808080;">not</span> <span style="color: #808080;">in</span> (<span style="color: #0000ff;">select</span> <span style="color: #0000ff;">top</span> <span style="color: #800000; font-weight: bold;">10</span> Id <span style="color: #0000ff;">from</span> Account) </div><p>  (3)现在我们对第20个~最后一个的数据集中取前10个也就成为第二页的数据了:</p><div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"><span style="color: #0000ff;">select</span> <span style="color: #0000ff;">top</span> <span style="color: #800000; font-weight: bold;">10</span> <span style="color: #808080;">*</span> <span style="color: #0000ff;">from</span> Account <span style="color: #0000ff;">where</span> Id <span style="color: #808080;">not</span> <span style="color: #808080;">in</span> (<span style="color: #0000ff;">select</span> <span style="color: #0000ff;">top</span> <span style="color: #800000; font-weight: bold;">10</span> Id <span style="color: #0000ff;">from</span> Account) </div><p>  (4)将上述代码总结为分页代码,设页大小为pageSize,请求页号为pageIndex:</p><div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"><span style="color: #0000ff;">select</span> <span style="color: #0000ff;">top</span> @pageSize <span style="color: #808080;">*</span> <span style="color: #0000ff;">from</span> Account <span style="color: #0000ff;">where</span> Id <span style="color: #808080;">not</span> <span style="color: #808080;">in</span> (<span style="color: #0000ff;">select</span> <span style="color: #0000ff;">top</span> ((@pageIndex<span style="color: #808080;">-</span><span style="color: #800000; font-weight: bold;">1</span>)<span style="color: #808080;">*@</span>pageSize) Id <span style="color: #0000ff;">from</span> Account) </div><blockquote><p><strong>PS:</strong>这种分页方式的缺点是如果要取很多页之后的数据,那么就要取出前面很多页的ID,查询开销较大,执行效率也就低下。</p><p><img style="display: block; margin-left: auto; margin-right: auto;" src="http://images.cnitblog.com/blog/381412/201408/230114102373020.jpg" alt="" /></p><p>  从图中可以看出,在小数据量的对比下,Top N的查询开销较小。但是在大数据量的对比下,Row_Number的方式会取得更高的查询效率以及较小的开销。</p></blockquote><p><strong>3.2 利用Row_Number()进行高效分页</strong></p><p>  (1)SQL Server 2005后增加了Row_Number函数,可以简化分页代码的实现。首先,Row_Number()是一个排序函数,它可以生成一个有序的行号(如果单靠ID来排序,中间存在断层,例如某一个ID行已经被删除了)。根据MSDN的定义:返回结果集分区内行的序列号,每个分区的第一行从 1 开始。而排序的标准是什么呢?这个就要靠紧跟其后的OVER()语句来定义了。这里我们可以通过一个示例来看看,其生成的行号如何。</p><div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"><span style="color: #0000ff;">select</span> <span style="color: #808080;">*</span>,ROW_NUMBER() <span style="color: #0000ff;">OVER</span>(<span style="color: #0000ff;">order</span> <span style="color: #0000ff;">by</span> Id) <span style="color: #0000ff;">as</span> RowNum <span style="color: #0000ff;">from</span> Account</div><p><img style="display: block; margin-left: auto; margin-right: auto;" src="http://images.cnitblog.com/blog/381412/201408/230128245182842.jpg" alt="" /></p><p>  (2)根据ROW_NUMBER()的使用,我们可以将其应用到分页上,于是我们可以写出以下的代码来实现获取第二页的数据集:</p><div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"><span style="color: #0000ff;">select</span> <span style="color: #808080;">*</span> <span style="color: #0000ff;">from</span><span style="color: #000000;"> (<br/> </span><span style="color: #0000ff;">select</span> <span style="color: #808080;">*</span>,ROW_NUMBER() <span style="color: #0000ff;">OVER</span>(<span style="color: #0000ff;">Order</span> <span style="color: #0000ff;">by</span> Id) <span style="color: #0000ff;">as</span> rownum <span style="color: #0000ff;">from</span><span style="color: #000000;"> Account<br/>) </span><span style="color: #0000ff;">as</span><span style="color: #000000;"> t<br/></span><span style="color: #0000ff;">where</span> t.rownum <span style="color: #808080;">between</span> <span style="color: #800000; font-weight: bold;">11</span> <span style="color: #808080;">and</span> <span style="color: #800000; font-weight: bold;">20</span><br/><span style="color: #0000ff;">order</span> <span style="color: #0000ff;">by</span> t.Id <span style="color: #0000ff;">asc</span></div><p>  (3)将上述代码总结为分页代码,设页大小为pageSize,请求页号为pageIndex:</p><div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"><span style="color: #0000ff;">select</span> <span style="color: #808080;">*</span> <span style="color: #0000ff;">from</span><span style="color: #000000;"> (<br/> </span><span style="color: #0000ff;">select</span> <span style="color: #808080;">*</span>,ROW_NUMBER() <span style="color: #0000ff;">OVER</span>(<span style="color: #0000ff;">Order</span> <span style="color: #0000ff;">by</span> Id) <span style="color: #0000ff;">as</span> rownum <span style="color: #0000ff;">from</span><span style="color: #000000;"> Account<br/>) </span><span style="color: #0000ff;">as</span><span style="color: #000000;"> t<br/></span><span style="color: #0000ff;">where</span> t.rownum <span style="color: #808080;">between</span> (<span style="color: #008000;">@pageIndex</span><span style="color: #808080;">-</span><span style="color: #800000; font-weight: bold;">1</span>)<span style="color: #808080;">*</span>pageSize<span style="color: #808080;">+</span><span style="color: #800000; font-weight: bold;">1</span> <span style="color: #808080;">and</span> <span style="color: #008000;">@pageSize</span><span style="color: #808080;">*</span><span style="color: #000000;">pageIndex<br/></span><span style="color: #0000ff;">order</span> <span style="color: #0000ff;">by</span> t.Id <span style="color: #0000ff;">asc</span></div><p><strong>四、各种连接&mdash;JOIN</strong></p><p><strong>4.1 Join==Inner Join</strong></p><p>  默认情况下,使用Join则代表Inner Join内连接,表示两个表根据某种等值规则进行连接。例如下面示例:查询所有学生的学号、姓名及所在班级</p><div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"><span style="color: #0000ff;">select</span> p.Id,p.Name,c.Name <span style="color: #0000ff;">from</span> T_Person p <span style="color: #808080;">join</span> T_Class c <span style="color: #0000ff;">on</span> p.ClassId<span style="color: #808080;">=</span>c.Id</div><p><strong>4.2 Left Join</strong></p><p>  例如:查询所有学生(参加及未参加考试的都算)及成绩,这里涉及到学生表及成绩表,题目要求参加及未参加考试的都要列出来,于是以学生表为基准,对成绩表进行左连接:</p><div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"><span style="color: #0000ff;">select</span> <span style="color: #808080;">*</span> <span style="color: #0000ff;">from</span><span style="color: #000000;"> Student s<br/></span><span style="color: #808080;">left</span> <span style="color: #808080;">join</span> SC sc <span style="color: #0000ff;">on</span> s.S#<span style="color: #808080;">=</span>sc.S#</div><p><img style="display: block; margin-left: auto; margin-right: auto;" src="http://images.cnitblog.com/blog/381412/201408/230140581283372.jpg" alt="" /></p><p>  可以通过运行结果图,看到王二小这个童鞋没有参加考试,也就没有成绩。</p><p><strong>4.3 Right Join</strong></p><p>  例如:要查询出所有没有参加考试(在成绩表中不存在的学生)的学生的姓名。于是还是可以以学生表为基准,但是要对成绩表进行右连接:</p><div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"><span style="color: #0000ff;">select</span> <span style="color: #808080;">*</span> <span style="color: #0000ff;">from</span><span style="color: #000000;"> Student s<br/></span><span style="color: #808080;">right</span> <span style="color: #808080;">join</span> SC sc <span style="color: #0000ff;">on</span> s.S#<span style="color: #808080;">=</span>sc.S#</div><p><strong>4.4 Cross Join</strong></p><p>  此种连接在实际应用中不算常见的,但却是理论基础,因为它代表了笛卡尔积。其实,所有连接方式都会先生成临时笛卡尔积表,笛卡尔积是关系代数里的一个概念,表示第一个表的行数乘以第二个表的行数等于笛卡尔积结果集的大小。</p><div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"><span style="color: #0000ff;">select</span> <span style="color: #808080;">*</span> <span style="color: #0000ff;">from</span><span style="color: #000000;"> Student s<br/></span><span style="color: #0000ff;">cross</span> <span style="color: #808080;">join</span> SC sc</div><p>  这里假如Student表中有10行记录,SC表中有20行记录,那么两表进行交叉连接笛卡尔积运算会得到10*20=200行记录的结果集。</p><p><strong>五、视图</strong></p><p><strong>5.1 三个角度看视图</strong></p><p>  从用户角度来看,一个视图是从一个特定的角度来查看数据库中的数据。</p><p>  从数据库系统内部来看,一个视图是由SELECT语句组成的查询定义的<strong>虚拟表</strong>。</p><p>  从数据库系统内部来看,视图是由一张或多张表中的数据组成的;从数据库系统外部来看,视图就如同一张表一样,对表能够进行的一般操作都可以应用于视图,例如查询,插入,修改,删除操作等。</p><p><strong>5.2 创建视图</strong></p><p>  例如,我们可以创建一个学生成绩详细信息视图,对一个需要进行三表连接的查询进行封装:</p><div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"><span style="color: #0000ff;">create</span> <span style="color: #0000ff;">view</span><span style="color: #000000;"> vw_sc<br/></span><span style="color: #0000ff;">as</span><br/><span style="color: #0000ff;">select</span> s.S#,s.Sname,c.Cname,sc.Score <span style="color: #0000ff;">from</span><span style="color: #000000;"> Student s<br/></span><span style="color: #808080;">join</span> SC sc <span style="color: #0000ff;">on</span> s.S#<span style="color: #808080;">=</span><span style="color: #000000;">sc.S#<br/></span><span style="color: #808080;">join</span> Course c <span style="color: #0000ff;">on</span> sc.C#<span style="color: #808080;">=</span>c.C#</div><p>  然后,我们对vw_sc进行select查询:</p><p><img style="display: block; margin-left: auto; margin-right: auto;" src="http://images.cnitblog.com/blog/381412/201408/230154025963900.jpg" alt="" /></p><p><strong>5.3 视图的注意事项</strong></p><p>  (1)视图在操作上和数据表没有什么区别,但两者的差异是其本质是不同:<strong>数据表是实际存储记录的地方,然而视图并不保存任何记录</strong>。</p><p>  (2)相同的数据表,<strong>根据不同用户的不同需求,可以创建不同的视图</strong>(不同的查询语句)。</p><div>  (3)视图的目的是方便查询,所以<strong>一般情况下不对视图进行增改,不能删</strong>。</div><p>&nbsp;</p><div id="Copyright"><p><span style="font-size: 14px;">作者:<a href="http://edisonchou.cnblogs.com">周旭龙</a></span></p><p><span style="font-size: 14px;">出处:<a href="http://edisonchou.cnblogs.com" target="_blank">http://edisonchou.cnblogs.com</a></span></p><p><span style="font-size: 14px;">本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接。</span></p></div><img src="http://counter.cnblogs.com/blog/rss/3930414" width="1" height="1" alt=""/><br/><p>本文链接:<a href="http://www.cnblogs.com/edisonchou/p/3930414.html" target="_blank">走向面试之经典的数据库基础:二、SQL进阶之case、子查询、分页、join与视图</a>,转载请注明。</p>http://www.cnblogs.com/wxb0328/p/3930520.html关于ASCII、GB231、GBK、UTF-8/UTF8、ANSI、unicode的学习笔记 - 趴在巨人肩上的矮子继续上次的学习内容,写一些自己学习的笔记吧!总是觉得没有笔记的学习总是不那么踏实,我承认自己是个记忆力很差的人,特别羡慕那些可以把自己学过的东西记得很牢靠的人。哎!可惜我不是,那只能做出来点东西,就算以后忘了,回过头来可以看一看,有东西查;毕竟是自己亲手打出来的一个一个字啊 已经一万六千字了!...2014-08-22T17:07:00Z2014-08-22T17:07:00Z趴在巨人肩上的矮子http://www.cnblogs.com/wxb0328/<p>  继续上次的学习内容,写一些自己学习的笔记吧!总是觉得没有笔记的学习总是不那么踏实,我承认自己是个记忆力很差的人,特别羡慕那些可以把自己学过的东西记得很牢靠的人。哎!可惜我不是,那只能做出来点东西,就算以后忘了,回过头来可以看一看,有东西查;毕竟是自己亲手打出来的一个一个字啊<img src="http://images.cnitblog.com/blog/537027/201408/230039008622094.jpg" alt="" /></p><p>  已经一万六千字了!嘿嘿。。。继续加油!</p><p>  今天公司网络有问题,说是让在家里上班,skype在线就行了。结果我这自觉性不够,就打酱油了!还是继续学习我的mysql吧!我是刚毕业的大学生,学的和写的都是一些最基础的,如果巧遇大牛,还请轻喷!马上就要看完这部视频了,每次看到最后又着急又兴奋的,就像赶紧看完。这里我谈一点对于看视频自学和看书自学的感悟:</p><p>  看视频适合入门、基础比较薄的需要提升基础知识的人。看视频形象并且有很多的老师讲的例子,我们可以一边看视频一边练习。但是,看视频实在是很耗费时间。而且对于一个有网还是一个人坐在屋子里自学的人来说,自制力有要求啊!不过凡事慢慢看,一点一点积累,只要自己有计划,心里别着急,技术这东西还是记不得的。</p><p>  看书适合有了一定的基础,对于书上的大部分只是已经有一定的了解和掌握,作为提高和工作中遇到难题来弄懂这一块还是很好地,看书快啊。但是看过去很快就有许多就忘记了,因为书中的每一个知识点,不是我们天天都会用的,不用当让时间一长就忘记了 。所以,看书适合有一点基础,看的过程中不用每一页都是:一行一行的划重点,试想,一本书看完了,这么多重点我都不知道,那我划过去的重点我就都能记住吗?</p><p>  还记得四月份的时候给我对象处理毕业设计时遇到的乱码问题,我整整弄了三天算是解决了问题,但是自己更本没有弄懂其中的原因,所以借这次刚好好好学习一下,了了自己一个心愿。</p><p>  我看的是:燕十八老师的mysql从入门到精通 在此感谢十八哥!网络真是伟大,让我们可以免费学的很多东西。大家有想学习的可以去网上找,要是实在是找不到,就留言,我百度网盘分享,1T的资源,估计这辈子都看不完!好了计入正题</p><p>  </p><p><strong>  <span style="font-size: 14pt;">ascii</span></strong></p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 最早的编码集,0-127个,一个字节存储</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="font-size: 14pt;">&nbsp;<strong>GB2312</strong></span></p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 到了中国,常用汉字3000个,生僻字不用说了!</p><p>    一个字节不够用了?</p><p>    思考:用两个字节来表示</p><p>      [][]</p><p>      0000 0000 0000 0000</p><p>      1111 1111 1111 1111</p><p>      0-&gt;65535,六万多种组合,够用了</p><p>    GB2312字符集</p><p>      [202 197] 假如代表 中</p><p>      [69 197] 代表什么?69 和197是整个理解,还是单个理解?此时就产生了歧义:就是因为单字节的小于127的值,正好是ascii的值了</p><p>      如果就严格的2字节绑定,理解成中文</p><p>      侧GB2312就不能兼容小于127的英文字符了</p><p>    问:如何兼容ascii,又能两个字节表示中文?</p><p>      ascii 0-127</p><p>      0xxx xxxx</p><p>      干脆 ,gb2312完全不占用0-127</p><p>      gb2312占用的两个字节的来自[129-255][129-255]</p><p>    但是这样,中文的组合数也就减少了,大约有一万多</p><p> <span style="font-size: 14pt;"> GBK</span></p><p>    完全兼容GB2312,只是比GB2312的容量大了,也就是说可以编码更多的字符</p><p>    GBK和GB2312一样都是两个字节,那么如何扩充容量?</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 答:GBK的第二位,低位,不在局限于129-255了,&lt;127的也能用了</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 例如 148 35 65 179 82</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 问:几个中文,几个英文?</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 中文 英文 中文</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 我们可以看出,GBK是当遇到的这个一个字节大于127时,就知道这是中文,后面还有一个字节,当小于127时,就表明这是英文编码,后面没有跟带的字节了。也就是遇到大于127的根据规则,后面还有一个字节,需要在读取;小于时就知道,这是英文,后面没有了</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 容量:收录汉字21003个、符号883个、并提供1894个造字位</p><p><span style="font-size: 14pt;">ANSI、Unicode、utf-8</span></p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 中国&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; GBK 两个字节</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [137][134] &ndash;&gt;可能对应-&gt; 中</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 那么到了日本呢?</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [137][134] 对应什么?</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 日本使用的是 jis 字符集</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="font-size: 18px;">ANSI&nbsp;</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 代表本地字符集</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这个更你本机的语言设置有关,比如中文的ANSI就是GBK,日文的ANSI就是jis</p><p>解决了多字节以后,又有一个问题:如何解决各国的字符集兼容问题?</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 答案:<span style="font-size: 18px;">Unicode(</span>统一码、万国码)&nbsp;&nbsp; 终极大招</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 解决国际化问题,unicode是什么?就是一个全世界通用的码表,全世界范围的字符,统一分配一个标号,这样就不会乱了</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 容量:2^32 40多亿,天文数字,足够用了</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 但是我们常用的,集中在前65535个标号里</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 因此,两个字节就够了,</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 请注意:unicode只是负责分配编号,而且都用4个字节来编号,而且和ascii不兼容</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; unicode只负责分配编号,那么就有其他在不改变unicode的基础上,简化字节</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0000 0000 0000 0000 0000 0000 0000 0041 &ndash;&gt; A</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 简化</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0000 0041 -&gt; A</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 把高位浪费的0值,用一定的规则舍弃,这种是形成具体的编码格式(猜想:简化后的编码,可以更加节省带宽,网络传输更快,原因:原来都需要4个字节,现在简化以后可能只需要一个字节)</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这样简化以后的编码才能在网络上传输,unicode只是负责分配编号,不进行实际的编码工作,一定需要注意区别!!!!也就是说unicode是字符集,utf-8是字符编码,这里我找了一票博客,推荐给大家</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <em>关于字符集和编码的一些基础知识:</em></p><p><em>&nbsp;&nbsp;&nbsp;     1.</em><em>基础知识</em></p><p><em>      算机中储存的信息都是用二进制数表示的;而我们在屏幕上看到的英文、汉字等字符是二进制数转换之后的结果。通俗的说,按照何种规则将字符存储在计算机中,如'a'用什么表示,称为"编码";反之,将存储在计算机中的二进制数解析显示出来,称为"解码",如同密码学中的加密和解密。在解码过程中,如果使用了错误的解码规则,则导致'a'解析成'b'或者乱码。</em></p><p><em>      字符集(Charset):是一个系统支持的所有抽象字符的集合。字符是各种文字和符号的总称,包括各国家文字、标点符号、图形符号、数字等。</em></p><p><em>      字符编码(Character Encoding):是一套法则,使用该法则能够对自然语言的字符的一个集合(如字母表或音节表),与其他东西的一个集合(如号码或电脉冲)进行配对。即在符号集合与数字系统之间建立对应关系,它是信息处理的一项基本技术。通常人们用符号集合(一般情况下就是文字)来表达信息。而以计算机为基础的信息处理系统则是利用元件(硬件)不同状态的组合来存储和处理信息的。元件不同状态的组合能代表数字系统的数字,因此字符编码就是将符号转换为计算机可以接受的数字系统的数,称为数字代码。</em></p><p><em>    2.</em><em>常用字符集和字符编码</em></p><p><em>  常见字符集名称:ASCII</em><em>字符集、GB2312</em><em>字符集、BIG5</em><em>字符集、GB18030</em><em>字符集、Unicode</em><em>字符集等。计算机要准确的处理各种字符集文字,需要进行字符编码,以便计算机能够识别和存储各种文字。</em></p><p><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </em><em>详细参考博客:<a title="字符集和字符编码(Charset &amp; Encoding)" href="http://www.cnblogs.com/skynet/archive/2011/05/03/2035105.html" target="_blank">http://www.cnblogs.com/skynet/archive/2011/05/03/2035105.html</a></em></p><p>继续上面探讨</p><p>  <span style="font-size: 14pt;">UTF8/UTF-8</span></p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 那么怎么简化传输?</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这时就出现了utf-8(unicode transformation format)这就是其中最出名的一个</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这种简化,就像原文件和压缩文件的关系</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 问:给定unicode的字符&mdash;&gt;utf-8的二进制值?</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 知道unicode可以推出utf-8,同样utf-8也能推出unicode</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 问:utf8占几个字节?</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 首先不可能是定长,否则压缩有什么意义!</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 我们看看对应表</p><p>      <img src="http://images.cnitblog.com/blog/537027/201408/230057318152364.jpg" alt="" /></p><p><strong>    utf8</strong><strong>是一个变长:1-6</strong><strong>个字节</strong></p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 变长!那么如何确定字符的边界,即计算机去几个字节,才能知道这个字符正确的取出来了</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 我们仔细观察上表:</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 当最高位字节有一个0时(0xxxxxxx)取一个字节,110(110xxxxx 10xxxxxx)取两个字节,1110取三个字节,11110取四个字节,111110取五个字节,1111110x取六个字节</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 中文utf8占三个字节</p><p><strong>   推论</strong><strong>: </strong><strong>什么时将会乱码</strong><strong>?</strong></p><p>      1: client声明与事实不符</p><p>      2:results与客户端页面不符的时候.</p><p>&nbsp;</p><p><strong>   什么时间将会丢失数据?</strong></p><p>    Connetion和服务器的字符集比client小时.<br />    <img src="http://images.cnitblog.com/blog/537027/201408/230104172683165.jpg" alt="" /></p><p><strong>   校对集</strong><strong>: </strong><strong>指字符集的排序规则</strong></p><p>      一种字符集可以有一个或多个排序规则.</p><p>      以Utf8为例, 我们默认使的utf8_general_ci 规则,也可以按二进制来排, utf8_bin</p><p>&nbsp;    怎么样声明校对集?</p><p>      Create table ()... Charset utf8 collateutf8_general_ci;</p><p><strong>     <span style="color: #ff0000;"> 注意:</span></strong><span style="color: #ff0000;"><strong>声明的校对集必须是字符集合法的校对集.</strong></span></p><p>  好了,就先这么多吧,待会再发一篇关于mysql字符集的学习。太长了看着人太累,写短一点,一篇记录一个问题</p><p>&nbsp;</p><img src="http://counter.cnblogs.com/blog/rss/3930520" width="1" height="1" alt=""/><br/><p>本文链接:<a href="http://www.cnblogs.com/wxb0328/p/3930520.html" target="_blank">关于ASCII、GB231、GBK、UTF-8/UTF8、ANSI、unicode的学习笔记</a>,转载请注明。</p>http://www.cnblogs.com/Hackerman/p/3930505.html20个linux命令行工具监视性能 - Hackerman对于每一个系统管理员或网络管理员每天监视或调试linux系统的性能问题是一件非常困难的事,在it行业作为一个linux管理员五年之后,我开始知道监视和保持系统启动和运行有多么的困难。由于这个原因,我们编写了20条常用的命令行工具,希望对每一个linux系统管理员有用。这些命令是可利用的在所有类型的l...2014-08-22T16:30:00Z2014-08-22T16:30:00ZHackermanhttp://www.cnblogs.com/Hackerman/<p>对于每一个系统管理员或网络管理员每天监视或调试linux系统的性能问题是一件非常困难的事,在it行业作为一个linux管理员五年之后,我开始知道监视和保持系统启动和运行有多么的困难。由于这个原因,我们编写了20条常用的命令行工具,希望对每一个linux系统管理员有用。这些命令是可利用的在所有类型的linux之下并且对监视和发现性能的实际原因是很有用的。这些列表的命令是足够的对于你选择适合你的任何一个监控场景。</p><p><img src="data:image/png;base64,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" alt="" /></p><p>1,top&nbsp; ---linux process monitoring</p><p>&nbsp;&nbsp; top 命令是一个性能监视程序,通常被许多系统管理员频繁使用监视linux性能并且能够使用在不同的类型的linux之下。top命令用于显示所有运行和活跃的实时进程并定期更新它。它显示了cpu使用率,内存使用率,交换内存,缓存大小,缓冲区大小,进程pid,用户,命令等等。它也展示了运行进程的高cpu利用率和内存利用率。top命令对系统管理员监视和在需要的时候采取正确的行动是非常的重要。下面让我们看看top命令。</p><h3 style="background: none repeat scroll 0px 0px #555; border-radius: 4px; box-shadow: 0px 0px 15px rgba(0, 0, 0, 0.25) inset; clear: both; color: #fff; font: 1.1em/1.2;">#top</strong></p><p><img src="data:image/png;base64,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" alt="" />&nbsp;</p><p>&nbsp;了解top的更多带参数的命令在shell中输入&ldquo;man top&rdquo;。</p><p>2,VmStat -- Virtual Memory Statistic</p><p>&nbsp;&nbsp; VmStat命令用来显示<strong>虚拟内存</strong>, <strong>内核线程</strong>, <strong>磁盘</strong>, <strong>系统进程</strong>, <strong>输入输出块</strong>, <strong>中断</strong>, <strong>活动的cpu</strong> 等等.默认的VmStat命令是不能直接被直接使用的,在linux系统下你必须安装一个名叫<strong>sysstat</strong>的包,这个包包含Vmstat命令。这个命令的使用如下。</p>procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu-----<br/> r b swpd free inact active si so bi bo in cs us sy id wa st<br/> 1 0 0 810420 97380 70628 0 0 115 4 89 79 1 6 90 3 0<br/><br/><p>&nbsp;&nbsp;&nbsp; 了解VmStat的更多命令请在shell中输入&ldquo;man vmstat&rdquo;。</p><p>3, Lsof &ndash; List Open Files</p><p>&nbsp;&nbsp;&nbsp; Lsof命令用来显示所有打开的文件和进程的一个列表。打开的文件包括<strong>磁盘文件</strong>, <strong>网络套接字</strong>, <strong>管道</strong>, <strong>设备</strong> 和 <strong>进程</strong>。使用这个命令的主要原因之一是当文件系统不能被卸载或者文件出现一个错误是文件正在被使用或打开。使用这个命令你能够很容易的找到那个文件正在被使用。这个命令的使用格式如下。</p><strong style="font-weight: bold;"><br/>COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME<br/>init 1 root cwd DIR 104,2 4096 2 /<br/>init 1 root rtd DIR 104,2 4096 2 /<br/>init 1 root txt REG 104,2 38652 17710339 /sbin/init<br/>init 1 root mem REG 104,2 129900 196453 /lib/ld-2.5.so<br/>init 1 root mem REG 104,2 1693812 196454 /lib/libc-2.5.so<br/>init 1 root mem REG 104,2 20668 196479 /lib/libdl-2.5.so<br/>init 1 root mem REG 104,2 245376 196419 /lib/libsepol.so.1<br/>init 1 root mem REG 104,2 93508 196431 /lib/libselinux.so.1<br/>init 1 root 10u FIFO 0,17 953 /dev/initctl<br/><br />了解更多的Lsof命令请直接打开shell输入&ldquo;man lsof&rdquo;<br /></strong><br/><p>4,Tcpdump -- Network Packet Analyzer</p><p><strong>&nbsp; Tcpdump</strong> 是一个被广泛使用的命令行工具,<strong>network packet analyzer(网络包分析)</strong> 或<strong>packets sniffer(包嗅探)</strong> 命令 被用来 capture(捕获) or filter(过滤) 接受或传输在连接网络上的接口上的&nbsp; <strong>TCP/IP</strong> 包,它也提供一个选项来保存捕获的包在一个文件中之后进行分析。&nbsp; tcpdump 也是有用的在分布的不同类型的linux中。tcpdump的使用如下。</p><h3 style="background: none repeat scroll 0px 0px #555; border-radius: 4px; box-shadow: 0px 0px 15px rgba(0, 0, 0, 0.25) inset; clear: both; color: #fff; font: 1.1em/1.2;"># tcpdump -i eth0</strong></p><strong><br/>tcpdump: verbose output suppressed, use -v or -vv for full protocol decode<br/>listening on eth0, link-type EN10MB (Ethernet), capture size 96 bytes<br/>22:08:59.617628 IP tecmint.com.ssh &gt; 115.113.134.3.static-mumbai.vsnl.net.in.28472: P 2532133365:2532133481(116) ack 3561562349 win 9648<br/>22:09:07.653466 IP tecmint.com.ssh &gt; 115.113.134.3.static-mumbai.vsnl.net.in.28472: P 116:232(116) ack 1 win 9648<br/>22:08:59.617916 IP 115.113.134.3.static-mumbai.vsnl.net.in.28472 &gt; tecmint.com.ssh: . ack 116 win 64347<br/></strong><br/><p>5,Netstat -- Network Statistics</p><p>&nbsp;&nbsp; <strong>Netstat</strong> 是一个监视输入和输出网络包统计的命令行工具,它是非常的有用对于每一个系统管理员监视网络性能和 网络连接故障问题。使用方法如下。</p><p>&nbsp;&nbsp;</p><h3 style="background: none repeat scroll 0px 0px #555; border-radius: 4px; box-shadow: 0px 0px 15px rgba(0, 0, 0, 0.25) inset; clear: both; color: #fff; font: 1.1em/1.2;"># netstat -a | more</strong></p><strong><br/>Active Internet connections (servers and established)<br/>Proto Recv-Q Send-Q Local Address Foreign Address State<br/>tcp 0 0 *:mysql *:* LISTEN<br/>tcp 0 0 *:sunrpc *:* LISTEN<br/>tcp 0 0 *:realm-rusd *:* LISTEN<br/>tcp 0 0 *:ftp *:* LISTEN<br/>tcp 0 0 localhost.localdomain:ipp *:* LISTEN<br/>tcp 0 0 localhost.localdomain:smtp *:* LISTEN<br/>tcp 0 0 localhost.localdomain:smtp localhost.localdomain:42709 TIME_WAIT<br/>tcp 0 0 localhost.localdomain:smtp localhost.localdomain:42710 TIME_WAIT<br/>tcp 0 0 *:http *:* LISTEN<br/>tcp 0 0 *:ssh *:* LISTEN<br/>tcp 0 0 *:https *:* LISTEN<br/></strong><br/><p>&nbsp; netstat 的更多使用方法见&ldquo;man netstat&rdquo;。</p><p>6,Htop &ndash; Linux Process Monitoring</p><p>&nbsp;&nbsp; <strong>Htop</strong> 是一个更先进的交互和实时进程监控工具。这和linux的top命令更相似但是Htop有更丰富的界面就像用户友好的界面管理进程,快捷键,水平和垂直的视图浏览进程等等。Htop是一个三部分的工具默认情况下没有包含。你必须安装它使用YUM包管理工具。</p><p>&nbsp;</p><h3 style="background: none repeat scroll 0px 0px #555; border-radius: 4px; box-shadow: 0px 0px 15px rgba(0, 0, 0, 0.25) inset; clear: both; color: #fff; font: 1.1em/1.2;"># htop</strong></p><p><img style="display: inline;" title="Htop Command Example" src="http://www.tecmint.com/wp-content/uploads/2012/08/htop-3.jpg" alt="Htop Command Example" width="600" height="363" data-lazy-loaded="true" /></p><p>&nbsp;<a title="安装htop" href="http://www.tecmint.com/install-htop-linux-process-monitoring-for-rhel-centos-fedora/" target="_blank">安装htop。</a></p><p>&nbsp;7,Iotop -- Monitor Linux Disk I/O</p><p><strong>&nbsp;&nbsp; Iotop</strong> 也和top,htop命令相似, 但是它能监视和显示实时的磁盘I/O信息和进程信息。这个工具更有用对于查找而外的进程和高使用磁盘读写进程。</p><p>&nbsp;</p><p><strong># iotop</strong></p><p><img style="display: inline;" title="Iotop Command Example" src="http://www.tecmint.com/wp-content/uploads/2012/07/iotop-Screen.jpg" alt="Iotop Command Example" width="630" height="420" data-lazy-loaded="true" /></p><p><a title="安装iotop" href="http://www.tecmint.com/install-iotop-monitor-linux-disk-io-in-rhel-centos-and-fedora/" target="_blank">安装iotop。</a></p><p>8,Iostat &ndash; Input/Output Statistics</p><p>&nbsp;&nbsp; <strong>IoStat</strong> 是一个简单的收集和显示输入输出存储设备的统计信息的工具。这个工具被用来追This to踪存储设备性能问题包括 <strong>devices(设备)</strong>, <strong>local disks(本地磁盘)</strong>, <strong>remote disks(远程磁盘)</strong> such as <strong>NFS(网络存储文件)</strong>。</p><p>&nbsp;</p><h3 style="background: none repeat scroll 0px 0px #555; border-radius: 4px; box-shadow: 0px 0px 15px rgba(0, 0, 0, 0.25) inset; clear: both; color: #fff; font: 1.1em/1.2;"># iostat</strong></p><strong><br/>Linux 2.6.18-238.9.1.el5 09/13/2012<br/></strong><br/>avg-cpu: %user %nice %system %iowait %steal %idle<br/> 2.60 3.65 1.04 4.29 0.00 88.42<br/><br/>Device: tps Blk_read/s Blk_wrtn/s Blk_read Blk_wrtn<br/>cciss/c0d0 17.79 545.80 256.52 855159769 401914750<br/>cciss/c0d0p1 0.00 0.00 0.00 5459 3518<br/>cciss/c0d0p2 16.45 533.97 245.18 836631746 384153384<br/>cciss/c0d0p3 0.63 5.58 3.97 8737650 6215544<br/>cciss/c0d0p4 0.00 0.00 0.00 8 0<br/>cciss/c0d0p5 0.63 3.79 5.03 5936778 7882528<br/>cciss/c0d0p6 0.08 2.46 2.34 3847771 3659776<br/><p><br />9. IPTraf &ndash; Real Time IP LAN Monitoring</p><p>&nbsp;&nbsp; <strong>IPTraf&nbsp;</strong>&nbsp; 是一个开源的基于console的实时网络监视工具,它收集了不同种类的信息例如通过网络的ip交通监视。包括tcp flag信息,icmp信息,tcp/udp交通故障,tcp连接包和字节统计。它还收集接口的统计TCP、UDP、IP、ICMP、非IP,IP校验和错误,界面活动的信息等。</p><p><img class="size-full wp-image-2167" style="display: inline;" src="http://www.tecmint.com/wp-content/uploads/2013/02/IPTraf2.png" alt="IP Traffic Monitor" width="600" height="377" data-lazy-loaded="true" /></p><p>&nbsp;</p><p>10,Psacct or Acct -- Monitor User Activity</p><p>&nbsp;&nbsp;&nbsp; psacct or acct tools 是非常的有用对于监视每一个用户的活动, 这两个守护进程在后台运行并保持密切关注系统上的每个用户的整体活动有什么资源被消耗。</p><p>&nbsp;&nbsp;&nbsp; 这些工具是非常有用的对系统管理员追踪每个用户的活动例如用户正在做什么,他们发布了什么命令,他们在使用多少资源,他们使用系统多久了等等。</p><p>&nbsp;&nbsp;&nbsp; <a title="怎么使用psacct" href="http://www.tecmint.com/how-to-monitor-user-activity-with-psacct-or-acct-tools/" target="_blank">How to Monitor User Activity with psacct or acct Tools </a></p><p>今天就翻译到这里,后面的10个下次在翻译。初次翻译博客希望大家多多指教。欢迎大家指点。</p><p>最后注明原文出处:<a href="http://www.tecmint.com/command-line-tools-to-monitor-linux-performance/" target="_blank">20 Command Line Tools to Monitor Linux Performance</a></p><img src="http://counter.cnblogs.com/blog/rss/3930505" width="1" height="1" alt=""/><br/><p>本文链接:<a href="http://www.cnblogs.com/Hackerman/p/3930505.html" target="_blank">20个linux命令行工具监视性能</a>,转载请注明。</p>http://www.cnblogs.com/zxoling/p/3930497.htmlCocos_Code_Ide学习(一):理解Cocos Lua Project下的frameworks的proj.win32 - 侏小儒第一次写,不知道有没有用,有不对的地方,接受大家的批评。勿喷,谢谢。1.首先,创建工程-----------------------------------------------------------------------------------------------------------...2014-08-22T16:28:00Z2014-08-22T16:28:00Z侏小儒http://www.cnblogs.com/zxoling/<p><span style="color: #ff0000;"><strong>第一次写,不知道有没有用,有不对的地方,接受大家的批评。勿喷,谢谢。</strong></span></p><p>&nbsp;</p><p><span style="color: #ff0000;"><strong>1.首先,创建工程</strong></span></p><p><span style="color: #ff0000;"><strong>---------------------------------------------------------------------------</strong></span></p><p>&nbsp;</p><p><span style="color: #ff0000;"><strong><img src="http://images.cnitblog.com/blog/528088/201408/222324573938289.png" alt="" /></strong></span></p><p><span style="color: #ff0000;"><strong>---------------------------------------------------------------------------</strong></span></p><p><span style="color: #ff0000;"><strong><img src="http://images.cnitblog.com/blog/528088/201408/222326188789849.png" alt="" /></strong></span></p><p><span style="color: #ff0000;"><strong>---------------------------------------------------------------------------</strong></span></p><p><span style="color: #ff0000;"><strong>2. 用 VS 打开 proj.win32 下的 .sln 文件,编译一遍</strong></span></p><p><span style="color: #ff0000;"><strong>成功后,会出现</strong></span></p><p><span style="color: #ff0000;"><strong><img src="http://images.cnitblog.com/blog/528088/201408/222340190817003.png" alt="" /></strong></span></p><p><span style="color: #ff0000;"><strong><strong><strong>上面场景的代码,是 main.lua 实现的。</strong></strong></strong></span></p><p><span style="color: #ff0000;"><strong><strong>---------------------------------------------------------------------------</strong></strong></span></p><p>&nbsp;</p><p><span style="color: #ff0000;"><strong>3.</strong></span><span style="color: #ff0000;"><strong>接下来,要实现 Cocos Code Ide 与 VS 互通</strong></span></p><p><span style="color: #ff0000;"><strong> 首先设置 Build Win32 Runtime, 在Cocos Code Ide里面,右键项目名称---选择 Cocos Tools ---选择 Build Custom Runtimes</strong></span></p><p><span style="color: #ff0000;"><strong> 勾选 &ldquo;<strong>Build Win32 Runtime&rdquo;,然后等待完成。</strong></strong></span></p><p><span style="color: #ff0000;"><strong><strong><img src="http://images.cnitblog.com/blog/528088/201408/222355436905677.png" alt="" /></strong></strong></span></p><p>&nbsp;</p><p><img src="http://images.cnitblog.com/blog/528088/201408/222356007069374.png" alt="" /></p><p><span style="color: #ff0000;">&nbsp; &nbsp;<strong>完成后,在你项目目录下的 runtime -- win32 里面,会出现 (你的项目名称).exe</strong></span></p><p><span style="color: #ff0000;"><strong><img src="http://images.cnitblog.com/blog/528088/201408/222357536903059.png" alt="" /></strong></span></p><p>&nbsp;</p><p> <strong><span style="color: #ff0000;">然后点击 Debug Configurations</span></strong></p><p><strong><span style="color: #ff0000;"><img src="http://images.cnitblog.com/blog/528088/201408/222359453463771.png" alt="" /></span></strong></p><p><img src="http://images.cnitblog.com/blog/528088/201408/230002526901539.png" alt="" /></p><p><strong><span style="color: #ff0000;">  然后 Apply -- Debug,会出现刚才的农场画面</span></strong></p><p><strong><span style="color: #ff0000;"><strong><strong>---------------------------------------------------------------------------</strong></strong></span></strong></p><p>&nbsp;</p><p><span style="color: #ff0000;"><strong>4.但是,我想使用自己的场景。</strong></span></p><p><span style="color: #ff0000;"><strong> 在 VS 中,添加再熟悉不过的HelloWorld类(自己实现吧)</strong></span></p><p><span style="color: #ff0000;"><strong> 我将 main.lua 里面文件的代码删减一些,main 函数里面只剩下</strong></span></p><p><span style="color: #ff0000;"><strong><img src="http://images.cnitblog.com/blog/528088/201408/230006397687879.png" alt="" /></strong></span></p><p><span style="color: #ff0000;"><strong> 此时,在 VS 的&nbsp;AppDelegate::applicationDidFinishLaunching() 中,添加一句</strong></span></p><p><span style="color: #ff0000;"><strong>&nbsp; CCLOG("test");</strong></span></p><p><span style="color: #ff0000;"><strong> 然后保存,在 Cocos Code Ide 中,右键项目 --- Easy Shell --- Open... &nbsp;输入 cocos compile -p win32,运行</strong></span></p><p><span style="color: #ff0000;"><strong> <img src="http://images.cnitblog.com/blog/528088/201408/230014576741593.png" alt="" /></strong></span></p><p><span style="color: #ff0000;"><strong> 会出现刚才添加那句的测试。</strong></span></p><p><span style="color: #ff0000;"><strong>&nbsp; &nbsp;注:<strong>cocos compile -p win32 命令 是在你频繁的修改 C++ 代码后,不再需要在 Cocos Code Ide中,右键设置 Build Win32 Runtime</strong></strong></span></p><p><span style="color: #ff0000;"><strong><strong> 记住在修改 C++代码后,一定要保存。</strong></strong></span></p><p><span style="color: #ff0000;"><strong><strong><strong>---------------------------------------------------------------------------</strong></strong></strong></span></p><p><span style="color: #ff0000;"><strong> 5.接下来替换自己的场景,一般在AppDelegate的applicationDidFinishLaunching()里面创建并runwithscene(),</strong></span><span style="color: #ff0000;"><strong>试了试,发现不好使,后来发现,场景的入口,在 Runtime.cpp 文件,里面有个startRuntime() 函数</strong></span></p><p><span style="color: #ff0000;"><strong> <img src="http://images.cnitblog.com/blog/528088/201408/230021165492575.png" alt="" /></strong></span></p><p><span style="color: #ff0000;"><strong> 将里面的场景,替换成 HelloWorld 的场景,将下面的 2行 注释,ConnectWaitLayer 是上面实现的一个 Layer,就是刚开始看到的带有IP地址的一个层,</strong></span></p><p><span style="color: #ff0000;"><strong> 然后保存,输入 cocos compile -p win32,运行,会出现你想要的场景。</strong></span></p><p><span style="color: #ff0000;"><strong> 若你在HelloWorld.cpp 的 init() 函数里面,只添加一个背景层,设置位置,运行后,会出现先正常,然后放大的现象,只要把 main.lua 里面的</strong></span></p><p><span style="color: #ff0000;"><strong>&nbsp; &nbsp;cc.Director:getInstance():getOpenGLView():setDesignResolutionSize(480, 320, 0) 注释掉,就好了。</strong></span></p><p>&nbsp;</p><img src="http://counter.cnblogs.com/blog/rss/3930497" width="1" height="1" alt=""/><br/><p>本文链接:<a href="http://www.cnblogs.com/zxoling/p/3930497.html" target="_blank">Cocos_Code_Ide学习(一):理解Cocos Lua Project下的frameworks的proj.win32</a>,转载请注明。</p>http://www.cnblogs.com/carlos-vic/p/YueCi_2.html和我一起开发Android应用(二)——“悦词-i背单词”项目功能分析 - Carlos.V好几天没有更新了,给关心这个系列的朋友们说声抱歉。今天我们开始第二节,项目功能分析。因为这个背单词软件虽说功能比较简单,但要真正实现起来也挺麻烦的。所以今天我们首先分析一下这个应用的功能,然后逐条慢慢实现。 PS:这款应用已经上线91助手,百度移动应用和应用宝,有兴趣下来研究的可以百度搜索“悦...2014-08-22T15:40:00Z2014-08-22T15:40:00ZCarlos.Vhttp://www.cnblogs.com/carlos-vic/<p>  好几天没有更新了,给关心这个系列的朋友们说声抱歉。今天我们开始第二节,项目功能分析。因为这个背单词软件虽说功能比较简单,但要真正实现起来也挺麻烦的。所以今天我们首先分析一下这个应用的功能,然后逐条慢慢实现。</p><p>&nbsp; &nbsp; &nbsp;PS:这款应用已经上线91助手,百度移动应用和应用宝,有兴趣下来研究的可以百度搜索&ldquo;悦词i背单词91&rdquo;就可找到,我想真正用一下这个应用再看这个教程会有比较直观的理解。好废话不多讲,进入正题。</p><p>  功能分析:</p><p>功能1、查单词。</p><p>  实现方法:金山词霸开放平台提供了一个开放API,通过Http访问金山词霸API提供的URL,可以获得一个XML文档,这个文档就包含了要查询的单词的释义、例句、音标、声音的地址。通过解析该XML就可以获得单词的所有信息。</p><p>  所用到的技术:</p><p>    1)Http访问网络,并下载网络文件</p><p>    2)对SD卡进行操作,从SD卡(这里的SD卡是指手机默认的存储卡,因为有些手机既  能能插SD卡又有内部存储,这里不涉及这个问题)中读取文件,和把从网络下载的文件存进  SD卡。</p><p>    3)解析XML文件</p><p>    4)播放音乐(这个我后来封装成了一个类,专门从网络上查询某个单词,解析XML文   件,并且将下载的Mp3文件存在SD卡中,然后播放该Mp3文件)</p><p>    5)数据库,这里涉及到第一个数据库,每查找一个单词之后,就会将该单词和释义存储  到一个SQLite数据库中。这样一来,下一次查找这个单词时,先访问数据库,看看数据库中  有没有这个单词,若有,就不用访问网络了。</p><p>&nbsp;</p><p>功能2、背单词。</p><p>  实现方法:这里要用到第二个数据库,背单词的词库。我们需要一个存放单词的TXT文件,通过解析这个TXT文件,将要背的单词解析并存进数据库中,然后根据一定的规律弹出单词。</p><p>  所用到的技术:</p><p>    1)数据库,同前面的数据库技术相似;</p><p>    2)对TXT文件中的单词进行解析,字符串解析函数;</p><p>    3)单词状态机,设计一定的算法,按照一定的规律弹出单词,并进行背词操作。(这个确实挺麻烦)</p><p>    4)文件浏览,做一个简易的文件浏览器,用于浏览SD卡中的单词源文件txt,然后导入词库。这个属于比较单独的一个功能。</p><p>功能3、设置界面</p><p>  用于对背词软件的一些参数进行设置,比如播放英音还是美音?前后两个的单词的背词间隔是多少?导入词库设置?计划完成日期,以及当前课程的名称设置。</p><p>功能4、金山词霸每日一词</p><p>  实现方法:这里要用到第三个数据库(就是数据库的一个表table),用于记录使用者的信息,如当前日期,当日期有更新时,应用会自动访问网络,获取最新的额每日一句,并且呈现在主界面上;当前背单词的完成进度,今天已经背的单词,待完成的单词,以及根据计划完成日期算出今天应该的单词的任务,(关于这一点大家可以参考拓词的实现效果)</p><p>  所用到的技术:</p><p>    1)数据库技术;</p><p>    2)Http访问网络,从网络下载图片并显示。</p><p>&nbsp; &nbsp; &nbsp;注意这一个功能虽然看似简单,但是,实现这个功能之后这个应用才显得活起来^^</p><p>&nbsp;</p><p>好了以上就是这款应用的主要框架。今天我们就来开始实现第一个功能:查单词功能。</p><p>  首先讲一下金山词霸API:浏览器输入http://open.iciba.com/就会出现啊如下界面:</p><p><img src="http://images.cnitblog.com/blog/552704/201408/222232417213158.png" alt="" width="656" height="413" /></p><p>点击词霸查词、并选择文档选项,http://open.iciba.com/?c=wiki,就可以看到如下界面:</p><p><img src="http://images.cnitblog.com/blog/552704/201408/222234265035234.png" alt="" width="653" height="434" /></p><p>再点击查词接口,就到了final page:</p><p><img src="http://images.cnitblog.com/blog/552704/201408/222235431438149.png" alt="" width="750" height="527" /></p><p>大家会注意到我们需要的东西:<a href="http://dict-co.iciba.com/api/dictionary.php?w=go" target="_blank">http://dict-co.iciba.com/api/dictionary.php?w=go&amp;key=********</a>&nbsp; 这里的key是你自己申请的金山词霸开放平台的API key,申请界面在这里:</p><p><img src="http://images.cnitblog.com/blog/552704/201408/222238379712994.png" alt="" /></p><p>网址随便填即可</p><p>当你申请到金山API key之后,就可在浏览器输出上面的地址:<a href="http://dict-co.iciba.com/api/dictionary.php?w=go" target="_blank">http://dict-co.iciba.com/api/dictionary.php?w=go&amp;key=</a>这里换成你的API key.&nbsp;</p><p>   这里多说一句,为什么选金山词霸API呢,其实有道词典也有开放API,但它提供的数据远不如金山词霸,最重要的一点:金山提供的单词的发音(金山真是够仗义的)</p><p>例如我们查一个hello,就可以在浏览器输入<a href="http://dict-co.iciba.com/api/dictionary.php?w=go" target="_blank">http://dict-co.iciba.com/api/dictionary.php?w=hello&amp;key</a><span style="text-decoration: underline;">=这里换成你的API key</span>. &nbsp; &nbsp;就是把w=后面写成hello,注意首字母必须小写!</p><div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">dict </span><span style="color: #ff0000;">num</span><span style="color: #0000ff;">="219"</span><span style="color: #ff0000;"> id</span><span style="color: #0000ff;">="219"</span><span style="color: #ff0000;"> name</span><span style="color: #0000ff;">="219"</span><span style="color: #0000ff;">&gt;</span><br/><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">key</span><span style="color: #0000ff;">&gt;</span>hello<span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">key</span><span style="color: #0000ff;">&gt;</span><br/><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">ps</span><span style="color: #0000ff;">&gt;</span>h?'l??<span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">ps</span><span style="color: #0000ff;">&gt;</span><br/><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">pron</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br/>http://res-tts.iciba.com/5/d/4/5d41402abc4b2a76b9719d911017c592.mp3<br/></span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">pron</span><span style="color: #0000ff;">&gt;</span><br/><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">ps</span><span style="color: #0000ff;">&gt;</span>h??lo, h?-<span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">ps</span><span style="color: #0000ff;">&gt;</span><br/><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">pron</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br/>http://res.iciba.com/resource/amp3/1/0/5d/41/5d41402abc4b2a76b9719d911017c592.mp3<br/></span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">pron</span><span style="color: #0000ff;">&gt;</span><br/><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">pos</span><span style="color: #0000ff;">&gt;</span>int.<span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">pos</span><span style="color: #0000ff;">&gt;</span><br/><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">acceptation</span><span style="color: #0000ff;">&gt;</span>哈喽,喂;你好,您好;表示问候;打招呼;<span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">acceptation</span><span style="color: #0000ff;">&gt;</span><br/><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">pos</span><span style="color: #0000ff;">&gt;</span>n.<span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">pos</span><span style="color: #0000ff;">&gt;</span><br/><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">acceptation</span><span style="color: #0000ff;">&gt;</span>&ldquo;喂&rdquo;的招呼声或问候声;<span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">acceptation</span><span style="color: #0000ff;">&gt;</span><br/><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">pos</span><span style="color: #0000ff;">&gt;</span>vi.<span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">pos</span><span style="color: #0000ff;">&gt;</span><br/><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">acceptation</span><span style="color: #0000ff;">&gt;</span>喊&ldquo;喂&rdquo;;<span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">acceptation</span><span style="color: #0000ff;">&gt;</span><br/><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">sent</span><span style="color: #0000ff;">&gt;</span><br/><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">orig</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br/>This document contains Hello application components of each document summary of the contents.<br/></span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">orig</span><span style="color: #0000ff;">&gt;</span><br/><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">trans</span><span style="color: #0000ff;">&gt;</span>此文件包含组成Hello应用程序的每个文件的内容摘要.<span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">trans</span><span style="color: #0000ff;">&gt;</span><br/><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">sent</span><span style="color: #0000ff;">&gt;</span><br/><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">sent</span><span style="color: #0000ff;">&gt;</span><br/><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">orig</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br/>In the following example, CL produces a combined source and machine - code listing called HELLO. COD.<br/></span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">orig</span><span style="color: #0000ff;">&gt;</span><br/><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">trans</span><span style="color: #0000ff;">&gt;</span>在下面的例子中, CL将产生一个命名为HELLO. COD的源代码与机器代码组合的清单文件.<span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">trans</span><span style="color: #0000ff;">&gt;</span><br/><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">sent</span><span style="color: #0000ff;">&gt;</span><br/><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">sent</span><span style="color: #0000ff;">&gt;</span><br/><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">orig</span><span style="color: #0000ff;">&gt;</span>Hello! Hello! Hello! Hello! Hel - lo!<span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">orig</span><span style="color: #0000ff;">&gt;</span><br/><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">trans</span><span style="color: #0000ff;">&gt;</span>你好! 你好! 你好! 你好! 你好!<span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">trans</span><span style="color: #0000ff;">&gt;</span><br/><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">sent</span><span style="color: #0000ff;">&gt;</span><br/><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">sent</span><span style="color: #0000ff;">&gt;</span><br/><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">orig</span><span style="color: #0000ff;">&gt;</span>Hello! Hello! Hello! Hello ! I'm glad to meet you.<span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">orig</span><span style="color: #0000ff;">&gt;</span><br/><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">trans</span><span style="color: #0000ff;">&gt;</span>你好! 你好! 你好! 你好! 见到你很高兴.<span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">trans</span><span style="color: #0000ff;">&gt;</span><br/><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">sent</span><span style="color: #0000ff;">&gt;</span><br/><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">sent</span><span style="color: #0000ff;">&gt;</span><br/><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">orig</span><span style="color: #0000ff;">&gt;</span>Hello Marie. Hello Berlioz. Hello Toulouse.<span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">orig</span><span style="color: #0000ff;">&gt;</span><br/><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">trans</span><span style="color: #0000ff;">&gt;</span>你好玛丽, 你好柏里欧, 你好图鲁兹.<span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">trans</span><span style="color: #0000ff;">&gt;</span><br/><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">sent</span><span style="color: #0000ff;">&gt;</span><br/><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">dict</span><span style="color: #0000ff;">&gt;</span></div><p>这个XML中含有几个元素:key:单词本身; ps:第一个是英音音标,第二个是美音音标; pron第一个是英音的MP3地址,第二个是美音的;pos 词性; acception 词义;sent &nbsp;例句; orig例句英语;trans例句中文翻译。我们要做的就是根据XML文件把这几个元素解析出来。</p><p>  另外这里就涉及到了另一个问题:能不能查中文呢?一开始我也没搞出来,后来才发现了秘密查中文(或日文)需要在待查的词前面加上一个下划线 _ 即如 :_你好</p><p>搜索你好:http://dict-co.iciba.com/api/dictionary.php?w=_你好&amp;key=这里换成你的API key&nbsp; ,得到结果</p><div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">dict </span><span style="color: #ff0000;">num</span><span style="color: #0000ff;">="219"</span><span style="color: #ff0000;"> id</span><span style="color: #0000ff;">="219"</span><span style="color: #ff0000;"> name</span><span style="color: #0000ff;">="219"</span><span style="color: #0000ff;">&gt;</span><br/><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">key</span><span style="color: #0000ff;">&gt;</span>你好<span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">key</span><span style="color: #0000ff;">&gt;</span><br/><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">fy</span><span style="color: #0000ff;">&gt;</span>Hello<span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">fy</span><span style="color: #0000ff;">&gt;</span><br/><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">sent</span><span style="color: #0000ff;">&gt;</span><br/><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">orig</span><span style="color: #0000ff;">&gt;</span>Hello! Hello! Hello! Hello! Hel - lo!<span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">orig</span><span style="color: #0000ff;">&gt;</span><br/><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">trans</span><span style="color: #0000ff;">&gt;</span>你好! 你好! 你好! 你好! 你好!<span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">trans</span><span style="color: #0000ff;">&gt;</span><br/><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">sent</span><span style="color: #0000ff;">&gt;</span><br/><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">sent</span><span style="color: #0000ff;">&gt;</span><br/><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">orig</span><span style="color: #0000ff;">&gt;</span>Hello! Hello! Hello! Hello ! I'm glad to meet you.<span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">orig</span><span style="color: #0000ff;">&gt;</span><br/><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">trans</span><span style="color: #0000ff;">&gt;</span>你好! 你好! 你好! 你好! 见到你很高兴.<span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">trans</span><span style="color: #0000ff;">&gt;</span><br/><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">sent</span><span style="color: #0000ff;">&gt;</span><br/><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">sent</span><span style="color: #0000ff;">&gt;</span><br/><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">orig</span><span style="color: #0000ff;">&gt;</span>Hello Marie. Hello Berlioz. Hello Toulouse.<span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">orig</span><span style="color: #0000ff;">&gt;</span><br/><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">trans</span><span style="color: #0000ff;">&gt;</span>你好玛丽, 你好柏里欧, 你好图鲁兹.<span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">trans</span><span style="color: #0000ff;">&gt;</span><br/><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">sent</span><span style="color: #0000ff;">&gt;</span><br/><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">sent</span><span style="color: #0000ff;">&gt;</span><br/><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">orig</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br/>B Hi Gao. How are you doing? It's good to meet you.<br/></span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">orig</span><span style="color: #0000ff;">&gt;</span><br/><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">trans</span><span style="color: #0000ff;">&gt;</span>B你好,高. 你好 吗 ?很高兴认识你.<span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">trans</span><span style="color: #0000ff;">&gt;</span><br/><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">sent</span><span style="color: #0000ff;">&gt;</span><br/><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">sent</span><span style="color: #0000ff;">&gt;</span><br/><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">orig</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br/>Grant: Hi , Tess. Hi , Jenna. Are you doing your homework?<br/></span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">orig</span><span style="color: #0000ff;">&gt;</span><br/><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">trans</span><span style="color: #0000ff;">&gt;</span>格兰特: 你好! 苔丝. 你好! 詹娜. 你们在做家庭作业 吗 ?<span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">trans</span><span style="color: #0000ff;">&gt;</span><br/><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">sent</span><span style="color: #0000ff;">&gt;</span><br/><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">dict</span><span style="color: #0000ff;">&gt;</span></div><p>注意fy元素就是查询的意思,在解析XML文件时要考虑到这一点。</p><p>&nbsp;</p><p>  根据以上分析,我们首先需要访问网络,将这个xml文件下载下来并进行解析,下面我给出几个工具类:</p><p>访问网络类,注意对应的要在AndroidManifest.xml文件中添加访问网络权限。</p><div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"><span style="color: #0000ff;">package</span><span style="color: #000000;"> com.carlos.internet;<br/><br/></span><span style="color: #0000ff;">import</span><span style="color: #000000;"> java.io.InputStream;<br/></span><span style="color: #0000ff;">import</span><span style="color: #000000;"> java.net.HttpURLConnection;<br/></span><span style="color: #0000ff;">import</span><span style="color: #000000;"> java.net.URL;<br/><br/></span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">class</span><span style="color: #000000;"> NetOperator {<br/> </span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">final</span> <span style="color: #0000ff;">static</span> String iCiBaURL1="http://dict-co.iciba.com/api/dictionary.php?w="<span style="color: #000000;">;<br/> </span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">final</span> <span style="color: #0000ff;">static</span> String iCiBaURL2="&amp;key=你申请的APIkey,不要忘记了替换!!"<span style="color: #000000;">; 注意!<br/> <br/> </span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">static</span><span style="color: #000000;"> InputStream getInputStreamByUrl(String urlStr){<br/> InputStream tempInput</span>=<span style="color: #0000ff;">null</span><span style="color: #000000;">;<br/> URL url</span>=<span style="color: #0000ff;">null</span><span style="color: #000000;">;<br/> HttpURLConnection connection</span>=<span style="color: #0000ff;">null</span><span style="color: #000000;">; <br/> </span><span style="color: #008000;">//</span><span style="color: #008000;">设置超时时间</span><br/> <br/> <span style="color: #0000ff;">try</span><span style="color: #000000;">{<br/> url</span>=<span style="color: #0000ff;">new</span><span style="color: #000000;"> URL(urlStr);<br/> connection</span>=(HttpURLConnection)url.openConnection(); <span style="color: #008000;">//</span><span style="color: #008000;">别忘了强制类型转换</span><br/> connection.setConnectTimeout(8000<span style="color: #000000;">);<br/> connection.setReadTimeout(</span>10000<span style="color: #000000;">);<br/> tempInput</span>=<span style="color: #000000;">connection.getInputStream();<br/> }</span><span style="color: #0000ff;">catch</span><span style="color: #000000;">(Exception e){<br/> e.printStackTrace();<br/> }<br/> </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> tempInput;<br/> }<br/><br/>}</span></div><p>&nbsp;</p><p> 这个类的功能就是根据给出的URL,从网络获得输入流,iCiBaURL1 和iCiBaURL2是用于构成查单词的URL的。iCiBaURL1+要查的单词+iCiBaURL2 &nbsp;就构成了金山查单词的URL</p><p>这里首先给出一个对象WordValue,该对象用来存放一个单词的信息:</p><div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">class</span><span style="color: #000000;"> WordValue {<br/> </span><span style="color: #0000ff;">public</span> String word=<span style="color: #0000ff;">null</span>,psE=<span style="color: #0000ff;">null</span>,pronE=<span style="color: #0000ff;">null</span>,psA=<span style="color: #0000ff;">null</span>,pronA=<span style="color: #0000ff;">null</span><span style="color: #000000;">,<br/> interpret</span>=<span style="color: #0000ff;">null</span>,sentOrig=<span style="color: #0000ff;">null</span>,sentTrans=<span style="color: #0000ff;">null</span><span style="color: #000000;">;<br/> <br/> <br/><br/> </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> WordValue(String word, String psE, String pronE, String psA,<br/> String pronA, String interpret, String sentOrig, String sentTrans) {<br/> </span><span style="color: #0000ff;">super</span><span style="color: #000000;">();<br/> </span><span style="color: #0000ff;">this</span>.word = ""+<span style="color: #000000;">word;<br/> </span><span style="color: #0000ff;">this</span>.psE = ""+<span style="color: #000000;">psE;<br/> </span><span style="color: #0000ff;">this</span>.pronE = ""+<span style="color: #000000;">pronE;<br/> </span><span style="color: #0000ff;">this</span>.psA = ""+<span style="color: #000000;">psA;<br/> </span><span style="color: #0000ff;">this</span>.pronA = ""+<span style="color: #000000;">pronA;<br/> </span><span style="color: #0000ff;">this</span>.interpret = ""+<span style="color: #000000;">interpret;<br/> </span><span style="color: #0000ff;">this</span>.sentOrig = ""+<span style="color: #000000;">sentOrig;<br/> </span><span style="color: #0000ff;">this</span>.sentTrans = ""+<span style="color: #000000;">sentTrans;<br/> }<br/><br/> </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> WordValue() {<br/> </span><span style="color: #0000ff;">super</span><span style="color: #000000;">();<br/> </span><span style="color: #0000ff;">this</span>.word = ""; <span style="color: #008000;">//</span><span style="color: #008000;">防止空指针异常</span><br/> <span style="color: #0000ff;">this</span>.psE = ""<span style="color: #000000;">;<br/> </span><span style="color: #0000ff;">this</span>.pronE = ""<span style="color: #000000;">;<br/> </span><span style="color: #0000ff;">this</span>.psA = ""<span style="color: #000000;">;<br/> </span><span style="color: #0000ff;">this</span>.pronA = ""<span style="color: #000000;">;<br/> </span><span style="color: #0000ff;">this</span>.interpret = ""<span style="color: #000000;">;<br/> </span><span style="color: #0000ff;">this</span>.sentOrig = ""<span style="color: #000000;">;<br/> </span><span style="color: #0000ff;">this</span>.sentTrans = ""<span style="color: #000000;">;<br/> <br/> <br/> }<br/> <br/> </span><span style="color: #0000ff;">public</span> ArrayList&lt;String&gt;<span style="color: #000000;"> getOrigList(){<br/> ArrayList</span>&lt;String&gt; list=<span style="color: #0000ff;">new</span> ArrayList&lt;String&gt;<span style="color: #000000;">();<br/> BufferedReader br</span>=<span style="color: #0000ff;">new</span> BufferedReader(<span style="color: #0000ff;">new</span> StringReader(<span style="color: #0000ff;">this</span><span style="color: #000000;">.sentOrig));<br/> String str</span>=<span style="color: #0000ff;">null</span><span style="color: #000000;">;<br/> </span><span style="color: #0000ff;">try</span><span style="color: #000000;">{<br/> </span><span style="color: #0000ff;">while</span>((str=br.readLine())!=<span style="color: #0000ff;">null</span><span style="color: #000000;">){<br/> list.add(str);<br/> }<br/> }</span><span style="color: #0000ff;">catch</span><span style="color: #000000;">(Exception e){<br/> e.printStackTrace();<br/> }<br/> </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> list;<br/> }<br/> <br/> </span><span style="color: #0000ff;">public</span> ArrayList&lt;String&gt;<span style="color: #000000;"> getTransList(){<br/> ArrayList</span>&lt;String&gt; list=<span style="color: #0000ff;">new</span> ArrayList&lt;String&gt;<span style="color: #000000;">();<br/> BufferedReader br</span>=<span style="color: #0000ff;">new</span> BufferedReader(<span style="color: #0000ff;">new</span> StringReader(<span style="color: #0000ff;">this</span><span style="color: #000000;">.sentTrans));<br/> String str</span>=<span style="color: #0000ff;">null</span><span style="color: #000000;">;<br/> </span><span style="color: #0000ff;">try</span><span style="color: #000000;">{<br/> </span><span style="color: #0000ff;">while</span>((str=br.readLine())!=<span style="color: #0000ff;">null</span><span style="color: #000000;">){<br/> list.add(str);<br/> }<br/> }</span><span style="color: #0000ff;">catch</span><span style="color: #000000;">(Exception e){<br/> e.printStackTrace();<br/> }<br/> </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> list;<br/> }<br/> <br/><br/> </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> String getWord() {<br/> </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> word;<br/> }<br/><br/> </span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">void</span><span style="color: #000000;"> setWord(String word) {<br/> </span><span style="color: #0000ff;">this</span>.word =<span style="color: #000000;"> word;<br/> }<br/><br/> </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> String getPsE() {<br/> </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> psE;<br/> }<br/><br/> </span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">void</span><span style="color: #000000;"> setPsE(String psE) {<br/> </span><span style="color: #0000ff;">this</span>.psE =<span style="color: #000000;"> psE;<br/> }<br/><br/> </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> String getPronE() {<br/> </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> pronE;<br/> }<br/><br/> </span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">void</span><span style="color: #000000;"> setPronE(String pronE) {<br/> </span><span style="color: #0000ff;">this</span>.pronE =<span style="color: #000000;"> pronE;<br/> }<br/><br/> </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> String getPsA() {<br/> </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> psA;<br/> }<br/><br/> </span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">void</span><span style="color: #000000;"> setPsA(String psA) {<br/> </span><span style="color: #0000ff;">this</span>.psA =<span style="color: #000000;"> psA;<br/> }<br/><br/> </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> String getPronA() {<br/> </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> pronA;<br/> }<br/><br/> </span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">void</span><span style="color: #000000;"> setPronA(String pronA) {<br/> </span><span style="color: #0000ff;">this</span>.pronA =<span style="color: #000000;"> pronA;<br/> }<br/><br/> </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> String getInterpret() {<br/> </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> interpret;<br/> }<br/><br/> </span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">void</span><span style="color: #000000;"> setInterpret(String interpret) {<br/> </span><span style="color: #0000ff;">this</span>.interpret =<span style="color: #000000;"> interpret;<br/> }<br/><br/> </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> String getSentOrig() {<br/> </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> sentOrig;<br/> }<br/><br/> </span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">void</span><span style="color: #000000;"> setSentOrig(String sentOrig) {<br/> </span><span style="color: #0000ff;">this</span>.sentOrig =<span style="color: #000000;"> sentOrig;<br/> }<br/><br/> </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> String getSentTrans() {<br/> </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> sentTrans;<br/> }<br/><br/> </span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">void</span><span style="color: #000000;"> setSentTrans(String sentTrans) {<br/> </span><span style="color: #0000ff;">this</span>.sentTrans =<span style="color: #000000;"> sentTrans;<br/> }<br/> <br/> </span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">void</span><span style="color: #000000;"> printInfo(){<br/> System.out.println(</span><span style="color: #0000ff;">this</span><span style="color: #000000;">.word);<br/> System.out.println(</span><span style="color: #0000ff;">this</span><span style="color: #000000;">.psE);<br/> System.out.println(</span><span style="color: #0000ff;">this</span><span style="color: #000000;">.pronE);<br/> System.out.println(</span><span style="color: #0000ff;">this</span><span style="color: #000000;">.psA);<br/> System.out.println(</span><span style="color: #0000ff;">this</span><span style="color: #000000;">.pronA);<br/> System.out.println(</span><span style="color: #0000ff;">this</span><span style="color: #000000;">.interpret);<br/> System.out.println(</span><span style="color: #0000ff;">this</span><span style="color: #000000;">.sentOrig);<br/> System.out.println(</span><span style="color: #0000ff;">this</span><span style="color: #000000;">.sentTrans);<br/><br/> }<br/> <br/><br/>}</span></div><p>大家从成员变量的名字就可以看出,这个对象中的成员就对应从XML文件中解析出来的各个元素,大家可以在上面XML的介绍中找对应。</p><p>&nbsp;</p><p>接下来是一个ContentHandler对象,用于对XML的解析:</p><div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">class</span> JinShanContentHandler <span style="color: #0000ff;">extends</span><span style="color: #000000;"> DefaultHandler{<br/><br/> </span><span style="color: #0000ff;">public</span> WordValue wordValue=<span style="color: #0000ff;">null</span><span style="color: #000000;">;<br/> </span><span style="color: #0000ff;">private</span> String tagName=<span style="color: #0000ff;">null</span><span style="color: #000000;">;<br/> </span><span style="color: #0000ff;">private</span> String interpret=""; <span style="color: #008000;">//</span><span style="color: #008000;">防止空指针异常</span><br/> <span style="color: #0000ff;">private</span> String orig=""<span style="color: #000000;">;<br/> </span><span style="color: #0000ff;">private</span> String trans=""<span style="color: #000000;">;<br/> </span><span style="color: #0000ff;">private</span> <span style="color: #0000ff;">boolean</span> isChinese=<span style="color: #0000ff;">false</span><span style="color: #000000;">;<br/> </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> JinShanContentHandler(){<br/> wordValue</span>=<span style="color: #0000ff;">new</span><span style="color: #000000;"> WordValue();<br/> isChinese</span>=<span style="color: #0000ff;">false</span><span style="color: #000000;">;<br/> }<br/> <br/> </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> WordValue getWordValue(){<br/> <br/> </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> wordValue;<br/> }<br/> <br/> @Override<br/> </span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">void</span> characters(<span style="color: #0000ff;">char</span>[] ch, <span style="color: #0000ff;">int</span> start, <span style="color: #0000ff;">int</span><span style="color: #000000;"> length)<br/> </span><span style="color: #0000ff;">throws</span><span style="color: #000000;"> SAXException {<br/> </span><span style="color: #008000;">//</span><span style="color: #008000;"> TODO Auto-generated method stub</span><br/> <span style="color: #0000ff;">super</span><span style="color: #000000;">.characters(ch, start, length);<br/> </span><span style="color: #0000ff;">if</span>(length&lt;=0<span style="color: #000000;">)<br/> </span><span style="color: #0000ff;">return</span><span style="color: #000000;">;<br/> </span><span style="color: #0000ff;">for</span>(<span style="color: #0000ff;">int</span> i=start; i&lt;start+length; i++<span style="color: #000000;">){<br/> </span><span style="color: #0000ff;">if</span>(ch[i]=='\n'<span style="color: #000000;">)<br/> </span><span style="color: #0000ff;">return</span><span style="color: #000000;">;<br/> }<br/> <br/> </span><span style="color: #008000;">//</span><span style="color: #008000;">去除莫名其妙的换行!</span><br/><span style="color: #000000;"> <br/> String str</span>=<span style="color: #0000ff;">new</span><span style="color: #000000;"> String(ch,start,length);<br/> </span><span style="color: #0000ff;">if</span>(tagName=="key"<span style="color: #000000;">){<br/> wordValue.setWord(str);<br/> }</span><span style="color: #0000ff;">else</span> <span style="color: #0000ff;">if</span>(tagName=="ps"<span style="color: #000000;">){<br/> </span><span style="color: #0000ff;">if</span>(wordValue.getPsE().length()&lt;=0<span style="color: #000000;">){<br/> wordValue.setPsE(str);<br/> }</span><span style="color: #0000ff;">else</span><span style="color: #000000;">{<br/> wordValue.setPsA(str);<br/> }<br/> }</span><span style="color: #0000ff;">else</span> <span style="color: #0000ff;">if</span>(tagName=="pron"<span style="color: #000000;">){<br/> </span><span style="color: #0000ff;">if</span>(wordValue.getPronE().length()&lt;=0<span style="color: #000000;">){<br/> wordValue.setPronE(str);<br/> }</span><span style="color: #0000ff;">else</span><span style="color: #000000;">{<br/> wordValue.setPronA(str);<br/> }<br/> }</span><span style="color: #0000ff;">else</span> <span style="color: #0000ff;">if</span>(tagName=="pos"<span style="color: #000000;">){<br/> isChinese</span>=<span style="color: #0000ff;">false</span><span style="color: #000000;">;<br/> interpret</span>=interpret+str+" "<span style="color: #000000;">;<br/> }</span><span style="color: #0000ff;">else</span> <span style="color: #0000ff;">if</span>(tagName=="acceptation"<span style="color: #000000;">){<br/> interpret</span>=interpret+str+"\n"<span style="color: #000000;">;<br/> interpret</span>=wordValue.getInterpret()+<span style="color: #000000;">interpret;<br/> wordValue.setInterpret(interpret);<br/> interpret</span>=""; <span style="color: #008000;">//</span><span style="color: #008000;">初始化操作,预防有多个释义</span><br/> }<span style="color: #0000ff;">else</span> <span style="color: #0000ff;">if</span>(tagName=="orig"<span style="color: #000000;">){<br/> <br/> <br/> orig</span>=<span style="color: #000000;">wordValue.getSentOrig();<br/> wordValue.setSentOrig(orig</span>+str+"\n"<span style="color: #000000;">);<br/> <br/> <br/> }</span><span style="color: #0000ff;">else</span> <span style="color: #0000ff;">if</span>(tagName=="trans"<span style="color: #000000;">){<br/> String temp</span>=wordValue.getSentTrans()+str+"\n"<span style="color: #000000;">;<br/> wordValue.setSentTrans(temp);<br/> <br/> }</span><span style="color: #0000ff;">else</span> <span style="color: #0000ff;">if</span>(tagName=="fy"<span style="color: #000000;">){<br/> isChinese</span>=<span style="color: #0000ff;">true</span><span style="color: #000000;">;<br/> wordValue.setInterpret(str);<br/> }<br/><br/><br/> }<br/><br/><br/><br/> @Override<br/> </span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">void</span><span style="color: #000000;"> endElement(String uri, String localName, String qName)<br/> </span><span style="color: #0000ff;">throws</span><span style="color: #000000;"> SAXException {<br/> </span><span style="color: #008000;">//</span><span style="color: #008000;"> TODO Auto-generated method stub</span><br/> <span style="color: #0000ff;">super</span><span style="color: #000000;">.endElement(uri, localName, qName);<br/> tagName</span>=<span style="color: #0000ff;">null</span><span style="color: #000000;">;<br/> <br/><br/> }<br/><br/><br/> @Override<br/> </span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">void</span><span style="color: #000000;"> startElement(String uri, String localName, String qName,<br/> Attributes attributes) </span><span style="color: #0000ff;">throws</span><span style="color: #000000;"> SAXException {<br/> </span><span style="color: #008000;">//</span><span style="color: #008000;"> TODO Auto-generated method stub</span><br/> <span style="color: #0000ff;">super</span><span style="color: #000000;">.startElement(uri, localName, qName, attributes);<br/> tagName</span>=<span style="color: #000000;">localName;<br/> }<br/><br/> @Override<br/> </span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">void</span> endDocument() <span style="color: #0000ff;">throws</span><span style="color: #000000;"> SAXException {<br/> </span><span style="color: #008000;">//</span><span style="color: #008000;"> TODO Auto-generated method stub</span><br/> <span style="color: #0000ff;">super</span><span style="color: #000000;">.endDocument();<br/> </span><span style="color: #0000ff;">if</span><span style="color: #000000;">(isChinese)<br/> </span><span style="color: #0000ff;">return</span><span style="color: #000000;">;<br/> String interpret</span>=<span style="color: #000000;">wordValue.getInterpret();<br/> </span><span style="color: #0000ff;">if</span>(interpret!=<span style="color: #0000ff;">null</span> &amp;&amp; interpret.length()&gt;0<span style="color: #000000;">){<br/> </span><span style="color: #0000ff;">char</span>[] strArray=<span style="color: #000000;">interpret.toCharArray();<br/> wordValue.setInterpret(</span><span style="color: #0000ff;">new</span> String(strArray,0,interpret.length()-1<span style="color: #000000;">));<br/> </span><span style="color: #008000;">//</span><span style="color: #008000;">去掉解释的最后一个换行符</span><br/><span style="color: #000000;"> }<br/> <br/> }<br/> <br/> <br/> <br/><br/>}</span></div><p>这里要注意的是:关于XML解析的基本知识我不想讲了,因为要讲这样细的话我三个月也完成不了这个系列。大家若有不懂的可以参考Mars 陈川老师的安卓开发视频教程,非常基础,入门必备。</p><p>关于XML解析基本就是用的他的的思路,但我想补充几点细节的东西:</p><p>  1)不仅在startElement()之后会调用character()方法,在endElement()之后也会调用character90方法;</p><p>&nbsp; &nbsp; &nbsp;2)在具有多层的元素如上面的sent元素里面有嵌套了orig 和trans元素,此时character()方法并不会严格地在startElement之后就立即调用;</p><p>以上两点就会导致一个问题:会把多余的空行(换行符)也读取进来,所以我在程序中添加了清除换行的代码。请看注释。</p><p>&nbsp; &nbsp; &nbsp;3)这里也考虑了查英文的翻译结果是pos acception &nbsp;而查中文的翻译结果是 fy ,可以看看上面ContentHandler中character()方法,这个方法是核心。</p><p>&nbsp;</p><p>接下来就是一个XMLParser对象,该对象把XML解析用的SAXParserFactory等获取实例的工作封装起来,有了这个对象,解析XML时只需创建一个XMLParser对象,调用的该对象的parseJinShanXml()方法即可。</p><div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">class</span><span style="color: #000000;"> XMLParser {<br/> </span><span style="color: #0000ff;">public</span> SAXParserFactory factory=<span style="color: #0000ff;">null</span><span style="color: #000000;">;<br/> </span><span style="color: #0000ff;">public</span> XMLReader reader=<span style="color: #0000ff;">null</span><span style="color: #000000;">;<br/> <br/> </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> XMLParser(){<br/> <br/> </span><span style="color: #0000ff;">try</span><span style="color: #000000;"> {<br/> factory</span>=<span style="color: #000000;">SAXParserFactory.newInstance();<br/> reader</span>=<span style="color: #000000;">factory.newSAXParser().getXMLReader();<br/> } </span><span style="color: #0000ff;">catch</span><span style="color: #000000;"> (Exception e) {<br/> </span><span style="color: #008000;">//</span><span style="color: #008000;"> TODO Auto-generated catch block</span><br/><span style="color: #000000;"> e.printStackTrace();<br/> }<br/> }<br/> <br/> </span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">void</span><span style="color: #000000;"> parseJinShanXml(DefaultHandler content, InputSource inSource){<br/> </span><span style="color: #0000ff;">if</span>(inSource==<span style="color: #0000ff;">null</span><span style="color: #000000;">)<br/> </span><span style="color: #0000ff;">return</span><span style="color: #000000;">;<br/> </span><span style="color: #0000ff;">try</span><span style="color: #000000;"> {<br/> reader.setContentHandler(content);<br/> reader.parse(inSource);<br/> } </span><span style="color: #0000ff;">catch</span><span style="color: #000000;"> (Exception e) {<br/> </span><span style="color: #008000;">//</span><span style="color: #008000;"> TODO Auto-generated catch block</span><br/><span style="color: #000000;"> e.printStackTrace(); <br/> } <br/> <br/> }<br/> <br/> </span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">void</span><span style="color: #000000;"> parseDailySentenceXml(DailySentContentHandler contentHandler, InputSource inSource){<br/> </span><span style="color: #0000ff;">if</span>(inSource==<span style="color: #0000ff;">null</span><span style="color: #000000;">)<br/> </span><span style="color: #0000ff;">return</span><span style="color: #000000;">;<br/> </span><span style="color: #0000ff;">try</span><span style="color: #000000;"> {<br/> reader.setContentHandler(contentHandler);<br/> reader.parse(inSource);<br/> } </span><span style="color: #0000ff;">catch</span><span style="color: #000000;"> (Exception e) {<br/> </span><span style="color: #008000;">//</span><span style="color: #008000;"> TODO Auto-generated catch block</span><br/><span style="color: #000000;"> e.printStackTrace(); <br/> } <br/> }<br/> <br/><br/>}</span></div><p>大家可以看到还有一个&nbsp;parseDailySentenceXml()方法,这是解析每日一句的,暂时不用管它。</p><p>&nbsp;</p><p>那么如何根据一个单词来获取它的XML并进行解析呢?即如何进行调用?方法如下:</p><div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"><span style="color: #0000ff;">public</span><span style="color: #000000;"> WordValue getWordFromInternet(String searchedWord){<br/> WordValue wordValue</span>=<span style="color: #0000ff;">null</span><span style="color: #000000;">;<br/> String tempWord</span>=<span style="color: #000000;">searchedWord;<br/> </span><span style="color: #0000ff;">if</span>(tempWord==<span style="color: #0000ff;">null</span>&amp;&amp; tempWord.equals(""<span style="color: #000000;">))<br/> </span><span style="color: #0000ff;">return</span> <span style="color: #0000ff;">null</span><span style="color: #000000;">;<br/> </span><span style="color: #0000ff;">char</span>[] array=<span style="color: #000000;">tempWord.toCharArray();<br/> </span><span style="color: #0000ff;">if</span>(array[0]&gt;256) <span style="color: #008000;">//</span><span style="color: #008000;">是中文,或其他语言的的简略判断</span><br/> tempWord="_"+<span style="color: #000000;">URLEncoder.encode(tempWord);<br/> InputStream in</span>=<span style="color: #0000ff;">null</span><span style="color: #000000;">;<br/> String str</span>=<span style="color: #0000ff;">null</span><span style="color: #000000;">;<br/> </span><span style="color: #0000ff;">try</span><span style="color: #000000;">{<br/> String tempUrl</span>=NetOperator.iCiBaURL1+tempWord+<span style="color: #000000;">NetOperator.iCiBaURL2;<br/> in</span>=<span style="color: #000000;">NetOperator.getInputStreamByUrl(tempUrl); //从网络获得输入流<br/> </span><span style="color: #0000ff;">if</span>(in!=<span style="color: #0000ff;">null</span><span style="color: #000000;">){<br/> <span style="color: #00ff00;">//</span></span><span style="color: #00ff00;">new FileUtils().saveInputStreamToFile(in, "", "gfdgf.txt"</span><span style="color: #000000;"><span style="color: #00ff00;">); </span> <br/> XMLParser xmlParser</span>=<span style="color: #0000ff;">new</span><span style="color: #000000;"> XMLParser();<br/> InputStreamReader reader</span>=<span style="color: #0000ff;">new</span> InputStreamReader(in,"utf-8"<span style="color: #000000;">); //最终目的获得一个InputSource对象用于传入形参<br/> JinShanContentHandler contentHandler</span>=<span style="color: #0000ff;">new</span><span style="color: #000000;"> JinShanContentHandler();<br/> xmlParser.parseJinShanXml(contentHandler, </span><span style="color: #0000ff;">new</span><span style="color: #000000;"> InputSource(reader));<br/> wordValue</span>=<span style="color: #000000;">contentHandler.getWordValue();<br/> wordValue.setWord(searchedWord);<br/> }<br/> }</span><span style="color: #0000ff;">catch</span><span style="color: #000000;">(Exception e){<br/> e.printStackTrace();<br/> }<br/> </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> wordValue;<br/> }</span></div><p>&nbsp;</p>这是我从Dict类中截取的一个方法,注意这一个:tempWord="_"+<span>URLEncoder.encode(tempWord); HttpURL中存在中文的话,会因为编码的问题产生乱码,所以先要对中文调用URLEncoder.encode()方法进行一下编码,这样才能得到正常的XML文件,这个问题当时困扰了我好久!<br />另外注意InputStream是二进制字节流,必须先经过InputStreamReader包装成字符流在创建InputSource对象,否则会出现编码异常,这个是我的一个经验。<br />调用这个方法就可以从网上获得要查询的单词的信息,并返回一个WordValue对象,然后我们再进行其它操作。<br /><br />  另外有一点必须强调:<span style="font-size: 16px; color: #ff0000;">如果某个方法要访问网络,必须开辟一个子线程,在子线程里调用该方法!!!!!<br /><br /></span>今天就介绍到这里吧,这个项目要讲完还得不少时间,毕竟我写了三个星期。另外在在整个程序大体讲完之前我不打算共享源代码,希望大家能够体谅。写这个Blog的目的主要是分享一下经验和思路,而不是分享代码。</span><p>&nbsp;</p><img src="http://counter.cnblogs.com/blog/rss/3930424" width="1" height="1" alt=""/><br/><p>本文链接:<a href="http://www.cnblogs.com/carlos-vic/p/YueCi_2.html" target="_blank">和我一起开发Android应用(二)——“悦词-i背单词”项目功能分析</a>,转载请注明。</p>http://www.cnblogs.com/lisr/p/3930381.htmlExt JS学习第六天 Ext_window组件(三) - code&monkey此文用来记录学习笔记;今天再来一个例子巩固一下学习的window;–例2: 在window中添加子组件,并讲解常用查找组件的方式:|重点分析:该实例主要针对于组件的查找进行详细的讲解,在以后的应用开发中,同学们应该学会各种方式去查找所需要的组件,不要拘泥于某种特定形式,这样会给开发思路带来很多好处。...2014-08-22T15:07:00Z2014-08-22T15:07:00Zcode&amp;monkeyhttp://www.cnblogs.com/lisr/<p>&nbsp;</p><p>此文用来记录学习笔记;</p><p>今天再来一个例子巩固一下学习的window;</p><div class="O1">&ndash;例2: 在window中添加子组件,并讲解常用查找组件的方式:</div><div class="O2">&bull;重点分析:该实例主要针对于组件的查找进行详细的讲解,在以后的应用开发中,同学们应该学会各种方式去查找所需要的组件,不要拘泥于某种特定形式,这样会给开发思路带来很多好处。</div><div class="O3">&ndash;ownerCt</div><div class="O3">&ndash;up/down方法</div><div class="O3">&ndash;Ext.getCmp方法</div><div class="O3">附上栗子代码1</div><div class="O3"><div class="O3"><div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;">Ext.onReady(<span style="color: #0000ff;">function<span style="color: #000000;">(){<br/><br/> <span style="color: #008000;">//<span style="color: #008000;">ex002 : 在组件中添加子组件 ,并进行一系列针对于组件的操作<br/> <br/> <span style="color: #008000;">//<span style="color: #008000;">在组件中添加子组件:<br/> <span style="color: #0000ff;">var win = <span style="color: #0000ff;">new<span style="color: #000000;"> Ext.window.Window({<br/> title:"添加子组件实例"<span style="color: #000000;"> , <br/> width:'40%'<span style="color: #000000;"> ,<br/> height:400<span style="color: #000000;"> , <br/> renderTo:Ext.getBody() ,<br/> draggable:<span style="color: #0000ff;">false , <span style="color: #008000;">//<span style="color: #008000;">不允许拖拽<br/> resizable:<span style="color: #0000ff;">false , <span style="color: #008000;">//<span style="color: #008000;">不允许改变窗口大小<br/> closable:<span style="color: #0000ff;">false, <span style="color: #008000;">//<span style="color: #008000;">不显示关闭按钮<br/> collapsible:<span style="color: #0000ff;">true , <span style="color: #008000;">//<span style="color: #008000;">显示折叠按钮<br/> bodyStyle: 'background:#ffc; padding:10px;' , <span style="color: #008000;">//<span style="color: #008000;"> 设置样式<br/> html:'我是window的内容!!'<span style="color: #000000;"> ,<br/> <span style="color: #008000;">//<span style="color: #008000;">Ext items(array) 配置子组件的配置项<br/><span style="color: #000000;"> items:[{<br/> <span style="color: #008000;">//<span style="color: #008000;">Ext的组件 给我们提供了一个简单的写法 xtype属性去创建组件<br/> xtype:'panel'<span style="color: #000000;">,<br/> width:'50%'<span style="color: #000000;">,<br/> height:100<span style="color: #000000;"> ,<br/> html:'我是面板'<span style="color: #000000;"><br/> },<br/> <span style="color: #008000;">//<span style="color: #008000;">第一种写法<br/> <span style="color: #0000ff;">new<span style="color: #000000;"> Ext.button.Button({<br/> text:'我是按钮'<span style="color: #000000;"> , <br/> handler:<span style="color: #0000ff;">function<span style="color: #000000;">(){<br/> alert('执行!!'<span style="color: #000000;">);<br/> }<br/> })<br/> <span style="color: #008000;">//<span style="color: #008000;">第二种写法<span style="color: #008000;"><br/>//<span style="color: #008000;"> {<span style="color: #008000;"><br/>//<span style="color: #008000;"> xtype:'button' , <span style="color: #008000;"><br/>//<span style="color: #008000;"> text:'我是按钮',<span style="color: #008000;"><br/>//<span style="color: #008000;"> handler:function(btn){<span style="color: #008000;"><br/>//<span style="color: #008000;"> alert('我被点击了');<span style="color: #008000;"><br/>//<span style="color: #008000;"> alert(btn.text);<span style="color: #008000;"><br/>//<span style="color: #008000;"> }<span style="color: #008000;"><br/>//<span style="color: #008000;"> }<br/><span style="color: #000000;"> ]<br/> <br/> });<br/> win.show(); <br/><br/> <br/> <br/>});</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></div></div></div><div class="O3">栗子代码2</div><div class="O3"><div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"><span style="color: #008080;"> 1 Ext.onReady(<span style="color: #0000ff;">function<span style="color: #000000;">(){<br/><span style="color: #008080;"> 2 <br/><span style="color: #008080;"> 3 <span style="color: #008000;">//<span style="color: #008000;">ex002 : 在组件中添加子组件 ,并进行一系列针对于组件的操作<br/><span style="color: #008080;"> 4 <br/><span style="color: #008080;"> 5 <br/><span style="color: #008080;"> 6 <span style="color: #0000ff;">var win = <span style="color: #0000ff;">new<span style="color: #000000;"> Ext.Window({<br/><span style="color: #008080;"> 7 id:'mywin'<span style="color: #000000;"> ,<br/><span style="color: #008080;"> 8 title:'操作组件的形式'<span style="color: #000000;"> ,<br/><span style="color: #008080;"> 9 width:500<span style="color: #000000;"> , <br/><span style="color: #008080;">10 height:300<span style="color: #000000;"> , <br/><span style="color: #008080;">11 <span style="color: #000000;"> renderTo:Ext.getBody() , <br/><span style="color: #008080;">12 <span style="color: #008000;">//<span style="color: #008000;">表示在当前组件的top位置添加一个工具条<br/><span style="color: #008080;">13 tbar:[{ <span style="color: #008000;">//<span style="color: #008000;">bbar(bottom) lbar(leftbar) rbar(rightbar) fbar(footbar)<br/><span style="color: #008080;">14 text:'按钮1'<span style="color: #000000;"> ,<br/><span style="color: #008080;">15 handler:<span style="color: #0000ff;">function<span style="color: #000000;">(btn){<br/><span style="color: #008080;">16 <span style="color: #008000;">//<span style="color: #008000;">组件都会有 up、down 这两个方法(表示向上、或者向下查找) 需要的参数是组件的xtype或者是选择器<br/><span style="color: #008080;">17 alert(btn.up('window'<span style="color: #000000;">).title);<br/><span style="color: #008080;">18 <span style="color: #000000;"> }<br/><span style="color: #008080;">19 <span style="color: #000000;"> },{<br/><span style="color: #008080;">20 text:'按钮2'<span style="color: #000000;"> , <br/><span style="color: #008080;">21 handler:<span style="color: #0000ff;">function<span style="color: #000000;">(btn){<br/><span style="color: #008080;">22 <span style="color: #008000;">//<span style="color: #008000;">最常用的方式<br/><span style="color: #008080;">23 alert(Ext.getCmp('mywin'<span style="color: #000000;">).title);<br/><span style="color: #008080;">24 <span style="color: #000000;"> }<br/><span style="color: #008080;">25 <span style="color: #000000;"> },{<br/><span style="color: #008080;">26 text:'按钮3'<span style="color: #000000;"> ,<br/><span style="color: #008080;">27 handler:<span style="color: #0000ff;">function<span style="color: #000000;">(btn){<br/><span style="color: #008080;">28 <span style="color: #008000;">//<span style="color: #008000;">以上一级组件的形式去查找 OwnerCt<br/><span style="color: #008080;">29 <span style="color: #008000;">//<span style="color: #008000;">console.info(btn.ownerCt);<br/><span style="color: #008080;">30 <span style="color: #000000;"> alert(btn.ownerCt.ownerCt.title);<br/><span style="color: #008080;">31 <span style="color: #000000;"> } <br/><span style="color: #008080;">32 <span style="color: #000000;"> }] <br/><span style="color: #008080;">33 <span style="color: #000000;"> });<br/><span style="color: #008080;">34 <span style="color: #000000;"> win.show();<br/><span style="color: #008080;">35 <br/><span style="color: #008080;">36 <br/><span style="color: #008080;">37 });</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></div></div><div class="O3">学习之余给大家推荐一个美文网站<a href="http://www.fishcmonkey.com">www.fishcmonkey.com</a>,提高文学修养也是好的</div><img src="http://counter.cnblogs.com/blog/rss/3930381" width="1" height="1" alt=""/><br/><p>本文链接:<a href="http://www.cnblogs.com/lisr/p/3930381.html" target="_blank">Ext JS学习第六天 Ext_window组件(三)</a>,转载请注明。</p>http://www.cnblogs.com/popsuper1982/p/3930350.html别以为真懂Openstack: 虚拟机创建的50个步骤和100个知识点(2) - popsuper1982二、nova-api步骤3:nova-api接收请求nova-api接收请求,也不是随便怎么来都接收的,而是需要设定rate limits,默认的实现是在ratelimit的middleware里面实现的。然而有时候,我们希望实现distributed rate-limiting,从而Turnsti...2014-08-22T14:29:00Z2014-08-22T14:29:00Zpopsuper1982http://www.cnblogs.com/popsuper1982/<p><strong>二、nova-api</strong></p><p><img style="display: inline; border-width: 0px;" title="image" src="http://images.cnitblog.com/blog/635909/201408/222228515182030.png" alt="image" width="734" height="768" border="0" /></p><p><strong>步骤3:nova-api接收请求</strong></p><p>nova-api接收请求,也不是随便怎么来都接收的,而是需要设定rate limits,默认的实现是在ratelimit的middleware里面实现的。</p><p>然而有时候,我们希望实现distributed rate-limiting,从而Turnstile是一个不错的选择。</p><p><a href="https://github.com/klmitch/turnstile">https://github.com/klmitch/turnstile</a><br /><a href="http://pypi.python.org/pypi/turnstile">http://pypi.python.org/pypi/turnstile</a></p><p><strong>步骤4:对Token的验证</strong></p><p><strong>步骤5:查看Policy</strong></p><p>这两步已经在keystone的时候研究过</p><p><strong>步骤6:检查quota</strong></p><p>nova, neutron, Cinder各有各的quota,并且可以从命令行进行管理</p><p># nova -h | grep quota<br />&nbsp;&nbsp;&nbsp; quota-class-show&nbsp;&nbsp;&nbsp; List the quotas for a quota class.<br />&nbsp;&nbsp;&nbsp; quota-class-update&nbsp; Update the quotas for a quota class.<br />&nbsp;&nbsp;&nbsp; quota-defaults&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; List the default quotas for a tenant.<br />&nbsp;&nbsp;&nbsp; quota-delete&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Delete quota for a tenant/user so their quota will<br />&nbsp;&nbsp;&nbsp; quota-show&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; List the quotas for a tenant/user.<br />&nbsp;&nbsp;&nbsp; quota-update&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Update the quotas for a tenant/user.</p><p># nova quota-show<br />+-----------------------------+-------+<br />| Quota&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; | Limit |<br />+-----------------------------+-------+<br />| instances&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; | 10&nbsp;&nbsp;&nbsp; |<br />| cores&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; | 20&nbsp;&nbsp;&nbsp; |<br />| ram&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; | 51200 |<br />| floating_ips&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; | 10&nbsp;&nbsp;&nbsp; |<br />| fixed_ips&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; | -1&nbsp;&nbsp;&nbsp; |<br />| metadata_items&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; | 128&nbsp;&nbsp; |<br />| injected_files&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; | 5&nbsp;&nbsp;&nbsp;&nbsp; |<br />| injected_file_content_bytes | 10240 |<br />| injected_file_path_bytes&nbsp;&nbsp;&nbsp; | 255&nbsp;&nbsp; |<br />| key_pairs&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; | 100&nbsp;&nbsp; |<br />| security_groups&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; | 10&nbsp;&nbsp;&nbsp; |<br />| security_group_rules&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; | 20&nbsp;&nbsp;&nbsp; |<br />+-----------------------------+-------+</p><p># cinder -h | grep quota<br />&nbsp;&nbsp;&nbsp; quota-class-show&nbsp;&nbsp;&nbsp; List the quotas for a quota class.<br />&nbsp;&nbsp;&nbsp; quota-class-update&nbsp; Update the quotas for a quota class.<br />&nbsp;&nbsp;&nbsp; quota-defaults&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; List the default quotas for a tenant.<br />&nbsp;&nbsp;&nbsp; quota-show&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; List the quotas for a tenant.<br />&nbsp;&nbsp;&nbsp; quota-update&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Update the quotas for a tenant.<br />&nbsp;&nbsp;&nbsp; quota-usage&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; List the quota usage for a tenant.</p><p># cinder quota-show 1779b3bc725b44b98726fb0cbdc617b1<br />+-----------+-------+<br />|&nbsp; Property | Value |<br />+-----------+-------+<br />| gigabytes |&nbsp; 1000 |<br />| snapshots |&nbsp;&nbsp; 10&nbsp; |<br />|&nbsp; volumes&nbsp; |&nbsp;&nbsp; 10&nbsp; |<br />+-----------+-------+</p><p># neutron -h | grep quota<br />&nbsp; quota-delete&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Delete defined quotas of a given tenant.<br />&nbsp; quota-list&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; List quotas of all tenants who have non-default quota values.<br />&nbsp; quota-show&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Show quotas of a given tenant<br />&nbsp; quota-update&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Define tenant's quotas not to use defaults.</p><p># neutron quota-show 1779b3bc725b44b98726fb0cbdc617b1<br />+---------------------+-------+<br />| Field&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; | Value |<br />+---------------------+-------+<br />| floatingip&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; | 50&nbsp;&nbsp;&nbsp; |<br />| network&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; | 10&nbsp;&nbsp;&nbsp; |<br />| port&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; | 50&nbsp;&nbsp;&nbsp; |<br />| router&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; | 10&nbsp;&nbsp;&nbsp; |<br />| security_group&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; | 10&nbsp;&nbsp;&nbsp; |<br />| security_group_rule | 100&nbsp;&nbsp; |<br />| subnet&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; | 10&nbsp;&nbsp;&nbsp; |<br />+---------------------+-------+</p><p>推荐下面的文章</p><p><span style="font-size: 15px;"><a href="http://blog.csdn.net/hackerain/article/details/8223125"><span>openstack nova 基础知识&mdash;&mdash;Quota(配额管理)</span> </a></span></p><p><a href="http://www.sebastien-han.fr/blog/2012/09/19/openstack-play-with-quota/">http://www.sebastien-han.fr/blog/2012/09/19/openstack-play-with-quota/</a></p><p><strong>步骤7:在数据库中创建Instance实例</strong></p><p>有关nova的database schema参考下面的文章</p><p><a title="http://www.prestonlee.com/2012/05/03/openstack-nova-essex-mysql-database-schema-diagram-and-sql/" href="http://www.prestonlee.com/2012/05/03/openstack-nova-essex-mysql-database-schema-diagram-and-sql/">http://www.prestonlee.com/2012/05/03/openstack-nova-essex-mysql-database-schema-diagram-and-sql/</a></p><p>MySQL是Openstack中最重要的组件之一,所以在生产环境中High Availability是必须的。</p><p>MySQL的HA有下面几种方式:</p><p><a title="http://dev.mysql.com/doc/mysql-ha-scalability/en/index.html" href="http://dev.mysql.com/doc/mysql-ha-scalability/en/index.html">http://dev.mysql.com/doc/mysql-ha-scalability/en/index.html</a></p><table style="width: 1034px;" border="2" cellspacing="0" cellpadding="0"><tbody><tr><td width="315">Requirement</td><td width="207">MySQL Replication</td><td width="246">MySQL with DRBD with Corosync and Pacemaker</td><td width="262">MySQL Cluster</td></tr><tr><td width="315">Availability</td><td width="207">&nbsp;</td><td width="246">&nbsp;</td><td width="262">&nbsp;</td></tr><tr><td width="315">Platform Support</td><td width="207">All Supported by MySQL Server</td><td width="246">Linux</td><td width="262">All Supported by MySQL Cluster</td></tr><tr><td width="315">Automated IP Failover</td><td width="207">No</td><td width="246">Yes</td><td width="262">Depends on Connector and Configuration</td></tr><tr><td width="315">Automated Database Failover</td><td width="207">No</td><td width="246">Yes</td><td width="262">Yes</td></tr><tr><td width="315">Automatic Data Resynchronization</td><td width="207">No</td><td width="246">Yes</td><td width="262">Yes</td></tr><tr><td width="315">Typical Failover Time</td><td width="207">User / Script Dependent</td><td width="246">Configuration Dependent, 60 seconds and Above</td><td width="262">1 Second and Less</td></tr><tr><td width="315">Synchronous Replication</td><td width="207">No, Asynchronous and Semisynchronous</td><td width="246">Yes</td><td width="262">Yes</td></tr><tr><td width="315">Shared Storage</td><td width="207">No, Distributed</td><td width="246">No, Distributed</td><td width="262">No, Distributed</td></tr><tr><td width="315">Geographic redundancy support</td><td width="207">Yes</td><td width="246">Yes, via MySQL Replication</td><td width="262">Yes, via MySQL Replication</td></tr><tr><td width="315">Update Schema On-Line</td><td width="207">No</td><td width="246">No</td><td width="262">Yes</td></tr><tr><td width="315">Scalability</td><td width="207">&nbsp;</td><td width="246">&nbsp;</td><td width="262">&nbsp;</td></tr><tr><td width="315">Number of Nodes</td><td width="207">One Master, Multiple Slaves</td><td width="246">One Active (primary), one Passive (secondary) Node</td><td width="262">255</td></tr><tr><td width="315">Built-in Load Balancing</td><td width="207">Reads, via MySQL Replication</td><td width="246">Reads, via MySQL Replication</td><td width="262">Yes, Reads and Writes</td></tr><tr><td width="315">Supports Read-Intensive Workloads</td><td width="207">Yes</td><td width="246">Yes</td><td width="262">Yes</td></tr><tr><td width="315">Supports Write-Intensive Workloads</td><td width="207">Yes, via Application-Level Sharding</td><td width="246">Yes, via Application-Level Sharding to Multiple Active/Passive Pairs</td><td width="262">Yes, via Auto-Sharding</td></tr><tr><td width="315">Scale On-Line (add nodes, repartition, etc.)</td><td width="207">No</td><td width="246">No</td><td width="262">Yes</td></tr></tbody></table><p>要想系统的学习Mysql replication,推荐下面的这本书</p><p>《MySQL High Availability Tools for Building Robust Data Centers》</p><p>还有一种方式是Mysql + galera,可以搭建Active + Active的Mysql应用</p><p><img title="MySQL分支版本 MySQL/Galera 1.0发布" src="http://yp.oss.org.cn/images/resource_images/20111101-163003//1320136203.png" alt="MySQL分支版本 MySQL/Galera 1.0发布" width="551" height="384" border="0" /></p><p> 参考下面的两篇文章</p><p><a title="http://www.sebastien-han.fr/blog/2012/04/08/mysql-galera-cluster-with-haproxy/" href="http://www.sebastien-han.fr/blog/2012/04/08/mysql-galera-cluster-with-haproxy/">http://www.sebastien-han.fr/blog/2012/04/08/mysql-galera-cluster-with-haproxy/</a></p><p><a title="http://www.sebastien-han.fr/blog/2012/04/01/mysql-multi-master-replication-with-galera/" href="http://www.sebastien-han.fr/blog/2012/04/01/mysql-multi-master-replication-with-galera/">http://www.sebastien-han.fr/blog/2012/04/01/mysql-multi-master-replication-with-galera/</a></p><p>还有一种常见的HA的技术,就是pacemaker</p><p><img src="http://images.cnitblog.com/blog/635909/201407/291500410243506.png" alt="image" />&nbsp;</p><p>最底层是通信层corosync/openais</p><p>负责cluster中node之间的通信</p><p>上一层是Resource Allocation Layer,包含下面的组件:</p><p>CRM Cluster Resouce Manager</p><p>是总管,对于resource做的任何操作都是通过它。每个机器上都有一个CRM。</p><p>CIB Cluster Information Base</p><p>CIB由CRM管理,是在内存中的XML数据库,保存了cluster的配置和状态。我们查询出来的configuration都是保存在CIB里面的。nodes, resources, constraints, relationship.</p><p>DC Designated Coordinator</p><p>每个node都有CRM,会有一个被选为DC,是整个Cluster的大脑,这个DC控制的CIB是master CIB,其他的CIB都是副本。</p><p>PE Policy Engine</p><p>当DC需要进行一些全局配置的时候,首先由PE根据当前的状态和配置,计算出将来的状态,并生成一系列的action,使得cluster从初始状态变为结果状态。PE仅仅在DC上运行。</p><p>LRM Local Resource Manager</p><p>本地的resource管理,调用resource agent完成操作,启停resource,将结果返回给CRM</p><p>再上一层是Resource Layer</p><p>包含多个resource agent。resource agent往往是一些shell script,用来启动,停止,监控resource的状态。</p><p>要弄懂Pacemaker,推荐读《SUSE high availability guide》</p><p><a title="https://www.suse.com/documentation/sle_ha/singlehtml/book_sleha/book_sleha.html" href="https://www.suse.com/documentation/sle_ha/singlehtml/book_sleha/book_sleha.html">https://www.suse.com/documentation/sle_ha/singlehtml/book_sleha/book_sleha.html</a></p><p>本人做了一些笔记和实验,请参考</p><p><a href="http://www.cnblogs.com/popsuper1982/p/3875403.html">High Availability手册(1): 环境</a></p><p><a href="http://www.cnblogs.com/popsuper1982/p/3875536.html">High Availability手册(2): 架构</a></p><p><a href="http://www.cnblogs.com/popsuper1982/p/3887611.html">High Availability手册(3): 配置</a></p><p><strong>步骤8:创建filter_properties,用于nova scheduler</strong></p><p><strong>步骤9:发送RPC给nova-conductor</strong></p><p>有关nova-conductor的文章</p><p><a title="http://cloudystuffhappens.blogspot.com/2013/04/understanding-nova-conductor-in.html" href="http://cloudystuffhappens.blogspot.com/2013/04/understanding-nova-conductor-in.html">http://cloudystuffhappens.blogspot.com/2013/04/understanding-nova-conductor-in.html</a></p><p>在Openstack中,RPC的发送是通过RabbitMQ</p><p>RabbitMQ可以通过Pacemaker进行HA,当然也可以搭建自己的RabbitMQ Cluster</p><p>学习RabbitMQ当然首推《RabbitMQ in Action》</p><p>本人也做了一些笔记</p><p><strong>&nbsp;</strong></p><p><a href="http://www.cnblogs.com/popsuper1982/p/3800237.html">RabbitMQ in Action (1): Understanding messaging</a></p><p><a href="http://www.cnblogs.com/popsuper1982/p/3800416.html">RabbitMQ in Action (2): Running and administering Rabbit</a></p><p><a href="http://www.cnblogs.com/popsuper1982/p/3800419.html">RabbitMQ in Action(5): Clustering and dealing with failure</a></p><p>还没完全读完,敬请谅解</p><p>当然Openstack中对于RabbitMQ的使用,一篇很好的文章是</p><p><a href="http://blog.csdn.net/gaoxingnengjisuan/article/details/9623529">NOVA源码分析&mdash;&mdash;NOVA中的RabbitMQ解析</a></p><p>本人也对RPC的调用过程进行了代码分析</p><p><a href="http://www.cnblogs.com/popsuper1982/p/3800396.html">Openstack中RabbitMQ RPC代码分析</a>&nbsp;</p><p><strong>步骤10:nova-condutor创建request_spec,用于scheduler</strong></p><p><strong>步骤11:nova-conductor发送RPC给nova-scheduler</strong></p><p><strong>三、nova-scheduler</strong></p><p>&nbsp;</p><p><img style="display: inline; border: 0px;" title="image" src="http://images.cnitblog.com/blog/635909/201408/222228558935532.png" alt="image" width="1024" height="467" border="0" /> </p><p>选择一个物理机来创建虚拟机,我们称为schedule的过程</p><p>nova scheduler的一个经典的图如下</p><p><img src="http://docs.openstack.org/developer/nova/_images/filteringWorkflow1.png" alt="../_images/filteringWorkflow1.png" /></p><p>就是先Filter再Weighting,其实scheduler的过程在很早就参与了。</p><p><strong>步骤13:对Host进行Filtering</strong></p><p>Filtering主要通过两个变量进行,request_spec和filter_properties,而这些变量在前面的步骤,都已经准备好了。</p><p>而不同的Filter只是利用这些信息,然后再根据从HostManager统计上来的HostState信息,选出匹配的Host。</p><p>request_spec中的第一个信息就是image的properties信息,尤其是当你想支持多种Hypervisor的时候,Xen的image, KVM的image, Hyper-V的image各不相同,如何保证image跑在正确的Hypervisor上?在image里面这种hypervisor_type property就很必要。</p><p>请阅读下面的文章</p><p><a title="http://www.cloudbase.it/filtering-glance-images-for-hyper-v/" href="http://www.cloudbase.it/filtering-glance-images-for-hyper-v/">http://www.cloudbase.it/filtering-glance-images-for-hyper-v/</a></p><p>image properties还会有min_ram, min_disk,只有内存和硬盘够大才可以。</p><p>Flavor里面可以设置extra_specs,这是一系列key-value值,在数据结构中,以instance_type变量实现,可以在里面输入这个Flavor除了资源需求的其他参数,从而在Filter的时候,可以使用。</p><p>host aggregates将所有的Host分成多个Group,当然不同的Group可以根据不同的属性Metadata划分,一种是高性能和低性能。</p><p>在Openstack文档中,这个例子很好的展示了host aggregates和Flavor extra_specs的配合使用</p><p><a title="http://docs.openstack.org/trunk/config-reference/content/section_compute-scheduler.html" href="http://docs.openstack.org/trunk/config-reference/content/section_compute-scheduler.html">http://docs.openstack.org/trunk/config-reference/content/section_compute-scheduler.html</a></p><p>Example: Specify compute hosts with SSDs</p><p>This example configures the Compute service to enable users to request nodes that have solid-state drives (SSDs). You create a <code>fast-io</code> host aggregate in the <code>nova</code> availability zone and you add the <code>ssd=true</code> key-value pair to the aggregate. Then, you add the <code>node1</code>, and <code>node2</code> compute nodes to it.</p>$ nova aggregate-create fast-io nova<br/>+----+---------+-------------------+-------+----------+<br/>| Id | Name | Availability Zone | Hosts | Metadata |<br/>+----+---------+-------------------+-------+----------+<br/>| 1 | fast-io | nova | | |<br/>+----+---------+-------------------+-------+----------+<br/><br/>$ nova aggregate-set-metadata 1 ssd=true<br/>+----+---------+-------------------+-------+-------------------+<br/>| Id | Name | Availability Zone | Hosts | Metadata |<br/>+----+---------+-------------------+-------+-------------------+<br/>| 1 | fast-io | nova | [] | {u'ssd': u'true'} |<br/>+----+---------+-------------------+-------+-------------------+<br/><br/>$ nova aggregate-add-host 1 node1<br/>+----+---------+-------------------+-----------+-------------------+<br/>| Id | Name | Availability Zone | Hosts | Metadata |<br/>+----+---------+-------------------+------------+-------------------+<br/>| 1 | fast-io | nova | [u'node1'] | {u'ssd': u'true'} |<br/>+----+---------+-------------------+------------+-------------------+<br/><br/>$ nova aggregate-add-host 1 node2<br/>+----+---------+-------------------+---------------------+-------------------+<br/>| Id | Name | Availability Zone | Hosts | Metadata |<br/>+----+---------+-------------------+----------------------+-------------------+<br/>| 1 | fast-io | nova | [u'node1', u'node2'] | {u'ssd': u'true'} |<br/>+----+---------+-------------------+----------------------+-------------------+<p>Use the <strong>nova flavor-create</strong> command to create the <em><code>ssd.large</code></em> flavor called with an ID of 6, 8 GB of RAM, 80 GB root disk, and four vCPUs.</p>$ nova flavor-create <em><code>ssd.large</code></em> <em><code>6</code></em> <em><code>8192</code></em> <em><code>80</code></em> <em><code>4</code></em><br/>+----+-----------+-----------+------+-----------+------+-------+-------------+-----------+-------------+<br/>| ID | Name | Memory_MB | Disk | Ephemeral | Swap | VCPUs | RXTX_Factor | Is_Public | extra_specs |<br/>+----+-----------+-----------+------+-----------+------+-------+-------------+-----------+-------------+<br/>| 6 | ssd.large | 8192 | 80 | 0 | | 4 | 1 | True | {} |<br/>+----+-----------+-----------+------+-----------+------+-------+-------------+-----------+-------------+<p>Once the flavor is created, specify one or more key-value pairs that match the key-value pairs on the host aggregates. In this case, that is the <em><code>ssd=true</code></em> key-value pair. Setting a key-value pair on a flavor is done using the <strong>nova flavor-key</strong> command.</p><p>$ nova flavor-key <em><code>ssd.large</code></em> set <em><code>ssd=true</code></em></p><p>Once it is set, you should see the <code>extra_specs</code> property of the <code>ssd.large</code> flavor populated with a key of <code>ssd</code> and a corresponding value of <code>true</code>.</p>$ nova flavor-show ssd.large<br/>+----------------------------+-------------------+<br/>| Property | Value |<br/>+----------------------------+-------------------+<br/>| OS-FLV-DISABLED:disabled | False |<br/>| OS-FLV-EXT-DATA:ephemeral | 0 |<br/>| disk | 80 |<br/>| extra_specs | {u'ssd': u'true'} |<br/>| id | 6 |<br/>| name | ssd.large |<br/>| os-flavor-access:is_public | True |<br/>| ram | 8192 |<br/>| rxtx_factor | 1.0 |<br/>| swap | |<br/>| vcpus | 4 |<br/>+----------------------------+-------------------+<p>Now, when a user requests an instance with the <code>ssd.large</code> flavor, the scheduler only considers hosts with the <code>ssd=true</code> key-value pair. In this example, these are <code>node1</code> and <code>node2</code>.</p><p>另一个作用是Xen和KVM的POOL分开,有利于XEN进行Live Migration</p><p>另一个作用是Windows和Linux的POOL分开,因为Windows是需要收费的,而Linux大多不需要,Windows的收费是按照物理机,而非虚拟机来收费的,所有需要尽量的将windows的虚拟机放到一个物理机上。</p><p>Filter_properties的里面scheduler_hints是一个json,里面可以设置任何值,用于Filter的时候使用。</p><p>例如JsonFilter</p><p>The JsonFilter allows a user to construct a custom filter by passing a scheduler hint in JSON format. The following operators are supported:</p><ul><li>=</li><li>&lt;</li><li>&gt;</li><li>in</li><li>&lt;=</li><li>&gt;=</li><li>not</li><li>or</li><li>and</li></ul><p>The filter supports the following variables:</p><ul><li>$free_ram_mb</li><li>$free_disk_mb</li><li>$total_usable_ram_mb</li><li>$vcpus_total</li><li>$vcpus_used</li></ul><p>Using the <strong>nova</strong> command-line tool, use the <code>--hint</code> flag:</p>$ nova boot --image 827d564a-e636-4fc4-a376-d36f7ebe1747 --flavor 1 --hint query='["&gt;=","$free_ram_mb",1024]' server1<p>With the API, use the <code>os:scheduler_hints</code> key:</p><p><img title="Select Text" src="http://docs.openstack.org/trunk/config-reference/content/images/icon_clipboard.png" alt="Select Text" width="20" height="20" align="right" /></p><p><code>{</code></p><p><code></code><code>"server":</code> <code>{</code></p><p><code></code><code>"name":</code> <code>"</code><code>s</code><code>e</code><code>r</code><code>v</code><code>e</code><code>r</code><code>-</code><code>1</code><code>"</code><code>,</code></p><p><code></code><code>"imageRef":</code> <code>"</code><code>c</code><code>e</code><code>d</code><code>e</code><code>f</code><code>4</code><code>0</code><code>a</code><code>-</code><code>e</code><code>d</code><code>6</code><code>7</code><code>-</code><code>4</code><code>d</code><code>1</code><code>0</code><code>-</code><code>8</code><code>0</code><code>0</code><code>e</code><code>-</code><code>1</code><code>7</code><code>4</code><code>5</code><code>5</code><code>e</code><code>d</code><code>c</code><code>e</code><code>1</code><code>7</code><code>5</code><code>"</code><code>,</code></p><p><code></code><code>"flavorRef":</code> <code>"</code><code>1</code><code>"</code></p><p><code></code><code>}</code><code>,</code></p><p><code></code><code>"os:scheduler_hints":</code> <code>{</code></p><p><code></code><code>"query":</code> <code>"</code><code>[</code><code>&amp;</code><code>g</code><code>t</code><code>;</code><code>=</code><code>,</code><code>$</code><code>f</code><code>r</code><code>e</code><code>e</code><code>_</code><code>r</code><code>a</code><code>m</code><code>_</code><code>m</code><code>b</code><code>,</code><code>1</code><code>0</code><code>2</code><code>4</code><code>]</code><code>"</code></p><p><code></code><code>}</code></p><p><code>}</code></p><p><code>我们可以指定某个物理机,用下面的命令--availability-zone &lt;zone-name&gt;:&lt;host-name&gt; </code></p><p><strong><span style="font-family: 宋体;"><code>步骤14:对合适的Hosts进行weighting并且排序</code></span></strong></p><p><code>选出了Hosts,接下来就是进行Weighting的操作</code></p><p><code>Weighting可以根据很多变量来,一般来说Memory和disk是最先需要满足的,CPU和network io则需要次要考虑,一般来说,对于付钱较少的Flavor,能满足memory和disk就可以了,对于付钱较多的Flavor,则需要保证其CPU和network io.</code></p><p><strong>步骤15:nova-scheduler想选出的Host发送RPC</strong></p><img src="http://counter.cnblogs.com/blog/rss/3930350" width="1" height="1" alt=""/><br/><p>本文链接:<a href="http://www.cnblogs.com/popsuper1982/p/3930350.html" target="_blank">别以为真懂Openstack: 虚拟机创建的50个步骤和100个知识点(2)</a>,转载请注明。</p>http://www.cnblogs.com/lzkwin/p/xdomain-proxy.html使用Web代理实现Ajax跨域 - 李中凯目前的工作项目分为前端和后台,双方事先约定接口,之后独立开发。后台每天开发完后在测试服务器上部署,前端连接测试服务器进行数据交互。前端和后台分开的好处是代码不用混在一个工程里一起build,互不干涉。但由此也引发出一个问题,那就是Ajax跨域。目前的项目是一个Single Page App, 基本上...2014-08-22T14:13:00Z2014-08-22T14:13:00Z李中凯http://www.cnblogs.com/lzkwin/<p>目前的工作项目分为前端和后台,双方事先约定接口,之后独立开发。后台每天开发完后在测试服务器上部署,前端连接测试服务器进行数据交互。前端和后台分开的好处是代码不用混在一个工程里一起build,互不干涉。但由此也引发出一个问题,那就是Ajax跨域。目前的项目是一个Single Page App, 基本上所有数据交互都是通过Ajax请求来完成的。为了方便平时前端开发,必须解决跨域问题。</p><p>跨域方案有多种,我认为基本上可分为两大类,一类是需要目标Server配合的,另一类则不需要。前者限制稍多,必须由服务器显式允许跨域才行,比如返回HTTP头信息,修改服务器配置,返回JavaScript等。可以用JSONP,iframe等方式实现。后者主动权就掌握在跨域客户端,服务器不用为此做任何配置。这就是本文要说的Web代理。</p><p>作为前端开发,自然希望主动权在自己手里,不用劳烦Sever配合。所以我选择了使用Web代理方案。该方案的原理其实很简单,就是将跨域请求转变为同源请求。具体来说,就是在本地搭建一个Web站点(代理),该站点可以向目标服务器发送HTTP请求,接收响应。它的行为跟浏览器类似,因此目标服务器是不用区分对待的。然后将本地的前端站点也部署到这个Web站点中,这样它们就属于同一个域了。所有针对目标服务器的Ajax请求,都发送到这个代理,然后由代理负责转发和接收响应。这样就避开了跨域之名,却有跨域之实。</p><!--break--><p><img src="http://www.zoneky.com/blog/image/Cross-domain-proxy.png" alt="setting" /></p><p>图有点丑,欢迎拍砖。</p><p>剩下的就是实现细节了。由于对Asp.Net比较熟悉,就用它创建一个Web站点。在实现过程中,我觉得有几点细节需要关注一下。</p><h4 id="http-request">HTTP Request拦截</strong></p><p>由于事先不知道会有哪些请求(就算知道,请求的URL可能也会太多),不可能针对每个URL写一个转发规则。因此需要获取所有Ajax请求,经过统一的处理再转发到目标服务器。众所周知,Asp.Net的IHttpHandler接口定义了针对某个具体的HTTP请求的处理方法,如前所述,不可能为每个请求URL写一个Handler,有没有一种办法可以获取任何请求的信息?答案是HttpModule。HttpModule是先于HttpHandler处理的,所以在这里可以做些手脚。定义一个HttpModule也很简单,只要实现IHttpModule接口,监听Request事件就可以了。当然,需要在<code>Web.config</code>文件里注册这个HttpModule才能使用。</p><p><code>XDomainProxy.cs</code>定义:</p><code>public class XDomainProxy : IHttpModule<br/>{<br/> public void Dispose() { }<br/> public void Init(HttpApplication context)<br/> {<br/> context.BeginRequest += new EventHandler(Application_BeginRequest);<br/> context.EndRequest += new EventHandler(Application_EndRequest);<br/> }<br/> public void Application_BeginRequest(object sender, EventArgs e)<br/> {<br/><br/> }<br/> public void Application_EndRequest(object sender, EventArgs e)<br/> {<br/> HttpApplication application = sender as HttpApplication;<br/> HttpContext context = application.Context;<br/> HttpResponse response = context.Response;<br/> response.StatusCode = 200;<br/> }<br/>}</code><p>在<code>Web.config</code>中注册<code>HttpModule</code>:</p><code>&lt;configuration&gt;<br/>&lt;system.web&gt;<br/>&lt;httpHandlers&gt;<br/> ... <br/>&lt;/httpHandlers&gt;<br/> &lt;httpModules&gt;<br/> &lt;add name=&quot;ProxyModule&quot; type=&quot;AAProxy.Proxy&quot;/&gt;<br/> &lt;/httpModules&gt;<br/>&lt;/system.web&gt;<br/>&lt;/configuration&gt;</code><h4 id="http">模拟HTTP请求</strong></p><p>.Net 已经封装好了<code>HttpWebRequest</code>和<code>HttpWebResponse</code>两个关键的类,非常方便。</p><code>//实例化web访问类<br/>HttpWebRequest request = (HttpWebRequest)WebRequest.Create(requestUrl);<br/>request.Method = context.Request.HttpMethod;<br/>request.ContentType = context.Request.ContentType;<br/><br/>string postData = context.Request.Form.ToString();<br/>byte[] postdatabytes = Encoding.UTF8.GetBytes(postData);<br/>request.ContentLength = postdatabytes.Length;<br/>request.AllowAutoRedirect = false;<br/>request.CookieContainer = loginCookie;<br/>request.KeepAlive = true;<br/>request.UserAgent = context.Request.UserAgent;<br/><br/>if (context.Request.HttpMethod == &quot;POST&quot;)<br/>{<br/> Stream stream;<br/> stream = request.GetRequestStream();<br/> stream.Write(postdatabytes, 0, postdatabytes.Length);<br/> stream.Close();<br/>}<br/><br/>//接收响应<br/>response = (HttpWebResponse)request.GetResponse();<br/> using (StreamReader reader = new StreamReader(response.GetResponseStream(), Encoding.UTF8))<br/>{<br/> string content = reader.ReadToEnd();<br/>}</code><p>这样就完成了一个简单的HTTP请求。注意POST请求需要另外发参数。</p><h4 id="cookie">Cookie</strong></p><p>由于所有的Ajax请求都需要用户登录才能进行,所以代理程序也必须模拟用户登录目标服务器站点。用户的登录信息是保存在cookie里的,所以在模拟请求的时候还需要保存cookie。<code>HttpWebRequest</code>有个<code>CookieContainer</code>属性,就是用来装cookie的。保存好cookie后,之后的每个请求都必须带上它,这样才能维持登录状态。另外,还需要把这些cookie写到浏览器中。这里需要注意,<code>.Net</code>封装了两个关于cookie的类,<code>HttpCookie</code>和<code>Cookie</code>。前者是Asp.Net程序写回给浏览器用的,而后者是向别的服务器发起HTTP请求时用的。所以代理程序收到目标Server返回的<code>Cookie</code>对象时,要转换成<code>HttpCookie</code>对象再返回给浏览器。</p><code>//response是目标服务器的响应对象,context是返回给浏览器的上下文对象<br/>void SetCookie(HttpWebResponse response, HttpContext context)<br/>{<br/> foreach (Cookie cookie in response.Cookies)<br/> {<br/> HttpCookie httpCookie = new HttpCookie(cookie.Name, cookie.Value);<br/> httpCookie.Domain = cookie.Domain;<br/> httpCookie.Expires = cookie.Expires;<br/> httpCookie.Path = cookie.Path;<br/> httpCookie.HttpOnly = cookie.HttpOnly;<br/> httpCookie.Secure = cookie.Secure;<br/> context.Response.SetCookie(httpCookie);<br/> }<br/>}</code><h4 id="https">Https连接</strong></p><p>在使用过程中发现,如果目标服务器的数字证书是不受信任的,连接将被拒绝。这在连接Server端开发同事的PC调试时不方便,怎么破?.Net对Http请求有个证书验证机制,只要让这个验证总是通过就好了。(一切为了开发方便)</p><code>ServicePointManager.ServerCertificateValidationCallback = new System.Net.Security.RemoteCertificateValidationCallback(ValidateRemoteCertificate);<br/><br/>private bool ValidateRemoteCertificate(object sender, System.Security.Cryptography.X509Certificates.X509Certificate certificate, System.Security.Cryptography.X509Certificates.X509Chain chain, System.Net.Security.SslPolicyErrors sslPolicyErrors)<br/>{<br/> return true;<br/>}</code><h4 id="web">部署Web代理</strong></p><p>部署就很简单了,新建一个IIS站点,根目录指向前端项目的路径,设定一个端口号。将Web代理发布到本地的某个目录下,然后作为一个应用程序添加到之前的IIS站点中即可。</p><p><strong>总结</strong></p><p>经过以上几个关键步骤,基本上搭建好了Web代理。当然,这个过程中还有一些细节需要关注,比如转发请求的URL映射处理,Session过期,异常处理等。总的来说,没有用到什么高深的技术,只是针对各种跨域方案做了一个选择。</p><p><a href="http://www.zoneky.com/blog/2014/08/22/xdomain-using-proxy/">原文:使用Web代理实现Ajax跨域</a></p><img src="http://counter.cnblogs.com/blog/rss/3930326" width="1" height="1" alt=""/><br/><p>本文链接:<a href="http://www.cnblogs.com/lzkwin/p/xdomain-proxy.html" target="_blank">使用Web代理实现Ajax跨域</a>,转载请注明。</p>http://www.cnblogs.com/biwork/p/3930331.html微软BI 之SSRS 系列 - 实现 Excel 中图表结合的报表设计 - BIWORK来自群里面讨论的一个问题,EXCEL 中有类似于这样的图形,上面是 Chart, Chart X轴上的值正好就是下方 Table 的列头,这个在 SSRS 中应该如何实现?SSRS 2008、2008RS,2012 中实际上没有这种对应的控件,我们通常想到的方式可能是上方一个单独的 Chart 图,...2014-08-22T14:13:00Z2014-08-22T14:13:00ZBIWORKhttp://www.cnblogs.com/biwork/<div><span style="font-family: Microsoft YaHei; font-size: 13px;">来自群里面讨论的一个问题,EXCEL 中有类似于这样的图形,上面是 Chart, Chart X轴上的值正好就是下方 Table 的列头,这个在 SSRS 中应该如何实现?</span></div><div><span style="font-family: Microsoft YaHei; font-size: 13px;"><img src="http://images.cnitblog.com/blog/477275/201408/222051006121234.png" alt="" /></span></div><div><span style="font-family: Microsoft YaHei; font-size: 13px;">&nbsp;</span></div><div><span style="font-family: Microsoft YaHei; font-size: 13px;">SSRS 2008、2008RS,2012 中实际上没有这种对应的控件,我们通常想到的方式可能是上方一个单独的 Chart 图,下方一个 Table 然后合并在一起。但是这样会存在一些问题,因为 Chart 轴的值不是固定的,会随着聚合值的增加而扩展。并且对于表中的列头来说也没有办法完全能够和 Chart X 轴上的坐标对应在一条竖线上,一定会有偏差。</span></div><div><span style="font-family: Microsoft YaHei; font-size: 13px;">&nbsp;</span></div><div><span style="font-family: Microsoft YaHei; font-size: 13px;">在 SSRS 中,我们可以通过一些技巧来实现类似于这样的效果。下面是我用 Column Chart 来展现的这种类似于 Excel 中的效果,虽然实现比较接近了,但我并不推荐这么做! 因为我们完全可以通过合理的变通,并使用其它的方式将这些数据展现的更加合理!&nbsp;&nbsp;</span></div><div><span style="font-family: Microsoft YaHei; font-size: 13px;"><img src="http://images.cnitblog.com/blog/477275/201408/222051165349731.png" alt="" />&nbsp;</span></div><div><span style="font-family: Microsoft YaHei; font-size: 13px;">原始测试数据 (AdventureWorksDW2012)就是一个简单的查询 -&nbsp;</span></div><div><div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"><span style="font-family: Microsoft YaHei; font-size: 13px;"><span style="color: #0000ff;">SELECT</span><span style="color: #000000;"> DPC.EnglishProductCategoryName,<br/> FIS.OrderDate,<br/> FIS.OrderDateKey,<br/> DD.CalendarYear,<br/> FIS.SalesOrderNumber,<br/> FIS.SalesOrderLineNumber,<br/> FIS.SalesAmount </span><span style="color: #0000ff;">AS</span><span style="color: #000000;"> Internet_Sales<br/></span><span style="color: #0000ff;">FROM</span> FactInternetSales <span style="color: #0000ff;">AS</span><span style="color: #000000;"> FIS<br/></span><span style="color: #0000ff;">INNER</span> <span style="color: #808080;">JOIN</span> DimProduct <span style="color: #0000ff;">AS</span><span style="color: #000000;"> DP<br/></span><span style="color: #0000ff;">ON</span> FIS.ProductKey <span style="color: #808080;">=</span><span style="color: #000000;"> DP.ProductKey<br/></span><span style="color: #0000ff;">INNER</span> <span style="color: #808080;">JOIN</span> DimProductSubcategory <span style="color: #0000ff;">AS</span><span style="color: #000000;"> DPS<br/></span><span style="color: #0000ff;">ON</span> DP.ProductSubcategoryKey <span style="color: #808080;">=</span><span style="color: #000000;"> DPS.ProductSubcategoryKey<br/></span><span style="color: #0000ff;">INNER</span> <span style="color: #808080;">JOIN</span> DimProductCategory <span style="color: #0000ff;">AS</span><span style="color: #000000;"> DPC<br/></span><span style="color: #0000ff;">ON</span> DPS.ProductCategoryKey <span style="color: #808080;">=</span><span style="color: #000000;"> DPC.ProductCategoryKey<br/></span><span style="color: #0000ff;">INNER</span> <span style="color: #808080;">JOIN</span> DimDate <span style="color: #0000ff;">AS</span><span style="color: #000000;"> DD<br/></span><span style="color: #0000ff;">ON</span> FIS.OrderDate <span style="color: #808080;">=</span> DD.FullDateAlternateKey</span></div><p><span style="font-family: Microsoft YaHei; font-size: 13px;">新建报表和数据集 Dataset,选择 Matrix 行分组为 Product Category ,列分组为 Calendar year。</span></p></div><div><span style="font-family: Microsoft YaHei; font-size: 13px;"><img src="http://images.cnitblog.com/blog/477275/201408/222052391439436.png" alt="" /></span></div><div><span style="font-family: Microsoft YaHei; font-size: 13px;">&nbsp;</span></div><div><span style="font-family: Microsoft YaHei; font-size: 13px;">添加两个新行 - 选择 Outside Group - Above。</span></div><div><span style="font-family: Microsoft YaHei; font-size: 13px;"><img src="http://images.cnitblog.com/blog/477275/201408/222052495961230.png" alt="" /></span></div><div><span style="font-family: Microsoft YaHei; font-size: 13px;">并删除第一行。</span></div><div><span style="font-family: Microsoft YaHei; font-size: 13px;"><img src="http://images.cnitblog.com/blog/477275/201408/222053052686184.png" alt="" /></span></div><div><span style="font-family: Microsoft YaHei; font-size: 13px;">删除的时候只删除行,但是不要连组给删除了。</span></div><div><span style="font-family: Microsoft YaHei; font-size: 13px;"><img src="http://images.cnitblog.com/blog/477275/201408/222053114094260.png" alt="" /></span></div><div><span style="font-family: Microsoft YaHei; font-size: 13px;">删除之后的样子就是这样的。</span></div><div><span style="font-family: Microsoft YaHei; font-size: 13px;"><img src="http://images.cnitblog.com/blog/477275/201408/222053172685250.png" alt="" /></span></div><div><span style="font-family: Microsoft YaHei; font-size: 13px;">第二行是表头要显示的年份,第一行用作行内 Column Chart 图。</span></div><div><span style="font-family: Microsoft YaHei; font-size: 13px;"><img src="http://images.cnitblog.com/blog/477275/201408/222053274878271.png" alt="" /></span></div><div><span style="font-family: Microsoft YaHei; font-size: 13px;">在第一行的这个位置插入 Data Bar,选择 Stacked Column。</span></div><div><span style="font-family: Microsoft YaHei; font-size: 13px;"><img src="http://images.cnitblog.com/blog/477275/201408/222053420341783.png" alt="" /></span></div><div><span style="font-family: Microsoft YaHei; font-size: 13px;">&nbsp;</span></div><div><span style="font-family: Microsoft YaHei; font-size: 13px;">填充 Stacked Column 中的聚合值,分组以及系列。</span></div><div><span style="font-family: Microsoft YaHei; font-size: 13px;"><img src="http://images.cnitblog.com/blog/477275/201408/222053482849358.png" alt="" /></span></div><div><span style="font-family: Microsoft YaHei; font-size: 13px;">填充完毕后就可以看到大致的效果了,每一列都是从 Matrix 列分组展开的,而每一列当中的 Column Chart 的分组又依赖于当前的列分组中的年份。</span></div><div><span style="font-family: Microsoft YaHei; font-size: 13px;"><img src="http://images.cnitblog.com/blog/477275/201408/222053585033380.png" alt="" /></span></div><div><span style="font-family: Microsoft YaHei; font-size: 13px;">自行做一些美化工作,包括格式化等等。</span></div><div><span style="font-family: Microsoft YaHei; font-size: 13px;"><img src="http://images.cnitblog.com/blog/477275/201408/222054041129827.png" alt="" /></span></div><div><span style="font-family: Microsoft YaHei; font-size: 13px;">存在一个问题,不同的系列是出来了,但是无法区分各个系列与产品分类的关系。</span></div><div><span style="font-family: Microsoft YaHei; font-size: 13px;">思路是 - Chart 图中的颜色模板使用自定义的,然后使用自定义函数获取指定的颜色,这几种颜色需要和自定义模板中的颜色是一样的。</span></div><div><div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"><span style="font-family: Microsoft YaHei; font-size: 13px;"><span style="color: #0000ff;">Private</span> colorPalette <span style="color: #0000ff;">As</span> <span style="color: #0000ff;">String</span>() = {<span style="color: #800000;">"</span><span style="color: #800000;">SeaGreen</span><span style="color: #800000;">"</span>, <span style="color: #800000;">"</span><span style="color: #800000;">Orange</span><span style="color: #800000;">"</span>, <span style="color: #800000;">"</span><span style="color: #800000;">RoyalBlue</span><span style="color: #800000;">"</span><span style="color: #000000;">}<br/> </span><span style="color: #0000ff;">Private</span> count <span style="color: #0000ff;">As</span> <span style="color: #0000ff;">Integer</span> = <span style="color: #800080;">0</span><br/> <span style="color: #0000ff;">Private</span> mapping <span style="color: #0000ff;">As</span> <span style="color: #0000ff;">New</span><span style="color: #000000;"> System.Collections.Hashtable()<br/><br/> </span><span style="color: #0000ff;">Public</span> <span style="color: #0000ff;">Function</span> GetColor(<span style="color: #0000ff;">ByVal</span> groupingValue <span style="color: #0000ff;">As</span> <span style="color: #0000ff;">String</span>) <span style="color: #0000ff;">As</span> <span style="color: #0000ff;">String</span><br/> <span style="color: #0000ff;">If</span> mapping.ContainsKey(groupingValue) <span style="color: #0000ff;">Then</span><br/> <span style="color: #0000ff;">Return</span><span style="color: #000000;"> mapping(groupingValue)<br/> </span><span style="color: #0000ff;">End</span> <span style="color: #0000ff;">If</span><br/><br/> <span style="color: #0000ff;">Dim</span> c <span style="color: #0000ff;">As</span> <span style="color: #0000ff;">String</span> = colorPalette(count <span style="color: #0000ff;">Mod</span><span style="color: #000000;"> colorPalette.Length)<br/> count </span>= count + <span style="color: #800080;">1</span><span style="color: #000000;"><br/> mapping.Add(groupingValue, c)<br/> </span><span style="color: #0000ff;">Return</span><span style="color: #000000;"> c<br/> </span><span style="color: #0000ff;">End Function</span></span></div><p><span style="font-family: Microsoft YaHei; font-size: 13px;">报表的自定义函数。</span></p></div><div><span style="font-family: Microsoft YaHei; font-size: 13px;"><img src="http://images.cnitblog.com/blog/477275/201408/222054101907118.png" alt="" /></span></div><div><span style="font-family: Microsoft YaHei; font-size: 13px;">&nbsp;</span></div><div><span style="font-family: Microsoft YaHei; font-size: 13px;">设置 Stacked Column 图的自定义模板颜色。</span></div><div><span style="font-family: Microsoft YaHei; font-size: 13px;"><img src="http://images.cnitblog.com/blog/477275/201408/222054167531022.png" alt="" /></span></div><div><span style="font-family: Microsoft YaHei; font-size: 13px;">&nbsp;</span></div><div><span style="font-family: Microsoft YaHei; font-size: 13px;">选中 English Product Category 文本框,设置它的背景颜色,调用函数。</span></div><div><span style="font-family: Microsoft YaHei; font-size: 13px;">=Code.GetColor(Fields!EnglishProductCategoryName.Value)</span></div><div><span style="font-family: Microsoft YaHei; font-size: 13px;"><img src="http://images.cnitblog.com/blog/477275/201408/222103153938480.png" alt="" /></span></div><div><span style="font-family: Microsoft YaHei; font-size: 13px;">最后,要做出这种效果还需要进一步的格式化,调整边框等操作使得这个 Stacked Column 像一个整体,而非单一的个体,这些美化的细节就不一一描述了。可以参考 <a href="http://blog.tianshansoft.com/archives/1795.html" target="_blank">天善学院微软SSRS2012报表课程</a>&nbsp;基础案例中的 - 案例6,案例13,案例18,案例24 以及 SSRS 报表设计提高篇中的报表美化与设计等案例。所以本文只讲解实现的流程,过于细节的设计技巧,包括一些聚合分组的概念,自定义函数等不是本文的重点。</span></div><div><span style="font-family: Microsoft YaHei; font-size: 13px;"><img src="http://images.cnitblog.com/blog/477275/201408/222054231745585.png" alt="" /></span></div><div><span style="font-family: Microsoft YaHei; font-size: 13px;">对于文章开头看到的这种 Line Chart 形式可不可以做,也可以做,可以通过调整 Chart 区域折线的平面宽度使得几个独立的折线区域也连接成一个整体。但是像最左侧的 Y 轴线如何实现,几个产品不使用底线区分而要求使用 Chart 中自带的系列又该显示且不重复?这些都不是拖拖拽拽就可以实现的,这需要熟练掌握 SSRS 报表中的各种知识点和技能点,不同控件的组合使用技巧等。当然,如果就这个案例来说,假设实际开发中如果是我,我会拒绝设计这种样子的报表,因为上图很明显在阅读性和数据呈现上完全体现不出来像 Excel 展现出来的那种效果。</span></div><div><span style="font-family: Microsoft YaHei; font-size: 13px;">&nbsp;</span></div><div><span style="font-family: Microsoft YaHei; font-size: 13px;">所以,在实际报表开发过程中,不能为了模仿而模仿,因为很有可能模仿成一个四不像。</span></div><div><span style="font-family: Microsoft YaHei; font-size: 13px;">&nbsp;</span></div><div><span style="font-family: Microsoft YaHei; font-size: 13px;">吐吐口水吧! 在实际项目中,在引导客户改变已有使用习惯,适应新的适应习惯的过程中往往确实是伴着口水,Fighting 的,包括遭受到客户对自身能力的怀疑,这些在项目开发中都是很正常的。像有很多客户往往会提出他们认为很好实现但实则很难实现的一些效果要求必须实现,这些极端情况也是客观存在的。对于我来说,我也会遇到一些变态的和不合理的需求,但通常情况下我也会直接拒绝,坦诚告诉客户无法实现,因为它已经违背了 SSRS 自身特性。但同时我也会尝试拿出另多的替代的解决方案让客户来选择,这样客户通常会比较容易接受和妥协。就像出门从北京到上海出差,告诉他们飞机确实因为技术原因就是不能飞,在客户非要证明但又无法证明飞机就是能起飞的同时给他们选择高铁,汽车和自行车三选一,一般情况下客户还是会从中选择他最能够接受的一种最优方案,因为谁也耗不起时间。</span></div><div><span style="font-family: Microsoft YaHei; font-size: 13px;">&nbsp;</span></div><img src="http://counter.cnblogs.com/blog/rss/3930331" width="1" height="1" alt=""/><br/><p>本文链接:<a href="http://www.cnblogs.com/biwork/p/3930331.html" target="_blank">微软BI 之SSRS 系列 - 实现 Excel 中图表结合的报表设计</a>,转载请注明。</p>http://www.cnblogs.com/dolphin0520/p/3920373.htmlJava并发编程:volatile关键字解析 - 海 子Java并发编程:volatile关键字解析 volatile这个关键字可能很多朋友都听说过,或许也都用过。在Java 5之前,它是一个备受争议的关键字,因为在程序中使用它往往会导致出人意料的结果。在Java 5之后,volatile关键字才得以重获生机。 volatile关键字虽然从字面上理...2014-08-22T14:07:00Z2014-08-22T14:07:00Z海 子http://www.cnblogs.com/dolphin0520/<p style="text-align: center;">Java并发编程:volatile关键字解析</p><p style="text-align: left;">   volatile这个关键字可能很多朋友都听说过,或许也都用过。在Java 5之前,它是一个备受争议的关键字,因为在程序中使用它往往会导致出人意料的结果。在Java 5之后,volatile关键字才得以重获生机。</p><p style="text-align: left;">  volatile关键字虽然从字面上理解起来比较简单,但是要用好不是一件容易的事情。由于volatile关键字是与Java的内存模型有关的,因此在讲述volatile关键之前,我们先来了解一下与内存模型相关的概念和知识,然后分析了volatile关键字的实现原理,最后给出了几个使用volatile关键字的场景。</p><p style="text-align: left;">  以下是本文的目录大纲:</p><p style="text-align: left;">  一.内存模型的相关概念</p><p style="text-align: left;">  二.并发编程中的三个概念</p><p style="text-align: left;">  三.Java内存模型</p><p style="text-align: left;">  四..深入剖析volatile关键字</p><p style="text-align: left;">  五.使用volatile关键字的场景</p><p style="text-align: left;">  若有不正之处请多多谅解,并欢迎批评指正。</p><p style="text-align: left;">  请尊重作者劳动成果,转载请标明原文链接:</p><p style="text-align: left;">  http://www.cnblogs.com/dolphin0520/p/3920373.html</p><h2 style="text-align: left;">一.内存模型的相关概念</strong></p><p style="text-align: left;">  大家都知道,计算机在执行程序时,每条指令都是在CPU中执行的,而执行指令过程中,势必涉及到数据的读取和写入。由于程序运行过程中的临时数据是存放在主存(物理内存)当中的,这时就存在一个问题,由于CPU执行速度很快,而从内存读取数据和向内存写入数据的过程跟CPU执行指令的速度比起来要慢的多,因此如果任何时候对数据的操作都要通过和内存的交互来进行,会大大降低指令执行的速度。因此在CPU里面就有了高速缓存。</p><p style="text-align: left;">  也就是,当程序在运行过程中,会将运算需要的数据从主存复制一份到CPU的高速缓存当中,那么CPU进行计算时就可以直接从它的高速缓存读取数据和向其中写入数据,当运算结束之后,再将高速缓存中的数据刷新到主存当中。举个简单的例子,比如下面的这段代码:</p><div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;">i = i + 1;<br/></div><p>&nbsp;  当线程执行这个语句时,会先从主存当中读取i的值,然后复制一份到高速缓存当中,然后CPU执行指令对i进行加1操作,然后将数据写入高速缓存,最后将高速缓存中i最新的值刷新到主存当中。</p><p>  这个代码在单线程中运行是没有任何问题的,但是在多线程中运行就会有问题了。在多核CPU中,每条线程可能运行于不同的CPU中,因此每个线程运行时有自己的高速缓存(对单核CPU来说,其实也会出现这种问题,只不过是以线程调度的形式来分别执行的)。本文我们以多核CPU为例。</p><p>  比如同时有2个线程执行这段代码,假如初始时i的值为0,那么我们希望两个线程执行完之后i的值变为2。但是事实会是这样吗?</p><p>  可能存在下面一种情况:初始时,两个线程分别读取i的值存入各自所在的CPU的高速缓存当中,然后线程1进行加1操作,然后把i的最新值1写入到内存。此时线程2的高速缓存当中i的值还是0,进行加1操作之后,i的值为1,然后线程2把i的值写入内存。</p><p>  最终结果i的值是1,而不是2。这就是著名的缓存一致性问题。通常称这种被多个线程访问的变量为共享变量。</p><p>  也就是说,如果一个变量在多个CPU中都存在缓存(一般在多线程编程时才会出现),那么就可能存在缓存不一致的问题。</p><p>  为了解决缓存不一致性问题,通常来说有以下2种解决方法:</p><p>  1)通过在总线加LOCK#锁的方式</p><p>  2)通过缓存一致性协议</p><p>  这2种方式都是硬件层面上提供的方式。</p><p>  在早期的CPU当中,是通过在总线上加LOCK#锁的形式来解决缓存不一致的问题。因为CPU和其他部件进行通信都是通过总线来进行的,如果对总线加LOCK#锁的话,也就是说阻塞了其他CPU对其他部件访问(如内存),从而使得只能有一个CPU能使用这个变量的内存。比如上面例子中 如果一个线程在执行 i = i +1,如果在执行这段代码的过程中,在总线上发出了LCOK#锁的信号,那么只有等待这段代码完全执行完毕之后,其他CPU才能从变量i所在的内存读取变量,然后进行相应的操作。这样就解决了缓存不一致的问题。</p><p>  但是上面的方式会有一个问题,由于在锁住总线期间,其他CPU无法访问内存,导致效率低下。</p><p>  所以就出现了缓存一致性协议。最出名的就是Intel 的MESI协议,MESI协议保证了每个缓存中使用的共享变量的副本是一致的。它核心的思想是:当CPU写数据时,如果发现操作的变量是共享变量,即在其他CPU中也存在该变量的副本,会发出信号通知其他CPU将该变量的缓存行置为无效状态,因此当其他CPU需要读取这个变量时,发现自己缓存中缓存该变量的缓存行是无效的,那么它就会从内存重新读取。</p><p><img style="margin-right: auto; margin-left: auto; display: block;" src="http://images.cnitblog.com/blog/288799/201408/212219343783699.jpg" alt="" /></p><p><strong>二.并发编程中的三个概念</strong></p><p>  在并发编程中,我们通常会遇到以下三个问题:原子性问题,可见性问题,有序性问题。我们先看具体看一下这三个概念:</p><p><strong>1.原子性</strong></p><p>  原子性:即一个操作或者多个操作 要么全部执行并且执行的过程不会被任何因素打断,要么就都不执行。</p><p>  一个很经典的例子就是银行账户转账问题:</p><p>  比如从账户A向账户B转1000元,那么必然包括2个操作:从账户A减去1000元,往账户B加上1000元。</p><p>  试想一下,如果这2个操作不具备原子性,会造成什么样的后果。假如从账户A减去1000元之后,操作突然中止。然后又从B取出了500元,取出500元之后,再执行 往账户B加上1000元 的操作。这样就会导致账户A虽然减去了1000元,但是账户B没有收到这个转过来的1000元。</p><p>  所以这2个操作必须要具备原子性才能保证不出现一些意外的问题。</p><p>  同样地反映到并发编程中会出现什么结果呢?</p><p>  举个最简单的例子,大家想一下假如为一个32位的变量赋值过程不具备原子性的话,会发生什么后果?</p><div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;">i = 9;<br/></div><p>&nbsp;  假若一个线程执行到这个语句时,我暂且假设为一个32位的变量赋值包括两个过程:为低16位赋值,为高16位赋值。</p><p>  那么就可能发生一种情况:当将低16位数值写入之后,突然被中断,而此时又有一个线程去读取i的值,那么读取到的就是错误的数据。</p><p><strong>2.可见性</strong></p><p>  可见性是指当多个线程访问同一个变量时,一个线程修改了这个变量的值,其他线程能够立即看得到修改的值。</p><p>  举个简单的例子,看下面这段代码:</p><div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;">//线程1执行的代码<br/>int i = 0;<br/>i = 10;<br/><br/>//线程2执行的代码<br/>j = i;<br/></div><p>&nbsp;  假若执行线程1的是CPU1,执行线程2的是CPU2。由上面的分析可知,当线程1执行 i =10这句时,会先把i的初始值加载到CPU1的高速缓存中,然后赋值为10,那么在CPU1的高速缓存当中i的值变为10了,却没有立即写入到主存当中。</p><p>  此时线程2执行 j = i,它会先去主存读取i的值并加载到CPU2的缓存当中,注意此时内存当中i的值还是0,那么就会使得j的值为0,而不是10.</p><p>  这就是可见性问题,线程1对变量i修改了之后,线程2没有立即看到线程1修改的值。</p><p><strong>3.有序性</strong></p><p>  有序性:即程序执行的顺序按照代码的先后顺序执行。举个简单的例子,看下面这段代码:</p><div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;">int i = 0; <br/>boolean flag = false;<br/>i = 1; //语句1 <br/>flag = true; //语句2<br/></div><p>&nbsp;  上面代码定义了一个int型变量,定义了一个boolean类型变量,然后分别对两个变量进行赋值操作。从代码顺序上看,语句1是在语句2前面的,那么JVM在真正执行这段代码的时候会保证语句1一定会在语句2前面执行吗?不一定,为什么呢?这里可能会发生指令重排序(Instruction Reorder)。</p><p>  下面解释一下什么是指令重排序,一般来说,处理器为了提高程序运行效率,可能会对输入代码进行优化,它不保证程序中各个语句的执行先后顺序同代码中的顺序一致,但是它会保证程序最终执行结果和代码顺序执行的结果是一致的。</p><p>  比如上面的代码中,语句1和语句2谁先执行对最终的程序结果并没有影响,那么就有可能在执行过程中,语句2先执行而语句1后执行。</p><p>  但是要注意,虽然处理器会对指令进行重排序,但是它会保证程序最终结果会和代码顺序执行结果相同,那么它靠什么保证的呢?再看下面一个例子:</p><div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;">int a = 10; //语句1<br/>int r = 2; //语句2<br/>a = a + 3; //语句3<br/>r = a*a; //语句4<br/></div><p>&nbsp;  这段代码有4个语句,那么可能的一个执行顺序是:</p><p>  <img src="http://images.cnitblog.com/blog/288799/201408/212305263939989.jpg" alt="" /></p><p>  </p><p>  那么可不可能是这个执行顺序呢: 语句2&nbsp;&nbsp; 语句1&nbsp;&nbsp;&nbsp; 语句4&nbsp;&nbsp; 语句3</p><p>  不可能,因为处理器在进行重排序时是会考虑指令之间的数据依赖性,如果一个指令Instruction 2必须用到Instruction 1的结果,那么处理器会保证Instruction 1会在Instruction 2之前执行。</p><p>  虽然重排序不会影响单个线程内程序执行的结果,但是多线程呢?下面看一个例子:</p><div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;">//线程1:<br/>context = loadContext(); //语句1<br/>inited = true; //语句2<br/><br/>//线程2:<br/>while(!inited ){<br/> sleep() <br/>}<br/>doSomethingwithconfig(context);<br/></div><p>&nbsp;  上面代码中,由于语句1和语句2没有数据依赖性,因此可能会被重排序。假如发生了重排序,在线程1执行过程中先执行语句2,而此是线程2会以为初始化工作已经完成,那么就会跳出while循环,去执行doSomethingwithconfig(context)方法,而此时context并没有被初始化,就会导致程序出错。</p><p>&nbsp;  从上面可以看出,指令重排序不会影响单个线程的执行,但是会影响到线程并发执行的正确性。</p><p>  也就是说,要想并发程序正确地执行,必须要保证原子性、可见性以及有序性。只要有一个没有被保证,就有可能会导致程序运行不正确。</p><h2 style="text-align: left;">三.Java内存模型</strong></p><p style="text-align: left;">  在前面谈到了一些关于内存模型以及并发编程中可能会出现的一些问题。下面我们来看一下Java内存模型,研究一下Java内存模型为我们提供了哪些保证以及在java中提供了哪些方法和机制来让我们在进行多线程编程时能够保证程序执行的正确性。</p><p style="text-align: left;">  在Java虚拟机规范中试图定义一种Java内存模型(Java Memory Model,JMM)来屏蔽各个硬件平台和操作系统的内存访问差异,以实现让Java程序在各种平台下都能达到一致的内存访问效果。那么Java内存模型规定了哪些东西呢,它定义了程序中变量的访问规则,往大一点说是定义了程序执行的次序。注意,为了获得较好的执行性能,Java内存模型并没有限制执行引擎使用处理器的寄存器或者高速缓存来提升指令执行速度,也没有限制编译器对指令进行重排序。也就是说,在java内存模型中,也会存在缓存一致性问题和指令重排序的问题。</p><p style="text-align: left;">  Java内存模型规定所有的变量都是存在主存当中(类似于前面说的物理内存),每个线程都有自己的工作内存(类似于前面的高速缓存)。线程对变量的所有操作都必须在工作内存中进行,而不能直接对主存进行操作。并且每个线程不能访问其他线程的工作内存。</p><p style="text-align: left;">  举个简单的例子:在java中,执行下面这个语句:</p><div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;">i = 10;<br/></div><p>&nbsp;  执行线程必须先在自己的工作线程中对变量i所在的缓存行进行赋值操作,然后再写入主存当中。而不是直接将数值10写入主存当中。</p><p>  那么Java语言 本身对 原子性、可见性以及有序性提供了哪些保证呢?</p><p><strong>1.原子性</strong></p><p>  在Java中,对基本数据类型的变量的读取和赋值操作是原子性操作,即这些操作是不可被中断的,要么执行,要么不执行。</p><p>  上面一句话虽然看起来简单,但是理解起来并不是那么容易。看下面一个例子i:</p><p>  请分析以下哪些操作是原子性操作:</p><div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;">x = 10; //语句1<br/>y = x; //语句2<br/>x++; //语句3<br/>x = x + 1; //语句4<br/></div><p>&nbsp;  咋一看,有些朋友可能会说上面的4个语句中的操作都是原子性操作。其实只有语句1是原子性操作,其他三个语句都不是原子性操作。</p><p>  语句1是直接将数值10赋值给x,也就是说线程执行这个语句的会直接将数值10写入到工作内存中。</p><p>  语句2实际上包含2个操作,它先要去读取x的值,再将x的值写入工作内存,虽然读取x的值以及 将x的值写入工作内存 这2个操作都是原子性操作,但是合起来就不是原子性操作了。</p><p>  同样的,x++和 x = x+1包括3个操作:读取x的值,进行加1操作,写入新的值。</p><p>&nbsp;  所以上面4个语句只有语句1的操作具备原子性。</p><p>  也就是说,只有简单的读取、赋值(而且必须是将数字赋值给某个变量,变量之间的相互赋值不是原子操作)才是原子操作。</p><p>  不过这里有一点需要注意:在32位平台下,对64位数据的读取和赋值是需要通过两个操作来完成的,不能保证其原子性。但是好像在最新的JDK中,JVM已经保证对64位数据的读取和赋值也是原子性操作了。</p><p>  从上面可以看出,Java内存模型只保证了基本读取和赋值是原子性操作,如果要实现更大范围操作的原子性,可以通过synchronized和Lock来实现。由于synchronized和Lock能够保证任一时刻只有一个线程执行该代码块,那么自然就不存在原子性问题了,从而保证了原子性。</p><p><strong>2.可见性</strong></p><p>  对于可见性,Java提供了volatile关键字来保证可见性。</p><p>  当一个共享变量被volatile修饰时,它会保证修改的值会立即被更新到主存,当有其他线程需要读取时,它会去内存中读取新值。</p><p>  而普通的共享变量不能保证可见性,因为普通共享变量被修改之后,什么时候被写入主存是不确定的,当其他线程去读取时,此时内存中可能还是原来的旧值,因此无法保证可见性。</p><p>  另外,通过synchronized和Lock也能够保证可见性,synchronized和Lock能保证同一时刻只有一个线程获取锁然后执行同步代码,并且在释放锁之前会将对变量的修改刷新到主存当中。因此可以保证可见性。</p><p><strong>3.有序性</strong></p><p>  在Java内存模型中,允许编译器和处理器对指令进行重排序,但是重排序过程不会影响到单线程程序的执行,却会影响到多线程并发执行的正确性。</p><p>  在Java里面,可以通过volatile关键字来保证一定的&ldquo;有序性&rdquo;(具体原理在下一节讲述)。另外可以通过synchronized和Lock来保证有序性,很显然,synchronized和Lock保证每个时刻是有一个线程执行同步代码,相当于是让线程顺序执行同步代码,自然就保证了有序性。</p><p>  另外,<span style="color: #ff0000;">Java内存模型具备一些先天的&ldquo;有序性&rdquo;,即不需要通过任何手段就能够得到保证的有序性,这个通常也称为 happens-before 原则。如果两个操作的执行次序无法从happens-before原则推导出来,那么它们就不能保证它们的有序性,虚拟机可以随意地对它们进行重排序。</span></p><p>  下面就来具体介绍下happens-before原则(先行发生原则):</p><ul><li style="text-align: left;">程序次序规则:一个线程内,按照代码顺序,书写在前面的操作先行发生于书写在后面的操作</li><li style="text-align: left;">锁定规则:一个unLock操作先行发生于后面对同一个锁额lock操作</li><li style="text-align: left;">volatile变量规则:对一个变量的写操作先行发生于后面对这个变量的读操作</li><li style="text-align: left;">传递规则:如果操作A先行发生于操作B,而操作B又先行发生于操作C,则可以得出操作A先行发生于操作C</li><li style="text-align: left;">线程启动规则:Thread对象的start()方法先行发生于此线程的每个一个动作</li><li style="text-align: left;">线程中断规则:对线程interrupt()方法的调用先行发生于被中断线程的代码检测到中断事件的发生</li><li style="text-align: left;">线程终结规则:线程中所有的操作都先行发生于线程的终止检测,我们可以通过Thread.join()方法结束、Thread.isAlive()的返回值手段检测到线程已经终止执行</li><li style="text-align: left;">对象终结规则:一个对象的初始化完成先行发生于他的finalize()方法的开始</li></ul><p style="text-align: left;">  这8条原则摘自《深入理解Java虚拟机》。</p><p style="text-align: left;">  这8条规则中,前4条规则是比较重要的,后4条规则都是显而易见的。</p><p style="text-align: left;">  下面我们来解释一下前4条规则:</p><p style="text-align: left;">  对于程序次序规则来说,我的理解就是一段程序代码的执行在单个线程中看起来是有序的。注意,虽然这条规则中提到&ldquo;书写在前面的操作先行发生于书写在后面的操作&rdquo;,这个应该是程序看起来执行的顺序是按照代码顺序执行的,因为虚拟机可能会对程序代码进行指令重排序。虽然进行重排序,但是最终执行的结果是与程序顺序执行的结果一致的,它只会对不存在数据依赖性的指令进行重排序。因此,在单个线程中,程序执行看起来是有序执行的,这一点要注意理解。事实上,这个规则是用来保证程序在单线程中执行结果的正确性,但无法保证程序在多线程中执行的正确性。</p><p style="text-align: left;">  第二条规则也比较容易理解,也就是说无论在单线程中还是多线程中,同一个锁如果出于被锁定的状态,那么必须先对锁进行了释放操作,后面才能继续进行lock操作。</p><p style="text-align: left;">  第三条规则是一条比较重要的规则,也是后文将要重点讲述的内容。直观地解释就是,如果一个线程先去写一个变量,然后一个线程去进行读取,那么写入操作肯定会先行发生于读操作。</p><p style="text-align: left;">  第四条规则实际上就是体现happens-before原则具备传递性。</p><h2 style="text-align: left;">四.深入剖析volatile关键字</strong></p><p style="text-align: left;">  在前面讲述了很多东西,其实都是为讲述volatile关键字作铺垫,那么接下来我们就进入主题。</p><p style="text-align: left;"><strong>1.volatile关键字的两层语义</strong></p><p style="text-align: left;">  一旦一个共享变量(类的成员变量、类的静态成员变量)被volatile修饰之后,那么就具备了两层语义:</p><p style="text-align: left;">  1)保证了不同线程对这个变量进行操作时的可见性,即一个线程修改了某个变量的值,这新值对其他线程来说是立即可见的。</p><p style="text-align: left;">  2)禁止进行指令重排序。</p><p style="text-align: left;">  先看一段代码,假如线程1先执行,线程2后执行:</p><div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;">//线程1<br/>boolean stop = false;<br/>while(!stop){<br/>doSomething();<br/>}<br/><br/>//线程2<br/>stop = true;<br/></div><p>&nbsp;  这段代码是很典型的一段代码,很多人在中断线程时可能都会采用这种标记办法。但是事实上,这段代码会完全运行正确么?即一定会将线程中断么?不一定,也许在大多数时候,这个代码能够把线程中断,但是也有可能会导致无法中断线程(虽然这个可能性很小,但是只要一旦发生这种情况就会造成死循环了)。</p><p>  下面解释一下这段代码为何有可能导致无法中断线程。在前面已经解释过,每个线程在运行过程中都有自己的工作内存,那么线程1在运行的时候,会将stop变量的值拷贝一份放在自己的工作内存当中。</p><p>  那么当线程2更改了stop变量的值之后,但是还没来得及写入主存当中,线程2转去做其他事情了,那么线程1由于不知道线程2对stop变量的更改,因此还会一直循环下去。</p><p>  但是用volatile修饰之后就变得不一样了:</p><p>  第一:使用volatile关键字会强制将修改的值立即写入主存;</p><p>  第二:使用volatile关键字的话,当线程2进行修改时,会导致线程1的工作内存中缓存变量stop的缓存行无效(反映到硬件层的话,就是CPU的L1或者L2缓存中对应的缓存行无效);</p><p>  第三:由于线程1的工作内存中缓存变量stop的缓存行无效,所以线程1再次读取变量stop的值时会去主存读取。</p><p>  那么在线程2修改stop值时(当然这里包括2个操作,修改线程2工作内存中的值,然后将修改后的值写入内存),会使得线程1的工作内存中缓存变量stop的缓存行无效,然后线程1读取时,发现自己的缓存行无效,它会等待缓存行对应的主存地址被更新之后,然后去对应的主存读取最新的值。</p><p>  那么线程1读取到的就是最新的正确的值。</p><p style="text-align: left;"><strong>2.volatile保证原子性吗?</strong></p><p style="text-align: left;">  从上面知道volatile关键字保证了操作的可见性,但是volatile能保证对变量的操作是原子性吗?</p><p style="text-align: left;">  下面看一个例子:</p><div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;">public class Test {<br/>public volatile int inc = 0;<br/><br/>public void increase() {<br/>inc++;<br/>}<br/><br/>public static void main(String[] args) {<br/>final Test test = new Test();<br/>for(int i=0;i&lt;10;i++){<br/>new Thread(){<br/>public void run() {<br/>for(int j=0;j&lt;1000;j++)<br/>test.increase();<br/>};<br/>}.start();<br/>}<br/><br/>while(Thread.activeCount()&gt;1) //保证前面的线程都执行完<br/>Thread.yield();<br/>System.out.println(test.inc);<br/>}<br/>}<br/></div><p>&nbsp;  大家想一下这段程序的输出结果是多少?也许有些朋友认为是10000。但是事实上运行它会发现每次运行结果都不一致,都是一个小于10000的数字。</p><p>  可能有的朋友就会有疑问,不对啊,上面是对变量inc进行自增操作,由于volatile保证了可见性,那么在每个线程中对inc自增完之后,在其他线程中都能看到修改后的值啊,所以有10个线程分别进行了1000次操作,那么最终inc的值应该是1000*10=10000。</p><p>  这里面就有一个误区了,volatile关键字能保证可见性没有错,但是上面的程序错在没能保证原子性。可见性只能保证每次读取的是最新的值,但是volatile没办法保证对变量的操作的原子性。</p><p>  在前面已经提到过,自增操作是不具备原子性的,它包括读取变量的原始值、进行加1操作、写入工作内存。那么就是说自增操作的三个子操作可能会分割开执行,就有可能导致下面这种情况出现:</p><p>  假如某个时刻变量inc的值为10,</p><p>  线程1对变量进行自增操作,线程1先读取了变量inc的原始值,然后线程1被阻塞了;</p><p>  然后线程2对变量进行自增操作,线程2也去读取变量inc的原始值,由于线程1只是对变量inc进行读取操作,而没有对变量进行修改操作,所以不会导致线程2的工作内存中缓存变量inc的缓存行无效,所以线程2会直接去主存读取inc的值,发现inc的值时10,然后进行加1操作,并把11写入工作内存,最后写入主存。</p><p>  然后线程1接着进行加1操作,由于已经读取了inc的值,注意此时在线程1的工作内存中inc的值仍然为10,所以线程1对inc进行加1操作后inc的值为11,然后将11写入工作内存,最后写入主存。</p><p>  那么两个线程分别进行了一次自增操作后,inc只增加了1。</p><p>  解释到这里,可能有朋友会有疑问,不对啊,前面不是保证一个变量在修改volatile变量时,会让缓存行无效吗?然后其他线程去读就会读到新的值,对,这个没错。这个就是上面的happens-before规则中的volatile变量规则,但是要注意,线程1对变量进行读取操作之后,被阻塞了的话,并没有对inc值进行修改。然后虽然volatile能保证线程2对变量inc的值读取是从内存中读取的,但是线程1没有进行修改,所以线程2根本就不会看到修改的值。</p><p>  根源就在这里,自增操作不是原子性操作,而且volatile也无法保证对变量的任何操作都是原子性的。</p><p>  把上面的代码改成以下任何一种都可以达到效果:</p><p>  采用synchronized:</p><div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;" onclick="cnblogs_code_show('376be879-56eb-4886-94b0-f89c5496c1d1')"><div id="cnblogs_code_open_376be879-56eb-4886-94b0-f89c5496c1d1" class="cnblogs_code_hide"><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">class</span><span style="color: #000000;"> Test {<br/> </span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">int</span> inc = 0<span style="color: #000000;">;<br/> <br/> </span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">synchronized</span> <span style="color: #0000ff;">void</span><span style="color: #000000;"> increase() {<br/> inc</span>++<span style="color: #000000;">;<br/> }<br/> <br/> </span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">static</span> <span style="color: #0000ff;">void</span><span style="color: #000000;"> main(String[] args) {<br/> </span><span style="color: #0000ff;">final</span> Test test = <span style="color: #0000ff;">new</span><span style="color: #000000;"> Test();<br/> </span><span style="color: #0000ff;">for</span>(<span style="color: #0000ff;">int</span> i=0;i&lt;10;i++<span style="color: #000000;">){<br/> </span><span style="color: #0000ff;">new</span><span style="color: #000000;"> Thread(){<br/> </span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">void</span><span style="color: #000000;"> run() {<br/> </span><span style="color: #0000ff;">for</span>(<span style="color: #0000ff;">int</span> j=0;j&lt;1000;j++<span style="color: #000000;">)<br/> test.increase();<br/> };<br/> }.start();<br/> }<br/> <br/> </span><span style="color: #0000ff;">while</span>(Thread.activeCount()&gt;1) <span style="color: #008000;">//</span><span style="color: #008000;">保证前面的线程都执行完</span><br/><span style="color: #000000;"> Thread.yield();<br/> System.out.println(test.inc);<br/> }<br/>}</span></div></div><p>  采用Lock:</p><div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;" onclick="cnblogs_code_show('7a877386-237d-4c2b-b28d-ff760550abc7')"><div id="cnblogs_code_open_7a877386-237d-4c2b-b28d-ff760550abc7" class="cnblogs_code_hide"><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">class</span><span style="color: #000000;"> Test {<br/> </span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">int</span> inc = 0<span style="color: #000000;">;<br/> Lock lock </span>= <span style="color: #0000ff;">new</span><span style="color: #000000;"> ReentrantLock();<br/> <br/> </span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">void</span><span style="color: #000000;"> increase() {<br/> lock.lock();<br/> </span><span style="color: #0000ff;">try</span><span style="color: #000000;"> {<br/> inc</span>++<span style="color: #000000;">;<br/> } </span><span style="color: #0000ff;">finally</span><span style="color: #000000;">{<br/> lock.unlock();<br/> }<br/> }<br/> <br/> </span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">static</span> <span style="color: #0000ff;">void</span><span style="color: #000000;"> main(String[] args) {<br/> </span><span style="color: #0000ff;">final</span> Test test = <span style="color: #0000ff;">new</span><span style="color: #000000;"> Test();<br/> </span><span style="color: #0000ff;">for</span>(<span style="color: #0000ff;">int</span> i=0;i&lt;10;i++<span style="color: #000000;">){<br/> </span><span style="color: #0000ff;">new</span><span style="color: #000000;"> Thread(){<br/> </span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">void</span><span style="color: #000000;"> run() {<br/> </span><span style="color: #0000ff;">for</span>(<span style="color: #0000ff;">int</span> j=0;j&lt;1000;j++<span style="color: #000000;">)<br/> test.increase();<br/> };<br/> }.start();<br/> }<br/> <br/> </span><span style="color: #0000ff;">while</span>(Thread.activeCount()&gt;1) <span style="color: #008000;">//</span><span style="color: #008000;">保证前面的线程都执行完</span><br/><span style="color: #000000;"> Thread.yield();<br/> System.out.println(test.inc);<br/> }<br/>}</span></div></div><p>  采用AtomicInteger:</p><div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;" onclick="cnblogs_code_show('6858213b-e442-4d04-86bb-6e2ed73bfa52')"><div id="cnblogs_code_open_6858213b-e442-4d04-86bb-6e2ed73bfa52" class="cnblogs_code_hide"><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">class</span><span style="color: #000000;"> Test {<br/> </span><span style="color: #0000ff;">public</span> AtomicInteger inc = <span style="color: #0000ff;">new</span><span style="color: #000000;"> AtomicInteger();<br/> <br/> </span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">void</span><span style="color: #000000;"> increase() {<br/> inc.getAndIncrement();<br/> }<br/> <br/> </span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">static</span> <span style="color: #0000ff;">void</span><span style="color: #000000;"> main(String[] args) {<br/> </span><span style="color: #0000ff;">final</span> Test test = <span style="color: #0000ff;">new</span><span style="color: #000000;"> Test();<br/> </span><span style="color: #0000ff;">for</span>(<span style="color: #0000ff;">int</span> i=0;i&lt;10;i++<span style="color: #000000;">){<br/> </span><span style="color: #0000ff;">new</span><span style="color: #000000;"> Thread(){<br/> </span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">void</span><span style="color: #000000;"> run() {<br/> </span><span style="color: #0000ff;">for</span>(<span style="color: #0000ff;">int</span> j=0;j&lt;1000;j++<span style="color: #000000;">)<br/> test.increase();<br/> };<br/> }.start();<br/> }<br/> <br/> </span><span style="color: #0000ff;">while</span>(Thread.activeCount()&gt;1) <span style="color: #008000;">//</span><span style="color: #008000;">保证前面的线程都执行完</span><br/><span style="color: #000000;"> Thread.yield();<br/> System.out.println(test.inc);<br/> }<br/>}</span></div></div><p>  在java 1.5的java.util.concurrent.atomic包下提供了一些原子操作类,即对基本数据类型的 自增(加1操作),自减(减1操作)、以及加法操作(加一个数),减法操作(减一个数)进行了封装,保证这些操作是原子性操作。atomic是利用CAS来实现原子性操作的(Compare And Swap),CAS实际上是利用处理器提供的CMPXCHG指令实现的,而处理器执行CMPXCHG指令是一个原子性操作。</p><p style="text-align: left;"><strong>3.volatile能保证有序性吗?</strong></p><p style="text-align: left;">  在前面提到volatile关键字能禁止指令重排序,所以volatile能在一定程度上保证有序性。</p><p style="text-align: left;">  volatile关键字禁止指令重排序有两层意思:</p><p style="text-align: left;">  1)当程序执行到volatile变量的读操作或者写操作时,在其前面的操作的更改肯定全部已经进行,且结果已经对后面的操作可见;在其后面的操作肯定还没有进行;</p><p style="text-align: left;">  2)在进行指令优化时,不能将在对volatile变量访问的语句放在其后面执行,也不能把volatile变量后面的语句放到其前面执行。</p><p style="text-align: left;">  可能上面说的比较绕,举个简单的例子:</p><div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;">//x、y为非volatile变量<br/>//flag为volatile变量<br/><br/>x = 2; //语句1<br/>y = 0; //语句2<br/>flag = true; //语句3<br/>x = 4; //语句4<br/>y = -1; //语句5<br/></div><p>&nbsp;  由于flag变量为volatile变量,那么在进行指令重排序的过程的时候,不会将语句3放到语句1、语句2前面,也不会讲语句3放到语句4、语句5后面。但是要注意语句1和语句2的顺序、语句4和语句5的顺序是不作任何保证的。</p><p>  并且volatile关键字能保证,执行到语句3时,语句1和语句2必定是执行完毕了的,且语句1和语句2的执行结果对语句3、语句4、语句5是可见的。</p><p>  那么我们回到前面举的一个例子:</p><div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;">//线程1:<br/>context = loadContext(); //语句1<br/>inited = true; //语句2<br/><br/>//线程2:<br/>while(!inited ){<br/> sleep() <br/>}<br/>doSomethingwithconfig(context);<br/></div><p>&nbsp;  前面举这个例子的时候,提到有可能语句2会在语句1之前执行,那么久可能导致context还没被初始化,而线程2中就使用未初始化的context去进行操作,导致程序出错。</p><p>  这里如果用volatile关键字对inited变量进行修饰,就不会出现这种问题了,因为当执行到语句2时,必定能保证context已经初始化完毕。</p><p style="text-align: left;"><strong>4.volatile的原理和实现机制</strong></p><p style="text-align: left;">  前面讲述了源于volatile关键字的一些使用,下面我们来探讨一下volatile到底如何保证可见性和禁止指令重排序的。</p><p style="text-align: left;">  下面这段话摘自《深入理解Java虚拟机》:</p><p style="text-align: left;">  &ldquo;观察加入volatile关键字和没有加入volatile关键字时所生成的汇编代码发现,加入volatile关键字时,会多出一个lock前缀指令&rdquo;</p><p style="text-align: left;">  lock前缀指令实际上相当于一个内存屏障(也成内存栅栏),内存屏障会提供3个功能:</p><p style="text-align: left;">  1)它确保指令重排序时不会把其后面的指令排到内存屏障之前的位置,也不会把前面的指令排到内存屏障的后面;即在执行到内存屏障这句指令时,在它前面的操作已经全部完成;</p><p style="text-align: left;">  2)它会强制将对缓存的修改操作立即写入主存;</p><p style="text-align: left;">  3)如果是写操作,它会导致其他CPU中对应的缓存行无效。</p><h2 style="text-align: left;">五.使用volatile关键字的场景</strong></p><p style="text-align: left;">  synchronized关键字是防止多个线程同时执行一段代码,那么就会很影响程序执行效率,而volatile关键字在某些情况下性能要优于synchronized,但是要注意volatile关键字是无法替代volatile关键字的,因为volatile关键字无法保证操作的原子性。通常来说,使用volatile必须具备以下2个条件:</p><p style="text-align: left;">  1)对变量的写操作不依赖于当前值</p><p style="text-align: left;">  2)该变量没有包含在具有其他变量的不变式中</p><p style="text-align: left;">  实际上,这些条件表明,可以被写入 volatile 变量的这些有效值独立于任何程序的状态,包括变量的当前状态。</p><p style="text-align: left;">  事实上,我的理解就是上面的2个条件需要保证操作是原子性操作,才能保证使用volatile关键字的程序在并发时能够正确执行。</p><p style="text-align: left;">  下面列举几个Java中使用volatile的几个场景。</p><p style="text-align: left;"><strong>1.状态标记量</strong></p><div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;">volatile boolean flag = false;<br/><br/>while(!flag){<br/>doSomething();<br/>}<br/><br/>public void setFlag() {<br/>flag = true;<br/>}<br/></div><p>&nbsp;</p><div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;">volatile boolean inited = false;<br/>//线程1:<br/>context = loadContext(); <br/>inited = true; <br/><br/>//线程2:<br/>while(!inited ){<br/>sleep() <br/>}<br/>doSomethingwithconfig(context);<br/></div><p>&nbsp;</p><p><strong>2.double check</strong></p><div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;">class Singleton{<br/>private volatile static Singleton instance = null;<br/><br/>private Singleton() {<br/><br/>}<br/><br/>public static Singleton getInstance() {<br/>if(instance==null) {<br/>synchronized (Singleton.class) {<br/>if(instance==null)<br/>instance = new Singleton();<br/>}<br/>}<br/>return instance;<br/>}<br/>}<br/></div><p>&nbsp;  至于为何需要这么写请参考:</p><p>  《Java 中的双重检查(Double-Check)》<a href="http://blog.csdn.net/dl88250/article/details/5439024" target="_blank">http://blog.csdn.net/dl88250/article/details/5439024</a></p><p style="text-align: left;">  和<a href="http://www.iteye.com/topic/652440">http://www.iteye.com/topic/652440</a></p><p style="text-align: left;">  参考资料:</p><p style="text-align: left;">  《Java编程思想》</p><p style="text-align: left;">  《深入理解Java虚拟机》</p><p style="text-align: left;">  <a href="http://jiangzhengjun.iteye.com/blog/652532" target="_blank">http://jiangzhengjun.iteye.com/blog/652532</a></p><p style="text-align: left;">  <a href="http://blog.sina.com.cn/s/blog_7bee8dd50101fu8n.html" target="_blank">http://blog.sina.com.cn/s/blog_7bee8dd50101fu8n.html</a></p><p style="text-align: left;">  <a href="http://ifeve.com/volatile/" target="_blank">http://ifeve.com/volatile/</a></p><p style="text-align: left;">  <a href="http://blog.csdn.net/ccit0519/article/details/11241403" target="_blank">http://blog.csdn.net/ccit0519/article/details/11241403</a></p><p style="text-align: left;">  <a href="http://blog.csdn.net/ns_code/article/details/17101369" target="_blank">http://blog.csdn.net/ns_code/article/details/17101369</a></p><p style="text-align: left;">  <a href="http://www.cnblogs.com/kevinwu/archive/2012/05/02/2479464.html" target="_blank">http://www.cnblogs.com/kevinwu/archive/2012/05/02/2479464.html</a></p><p style="text-align: left;">  <a href="http://www.cppblog.com/elva/archive/2011/01/21/139019.html" target="_blank">http://www.cppblog.com/elva/archive/2011/01/21/139019.html</a></p><p style="text-align: left;">  <a href="http://ifeve.com/volatile-array-visiblity/" target="_blank">http://ifeve.com/volatile-array-visiblity/</a></p><p style="text-align: left;">  <a href="http://www.bdqn.cn/news/201312/12579.shtml" target="_blank">http://www.bdqn.cn/news/201312/12579.shtml</a></p><p style="text-align: left;">  <a href="http://exploer.blog.51cto.com/7123589/1193399" target="_blank">http://exploer.blog.51cto.com/7123589/1193399</a></p><p style="text-align: left;">  <a href="http://www.cnblogs.com/Mainz/p/3556430.html" target="_blank">http://www.cnblogs.com/Mainz/p/3556430.html</a></p><img src="http://counter.cnblogs.com/blog/rss/3920373" width="1" height="1" alt=""/><br/><p>本文链接:<a href="http://www.cnblogs.com/dolphin0520/p/3920373.html" target="_blank">Java并发编程:volatile关键字解析</a>,转载请注明。</p>http://www.cnblogs.com/jianyus/p/3923316.htmlOffice 365 - SharePoint 2013 Online 之应用程序开发 - 霖雨1、给站点添加完Napa后,在网站内容里点击Napa,如下图: 2、创建一个新的app,如下图: 3、可以在Napa里添加新的项目,如下图: 4、添加新的文件,可以添加web页面、样式表、脚本,如下图: 5、可以设置Napa,如下图: 6、设置用Visual C#语言,这样vs打开可以...2014-08-22T13:51:00Z2014-08-22T13:51:00Z霖雨http://www.cnblogs.com/jianyus/<p>  1、给站点添加完Napa后,在网站内容里点击Napa,如下图:</p><p><a href="http://images.cnitblog.com/blog/256729/201408/192224448937257.png"><img style="display: inline; border: 0px;" title="clip_image001" src="http://images.cnitblog.com/blog/256729/201408/192224458933430.png" alt="clip_image001" width="700" height="545" border="0" /></a></p><p>  2、创建一个新的app,如下图:</p><p><a href="http://images.cnitblog.com/blog/256729/201408/192224465496031.png"><img style="display: inline; border: 0px;" title="clip_image002" src="http://images.cnitblog.com/blog/256729/201408/192224479243018.png" alt="clip_image002" width="700" height="377" border="0" /></a></p><p>  3、可以在Napa里添加新的项目,如下图:</p><p><a href="http://images.cnitblog.com/blog/256729/201408/192224485037659.png"><img style="display: inline; border: 0px;" title="clip_image003" src="http://images.cnitblog.com/blog/256729/201408/192224491126246.png" alt="clip_image003" width="700" height="366" border="0" /></a></p><p>  4、添加新的文件,可以添加web页面、样式表、脚本,如下图:</p><p><a href="http://images.cnitblog.com/blog/256729/201408/192224496749818.png"><img style="display: inline; border: 0px;" title="clip_image004" src="http://images.cnitblog.com/blog/256729/201408/192224503782732.png" alt="clip_image004" width="700" height="388" border="0" /></a></p><p>  5、可以设置Napa,如下图:</p><p><a href="http://images.cnitblog.com/blog/256729/201408/192224508932291.png"><img style="display: inline; border: 0px;" title="clip_image005" src="http://images.cnitblog.com/blog/256729/201408/192224512218091.png" alt="clip_image005" width="250" height="133" border="0" /></a></p><p>  6、设置用Visual C#语言,这样vs打开可以用C#,如下图:</p><p><a href="http://images.cnitblog.com/blog/256729/201408/192224518463449.png"><img style="display: inline; border: 0px;" title="clip_image006" src="http://images.cnitblog.com/blog/256729/201408/192224524566334.png" alt="clip_image006" width="700" height="428" border="0" /></a></p><p>  7、可以点击左侧菜单,Open in Visual Studio,如下图:</p><p><a href="http://images.cnitblog.com/blog/256729/201408/192224529564420.png"><img style="display: inline; border: 0px;" title="clip_image007" src="http://images.cnitblog.com/blog/256729/201408/192224535818777.png" alt="clip_image007" width="700" height="306" border="0" /></a></p><p>  8、弹出菜单,选择Visual C#,如下图:</p><p><a href="http://images.cnitblog.com/blog/256729/201408/192224543785421.png"><img style="display: inline; border: 0px;" title="clip_image008" src="http://images.cnitblog.com/blog/256729/201408/192224549717237.png" alt="clip_image008" width="471" height="352" border="0" /></a></p><p>  9、可能会弹出菜单,安装Web Platform 5.0,如下图:</p><p><a href="http://images.cnitblog.com/blog/256729/201408/192224554563850.png"><img style="display: inline; border: 0px;" title="clip_image009" src="http://images.cnitblog.com/blog/256729/201408/192224562065479.png" alt="clip_image009" width="528" height="418" border="0" /></a></p><p>  10、Visual Studio打开应用程序,如下图:</p><p><a href="http://images.cnitblog.com/blog/256729/201408/192224569093095.png"><img style="display: inline; border: 0px;" title="clip_image010" src="http://images.cnitblog.com/blog/256729/201408/192224580962025.png" alt="clip_image010" width="700" height="498" border="0" /></a></p><p>  11、需要登录Office 365,如下图:</p><p><a href="http://images.cnitblog.com/blog/256729/201408/192224587847167.png"><img style="display: inline; border: 0px;" title="clip_image011" src="http://images.cnitblog.com/blog/256729/201408/192224593319267.png" alt="clip_image011" width="441" height="407" border="0" /></a></p><p>  12、在Visual Studio中打开,可以添加自定义列表,如下图:</p><p><a href="http://images.cnitblog.com/blog/256729/201408/192224599099610.png"><img style="display: inline; border: 0px;" title="clip_image012" src="http://images.cnitblog.com/blog/256729/201408/192225004879954.png" alt="clip_image012" width="700" height="515" border="0" /></a></p><p>  13、为列表实例添加测试数据,如下图:</p><p><a href="http://images.cnitblog.com/blog/256729/201408/192225010494527.png"><img style="display: inline; border: 0px;" title="clip_image013" src="http://images.cnitblog.com/blog/256729/201408/192225015341141.png" alt="clip_image013" width="700" height="473" border="0" /></a></p><p>  14、添加JS脚本,读取列表内容,如下图:</p><p><a href="http://images.cnitblog.com/blog/256729/201408/192225023151014.png"><img style="display: inline; border: 0px;" title="clip_image014" src="http://images.cnitblog.com/blog/256729/201408/192225030652643.png" alt="clip_image014" width="700" height="463" border="0" /></a></p><p>  15、在Default页面,添加HTML读取展示列表内容,如下图:</p><p><a href="http://images.cnitblog.com/blog/256729/201408/192225037215243.png"><img style="display: inline; border: 0px;" title="clip_image015" src="http://images.cnitblog.com/blog/256729/201408/192225042844114.png" alt="clip_image015" width="700" height="348" border="0" /></a></p><p>  16、可以部署应用程序,如下图:</p><p><a href="http://images.cnitblog.com/blog/256729/201408/192225047993673.png"><img style="display: inline; border: 0px;" title="clip_image016" src="http://images.cnitblog.com/blog/256729/201408/192225052532043.png" alt="clip_image016" width="612" height="308" border="0" /></a></p><p>  17、打开部署的开发人员站点,如下图:</p><p><a href="http://images.cnitblog.com/blog/256729/201408/192225061432417.png"><img style="display: inline; border: 0px;" title="clip_image017" src="http://images.cnitblog.com/blog/256729/201408/192225069408059.png" alt="clip_image017" width="700" height="585" border="0" /></a></p><p>  18、点击Custom Show,可以进入该应用程序,点击GetData获取数据,如下图:</p><p><a href="http://images.cnitblog.com/blog/256729/201408/192225078156960.png"><img style="display: inline; border: 0px;" title="clip_image018" src="http://images.cnitblog.com/blog/256729/201408/192225083785831.png" alt="clip_image018" width="700" height="477" border="0" /></a></p><p>  19、点击List可以进入列表,如下图:</p><p><a href="http://images.cnitblog.com/blog/256729/201408/192225089566174.png"><img style="display: inline; border: 0px;" title="clip_image019" src="http://images.cnitblog.com/blog/256729/201408/192225094872504.png" alt="clip_image019" width="700" height="506" border="0" /></a></p><p><strong>总 结</strong></p><p>  Office 365中使用VS打开App后,不会同步到Napa,所以在Napa中发布,会覆盖掉VS发布的,不过,SharePoint Online中开发App和Server中基本一样。</p><img src="http://counter.cnblogs.com/blog/rss/3923316" width="1" height="1" alt=""/><br/><p>本文链接:<a href="http://www.cnblogs.com/jianyus/p/3923316.html" target="_blank">Office 365 - SharePoint 2013 Online 之应用程序开发</a>,转载请注明。</p>http://www.cnblogs.com/lszwhb/p/3928050.html010-CALayer(图层) - ゴルツの惠斌纳閣下问题一:什么是CALayer(图层)?简而言之:使UIView可以显示在屏幕上的功能属性,UIView之所以可以显示在屏幕上完全是因为UIView内部含有一个CALayer属性|在iOS中,能看得见摸得着的东西基本上都是UIView,比如一个按钮、一个文本标签、一个文本输入框、一个图标等等,这些都是...2014-08-22T13:32:00Z2014-08-22T13:32:00Zゴルツの惠斌纳閣下http://www.cnblogs.com/lszwhb/<p><strong><span style="color: #0000ff;">问题一:什么是CALayer(图层)?</span></strong></p><p><span style="color: #0000ff;">简而言之:使UIView可以显示在屏幕上的功能属性,UIView之所以可以显示在屏幕上完全是因为UIView内部含有一个CALayer属性</span></p><div>&bull;在iOS中,能看得见摸得着的东西基本上都是UIView,比如一个按钮、一个文本标签、一个文本输入框、一个图标等等,这些都是UIView</div><div>&nbsp;</div><div>&bull;UIView本身不具备显示的功能,之所以能显示完全是因为它内部的图层属性(具有显示功能)</div><div>&nbsp;</div><div>&bull;在创建UIView对象时,UIView内部会自动创建一个图层(即CALayer对象),通过UIView的layer属性可以访问这个层</div><div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;">@property(nonatomic,readonly,retain) CALayer *layer;</div><div>&nbsp;</div><div>&bull;当UIView需要显示到屏幕上时,会调用drawRect:方法进行绘图,将所有内容绘制在自己的图层上,绘图完毕后,系统将图层映射到屏幕上,于是就完成了UIView的显示</div><div><div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"><span style="color: #008000;">//</span><span style="color: #008000;"> view的完整显示过程<br/></span><span style="color: #008000;">//</span><span style="color: #008000;"> 1. view.layer准备了一个Layer Graphics Context(图层类型的上下文)<br/></span><span style="color: #008000;">//</span><span style="color: #008000;"> 2. 调用view.layer.delegate(view)的drawLayer:inContext:,并传入刚才准备好的上下文<br/></span><span style="color: #008000;">//</span><span style="color: #008000;"> 3. view的drawLayer:inContext:方法内部又会调用view的drawRect:方法<br/></span><span style="color: #008000;">//</span><span style="color: #008000;"> 4. view就可以在drawRect:方法中实现绘图代码, 所有东西最终都绘制到view.layer上面<br/></span><span style="color: #008000;">//</span><span style="color: #008000;"> 5. 系统再将view.layer的内容拷贝到屏幕, 于是完成了view的显示</span></div></div><p><strong><span style="color: #0000ff;">问题二:CALayer具有哪些属性?</span></strong></p><p><span style="color: #0000ff;">九大属性:</span></p><p>&bull;1.内容(比如设置为图片CGImageRef)</p><div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;">@property(retain) id contents;</div><div><div>&bull;2.位置(默认指中点,具体由anchorPoint决定)</div><div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;">@property CGPoint position; <span style="color: #008000;">// 用来设置CALayer在父层中的位置 以父层的左上角为原点(0, 0)</span></div>&bull;3.宽度和高度</div><div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;">@property CGRect bounds;</div><div><span style="font-size: 14px; line-height: 1.5;">&bull;4.锚点(x,y的范围都是0-1),决定了自身视图在position的坐落点</span></div><div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;">@property CGPoint anchorPoint;&nbsp;<span style="color: #008000;">// 称为&ldquo;定位点&rdquo;、&ldquo;锚点&rdquo; 决定着CALayer身上的哪个点会在position属性所指的位置 以自己的左上角为原点(0, 0) 它的x、y取值范围都是0~1,默认值为(0.5, 0.5)</span></div><div>&bull;5.背景颜色(CGColorRef类型)</div><div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;">@property CGColorRef backgroundColor;</div><div>&bull;6.形变属性</div><div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;">@property CATransform3D transform;</div><div>&bull;7.边框颜色(CGColorRef类型)</div><div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;">@property CGColorRef borderColor;</div><div>&bull;8.边框宽度</div><div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;">@property CGFloat borderWidth;</div><div>&bull;9.圆角半径</div><div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;">@property CGColorRef borderColor;</div><p><span style="color: #0000ff; font-size: 1.17em; line-height: 1.5;">问题三:CALayer可以用来做什么呢?</span></p><div>&bull;通过操作CALayer对象,可以很方便地调整UIView的一些外观属性,比如:</div><div>&Oslash;阴影</div><div>&Oslash;圆角大小</div><div>&Oslash;边框宽度和颜色</div><div>&Oslash;&hellip; &hellip;</div><div>&Oslash;代码示例:显示效果:<img src="http://images.cnitblog.com/blog/513720/201408/212105047844146.png" alt="" width="83" height="79" /><div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;">- (<span style="color: #0000ff;">void</span><span style="color: #000000;">)testView<br/>{<br/> </span><span style="color: #008000;">//</span><span style="color: #008000;"> 边框宽度</span><br/> self.purpleView.layer.borderWidth = <span style="color: #800080;">10</span><span style="color: #000000;">;<br/> </span><span style="color: #008000;">//</span> <span style="color: #008000;">//</span><span style="color: #008000;"> 边框颜色</span><br/> self.purpleView.layer.borderColor =<span style="color: #000000;"> [UIColor blueColor].CGColor;<br/> </span><span style="color: #008000;">//</span><span style="color: #008000;"> 圆角</span><br/> self.purpleView.layer.cornerRadius = <span style="color: #800080;">10</span><span style="color: #000000;">;<br/> </span><span style="color: #008000;">//</span><span style="color: #008000;"> self.purpleView.layer.masksToBounds = YES; // 超出主层边框范围的内容都剪掉<br/> </span><span style="color: #008000;">//</span><span style="color: #008000;"> 阴影颜色</span><br/> self.purpleView.layer.shadowColor =<span style="color: #000000;"> [UIColor blueColor].CGColor;<br/> </span><span style="color: #008000;">//</span><span style="color: #008000;"> 阴影偏差</span><br/> self.purpleView.layer.shadowOffset = CGSizeMake(<span style="color: #800080;">10</span>, <span style="color: #800080;">10</span><span style="color: #000000;">);<br/> </span><span style="color: #008000;">//</span><span style="color: #008000;"> 阴影不透明度</span><br/> self.purpleView.layer.shadowOpacity = <span style="color: #800080;">0.5</span><span style="color: #000000;">;<br/>}</span></div></div><div>&bull;还可以<span style="color: #ff0000;">给图层添加动画</span>,来<span style="color: #0000ff;">实现</span>一些比较<span style="color: #0000ff;">炫酷的效果(见问题六)</span></div><div><span style="color: #0000ff;">ps:新建</span><span style="color: #0000ff;"><span style="color: #0000ff;">图层</span></span><div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;" onclick="cnblogs_code_show('0b8a024b-1bdf-4497-aeb6-2ee178d9249c')"><div id="cnblogs_code_open_0b8a024b-1bdf-4497-aeb6-2ee178d9249c" class="cnblogs_code_hide">- (<span style="color: #0000ff;">void</span><span style="color: #000000;">)viewDidLoad<br/>{<br/> [super viewDidLoad];<br/><br/> </span><span style="color: #008000;">//</span><span style="color: #008000;"> 新建图层<br/></span><span style="color: #008000;">//</span><span style="color: #008000;"> CALayer *layer = [[CALayer alloc] init];</span><br/> CALayer *layer =<span style="color: #000000;"> [CALayer layer];<br/> layer.backgroundColor </span>=<span style="color: #000000;"> [UIColor redColor].CGColor;<br/> layer.bounds </span>= CGRectMake(<span style="color: #800080;">0</span>, <span style="color: #800080;">0</span>, <span style="color: #800080;">100</span>, <span style="color: #800080;">100</span><span style="color: #000000;">);<br/> layer.position </span>= CGPointMake(<span style="color: #800080;">200</span>, <span style="color: #800080;">200</span><span style="color: #000000;">);<br/> layer.anchorPoint </span>= CGPointMake(<span style="color: #800080;">1</span>, <span style="color: #800080;">1</span><span style="color: #000000;">);<br/> layer.cornerRadius </span>= <span style="color: #800080;">10</span><span style="color: #000000;">;<br/> layer.masksToBounds </span>=<span style="color: #000000;"> YES;<br/> layer.contents </span>= (<span style="color: #0000ff;">id</span>)[UIImage imageNamed:<span style="color: #800000;">@"</span><span style="color: #800000;">lufy</span><span style="color: #800000;">"</span><span style="color: #000000;">].CGImage;<br/> [self.view.layer addSublayer:layer];<br/> </span><span style="color: #008000;">//</span><span style="color: #008000;"> 新建图层<br/> </span><span style="color: #008000;">//</span><span style="color: #008000;"> CALayer *layer1 = [[CALayer alloc] init];</span><br/> CALayer *layer1 =<span style="color: #000000;"> [CALayer layer];<br/> layer1.backgroundColor </span>=<span style="color: #000000;"> [UIColor redColor].CGColor;<br/> layer1.bounds </span>= CGRectMake(<span style="color: #800080;">0</span>, <span style="color: #800080;">0</span>, <span style="color: #800080;">100</span>, <span style="color: #800080;">100</span><span style="color: #000000;">);<br/> layer1.position </span>= CGPointMake(<span style="color: #800080;">200</span>, <span style="color: #800080;">200</span><span style="color: #000000;">);<br/> layer1.anchorPoint </span>= CGPointMake(<span style="color: #800080;">0</span>, <span style="color: #800080;">0</span><span style="color: #000000;">);<br/> layer1.cornerRadius </span>= <span style="color: #800080;">10</span><span style="color: #000000;">;<br/> layer1.masksToBounds </span>=<span style="color: #000000;"> YES;<br/> layer1.contents </span>= (<span style="color: #0000ff;">id</span>)[UIImage imageNamed:<span style="color: #800000;">@"</span><span style="color: #800000;">lufy</span><span style="color: #800000;">"</span><span style="color: #000000;">].CGImage;<br/> [self.view.layer addSublayer:layer1];<br/>}</span></div></div><p><span style="color: #0000ff;">ps:自定义图层</span></p><div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;" onclick="cnblogs_code_show('fcd72539-d8b8-4832-bda9-528b9841b54e')"><div id="cnblogs_code_open_fcd72539-d8b8-4832-bda9-528b9841b54e" class="cnblogs_code_hide"><span style="color: #0000ff;">@implementation</span><span style="color: #000000;"> WHBLayer<br/></span><span style="color: #008000;">/*</span><span style="color: #008000;">*<br/> * 只有明显地调用setNeedsDisplay方法,才会调用drawInContext:方法进行绘制<br/> </span><span style="color: #008000;">*/</span><br/>- (<span style="color: #0000ff;">void</span><span style="color: #000000;">)drawInContext:(CGContextRef)ctx<br/>{<br/> </span><span style="color: #008000;">//</span><span style="color: #008000;"> 红色</span><br/> CGContextSetRGBFillColor(ctx, <span style="color: #800080;">1</span>, <span style="color: #800080;">0</span>, <span style="color: #800080;">0</span>, <span style="color: #800080;">1</span><span style="color: #000000;">);<br/> </span><span style="color: #008000;">//</span><span style="color: #008000;"> 添加圆</span><br/> CGContextAddEllipseInRect(ctx, CGRectMake(<span style="color: #800080;">0</span>, <span style="color: #800080;">0</span>, <span style="color: #800080;">50</span>, <span style="color: #800080;">50</span><span style="color: #000000;">));<br/> </span><span style="color: #008000;">//</span><span style="color: #008000;"> 实心绘制</span><br/><span style="color: #000000;"> CGContextFillPath(ctx);<br/>}</span></div></div><div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;" onclick="cnblogs_code_show('94724902-2ab1-40bf-8d05-2d26a34836b6')"><div id="cnblogs_code_open_94724902-2ab1-40bf-8d05-2d26a34836b6" class="cnblogs_code_hide">- (<span style="color: #0000ff;">void</span><span style="color: #000000;">)viewDidLoad<br/>{<br/> [super viewDidLoad];<br/> WHBLayer </span>*layer =<span style="color: #000000;"> [WHBLayer layer];<br/> layer.bounds </span>= CGRectMake(<span style="color: #800080;">0</span>, <span style="color: #800080;">0</span>, <span style="color: #800080;">100</span>, <span style="color: #800080;">100</span><span style="color: #000000;">);<br/> layer.backgroundColor </span>=<span style="color: #000000;"> [UIColor greenColor].CGColor;<br/> layer.anchorPoint </span>=<span style="color: #000000;"> CGPointZero;<br/> [layer setNeedsDisplay]; </span><span style="color: #008000;">//</span><span style="color: #008000;"> 绘图 会自动调用WHBLayer的drawInContext:(CGContextRef)ctf 方法</span><br/><span style="color: #000000;"> [self.view.layer addSublayer:layer];<br/>}</span></div></div></div><p><strong><span style="color: #0000ff;">问题四:为什么在CALayer中我们使用CGImageRef、CGColorRef两种数据类型来对其设置,而不用UIColor、UIImage???</span></strong></p><p><span style="color: #0000ff;">原因主要:考虑移植性,跨平台性</span></p><div><div>&bull;QuartzCore框架和CoreGraphics框架是可以跨平台使用的,在iOS和Mac OS X上都能使用&nbsp;</div><div>  &Oslash;CALayer是定义在QuartzCore框架中的</div><div>  &Oslash;CGImageRef、CGColorRef两种数据类型是定义在CoreGraphics框架中的</div><div>&bull;但是UIKit只能在iOS中使用</div><div>  &Oslash;UIColor、UIImage是定义在UIKit框架中的</div><div>&bull;为了保证可移植性,QuartzCore不能使用UIImage、UIColor,只能使用CGImageRef、CGColorRef</div></div><p><strong><span style="color: #0000ff;">&nbsp;问题五:既然UIView和CALayer均可在屏幕上显示图像,那又如何在二者之间做选择?</span></strong></p><div>&bull;通过CALayer,就能做出跟UIImageView一样的界面效果</div><div>&bull;既然CALayer和UIView都能实现相同的显示效果,那究竟该选择谁好呢?</div><div>&Oslash;对比CALayer,UIView多了一个事件处理的功能。也就是说,CALayer不能处理用户的触摸事件,而UIView可以</div><div>&Oslash;如果显示出来的东西<span style="color: #0000ff;">需要跟用户进行交互</span>的话,<span style="color: #0000ff;">用UIView</span>;如果<span style="color: #0000ff;">不需要跟用户进行交互</span>,用<span style="color: #0000ff;">UIView</span>或者<span style="color: #0000ff;">CALayer</span>都可以</div><div>&Oslash;当然,CALayer的性能会高一些,因为它少了事件处理的功能,更加轻量级</div><p><strong><span style="color: #0000ff;">问题六:如何利用CALayer来产生一些动画效果?什么是隐式动画?</span></strong></p><div>&bull;所有<span style="color: #0000ff;">手动创建的CALayer对象</span>,都存在着隐式动画</div><div>&bull;什么是隐式动画?</div><div>&Oslash;当对非Root Layer的部分属性进行修改时,默认会自动产生一些动画效果,称这些属性为Animatable Properties(可动画属性)</div><div>&bull;列举几个常见的Animatable Properties:</div><div><div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"><span style="color: #008000;">//</span><span style="color: #008000;"> bounds:用于设置CALayer的宽度和高度。修改这个属性会产生缩放动画<br/></span><span style="color: #008000;">//</span><span style="color: #008000;"> backgroundColor:用于设置CALayer的背景色。修改这个属性会产生背景色的渐变动画<br/></span><span style="color: #008000;">//</span><span style="color: #008000;"> position:用于设置CALayer的位置。修改这个属性会产生平移动画</span></div></div><div>&bull;可以通过动画事务(CATransaction)<span style="color: #800080;">关闭默认</span>的隐式动画效果</div><div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"><span style="color: #000000;">[CATransaction begin];<br/>[CATransaction setDisableActions:YES];<br/>self.myview.layer.position </span>= CGPointMake(<span style="color: #800080;">10</span>, <span style="color: #800080;">10</span><span style="color: #000000;">);<br/>[CATransaction commit];</span></div><p>&nbsp;代码示例:</p><div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;" onclick="cnblogs_code_show('5e37fb1d-8fc5-4adb-b9d0-5fb8bfc79abe')"><div id="cnblogs_code_open_5e37fb1d-8fc5-4adb-b9d0-5fb8bfc79abe" class="cnblogs_code_hide">- (<span style="color: #0000ff;">void</span><span style="color: #000000;">)viewDidLoad<br/>{<br/> [super viewDidLoad];<br/> </span><span style="color: #008000;">//</span><span style="color: #008000;"> Do any additional setup after loading the view, typically from a nib.</span><br/><span style="color: #000000;"> <br/> CALayer </span>*layer =<span style="color: #000000;"> [CALayer layer];<br/> layer.bounds </span>= CGRectMake(<span style="color: #800080;">0</span>, <span style="color: #800080;">0</span>, <span style="color: #800080;">100</span>, <span style="color: #800080;">100</span><span style="color: #000000;">);<br/> layer.backgroundColor </span>=<span style="color: #000000;"> [UIColor redColor].CGColor;<br/> layer.position </span>=<span style="color: #000000;"> CGPointZero;<br/> layer.anchorPoint </span>=<span style="color: #000000;"> CGPointZero;<br/> [self.view.layer addSublayer:layer];<br/> self.layer </span>=<span style="color: #000000;"> layer;<br/>}<br/><br/></span>- (<span style="color: #0000ff;">void</span>)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)<span style="color: #0000ff;">event</span><span style="color: #000000;"><br/>{<br/> self.layer.backgroundColor </span>=<span style="color: #000000;"> [UIColor blueColor].CGColor;<br/></span><span style="color: #008000;">//</span><span style="color: #008000;"> [CATransaction begin]; </span><span style="color: #008000;">//</span><span style="color: #008000;"> 开启事务<br/></span><span style="color: #008000;">//</span><span style="color: #008000;"> [CATransaction setDisableActions:YES];</span><br/><span style="color: #000000;"> <br/> self.layer.position </span>= CGPointMake(<span style="color: #800080;">100</span>, <span style="color: #800080;">100</span><span style="color: #000000;">);<br/> self.layer.opacity </span>= <span style="color: #800080;">0.1</span><span style="color: #000000;">;<br/> <br/></span><span style="color: #008000;">//</span><span style="color: #008000;"> [CATransaction commit]; </span><span style="color: #008000;">//</span><span style="color: #008000;"> 提交事务</span><br/>}</div></div><p>&nbsp;</p><div>&nbsp;</div><div>&nbsp;</div><img src="http://counter.cnblogs.com/blog/rss/3928050" width="1" height="1" alt=""/><br/><p>本文链接:<a href="http://www.cnblogs.com/lszwhb/p/3928050.html" target="_blank">010-CALayer(图层)</a>,转载请注明。</p>http://www.cnblogs.com/MigCoder/p/3930264.htmlAngularJs ng-repeat 必须注意的性能问题 - 灰机_不会飞AngularJs 的 ng-repeat 让我们非常方便的遍历数组生成 Dom 元素,但是使用不当也会有性能问题。在项目中我们使用 ng-repeat 加载完一个列表后,如果再次请求数据,然后过滤列表,代码可能会这么写: 请求新数据 {{use...2014-08-22T13:18:00Z2014-08-22T13:18:00Z灰机_不会飞http://www.cnblogs.com/MigCoder/<p>AngularJs 的 ng-repeat 让我们非常方便的遍历数组生成 Dom 元素,但是使用不当也会有性能问题。</p><p>在项目中我们使用 ng-repeat 加载完一个列表后,如果再次请求数据,然后过滤列表,代码可能会这么写:</p><code>&lt;div ng-controller=&quot;Test&quot;&gt;<br/> &lt;button ng-click=&quot;request()&quot;&gt;请求新数据&lt;/button&gt;<br/> &lt;div ng-repeat=&quot;user in users&quot;&gt;<br/> {{user.name}}<br/> &lt;/div&gt;<br/>&lt;/div&gt;</code><p>Controller 的代码:</p><code>app.controller('Test', function($scope) {<br/> var users = [];<br/> for (var i = 0; i &lt; 100; i++) {<br/> users[i] = {<br/> id: i,<br/> name: &quot;User: &quot; + i<br/> };<br/> }<br/> $scope.users = users;<br/><br/> $scope.request = function () {<br/> // 从服务器加载新数据<br/> var result = [];<br/><br/> // 直接重新赋值给 users<br/> $scope.users = result;<br/> };<br/>});</code><p>查看 ng-repeat 的源码可以发现,当 ng-repeat 的数组被替换时, 它默认并不会重新利用已有的 Dom 元素,而是直接将其全部删除并重新生成新的数组 Dom 元素:</p><code>// 将上次生成的所有 dom 移除<br/>for (key in lastBlockMap) {<br/> if (lastBlockMap.hasOwnProperty(key)) {<br/> block = lastBlockMap[key];<br/> elementsToRemove = getBlockElements(block.clone);<br/> $animate.leave(elementsToRemove);<br/> forEach(elementsToRemove, function(element) { element[NG_REMOVED] = true; });<br/> block.scope.$destroy();<br/> }<br/>}</code><p>Dom 的频繁操作是非常不友好的,为什么 ng-repeat 不能利用已有的 dom 元素去更新数据呢?因为你没有把数组元素的标识属性告诉它,那么两次替换的时候它就没办法追踪了,我们可以看到 ng-repeat 往数组里每个元素加了一个 $$hashKey 的属性:</p><p><img src="http://images.cnitblog.com/blog/433262/201408/222116005656478.jpg" alt="key" /></p><p>这个 key 是由 Angular 内部的 nextUid() 方法生成,类似数据库自增,但是是使用字符串。</p><p>现在我们明白了,因为每次替换数组都会导致 ng-repeat 为每个元素生成一个新 key, 所以根本没办法重用已有的 Dom 元素,那么我们可以使用下边的语法来避免这个问题:</p><code>&lt;div ng-controller=&quot;Test&quot;&gt;<br/> &lt;button ng-click=&quot;request()&quot;&gt;请求新数据&lt;/button&gt;<br/>// 使用 track by 标识<br/> &lt;div ng-repeat=&quot;user in users track by user.id&quot;&gt;<br/> {{user.name}}<br/> &lt;/div&gt;<br/>&lt;/div&gt;</code><p>这样 ng-repeat 就用将其缓存起来啦,当然可能你的数组元素没有一个标识属性,如果元素数量不多那么可以接受,不然还是建议你手动为其生成一个标识属性。</p><img src="http://counter.cnblogs.com/blog/rss/3930264" width="1" height="1" alt=""/><br/><p>本文链接:<a href="http://www.cnblogs.com/MigCoder/p/3930264.html" target="_blank">AngularJs ng-repeat 必须注意的性能问题</a>,转载请注明。</p>http://www.cnblogs.com/reach296/p/3930252.html[性能分析]端口限制 - reach2961、 什么是协议端口?在Internet上,各主机间通过TCP/TP协议发送和接收数据报,各个数据报根据其目的主机的ip地址来进行互联网络中的路由选择。可见,把数据报顺利的传送到目的主机是没有问题的。问题出在哪里呢?我们知道大多数操作系统都支持多程序(进程)同时运行,那么目的主机应该把接收到的数据报...2014-08-22T13:08:00Z2014-08-22T13:08:00Zreach296http://www.cnblogs.com/reach296/<p>1、&nbsp; 什么是协议端口?</p><p>在Internet上,各主机间通过TCP/TP协议发送和接收数据报,各个数据报根据其目的主机的ip地址来进行互联网络中的路由选择。可见,把数据报顺利的传送到目的主机是没有问题的。问题出在哪里呢?我们知道大多数操作系统都支持多程序(进程)同时运行,那么目的主机应该把接收到的数据报传送给众多同时运行的进程中的哪一个呢?显然这个问题有待解决,端口机制便由此被引入进来。</p><p>&nbsp;&nbsp;&nbsp; 本地操作系统会给那些有需求的进程分配协议端口(protocal&nbsp;port,即我们常说的端口),每个协议端口由一个正整数标识,如:80,139,445,等等。当目的主机接收到数据报后,将根据报文首部的目的端口号,把数据发送到相应端口,而与此端口相对应的那个进程将会领取数据并等待下一组数据的到来。说到这里,端口的概念似乎仍然抽象,那么继续跟我来,别走开。</p><p>端口其实就是队,操作系统为各个进程分配了不同的队,数据报按照目的端口被推入相应的队中,等待被进程取用,在极特殊的情况下,这个队也是有可能溢出的,不过操作系统允许各进程指定和调整自己的队的大小。<br />不光接受数据报的进程需要开启它自己的端口,发送数据报的进程也需要开启端口,这样,数据报中将会标识有源端口,以便接受方能顺利的回传数据报到这个端口。</p><p>&nbsp; &nbsp;&nbsp;&nbsp;在Internet上,按照协议类型分类,端口被分为TCP端口和UDP端口两类,虽然他们都用正整数标识,但这并不会引起歧义,比如TCP的80端口和UDP的80端口,因为数据报在标明端口的同时,还将标明端口的类型。&nbsp;</p><p>&nbsp;&nbsp;&nbsp; &nbsp;从端口的分配来看,端口被分为固定端口和动态端口两大类(一些教程还将极少被用到的高端口划分为第三类:私有端口):<br />&nbsp;&nbsp;&nbsp; 固定端口(0-1023):<br />&nbsp;&nbsp;&nbsp; &nbsp;使用集中式管理机制,即服从一个管理机构对端口的指派,这个机构负责发布这些指派。由于这些端口紧绑于一些服务,所以我们会经常扫描这些端口来判断对方是否开启了这些服务,如TCP的21(ftp),80(http),139(netbios),UDP的7(echo),69(tftp)等等一些大家熟知的端口;<br />&nbsp;&nbsp;&nbsp; 动态端口(1024-65535):<br />&nbsp;&nbsp;&nbsp; &nbsp;这些端口并不被固定的捆绑于某一服务,操作系统将这些端口动态的分配给各个进程,同一进程两次分配有可能分配到不同的端口。</p><p>&nbsp;</p><p>2、&nbsp; 端口限制对性能的影响</p><p>理论上,linux和windows可用的端口个数为65535个Linux和windows动态端口的数量都存在限制,linux系统(如red hat)的动态端口限制为1024-4999,windows 2003SOCKET 端口数量默认5000,正常情况下,这些端口数量是够用的,但是如果服务器是用来提供web服务或者用来对其他服务器加压,这时候,服务器会产生大量的TCP连接,由于每个TCP客户端连接都要占用一个唯一的本地端口号,如果现有的TCP客户端连接已将所有的本地端口号占满,则此时就无法为新的TCP客户端连接分配一个本地端口号了,因此系统会在这种情况下在connect()调用中返回失败,并提示错误消息:"Can't assignrequested&nbsp;address".</p><p>&nbsp;</p><p>&nbsp;</p><p>3、&nbsp; 如何查看端口限制</p><p>首先可以通过cat /proc/sys/net/ipv4/ip_local_port_range来查看服务器端口的极限值</p><p>&nbsp;</p><p>&nbsp;</p><p>再通过</p><p>netstat -an | awk '/^tcp/ {++state[$6]} END&nbsp;&nbsp; {for (key in state) printkey,"\t",state[key]}'</p><p>命令来查看端口的占用情况</p><p>&nbsp;<img src="http://images.cnitblog.com/blog/638228/201408/222105471129864.png" alt="" /></p><p>如果端口极限值设置较小,而端口的已经被大量使用,尤其被大量TIME_WAIT占用</p><p>就可以确认端口已经被耗尽了。</p><p>&nbsp;<img src="http://images.cnitblog.com/blog/638228/201408/222106020035946.png" alt="" /></p><p>4、&nbsp; 如何修改端口限制</p><p>&nbsp;</p><p>#Vi&nbsp;/etc/sysctl.conf </p><p>修改net.ipv4.ip_local_port_range = 1024 65000</p><p># /sbin/sysctl -p</p><p>试配置生效即可。</p><img src="http://counter.cnblogs.com/blog/rss/3930252" width="1" height="1" alt=""/><br/><p>本文链接:<a href="http://www.cnblogs.com/reach296/p/3930252.html" target="_blank">[性能分析]端口限制</a>,转载请注明。</p>http://www.cnblogs.com/xiaomanon/p/3930242.htmlQt中配置OpenCV环境 - XiaoManon在Qt中开发基于OpenCV的应用时,需要配置对应函数库到环境变量,这时候我们需要使用到qmake能够识别的变量来指定环境变量。INCLUDEPATH: 用于指定搜索头文件到文件夹路径。LIBS: 包含链接时的库文件列表。使用-L来指定文件夹路径,-l来指定库的名称。而这些配置,我们需要写入到对应到...2014-08-22T12:59:00Z2014-08-22T12:59:00ZXiaoManonhttp://www.cnblogs.com/xiaomanon/<p>在Qt中开发基于OpenCV的应用时,需要配置对应函数库到环境变量,这时候我们需要使用到qmake能够识别的变量来指定环境变量。</p><p><span style="background-color: #00ff00;">INCLUDEPATH</span>: 用于指定搜索头文件到文件夹路径。</p><p><span style="background-color: #00ff00;">LIBS</span>: 包含链接时的库文件列表。使用-L来指定文件夹路径,-l来指定库的名称。</p><p>而这些配置,我们需要写入到对应到工程文件(*.pro)当中,可以有两种写法。</p><p>第一种:直接指定包含到库文件名称。</p><div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"><span style="color: #008080;">1</span> INCLUDEPATH += /usr/local/include/opencv2/<br/><span style="color: #008080;">2</span> <br/><span style="color: #008080;">3</span> LIBS += /usr/local/lib/<span style="color: #000000;">libopencv_core.so \<br/></span><span style="color: #008080;">4</span> /usr/local/lib/<span style="color: #000000;">libopencv_highgui.so \<br/></span><span style="color: #008080;">5</span> /usr/local/lib/libopencv_imgproc.so</div><p>这种方法必须指定整个文件到完整路径及名称,编写起来相对麻烦一点。</p><p>&nbsp;</p><p>第二种:指定库文件路径和库名称。</p><div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"><span style="color: #008080;">1</span> INCLUDEPATH += /usr/local/include/opencv2/<br/><span style="color: #008080;">2</span> LIBS += -L/usr/local/lib/<span style="color: #000000;"> \<br/></span><span style="color: #008080;">3</span> -<span style="color: #000000;">lopencv_core\<br/></span><span style="color: #008080;">4</span> -<span style="color: #000000;">lopencv_highgui\<br/></span><span style="color: #008080;">5</span> -lopencv_imgproc</div><p>这里只需要先声明库文件的位置,然后使用-l参数来添加库名称即可。</p><img src="http://counter.cnblogs.com/blog/rss/3930242" width="1" height="1" alt=""/><br/><p>本文链接:<a href="http://www.cnblogs.com/xiaomanon/p/3930242.html" target="_blank">Qt中配置OpenCV环境</a>,转载请注明。</p>http://www.cnblogs.com/xiaoheimiaoer/p/3930220.html炫酷吊炸天的nodeppt - 黑MAO由于要做一个关于node的分享,要准备写一个ppt方便就行交流。之前用的比较多的是slides(http://www.slides.com),最近知道了一个node写的工具,可以生成ppt,号称很强大,我就做了一次尝试(原因是使用markdown语法写ppt)。 nodeppt是@三水清大大的...2014-08-22T12:46:00Z2014-08-22T12:46:00Z黑MAOhttp://www.cnblogs.com/xiaoheimiaoer/<p>  由于要做一个关于node的分享,要准备写一个ppt方便就行交流。之前用的比较多的是slides(http://www.slides.com),最近知道了一个node写的工具,可以生成ppt,号称很强大,我就做了一次尝试(原因是使用markdown语法写ppt)。</p><p>&nbsp;</p><p>  nodeppt是@三水清大大的力作,想要了解nodeppt有哪些强大的功能,可以<a href="https://github.com/ksky521/nodePPT" target="_blank">来这儿</a>看看</p><p>&nbsp;</p><p>  我这里主要讲一下,我在使用过程需要注意的问题:</p><p>&nbsp;</p><p>  1.安装</p><p>  根据文档说明安装应该是这样子的</p><div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;">npm install -g nodeppt<br/></div><p>  本想着这样就能成功,结果安装过程中报了错误,发现是权限不够,所以就加了个sudo,果然成功安装了nodeppt。检测是否成功安装nodeppt可以使用下面的命令</p><div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;">nodeppt -V<br/>//记得是大写V<br/>//0.8.9-1<br/><br/>nodeppt -h<br/>//查看帮助<br/></div><p>  2.启动</p><p>  如果直接使用文档中的启动命令的话,有可能会报错,应该是ERROR: port 8080 is in use!意思就是说nodeppt默认开启的8080端口被占用了,这个时候需要使用设置端口号的命令</p><div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;">nodeppt start -p &lt;未被使用的端口&gt;<br/></div><p>  这样就可以成功开启服务了,这个时候就可以访问到nodeppt提供的默认demo了,上面介绍了nodeppt的特性和相关功能实用,那么如何执行自己的ppt呢?</p><div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;">nodeppt start -d &lt;ppt所在目录&gt;<br/></div><p>  nodeppt会读取设置目录下的md文件,作为ppt的入口。没有设置目录的话,或默认/usr/local/lib/node_modules/nodeppt/ppts/目录下的ppt。</p><p>  3.配置</p><p>  看demo例子可以发现,可以发现下面一些配置</p><div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;">title: nodeppt markdown 演示<br/>speaker: Theo Wang<br/>url: https://github.com/ksky521/nodePPT<br/>transition: slide<br/>files: /js/demo.js,/css/demo.css<br/><br/>/*<br/>title: 这是演讲的题目<br/>speaker: 演讲者名字<br/>url: 可以设置链接<br/>transition: 转场效果,例如:zoomin/cards/slide<br/>files: 引入js和css的地址,如果有的话~自动放在页面底部<br/>*/<br/></div><p>  关于files这配置,如果没有设置,默认从/usr/local/lib/node_modules/nodeppt/assets/读取静态资源。想要了解有那些专场效果可以<a href="https://github.com/ksky521/nodePPT" target="_blank">来这儿</a>查看。</p><p>  4.关闭</p><p>  关闭nodeppt服务的时候,我用ctrl+z实现了关闭,发现我之前开启的端口号都不能使用了,原因我虽然把服务关了,但是并没有关闭进程,这样的话,之前开启的端口都不能使用了。解决办法:可以使用ps -ef | grep username 可以查看这个username开启的进程有哪些,也可以使用netsta -nap | grep node查看node相关的端口状态,然后使用kill -9 &lt;进程ID&gt;杀死进程即可。</p><p>  当然最简单的办法就是:使用ctrl+c关闭nodeppt服务,这样的话进程同时会被干掉。</p><p>  5.其他</p><ul><li>nodeppt有一个比较好玩的功能,可以通过手机控制PPT展示,就是所谓的&ldquo;摇一摇&rdquo;切换ppt,很酷,很炫</li><li>可以导出pdf格式和html格式的文件</li></ul><p>&nbsp;</p><p>  可以<a href="http://qdemo.sinaapp.com/" target="_blank">看看demo</a>例子,看完之后,<span style="line-height: 1.5;">各位也可以去玩玩,挺不错的~</span></p><p>&nbsp;</p><p>  参考资料:https://github.com/ksky521/nodePPT</p><img src="http://counter.cnblogs.com/blog/rss/3930220" width="1" height="1" alt=""/><br/><p>本文链接:<a href="http://www.cnblogs.com/xiaoheimiaoer/p/3930220.html" target="_blank">炫酷吊炸天的nodeppt</a>,转载请注明。</p>http://www.cnblogs.com/reent/p/3930186.html关于CSS设置和获取元素不透明度的问题与解决方案 - ZREENT对于浏览器对元素不透明度度opacity的支持情况和如何设置,相信大家已经都熟悉了。这里就不再分析。简单的,要支持主流浏览器需要同时设置IE特有的滤镜和W3C标准的opacity属性。例如:设置不透明度为20% filter:alpha(opacity=20); opacity:0....2014-08-22T12:23:00Z2014-08-22T12:23:00ZZREENThttp://www.cnblogs.com/reent/<p>对于浏览器对元素不透明度度opacity的支持情况和如何设置,相信大家已经都熟悉了。这里就不再分析。</p><p>简单的,要支持主流浏览器需要同时设置IE特有的滤镜和W3C标准的opacity属性。</p><p><span style="color: #008000;">例如:设置不透明度为20% </span></p><p><span style="color: #008000;">    filter:alpha(opacity=20); </span></p><p><span style="color: #008000;">    opacity:0.2;</span></p><p>我需要重点分享的是CSS不透明度通过JS获取的问题。</p><p>首先,经过本人的大量有效分析测试得出:</p><p><span style="color: #ff6600;">    IE5 - IE8&nbsp;&nbsp; 只支持filter滤镜设置CSS不透明度,不支持opacity属性设置CSS不透明度</span></p><p><span style="color: #ff6600;">    IE9&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;既支持filter滤镜设置CSS不透明度,也支持opacity属性设置CSS不透明度</span></p><p><span style="color: #ff6600;">    IE10+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 不支持filter滤镜设置CSS不透明度,只支持opacity属性设置CSS不透明度</span></p><p><span style="color: #ff6600;">    Firefox Chrome Safari Opera 不支持filter滤镜设置CSS不透明度,只支持opacity属性设置CSS不透明度</span></p><p>&nbsp;</p><p><span style="color: #ff6600;">    IE9+ 支持currentStyle,也支持document.defaultView.getComputedStyle</span></p><p><br /><span style="color: #ff6600;">    IE5 - IE8 支持currentStyle,不支持document.defaultView.getComputedStyle</span></p><p><br /><span style="color: #ff6600;">    非IE 不支持currentStyle,只支持document.defaultView.getComputedStyle</span></p><p>&nbsp;</p><p><span style="color: #ff6600;">    IE 支持获取CSS用户自定义的属性,但是只能通过访问currentStyle返回,而访问document.defaultView.getComputedStyle无法获得自定义属性</span></p><p><span style="color: #ff6600;">    非IE 不支持获取CSS自定义属性</span></p><p>&nbsp;</p><p>所以,用JS获取不透明度属性的时候,因为默认的opacity属性值为1,但是IE8及其以下的版本不支持,所以会返回undefined,而其他支持该属性的浏览器返回1。</p><p>那么在如上面的例子中那样设置了不透明度为20%不透明,那么我们要通过IE支持的currentStyle来获取filter的值:alpha(opacity=20),在通过正则表达式得到数值20,再乘以0.01得到正确的值0.2,</p><p>对于非IE和支持opacity的浏览器,可以直接获取。</p><p>&nbsp;</p><p><strong><span style="color: #ff0000;">但是</span></strong></p><p>这里有一个需要注意的地方就是,返回值的浮点数与设置值不相等的问题。</p><p>在Chrome Safari Opera这3大浏览器中,设置opacity:0.2,当我们用JS获取opacity值得时候返回的却不是0.2,而是一个约等于0.2的很长的浮点数,浏览器测试这时判断返回值是否等于0.2,得到false。</p><p>对于这个问题我没有找到原因,但是在这3大浏览器中测试确实存在,返回值与设置值有微量误差,本人猜测这也许与获取CSS的方式是通过计算后的样式,其中浏览器内部的浮点数运算存在误差的缘故。</p><p>所以可以用 <span style="color: #ff6600;">0.01*Math.round(100*CSS.opacity)&nbsp;</span>方法处理返回值来得到正确的值。</p><p>在IE和Firefox中没有这样的问题,他们都返回设置的值。</p><p>&nbsp;</p><p>以上就是本人的一点小小的经验,非常高兴和大家分享!</p><img src="http://counter.cnblogs.com/blog/rss/3930186" width="1" height="1" alt=""/><br/><p>本文链接:<a href="http://www.cnblogs.com/reent/p/3930186.html" target="_blank">关于CSS设置和获取元素不透明度的问题与解决方案</a>,转载请注明。</p>http://www.cnblogs.com/travellife/p/3930179.htmlAndroid随笔之——Activity中启动另一应用 - 登天路最近在写语音交互程序,在语音打开应用这块碰到如何用代码控制应用启动的问题。百度了一下,有两种方案:1、获取应用的包名;2、获取应用的包名、入口类名。 之前对两种方案都进行了尝试,发现方案二中存在一个弊端,那就是系统级应用只能获取到包名,不能获取到入口类名,这会导致程序报错,当然你也可以不获取系...2014-08-22T12:15:00Z2014-08-22T12:15:00Z登天路http://www.cnblogs.com/travellife/<p>  最近在写语音交互程序,在语音打开应用这块碰到如何用代码控制应用启动的问题。百度了一下,有两种方案:1、获取应用的包名;2、获取应用的包名、入口类名。</p><p>  之前对两种方案都进行了尝试,发现方案二中存在一个弊端,那就是系统级应用只能获取到包名,不能获取到入口类名,这会导致程序报错,当然你也可以不获取系统级应用的包名和入口类名。出于简单方便的考虑,选择了方案一,废话不多说,上代码。</p><p>方案一、</p><p>1、获取程序包名:</p><div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"><span style="color: #008080;"> 1</span>      <span style="color: #008000;">//</span><span style="color: #008000;"> 获取PackageManager对象</span><br/><span style="color: #008080;"> 2</span> PackageManager packageManager =<span style="color: #000000;"> getPackageManager();<br/></span><span style="color: #008080;"> 3</span> <span style="color: #008000;">//</span><span style="color: #008000;"> 得到系统安装的所有程序的PackageInfo对象</span><br/><span style="color: #008080;"> 4</span> List&lt;PackageInfo&gt; packages = packageManager.getInstalledPackages(0<span style="color: #000000;">);<br/></span><span style="color: #008080;"> 5</span> <span style="color: #008000;">//</span><span style="color: #008000;"> 创建String类型的数组,用来存放获取的包名</span><br/><span style="color: #008080;"> 6</span> ArrayList&lt;String&gt; packageList = <span style="color: #0000ff;">new</span> ArrayList&lt;String&gt;<span style="color: #000000;">();<br/></span><span style="color: #008080;"> 7</span> <br/><span style="color: #008080;"> 8</span> <span style="color: #0000ff;">for</span> (<span style="color: #0000ff;">int</span> i = 0; i &lt; packages.size(); i++<span style="color: #000000;">) {<br/></span><span style="color: #008080;"> 9</span> PackageInfo packageInfo =<span style="color: #000000;"> packages.get(i);<br/></span><span style="color: #008080;">10</span> <br/><span style="color: #008080;">11</span> <span style="color: #008000;">//</span><span style="color: #008000;"> 判断是否是系统级应用</span><br/><span style="color: #008080;">12</span> <span style="color: #0000ff;">if</span> ((packageInfo.applicationInfo.flags &amp; ApplicationInfo.FLAG_SYSTEM) == 0<span style="color: #000000;">) {<br/></span><span style="color: #008080;">13</span> <span style="color: #000000;"> packageList.add(packageInfo.packageName);<br/></span><span style="color: #008080;">14</span> <span style="color: #000000;"> }<br/></span><span style="color: #008080;">15</span> }</div><p>&nbsp;</p><p>2、根据获取的包名启动应用:</p><div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"><span style="color: #008080;"> 1</span>      <span style="color: #008000;">//</span><span style="color: #008000;"> 获取PackageManager对象</span><br/><span style="color: #008080;"> 2</span> PackageManager packageManager =<span style="color: #000000;"> getPackageManager();<br/></span><span style="color: #008080;"> 3</span> <span style="color: #008000;">//</span><span style="color: #008000;"> 获取索引为i的包名</span><br/><span style="color: #008080;"> 4</span> String packageName =<span style="color: #000000;"> packageList.get(i);<br/></span><span style="color: #008080;"> 5</span> <span style="color: #008000;">//</span><span style="color: #008000;"> 如果该程序不可启动(像系统自带的包,有很多是没有入口的)会返回NULL</span><br/><span style="color: #008080;"> 6</span> Intent intent =<span style="color: #000000;"> packageManager.getLaunchIntentForPackage(packageName);<br/></span><span style="color: #008080;"> 7</span> <br/><span style="color: #008080;"> 8</span> <span style="color: #0000ff;">if</span> (intent != <span style="color: #0000ff;">null</span><span style="color: #000000;">) {<br/></span><span style="color: #008080;"> 9</span> <span style="color: #000000;"> startActivity(intent);<br/></span><span style="color: #008080;">10</span> }</div><p>&nbsp;</p><p>方案二、还没仔细研究过,不过对那些主入口设置&lt;intent-filter&gt;的应用,方案二应该会优于方案一,明天找个时间把这个补上</p><img src="http://counter.cnblogs.com/blog/rss/3930179" width="1" height="1" alt=""/><br/><p>本文链接:<a href="http://www.cnblogs.com/travellife/p/3930179.html" target="_blank">Android随笔之——Activity中启动另一应用</a>,转载请注明。</p>http://www.cnblogs.com/ready-Yang/p/3930074.html4行代码实现js模板引擎 - 杨捷在平时编码中,经常要做拼接字符串的工作,如把json数据用HTML展示出来,以往字符串拼接与逻辑混在在一起会让代码晦涩不堪,加大了多人协作与维护的成本。而采用前端模板机制就能很好的解决这个问题。精妙的 tmpl前端模板类开源的不少,但最属 jQuery 作者 John Resig 开发的 “java...2014-08-22T11:52:00Z2014-08-22T11:52:00Z杨捷http://www.cnblogs.com/ready-Yang/<p>在平时编码中,经常要做拼接字符串的工作,如把json数据用HTML展示出来,以往字符串拼接与逻辑混在在一起会让代码晦涩不堪,加大了多人协作与维护的成本。而采用前端模板机制就能很好的解决这个问题。</p><p>&nbsp;</p><p><strong>精妙的 tmpl</strong></p><p>&nbsp;</p><p>前端模板类开源的不少,但最属 jQuery 作者 John Resig 开发的 &ldquo;javascript micro templating&rdquo; 最为精妙,寥寥几笔便实现了模板引擎核心功能。 它的介绍与使用方式请看作者博客:<a href="http://ejohn.org/blog/javascript-micro-templating/">http://ejohn.org/blog/javascript-micro-templating/</a></p><p>&nbsp;</p><p>麻雀虽小,五脏俱全,除了基本的数据附加外,还拥有缓存机制、逻辑支持。现在,若要我评出一个javascript 最节能的自定义函数排名,第一名是 $ 函数(document.getElementById 简版),而第二名就是 tmpl 了。</p><p>&nbsp;</p><p>当然,它并非完美,我使用过程中发现了一些问题:</p><p>&nbsp;</p><p><strong>tmpl 美中不足</strong></p><p>&nbsp;</p><p>&nbsp;&nbsp;&nbsp; 一、无法正确处理转义字符,如: tmpl('&lt;%=name%&gt;\\&lt;%=id%&gt; ', {name:'糖饼', id: '1987'});它就会报错。若正常工作,它应该输出:糖饼\1987</p><p>&nbsp;</p><p>&nbsp;&nbsp;&nbsp; 二、无法识别数据里的单引号</p><p>&nbsp;</p><p>&nbsp;&nbsp;&nbsp; 三、设置变量默认值复杂,如</p><p>&nbsp;</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tmpl('&lt;%if(obj.name){%&gt;&lt;%=name%&gt;&lt;%}else{%&gt;默认值&lt;%}%&gt; ', {name:'糖饼'});&nbsp; //设置name默认为 &ldquo;默认值&rdquo;</p><p><strong>tmpl 优化版本</strong></p><p>废话不多说,先敬上代码:</p><p>&nbsp;</p><div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"><span style="color: #008080;"> 1</span> <span style="color: #0000ff;">function</span><span style="color: #000000;"> tmpl(str, data) {<br/></span><span style="color: #008080;"> 2</span> <span style="color: #0000ff;">var</span> $ = '$' + (+ <span style="color: #0000ff;">new</span><span style="color: #000000;"> Date)<br/></span><span style="color: #008080;"> 3</span> , fn = <span style="color: #0000ff;">function</span><span style="color: #000000;"> (data) {<br/></span><span style="color: #008080;"> 4</span> <span style="color: #0000ff;">var</span> i, variable = [$], value =<span style="color: #000000;"> [[]];<br/></span><span style="color: #008080;"> 5</span> <span style="color: #0000ff;">for</span> (i <span style="color: #0000ff;">in</span><span style="color: #000000;"> data) {<br/></span><span style="color: #008080;"> 6</span> <span style="color: #000000;"> variable.push(i);<br/></span><span style="color: #008080;"> 7</span> <span style="color: #000000;"> value.push(data[i]);<br/></span><span style="color: #008080;"> 8</span> <span style="color: #000000;"> }<br/></span><span style="color: #008080;"> 9</span> <span style="color: #0000ff;">return</span> (<span style="color: #0000ff;">new</span><span style="color: #000000;"> Function(variable, fn.$))<br/></span><span style="color: #008080;">10</span> .apply(data, value).join(""<span style="color: #000000;">);<br/></span><span style="color: #008080;">11</span> <span style="color: #000000;"> };<br/></span><span style="color: #008080;">12</span> <br/><span style="color: #008080;">13</span> <span style="color: #008000;">//</span><span style="color: #008000;">将模板解析成函数</span><br/><span style="color: #008080;">14</span> fn.$ = fn.$ || $ + ".push('"<br/><span style="color: #008080;">15</span> + str.replace(/\\/g, "\\\\"<span style="color: #000000;">)<br/></span><span style="color: #008080;">16</span> .replace(/'/g, "\\'") <span style="color: #008000;">//</span><span style="color: #008000;">防止单括号错误</span><br/><span style="color: #008080;">17</span> .replace(/[\r\t\n]/g, " "<span style="color: #000000;">)<br/></span><span style="color: #008080;">18</span> .split("[:").join("\t"<span style="color: #000000;">)<br/></span><span style="color: #008080;">19</span> .replace(/((^|:])[^\t]*)'/g, "$1\r"<span style="color: #000000;">)<br/></span><span style="color: #008080;">20</span> .replace(/\t=([^\?]*?):]/g, "',$1,'"<span style="color: #000000;">)<br/></span><span style="color: #008080;">21</span> .replace(/\t=([^\?]*?)\?(.*?):]/g, "',this.$1||'$2','") <span style="color: #008000;">//</span><span style="color: #008000;"> [:=data?:] [:=data?任何内容:]</span><br/><span style="color: #008080;">22</span> .split("\t").join("');"<span style="color: #000000;">)<br/></span><span style="color: #008080;">23</span> .split(":]").join($ + ".push('"<span style="color: #000000;">)<br/></span><span style="color: #008080;">24</span> .split("\r").join("\\'"<span style="color: #000000;">)<br/></span><span style="color: #008080;">25</span> + "');return " +<span style="color: #000000;"> $;<br/></span><span style="color: #008080;">26</span> <br/><span style="color: #008080;">27</span> <span style="color: #008000;">//</span><span style="color: #008000;">如果未定义data则返回编译好的函数,使用时直接传入数据即可,</span><br/><span style="color: #008080;">28</span> <span style="color: #008000;">//</span><span style="color: #008000;">省去每次解析成函数的时间</span><br/><span style="color: #008080;">29</span> <span style="color: #0000ff;">return</span> data ?<span style="color: #000000;"> fn(data) : fn;<br/></span><span style="color: #008080;">30</span> <br/><span style="color: #008080;">31</span> }; </div><p>好吧,上面的代码看起来超出了4行,原谅我标题党。不过这段代码经过压缩后,确实只有四行^_^。下面我们就来详细解构它。</p><p>首先看一下使用示例:</p><div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"><span style="color: #008080;"> 1</span> <span style="color: #008000;">//</span><span style="color: #008000;">循环结构</span><br/><span style="color: #008080;"> 2</span> <br/><span style="color: #008080;"> 3</span> <span style="color: #0000ff;">var</span> tpl = '[: for(var k in ary){ var one=ary[k]; :]'<br/><span style="color: #008080;"> 4</span> + '&lt;p&gt;[:=one:]&lt;/p&gt;'<br/><span style="color: #008080;"> 5</span> + '[: } :]'<span style="color: #000000;">;<br/></span><span style="color: #008080;"> 6</span> <span style="color: #0000ff;">var</span> data = {ary:[123,'abc'<span style="color: #000000;">]};</span><br/><span style="color: #008080;"> 8</span> <span style="color: #0000ff;">var</span> div =<span style="color: #000000;"> tmpl(tpl,data);</span><br/><span style="color: #008080;">10</span> console.log(div); <span style="color: #008000;">//&lt;/p&gt;</span><span style="color: #008000;">123&lt;/p&gt;&lt;p&gt;abc&lt;/p&gt;</span><br/><span style="color: #008080;">11</span> <br/><span style="color: #008080;">12</span> <br/><span style="color: #008080;">13</span> <span style="color: #008000;">//</span><span style="color: #008000;">变量验证</span><br/><span style="color: #008080;">14</span> <br/><span style="color: #008080;">15</span> <span style="color: #0000ff;">var</span> tpl = '[: if(this.name!==undefined){ :]' <span style="color: #008000;">//</span><span style="color: #008000;">注意必须使用 this.name,直接使用name,如果未定义就会报错</span><br/><span style="color: #008080;">16</span> + '&lt;p&gt;[:=name:]&lt;/p&gt;'<br/><span style="color: #008080;">17</span> + '[: } :]'<span style="color: #000000;">;<br/></span><span style="color: #008080;">18</span> <span style="color: #0000ff;">var</span> data = {name:'abc'<span style="color: #000000;">};</span><br/><span style="color: #008080;">20</span> <span style="color: #0000ff;">var</span> div =<span style="color: #000000;"> tmpl(tpl,data);</span><br/><span style="color: #008080;">22</span> <br /><br/><span style="color: #008080;">23</span> <span style="color: #008000;">//</span><span style="color: #008000;">你还可以这样方便地使用未定义的变量:</span><br/><span style="color: #008080;">24</span> <br /><br/><span style="color: #008080;">25</span> <span style="color: #0000ff;">var</span> tpl = '&lt;p&gt;name:[:=name?:], name:[:=name?默认值:]&lt;/p&gt;'<span style="color: #000000;">;<br/></span><span style="color: #008080;">26</span> <span style="color: #0000ff;">var</span> data = {no:'abc'<span style="color: #000000;">};<br/></span><span style="color: #008080;">27</span> <span style="color: #0000ff;">var</span> div =<span style="color: #000000;"> tmpl(tpl,data);<br/></span><span style="color: #008080;">28</span> <br/><span style="color: #008080;">29</span> console.log(div); <span style="color: #008000;">//</span><span style="color: #008000;"> &lt;p&gt;name:, name:默认值&lt;/p&gt;</span><br/><span style="color: #008080;">30</span> <br/><span style="color: #008080;">31</span> <br/><span style="color: #008080;">32</span> <span style="color: #008000;">//</span><span style="color: #008000;">缓存编译结果</span><br/><span style="color: #008080;">33</span> <br/><span style="color: #008080;">34</span> <br/><span style="color: #008080;">35</span> <span style="color: #0000ff;">var</span> tpl = '[: for(var k in ary){ var one=ary[k]; :]'<br/><span style="color: #008080;">36</span> + '&lt;<span style="color: #008000;">p&gt;</span>[:=one:]&lt;/p&gt;'<br/><span style="color: #008080;">37</span> + '[: } :]'<span style="color: #000000;">;<br/></span><span style="color: #008080;">38</span> <span style="color: #0000ff;">var</span> data = {ary:[123,'abc'<span style="color: #000000;">]};</span><br/><span style="color: #008080;">40</span> <span style="color: #0000ff;">var</span> render = tmpl(tpl); <span style="color: #008000;">//</span><span style="color: #008000;">不传入data,则生成缓存,多次使用缓存节约大量正则运算</span><br/><span style="color: #008080;">42</span> <span style="color: #0000ff;">var</span> div = render(data); <span style="color: #008000;">//</span><span style="color: #008000;">传入data,代入变量,解析成最终结果</span><br/><span style="color: #008080;">43</span> <br/><span style="color: #008080;">44</span> console.log(div); <span style="color: #008000;">//&lt;</span><span style="color: #008000;">p&gt;123&lt;/p&gt;&lt;p&gt;abc&lt;/p&gt;</span></div><p>使用方法:在 [: 与&nbsp;:] 之间使用任何js代码,并且通过 [:=data:] 方式以字符串形式输出变量。更加详细的使用方法/手册,请查看:<a href="http://docs.codekart.jojoin.com/p/tool_tmpl">http://docs.codekart.jojoin.com/p/tool_tmpl</a></p><p><strong>优化的地方:</strong></p><p>&nbsp;&nbsp;&nbsp; 一. 正确处理转义字符 \ ' 等转义字符</p><p>&nbsp;&nbsp;&nbsp; 二. 修改包裹符 &lt;% %&gt; 为 [: :] 防止与 html标签&lt;/&gt;和求余运算符%产生冲突。</p><p>&nbsp;&nbsp;&nbsp; 三. 修改环境变量 obj 为 this</p><p>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; tmpl('&lt;%if(obj.name=="name")%&gt;')&nbsp;&nbsp; //旧版本</p><p>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; tmpl('[: if(this.name=="name") :]')&nbsp;&nbsp; //新版本</p><p>&nbsp;&nbsp;&nbsp; 四. 为变量添加默认值</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp; tmpl('&lt;%if(obj.name){%&gt;&lt;%=name%&gt;&lt;%}else{%&gt;默认值&lt;%}%&gt;')&nbsp;&nbsp; //旧版本</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp; tmpl('[:=name?默认值:]')&nbsp;&nbsp; //新版本</p><p>&nbsp;&nbsp;&nbsp; 五. 去掉 with 语句,大幅提升引擎性能</p><p>&nbsp;&nbsp;&nbsp; 六. 删除可有可无的功能,保持精简</p><p>&nbsp;&nbsp;&nbsp; 七. 增加调试模式</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//打印模板编译中间结果:</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;console(tmpl('&lt;p&gt;[:=name:]&lt;/p&gt;').$);&nbsp;</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //$1408707567855.push('&lt;p&gt;',name,'&lt;/p&gt;');return $1408707567855</p><p>此引擎函数大致分为两部分:</p><p>&nbsp;&nbsp;&nbsp; 一. 上半部分:模板函数解析执行</p><p>&nbsp;&nbsp;&nbsp; 二. 下半部分:正则运算生成模板函数</p><p>可以看出,引擎实现的重点主要在下半部分的一堆正则表达式,也就是&ldquo;模板编译&rdquo;的过程。这里我不打算把每一个正则的功能都说清楚,那样篇幅太大(好吧是我懒),各位看官请自行阅读研究。</p><p>另外,此模板引擎已被集成到 Node.js&nbsp;web开发框架 <a title="Codekart" href="http://www.cnblogs.com/codekart.jojoin.com" target="_blank">Codekart</a>&nbsp;中。</p><p><strong>Codekart</strong> 是一套给 Node.js 开发者使用的应用程序开发框架和工具包。 它提供一套丰富的标准库以及简单的接口和逻辑结构, 其目的是使开发人员更快速地进行项目开发。 使用 Codekart 可以减少代码的编写量, 并将你的精力投入到项目的创造性开发上。</p><p>它已经帮你出色的完成了下面这些事情:</p><p><strong>优雅的框架思维</strong></p><p>如果你需要一个真正的框架,而不是一个模块/中间件/工具箱,如果你需要简约与便捷,需要一目了然、理所当然的舒适感,那么 Codekart 将是最好的选择。</p><p><strong>高性能 HTTP 服务器</strong></p><p>Codekart 处理 http 请求的性能接近原生 Node.js 代码: http.createServer(), 原因是框架只是对此函数做了简单的封装,其性能的损耗仅仅只有一个 url 正则匹配运算,路由请求处理程序。</p><p><strong>便捷的静态文件服务器</strong></p><p>把文件放入 static/ 目录下,启动Codekart,url 访问,搞定!</p><p><strong>web 页面模块化支持</strong></p><p>实际上,这是Codekart最出色的部分!它是前后端一体化的,可以像写配置文件一样编写web页面, 框架自动完成 js、css 、tpl 文件的模块化加载、合并、压缩, 并在html里引用,自动完成 html 模板的解析,并且支持页面继承和多态,一切就是那么简单轻松!</p><p><strong>丰富的工具箱</strong></p><p>Codekart 准备了一系列强大的前后端工具集合,涉及进程通信,数据缓存,文件读取,文件上传,数据采集与处理,流程控制,任务计划等诸多方面。</p><p>框架源码托管在Github:<a href="https://github.com/yangjiePro/Codekart">https://github.com/yangjiePro/Codekart</a>&nbsp;&nbsp;&nbsp;欢迎提交新的代码!</p><p>&nbsp;</p><img src="http://counter.cnblogs.com/blog/rss/3930074" width="1" height="1" alt=""/><br/><p>本文链接:<a href="http://www.cnblogs.com/ready-Yang/p/3930074.html" target="_blank">4行代码实现js模板引擎</a>,转载请注明。</p>http://www.cnblogs.com/lizhenghn/p/3930107.html使用autotools系列工具自动部署源代码编译安装 - lizhenghn在Linux系统下开发一个较大的项目,完全手动建立Makefile是一件费力而又容易出错的工作。autotools系列工具只需用户输入简单的目标文件、依赖文件、文件目录等就可以比较轻松地生成Makefile了。这极大地简化了Makefile的编写和维护,作者也是刚体验到其威力,所以将其过程记录下来。...2014-08-22T11:08:00Z2014-08-22T11:08:00Zlizhenghnhttp://www.cnblogs.com/lizhenghn/<p>在Linux系统下开发一个较大的项目,完全手动建立Makefile是一件费力而又容易出错的工作。autotools系列工具只需用户输入简单的目标文件、依赖文件、文件目录等就可以比较轻松地生成Makefile了。</p><p>这极大地简化了Makefile的编写和维护,作者也是刚体验到其威力,所以将其过程记录下来。</p><p>本文以一个简单的hello.c文件进行验证。</p><p><strong>准备工作</strong></p><p>首先需要安装autotools系列工具,包括aclocal、autoscan、automake、autoheader、autoconf等。</p><p>如果在centos或redhat系统下可以通过rpm &ndash;qa | grep auto来查看各个应用程序,如果没有,直接yum install automake即可安装。</p><p><strong>大致流程</strong></p><ul><li>1. 编写源代码以及手动书写Makefile.am文件(稍后介绍);</li><li>2. 依次使用各种autotools系列工具配置编译属性;</li></ul><div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"><span style="color: #000000;"> autoscan #扫面当前目录、源文件,生成configure.scan文件<br/> aclocal #根据configure.in生成aclocal.m4文件以及autom4te.cache文件夹<br/> autoconf #根据configure.in和aclocal.m4来产生configure文件<br/> autoheader #生成配置头文件的模板config.h.</span><span style="color: #0000ff;">in</span><br/> <span style="color: #0000ff;">touch</span><span style="color: #000000;"> README NEWS AUTHORS ChangeLog #生成一些声明性文件<br/> automake </span>--add-missing #生成Makefiel.in和所需要的脚本</div><ul><li><span style="line-height: 1.5;">3. 编译、生成、部署:</span></li></ul><div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"><span style="color: #0000ff;">make</span><br/><span style="color: #0000ff;">make</span> <span style="color: #0000ff;">install</span><br/><span style="color: #0000ff;">make</span><span style="color: #000000;"> clean<br/></span><span style="color: #0000ff;">make</span><span style="color: #000000;"> dist #制作发布的软件包<br/></span><span style="color: #0000ff;">make</span> distcheck #检验完整性并制作软件包 </div><p><strong>详细步骤</strong></p><p><strong><span style="color: #ff0000;">1. &nbsp;autoscan</span></strong></p><p>将生成configure.scan和autoscan.log文件,它会在给定目录及其子目录树中检查源文件,若没有给定目录,就在当前目录及其子目录树中进行检查。它会搜索源文件以寻找一般的移植性问题并且创建一个文件configure.scan,通过这个文件我们可以创建autoconf需要的模版文件。</p><div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;">[root@lzv6 hello]# <span style="color: #0000ff;">ls</span><span style="color: #000000;"><br/>hello.c<br/>[root@lzv6 hello]# autoscan<br/>[root@lzv6 hello]# </span><span style="color: #0000ff;">ls</span><span style="color: #000000;"><br/>autoscan.log configure.scan hello.c</span></div><p><strong><span style="color: #ff0000;">2. &nbsp;重命名configure.scan,并修改configure.in</span></strong></p><div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"><span style="color: #0000ff;">mv</span> configure.scan configure.<span style="color: #0000ff;">in</span> #将上步生成的configure.scan更改为autoconf需要的文件模版configure.<span style="color: #0000ff;">in</span></div><p>在configure.in中增加以下内容:</p><div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;">AC_INIT([hello], [<span style="color: #800080;">0.1</span><span style="color: #000000;">], [lizhenghn@gmail.com])<br/>AM_INIT_AUTOMAKE(hello,</span><span style="color: #800080;">1.0</span><span style="color: #000000;">)<br/>AC_PROG_CXX<br/>AC_PROG_LIBTOOL<br/>AC_CONFIG_FILES(Makefile)</span></div><p>修改后的configure.in内容如下:</p><div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"><span style="color: #008080;"> 1</span> # -*- Autoconf -*-<br/><span style="color: #008080;"> 2</span> # Process this <span style="color: #0000ff;">file</span><span style="color: #000000;"> with autoconf to produce a configure script.<br/></span><span style="color: #008080;"> 3</span> <br/><span style="color: #008080;"> 4</span> AC_PREREQ([<span style="color: #800080;">2.63</span><span style="color: #000000;">])<br/></span><span style="color: #008080;"> 5</span> AC_INIT([hello], [<span style="color: #800080;">0.1</span><span style="color: #000000;">], [lizhenghn@gmail.com]) #用来定义软件的名字、版本,以及邮箱地址信息<br/></span><span style="color: #008080;"> 6</span> #AC_INIT([hello], [<span style="color: #800080;">0.1</span><span style="color: #000000;">])<br/></span><span style="color: #008080;"> 7</span> AM_INIT_AUTOMAKE(hello,<span style="color: #800080;">0.1</span><span style="color: #000000;">) #必须添加此行,描述了要生成的软件包的名字及其版本号<br/></span><span style="color: #008080;"> 8</span> <span style="color: #000000;">AC_CONFIG_SRCDIR([hello.c]) #用来侦测所指定的源码文件是否存在<br/></span><span style="color: #008080;"> 9</span> <span style="color: #000000;">AC_CONFIG_HEADERS([config.h])<br/></span><span style="color: #008080;">10</span> <br/><span style="color: #008080;">11</span> # Checks <span style="color: #0000ff;">for</span><span style="color: #000000;"> programs.<br/></span><span style="color: #008080;">12</span> <span style="color: #000000;">AC_PROG_CC #检测系统所用的C编译器<br/></span><span style="color: #008080;">13</span> <span style="color: #000000;">AC_PROG_CXX<br/></span><span style="color: #008080;">14</span> <br/><span style="color: #008080;">15</span> # Checks <span style="color: #0000ff;">for</span><span style="color: #000000;"> libraries.<br/></span><span style="color: #008080;">16</span> <span style="color: #000000;">#AC_PROG_RANLIB #需要需要静态库<br/></span><span style="color: #008080;">17</span> <span style="color: #000000;">AC_PROG_LIBTOOL #如果需要动态库<br/></span><span style="color: #008080;">18</span> <br/><span style="color: #008080;">19</span> # Checks <span style="color: #0000ff;">for</span><span style="color: #000000;"> header files.<br/></span><span style="color: #008080;">20</span> <br/><span style="color: #008080;">21</span> # Checks <span style="color: #0000ff;">for</span><span style="color: #000000;"> typedefs, structures, and compiler characteristics.<br/></span><span style="color: #008080;">22</span> <br/><span style="color: #008080;">23</span> # Checks <span style="color: #0000ff;">for</span><span style="color: #000000;"> library functions.<br/></span><span style="color: #008080;">24</span> <span style="color: #000000;">AC_CONFIG_FILES(Makefile)<br/></span><span style="color: #008080;">25</span> AC_OUTPUT</div><p><strong><span style="color: #ff0000;">3. aclocal :复制所有的宏命令</span></strong></p><p>configure.in 里面包含了一系列的宏命令,运行aclocal的目的是把工程需要的宏命令展开。aclocal.m4 就是configure.in中用到的宏定义。本步会生成aclocal.m4文件和autom4te.cache文件夹。</p><div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"><span style="color: #000000;">[root@lzv6 hello]# aclocal<br/>[root@lzv6 hello]# </span><span style="color: #0000ff;">ls</span><span style="color: #000000;"><br/>aclocal.m4 autom4te.cache autoscan.log configure.</span><span style="color: #0000ff;">in</span> hello.c</div><p><strong><span style="color: #ff0000;">4. autoheader :生成config.h.in文件</span></strong></p><p>生成配置头文件的模板config.h.in文件。</p><div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"><span style="color: #000000;">[root@lzv6 hello]# autoheader<br/>[root@lzv6 hello]# </span><span style="color: #0000ff;">ls</span><span style="color: #000000;"><br/>aclocal.m4 autom4te.cache autoscan.log config.h.</span><span style="color: #0000ff;">in</span> configure.<span style="color: #0000ff;">in</span> hello.c</div><p><strong><span style="color: #ff0000;">5. 创建一些声明性文件</span></strong></p><p>此处创建一些声明性,但非必须的文件,文件内容可以暂时都为空。</p><div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;">[root@lzv6 hello]# <span style="color: #0000ff;">touch</span> README NEWS AUTHORS ChangeLog</div><p><strong><span style="color: #ff0000;">6. autoconf :生成configure脚本</span></strong></p><div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"><span style="color: #000000;">[root@lzv6 hello]# autoconf<br/>[root@lzv6 hello]# </span><span style="color: #0000ff;">ls</span><span style="color: #000000;"><br/>aclocal.m4 AUTHORS autom4te.cache autoscan.log ChangeLog config.h.</span><span style="color: #0000ff;">in</span> configure configure.<span style="color: #0000ff;">in</span> hello.c NEWS README</div><p><strong><span style="color: #ff0000;">7. 编写Makefile.am</span></strong></p><p>如下是一个简单的Makefile.am</p><div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;">AUTOMAKE_OPTIONS=<span style="color: #000000;">foreign<br/>bin_PROGRAMS</span>=<span style="color: #000000;">hello<br/>hello_SOURCES</span>=hello.c</div><p>说明:AUTOMAKE_OPTIONS为设置automake的选项。automake提供了3种软件等级:foreign、gnu、gnits,默认等级是gnu。此处使用的foreign表示只是检测必要的文件。<br />bin_PROGRAMS定义了要产生的执行文件名。如果产生多个可执行文件,每个文件名用空格隔开。<br />file_SOURCES定义file这个执行程序的依赖文件。同样的,对于多个执行文件,那就要定义相应的file_SOURCES。</p><p><strong><span style="color: #ff0000;">8. automake --add-missing</span></strong></p><p>生成Makefiel.in和所需要的脚本,其中add-missing选项会让automake自动添加一些必须的脚本文件。</p><div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;">[root@lzv6 hello]# automake --add-<span style="color: #000000;">missing <br/>configure.</span><span style="color: #0000ff;">in</span>:<span style="color: #800080;">16</span>: installing `./config.guess<span style="color: #800000;">'<br/></span>configure.<span style="color: #0000ff;">in</span>:<span style="color: #800080;">16</span>: installing `./config.sub<span style="color: #800000;">'<br/></span>configure.<span style="color: #0000ff;">in</span>:<span style="color: #800080;">7</span>: installing `./<span style="color: #0000ff;">install</span>-<span style="color: #0000ff;">sh</span><span style="color: #800000;">'<br/></span>configure.<span style="color: #0000ff;">in</span>:<span style="color: #800080;">16</span>: required <span style="color: #0000ff;">file</span> `./ltmain.<span style="color: #0000ff;">sh</span><span style="color: #800000;">'</span><span style="color: #800000;"> not found</span><br/>configure.<span style="color: #0000ff;">in</span>:<span style="color: #800080;">7</span>: installing `./missing<span style="color: #800000;">'<br/></span>Makefile.am: installing `./depcomp<span style="color: #800000;">'</span> <br/>[root@lzv6 hello]# libtoolize --automake --copy --debug --<span style="color: #000000;">force #注意此处步骤!!!<br/>[root@lzv6 hello]# automake </span>--add-<span style="color: #000000;">missing <br/>[root@lzv6 hello]# </span><span style="color: #0000ff;">ls</span><span style="color: #000000;"><br/>aclocal.m4 autom4te.cache ChangeLog config.h.</span><span style="color: #0000ff;">in</span> configure depcomp <span style="color: #0000ff;">install</span>-<span style="color: #0000ff;">sh</span><span style="color: #000000;"> Makefile.am missing README<br/>AUTHORS autoscan.log config.guess config.sub configure.</span><span style="color: #0000ff;">in</span> hello.c ltmain.<span style="color: #0000ff;">sh</span> Makefile.<span style="color: #0000ff;">in</span> NEWS </div><p>说明:第一次运行时报错,此时运行命令libtoolize --automake --copy --debug --force即可解决。</p><p>至此该工程的Makefile就配置完成了。</p><p>&nbsp;</p><p>在以后的使用中进行编译时可以直接运行命令:</p><div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;">[root@lzv6 hello]# ./<span style="color: #000000;">configure<br/>[root@lzv6 hello]# </span><span style="color: #0000ff;">make</span><span style="color: #000000;"> <br/>[root@lzv6 hello]# </span><span style="color: #0000ff;">make</span> <span style="color: #0000ff;">install</span> #默认安装在/usr/local/bin/<br />[root@lzv6 hello]# make dist #打包,会在当前目前下生成hello-0.1.tar.gz</div><p>当你增加代码文件时,其实主需要修改Makefile.am即可,这里就不再详述了。</p><p>这里附上一张整个步骤的流程图:</p><p><img src="http://images.cnitblog.com/blog/601232/201408/221946358789101.png" alt="" width="712" height="617" /></p><p>&nbsp;</p><img src="http://counter.cnblogs.com/blog/rss/3930107" width="1" height="1" alt=""/><br/><p>本文链接:<a href="http://www.cnblogs.com/lizhenghn/p/3930107.html" target="_blank">使用autotools系列工具自动部署源代码编译安装</a>,转载请注明。</p>

高级...
微信扫一扫
关注无线梦工厂
返回主页 手机网推广 加入Timewe 反馈意见 关于我们 加入收藏 点击这里给我发消息加关注加微信好友

触屏版,3G,Wap,手机网站,浏览器,pc版,在线,嵌入式,Wap浏览器,电脑上的Wap浏览器 各主流搜索引擎收录Timewe
(R)2009-2019 Timewe 时维网络科技有限公司 (86)0755-36601136
简体/繁体