﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-xylz,imxylz-随笔分类-技术</title><link>http://www.blogjava.net/xylz/category/42742.html</link><description>关注后端架构、中间件、分布式和并发编程</description><language>zh-cn</language><lastBuildDate>Tue, 16 Jun 2015 02:58:07 GMT</lastBuildDate><pubDate>Tue, 16 Jun 2015 02:58:07 GMT</pubDate><ttl>60</ttl><item><title>世界邦旅行网(北京)招聘Java高级/资深工程师前端工程师/移动开发工程师等_20150616更新</title><link>http://www.blogjava.net/xylz/archive/2013/11/05/406019.html</link><dc:creator>imxylz</dc:creator><author>imxylz</author><pubDate>Tue, 05 Nov 2013 09:01:00 GMT</pubDate><guid>http://www.blogjava.net/xylz/archive/2013/11/05/406019.html</guid><wfw:comment>http://www.blogjava.net/xylz/comments/406019.html</wfw:comment><comments>http://www.blogjava.net/xylz/archive/2013/11/05/406019.html#Feedback</comments><slash:comments>14</slash:comments><wfw:commentRss>http://www.blogjava.net/xylz/comments/commentRss/406019.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xylz/services/trackbacks/406019.html</trackback:ping><description><![CDATA[<ul>
<li>工作地点：北京</li>
<li>世界邦旅行网是一个新型出境自助旅行社区和电子商务开放平台，以提供“个性化行程定制服务，高性价比、高质量境外自助游”为目标。</li>
<li>我们的网站：<a href="http://www.shijiebang.com">http://www.shijiebang.com</a></li>
<li>关于我们：<a href="http://www.shijiebang.com/about/us/">http://www.shijiebang.com/about/us/</a></li>
<li>B轮数亿</li>
<li>招聘职位
<ul>
<li>Java 高级/资深工程师</li>
<li>PHP 工程师</li>
<li>测试工程师</li>
<li>前端工程师</li>
<li>移动开发工程师(Android/iOS)</li>
<li>其它市场、推广、运营、产品、设计等人才</li>
</ul></li>
<li>待遇
<ul>
<li>与互联网公司看齐+期权 （价值几何问自己）</li>
</ul></li>
<li><p>特别说明</p>

<ul>
<li>有github帐号, stackoverflow 有贡献分为佳</li>
<li>不会翻qiang的不建议投递简历</li>
<li>尽管融资有点钱，但依然条件艰苦（创业何其艰）</li>
<li>必须自认为聪明（即使别人认为自己不聪明，要有这份霸气）</li>
<li>对旅游或者旅行有兴趣</li>
<li>一个能够快速自我成长的环境，如果不能建议立即去寻找他处</li>
<li>无意义的技术、工具要求没有</li>
</ul></li>
<li><p>最后的最后</p>

<ul>
<li>简历写各种精通的，建议不用考虑</li>
</ul></li>
<li>联系方式
<ul>
<li>imxylz##gmail.com</li>
</ul></li>
</ul>

<p><img src="http://www.shijiebang.com/tool/beenhere/xylz-blogjava/" width="1" height="1" alt="" /></p>

<p>更新时间： 2015/06/16</p><img src ="http://www.blogjava.net/xylz/aggbug/406019.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xylz/" target="_blank">imxylz</a> 2013-11-05 17:01 <a href="http://www.blogjava.net/xylz/archive/2013/11/05/406019.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java 8 入门/新特性</title><link>http://www.blogjava.net/xylz/archive/2013/10/16/405031.html</link><dc:creator>imxylz</dc:creator><author>imxylz</author><pubDate>Tue, 15 Oct 2013 16:33:00 GMT</pubDate><guid>http://www.blogjava.net/xylz/archive/2013/10/16/405031.html</guid><wfw:comment>http://www.blogjava.net/xylz/comments/405031.html</wfw:comment><comments>http://www.blogjava.net/xylz/archive/2013/10/16/405031.html#Feedback</comments><slash:comments>8</slash:comments><wfw:commentRss>http://www.blogjava.net/xylz/comments/commentRss/405031.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xylz/services/trackbacks/405031.html</trackback:ping><description><![CDATA[<p>2013/09/05 已经发布了<a href="http://openjdk.java.net/projects/jdk8/" >JDK 8</a>的<a href="http://openjdk.java.net/projects/jdk8/milestones#Developer_Preview" >M8 Developer Preview</a>版本。 在<a href="http://openjdk.java.net/projects/jdk8/milestones#Feature_Complete" >M7(2013/06/13)</a><span class="Apple-converted-space">&nbsp;</span>所有新特性已经封版， M8 作为开发者预览版，基本上可用，可用<a href="http://jdk8.java.net/download.html" >Oracle网站下载</a>。 按照<a href="http://openjdk.java.net/projects/jdk8/milestones" >计划</a><a href="http://openjdk.java.net/projects/jdk8/milestones#General_Availability" >GA(General Availability)</a>版本 应该在2014年3月份发布，如果顺利正式版估计和GA版本相同，也就是说在明年3月份就正式使用JDK 8了。</p>
<p>这次JDK 8 一共带来了<a href="http://openjdk.java.net/projects/jdk8/features" >55个新特性</a>，目前所有API应该都已经冻结， 正在进行零bug测试。这次更新的力度比JDK 6/JDK 7都要大，延期了几次，也非常令人期待。 我个人准备花费几个月的学习时间，努力跟上Java 8的发布节奏。当然由于对Java 7不太熟悉，因此同时也学习下Java 7的API。</p>
<p>目前支持JDK 8的IDE有：</p>
<ul>
     <li><a href="https://netbeans.org/downloads/" >Netbeans 7.4</a></li>
     <li><a href="http://www.jetbrains.com/idea/download/" >IDEA 12</a></li>
     <li><a href="http://downloads.efxclipse.org/eclipse-java8/" >非官方的Eclipse</a>, 官方需要到明年Java 8正式发布以后</li>
</ul>
<p>并非所有JDK 8的特性IDE都能支持，因此需要随时更新IDE以便获得更好的开发环境，推荐使用IDEA。</p>
<br />
<h2>Java 8 新特性入门</h2>
<ol>
     <li>时间表</li>
     <li>Lambda</li>
     <li>流式操作 &#8211; Stream API</li>
     <li>接口默认方法 &#8211; Default Method</li>
     <li>日期和时间 &#8211; Date &amp; Time (JSR 310)</li>
     <li>集合扩展 &#8211; Collections API</li>
     <li>并发操作 &#8211; Concurrency API additions</li>
     <li>IO/NIO 扩展 &#8211; IO/NIO API additions</li>
     <li>反射和注解更新 &#8211; Reflection and annotation changes</li>
     <li>Base64</li>
     <li>其它各种更新 &#8211; Other additions</li>
</ol>
<hr />
<h2>Java 7 新特性入门</h2>
<ol>
     <li>字符串在switch中的使用</li>
     <li>try-with-resources 自动释放资源</li>
     <li>泛型实例创建的类型推断</li>
     <li>多异常catch操作</li>
     <li>文件API扩展</li>
     <li>集合API更新</li>
     <li>并发编程API更新</li>
     <li>Unicode 6.0的支持</li>
     <li>JDBC 4.1 支持 RowSet 1.1</li>
</ol>
<p>
[更新时间: 2013/10/16] <br/>
[原文地址：<a target="_blank" href="http://imxylz.com/java/">Java 8 入门/新特性</a>]
</p><img src ="http://www.blogjava.net/xylz/aggbug/405031.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xylz/" target="_blank">imxylz</a> 2013-10-16 00:33 <a href="http://www.blogjava.net/xylz/archive/2013/10/16/405031.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Bash命令路径的缓存</title><link>http://www.blogjava.net/xylz/archive/2013/10/13/path-cache-of-bash-command.html</link><dc:creator>imxylz</dc:creator><author>imxylz</author><pubDate>Sun, 13 Oct 2013 14:16:00 GMT</pubDate><guid>http://www.blogjava.net/xylz/archive/2013/10/13/path-cache-of-bash-command.html</guid><wfw:comment>http://www.blogjava.net/xylz/comments/404935.html</wfw:comment><comments>http://www.blogjava.net/xylz/archive/2013/10/13/path-cache-of-bash-command.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xylz/comments/commentRss/404935.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xylz/services/trackbacks/404935.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: Bash 为了提高命令的解析速度，将解析过的命令的全路径保存在hash表中，因此下次执行的时候就无需进行再次解析。如果在shell中修改了已经缓存过的命令路径，那么bash可能不能立即生效。这样就会发生命令不能解析或者文件不存在的问题，尽管可执行文件确实存在。&nbsp;&nbsp;<a href='http://www.blogjava.net/xylz/archive/2013/10/13/path-cache-of-bash-command.html'>阅读全文</a><img src ="http://www.blogjava.net/xylz/aggbug/404935.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xylz/" target="_blank">imxylz</a> 2013-10-13 22:16 <a href="http://www.blogjava.net/xylz/archive/2013/10/13/path-cache-of-bash-command.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>MAC下批量转换PNG和JPEG</title><link>http://www.blogjava.net/xylz/archive/2013/10/08/404759.html</link><dc:creator>imxylz</dc:creator><author>imxylz</author><pubDate>Tue, 08 Oct 2013 09:17:00 GMT</pubDate><guid>http://www.blogjava.net/xylz/archive/2013/10/08/404759.html</guid><wfw:comment>http://www.blogjava.net/xylz/comments/404759.html</wfw:comment><comments>http://www.blogjava.net/xylz/archive/2013/10/08/404759.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/xylz/comments/commentRss/404759.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xylz/services/trackbacks/404759.html</trackback:ping><description><![CDATA[OS X下有一个sips的程序可以用来处理图片。<br />
sips的名称功能非常强大，参考<a target="_blank" href="https://developer.apple.com/library/mac/documentation/Darwin/Reference/ManPages/man1/sips.1.html">帮助文档</a>。<br />
这里我们只用到其中的一个功能，转换图片格式。<br />
<br />
命令参考：<br />
<div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;sips&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">s&nbsp;format&nbsp;jpeg&nbsp;</span><span style="color: #000000; ">--</span><span style="color: #000000; ">out&nbsp;b.jpg&nbsp;a.png</span></div>
写一个png批量转换jpg的脚本：<br />
<div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000; "><br />
&nbsp;&nbsp;&nbsp;&nbsp;cat&nbsp;&nbsp;</span><span style="color: #000000; ">~/</span><span style="color: #000000; ">bin</span><span style="color: #000000; ">/</span><span style="color: #000000; ">png2jpg<br />
&nbsp;&nbsp;&nbsp;&nbsp;#</span><span style="color: #000000; ">!/</span><span style="color: #000000; ">bin</span><span style="color: #000000; ">/</span><span style="color: #000000; ">bash<br />
&nbsp;&nbsp;&nbsp;&nbsp;#&nbsp;convert&nbsp;png&nbsp;files&nbsp;to&nbsp;jpeg&nbsp;files<br />
&nbsp;&nbsp;&nbsp;&nbsp;#&nbsp;usage:&nbsp;png2jpg&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">file</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><img src="http://www.blogjava.net/Images/dot.gif" alt="" /><br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">for</span><span style="color: #000000; ">&nbsp;f&nbsp;in&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">$@</span><span style="color: #000000; ">"</span><span style="color: #000000; "><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">do</span><span style="color: #000000; "><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sips&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">s&nbsp;format&nbsp;jpeg&nbsp;</span><span style="color: #000000; ">--</span><span style="color: #000000; ">out&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">${f%.*}.jpg</span><span style="color: #000000; ">"</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">$f</span><span style="color: #000000; ">"</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;done<br />
</span></div>
同样写一个jpg批量转换png的脚本：<br />
<div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%; word-break: break-all;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000; "><br />
&nbsp;&nbsp;&nbsp;&nbsp;cat&nbsp;</span><span style="color: #000000; ">~/</span><span style="color: #000000; ">bin</span><span style="color: #000000; ">/</span><span style="color: #000000; ">jpg2png<br />
&nbsp;&nbsp;&nbsp;&nbsp;#</span><span style="color: #000000; ">!/</span><span style="color: #000000; ">bin</span><span style="color: #000000; ">/</span><span style="color: #000000; ">bash<br />
&nbsp;&nbsp;&nbsp;&nbsp;#&nbsp;convert&nbsp;jpeg&nbsp;files&nbsp;to&nbsp;png&nbsp;files<br />
&nbsp;&nbsp;&nbsp;&nbsp;#&nbsp;usage:&nbsp;jpg2png&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">file</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><img src="http://www.blogjava.net/Images/dot.gif" alt="" /><br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">for</span><span style="color: #000000; ">&nbsp;f&nbsp;in&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">$@</span><span style="color: #000000; ">"</span><span style="color: #000000; "><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">do</span><span style="color: #000000; "><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sips&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">s&nbsp;format&nbsp;png&nbsp;</span><span style="color: #000000; ">--</span><span style="color: #000000; ">out&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">${f%.*}.png</span><span style="color: #000000; ">"</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">$f</span><span style="color: #000000; ">"</span><span style="color: #000000; "><br />
&nbsp;&nbsp;&nbsp;&nbsp;done<br />
</span></div>
使用例子：<br />
<div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000; "><br />
&nbsp;&nbsp;&nbsp;&nbsp;➜&nbsp;</span><span style="color: #000000; ">~/</span><span style="color: #000000; ">Downloads&nbsp;$&nbsp;png2jpg&nbsp;QQ20131008</span><span style="color: #000000; ">-*</span><span style="color: #000000; ">.png<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000; ">/</span><span style="color: #000000; ">Users</span><span style="color: #000000; ">/</span><span style="color: #000000; ">adyliu</span><span style="color: #000000; ">/</span><span style="color: #000000; ">Downloads</span><span style="color: #000000; ">/</span><span style="color: #000000; ">QQ20131008</span><span style="color: #000000; ">-</span><span style="color: #000000; ">2</span><span style="color: #000000; ">.png<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000; ">/</span><span style="color: #000000; ">Users</span><span style="color: #000000; ">/</span><span style="color: #000000; ">adyliu</span><span style="color: #000000; ">/</span><span style="color: #000000; ">Downloads</span><span style="color: #000000; ">/</span><span style="color: #000000; ">QQ20131008</span><span style="color: #000000; ">-</span><span style="color: #000000; ">2</span><span style="color: #000000; ">.jpg<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000; ">/</span><span style="color: #000000; ">Users</span><span style="color: #000000; ">/</span><span style="color: #000000; ">adyliu</span><span style="color: #000000; ">/</span><span style="color: #000000; ">Downloads</span><span style="color: #000000; ">/</span><span style="color: #000000; ">QQ20131008</span><span style="color: #000000; ">-</span><span style="color: #000000; ">3</span><span style="color: #000000; ">.png<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000; ">/</span><span style="color: #000000; ">Users</span><span style="color: #000000; ">/</span><span style="color: #000000; ">adyliu</span><span style="color: #000000; ">/</span><span style="color: #000000; ">Downloads</span><span style="color: #000000; ">/</span><span style="color: #000000; ">QQ20131008</span><span style="color: #000000; ">-</span><span style="color: #000000; ">3</span><span style="color: #000000; ">.jpg<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000; ">/</span><span style="color: #000000; ">Users</span><span style="color: #000000; ">/</span><span style="color: #000000; ">adyliu</span><span style="color: #000000; ">/</span><span style="color: #000000; ">Downloads</span><span style="color: #000000; ">/</span><span style="color: #000000; ">QQ20131008</span><span style="color: #000000; ">-</span><span style="color: #000000; ">4</span><span style="color: #000000; ">.png<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000; ">/</span><span style="color: #000000; ">Users</span><span style="color: #000000; ">/</span><span style="color: #000000; ">adyliu</span><span style="color: #000000; ">/</span><span style="color: #000000; ">Downloads</span><span style="color: #000000; ">/</span><span style="color: #000000; ">QQ20131008</span><span style="color: #000000; ">-</span><span style="color: #000000; ">4</span><span style="color: #000000; ">.jpg<br />
&nbsp;&nbsp;&nbsp;&nbsp;➜&nbsp;</span><span style="color: #000000; ">~/</span><span style="color: #000000; ">Downloads&nbsp;$&nbsp;ll&nbsp;QQ</span><span style="color: #000000; ">*</span><span style="color: #000000; "><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">rw</span><span style="color: #000000; ">-</span><span style="color: #000000; ">r</span><span style="color: #000000; ">--</span><span style="color: #000000; ">r</span><span style="color: #000000; ">--</span><span style="color: #000000; ">&nbsp;&nbsp;</span><span style="color: #000000; ">1</span><span style="color: #000000; ">&nbsp;adyliu&nbsp;&nbsp;staff&nbsp;&nbsp;&nbsp;&nbsp;67K&nbsp;</span><span style="color: #000000; ">10</span><span style="color: #000000; ">&nbsp;&nbsp;</span><span style="color: #000000; ">8</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">15</span><span style="color: #000000; ">:</span><span style="color: #000000; ">43</span><span style="color: #000000; ">&nbsp;QQ20131008</span><span style="color: #000000; ">-</span><span style="color: #000000; ">2</span><span style="color: #000000; ">.jpg<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">rw</span><span style="color: #000000; ">-</span><span style="color: #000000; ">r</span><span style="color: #000000; ">--</span><span style="color: #000000; ">r</span><span style="color: #000000; ">--</span><span style="color: #000000; ">@&nbsp;</span><span style="color: #000000; ">1</span><span style="color: #000000; ">&nbsp;adyliu&nbsp;&nbsp;staff&nbsp;&nbsp;&nbsp;&nbsp;88K&nbsp;</span><span style="color: #000000; ">10</span><span style="color: #000000; ">&nbsp;&nbsp;</span><span style="color: #000000; ">8</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">15</span><span style="color: #000000; ">:</span><span style="color: #000000; ">31</span><span style="color: #000000; ">&nbsp;QQ20131008</span><span style="color: #000000; ">-</span><span style="color: #000000; ">2</span><span style="color: #000000; ">.png<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">rw</span><span style="color: #000000; ">-</span><span style="color: #000000; ">r</span><span style="color: #000000; ">--</span><span style="color: #000000; ">r</span><span style="color: #000000; ">--</span><span style="color: #000000; ">&nbsp;&nbsp;</span><span style="color: #000000; ">1</span><span style="color: #000000; ">&nbsp;adyliu&nbsp;&nbsp;staff&nbsp;&nbsp;&nbsp;&nbsp;23K&nbsp;</span><span style="color: #000000; ">10</span><span style="color: #000000; ">&nbsp;&nbsp;</span><span style="color: #000000; ">8</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">15</span><span style="color: #000000; ">:</span><span style="color: #000000; ">43</span><span style="color: #000000; ">&nbsp;QQ20131008</span><span style="color: #000000; ">-</span><span style="color: #000000; ">3</span><span style="color: #000000; ">.jpg<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">rw</span><span style="color: #000000; ">-</span><span style="color: #000000; ">r</span><span style="color: #000000; ">--</span><span style="color: #000000; ">r</span><span style="color: #000000; ">--</span><span style="color: #000000; ">@&nbsp;</span><span style="color: #000000; ">1</span><span style="color: #000000; ">&nbsp;adyliu&nbsp;&nbsp;staff&nbsp;&nbsp;&nbsp;&nbsp;34K&nbsp;</span><span style="color: #000000; ">10</span><span style="color: #000000; ">&nbsp;&nbsp;</span><span style="color: #000000; ">8</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">15</span><span style="color: #000000; ">:</span><span style="color: #000000; ">31</span><span style="color: #000000; ">&nbsp;QQ20131008</span><span style="color: #000000; ">-</span><span style="color: #000000; ">3</span><span style="color: #000000; ">.png<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">rw</span><span style="color: #000000; ">-</span><span style="color: #000000; ">r</span><span style="color: #000000; ">--</span><span style="color: #000000; ">r</span><span style="color: #000000; ">--</span><span style="color: #000000; ">&nbsp;&nbsp;</span><span style="color: #000000; ">1</span><span style="color: #000000; ">&nbsp;adyliu&nbsp;&nbsp;staff&nbsp;&nbsp;&nbsp;&nbsp;47K&nbsp;</span><span style="color: #000000; ">10</span><span style="color: #000000; ">&nbsp;&nbsp;</span><span style="color: #000000; ">8</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">15</span><span style="color: #000000; ">:</span><span style="color: #000000; ">43</span><span style="color: #000000; ">&nbsp;QQ20131008</span><span style="color: #000000; ">-</span><span style="color: #000000; ">4</span><span style="color: #000000; ">.jpg<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">rw</span><span style="color: #000000; ">-</span><span style="color: #000000; ">r</span><span style="color: #000000; ">--</span><span style="color: #000000; ">r</span><span style="color: #000000; ">--</span><span style="color: #000000; ">@&nbsp;</span><span style="color: #000000; ">1</span><span style="color: #000000; ">&nbsp;adyliu&nbsp;&nbsp;staff&nbsp;&nbsp;&nbsp;&nbsp;44K&nbsp;</span><span style="color: #000000; ">10</span><span style="color: #000000; ">&nbsp;&nbsp;</span><span style="color: #000000; ">8</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">15</span><span style="color: #000000; ">:</span><span style="color: #000000; ">31</span><span style="color: #000000; ">&nbsp;QQ20131008</span><span style="color: #000000; ">-</span><span style="color: #000000; ">4</span><span style="color: #000000; ">.png<br />
</span></div>
<br />
参考资料:<br />
<ol>
     <li><a target="_blank" href="https://developer.apple.com/library/mac/documentation/Darwin/Reference/ManPages/man1/sips.1.html">sips doc</a></li>
     <li><a target="_blank" href="http://www.ainotenshi.org/818/resizing-images-using-the-command-line">Resizing images using the command line</a></li>
     <li><a target="_blank" href="http://www.gnu.org/software/bash/manual/html_node/Shell-Parameter-Expansion.html#Shell-Parameter-Expansion">Shell Parameter Expansion</a></li>
     <li><a target="_blank" href="http://stackoverflow.com/questions/965053/extract-filename-and-extension-in-bash">Extract filename and extension in bash</a><br />
     </li>
</ol>
原文地址：<a target="_blank" href="http://imxylz.com/blog/2013/10/08/batch-convert-png-to-jpeg-on-mac-os/">http://imxylz.com/blog/2013/10/08/batch-convert-png-to-jpeg-on-mac-os/</a><img src ="http://www.blogjava.net/xylz/aggbug/404759.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xylz/" target="_blank">imxylz</a> 2013-10-08 17:17 <a href="http://www.blogjava.net/xylz/archive/2013/10/08/404759.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Octopress加速Google字体渲染</title><link>http://www.blogjava.net/xylz/archive/2013/09/22/move-google-fonts-to-local-server.html</link><dc:creator>imxylz</dc:creator><author>imxylz</author><pubDate>Sun, 22 Sep 2013 13:42:00 GMT</pubDate><guid>http://www.blogjava.net/xylz/archive/2013/09/22/move-google-fonts-to-local-server.html</guid><wfw:comment>http://www.blogjava.net/xylz/comments/404298.html</wfw:comment><comments>http://www.blogjava.net/xylz/archive/2013/09/22/move-google-fonts-to-local-server.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xylz/comments/commentRss/404298.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xylz/services/trackbacks/404298.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: Google的web字体在我朝访问巨慢，尤其是HTTPS方式更慢，本文帮助大家解决octopress默认的google web字体访问太慢的问题。&nbsp;&nbsp;<a href='http://www.blogjava.net/xylz/archive/2013/09/22/move-google-fonts-to-local-server.html'>阅读全文</a><img src ="http://www.blogjava.net/xylz/aggbug/404298.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xylz/" target="_blank">imxylz</a> 2013-09-22 21:42 <a href="http://www.blogjava.net/xylz/archive/2013/09/22/move-google-fonts-to-local-server.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JRebel 6.0.0 Crack (20141216更新)</title><link>http://www.blogjava.net/xylz/archive/2013/09/15/404098.html</link><dc:creator>imxylz</dc:creator><author>imxylz</author><pubDate>Sun, 15 Sep 2013 15:24:00 GMT</pubDate><guid>http://www.blogjava.net/xylz/archive/2013/09/15/404098.html</guid><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: JRebel最新版本6.0.0的下载地址及个人学习使用版本。&nbsp;&nbsp;<a href='http://www.blogjava.net/xylz/archive/2013/09/15/404098.html'>阅读全文</a><img src ="http://www.blogjava.net/xylz/aggbug/404098.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xylz/" target="_blank">imxylz</a> 2013-09-15 23:24 <a href="http://www.blogjava.net/xylz/archive/2013/09/15/404098.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>申请SSL证书及Nginx支持HTTPS</title><link>http://www.blogjava.net/xylz/archive/2013/09/11/403965.html</link><dc:creator>imxylz</dc:creator><author>imxylz</author><pubDate>Wed, 11 Sep 2013 13:58:00 GMT</pubDate><guid>http://www.blogjava.net/xylz/archive/2013/09/11/403965.html</guid><wfw:comment>http://www.blogjava.net/xylz/comments/403965.html</wfw:comment><comments>http://www.blogjava.net/xylz/archive/2013/09/11/403965.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xylz/comments/commentRss/403965.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xylz/services/trackbacks/403965.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 本文描述如何申请2.5$每年的SSL证书，并启用Nginx的HTTPS访问。&nbsp;&nbsp;<a href='http://www.blogjava.net/xylz/archive/2013/09/11/403965.html'>阅读全文</a><img src ="http://www.blogjava.net/xylz/aggbug/403965.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xylz/" target="_blank">imxylz</a> 2013-09-11 21:58 <a href="http://www.blogjava.net/xylz/archive/2013/09/11/403965.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>随机选择集合的子元素集合</title><link>http://www.blogjava.net/xylz/archive/2013/08/17/402978.html</link><dc:creator>imxylz</dc:creator><author>imxylz</author><pubDate>Sat, 17 Aug 2013 09:44:00 GMT</pubDate><guid>http://www.blogjava.net/xylz/archive/2013/08/17/402978.html</guid><wfw:comment>http://www.blogjava.net/xylz/comments/402978.html</wfw:comment><comments>http://www.blogjava.net/xylz/archive/2013/08/17/402978.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.blogjava.net/xylz/comments/commentRss/402978.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xylz/services/trackbacks/402978.html</trackback:ping><description><![CDATA[<div>我需要一个从集合N中随机选择M个子元素的算法。 当然最好的办法是将集合打乱顺序，然后从中选择前M个元素即可。 Java中现成的API可以使用：</div>
<div>
<div style="background-color: #eeeeee; font-size: 13px; border-left-color: #cccccc; padding: 4px 5px 4px 4px; width: 98%; word-break: break-all; "><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
-->java.util.Collections.shuffle(List&lt;?&gt;)<br />
</div>
</div>
<div>
<div>此算法非常简单，循环N次，每次长度减少1，随机获取其中一个元素，然后交换其对称元素。</div>
</div>
<div>
<div style="background-color: #eeeeee; font-size: 13px; border-left-color: #cccccc; padding: 4px 5px 4px 4px; width: 98%; word-break: break-all; "><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">static</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;shuffle(List&lt;?&gt;&nbsp;list,&nbsp;Random&nbsp;rnd)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;size&nbsp;=&nbsp;list.size();<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(size&nbsp;&lt;&nbsp;SHUFFLE_THRESHOLD&nbsp;||&nbsp;list&nbsp;<span style="color: #0000FF; ">instanceof</span>&nbsp;RandomAccess)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>&nbsp;(<span style="color: #0000FF; ">int</span>&nbsp;i=size;&nbsp;i&gt;1;&nbsp;i--)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;swap(list,&nbsp;i-1,&nbsp;rnd.nextInt(i));<br />
&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<span style="color: #0000FF; ">else</span>&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Object&nbsp;arr[]&nbsp;=&nbsp;list.toArray();<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;Shuffle&nbsp;array</span><span style="color: #008000; "><br />
</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>&nbsp;(<span style="color: #0000FF; ">int</span>&nbsp;i=size;&nbsp;i&gt;1;&nbsp;i--)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;swap(arr,&nbsp;i-1,&nbsp;rnd.nextInt(i));<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;Dump&nbsp;array&nbsp;back&nbsp;into&nbsp;list</span><span style="color: #008000; "><br />
</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ListIterator&nbsp;it&nbsp;=&nbsp;list.listIterator();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>&nbsp;(<span style="color: #0000FF; ">int</span>&nbsp;i=0;&nbsp;i&lt;arr.length;&nbsp;i++)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;it.next();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;it.set(arr[i]);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
}</div>
</div>
<div><br />
</div>
<div>
<div>有点意思的swap函数</div>
</div>
<div>
<div style="background-color: #eeeeee; font-size: 13px; border-left-color: #cccccc; padding: 4px 5px 4px 4px; width: 98%; word-break: break-all; "><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><br />
<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">static</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;swap(List&lt;?&gt;&nbsp;list,&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;i,&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;j)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">final</span>&nbsp;List&nbsp;l&nbsp;=&nbsp;list;<br />
&nbsp;&nbsp;&nbsp;&nbsp;l.set(i,&nbsp;l.set(j,&nbsp;l.get(i)));<br />
}<br />
</div>
</div>
<div><br />
</div>
<div>
<div>其实我们的需求很简单，在基本不变的集合中，多次重复随机获取其子集，至于子集是否有序或者随机不重要的， 重要的是原集合中的每个元素都有相似的概率出现在子集合中。</div>
<div><br />
</div>
<div>考虑到性能以及并发访问（多线程）的需要，我想到了一个简单的算法：</div>
</div>
<div>给定N个元素集合，从中选择M(0&lt;M&lt;=N)个元素的办法是，</div>
<div>
<ol>
     <li>随机选择索引K(0&lt;=K&lt;N), i=0, 空子集</li>
     <li>取有效元素N(k-i),N(k+i) 加入未满子集M</li>
     <li>i+=1, 重复(2) 直到子集M已满</li>
     <li>终止</li>
</ol>
</div>
<div>
<div>这样取出来的元素虽然和原始集顺序有一定的关系，但是每个元素在子集里出现的概率相当，满足结果要求。 最后生成的算法如下：</div>
</div>
<div>
<div style="background-color: #eeeeee; font-size: 13px; border-left-color: #cccccc; padding: 4px 5px 4px 4px; width: 98%; word-break: break-all; "><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">static</span>&nbsp;&lt;T&gt;&nbsp;List&lt;T&gt;&nbsp;randomList(List&lt;T&gt;&nbsp;views,&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;max)&nbsp;{<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">final</span>&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;size&nbsp;=&nbsp;views.size();<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;index&nbsp;=&nbsp;RandomUtils.nextInt(size);<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//<br />
</span>&nbsp;&nbsp;&nbsp;&nbsp;List&lt;T&gt;&nbsp;ret&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;ArrayList&lt;T&gt;(max);<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;low&nbsp;=&nbsp;index&nbsp;-&nbsp;1,&nbsp;high&nbsp;=&nbsp;index;<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">while</span>&nbsp;(max&nbsp;&gt;&nbsp;0&nbsp;&amp;&amp;&nbsp;(low&nbsp;&gt;=&nbsp;0&nbsp;||&nbsp;high&nbsp;&lt;&nbsp;size))&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(low&nbsp;&gt;=&nbsp;0&nbsp;&amp;&amp;&nbsp;max--&nbsp;&gt;&nbsp;0)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ret.add(views.get(low));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(high&nbsp;&lt;&nbsp;size&nbsp;&amp;&amp;&nbsp;max--&nbsp;&gt;&nbsp;0)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ret.add(views.get(high));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;low--;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;high++;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;ret;<br />
}</div>
</div>
<div><br />
</div>
<div>此算法满足如下特点：</div>
<div>
<ol>
     <li>足够快</li>
     <li>线程安全（原始集合不变）</li>
     <li>子元素出现概率相当（未经数学证明</li>
</ol>
<div><br />
</div>
</div>
<div>另外，stackoverflow上也有一些参考链接：</div>
<div>
<ul>
     <li><a href="http://stackoverflow.com/questions/48087/select-a-random-n-elements-from-listt-in-c-sharp" target="_blank">
     </a></li>
     <li><a href="http://stackoverflow.com/questions/48087/select-a-random-n-elements-from-listt-in-c-sharp" target="_blank">Select a random N elements from List in C#</a></li>
     <a href="http://stackoverflow.com/questions/48087/select-a-random-n-elements-from-listt-in-c-sharp" target="_blank">
     </a>
     <li>http://mcherm.com/permalinks/1/a-random-selection-algorithm</li>
     <li>http://stackoverflow.com/questions/4702036/take-n-random-elements-from-a-liste</li>
</ul>
</div>
<br />
<div>[ 原文地址&nbsp;<a href="http://imxylz.com/blog/2013/08/14/select-a-random-sublist-from-list-in-java/">http://imxylz.com/blog/2013/08/14/select-a-random-sublist-from-list-in-java/</a>&nbsp;]</div><img src ="http://www.blogjava.net/xylz/aggbug/402978.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xylz/" target="_blank">imxylz</a> 2013-08-17 17:44 <a href="http://www.blogjava.net/xylz/archive/2013/08/17/402978.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Python 基础文件操作</title><link>http://www.blogjava.net/xylz/archive/2013/02/24/395677.html</link><dc:creator>imxylz</dc:creator><author>imxylz</author><pubDate>Sun, 24 Feb 2013 12:55:00 GMT</pubDate><guid>http://www.blogjava.net/xylz/archive/2013/02/24/395677.html</guid><wfw:comment>http://www.blogjava.net/xylz/comments/395677.html</wfw:comment><comments>http://www.blogjava.net/xylz/archive/2013/02/24/395677.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xylz/comments/commentRss/395677.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xylz/services/trackbacks/395677.html</trackback:ping><description><![CDATA[<header style="margin: 0px 0px 1.5em; padding: 2em 0px 1em; border: 0px; font-family: 'PT Serif', Georgia, Times, 'Times New Roman', serif; line-height: 27.59375px; font-size: 18px; vertical-align: baseline; position: relative; background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACgAAAABCAYAAACsXeyTAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAFUlEQVQIHWNIS0sr/v//PwMMDzY+ADqMahlW4J91AAAAAElFTkSuQmCC); background-color: #f8f8f8; color: #222222; background-position: 0% 100%; background-repeat: repeat no-repeat;">
<h1>File - 基础文件操作</h1>
<p style="margin: 0px; padding: 0px; border: 0px; font-family: 'PT Sans', 'Helvetica Neue', Arial, sans-serif; font-style: inherit; font-variant: inherit; line-height: inherit; font-size: 0.9em; vertical-align: baseline; color: #aaaaaa; text-transform: uppercase; position: absolute; top: 0px;"><time datetime="2013-02-24T13:04:00+08:00" pubdate="" data-updated="true" style="margin: 0px; padding: 0px; border: 0px; font-family: inherit; font-style: inherit; font-variant: inherit; line-height: inherit; font-size: 17px; vertical-align: baseline;">FEB 24<span style="margin: 0px; padding: 0px; border: 0px; font-family: inherit; font-style: inherit; font-variant: inherit; line-height: inherit; vertical-align: baseline;">TH</span>, 2013</time></p>
</header>
<p style="margin: 0px 0px 1.5em; padding: 0px; border: 0px; font-family: 'PT Serif', Georgia, Times, 'Times New Roman', serif; line-height: 27.59375px; font-size: 18px; vertical-align: baseline; color: #222222; background-color: #f8f8f8;">学习一门语言，我总是喜欢从文件开始。文本文件的读写操作是我比较在意的基本功能。 在这方面，Java语言功能比较强大，用到的设计模式也非常多。只是使用起来太过繁琐。 而Python在这方面表现非常好，简洁不失功能，强大不失性能，通俗不失优雅，值得称赞。</p>
<p style="margin: 0px 0px 1.5em; padding: 0px; border: 0px; font-family: 'PT Serif', Georgia, Times, 'Times New Roman', serif; line-height: 27.59375px; font-size: 18px; vertical-align: baseline; color: #222222; background-color: #f8f8f8;">我们从一个最简单的开始。</p>
<pre style="margin-top: 0px; margin-bottom: 2.1em; padding: 0.8em 1em; border: 1px solid #05232b; font-family: Menlo, Monaco, 'Andale Mono', 'lucida console', 'Courier New', monospace; line-height: 1.45em; font-size: 13px; vertical-align: baseline; -webkit-box-shadow: rgba(0, 0, 0, 0.0588235) 0px 0px 10px; box-shadow: rgba(0, 0, 0, 0.0588235) 0px 0px 10px; background-image: url(http://www.imxylz.com/images/noise.png?1359616458); background-color: #002b36; border-top-left-radius: 0.4em; border-top-right-radius: 0.4em; border-bottom-right-radius: 0.4em; border-bottom-left-radius: 0.4em; color: #93a1a1; overflow: auto; background-position: 0% 0%;"><code style="margin: 0px; padding: 0px; border: 0px; font-family: Menlo, Monaco, 'Andale Mono', 'lucida console', 'Courier New', monospace; font-style: inherit; font-variant: inherit; line-height: inherit; vertical-align: baseline;">with open('/etc/resolv.conf') as f:<br />   print(f.read()) </code></pre>
<p style="margin: 0px 0px 1.5em; padding: 0px; border: 0px; font-family: 'PT Serif', Georgia, Times, 'Times New Roman', serif; line-height: 27.59375px; font-size: 18px; vertical-align: baseline; color: #222222; background-color: #f8f8f8;">这里有用到<a href="http://www.python.org/dev/peps/pep-0343/" style="margin: 0px; padding: 0px; border: 0px; font-family: inherit; font-style: inherit; font-variant: inherit; line-height: inherit; vertical-align: baseline; color: #751590; -webkit-transition: color 0.3s; white-space: pre-wrap; word-wrap: break-word;">with</a>语法来关闭文件句柄。</p>
<h2>open()</h2>
<p style="margin: 0px 0px 1.5em; padding: 0px; border: 0px; font-family: 'PT Serif', Georgia, Times, 'Times New Roman', serif; line-height: 27.59375px; font-size: 18px; vertical-align: baseline; color: #222222; background-color: #f8f8f8;">首先来了解下<a href="http://docs.python.org/3.3/library/functions.html#open" style="margin: 0px; padding: 0px; border: 0px; font-family: inherit; font-style: inherit; font-variant: inherit; line-height: inherit; vertical-align: baseline; color: #751590; -webkit-transition: color 0.3s; white-space: pre-wrap; word-wrap: break-word;">open()</a>内置函数。</p>
<pre style="margin-top: 0px; margin-bottom: 2.1em; padding: 0.8em 1em; border: 1px solid #05232b; font-family: Menlo, Monaco, 'Andale Mono', 'lucida console', 'Courier New', monospace; line-height: 1.45em; font-size: 13px; vertical-align: baseline; -webkit-box-shadow: rgba(0, 0, 0, 0.0588235) 0px 0px 10px; box-shadow: rgba(0, 0, 0, 0.0588235) 0px 0px 10px; background-image: url(http://www.imxylz.com/images/noise.png?1359616458); background-color: #002b36; border-top-left-radius: 0.4em; border-top-right-radius: 0.4em; border-bottom-right-radius: 0.4em; border-bottom-left-radius: 0.4em; color: #93a1a1; overflow: auto; background-position: 0% 0%;"><code style="margin: 0px; padding: 0px; border: 0px; font-family: Menlo, Monaco, 'Andale Mono', 'lucida console', 'Courier New', monospace; font-style: inherit; font-variant: inherit; line-height: inherit; vertical-align: baseline;">open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None)<br />   Open file and return a corresponding file object. If the file cannot be opened, an OSError is raised. </code></pre>
<p style="margin: 0px 0px 1.5em; padding: 0px; border: 0px; font-family: 'PT Serif', Georgia, Times, 'Times New Roman', serif; line-height: 27.59375px; font-size: 18px; vertical-align: baseline; color: #222222; background-color: #f8f8f8;">open()的参数众多，通常需要关注的是mode/encoding/errors/newline等。</p>
<h3>最佳实践</h3>
<pre style="margin-top: 0px; margin-bottom: 2.1em; padding: 0.8em 1em; border: 1px solid #05232b; font-family: Menlo, Monaco, 'Andale Mono', 'lucida console', 'Courier New', monospace; line-height: 1.45em; font-size: 13px; vertical-align: baseline; -webkit-box-shadow: rgba(0, 0, 0, 0.0588235) 0px 0px 10px; box-shadow: rgba(0, 0, 0, 0.0588235) 0px 0px 10px; background-image: url(http://www.imxylz.com/images/noise.png?1359616458); background-color: #002b36; border-top-left-radius: 0.4em; border-top-right-radius: 0.4em; border-bottom-right-radius: 0.4em; border-bottom-left-radius: 0.4em; color: #93a1a1; overflow: auto; background-position: 0% 0%;"><code style="margin: 0px; padding: 0px; border: 0px; font-family: Menlo, Monaco, 'Andale Mono', 'lucida console', 'Courier New', monospace; font-style: inherit; font-variant: inherit; line-height: inherit; vertical-align: baseline;">(1) 读取文件必须传入字符编码encoding <br />(2) 用完的流需要关闭，推荐使用with操作 <br />(3) 换行符尽可能的使用UNIX格式(\n)，尽管python可以智能转换 <br />(4) 如果可以的话尽可能的使用utf-8编码来处理非ascii字符，不要依赖操作系统的编码 </code></pre>
<p style="margin: 0px 0px 1.5em; padding: 0px; border: 0px; font-family: 'PT Serif', Georgia, Times, 'Times New Roman', serif; line-height: 27.59375px; font-size: 18px; vertical-align: baseline; color: #222222; background-color: #f8f8f8;">小贴士</p>
<p style="margin: 0px 0px 1.5em; padding: 0px; border: 0px; font-family: 'PT Serif', Georgia, Times, 'Times New Roman', serif; line-height: 27.59375px; font-size: 18px; vertical-align: baseline; color: #222222; background-color: #f8f8f8;">多个文件同时操作可使用with的语法：</p>
<pre style="margin-top: 0px; margin-bottom: 2.1em; padding: 0.8em 1em; border: 1px solid #05232b; font-family: Menlo, Monaco, 'Andale Mono', 'lucida console', 'Courier New', monospace; line-height: 1.45em; font-size: 13px; vertical-align: baseline; -webkit-box-shadow: rgba(0, 0, 0, 0.0588235) 0px 0px 10px; box-shadow: rgba(0, 0, 0, 0.0588235) 0px 0px 10px; background-image: url(http://www.imxylz.com/images/noise.png?1359616458); background-color: #002b36; border-top-left-radius: 0.4em; border-top-right-radius: 0.4em; border-bottom-right-radius: 0.4em; border-bottom-left-radius: 0.4em; color: #93a1a1; overflow: auto; background-position: 0% 0%;"><code style="margin: 0px; padding: 0px; border: 0px; font-family: Menlo, Monaco, 'Andale Mono', 'lucida console', 'Courier New', monospace; font-style: inherit; font-variant: inherit; line-height: inherit; vertical-align: baseline;">with open('/etc/hosts','r') as f,open('/tmp/hosts','w') as t:<br />   //do something </code></pre>
<p style="margin: 0px 0px 1.5em; padding: 0px; border: 0px; font-family: 'PT Serif', Georgia, Times, 'Times New Roman', serif; line-height: 27.59375px; font-size: 18px; vertical-align: baseline; color: #222222; background-color: #f8f8f8;">或者</p>
<pre style="margin-top: 0px; margin-bottom: 2.1em; padding: 0.8em 1em; border: 1px solid #05232b; font-family: Menlo, Monaco, 'Andale Mono', 'lucida console', 'Courier New', monospace; line-height: 1.45em; font-size: 13px; vertical-align: baseline; -webkit-box-shadow: rgba(0, 0, 0, 0.0588235) 0px 0px 10px; box-shadow: rgba(0, 0, 0, 0.0588235) 0px 0px 10px; background-image: url(http://www.imxylz.com/images/noise.png?1359616458); background-color: #002b36; border-top-left-radius: 0.4em; border-top-right-radius: 0.4em; border-bottom-right-radius: 0.4em; border-bottom-left-radius: 0.4em; color: #93a1a1; overflow: auto; background-position: 0% 0%;"><code style="margin: 0px; padding: 0px; border: 0px; font-family: Menlo, Monaco, 'Andale Mono', 'lucida console', 'Courier New', monospace; font-style: inherit; font-variant: inherit; line-height: inherit; vertical-align: baseline;">with f=open('/etc/hosts'),t=open('/tmp/hosts','w'):<br />   // do something </code></pre>
<h2>file object</h2>
<p style="margin: 0px 0px 1.5em; padding: 0px; border: 0px; font-family: 'PT Serif', Georgia, Times, 'Times New Roman', serif; line-height: 27.59375px; font-size: 18px; vertical-align: baseline; color: #222222; background-color: #f8f8f8;">文件对象描述的是一种&#8220;流&#8221;操作，通常支持read()或者write()方法。 这里的文件对象是一种概念上的&#8220;文件对象&#8221;，除了常见的真是的磁盘文件，还可以是 标准输入输出文件(stdin/stdout/stderr)，内存缓冲区(StringIO,cStringIO)， socket，pipes等。</p>
<p style="margin: 0px 0px 1.5em; padding: 0px; border: 0px; font-family: 'PT Serif', Georgia, Times, 'Times New Roman', serif; line-height: 27.59375px; font-size: 18px; vertical-align: baseline; color: #222222; background-color: #f8f8f8;">这在<a href="http://www.imxylz.com/python/io.html" style="margin: 0px; padding: 0px; border: 0px; font-family: inherit; font-style: inherit; font-variant: inherit; line-height: inherit; vertical-align: baseline; color: #751590; -webkit-transition: color 0.3s; white-space: pre-wrap; word-wrap: break-word;">io</a>模块中有具体的描述。</p>
<p style="margin: 0px 0px 1.5em; padding: 0px; border: 0px; font-family: 'PT Serif', Georgia, Times, 'Times New Roman', serif; line-height: 27.59375px; font-size: 18px; vertical-align: baseline; color: #222222; background-color: #f8f8f8;">文本操作和二进制操作有一些区别。分别介绍。</p>
<h2>Text I/O</h2>
<p style="margin: 0px 0px 1.5em; padding: 0px; border: 0px; font-family: 'PT Serif', Georgia, Times, 'Times New Roman', serif; line-height: 27.59375px; font-size: 18px; vertical-align: baseline; color: #222222; background-color: #f8f8f8;">如果<a href="http://docs.python.org/3.3/library/functions.html#open" style="margin: 0px; padding: 0px; border: 0px; font-family: inherit; font-style: inherit; font-variant: inherit; line-height: inherit; vertical-align: baseline; color: #751590; -webkit-transition: color 0.3s; white-space: pre-wrap; word-wrap: break-word;">mode</a>中包含t（默认），那么返回的流是一个纯文本操作。</p>
<p style="margin: 0px 0px 1.5em; padding: 0px; border: 0px; font-family: 'PT Serif', Georgia, Times, 'Times New Roman', serif; line-height: 27.59375px; font-size: 18px; vertical-align: baseline; color: #222222; background-color: #f8f8f8;">read() 是读取文本的最简单的方法。返回的是字符串形式的结果（和参数encoding有关）。</p>
<pre style="margin-top: 0px; margin-bottom: 2.1em; padding: 0.8em 1em; border: 1px solid #05232b; font-family: Menlo, Monaco, 'Andale Mono', 'lucida console', 'Courier New', monospace; line-height: 1.45em; font-size: 13px; vertical-align: baseline; -webkit-box-shadow: rgba(0, 0, 0, 0.0588235) 0px 0px 10px; box-shadow: rgba(0, 0, 0, 0.0588235) 0px 0px 10px; background-image: url(http://www.imxylz.com/images/noise.png?1359616458); background-color: #002b36; border-top-left-radius: 0.4em; border-top-right-radius: 0.4em; border-bottom-right-radius: 0.4em; border-bottom-left-radius: 0.4em; color: #93a1a1; overflow: auto; background-position: 0% 0%;"><code style="margin: 0px; padding: 0px; border: 0px; font-family: Menlo, Monaco, 'Andale Mono', 'lucida console', 'Courier New', monospace; font-style: inherit; font-variant: inherit; line-height: inherit; vertical-align: baseline;">read(n)<br /> Read and return at most n characters from the stream as a single str. If n is negative or None, reads until EOF. </code></pre>
<p style="margin: 0px 0px 1.5em; padding: 0px; border: 0px; font-family: 'PT Serif', Georgia, Times, 'Times New Roman', serif; line-height: 27.59375px; font-size: 18px; vertical-align: baseline; color: #222222; background-color: #f8f8f8;">在很多安装脚本中有：</p>
<pre style="margin-top: 0px; margin-bottom: 2.1em; padding: 0.8em 1em; border: 1px solid #05232b; font-family: Menlo, Monaco, 'Andale Mono', 'lucida console', 'Courier New', monospace; line-height: 1.45em; font-size: 13px; vertical-align: baseline; -webkit-box-shadow: rgba(0, 0, 0, 0.0588235) 0px 0px 10px; box-shadow: rgba(0, 0, 0, 0.0588235) 0px 0px 10px; background-image: url(http://www.imxylz.com/images/noise.png?1359616458); background-color: #002b36; border-top-left-radius: 0.4em; border-top-right-radius: 0.4em; border-bottom-right-radius: 0.4em; border-bottom-left-radius: 0.4em; color: #93a1a1; overflow: auto; background-position: 0% 0%;"><code style="margin: 0px; padding: 0px; border: 0px; font-family: Menlo, Monaco, 'Andale Mono', 'lucida console', 'Courier New', monospace; font-style: inherit; font-variant: inherit; line-height: inherit; vertical-align: baseline;">readme=open('./README.md').read() </code></pre>
<p style="margin: 0px 0px 1.5em; padding: 0px; border: 0px; font-family: 'PT Serif', Georgia, Times, 'Times New Roman', serif; line-height: 27.59375px; font-size: 18px; vertical-align: baseline; color: #222222; background-color: #f8f8f8;">类似的用法。这在一个快速结束的程序中问题不大。在正式的服务中应该随时关闭文件句柄释放资源。</p>
<p style="margin: 0px 0px 1.5em; padding: 0px; border: 0px; font-family: 'PT Serif', Georgia, Times, 'Times New Roman', serif; line-height: 27.59375px; font-size: 18px; vertical-align: baseline; color: #222222; background-color: #f8f8f8;">小贴士：</p>
<pre style="margin-top: 0px; margin-bottom: 2.1em; padding: 0.8em 1em; border: 1px solid #05232b; font-family: Menlo, Monaco, 'Andale Mono', 'lucida console', 'Courier New', monospace; line-height: 1.45em; font-size: 13px; vertical-align: baseline; -webkit-box-shadow: rgba(0, 0, 0, 0.0588235) 0px 0px 10px; box-shadow: rgba(0, 0, 0, 0.0588235) 0px 0px 10px; background-image: url(http://www.imxylz.com/images/noise.png?1359616458); background-color: #002b36; border-top-left-radius: 0.4em; border-top-right-radius: 0.4em; border-bottom-right-radius: 0.4em; border-bottom-left-radius: 0.4em; color: #93a1a1; overflow: auto; background-position: 0% 0%;"><code style="margin: 0px; padding: 0px; border: 0px; font-family: Menlo, Monaco, 'Andale Mono', 'lucida console', 'Courier New', monospace; font-style: inherit; font-variant: inherit; line-height: inherit; vertical-align: baseline;">如果已经读取到文件末尾，read()则返回空字符串''。 </code></pre>
<p style="margin: 0px 0px 1.5em; padding: 0px; border: 0px; font-family: 'PT Serif', Georgia, Times, 'Times New Roman', serif; line-height: 27.59375px; font-size: 18px; vertical-align: baseline; color: #222222; background-color: #f8f8f8;">如果要读取一行，使用readline()方法。</p>
<pre style="margin-top: 0px; margin-bottom: 2.1em; padding: 0.8em 1em; border: 1px solid #05232b; font-family: Menlo, Monaco, 'Andale Mono', 'lucida console', 'Courier New', monospace; line-height: 1.45em; font-size: 13px; vertical-align: baseline; -webkit-box-shadow: rgba(0, 0, 0, 0.0588235) 0px 0px 10px; box-shadow: rgba(0, 0, 0, 0.0588235) 0px 0px 10px; background-image: url(http://www.imxylz.com/images/noise.png?1359616458); background-color: #002b36; border-top-left-radius: 0.4em; border-top-right-radius: 0.4em; border-bottom-right-radius: 0.4em; border-bottom-left-radius: 0.4em; color: #93a1a1; overflow: auto; background-position: 0% 0%;"><code style="margin: 0px; padding: 0px; border: 0px; font-family: Menlo, Monaco, 'Andale Mono', 'lucida console', 'Courier New', monospace; font-style: inherit; font-variant: inherit; line-height: inherit; vertical-align: baseline;">readline(limit=-1)<br /> Read until newline or EOF and return a single str. If the stream is already at EOF, an empty string is returned. If limit is specified, at most limit characters will be read. </code></pre>
<p style="margin: 0px 0px 1.5em; padding: 0px; border: 0px; font-family: 'PT Serif', Georgia, Times, 'Times New Roman', serif; line-height: 27.59375px; font-size: 18px; vertical-align: baseline; color: #222222; background-color: #f8f8f8;">读取一行意味着和行结束符有关，这个有点复杂。</p>
<p style="margin: 0px 0px 1.5em; padding: 0px; border: 0px; font-family: 'PT Serif', Georgia, Times, 'Times New Roman', serif; line-height: 27.59375px; font-size: 18px; vertical-align: baseline; color: #222222; background-color: #f8f8f8;">读取多行，使用readlines()方法。这将返回一个字符串列表。readlines()也可以限制最多读取多少个字符。</p>
<p style="margin: 0px 0px 1.5em; padding: 0px; border: 0px; font-family: 'PT Serif', Georgia, Times, 'Times New Roman', serif; line-height: 27.59375px; font-size: 18px; vertical-align: baseline; color: #222222; background-color: #f8f8f8;">小贴士：</p>
<pre style="margin-top: 0px; margin-bottom: 2.1em; padding: 0.8em 1em; border: 1px solid #05232b; font-family: Menlo, Monaco, 'Andale Mono', 'lucida console', 'Courier New', monospace; line-height: 1.45em; font-size: 13px; vertical-align: baseline; -webkit-box-shadow: rgba(0, 0, 0, 0.0588235) 0px 0px 10px; box-shadow: rgba(0, 0, 0, 0.0588235) 0px 0px 10px; background-image: url(http://www.imxylz.com/images/noise.png?1359616458); background-color: #002b36; border-top-left-radius: 0.4em; border-top-right-radius: 0.4em; border-bottom-right-radius: 0.4em; border-bottom-left-radius: 0.4em; color: #93a1a1; overflow: auto; background-position: 0% 0%;"><code style="margin: 0px; padding: 0px; border: 0px; font-family: Menlo, Monaco, 'Andale Mono', 'lucida console', 'Courier New', monospace; font-style: inherit; font-variant: inherit; line-height: inherit; vertical-align: baseline;">readline(limit=-1)和readlines(limit=-1)对limit的描述不太一致。 <br />readline(limit=-1)描述的是读取一行，最多不超过limit个字符（不是字节），因此有可能结果不是某一行的结束。 <br />readlines(limit=-1)描述的是读取字符，直到limit个字符所在的行结束。也就是返回的结果一定是某一行的结束(除非EOF)。 <br /><br />例如：<br />&gt;&gt;&gt; open('/tmp/x1','w').write('Python真是一个好同学\n只是限制被割裂成两个版本了\n我支持python3.x')<br /> 40 <br />&gt;&gt;&gt; open('/tmp/x1','r').readline(10)<br /> 'Python真是一个' <br />&gt;&gt;&gt; open('/tmp/x1','r').readlines(10)<br /> ['Python真是一个好同学\n'] </code></pre>
<p style="margin: 0px 0px 1.5em; padding: 0px; border: 0px; font-family: 'PT Serif', Georgia, Times, 'Times New Roman', serif; line-height: 27.59375px; font-size: 18px; vertical-align: baseline; color: #222222; background-color: #f8f8f8;">readlines(limit)是一个难以理解的逻辑。如果可以不要随便传输一个参数。<a href="http://stackoverflow.com/questions/15050607/what-does-io-iobase-readlineshinit-mean-in-python" style="margin: 0px; padding: 0px; border: 0px; font-family: inherit; font-style: inherit; font-variant: inherit; line-height: inherit; vertical-align: baseline; color: #751590; -webkit-transition: color 0.3s; white-space: pre-wrap; word-wrap: break-word;">参考这里</a>。</p>
<hr style="margin-bottom: 0.2em; color: #222222; font-family: 'PT Serif', Georgia, Times, 'Times New Roman', serif; font-size: 18px; line-height: 27.59375px; background-color: #f8f8f8;" />
<p style="margin: 0px 0px 1.5em; padding: 0px; border: 0px; font-family: 'PT Serif', Georgia, Times, 'Times New Roman', serif; line-height: 27.59375px; font-size: 18px; vertical-align: baseline; color: #222222; background-color: #f8f8f8;">写入文本可使用write(s)方法：</p>
<pre style="margin-top: 0px; margin-bottom: 2.1em; padding: 0.8em 1em; border: 1px solid #05232b; font-family: Menlo, Monaco, 'Andale Mono', 'lucida console', 'Courier New', monospace; line-height: 1.45em; font-size: 13px; vertical-align: baseline; -webkit-box-shadow: rgba(0, 0, 0, 0.0588235) 0px 0px 10px; box-shadow: rgba(0, 0, 0, 0.0588235) 0px 0px 10px; background-image: url(http://www.imxylz.com/images/noise.png?1359616458); background-color: #002b36; border-top-left-radius: 0.4em; border-top-right-radius: 0.4em; border-bottom-right-radius: 0.4em; border-bottom-left-radius: 0.4em; color: #93a1a1; overflow: auto; background-position: 0% 0%;"><code style="margin: 0px; padding: 0px; border: 0px; font-family: Menlo, Monaco, 'Andale Mono', 'lucida console', 'Courier New', monospace; font-style: inherit; font-variant: inherit; line-height: inherit; vertical-align: baseline;">write(s) Write the string s to the stream and return the number of characters written. </code></pre>
<p style="margin: 0px 0px 1.5em; padding: 0px; border: 0px; font-family: 'PT Serif', Georgia, Times, 'Times New Roman', serif; line-height: 27.59375px; font-size: 18px; vertical-align: baseline; color: #222222; background-color: #f8f8f8;">写入的是字符串，而不是字节。如果要写入多行字符串，可以使用writelines(lines)方法。</p>
<p style="margin: 0px 0px 1.5em; padding: 0px; border: 0px; font-family: 'PT Serif', Georgia, Times, 'Times New Roman', serif; line-height: 27.59375px; font-size: 18px; vertical-align: baseline; color: #222222; background-color: #f8f8f8;">小贴士：</p>
<pre style="margin-top: 0px; margin-bottom: 2.1em; padding: 0.8em 1em; border: 1px solid #05232b; font-family: Menlo, Monaco, 'Andale Mono', 'lucida console', 'Courier New', monospace; line-height: 1.45em; font-size: 13px; vertical-align: baseline; -webkit-box-shadow: rgba(0, 0, 0, 0.0588235) 0px 0px 10px; box-shadow: rgba(0, 0, 0, 0.0588235) 0px 0px 10px; background-image: url(http://www.imxylz.com/images/noise.png?1359616458); background-color: #002b36; border-top-left-radius: 0.4em; border-top-right-radius: 0.4em; border-bottom-right-radius: 0.4em; border-bottom-left-radius: 0.4em; color: #93a1a1; overflow: auto; background-position: 0% 0%;"><code style="margin: 0px; padding: 0px; border: 0px; font-family: Menlo, Monaco, 'Andale Mono', 'lucida console', 'Courier New', monospace; font-style: inherit; font-variant: inherit; line-height: inherit; vertical-align: baseline;">write(s)和writelines(lines)不会将行结束符写入文件流。因此需要手动写入行结束符。 </code></pre>
<h2>Binary I/O</h2>
<p style="margin: 0px 0px 1.5em; padding: 0px; border: 0px; font-family: 'PT Serif', Georgia, Times, 'Times New Roman', serif; line-height: 27.59375px; font-size: 18px; vertical-align: baseline; color: #222222; background-color: #f8f8f8;">二进制流和文本流类似，只是二进制流没有encoding一说。打开二进制流需要传入参数mode中包含&#8217;b&#8217;。</p>
<p style="margin: 0px 0px 1.5em; padding: 0px; border: 0px; font-family: 'PT Serif', Georgia, Times, 'Times New Roman', serif; line-height: 27.59375px; font-size: 18px; vertical-align: baseline; color: #222222; background-color: #f8f8f8;">例如：</p>
<pre style="margin-top: 0px; margin-bottom: 2.1em; padding: 0.8em 1em; border: 1px solid #05232b; font-family: Menlo, Monaco, 'Andale Mono', 'lucida console', 'Courier New', monospace; line-height: 1.45em; font-size: 13px; vertical-align: baseline; -webkit-box-shadow: rgba(0, 0, 0, 0.0588235) 0px 0px 10px; box-shadow: rgba(0, 0, 0, 0.0588235) 0px 0px 10px; background-image: url(http://www.imxylz.com/images/noise.png?1359616458); background-color: #002b36; border-top-left-radius: 0.4em; border-top-right-radius: 0.4em; border-bottom-right-radius: 0.4em; border-bottom-left-radius: 0.4em; color: #93a1a1; overflow: auto; background-position: 0% 0%;"><code style="margin: 0px; padding: 0px; border: 0px; font-family: Menlo, Monaco, 'Andale Mono', 'lucida console', 'Courier New', monospace; font-style: inherit; font-variant: inherit; line-height: inherit; vertical-align: baseline;">&gt;&gt;&gt; type(open('/etc/hosts','rb').read())<br /> &lt;class 'bytes'&gt; </code></pre>
<p style="margin: 0px 0px 1.5em; padding: 0px; border: 0px; font-family: 'PT Serif', Georgia, Times, 'Times New Roman', serif; line-height: 27.59375px; font-size: 18px; vertical-align: baseline; color: #222222; background-color: #f8f8f8;">对比文本流，二进制流有一些小的差别：</p>
<ul style="margin: 0px 0px 1.5em 40px; padding: 0px; border: 0px; font-family: 'PT Serif', Georgia, Times, 'Times New Roman', serif; line-height: 27.59375px; font-size: 18px; vertical-align: baseline; list-style-position: initial; list-style-image: initial; color: #222222; background-color: #f8f8f8;">
     <li style="margin: 0px; padding: 0px; border: 0px; font-family: inherit; font-style: inherit; font-variant: inherit; line-height: inherit; vertical-align: baseline;">read()返回的值是字节(bytes)</li>
     <li style="margin: 0px; padding: 0px; border: 0px; font-family: inherit; font-style: inherit; font-variant: inherit; line-height: inherit; vertical-align: baseline;">readline()返回的值是字节(bytes)，包括换行符</li>
     <li style="margin: 0px; padding: 0px; border: 0px; font-family: inherit; font-style: inherit; font-variant: inherit; line-height: inherit; vertical-align: baseline;">readlines()返回的值是字节(bytes)列表，包括换行符</li>
     <li style="margin: 0px; padding: 0px; border: 0px; font-family: inherit; font-style: inherit; font-variant: inherit; line-height: inherit; vertical-align: baseline;">write()参数可以是<a href="http://docs.python.org/3.3/library/functions.html#bytes" style="margin: 0px; padding: 0px; border: 0px; font-family: inherit; font-style: inherit; font-variant: inherit; line-height: inherit; vertical-align: baseline; color: #751590; -webkit-transition: color 0.3s; white-space: pre-wrap; word-wrap: break-word;">bytes</a>或者<a href="http://docs.python.org/3.3/library/functions.html#bytearray" style="margin: 0px; padding: 0px; border: 0px; font-family: inherit; font-style: inherit; font-variant: inherit; line-height: inherit; vertical-align: baseline; color: #751590; -webkit-transition: color 0.3s; white-space: pre-wrap; word-wrap: break-word;">bytearray</a></li>
     <li style="margin: 0px; padding: 0px; border: 0px; font-family: inherit; font-style: inherit; font-variant: inherit; line-height: inherit; vertical-align: baseline;">readinto(b)是将内容读取到bytearray b中，返回读取的字节数。</li>
</ul>
<h2>其它文件操作</h2>
<p style="margin: 0px 0px 1.5em; padding: 0px; border: 0px; font-family: 'PT Serif', Georgia, Times, 'Times New Roman', serif; line-height: 27.59375px; font-size: 18px; vertical-align: baseline; color: #222222; background-color: #f8f8f8;">除了read/write方法，文件对象还有一些其它的内置方法：</p>
<ul style="margin: 0px 0px 1.5em 40px; padding: 0px; border: 0px; font-family: 'PT Serif', Georgia, Times, 'Times New Roman', serif; line-height: 27.59375px; font-size: 18px; vertical-align: baseline; list-style-position: initial; list-style-image: initial; color: #222222; background-color: #f8f8f8;">
     <li style="margin: 0px; padding: 0px; border: 0px; font-family: inherit; font-style: inherit; font-variant: inherit; line-height: inherit; vertical-align: baseline;">file.close() 关闭文件</li>
     <li style="margin: 0px; padding: 0px; border: 0px; font-family: inherit; font-style: inherit; font-variant: inherit; line-height: inherit; vertical-align: baseline;">file.fileno() 获取文件描述符（整形值）</li>
     <li style="margin: 0px; padding: 0px; border: 0px; font-family: inherit; font-style: inherit; font-variant: inherit; line-height: inherit; vertical-align: baseline;">file.flush() 对于有缓冲区的写操作，刷新缓冲区</li>
     <li style="margin: 0px; padding: 0px; border: 0px; font-family: inherit; font-style: inherit; font-variant: inherit; line-height: inherit; vertical-align: baseline;">file.tell() 返回当前流的字节位置</li>
     <li style="margin: 0px; padding: 0px; border: 0px; font-family: inherit; font-style: inherit; font-variant: inherit; line-height: inherit; vertical-align: baseline;">file.seek() 移动文件流的当前位置</li>
     <li style="margin: 0px; padding: 0px; border: 0px; font-family: inherit; font-style: inherit; font-variant: inherit; line-height: inherit; vertical-align: baseline;">file.truncate() 截断文件大小</li>
</ul>
<p style="margin: 0px 0px 1.5em; padding: 0px; border: 0px; font-family: 'PT Serif', Georgia, Times, 'Times New Roman', serif; line-height: 27.59375px; font-size: 18px; vertical-align: baseline; color: #222222; background-color: #f8f8f8;">将在<a href="http://www.imxylz.com/python/io.html" style="margin: 0px; padding: 0px; border: 0px; font-family: inherit; font-style: inherit; font-variant: inherit; line-height: inherit; vertical-align: baseline; color: #751590; -webkit-transition: color 0.3s; white-space: pre-wrap; word-wrap: break-word;">I/O</a>介绍更多的知识。</p><img src ="http://www.blogjava.net/xylz/aggbug/395677.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xylz/" target="_blank">imxylz</a> 2013-02-24 20:55 <a href="http://www.blogjava.net/xylz/archive/2013/02/24/395677.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Crack JRebel 5.3.1</title><link>http://www.blogjava.net/xylz/archive/2012/12/26/393498.html</link><dc:creator>imxylz</dc:creator><author>imxylz</author><pubDate>Wed, 26 Dec 2012 04:02:00 GMT</pubDate><guid>http://www.blogjava.net/xylz/archive/2012/12/26/393498.html</guid><wfw:comment>http://www.blogjava.net/xylz/comments/393498.html</wfw:comment><comments>http://www.blogjava.net/xylz/archive/2012/12/26/393498.html#Feedback</comments><slash:comments>31</slash:comments><wfw:commentRss>http://www.blogjava.net/xylz/comments/commentRss/393498.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xylz/services/trackbacks/393498.html</trackback:ping><description><![CDATA[JRebel 在热部署上真是神器，目前支持Windows 32/64、Linux 32/64、Mac OS X等操作系统，这可以从jrebel里面的jni动态链接库可以看出来。<br />
<br />
我一直使用5.1.0版本的jrebel，是social免费版本的。social版本会在启动时连接jrebel服务器（myrebel)获取license，同时会将一些热部署的次数、节约时间、性能等日志提交到远程服务器。<br />
最近中国网络抽风，连接jrebel服务器特别慢，导致每次启动的时候都需要10s以上的时间才能得到服务器的响应（加上自动更新检测）。最为一个技术控，很显然，我不能忍受这种行为。<br />
<br />
只好研究如何破解它。<br />
从4.0开始jrebel的混淆机制做得非常棒，基本上无法进行反编译修改了。好在jrebel比较厚道，一直兼容旧版本的license检测机制，翻出我2008年写的破解工程，顺利解决了5.1.0版本。<br />
然后下载最新的5.1.2（20121217）版本，尝试了下居然没有成功。太囧了。这是一个小版本，为何改动如此大？<br />
<br />
打开debug日志后发现，根本就没有加载jrebel.jar里面的License文件。反编译源码看了下，果然，从5.1.2版本开始不再加载jrebel.jar里面的license文件了，该从用户主目录，jrebel安装目录等获取license文件。这样就没法通过一个jar包分发jrebel了。<br />
将jrebel.lic拷贝到用户主目录的.jrebel目录即可。<br /><blockquote style="margin: 0 0 0 40px; border: none; padding: 0px;"><div><strong style="color: #0000ff;">~ $ ls ~/.jrebel/jrebel.lic&nbsp;</strong></div><div><strong style="color: #0000ff;">/Users/adyliu/.jrebel/jrebel.lic</strong></div></blockquote>
<strong>
<br />来两张截图。<br />
</strong>
<img src="http://www.blogjava.net/images/blogjava_net/xylz/jrebel-1.png" alt="jrebel 5.1.2 crack" style="font-size: xx-large;" height="480" width="780" /><br />
<img src="http://www.blogjava.net/images/blogjava_net/xylz/jrebel-2.png" alt="jrebel 5.1.2 crack" height="566" width="1086" align="middle" /><br />
<br />
<h2>下载地址</h2>
<ul>
     <li>4.0 http://www.blogjava.net/xylz/archive/2011/06/12/352109.html</li>
     <li>5.1.0&nbsp;<a href="/Files/xylz/jrebel.jar.zip">/Files/xylz/jrebel.jar.zip</a></li>
     <li>5.1.2&nbsp;<a href="/Files/xylz/jrebel-5.1.2.zip">/Files/xylz/jrebel-5.1.2.zip</a></li>
     <li>5.2.0&nbsp;<a title="jrebel-5.2.0-crack.zip" href="/Files/xylz/jrebel-5.2.0-crack.zip">jrebel-5.2.0-crack.zip</a></li>
     <li>5.2.2&nbsp;<a title="jrebel-5.2.2-crack.zip" href="/Files/xylz/jrebel-5.2.2-crack.zip">jrebel-5.2.2-crack.zip</a></li>
     <li>5.3.0&nbsp;<a title="jrebel-5.3.0-crack.zip" href="https://dl.dropboxusercontent.com/u/22951342/jrebel/jrebel-5.3.0-crack.zip">jrebel-5.3.0-crack.zip</a></li>
     <li>5.3.1 <a href="https://dl.dropboxusercontent.com/u/22951342/jrebel/jrebel-5.3.1-crack.zip">jrebel-5.3.1-crack.zip</a></li><li><a href="http://www.blogjava.net/xylz/archive/2013/09/15/404098.html">5.3.2 jrebel-5.3.2-crack.zip</a><br /></li>
</ul>
<hr />
<p><strong style="color: #ff0000;">Updated 2013/03/25<br />
</strong>
&nbsp; &nbsp; JRebel更新到5.2.0版本，所以可以放出一个低版本（我一直使用）5.1.2。5.1.3就暂时不去解决了。<br />
<img src="http://www.blogjava.net/images/blogjava_net/xylz/jrebel-5.2.0.png" alt="" height="456" width="859" /><br />
</p>
<hr />
<strong style="color: #ff0000;">Updated 2013/04/17<br />
</strong>&nbsp; &nbsp; JRebel 更新到5.2.2版本，所以可以放出一个低版本5.2.0。<br />
<img src="http://www.blogjava.net/images/blogjava_net/xylz/jrebel-5.2.2-crack.png" alt="" height="514" width="899" border="0" /><br />
<hr />
<strong style="color: #ff0000;">Updated 2013/06/06</strong><strong><br />
</strong>&nbsp; &nbsp; JRebel 更新到5.3.0版本，所以可以放出一个低版本5.2.2。<br />
<img src="http://www.blogjava.net/images/blogjava_net/xylz/QQ20130606-1.png" alt="" longdesc="JRebel 5.3.0 cracker" height="564" width="924" /><br />
<hr />
<strong style="color: #ff0000;">Updated 2013/07/12</strong><strong><br />
</strong>&nbsp; &nbsp; JRebel 更新到5.3.1版本，所以可以放出一个低版本5.3.0。<br /><img src="http://www.blogjava.net/images/blogjava_net/xylz/QQ20130716-2.png" alt="" height="421" width="867" border="0" /><br />
<hr /><strong><span style="color: red;">
</span><span style="color: red;">Updated 2013/09/15</span></strong><br />&nbsp;&nbsp;&nbsp; 最新版本的下载地址在：<a href="http://www.blogjava.net/xylz/archive/2013/09/15/404098.html">http://www.blogjava.net/xylz/archive/2013/09/15/404098.html</a><br /><br />PS:<br />
&nbsp; &nbsp; &nbsp;吐槽下，JRebel支持的功能越来越多，导致本身越来越大了，版本5.x已经快9M了！！！
<p>&nbsp;</p>
<p>
关键词： JRebel 5.3.1 crack, JRebel 5.3.0 crack, JRebel 5.2.2 crack, JRebel 5.2.0 crack, JRebel 5.1.2 crack,JRebel 5.1.0 crack, JRebel 5.x crack
</p><img src ="http://www.blogjava.net/xylz/aggbug/393498.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xylz/" target="_blank">imxylz</a> 2012-12-26 12:02 <a href="http://www.blogjava.net/xylz/archive/2012/12/26/393498.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>SQLite3 C语言API入门</title><link>http://www.blogjava.net/xylz/archive/2012/09/25/388519.html</link><dc:creator>imxylz</dc:creator><author>imxylz</author><pubDate>Tue, 25 Sep 2012 08:34:00 GMT</pubDate><guid>http://www.blogjava.net/xylz/archive/2012/09/25/388519.html</guid><wfw:comment>http://www.blogjava.net/xylz/comments/388519.html</wfw:comment><comments>http://www.blogjava.net/xylz/archive/2012/09/25/388519.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xylz/comments/commentRss/388519.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xylz/services/trackbacks/388519.html</trackback:ping><description><![CDATA[<h1>SQLite3 C语言API入门</h1>
<h2>下载SQLite3</h2>
<p style="margin-top: 0px; margin-bottom: 0px; font-family: Arial, Helvetica, sans-serif; font-size: 15px; line-height: 19.5px; background-color: #ffffff; ">我们下载sqlite<a href="http://www.sqlite.org/sqlite-amalgamation-3071400.zip" rel="nofollow" style="text-decoration: none; ">源码包</a>，只需要其中的sqlite3.c、sqlite.h即可。</p>
<div style="margin-top: 1.33em; font-family: Arial, Helvetica, sans-serif; font-size: 15px; line-height: 19.5px; background-color: #ffffff; "></div>
<h2>最简单的一个创建表操作</h2>
<div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
-->#include&nbsp;&lt;stdio.h&gt;<br />
#include&nbsp;"sqlite3.h"<br />
<br />
<span style="color: #0000FF; ">int</span>&nbsp;main(<span style="color: #0000FF; ">int</span>&nbsp;argc,<span style="color: #0000FF; ">char</span>&nbsp;*argv[]){<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">const</span>&nbsp;<span style="color: #0000FF; ">char</span>&nbsp;*sql_create_table="create&nbsp;table&nbsp;t(id&nbsp;int&nbsp;primary&nbsp;key,msg&nbsp;varchar(128))";<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">char</span>&nbsp;*errmsg&nbsp;=&nbsp;0;<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;ret&nbsp;=&nbsp;0;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;sqlite3&nbsp;*db&nbsp;=&nbsp;0;<br />
&nbsp;&nbsp;&nbsp;&nbsp;ret&nbsp;=&nbsp;sqlite3_open("./sqlite3-demo.db",&amp;db);<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>(ret&nbsp;!=&nbsp;SQLITE_OK){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fprintf(stderr,"Cannot&nbsp;open&nbsp;db:&nbsp;%s\n",sqlite3_errmsg(db));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;1;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;printf("Open&nbsp;database\n");<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;ret&nbsp;=&nbsp;sqlite3_exec(db,sql_create_table,NULL,NULL,&amp;errmsg);<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>(ret&nbsp;!=&nbsp;SQLITE_OK){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fprintf(stderr,"create&nbsp;table&nbsp;fail:&nbsp;%s\n",errmsg);<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;sqlite3_free(errmsg);<br />
&nbsp;&nbsp;&nbsp;&nbsp;sqlite3_close(db);<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;printf("Close&nbsp;database\n");<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;0;<br />
}</div>
<p style="margin-top: 1.33em; margin-bottom: 0px; font-family: Arial, Helvetica, sans-serif; font-size: 15px; line-height: 19.5px; background-color: #ffffff; "><br />
<br />
在这个操作中我们执行了如下操作：</p>
<dl style="margin-top: 0px; margin-bottom: 0px; font-family: Arial, Helvetica, sans-serif; font-size: 15px; line-height: 19.5px; background-color: #ffffff; "><dd>
<ul style="margin-top: 0px; margin-bottom: 0px; border-left-width: 5px; border-left-style: solid; border-left-color: #dddddd; ">
     <li>打开数据库</li>
     <li>执行SQL语句</li>
     <li>关闭数据库</li>
</ul>
</dd></dl>
<p style="margin-top: 1.33em; margin-bottom: 0px; font-family: Arial, Helvetica, sans-serif; font-size: 15px; line-height: 19.5px; background-color: #ffffff; ">当然这中间会有一些状态的判断以及内存指针的释放等。</p>
<p style="margin-top: 1.33em; margin-bottom: 0px; font-family: Arial, Helvetica, sans-serif; font-size: 15px; line-height: 19.5px; background-color: #ffffff; ">打开数据库的API如下：<br />
</p>
<div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000FF; ">int</span>&nbsp;sqlite3_open(<br />
&nbsp;&nbsp;<span style="color: #0000FF; ">const</span>&nbsp;<span style="color: #0000FF; ">char</span>&nbsp;*filename,&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">/*</span><span style="color: #008000; ">&nbsp;Database&nbsp;filename&nbsp;(UTF-8)&nbsp;</span><span style="color: #008000; ">*/</span><br />
&nbsp;&nbsp;sqlite3&nbsp;**ppDb&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">/*</span><span style="color: #008000; ">&nbsp;OUT:&nbsp;SQLite&nbsp;db&nbsp;handle&nbsp;</span><span style="color: #008000; ">*/</span><br />
);</div>
这里会引入一个非常复杂的sqlite3的数据结构。这个根据需要以后酌情了解些。
<p>&nbsp;</p>
<p style="margin-top: 1.33em; margin-bottom: 0px; font-family: Arial, Helvetica, sans-serif; font-size: 15px; line-height: 19.5px; background-color: #ffffff; ">打开数据库除了这种形式意外，还有sqlite3_open、sqlite3_open16、sqlite3_open_v2几种形式，基本上类似。</p>
<p style="margin-top: 1.33em; margin-bottom: 0px; font-family: Arial, Helvetica, sans-serif; font-size: 15px; line-height: 19.5px; background-color: #ffffff; ">大部分sql操作都可以通过sqlite3_exec来完成，它的API形式如下：<br />
</p>
<div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000FF; ">int</span>&nbsp;sqlite3_exec(<br />
&nbsp;&nbsp;sqlite3*,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">/*</span><span style="color: #008000; ">&nbsp;An&nbsp;open&nbsp;database&nbsp;</span><span style="color: #008000; ">*/</span><br />
&nbsp;&nbsp;<span style="color: #0000FF; ">const</span>&nbsp;<span style="color: #0000FF; ">char</span>&nbsp;*sql,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">/*</span><span style="color: #008000; ">&nbsp;SQL&nbsp;to&nbsp;be&nbsp;evaluated&nbsp;</span><span style="color: #008000; ">*/</span><br />
&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;(*callback)(<span style="color: #0000FF; ">void</span>*,<span style="color: #0000FF; ">int</span>,<span style="color: #0000FF; ">char</span>**,<span style="color: #0000FF; ">char</span>**),&nbsp;&nbsp;<span style="color: #008000; ">/*</span><span style="color: #008000; ">&nbsp;Callback&nbsp;function&nbsp;</span><span style="color: #008000; ">*/</span><br />
&nbsp;&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;*,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">/*</span><span style="color: #008000; ">&nbsp;1st&nbsp;argument&nbsp;to&nbsp;callback&nbsp;</span><span style="color: #008000; ">*/</span><br />
&nbsp;&nbsp;<span style="color: #0000FF; ">char</span>&nbsp;**errmsg&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">/*</span><span style="color: #008000; ">&nbsp;Error&nbsp;msg&nbsp;written&nbsp;here&nbsp;</span><span style="color: #008000; ">*/</span><br />
);</div>
<p>&nbsp;</p>
<p style="margin-top: 0px; margin-bottom: 0px; font-family: Arial, Helvetica, sans-serif; font-size: 15px; line-height: 19.5px; background-color: #ffffff; ">各个参数的意义为：</p>
<dl style="margin-top: 0px; margin-bottom: 0px; font-family: Arial, Helvetica, sans-serif; font-size: 15px; line-height: 19.5px; background-color: #ffffff; "><dd>
<ul style="margin-top: 0px; margin-bottom: 0px; border-left-width: 5px; border-left-style: solid; border-left-color: #dddddd; ">
     <li>sqlite3描述的是数据库句柄</li>
     <li>sql 要执行的SQL语句</li>
     <li>callback回调函数</li>
     <li>void *回调函数的第一个参数</li>
     <li>errmsg错误信息，如果没有SQL问题则值为NULL</li>
</ul>
</dd></dl>
<p style="margin-top: 1.33em; margin-bottom: 0px; font-family: Arial, Helvetica, sans-serif; font-size: 15px; line-height: 19.5px; background-color: #ffffff; ">回调函数式一个比较复杂的函数。它的原型是这样的:<br />
</p>
<div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000FF; ">int</span>&nbsp;callback(<span style="color: #0000FF; ">void</span>&nbsp;*<span style="color: #0000FF; ">params</span>,<span style="color: #0000FF; ">int</span>&nbsp;column_size,<span style="color: #0000FF; ">char</span>&nbsp;**column_value,<span style="color: #0000FF; ">char</span>&nbsp;**column_name){</div>
<p>&nbsp;</p>
<p style="margin-top: 0px; margin-bottom: 0px; font-family: Arial, Helvetica, sans-serif; font-size: 15px; line-height: 19.5px; background-color: #ffffff; ">每一个参数意义如下：</p>
<dl style="margin-top: 0px; margin-bottom: 0px; font-family: Arial, Helvetica, sans-serif; font-size: 15px; line-height: 19.5px; background-color: #ffffff; "><dd>
<ul style="margin-top: 0px; margin-bottom: 0px; border-left-width: 5px; border-left-style: solid; border-left-color: #dddddd; ">
     <li>params是sqlite3_exec传入的第四个参数</li>
     <li>column_size是结果字段的个数</li>
     <li>column_value是返回记录的一位字符数组指针</li>
     <li>column_name是结果字段的名称</li>
</ul>
</dd></dl>
<p style="margin-top: 0px; margin-bottom: 0px; font-family: Arial, Helvetica, sans-serif; font-size: 15px; line-height: 19.5px; background-color: #ffffff; ">通常情况下callback在select操作中会使用到，尤其是处理每一行记录数。返回的结果每一行记录都会调用下&#8220;回调函数&#8221;。 如果回调函数返回了非0，那么sqlite3_exec将返回SQLITE_ABORT，并且之后的回调函数也不会执行，同时未执行的子查询也不会继续执行。</p>
<p style="margin-top: 1.33em; margin-bottom: 0px; font-family: Arial, Helvetica, sans-serif; font-size: 15px; line-height: 19.5px; background-color: #ffffff; ">对于更新、删除、插入等不需要回调函数的操作，sqlite3_exec的第三、第四个参数可以传入0或者NULL。</p>
<p style="margin-top: 1.33em; margin-bottom: 0px; font-family: Arial, Helvetica, sans-serif; font-size: 15px; line-height: 19.5px; background-color: #ffffff; ">通常情况下sqlite3_exec返回SQLITE_OK=0的结果，非0结果可以通过errmsg来获取对应的错误描述。</p>
<p style="margin-top: 1.33em; margin-bottom: 0px; font-family: Arial, Helvetica, sans-serif; font-size: 15px; line-height: 19.5px; background-color: #ffffff; ">Windows下编译：</p>
<pre style="font-size: 0.9em; font-family: 'Lucida Console', 'Andale Mono', 'Courier New', Courier, monospace; line-height: 1.2em; margin: 2px; border: 1px dashed; background-color: #f9f9f9; overflow: auto; border-top-left-radius: 5px; border-top-right-radius: 5px; border-bottom-right-radius: 5px; border-bottom-left-radius: 5px; padding: 5px; ">D:\home\dev\c&gt;cl /nologo /TC sqlite3-demo.c sqlite3.c </pre>
<p style="margin-top: 0px; margin-bottom: 0px; font-family: Arial, Helvetica, sans-serif; font-size: 15px; line-height: 19.5px; background-color: #ffffff; ">GCC下编译:</p>
<pre style="font-size: 0.9em; font-family: 'Lucida Console', 'Andale Mono', 'Courier New', Courier, monospace; line-height: 1.2em; margin: 2px; border: 1px dashed; background-color: #f9f9f9; overflow: auto; border-top-left-radius: 5px; border-top-right-radius: 5px; border-bottom-right-radius: 5px; border-bottom-left-radius: 5px; padding: 5px; ">$ gcc -o sqlite3-demo.bin sqlite3-demo.c sqlite3.c </pre>
<div style="margin-top: 1.33em; font-family: Arial, Helvetica, sans-serif; font-size: 15px; line-height: 19.5px; background-color: #ffffff; "></div>
<h2>删除表操作</h2>
<p style="margin-top: 0px; margin-bottom: 0px; font-family: Arial, Helvetica, sans-serif; font-size: 15px; line-height: 19.5px; background-color: #ffffff; ">为了防止垃圾数据，我们在加载数据库的时候删除表操作。</p>
<p style="margin-top: 1.33em; margin-bottom: 0px; font-family: Arial, Helvetica, sans-serif; font-size: 15px; line-height: 19.5px; background-color: #ffffff; ">简单的删除操作可以直接使用sqlite3_exec即可。这里不需要回调函数以及回调函数的参数。 当然需要可以关注sqlite3_exec返回的结果是否为SQLITE_OK的值。<br />
</p>
<div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
-->&nbsp; &nbsp;&nbsp;<span style="color: #0000FF; ">const</span>&nbsp;<span style="color: #0000FF; ">char</span>&nbsp;*sql_drop_table="drop&nbsp;table&nbsp;if&nbsp;exists&nbsp;t";<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">const</span>&nbsp;<span style="color: #0000FF; ">char</span>&nbsp;*sql_create_table="create&nbsp;table&nbsp;t(id&nbsp;int&nbsp;primary&nbsp;key,msg&nbsp;varchar(128))";<br />
<img src="http://www.blogjava.net/Images/dot.gif" alt="" /><img src="http://www.blogjava.net/Images/dot.gif" alt="" /><br />
&nbsp;&nbsp;&nbsp;&nbsp;sqlite3_exec(db,sql_drop_table,0,0,&amp;errmsg);<br />
&nbsp;&nbsp;&nbsp;&nbsp;sqlite3_exec(db,sql_create_table,0,0,&amp;errmsg);</div>
<p>&nbsp;</p>
<h2>插入数据</h2>
<p style="margin-top: 0px; margin-bottom: 0px; font-family: Arial, Helvetica, sans-serif; font-size: 15px; line-height: 19.5px; background-color: #ffffff; ">插入第一条数据<br />
</p>
<div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
-->&nbsp; &nbsp; ret&nbsp;=&nbsp;sqlite3_exec(db,"insert&nbsp;into&nbsp;t(id,msg)&nbsp;values(1,'Ady&nbsp;Liu')",NULL,NULL,&amp;errmsg);<br />
&nbsp;&nbsp;&nbsp;&nbsp;printf("Insert&nbsp;a&nbsp;record&nbsp;%s\n",ret&nbsp;==&nbsp;SQLITE_OK&nbsp;?&nbsp;"OK":"FAIL");</div>
<p>&nbsp;</p>
<p style="margin-top: 0px; margin-bottom: 0px; font-family: Arial, Helvetica, sans-serif; font-size: 15px; line-height: 19.5px; background-color: #ffffff; ">返回值ret为SQLITE_OK即操作成功。</p>
<div style="margin-top: 1.33em; font-family: Arial, Helvetica, sans-serif; font-size: 15px; line-height: 19.5px; background-color: #ffffff; "></div>
<h2>插入多条数据，并删除数据</h2>
<p style="margin-top: 0px; margin-bottom: 0px; font-family: Arial, Helvetica, sans-serif; font-size: 15px; line-height: 19.5px; background-color: #ffffff; "></p>
<div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
-->&nbsp; &nbsp; ret&nbsp;=&nbsp;sqlite3_exec(db,"insert&nbsp;into&nbsp;t(id,msg)&nbsp;values(1,'Ady&nbsp;Liu')",NULL,NULL,&amp;errmsg);<br />
&nbsp;&nbsp;&nbsp;&nbsp;printf("Insert&nbsp;a&nbsp;record&nbsp;%s\n",ret&nbsp;==&nbsp;SQLITE_OK&nbsp;?&nbsp;"OK":"FAIL");<br />
&nbsp;&nbsp;&nbsp;&nbsp;ret&nbsp;=&nbsp;sqlite3_exec(db,"insert&nbsp;into&nbsp;t(id,msg)&nbsp;values(2,'IMXYLZ')",NULL,NULL,&amp;errmsg);<br />
&nbsp;&nbsp;&nbsp;&nbsp;printf("Insert&nbsp;a&nbsp;record&nbsp;%s\n",ret&nbsp;==&nbsp;SQLITE_OK&nbsp;?&nbsp;"OK":"FAIL");<br />
&nbsp;&nbsp;&nbsp;&nbsp;ret&nbsp;=&nbsp;sqlite3_exec(db,"delete&nbsp;from&nbsp;t&nbsp;where&nbsp;id&nbsp;&lt;&nbsp;3",NULL,NULL,&amp;errmsg);<br />
&nbsp;&nbsp;&nbsp;&nbsp;printf("Delete&nbsp;records:&nbsp;%s\n",ret&nbsp;==&nbsp;SQLITE_OK&nbsp;?&nbsp;"OK":"FAIL");</div>
插入多条数据，简单的使用sqlite3_exec进行SQL执行即可。当然这里是完整的SQL字符串。
<p>&nbsp;</p>
<h2>预编译操作</h2>
<div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->&nbsp; &nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;i&nbsp;=&nbsp;0;<br />&nbsp;&nbsp;&nbsp;&nbsp;sqlite3_stmt&nbsp;*stmt;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">char</span>&nbsp;ca[255];<br /><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">prepare&nbsp;statement</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;sqlite3_prepare_v2(db,"insert&nbsp;into&nbsp;t(id,msg)&nbsp;values(?,?)",-1,&amp;stmt,0);<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>(i=10;i&lt;20;i++){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sprintf(ca,"HELLO#%i",i);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sqlite3_bind_int(stmt,1,i);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sqlite3_bind_text(stmt,2,ca,strlen(ca),NULL);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sqlite3_step(stmt);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sqlite3_reset(stmt);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;sqlite3_finalize(stmt);</div><span>预编译操作比较麻烦的，完整的预编译操作的流程是：</span>
<ol>
<li>通过sqlite3_prepare_v2()创建一个sqlite3_stmt对象</li>
<li>通过sqlite3_bind_*()绑定预编译字段的值</li>
<li>通过sqlite3_step()执行SQL语句</li>
<li>通过sqlite3_reset()重置预编译语句，重复操作2多次</li>
<li>通过sqlite3_finalize()销毁资源</li>
</ol>
<p>sqlite3_prepare_v2()有个多种类似的形式，完整的API语法是：<br />
</p>
<div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000FF; ">int</span>&nbsp;sqlite3_prepare(<br />
&nbsp;&nbsp;sqlite3&nbsp;*db,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">/*</span><span style="color: #008000; ">&nbsp;Database&nbsp;handle&nbsp;</span><span style="color: #008000; ">*/</span><br />
&nbsp;&nbsp;<span style="color: #0000FF; ">const</span>&nbsp;<span style="color: #0000FF; ">char</span>&nbsp;*zSql,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">/*</span><span style="color: #008000; ">&nbsp;SQL&nbsp;statement,&nbsp;UTF-8&nbsp;encoded&nbsp;</span><span style="color: #008000; ">*/</span><br />
&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;nByte,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">/*</span><span style="color: #008000; ">&nbsp;Maximum&nbsp;length&nbsp;of&nbsp;zSql&nbsp;in&nbsp;bytes.&nbsp;</span><span style="color: #008000; ">*/</span><br />
&nbsp;&nbsp;sqlite3_stmt&nbsp;**ppStmt,&nbsp;&nbsp;<span style="color: #008000; ">/*</span><span style="color: #008000; ">&nbsp;OUT:&nbsp;Statement&nbsp;handle&nbsp;</span><span style="color: #008000; ">*/</span><br />
&nbsp;&nbsp;<span style="color: #0000FF; ">const</span>&nbsp;<span style="color: #0000FF; ">char</span>&nbsp;**pzTail&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">/*</span><span style="color: #008000; ">&nbsp;OUT:&nbsp;Pointer&nbsp;to&nbsp;unused&nbsp;portion&nbsp;of&nbsp;zSql&nbsp;</span><span style="color: #008000; ">*/</span><br />
);</div>
<p>&nbsp;</p>
<p style="margin-top: 0px; margin-bottom: 0px; font-family: Arial, Helvetica, sans-serif; font-size: 15px; line-height: 19.5px; background-color: #ffffff; ">各个参数的定义为：</p>
<dl style="margin-top: 0px; margin-bottom: 0px; font-family: Arial, Helvetica, sans-serif; font-size: 15px; line-height: 19.5px; background-color: #ffffff; "><dd>
<ul style="margin-top: 0px; margin-bottom: 0px; border-left-width: 5px; border-left-style: solid; border-left-color: #dddddd; ">
     <li>db为sqlite3的句柄</li>
     <li>zSql为要执行的SQL语句</li>
     <li>nByte为要执行语句在zSql中的最大长度，如果是负数，那么就需要重新自动计算</li>
     <li>ppStmt为预编译后的句柄</li>
     <li>pzTail预编译后剩下的字符串（未预编译成功或者多余的）的指针，通常没什么用，传入0或者NULL即可。</li>
</ul>
</dd></dl>
<p style="margin-top: 1.33em; margin-bottom: 0px; font-family: Arial, Helvetica, sans-serif; font-size: 15px; line-height: 19.5px; background-color: #ffffff; "><br />
绑定参数sqlite3_bind_*有多种形式，分别对应不同的数据类型:<br />
</p>
<div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000FF; ">int</span>&nbsp;sqlite3_bind_blob(sqlite3_stmt*,&nbsp;<span style="color: #0000FF; ">int</span>,&nbsp;<span style="color: #0000FF; ">const</span>&nbsp;<span style="color: #0000FF; ">void</span>*,&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;n,&nbsp;<span style="color: #0000FF; ">void</span>(*)(<span style="color: #0000FF; ">void</span>*));<br />
<span style="color: #0000FF; ">int</span>&nbsp;sqlite3_bind_double(sqlite3_stmt*,&nbsp;<span style="color: #0000FF; ">int</span>,&nbsp;<span style="color: #0000FF; ">double</span>);<br />
<span style="color: #0000FF; ">int</span>&nbsp;sqlite3_bind_int(sqlite3_stmt*,&nbsp;<span style="color: #0000FF; ">int</span>,&nbsp;<span style="color: #0000FF; ">int</span>);<br />
<span style="color: #0000FF; ">int</span>&nbsp;sqlite3_bind_int64(sqlite3_stmt*,&nbsp;<span style="color: #0000FF; ">int</span>,&nbsp;sqlite3_int64);<br />
<span style="color: #0000FF; ">int</span>&nbsp;sqlite3_bind_null(sqlite3_stmt*,&nbsp;<span style="color: #0000FF; ">int</span>);<br />
<span style="color: #0000FF; ">int</span>&nbsp;sqlite3_bind_text(sqlite3_stmt*,&nbsp;<span style="color: #0000FF; ">int</span>,&nbsp;<span style="color: #0000FF; ">const</span>&nbsp;<span style="color: #0000FF; ">char</span>*,&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;n,&nbsp;<span style="color: #0000FF; ">void</span>(*)(<span style="color: #0000FF; ">void</span>*));<br />
<span style="color: #0000FF; ">int</span>&nbsp;sqlite3_bind_text16(sqlite3_stmt*,&nbsp;<span style="color: #0000FF; ">int</span>,&nbsp;<span style="color: #0000FF; ">const</span>&nbsp;<span style="color: #0000FF; ">void</span>*,&nbsp;<span style="color: #0000FF; ">int</span>,&nbsp;<span style="color: #0000FF; ">void</span>(*)(<span style="color: #0000FF; ">void</span>*));<br />
<span style="color: #0000FF; ">int</span>&nbsp;sqlite3_bind_value(sqlite3_stmt*,&nbsp;<span style="color: #0000FF; ">int</span>,&nbsp;<span style="color: #0000FF; ">const</span>&nbsp;sqlite3_value*);<br />
<span style="color: #0000FF; ">int</span>&nbsp;sqlite3_bind_zeroblob(sqlite3_stmt*,&nbsp;<span style="color: #0000FF; ">int</span>,&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;n);</div>
<p>&nbsp;</p>
<p style="margin-top: 0px; margin-bottom: 0px; font-family: Arial, Helvetica, sans-serif; font-size: 15px; line-height: 19.5px; background-color: #ffffff; "><br />
预编译SQL语句中可以包含如下几种形式：</p>
<dl style="margin-top: 0px; margin-bottom: 0px; font-family: Arial, Helvetica, sans-serif; font-size: 15px; line-height: 19.5px; background-color: #ffffff; "><dd>
<ul style="margin-top: 0px; margin-bottom: 0px; border-left-width: 5px; border-left-style: solid; border-left-color: #dddddd; ">
     <li>?</li>
     <li>?NNN</li>
     <li>:VVV</li>
     <li>@VVV</li>
     <li>$VVV</li>
</ul>
</dd></dl>
<p style="margin-top: 0px; margin-bottom: 0px; font-family: Arial, Helvetica, sans-serif; font-size: 15px; line-height: 19.5px; background-color: #ffffff; ">NNN代表数字，VVV代表字符串。</p>
<p style="margin-top: 1.33em; margin-bottom: 0px; font-family: Arial, Helvetica, sans-serif; font-size: 15px; line-height: 19.5px; background-color: #ffffff; ">如果是?或者?NNN，那么可以直接sqlite3_bind_*()进行操作，如果是字符串，还需要通过sqlite3_bind_parameter_index()获取对应的index，然后再调用sqlite3_bind_*()操作。这通常用于构造不定条件的SQL语句（动态SQL语句）。</p>
<div style="margin-top: 1.33em; font-family: Arial, Helvetica, sans-serif; font-size: 15px; line-height: 19.5px; background-color: #ffffff; "></div>
<h2>查询操作</h2>
<p style="margin-top: 0px; margin-bottom: 0px; font-family: Arial, Helvetica, sans-serif; font-size: 15px; line-height: 19.5px; background-color: #ffffff; ">回调函数的解释参考最上面的描述。 首先声明一个回调函数。</p>
<pre style="font-size: 0.9em; font-family: 'Lucida Console', 'Andale Mono', 'Courier New', Courier, monospace; line-height: 1.2em; margin: 2px; border: 1px dashed; background-color: #f9f9f9; overflow: auto; border-top-left-radius: 5px; border-top-right-radius: 5px; border-bottom-right-radius: 5px; border-bottom-left-radius: 5px; padding: 5px; ">int print_record(void *,int,char **,char **); </pre>
<p style="margin-top: 0px; margin-bottom: 0px; font-family: Arial, Helvetica, sans-serif; font-size: 15px; line-height: 19.5px; background-color: #ffffff; "><br />
查询代码<br />
</p>
<div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
-->&nbsp; &nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">select&nbsp;data</span><span style="color: #008000; "><br />
</span>&nbsp;&nbsp;&nbsp;&nbsp;ret&nbsp;=&nbsp;sqlite3_exec(db,"select&nbsp;*&nbsp;from&nbsp;t",print_record,NULL,&amp;errmsg);<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>(ret&nbsp;!=&nbsp;SQLITE_OK){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fprintf(stderr,"query&nbsp;SQL&nbsp;error:&nbsp;%s\n",errmsg);<br />
&nbsp;&nbsp;&nbsp;&nbsp;}</div>
<p>&nbsp;</p>
<p style="margin-top: 1.33em; margin-bottom: 0px; font-family: Arial, Helvetica, sans-serif; font-size: 15px; line-height: 19.5px; background-color: #ffffff; ">现在定义回调函数，只是简单的输出字段值。<br />
</p>
<div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000FF; ">int</span>&nbsp;print_record(<span style="color: #0000FF; ">void</span>&nbsp;*<span style="color: #0000FF; ">params</span>,<span style="color: #0000FF; ">int</span>&nbsp;n_column,<span style="color: #0000FF; ">char</span>&nbsp;**column_value,<span style="color: #0000FF; ">char</span>&nbsp;**column_name){<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;i;<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>(i=0;i&lt;n_column;i++){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("\t%s",column_value[i]);<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;printf("\n");<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;0;<br />
}</div>
<p>&nbsp;</p>
<h2>不使用回调的查询操作</h2>
<p style="margin-top: 0px; margin-bottom: 0px; font-family: Arial, Helvetica, sans-serif; font-size: 15px; line-height: 19.5px; background-color: #ffffff; ">定义使用的变量</p>
<pre style="font-size: 0.9em; font-family: 'Lucida Console', 'Andale Mono', 'Courier New', Courier, monospace; line-height: 1.2em; margin: 2px; border: 1px dashed; background-color: #f9f9f9; overflow: auto; border-top-left-radius: 5px; border-top-right-radius: 5px; border-bottom-right-radius: 5px; border-bottom-left-radius: 5px; padding: 5px; "> char **dbresult; int j,nrow,ncolumn,index; </pre>
<p style="margin-top: 1.33em; margin-bottom: 0px; font-family: Arial, Helvetica, sans-serif; font-size: 15px; line-height: 19.5px; background-color: #ffffff; ">查询操作<br />
</p>
<div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
-->&nbsp; &nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">select&nbsp;table</span><span style="color: #008000; "><br />
</span>&nbsp;&nbsp;&nbsp;&nbsp;ret&nbsp;=&nbsp;sqlite3_get_table(db,"select&nbsp;*&nbsp;from&nbsp;t",&amp;dbresult,&amp;nrow,&amp;ncolumn,&amp;errmsg);<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>(ret&nbsp;==&nbsp;SQLITE_OK){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("query&nbsp;%i&nbsp;records.\n",nrow);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;index=ncolumn;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>(i=0;i&lt;nrow;i++){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("[%2i]",i);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>(j=0;j&lt;ncolumn;j++){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("&nbsp;%s",dbresult[index]);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;index++;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("\n");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;sqlite3_free_table(dbresult);</div>
<p>&nbsp;</p>
<p style="margin-top: 1.33em; margin-bottom: 0px; font-family: Arial, Helvetica, sans-serif; font-size: 15px; line-height: 19.5px; background-color: #ffffff; ">sqlite3_get_table的API语法：<br />
</p>
<div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000FF; ">int</span>&nbsp;sqlite3_get_table(<br />
&nbsp;&nbsp;sqlite3&nbsp;*db,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">/*</span><span style="color: #008000; ">&nbsp;An&nbsp;open&nbsp;database&nbsp;</span><span style="color: #008000; ">*/</span><br />
&nbsp;&nbsp;<span style="color: #0000FF; ">const</span>&nbsp;<span style="color: #0000FF; ">char</span>&nbsp;*zSql,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">/*</span><span style="color: #008000; ">&nbsp;SQL&nbsp;to&nbsp;be&nbsp;evaluated&nbsp;</span><span style="color: #008000; ">*/</span><br />
&nbsp;&nbsp;<span style="color: #0000FF; ">char</span>&nbsp;***pazResult,&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">/*</span><span style="color: #008000; ">&nbsp;Results&nbsp;of&nbsp;the&nbsp;query&nbsp;</span><span style="color: #008000; ">*/</span><br />
&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;*pnRow,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">/*</span><span style="color: #008000; ">&nbsp;Number&nbsp;of&nbsp;result&nbsp;rows&nbsp;written&nbsp;here&nbsp;</span><span style="color: #008000; ">*/</span><br />
&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;*pnColumn,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">/*</span><span style="color: #008000; ">&nbsp;Number&nbsp;of&nbsp;result&nbsp;columns&nbsp;written&nbsp;here&nbsp;</span><span style="color: #008000; ">*/</span><br />
&nbsp;&nbsp;<span style="color: #0000FF; ">char</span>&nbsp;**pzErrmsg&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">/*</span><span style="color: #008000; ">&nbsp;Error&nbsp;msg&nbsp;written&nbsp;here&nbsp;</span><span style="color: #008000; ">*/</span><br />
);<br />
<span style="color: #0000FF; ">void</span>&nbsp;sqlite3_free_table(<span style="color: #0000FF; ">char</span>&nbsp;**result);</div>
<p>&nbsp;</p>
<p style="margin-top: 0px; margin-bottom: 0px; font-family: Arial, Helvetica, sans-serif; font-size: 15px; line-height: 19.5px; background-color: #ffffff; ">其中：</p>
<dl style="margin-top: 0px; margin-bottom: 0px; font-family: Arial, Helvetica, sans-serif; font-size: 15px; line-height: 19.5px; background-color: #ffffff; "><dd>
<ul style="margin-top: 0px; margin-bottom: 0px; border-left-width: 5px; border-left-style: solid; border-left-color: #dddddd; ">
     <li>db是sqlite3的句柄</li>
     <li>zSql是要执行的sql语句</li>
     <li>pazResult是执行查询操作的返回结果集</li>
     <li>pnRow是记录的行数</li>
     <li>pnColumn是记录的字段个数</li>
     <li>pzErrmsg是错误信息</li>
</ul>
</dd></dl>
<p style="margin-top: 1.33em; margin-bottom: 0px; font-family: Arial, Helvetica, sans-serif; font-size: 15px; line-height: 19.5px; background-color: #ffffff; ">由于sqlite3_get_table是sqlite3_exec的包装，因此返回的结果和sqlite3_exec类似。</p>
<p style="margin-top: 1.33em; margin-bottom: 0px; font-family: Arial, Helvetica, sans-serif; font-size: 15px; line-height: 19.5px; background-color: #ffffff; ">pazResult是一个(pnRow+1)*pnColumn结果集的字符串数组，其中前pnColumn个结果是字段的名称，后pnRow行记录是真实的字段值，如果某个字段为空，则对应值为NULL。</p>
<p style="margin-top: 1.33em; margin-bottom: 0px; font-family: Arial, Helvetica, sans-serif; font-size: 15px; line-height: 19.5px; background-color: #ffffff; ">最后需要通过sqlite3_free_table()释放完整的结果集。</p>
<div style="margin-top: 1.33em; font-family: Arial, Helvetica, sans-serif; font-size: 15px; line-height: 19.5px; background-color: #ffffff; "></div>
<h2>更新操作</h2>
<pre style="font-size: 0.9em; font-family: 'Lucida Console', 'Andale Mono', 'Courier New', Courier, monospace; line-height: 1.2em; margin: 2px; border: 1px dashed; background-color: #f9f9f9; overflow: auto; border-top-left-radius: 5px; border-top-right-radius: 5px; border-bottom-right-radius: 5px; border-bottom-left-radius: 5px; padding: 5px; "> sqlite3_exec(db,"update t set msg='MESSAGE#10' where id=10",NULL,NULL,&amp;errmsg); </pre>
<p style="margin-top: 0px; margin-bottom: 0px; font-family: Arial, Helvetica, sans-serif; font-size: 15px; line-height: 19.5px; background-color: #ffffff; ">当然了，我们也可以使用预编译方法进行更新操作。</p>
<div style="margin-top: 1.33em; font-family: Arial, Helvetica, sans-serif; font-size: 15px; line-height: 19.5px; background-color: #ffffff; "></div>
<h2>受影响的记录数</h2>
<p style="margin-top: 0px; margin-bottom: 0px; font-family: Arial, Helvetica, sans-serif; font-size: 15px; line-height: 19.5px; background-color: #ffffff; ">我们可以使用sqlite3_change(sqlite3 *)的API来统计上一次操作受影响的记录数。</p>
<pre style="font-size: 0.9em; font-family: 'Lucida Console', 'Andale Mono', 'Courier New', Courier, monospace; line-height: 1.2em; margin: 2px; border: 1px dashed; background-color: #f9f9f9; overflow: auto; border-top-left-radius: 5px; border-top-right-radius: 5px; border-bottom-right-radius: 5px; border-bottom-left-radius: 5px; padding: 5px; "> ret = sqlite3_exec(db,"delete from t",NULL,NULL,&amp;errmsg); <br />
if(ret == SQLITE_OK){<br />
printf("delete records: %i\n",sqlite3_changes(db));<br />
} </pre>
<div style="margin-top: 1.33em; font-family: Arial, Helvetica, sans-serif; font-size: 15px; line-height: 19.5px; background-color: #ffffff; "></div>
<h2>总结</h2>
<p style="margin-top: 0px; margin-bottom: 0px; font-family: Arial, Helvetica, sans-serif; font-size: 15px; line-height: 19.5px; background-color: #ffffff; ">这里我们接触了SQLITE3的13个API：</p>
<dl style="margin-top: 0px; margin-bottom: 0px; font-family: Arial, Helvetica, sans-serif; font-size: 15px; line-height: 19.5px; background-color: #ffffff; "><dd>
<ul style="margin-top: 0px; margin-bottom: 0px; border-left-width: 5px; border-left-style: solid; border-left-color: #dddddd; ">
     <li>sqlite3_open()</li>
     <li>sqlite3_exec()</li>
     <li>sqlite3_close()</li>
     <li>sqlite3_prepare_v2</li>
     <li>sqlite3_bind_*()</li>
     <li>sqlite3_bind_parameter_index()</li>
     <li>sqlite3_step()</li>
     <li>sqlite3_reset()</li>
     <li>sqlite3_finalize()</li>
     <li>sqlite3_get_table</li>
     <li>sqlite3_change()</li>
     <li>sqlite3_free()</li>
     <li>sqlite3_free_table()</li>
</ul>
</dd></dl>
<p style="margin-top: 1.33em; margin-bottom: 0px; font-family: Arial, Helvetica, sans-serif; font-size: 15px; line-height: 19.5px; background-color: #ffffff; ">事实上截止到SQLITE3.7.14(2012/09/03) 一共提供了204个API函数（<a href="http://www.sqlite.org/c3ref/funclist.html%ef%bc%89%e3%80%82" rel="nofollow" style="text-decoration: none; ">http://www.sqlite.org/c3ref/funclist.html）。</a></p>
<p style="margin-top: 1.33em; margin-bottom: 0px; font-family: Arial, Helvetica, sans-serif; font-size: 15px; line-height: 19.5px; background-color: #ffffff; ">但最精简的API函数大概有6个：</p>
<ul style="margin-top: 0px; margin-bottom: 0px; border-left-width: 5px; border-left-style: solid; border-left-color: #dddddd; font-family: Arial, Helvetica, sans-serif; font-size: 15px; line-height: 19.5px; background-color: #ffffff; ">
     <li>sqlite3_open()</li>
     <li>sqlite3_prepare()</li>
     <li>sqlite3_step()</li>
     <li>sqlite3_column()</li>
     <li>sqlite3_finalize()</li>
     <li>sqlite3_close()</li>
</ul>
<p style="margin-top: 1.33em; margin-bottom: 0px; font-family: Arial, Helvetica, sans-serif; font-size: 15px; line-height: 19.5px; background-color: #ffffff; ">核心API也就10个（在精简API基础上增加4个）：</p>
<ul style="margin-top: 0px; margin-bottom: 0px; border-left-width: 5px; border-left-style: solid; border-left-color: #dddddd; font-family: Arial, Helvetica, sans-serif; font-size: 15px; line-height: 19.5px; background-color: #ffffff; ">
     <li>sqlite3_exec()</li>
     <li>sqlite3_get_table()</li>
     <li>sqlite3_reset()</li>
     <li>sqlite3_bind()</li>
</ul>
<p style="margin-top: 1.33em; margin-bottom: 0px; font-family: Arial, Helvetica, sans-serif; font-size: 15px; line-height: 19.5px; background-color: #ffffff; ">因此掌握起来还是比较容易的。<br />
<br />
完整的源码地址： <a href="https://gist.github.com/3780669" target="_blank">https://gist.github.com/3780669
</a><br />
</p><img src ="http://www.blogjava.net/xylz/aggbug/388519.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xylz/" target="_blank">imxylz</a> 2012-09-25 16:34 <a href="http://www.blogjava.net/xylz/archive/2012/09/25/388519.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Fedora 17 降级一把辛酸泪</title><link>http://www.blogjava.net/xylz/archive/2012/06/07/380210.html</link><dc:creator>imxylz</dc:creator><author>imxylz</author><pubDate>Thu, 07 Jun 2012 04:13:00 GMT</pubDate><guid>http://www.blogjava.net/xylz/archive/2012/06/07/380210.html</guid><wfw:comment>http://www.blogjava.net/xylz/comments/380210.html</wfw:comment><comments>http://www.blogjava.net/xylz/archive/2012/06/07/380210.html#Feedback</comments><slash:comments>9</slash:comments><wfw:commentRss>http://www.blogjava.net/xylz/comments/commentRss/380210.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xylz/services/trackbacks/380210.html</trackback:ping><description><![CDATA[<p style="font-family: Georgia, 'Times New Roman', 'Bitstream Charter', Times, serif; font-size: 13px; line-height: 19px; "></p>
<p style="font-family: Georgia, 'Times New Roman', 'Bitstream Charter', Times, serif; font-size: 13px; line-height: 19px; ">Fedora 17发布，第二天立马更新了。 首先光是更新就折腾了很久，总算弄好了。结果发现一个巨大的问题。gtk2与eclipse不兼容。</p>
<p style="font-family: Georgia, 'Times New Roman', 'Bitstream Charter', Times, serif; font-size: 13px; line-height: 19px; ">不兼容的后果是总是报这样的错误（命令行启动eclipse：&nbsp;eclipse&nbsp;-debug&nbsp;-consolelog）：</p>
<blockquote style="color: #000000; font-family: Georgia, 'Times New Roman', 'Bitstream Charter', Times, serif; font-size: 13px; line-height: 19px; ">
<p>(Eclipse:21798): GLib-GIO-CRITICAL **: g_dbus_proxy_new_for_bus_sync: assertion `g_dbus_is_name (name)' failed</p>
<p>(Eclipse:21798): GLib-GIO-CRITICAL **: g_dbus_proxy_new_for_bus_sync: assertion `g_dbus_is_name (name)' failed</p>
<p>(Eclipse:21798): GLib-GIO-CRITICAL **: g_dbus_proxy_new_for_bus_sync: assertion `g_dbus_is_name (name)' failed</p>
</blockquote>
<p style="font-family: Georgia, 'Times New Roman', 'Bitstream Charter', Times, serif; font-size: 13px; line-height: 19px; ">表现为打开编辑器后总是有很多内容无法显示，显示为空白，必须重新选定或者拖动滚动条才能显示。</p>
<p style="font-family: Georgia, 'Times New Roman', 'Bitstream Charter', Times, serif; font-size: 13px; line-height: 19px; "><strong>这令人崩溃啊！！！</strong></p>
<p style="font-family: Georgia, 'Times New Roman', 'Bitstream Charter', Times, serif; font-size: 13px; line-height: 19px; ">这下悲剧了，要知道我的开发工作就是在ecilpse下进行的。</p>
<p style="font-family: Georgia, 'Times New Roman', 'Bitstream Charter', Times, serif; font-size: 13px; line-height: 19px; ">好吧，上网找找。发现有些人也遇到不兼容问题。但是没有一个解决办法。</p>
<p style="font-family: Georgia, 'Times New Roman', 'Bitstream Charter', Times, serif; font-size: 13px; line-height: 19px; ">我的解决过程是这样：</p>
<ul style="font-family: Georgia, 'Times New Roman', 'Bitstream Charter', Times, serif; font-size: 13px; line-height: 19px; ">
     <li>更新整个fedora环境（发布后官方发布了一些紧急修正包），未果</li>
     <li>重新下载最新发行版的eclipse，未果</li>
     <li>重新下载最新的测试版本eclipse，未果</li>
     <li>下载fedora18的gtk2、glibc等强制安装，未果</li>
     <li>降级gtk2、glibc等到fedora&nbsp;16，未果</li>
     <li>继续google，寻找解决方法，依然未果</li>
     <li>替换最新发布的二进制swt库，未果</li>
     <li>尝试手动编译swt源码，未成功</li>
</ul>
<p style="font-family: Georgia, 'Times New Roman', 'Bitstream Charter', Times, serif; font-size: 13px; line-height: 19px; ">这样，折腾了几天，快要放弃了。</p>
<p style="font-family: Georgia, 'Times New Roman', 'Bitstream Charter', Times, serif; font-size: 13px; line-height: 19px; ">昨天是在搞不定，尝试下载Idea的社区版，使用了下还是感觉不习惯，放弃。</p>
<p style="font-family: Georgia, 'Times New Roman', 'Bitstream Charter', Times, serif; font-size: 13px; line-height: 19px; ">今天早上突然想到，公司配的那台笔记本还是Fedora&nbsp;16未升级。于是想强制降级到swt所有依赖库到Fedora&nbsp;16看能否解决问题。</p>
<p style="font-family: Georgia, 'Times New Roman', 'Bitstream Charter', Times, serif; font-size: 13px; line-height: 19px; ">使用了下面命令成功完成了部分依赖库的降级，这里面更是不断的尝试，在失败中成长。哭~~~</p>
<blockquote style="color: #000000; font-family: Georgia, 'Times New Roman', 'Bitstream Charter', Times, serif; font-size: 13px; line-height: 19px; ">
<p>yum&nbsp;list</p>
<p>yum&nbsp;install</p>
<p>yum&nbsp;erase</p>
<p>yum&nbsp;--releasever=16&nbsp;downgrade</p>
<p>rpm&nbsp;-qa</p>
<p>rpm&nbsp;-qf</p><p>ldd</p><p>lsof</p>
</blockquote>
<p style="font-family: Georgia, 'Times New Roman', 'Bitstream Charter', Times, serif; font-size: 13px; line-height: 19px; ">好在只是用了mirrors.sohu.com镜像，绑定了内网地址，下载rpm包非常快。这是是给我最大的安慰。</p>
<p style="font-family: Georgia, 'Times New Roman', 'Bitstream Charter', Times, serif; font-size: 13px; line-height: 19px; ">这个过程经过了长达两个小时的折腾和仿佛。最终终于成功完成了以下依赖的降级。</p>
<blockquote style="color: #000000; font-family: Georgia, 'Times New Roman', 'Bitstream Charter', Times, serif; font-size: 13px; line-height: 19px; ">
<p>[adyliu@adyliu-pc jafka]$ rpm -qa|grep fc16|sort<br />
cscope-15.7a-9.fc16.x86_64<br />
dconf-0.10.0-1.fc16.x86_64<br />
fcitx-4.2.3-1.fc16.x86_64<br />
fcitx-data-4.2.3-1.fc16.noarch<br />
fcitx-gtk2-4.2.3-1.fc16.x86_64<br />
fcitx-gtk3-4.2.3-1.fc16.x86_64<br />
fcitx-libs-4.2.3-1.fc16.x86_64<br />
gdk-pixbuf2-2.24.1-1.fc16.x86_64<br />
gedit-3.2.6-1.fc16.x86_64<br />
glib2-2.30.3-1.fc16.x86_64<br />
glibc-2.14.90-24.fc16.7.x86_64<br />
glibc-common-2.14.90-24.fc16.7.x86_64<br />
glibc-devel-2.14.90-24.fc16.7.x86_64<br />
glibc-headers-2.14.90-24.fc16.7.x86_64<br />
glib-networking-2.30.1-2.fc16.x86_64<br />
gnome-disk-utility-libs-3.0.2-3.fc16.x86_64<br />
gnutls-2.12.14-2.fc16.x86_64<br />
gsettings-desktop-schemas-3.2.0-1.fc16.noarch<br />
gtk2-2.24.8-3.fc16.x86_64<br />
gtk2-immodule-xim-2.24.8-3.fc16.x86_64<br />
gvfs-1.10.1-3.fc16.x86_64<br />
libarchive-2.8.5-1.fc16.x86_64<br />
libbluray-0.2-0.5.20110710git51d7d60a96d06.fc16.x86_64<br />
libcdio-0.82-6.fc16.x86_64<br />
libsoup-2.36.1-2.fc16.x86_64<br />
mdadm-3.2.3-7.fc16.x86_64<br />
nautilus-3.2.1-2.fc16.x86_64<br />
nautilus-extensions-3.2.1-2.fc16.x86_64<br />
PackageKit-0.6.22-2.fc16.x86_64<br />
PackageKit-glib-0.6.22-2.fc16.x86_64<br />
PackageKit-gtk-module-0.6.22-2.fc16.x86_64<br />
PackageKit-yum-0.6.22-2.fc16.x86_64<br />
pango-1.29.4-1.fc16.x86_64<br />
yum-3.4.3-24.fc16.noarch</p>
</blockquote>
<p style="font-family: Georgia, 'Times New Roman', 'Bitstream Charter', Times, serif; font-size: 13px; line-height: 19px; ">可以看到仅仅更新gtk2/glibc是不够的。</p>
<p style="font-family: Georgia, 'Times New Roman', 'Bitstream Charter', Times, serif; font-size: 13px; line-height: 19px; ">总结下：</p>
<ul style="font-family: Georgia, 'Times New Roman', 'Bitstream Charter', Times, serif; font-size: 13px; line-height: 19px; ">
     <li>坚持是成功的关键（中间过程，欲哭无泪，最后我都打算重新安装Fedora 16了）<br />
     </li>
     <li>我还是很强的（囧）<br />
     <br />
     <br />
     </li>
</ul>
最后警告： <span style="font-size: 18pt; color: #0000ff; "><strong>可能会有后遗症，请勿模仿，请勿尝试</strong></span>。<img src ="http://www.blogjava.net/xylz/aggbug/380210.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xylz/" target="_blank">imxylz</a> 2012-06-07 12:13 <a href="http://www.blogjava.net/xylz/archive/2012/06/07/380210.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>编程语言大战</title><link>http://www.blogjava.net/xylz/archive/2011/12/06/365658.html</link><dc:creator>imxylz</dc:creator><author>imxylz</author><pubDate>Tue, 06 Dec 2011 03:25:00 GMT</pubDate><guid>http://www.blogjava.net/xylz/archive/2011/12/06/365658.html</guid><wfw:comment>http://www.blogjava.net/xylz/comments/365658.html</wfw:comment><comments>http://www.blogjava.net/xylz/archive/2011/12/06/365658.html#Feedback</comments><slash:comments>8</slash:comments><wfw:commentRss>http://www.blogjava.net/xylz/comments/commentRss/365658.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xylz/services/trackbacks/365658.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 刚看到这个月的编程语言排行榜，很显然java的霸主地位很快就会在发达国家被挤掉，C语言依然是王者（想想上个月自己买的两个C语言的书，冷汗直流）。看来我迟早要回归C，这才是真正的王道。<br><br><br><br>非常令人吃惊的是C++语言依然不够坚挺，由于Windows 7/Windows 8的发力，C#很快就会抢占C++的市场，估计很快就会将C++从前三名中挤下去。<br><br><br><br>iPhone/iPad的热销让Object C继续火热，前十的位置还是可以持续很久的，这一点毋庸置疑。移动设备开发的高端人才现在是高薪难求，如果有时间我也要继续关注下。&nbsp;&nbsp;<a href='http://www.blogjava.net/xylz/archive/2011/12/06/365658.html'>阅读全文</a><img src ="http://www.blogjava.net/xylz/aggbug/365658.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xylz/" target="_blank">imxylz</a> 2011-12-06 11:25 <a href="http://www.blogjava.net/xylz/archive/2011/12/06/365658.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>处理Zookeeper的session过期问题</title><link>http://www.blogjava.net/xylz/archive/2011/12/05/365578.html</link><dc:creator>imxylz</dc:creator><author>imxylz</author><pubDate>Mon, 05 Dec 2011 05:57:00 GMT</pubDate><guid>http://www.blogjava.net/xylz/archive/2011/12/05/365578.html</guid><wfw:comment>http://www.blogjava.net/xylz/comments/365578.html</wfw:comment><comments>http://www.blogjava.net/xylz/archive/2011/12/05/365578.html#Feedback</comments><slash:comments>7</slash:comments><wfw:commentRss>http://www.blogjava.net/xylz/comments/commentRss/365578.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xylz/services/trackbacks/365578.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: Zookeeper客户端和服务端维持一个长连接，每隔10s向服务端发送一个心跳，服务端返回客户端一个响应。这就是一个Session连接，拥有全局唯一的session id。Session连接通常是一直有效，如果因为网络原因断开了连接，客户端会使用相同的session id进行重连。由于服务端保留了session的各种状态，尤其是各种瞬时节点是否删除依赖于session是否失效。<br>Session失效问题<br><br>通常客户端主动关闭连接认为是一次session失效。另外也有可能因为其它未知原因，例如网络超时导致的session失效问题。在服务端看来，无法区分session失效是何种情况，一次一旦发生session失效，一定时间后就会将session持有的所有watcher以及瞬时节点删除。<br>而对于Zookeeper客户端而言，一旦发生失效不知道是否该重连，这涉及到watcher和瞬时节点问题，因此Zookeeper客户端认为，一旦发生了seesion失效，那么就认为客户端死掉了。从而所有操作都不能够进行。参考 How should I handle SESSION&nbsp;&nbsp;<a href='http://www.blogjava.net/xylz/archive/2011/12/05/365578.html'>阅读全文</a><img src ="http://www.blogjava.net/xylz/aggbug/365578.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xylz/" target="_blank">imxylz</a> 2011-12-05 13:57 <a href="http://www.blogjava.net/xylz/archive/2011/12/05/365578.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Ganglia安装指南 (基于CentOS 5.6)</title><link>http://www.blogjava.net/xylz/archive/2011/07/21/354744.html</link><dc:creator>imxylz</dc:creator><author>imxylz</author><pubDate>Wed, 20 Jul 2011 16:34:00 GMT</pubDate><guid>http://www.blogjava.net/xylz/archive/2011/07/21/354744.html</guid><wfw:comment>http://www.blogjava.net/xylz/comments/354744.html</wfw:comment><comments>http://www.blogjava.net/xylz/archive/2011/07/21/354744.html#Feedback</comments><slash:comments>7</slash:comments><wfw:commentRss>http://www.blogjava.net/xylz/comments/commentRss/354744.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xylz/services/trackbacks/354744.html</trackback:ping><description><![CDATA[<span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif; font-size: 15px; line-height: 19px; background-color: #ffffff; ">
<h3 style="margin-top: 1em; margin-bottom: 0.6em; font-size: 1.22em; ">Ganglia安装指南 (基于CentOS 5.6)</h3>
<h2 style="margin-top: 1em; margin-bottom: 0.6em; font-size: 1.44em; border-bottom-width: 2px; border-bottom-style: solid; border-bottom-color: #0097ff; padding-bottom: 2px; ">安装依赖</h2>
<pre class="escaped" style="font-size: 0.9em; font-family: 'Lucida Console', 'Andale Mono', 'Courier New', Courier, monospace; line-height: 1.2em; margin-top: 2px; margin-bottom: 2px; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: dashed; border-right-style: dashed; border-bottom-style: dashed; border-left-style: dashed; border-color: initial; background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: #f9f9f9; overflow-x: auto; overflow-y: auto; border-top-left-radius: 5px 5px; border-top-right-radius: 5px 5px; border-bottom-right-radius: 5px 5px; border-bottom-left-radius: 5px 5px; padding-top: 5px; padding-right: 5px; padding-bottom: 5px; padding-left: 5px; margin-right: 2px; margin-left: 2px; background-position: initial initial; background-repeat: initial initial; ">rpm -ivh http://mirrors.sohu.com/centos/5/os/x86_64/CentOS/zlib-devel-1.2.3-3.x86_64.rpm
rpm -ivh http://mirrors.sohu.com/centos/5/os/x86_64/CentOS/freetype-devel-2.2.1-28.el5_5.1.x86_64.rpm
rpm -ivh http://mirrors.sohu.com/centos/5/os/x86_64/CentOS/libart_lgpl-devel-2.3.17-4.x86_64.rpm
rpm -ivh http://mirrors.sohu.com/centos/5/os/x86_64/CentOS/libpng-devel-1.2.10-7.1.el5_5.3.x86_64.rpm
</pre>
<p style="margin-top: 0px; margin-bottom: 0px; ">如果上述安装失败，可能需要安装以下库依赖</p>
<pre class="escaped" style="font-size: 0.9em; font-family: 'Lucida Console', 'Andale Mono', 'Courier New', Courier, monospace; line-height: 1.2em; margin-top: 2px; margin-bottom: 2px; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: dashed; border-right-style: dashed; border-bottom-style: dashed; border-left-style: dashed; border-color: initial; background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: #f9f9f9; overflow-x: auto; overflow-y: auto; border-top-left-radius: 5px 5px; border-top-right-radius: 5px 5px; border-bottom-right-radius: 5px 5px; border-bottom-left-radius: 5px 5px; padding-top: 5px; padding-right: 5px; padding-bottom: 5px; padding-left: 5px; margin-right: 2px; margin-left: 2px; background-position: initial initial; background-repeat: initial initial; ">yum install zlib freetype libart_lgpl libpng
</pre>
<h2 style="margin-top: 1em; margin-bottom: 0.6em; font-size: 1.44em; border-bottom-width: 2px; border-bottom-style: solid; border-bottom-color: #0097ff; padding-bottom: 2px; ">安装rrdtools</h2>
<pre class="escaped" style="font-size: 0.9em; font-family: 'Lucida Console', 'Andale Mono', 'Courier New', Courier, monospace; line-height: 1.2em; margin-top: 2px; margin-bottom: 2px; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: dashed; border-right-style: dashed; border-bottom-style: dashed; border-left-style: dashed; border-color: initial; background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: #f9f9f9; overflow-x: auto; overflow-y: auto; border-top-left-radius: 5px 5px; border-top-right-radius: 5px 5px; border-bottom-right-radius: 5px 5px; border-bottom-left-radius: 5px 5px; padding-top: 5px; padding-right: 5px; padding-bottom: 5px; padding-left: 5px; margin-right: 2px; margin-left: 2px; background-position: initial initial; background-repeat: initial initial; ">http://oss.oetiker.ch/rrdtool/pub/rrdtool-1.2.27.tar.gz
tar zxvf rrdtool-1.2.27.tar
cd rrdtool-1.2.27
./configure --prefix=/usr/local/rrdtool
make
make install
</pre>
<p style="margin-top: 0px; margin-bottom: 0px; ">执行下命令，看是否安装成功</p>
<pre class="escaped" style="font-size: 0.9em; font-family: 'Lucida Console', 'Andale Mono', 'Courier New', Courier, monospace; line-height: 1.2em; margin-top: 2px; margin-bottom: 2px; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: dashed; border-right-style: dashed; border-bottom-style: dashed; border-left-style: dashed; border-color: initial; background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: #f9f9f9; overflow-x: auto; overflow-y: auto; border-top-left-radius: 5px 5px; border-top-right-radius: 5px 5px; border-bottom-right-radius: 5px 5px; border-bottom-left-radius: 5px 5px; padding-top: 5px; padding-right: 5px; padding-bottom: 5px; padding-left: 5px; margin-right: 2px; margin-left: 2px; background-position: initial initial; background-repeat: initial initial; ">/usr/local/rrdtool/bin/rrdtool
</pre>
<h2 style="margin-top: 1em; margin-bottom: 0.6em; font-size: 1.44em; border-bottom-width: 2px; border-bottom-style: solid; border-bottom-color: #0097ff; padding-bottom: 2px; ">安装expat依赖</h2>
<pre class="escaped" style="font-size: 0.9em; font-family: 'Lucida Console', 'Andale Mono', 'Courier New', Courier, monospace; line-height: 1.2em; margin-top: 2px; margin-bottom: 2px; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: dashed; border-right-style: dashed; border-bottom-style: dashed; border-left-style: dashed; border-color: initial; background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: #f9f9f9; overflow-x: auto; overflow-y: auto; border-top-left-radius: 5px 5px; border-top-right-radius: 5px 5px; border-bottom-right-radius: 5px 5px; border-bottom-left-radius: 5px 5px; padding-top: 5px; padding-right: 5px; padding-bottom: 5px; padding-left: 5px; margin-right: 2px; margin-left: 2px; background-position: initial initial; background-repeat: initial initial; ">http://downloads.sourceforge.net/project/expat/expat/2.0.1/expat-2.0.1.tar.gz?use_mirror=cdnetworks-kr-2
tar zxvf expat-2.0.1.tar.gz
./configure --prefix=/usr/local/expat
make
make install
</pre>
<p style="margin-top: 0px; margin-bottom: 0px; ">对于64位操作系统，需要手动的拷贝下动态链接库到lib64下</p>
<pre class="escaped" style="font-size: 0.9em; font-family: 'Lucida Console', 'Andale Mono', 'Courier New', Courier, monospace; line-height: 1.2em; margin-top: 2px; margin-bottom: 2px; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: dashed; border-right-style: dashed; border-bottom-style: dashed; border-left-style: dashed; border-color: initial; background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: #f9f9f9; overflow-x: auto; overflow-y: auto; border-top-left-radius: 5px 5px; border-top-right-radius: 5px 5px; border-bottom-right-radius: 5px 5px; border-bottom-left-radius: 5px 5px; padding-top: 5px; padding-right: 5px; padding-bottom: 5px; padding-left: 5px; margin-right: 2px; margin-left: 2px; background-position: initial initial; background-repeat: initial initial; ">mkdir /usr/local/expat/lib64
cp -a /usr/local/expat/lib/* /usr/local/expat/lib64/
</pre>
<h2 style="margin-top: 1em; margin-bottom: 0.6em; font-size: 1.44em; border-bottom-width: 2px; border-bottom-style: solid; border-bottom-color: #0097ff; padding-bottom: 2px; ">安装apr以及apr-util</h2>
<pre class="escaped" style="font-size: 0.9em; font-family: 'Lucida Console', 'Andale Mono', 'Courier New', Courier, monospace; line-height: 1.2em; margin-top: 2px; margin-bottom: 2px; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: dashed; border-right-style: dashed; border-bottom-style: dashed; border-left-style: dashed; border-color: initial; background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: #f9f9f9; overflow-x: auto; overflow-y: auto; border-top-left-radius: 5px 5px; border-top-right-radius: 5px 5px; border-bottom-right-radius: 5px 5px; border-bottom-left-radius: 5px 5px; padding-top: 5px; padding-right: 5px; padding-bottom: 5px; padding-left: 5px; margin-right: 2px; margin-left: 2px; background-position: initial initial; background-repeat: initial initial; ">http://labs.renren.com/apache-mirror/apr/apr-1.4.5.tar.gz
tar xvjf apr-1.3.2.tar.bz2
./configure --prefix=/usr/local/apr
make
make install
</pre>
<div class="vspace" style="margin-top: 1.33em; "></div>
<pre class="escaped" style="font-size: 0.9em; font-family: 'Lucida Console', 'Andale Mono', 'Courier New', Courier, monospace; line-height: 1.2em; margin-top: 2px; margin-bottom: 2px; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: dashed; border-right-style: dashed; border-bottom-style: dashed; border-left-style: dashed; border-color: initial; background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: #f9f9f9; overflow-x: auto; overflow-y: auto; border-top-left-radius: 5px 5px; border-top-right-radius: 5px 5px; border-bottom-right-radius: 5px 5px; border-bottom-left-radius: 5px 5px; padding-top: 5px; padding-right: 5px; padding-bottom: 5px; padding-left: 5px; margin-right: 2px; margin-left: 2px; background-position: initial initial; background-repeat: initial initial; ">http://labs.renren.com/apache-mirror/apr/apr-util-1.3.12.tar.gz
tar xvjf apr-util-1.3.2.tar.bz2
./configure --with-apr=/usr/local/apr --with-expat=/usr/local/expat
make
make install
</pre>
<p style="margin-top: 0px; margin-bottom: 0px; ">同样64位机器需要拷贝动态链接库</p>
<pre class="escaped" style="font-size: 0.9em; font-family: 'Lucida Console', 'Andale Mono', 'Courier New', Courier, monospace; line-height: 1.2em; margin-top: 2px; margin-bottom: 2px; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: dashed; border-right-style: dashed; border-bottom-style: dashed; border-left-style: dashed; border-color: initial; background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: #f9f9f9; overflow-x: auto; overflow-y: auto; border-top-left-radius: 5px 5px; border-top-right-radius: 5px 5px; border-bottom-right-radius: 5px 5px; border-bottom-left-radius: 5px 5px; padding-top: 5px; padding-right: 5px; padding-bottom: 5px; padding-left: 5px; margin-right: 2px; margin-left: 2px; background-position: initial initial; background-repeat: initial initial; ">/bin/cp -f /usr/local/apr/include/apr-1/* /usr/local/apr/include/
mkdir -p /usr/local/apr/lib64
/bin/cp -a -f /usr/local/apr/lib/* /usr/local/apr/lib64/
</pre>
<h2 style="margin-top: 1em; margin-bottom: 0.6em; font-size: 1.44em; border-bottom-width: 2px; border-bottom-style: solid; border-bottom-color: #0097ff; padding-bottom: 2px; ">安装confuse</h2>
<pre class="escaped" style="font-size: 0.9em; font-family: 'Lucida Console', 'Andale Mono', 'Courier New', Courier, monospace; line-height: 1.2em; margin-top: 2px; margin-bottom: 2px; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: dashed; border-right-style: dashed; border-bottom-style: dashed; border-left-style: dashed; border-color: initial; background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: #f9f9f9; overflow-x: auto; overflow-y: auto; border-top-left-radius: 5px 5px; border-top-right-radius: 5px 5px; border-bottom-right-radius: 5px 5px; border-bottom-left-radius: 5px 5px; padding-top: 5px; padding-right: 5px; padding-bottom: 5px; padding-left: 5px; margin-right: 2px; margin-left: 2px; background-position: initial initial; background-repeat: initial initial; ">http://download.savannah.gnu.org/releases/confuse/confuse-2.7.tar.gz
tar zxvf confuse-2.6.tar.gz
./configure CFLAGS=-fPIC --disable-nls --prefix=/usr/local/confuse
make
make install
</pre>
<p style="margin-top: 0px; margin-bottom: 0px; ">拷贝动态链接库</p>
<pre class="escaped" style="font-size: 0.9em; font-family: 'Lucida Console', 'Andale Mono', 'Courier New', Courier, monospace; line-height: 1.2em; margin-top: 2px; margin-bottom: 2px; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: dashed; border-right-style: dashed; border-bottom-style: dashed; border-left-style: dashed; border-color: initial; background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: #f9f9f9; overflow-x: auto; overflow-y: auto; border-top-left-radius: 5px 5px; border-top-right-radius: 5px 5px; border-bottom-right-radius: 5px 5px; border-bottom-left-radius: 5px 5px; padding-top: 5px; padding-right: 5px; padding-bottom: 5px; padding-left: 5px; margin-right: 2px; margin-left: 2px; background-position: initial initial; background-repeat: initial initial; ">mkdir -p /usr/local/confuse/lib64
/bin/cp -a -f /usr/local/confuse/lib/* /usr/local/confuse/lib64/
</pre>
<div class="vspace" style="margin-top: 1.33em; "></div>
<h2 style="margin-top: 1em; margin-bottom: 0.6em; font-size: 1.44em; border-bottom-width: 2px; border-bottom-style: solid; border-bottom-color: #0097ff; padding-bottom: 2px; ">安装ganglia</h2>
<p style="margin-top: 0px; margin-bottom: 0px; ">现在才是安装ganglia的开始，如果提示需要pcre的话，安装下&nbsp;<code class="escaped" style="font-size: 0.9em; font-family: 'Lucida Console', 'Andale Mono', 'Courier New', Courier, monospace; white-space: nowrap; ">yum install pcre&nbsp;</code>下载ganglia-3.2.0，解压，安装</p>
<pre class="escaped" style="font-size: 0.9em; font-family: 'Lucida Console', 'Andale Mono', 'Courier New', Courier, monospace; line-height: 1.2em; margin-top: 2px; margin-bottom: 2px; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: dashed; border-right-style: dashed; border-bottom-style: dashed; border-left-style: dashed; border-color: initial; background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: #f9f9f9; overflow-x: auto; overflow-y: auto; border-top-left-radius: 5px 5px; border-top-right-radius: 5px 5px; border-bottom-right-radius: 5px 5px; border-bottom-left-radius: 5px 5px; padding-top: 5px; padding-right: 5px; padding-bottom: 5px; padding-left: 5px; margin-right: 2px; margin-left: 2px; background-position: initial initial; background-repeat: initial initial; ">./configure --prefix=/usr/local/ganglia --with-librrd=/usr/local/rrdtool --with-libapr=/usr/local/apr --with-libexpat=/usr/local/expat \
--with-libconfuse=/usr/local/confuse --with-gmetad --enable-gexec --enable-status --sysconfdir=/etc/ganglia
make
make install
</pre>
<h2 style="margin-top: 1em; margin-bottom: 0.6em; font-size: 1.44em; border-bottom-width: 2px; border-bottom-style: solid; border-bottom-color: #0097ff; padding-bottom: 2px; ">服务端配置</h2>
<p style="margin-top: 0px; margin-bottom: 0px; ">创建rrdtool数据目录，看$ganglia-3.2.0/web/conf.php里面的gmetad_root变量，并根据apache的运行用户创建权限，例如apache运行于apache用户上 。</p>
<pre class="escaped" style="font-size: 0.9em; font-family: 'Lucida Console', 'Andale Mono', 'Courier New', Courier, monospace; line-height: 1.2em; margin-top: 2px; margin-bottom: 2px; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: dashed; border-right-style: dashed; border-bottom-style: dashed; border-left-style: dashed; border-color: initial; background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: #f9f9f9; overflow-x: auto; overflow-y: auto; border-top-left-radius: 5px 5px; border-top-right-radius: 5px 5px; border-bottom-right-radius: 5px 5px; border-bottom-left-radius: 5px 5px; padding-top: 5px; padding-right: 5px; padding-bottom: 5px; padding-left: 5px; margin-right: 2px; margin-left: 2px; background-position: initial initial; background-repeat: initial initial; ">mkdir -p /var/lib/ganglia/rrds
mkdir -p /var/lib/ganglia/dwoo
chown -R apache;apache /var/lib/ganglia
</pre>
<p style="margin-top: 0px; margin-bottom: 0px; ">配置一个数据源，修改/etc/ganglia/gmetad.conf文件，同时将运行用户设置为rrdtool的目录权限用户，例如apache用户</p>
<pre class="escaped" style="font-size: 0.9em; font-family: 'Lucida Console', 'Andale Mono', 'Courier New', Courier, monospace; line-height: 1.2em; margin-top: 2px; margin-bottom: 2px; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: dashed; border-right-style: dashed; border-bottom-style: dashed; border-left-style: dashed; border-color: initial; background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: #f9f9f9; overflow-x: auto; overflow-y: auto; border-top-left-radius: 5px 5px; border-top-right-radius: 5px 5px; border-bottom-right-radius: 5px 5px; border-bottom-left-radius: 5px 5px; padding-top: 5px; padding-right: 5px; padding-bottom: 5px; padding-left: 5px; margin-right: 2px; margin-left: 2px; background-position: initial initial; background-repeat: initial initial; ">data_source "suc" localhost
setuid_username "apache"
</pre>
<p style="margin-top: 0px; margin-bottom: 0px; ">其中suc是数据源的名称，客户端分组会依赖此名称，后面会提到。 添加自启动脚本</p>
<pre class="escaped" style="font-size: 0.9em; font-family: 'Lucida Console', 'Andale Mono', 'Courier New', Courier, monospace; line-height: 1.2em; margin-top: 2px; margin-bottom: 2px; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: dashed; border-right-style: dashed; border-bottom-style: dashed; border-left-style: dashed; border-color: initial; background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: #f9f9f9; overflow-x: auto; overflow-y: auto; border-top-left-radius: 5px 5px; border-top-right-radius: 5px 5px; border-bottom-right-radius: 5px 5px; border-bottom-left-radius: 5px 5px; padding-top: 5px; padding-right: 5px; padding-bottom: 5px; padding-left: 5px; margin-right: 2px; margin-left: 2px; background-position: initial initial; background-repeat: initial initial; ">/bin/cp -f gmetad/gmetad.init /etc/init.d/gmetad
/bin/cp -f /usr/local/ganglia/sbin/gmetad /usr/sbin/gmetad
chkconfig -add gmetad
</pre>
<p style="margin-top: 0px; margin-bottom: 0px; ">启动gmetad服务</p>
<pre class="escaped" style="font-size: 0.9em; font-family: 'Lucida Console', 'Andale Mono', 'Courier New', Courier, monospace; line-height: 1.2em; margin-top: 2px; margin-bottom: 2px; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: dashed; border-right-style: dashed; border-bottom-style: dashed; border-left-style: dashed; border-color: initial; background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: #f9f9f9; overflow-x: auto; overflow-y: auto; border-top-left-radius: 5px 5px; border-top-right-radius: 5px 5px; border-bottom-right-radius: 5px 5px; border-bottom-left-radius: 5px 5px; padding-top: 5px; padding-right: 5px; padding-bottom: 5px; padding-left: 5px; margin-right: 2px; margin-left: 2px; background-position: initial initial; background-repeat: initial initial; ">service gmetad start
</pre>
<p style="margin-top: 0px; margin-bottom: 0px; ">看见Starting GANGLIA gmetad: [ OK ]就代表运行正常了。</p>
<div class="vspace" style="margin-top: 1.33em; "></div>
<h2 style="margin-top: 1em; margin-bottom: 0.6em; font-size: 1.44em; border-bottom-width: 2px; border-bottom-style: solid; border-bottom-color: #0097ff; padding-bottom: 2px; ">客户端配置（gmond节点）</h2>
<p style="margin-top: 0px; margin-bottom: 0px; ">本机安装如下：</p>
<pre class="escaped" style="font-size: 0.9em; font-family: 'Lucida Console', 'Andale Mono', 'Courier New', Courier, monospace; line-height: 1.2em; margin-top: 2px; margin-bottom: 2px; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: dashed; border-right-style: dashed; border-bottom-style: dashed; border-left-style: dashed; border-color: initial; background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: #f9f9f9; overflow-x: auto; overflow-y: auto; border-top-left-radius: 5px 5px; border-top-right-radius: 5px 5px; border-bottom-right-radius: 5px 5px; border-bottom-left-radius: 5px 5px; padding-top: 5px; padding-right: 5px; padding-bottom: 5px; padding-left: 5px; margin-right: 2px; margin-left: 2px; background-position: initial initial; background-repeat: initial initial; ">/bin/cp -f gmond/gmond.init /etc/init.d/gmond
/bin/cp -f /usr/local/ganglia/sbin/gmond/usr/sbin/gmond
chkconfig -add gmond
gmond --default_config &gt; /etc/ganglia/gmond.conf
</pre>
<p style="margin-top: 0px; margin-bottom: 0px; ">对于生成的默认配置文件需要做适当的修改</p>
<pre class="escaped" style="font-size: 0.9em; font-family: 'Lucida Console', 'Andale Mono', 'Courier New', Courier, monospace; line-height: 1.2em; margin-top: 2px; margin-bottom: 2px; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: dashed; border-right-style: dashed; border-bottom-style: dashed; border-left-style: dashed; border-color: initial; background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: #f9f9f9; overflow-x: auto; overflow-y: auto; border-top-left-radius: 5px 5px; border-top-right-radius: 5px 5px; border-bottom-right-radius: 5px 5px; border-bottom-left-radius: 5px 5px; padding-top: 5px; padding-right: 5px; padding-bottom: 5px; padding-left: 5px; margin-right: 2px; margin-left: 2px; background-position: initial initial; background-repeat: initial initial; ">cluster {
name="suc"
owner="apache"
latlong="unspecified"
url="unspecified"
}
</pre>
<p style="margin-top: 0px; margin-bottom: 0px; ">其中name是将要在服务端进行的分组，是服务端的数据源。接下来开启服务</p>
<pre class="escaped" style="font-size: 0.9em; font-family: 'Lucida Console', 'Andale Mono', 'Courier New', Courier, monospace; line-height: 1.2em; margin-top: 2px; margin-bottom: 2px; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: dashed; border-right-style: dashed; border-bottom-style: dashed; border-left-style: dashed; border-color: initial; background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: #f9f9f9; overflow-x: auto; overflow-y: auto; border-top-left-radius: 5px 5px; border-top-right-radius: 5px 5px; border-bottom-right-radius: 5px 5px; border-bottom-left-radius: 5px 5px; padding-top: 5px; padding-right: 5px; padding-bottom: 5px; padding-left: 5px; margin-right: 2px; margin-left: 2px; background-position: initial initial; background-repeat: initial initial; ">service gmond start
</pre>
<p style="margin-top: 0px; margin-bottom: 0px; ">看见Starting GANGLIA gmetad: [ OK ]代表启动成功。如果有失败，可以讲gmond.conf中的debug有0改为100，看更多的日志，然后进行排查。</p>
<pre class="escaped" style="font-size: 0.9em; font-family: 'Lucida Console', 'Andale Mono', 'Courier New', Courier, monospace; line-height: 1.2em; margin-top: 2px; margin-bottom: 2px; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: dashed; border-right-style: dashed; border-bottom-style: dashed; border-left-style: dashed; border-color: initial; background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: #f9f9f9; overflow-x: auto; overflow-y: auto; border-top-left-radius: 5px 5px; border-top-right-radius: 5px 5px; border-bottom-right-radius: 5px 5px; border-bottom-left-radius: 5px 5px; padding-top: 5px; padding-right: 5px; padding-bottom: 5px; padding-left: 5px; margin-right: 2px; margin-left: 2px; background-position: initial initial; background-repeat: initial initial; ">globals {
daemonize = yes
setuid = yes
user = nobody
debug_level = 100
}
</pre>
<p style="margin-top: 0px; margin-bottom: 0px; ">非本机客户端配置需要安装服务端安装一样进行配置，运行，非常麻烦，这里使用本机安装好的文件进行安装。 使用下面的脚本进行安装deploy-ganglia.sh</p>
<pre class="escaped" style="font-size: 0.9em; font-family: 'Lucida Console', 'Andale Mono', 'Courier New', Courier, monospace; line-height: 1.2em; margin-top: 2px; margin-bottom: 2px; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: dashed; border-right-style: dashed; border-bottom-style: dashed; border-left-style: dashed; border-color: initial; background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: #f9f9f9; overflow-x: auto; overflow-y: auto; border-top-left-radius: 5px 5px; border-top-right-radius: 5px 5px; border-bottom-right-radius: 5px 5px; border-bottom-left-radius: 5px 5px; padding-top: 5px; padding-right: 5px; padding-bottom: 5px; padding-left: 5px; margin-right: 2px; margin-left: 2px; background-position: initial initial; background-repeat: initial initial; ">i=$1
scp /usr/sbin/gmond $i:/usr/sbin/gmond
ssh $i mkdir -p /etc/ganglia/
ssh $i mkdir -p /usr/local/ganglia/lib64
ssh $i mkdir -p /usr/local/expat/lib
scp /etc/ganglia/gmond.conf $i:/etc/ganglia/
scp /etc/init.d/gmond $i:/etc/init.d/
scp -r /usr/local/ganglia/lib64/* $i:/usr/local/ganglia/lib64/
scp /usr/local/expat/lib/libexpat.so.1 $i:/usr/local/expat/lib/libexpat.so.1
scp /usr/lib64/libapr-1.so.0 $i:/usr/lib64/
</pre>
<p style="margin-top: 0px; margin-bottom: 0px; ">实际上就是将本机安装好(编译好)的动态链接库拷贝到其它机器上，使用如下命令拷贝即可</p>
<pre class="escaped" style="font-size: 0.9em; font-family: 'Lucida Console', 'Andale Mono', 'Courier New', Courier, monospace; line-height: 1.2em; margin-top: 2px; margin-bottom: 2px; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: dashed; border-right-style: dashed; border-bottom-style: dashed; border-left-style: dashed; border-color: initial; background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: #f9f9f9; overflow-x: auto; overflow-y: auto; border-top-left-radius: 5px 5px; border-top-right-radius: 5px 5px; border-bottom-right-radius: 5px 5px; border-bottom-left-radius: 5px 5px; padding-top: 5px; padding-right: 5px; padding-bottom: 5px; padding-left: 5px; margin-right: 2px; margin-left: 2px; background-position: initial initial; background-repeat: initial initial; ">sh deploy-ganglia.sh 10.1.11.2
</pre>
<div class="vspace" style="margin-top: 1.33em; "></div>
<h2 style="margin-top: 1em; margin-bottom: 0.6em; font-size: 1.44em; border-bottom-width: 2px; border-bottom-style: solid; border-bottom-color: #0097ff; padding-bottom: 2px; ">服务端的WEB配置</h2>
<p style="margin-top: 0px; margin-bottom: 0px; ">PHP程序需要依赖Apache来运行，因此需要安装如下依赖</p>
<pre class="escaped" style="font-size: 0.9em; font-family: 'Lucida Console', 'Andale Mono', 'Courier New', Courier, monospace; line-height: 1.2em; margin-top: 2px; margin-bottom: 2px; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: dashed; border-right-style: dashed; border-bottom-style: dashed; border-left-style: dashed; border-color: initial; background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: #f9f9f9; overflow-x: auto; overflow-y: auto; border-top-left-radius: 5px 5px; border-top-right-radius: 5px 5px; border-bottom-right-radius: 5px 5px; border-bottom-left-radius: 5px 5px; padding-top: 5px; padding-right: 5px; padding-bottom: 5px; padding-left: 5px; margin-right: 2px; margin-left: 2px; background-position: initial initial; background-repeat: initial initial; ">yum install php-common php-cli php php-gd httpd
</pre>
<p style="margin-top: 0px; margin-bottom: 0px; ">安装web程序，这里假定apache的root路径在/var/www/html下面。</p>
<pre class="escaped" style="font-size: 0.9em; font-family: 'Lucida Console', 'Andale Mono', 'Courier New', Courier, monospace; line-height: 1.2em; margin-top: 2px; margin-bottom: 2px; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: dashed; border-right-style: dashed; border-bottom-style: dashed; border-left-style: dashed; border-color: initial; background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: #f9f9f9; overflow-x: auto; overflow-y: auto; border-top-left-radius: 5px 5px; border-top-right-radius: 5px 5px; border-bottom-right-radius: 5px 5px; border-bottom-left-radius: 5px 5px; padding-top: 5px; padding-right: 5px; padding-bottom: 5px; padding-left: 5px; margin-right: 2px; margin-left: 2px; background-position: initial initial; background-repeat: initial initial; ">mkdir /var/www/html/ganglia
cp -a -f ganglia-3.2.0/web/* /var/www/html/ganglia
</pre>
<p style="margin-top: 0px; margin-bottom: 0px; ">禁用SELinux&nbsp;<code class="escaped" style="font-size: 0.9em; font-family: 'Lucida Console', 'Andale Mono', 'Courier New', Courier, monospace; white-space: nowrap; ">setenforce 0&nbsp;</code>修改rrdtool的路径，文件/var/www/html/ganglia/conf.php中的RRDTOOL</p>
<pre class="escaped" style="font-size: 0.9em; font-family: 'Lucida Console', 'Andale Mono', 'Courier New', Courier, monospace; line-height: 1.2em; margin-top: 2px; margin-bottom: 2px; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: dashed; border-right-style: dashed; border-bottom-style: dashed; border-left-style: dashed; border-color: initial; background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: #f9f9f9; overflow-x: auto; overflow-y: auto; border-top-left-radius: 5px 5px; border-top-right-radius: 5px 5px; border-bottom-right-radius: 5px 5px; border-bottom-left-radius: 5px 5px; padding-top: 5px; padding-right: 5px; padding-bottom: 5px; padding-left: 5px; margin-right: 2px; margin-left: 2px; background-position: initial initial; background-repeat: initial initial; ">define("RRDTOOL", "/usr/local/rrdtool/bin/rrdtool");
</pre>
<p style="margin-top: 0px; margin-bottom: 0px; ">重启httpd服务器即可看到效果&nbsp;<code class="escaped" style="font-size: 0.9em; font-family: 'Lucida Console', 'Andale Mono', 'Courier New', Courier, monospace; white-space: nowrap; ">service httpd restart<br />
<br />
</code></p>
</span><font face="'Lucida Console', 'Andale Mono', 'Courier New', Courier, monospace"><span style="line-height: 19px; white-space: nowrap;">更多参考 http://www.imxylz.info/wiki/Ganglia/Ganglia<br />
</span></font><img src ="http://www.blogjava.net/xylz/aggbug/354744.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xylz/" target="_blank">imxylz</a> 2011-07-21 00:34 <a href="http://www.blogjava.net/xylz/archive/2011/07/21/354744.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Crack JRebel 4.0，无需重启JVM，热部署解决方案</title><link>http://www.blogjava.net/xylz/archive/2011/06/12/352109.html</link><dc:creator>imxylz</dc:creator><author>imxylz</author><pubDate>Sat, 11 Jun 2011 16:24:00 GMT</pubDate><guid>http://www.blogjava.net/xylz/archive/2011/06/12/352109.html</guid><wfw:comment>http://www.blogjava.net/xylz/comments/352109.html</wfw:comment><comments>http://www.blogjava.net/xylz/archive/2011/06/12/352109.html#Feedback</comments><slash:comments>36</slash:comments><wfw:commentRss>http://www.blogjava.net/xylz/comments/commentRss/352109.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xylz/services/trackbacks/352109.html</trackback:ping><description><![CDATA[<span style="color: #0e774a; font-family: arial, sans-serif; line-height: 15px; font-size: small; "><span style="font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 16px; "><a href="http://dl.dropbox.com/u/22951342/jrebel.jar" target="_new" style="color: navy; text-decoration: none; ">http://dl.dropbox.com/u/22951342/jrebel.jar</a>&nbsp;&nbsp;</span>www.zeroturnaround.com</span>最近又接触到一点WEB应用，想到Resin服务器重启需要花费比较多的时间（Spring将WEB服务搞得越来越复杂，越来越臃肿了），所以又想到了08年那时候用JavaRebel了。一段时间不用人家居然改名为JavaRebel了。<br />如果不熟悉的可以搜索下JRebel/JavaRebel，这里是官方网站：<div style="display: inline-block; "></div><span class="Apple-style-span" style="color: #0e774a; font-family: arial, sans-serif; line-height: 15px; background-color: #ffffff; font-size: small; ">www.zeroturnaround.com。<br /></span>最近刚发布了4.0版本，功能更强大，配置也更加简单了。价格不菲。<br />官方提供30天试用版，可以先体验下再决定是否购买。<br /><br />看到里面的代码混淆让我很崩溃，没有深入研究混淆后的运行机制。比如下面居然有两个名称相同，参数相同，但是返回值不同的静态方法，不知是如何执行的。<br />public static void a(String s)和 public static String a(String)，以及<br />private static void c()和private static String c()。<br />猜测是在运行的时候自己进行JVM指令的执行。这样的代码反编译后都不知道怎么写回去，想到崩溃，因为两个方法居然都有地方调用了。<br /><br /><img src="http://www.blogjava.net/images/blogjava_net/xylz/jrebel-method.png" border="0" alt="" width="206" height="361" /><br /><br /><div><a href="http://my.oschina.net/zhangthe9" target="_blank">zhangthe9&nbsp;</a>提供了一个4.0的破解版，我很好奇，咨询了下，居然还是以前的RSA签名算法。</div><br />好吧，翻出08年写的JavaRebel 2.0-M1的破解程序，重新生成一个license文件，修改公钥，替换license文件，居然运行正常。这么多年了，签名算法和步骤居然一点都没变，嗯，人家真执着！<br />当然是无限制版，所有功能可用，也没有时间限制。<br /><br /><br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000; ">#############################################################<br /><br />&nbsp;JRebel&nbsp;</span><span style="color: #000000; ">4.0</span><span style="color: #000000; ">&nbsp;(</span><span style="color: #000000; ">201105311152</span><span style="color: #000000; ">)<br />&nbsp;&nbsp;&nbsp;with&nbsp;Enterprise&nbsp;Add</span><span style="color: #000000; ">-</span><span style="color: #000000; ">On</span><span style="color: #000000; ">!</span><span style="color: #000000; ">&nbsp;(see&nbsp;http:</span><span style="color: #008000; ">//</span><span style="color: #008000; ">jrebel.com/enterprise)</span><span style="color: #008000; "><br /></span><span style="color: #000000; ">&nbsp;(c)&nbsp;Copyright&nbsp;ZeroTurnaround&nbsp;OU,&nbsp;Estonia,&nbsp;Tartu.<br /><br />&nbsp;Over&nbsp;the&nbsp;last&nbsp;</span><span style="color: #000000; ">1</span><span style="color: #000000; ">&nbsp;days&nbsp;JRebel&nbsp;prevented&nbsp;<br />&nbsp;at&nbsp;least&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">&nbsp;redeploys</span><span style="color: #000000; ">/</span><span style="color: #000000; ">restarts&nbsp;saving&nbsp;you&nbsp;about&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">&nbsp;hours.<br /><br />&nbsp;This&nbsp;product&nbsp;is&nbsp;licensed&nbsp;to&nbsp;www.imxylz.info<br />&nbsp;</span><span style="color: #0000ff; background-color: yellow; ">for</span><span style="color: #000000; background-color: yellow; ">&nbsp;unlimited&nbsp;number&nbsp;of&nbsp;developer&nbsp;seats&nbsp;on&nbsp;site.</span><span style="color: #000000; "><br />&nbsp;</span><span style="color: #000000; ">==</span><span style="color: #000000; ">&nbsp;Cracked&nbsp;by&nbsp;imxylz&nbsp;(imxylz#gmail.com)&nbsp;from&nbsp;JavaRebel&nbsp;</span><span style="color: #000000; ">2.0</span><span style="color: #000000; ">-</span><span style="color: #000000; ">M1,&nbsp;</span><span style="color: #000000; ">2008</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">==</span><span style="color: #000000; "><br /><br />#############################################################<br /><br />伟大领袖毛主席，指引我们向前进！<br />jrebel&nbsp;cracked&nbsp;by&nbsp;imxylz<br />伟大领袖毛主席，指引我们向前进！<br />jrebel&nbsp;cracked&nbsp;by&nbsp;imxylz<br /></span><span style="color: #000000; background-color: yellow; ">JRebel:&nbsp;Reloading&nbsp;</span><span style="color: #0000ff; background-color: yellow; ">class</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; background-color: yellow; ">'</span><span style="color: #000000; background-color: yellow; ">ReloadClass</span><span style="color: #000000; background-color: yellow; ">'</span><span style="color: #000000; background-color: yellow; ">.change&nbsp;</span><span style="color: #000000; "><br />伟大领袖毛主席，指引我们向前进！<br /></span><span style="color: #0000FF; ">class</span><span style="color: #000000; ">!</span><span style="color: #000000; "><br /></span></div><br />破解思路很简单，替换公钥，使用自己私钥生成签名License文件。<br />如果想屏蔽版本更新提示，有以下几种思路：<br />（1）修改调用更新坚持的类（难道有点大，因为混淆比较严重，不容易反编译）<br />（2）修改更新服务器的地址，将<a href="http://update.zeroturnaround.com/jrebel/">http://update.zeroturnaround.com/jrebel/</a>地址修改，可以使用二进制工具直接修改字符串，比如我就将update改为updatt，无法解析域名就不能获取最新版本了。<br />（3）增加-Drebel.disable_update=true参数即可。（这种方法最简单）。<br /><br /><div style="text-align: left;"><strike>当然了，为了&#8220;保护知识产权&#8221;，不会将破解文件放出来，有需求的可以留言联系。（所谓的&#8220;计算机条例&#8221;是允许为了学习、研究而进行相关逆向工程的，哈哈）。</strike></div><br />好吧，架不住国人的热情，这里是下载地址，需要翻X，你懂得！<div style="display: inline-block; "></div><span class="Apple-style-span" style="font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 16px; background-color: #ffffff; "><a href="http://dl.dropbox.com/u/22951342/jrebel.jar" target="_new" style="color: navy; text-decoration: none; ">http://dl.dropbox.com/u/22951342/jrebel.jar</a>&nbsp;&nbsp;</span><br /><br />[关键字： JRebel, JavaRebel, JRebel Crack, JRebel License, JavaRebel License]<br /><img src ="http://www.blogjava.net/xylz/aggbug/352109.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xylz/" target="_blank">imxylz</a> 2011-06-12 00:24 <a href="http://www.blogjava.net/xylz/archive/2011/06/12/352109.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Subversion（SVN）自动展开关键字的方法</title><link>http://www.blogjava.net/xylz/archive/2011/04/12/348139.html</link><dc:creator>imxylz</dc:creator><author>imxylz</author><pubDate>Tue, 12 Apr 2011 06:02:00 GMT</pubDate><guid>http://www.blogjava.net/xylz/archive/2011/04/12/348139.html</guid><wfw:comment>http://www.blogjava.net/xylz/comments/348139.html</wfw:comment><comments>http://www.blogjava.net/xylz/archive/2011/04/12/348139.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xylz/comments/commentRss/348139.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xylz/services/trackbacks/348139.html</trackback:ping><description><![CDATA[<p style="margin-top: 0px; margin-bottom: 0px; font-family: Arial, Helvetica, sans-serif; font-size: 15px; line-height: 19px; "><strong>Subversion（SVN）自动展开关键字的方法</strong></p>
<h1 style="margin-top: 1em; margin-bottom: 0.6em; font-weight: normal; font-size: 1.8em; font-family: Arial, Helvetica, sans-serif; line-height: 19px; ">通用设置</h1>
<p style="margin-top: 0px; margin-bottom: 0px; font-family: Arial, Helvetica, sans-serif; font-size: 15px; line-height: 19px; ">在subversion的config文件中添加/修改如下一段：</p>
<span style="font-family: Arial, Helvetica, sans-serif; font-size: 15px; line-height: 19px; ">
<pre class="escaped" style="font-size: 0.9em; font-family: 'Lucida Console', 'Andale Mono', 'Courier New', Courier, monospace; line-height: 1.2em; margin-top: 0px; margin-bottom: 0px; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: dotted; border-right-style: dotted; border-bottom-style: dotted; border-left-style: dotted; border-color: initial; background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: #f9f9f9; background-position: initial initial; background-repeat: initial initial; ">[miscellany]
enable-auto-props = yes
[auto-props]
* = svn:keywords=LastChangedDate LastChangedRevision LastChangedBy Id Author Date Revision HeadURL;svn:eol-style=native</pre>
</span>
<h1 style="margin-top: 1em; margin-bottom: 0.6em; font-weight: normal; font-size: 1.8em; font-family: Arial, Helvetica, sans-serif; line-height: 19px; ">路径</h1>
<span style="font-family: Arial, Helvetica, sans-serif; font-size: 15px; line-height: 19px; ">
<pre class="escaped" style="font-size: 0.9em; font-family: 'Lucida Console', 'Andale Mono', 'Courier New', Courier, monospace; line-height: 1.2em; margin-top: 0px; margin-bottom: 0px; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: dotted; border-right-style: dotted; border-bottom-style: dotted; border-left-style: dotted; border-color: initial; background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: #f9f9f9; background-position: initial initial; background-repeat: initial initial; "> Windows: %APPDATA%\Subversion\config  %ALLUSERSPROFILE%\Application Data\Subversion\config
Unix/Linux: ~/var/lib/subversion/conf/    ~/.subversion/config    /etc/subversion/config</pre>
</span>
<h1 style="margin-top: 1em; margin-bottom: 0.6em; font-weight: normal; font-size: 1.8em; font-family: Arial, Helvetica, sans-serif; line-height: 19px; ">支持软件</h1>
<p style="margin-top: 0px; margin-bottom: 0px; font-family: Arial, Helvetica, sans-serif; font-size: 15px; line-height: 19px; ">This is also the place to look for the config file if you are using Windows, Eclipse and the Subclipse Plugin and using the JavaHL binding (probably also for the JavaSVN binding, but I did not test that).</p>
<h1 style="margin-top: 1em; margin-bottom: 0.6em; font-weight: normal; font-size: 1.8em; font-family: Arial, Helvetica, sans-serif; line-height: 19px; ">补充说明</h1>
<p style="margin-top: 0px; margin-bottom: 0px; font-family: Arial, Helvetica, sans-serif; font-size: 15px; line-height: 19px; ">如果已经存在的文件（如果之前没有开启关键字替换），那么再次更新也不会替换。也就是说仅仅对新添加的文件（开启此特性之后）的文件才有效。对于已经存在的文件，需要使用下面命令来生效。当然也可以使用subclipse的图形界面来操作。</p>
<span style="font-family: Arial, Helvetica, sans-serif; font-size: 15px; line-height: 19px; ">
<pre class="escaped" style="font-size: 0.9em; font-family: 'Lucida Console', 'Andale Mono', 'Courier New', Courier, monospace; line-height: 1.2em; margin-top: 0px; margin-bottom: 0px; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: dotted; border-right-style: dotted; border-bottom-style: dotted; border-left-style: dotted; border-color: initial; background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: #f9f9f9; background-position: initial initial; background-repeat: initial initial; ">svn propset svn:keywords "Id" &lt;file&gt;
</pre>
</span>
<p style="margin-top: 0px; margin-bottom: 0px; font-family: Arial, Helvetica, sans-serif; font-size: 15px; line-height: 19px; ">原文说明</p>
<span style="font-family: Arial, Helvetica, sans-serif; font-size: 15px; line-height: 19px; ">
<pre class="escaped" style="font-size: 0.9em; font-family: 'Lucida Console', 'Andale Mono', 'Courier New', Courier, monospace; line-height: 1.2em; margin-top: 0px; margin-bottom: 0px; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: dotted; border-right-style: dotted; border-bottom-style: dotted; border-left-style: dotted; border-color: initial; background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: #f9f9f9; background-position: initial initial; background-repeat: initial initial; ">### Set enable-auto-props to 'yes' to enable automatic properties
### for 'svn add' and 'svn import', it defaults to 'no'.
### Automatic properties are defined in the section 'auto-props'.
enable-auto-props = yes
</pre>
</span>
<p class="vspace" style="margin-top: 1.33em; margin-bottom: 0px; font-family: Arial, Helvetica, sans-serif; font-size: 15px; line-height: 19px; ">参考地址</p>
<hr style="font-family: Arial, Helvetica, sans-serif; font-size: 15px; line-height: 19px; " />
<ul style="margin-top: 0px; margin-bottom: 0px; font-family: Arial, Helvetica, sans-serif; font-size: 15px; line-height: 19px; ">
    <li><a class="urllink" href="http://blog.gorges.us/2009/03/how-to-enable-keywords-in-eclipse-and-subversion-svn/" rel="nofollow" style="text-decoration: none; ">http://blog.gorges.us/2009/03/how-to-enable-keywords-in-eclipse-and-subversion-svn/</a></li>
    <li><a class="urllink" href="http://islandlinux.org/howto/enable-auto-properties-auto-props-subversion-subclipse-eclipse" rel="nofollow" style="text-decoration: none; ">http://islandlinux.org/howto/enable-auto-properties-auto-props-subversion-subclipse-eclipse</a></li>
    <li><a class="urllink" href="http://codex.gallery2.org/Gallery:Using_Subversion" rel="nofollow" style="text-decoration: none; ">http://codex.gallery2.org/Gallery:Using_Subversion</a></li>
</ul><img src ="http://www.blogjava.net/xylz/aggbug/348139.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xylz/" target="_blank">imxylz</a> 2011-04-12 14:02 <a href="http://www.blogjava.net/xylz/archive/2011/04/12/348139.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java常见疑惑和陷阱（PPT）</title><link>http://www.blogjava.net/xylz/archive/2010/12/03/339722.html</link><dc:creator>imxylz</dc:creator><author>imxylz</author><pubDate>Fri, 03 Dec 2010 08:13:00 GMT</pubDate><guid>http://www.blogjava.net/xylz/archive/2010/12/03/339722.html</guid><wfw:comment>http://www.blogjava.net/xylz/comments/339722.html</wfw:comment><comments>http://www.blogjava.net/xylz/archive/2010/12/03/339722.html#Feedback</comments><slash:comments>7</slash:comments><wfw:commentRss>http://www.blogjava.net/xylz/comments/commentRss/339722.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xylz/services/trackbacks/339722.html</trackback:ping><description><![CDATA[本来是打算小范围内讨论的，话题也比较小，后来听说人多了，临时拼凑些材料。话题过大后重点就放在讲解上，其实这里面讲解的东东还是挺多的。以后有时间会将并发完整整理一次。<br />
<br />
<br />
<br />
<div style="width: 425px;" id="__ss_6013919"><strong style="display: block; margin: 12px 0pt 4px;"><a href="http://www.slideshare.net/xylz/java-6013919" title="Java常见疑惑和陷阱">Java常见疑惑和陷阱</a></strong><object id="__sse6013919" width="425" height="355">
<param name="movie" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=java-101203020649-phpapp02&stripped_title=java-6013919&userName=xylz" />
<param name="allowFullScreen" value="true"/>
<param name="allowScriptAccess" value="always"/><embed name="__sse6013919" src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=java-101203020649-phpapp02&stripped_title=java-6013919&userName=xylz" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="355"></embed></object>
<div style="padding: 5px 0pt 12px;">View more <a href="http://www.slideshare.net/">presentations</a> from <a href="http://www.slideshare.net/xylz">xylz</a>.</div>
</div><img src ="http://www.blogjava.net/xylz/aggbug/339722.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xylz/" target="_blank">imxylz</a> 2010-12-03 16:13 <a href="http://www.blogjava.net/xylz/archive/2010/12/03/339722.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>关于Java面试个人不得不说的一些事</title><link>http://www.blogjava.net/xylz/archive/2010/11/24/338917.html</link><dc:creator>imxylz</dc:creator><author>imxylz</author><pubDate>Wed, 24 Nov 2010 06:34:00 GMT</pubDate><guid>http://www.blogjava.net/xylz/archive/2010/11/24/338917.html</guid><wfw:comment>http://www.blogjava.net/xylz/comments/338917.html</wfw:comment><comments>http://www.blogjava.net/xylz/archive/2010/11/24/338917.html#Feedback</comments><slash:comments>16</slash:comments><wfw:commentRss>http://www.blogjava.net/xylz/comments/commentRss/338917.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xylz/services/trackbacks/338917.html</trackback:ping><description><![CDATA[上次发了一个<a href="http://www.blogjava.net/xylz/archive/2010/11/02/336813.html" target="_blank">招聘的需求</a>，陆陆续续收到了大约20来封简历。由于最近一个多月在杭州出差，所以没有电话面试，基本上都是觉得简历上写的差不多的都推荐面试了。回来后我也面试了几个，说说我的感受。
<div>我一直觉得我个人不是一个特别挑剔的人，但是也希望能够找到一些技术非常牛的人。很多有经验（工作几年）的同学会说自己非常不错，希望给一个机会。其实我对所有人一视同仁，基本上要求都很低。</div>
<div>经验多的希望有一些深度或者广度的积累。比如说某些领域非常专注/专业，或者说在整体上有非常全面的认识和了解。工作时间长了就需要有一定的积累，不然怎么能够突出自己的特点呢？做互联网的就需要对性能、并发、分布式等专业领域有一些了解或者研究，哪怕有一些心得也不错。做企业开发的就需要对行业、稳定性、工具、理论等有些独有的理解，哪怕很初级、幼稚也行。具体点怎么说，比如你每天都是用struts/spring/hibernate/ibatis等等，那么对这些原理是否了解？背后的思想是否了解？业界的认识和评测、比较是否了解？而不是仅仅知道怎么调用API，这远远不够。如果能够研究下源码，写一个类似的系统就更好了。说白了就是能够透过工具/技术本身发现一些规律或者说认识，剩下来的就是积累，也就是我们通常说的经验。还有一个方面就是对行业趋势的了解。技术不能够仅仅关注于技术本身，还需要对业绩的动态、趋势有些关注，这样才能不至于技术不断的更新而落后。这并不是说总是去追求新技术、新软件、新工具等，而是关注行业本身的发展。另外还有一个很重要的经验积累，那就是解决问题的能力。很多同学同时觉得自己做了很多事情，但是让他说一两点比较突出的事情，就说不出来了，总是归结于事情本身比较简单，没有更多的发现和挖掘。其实有时候面试的人只需要了解当初解决问题的过程就行，从中发现个人在里面做了什么、怎么做、收获了什么。这就是经验的积累。企业归根结底是需要员工作做贡献的，因此需要有经验的人来帮助解决问题，那么曾经解决问题的能力和思路就很重要了。</div>
<div>对于没有多少经验的同学，比如刚毕业或者实习生等，那么就需要基础很好，然后有一些个人的认识。这些经验少的同学一般面试者都不会为难他们，只需要把知道的、认识到的告诉面试者就行了，从而让面试者能够看到发展的潜力。很多人还是喜欢培养那些有发展潜力的同学，这些同学的进步都是非常迅速的。</div>
<div>我个人总结其实只有一点，那就是要有&#8220;亮点&#8221;。说白了就是有自己独特的认识和理解等才能在众多差不多的同学中脱颖而出。既然不能做全才，那么就做&#8220;专才&#8221;。</div>
<div>这里仍然做一个广告，只要认为自己可以，仍然可以发简历给我，人才是永远的需求。<span  style="color: #333333; font-family: arial; font-size: 12px; "><a id="Editor_Results_rprSelectionList_ctl04_Hyperlink1" class="titlelink" href="http://www.blogjava.net/xylz/archive/2010/11/02/336813.html" style="color: black; background: inherit; font-size: 12px; font-family: Arial; font-weight: normal; "><em></em></a></span><a href="http://www.blogjava.net/xylz/archive/2010/11/02/336813.html" target="_blank"><em><u>淘宝(北京)招聘高级JAVA开发工程师</u></em></a></div>
<div><br />
</div><img src ="http://www.blogjava.net/xylz/aggbug/338917.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xylz/" target="_blank">imxylz</a> 2010-11-24 14:34 <a href="http://www.blogjava.net/xylz/archive/2010/11/24/338917.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Mysql replace into 与 insert into on duplicate key update 的区别</title><link>http://www.blogjava.net/xylz/archive/2010/06/23/324242.html</link><dc:creator>imxylz</dc:creator><author>imxylz</author><pubDate>Wed, 23 Jun 2010 02:46:00 GMT</pubDate><guid>http://www.blogjava.net/xylz/archive/2010/06/23/324242.html</guid><wfw:comment>http://www.blogjava.net/xylz/comments/324242.html</wfw:comment><comments>http://www.blogjava.net/xylz/archive/2010/06/23/324242.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xylz/comments/commentRss/324242.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xylz/services/trackbacks/324242.html</trackback:ping><description><![CDATA[这两种方式的作用是如果数据库中存在记录就更新，否则就插入新记录，但是在使用上也是有一点区别的，<a href="http://www.imxylz.info/wiki/index.php?n=Mysql.Replace" target="_blank"><strong>原文在此</strong></a>。<br />
<br />
<span style="widows: 2; text-transform: none; text-indent: 0px; border-collapse: separate; font: medium Simsun; white-space: normal; orphans: 2; letter-spacing: normal; color: rgb(0,0,0); word-spacing: 0px; -webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; -webkit-text-decorations-in-effect: none; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px" class="Apple-style-span"><span style="line-height: 19px; font-family: Arial, Helvetica, sans-serif; font-size: 15px" class="Apple-style-span">
<p style="margin-top: 1.33em; margin-bottom: 0px" class="vspace"><strong>总结如下：</strong></p>
<ol style="margin-top: 0px; margin-bottom: 0px">
    <li>如果表中不存在主键记录，replace和insert*update都与insert是一样的特点。</li>
    <li>如果表中存在主键记录，replace相当于执行delete 和 insert两条操作，而insert*update的相当于执行if exist do update else do insert操作。因此，如果replace填充的字段不全，则会导致未被更新的字段都会修改为默认值，并且如果有自增id的话，自增id会变化为最新的值（这样如果是以自增id为标志的话可能导致记录丢失）；而insert*update只是更新部分字段，对于未被更新的字段不会变化（不会强制修改为默认值）。</li>
</ol>
</span></span><img src ="http://www.blogjava.net/xylz/aggbug/324242.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xylz/" target="_blank">imxylz</a> 2010-06-23 10:46 <a href="http://www.blogjava.net/xylz/archive/2010/06/23/324242.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java到底占用多大内存？</title><link>http://www.blogjava.net/xylz/archive/2009/12/23/307069.html</link><dc:creator>imxylz</dc:creator><author>imxylz</author><pubDate>Wed, 23 Dec 2009 11:51:00 GMT</pubDate><guid>http://www.blogjava.net/xylz/archive/2009/12/23/307069.html</guid><wfw:comment>http://www.blogjava.net/xylz/comments/307069.html</wfw:comment><comments>http://www.blogjava.net/xylz/archive/2009/12/23/307069.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/xylz/comments/commentRss/307069.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xylz/services/trackbacks/307069.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 在我们64位的CenterOS上，指定了JVM的最大堆内存为5500M，但是在top和进程status中可以看到实际占用内存已经远远大于5500M，那么JVM到底占用多大内存？如果做到控制JVM的占用内存大小？&nbsp;&nbsp;<a href='http://www.blogjava.net/xylz/archive/2009/12/23/307069.html'>阅读全文</a><img src ="http://www.blogjava.net/xylz/aggbug/307069.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xylz/" target="_blank">imxylz</a> 2009-12-23 19:51 <a href="http://www.blogjava.net/xylz/archive/2009/12/23/307069.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>单例模式完全解析</title><link>http://www.blogjava.net/xylz/archive/2009/12/18/306622.html</link><dc:creator>imxylz</dc:creator><author>imxylz</author><pubDate>Fri, 18 Dec 2009 15:15:00 GMT</pubDate><guid>http://www.blogjava.net/xylz/archive/2009/12/18/306622.html</guid><wfw:comment>http://www.blogjava.net/xylz/comments/306622.html</wfw:comment><comments>http://www.blogjava.net/xylz/archive/2009/12/18/306622.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.blogjava.net/xylz/comments/commentRss/306622.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xylz/services/trackbacks/306622.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 本文将探讨单例模式的各种情况，并给出相应的建议。<br>单例模式应该是设计模式中比较简单的一个，但是在多线程并发的环境下使用却是不那么简单了。<br>本文将探讨在多线程下静态域单例模式、双重检查锁机制、类延时加载、同步锁等机制的相关技术问题。&nbsp;&nbsp;<a href='http://www.blogjava.net/xylz/archive/2009/12/18/306622.html'>阅读全文</a><img src ="http://www.blogjava.net/xylz/aggbug/306622.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xylz/" target="_blank">imxylz</a> 2009-12-18 23:15 <a href="http://www.blogjava.net/xylz/archive/2009/12/18/306622.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>HashMap的读写并发</title><link>http://www.blogjava.net/xylz/archive/2009/12/18/306602.html</link><dc:creator>imxylz</dc:creator><author>imxylz</author><pubDate>Fri, 18 Dec 2009 10:20:00 GMT</pubDate><guid>http://www.blogjava.net/xylz/archive/2009/12/18/306602.html</guid><wfw:comment>http://www.blogjava.net/xylz/comments/306602.html</wfw:comment><comments>http://www.blogjava.net/xylz/archive/2009/12/18/306602.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/xylz/comments/commentRss/306602.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xylz/services/trackbacks/306602.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 大家都知道HashMap不是线程安全的，但是大家的理解可能都不是十分准确。很显然读写同一个key会导致不一致大家都能理解，但是如果读写一个总是存在HashMap中且不变的对象会有问题么？我们来试试看。&nbsp;&nbsp;<a href='http://www.blogjava.net/xylz/archive/2009/12/18/306602.html'>阅读全文</a><img src ="http://www.blogjava.net/xylz/aggbug/306602.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xylz/" target="_blank">imxylz</a> 2009-12-18 18:20 <a href="http://www.blogjava.net/xylz/archive/2009/12/18/306602.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>邪恶的网络</title><link>http://www.blogjava.net/xylz/archive/2009/11/14/302375.html</link><dc:creator>imxylz</dc:creator><author>imxylz</author><pubDate>Sat, 14 Nov 2009 14:25:00 GMT</pubDate><guid>http://www.blogjava.net/xylz/archive/2009/11/14/302375.html</guid><wfw:comment>http://www.blogjava.net/xylz/comments/302375.html</wfw:comment><comments>http://www.blogjava.net/xylz/archive/2009/11/14/302375.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xylz/comments/commentRss/302375.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xylz/services/trackbacks/302375.html</trackback:ping><description><![CDATA[网络是邪恶的么？每次使用google搜索，没有注意某些搜索出来的网站地址而点击了，结果很不幸，整个google服务的连通都挂了。我一直没有明白为什么，因为这种情况出现的可能性大概是1/10，而且1分钟后就立刻恢复了，所以大部分的时候也没有在意，今
天也搜索了一些关于在windows 7下使用openvpn的问题，因为我一直没有解决在Windows
7下使用OpenVPN连接公司网络的问题。很不幸点了一个blogspot的地址，结果google服务立刻就断开了。然后等了1分钟，google服
务恢复后再点击此地址，google服务仍然不可用，显然google服务的断开与此地址有关，因为点击其它的地址却没有问题。好了基本知道为什么服务被
断开了，很显然后面的G（E&lt;?&lt;G)W屏蔽了地址顺便把我的网络服务也给断开了。至少目前我认为只有这种可能性。首先互联网是无状态，也就
是互联网是独立的，与任何组织和个人应该都无关，因此也就无所谓正义与邪恶之分了。其次互联网只是工具，不同的人的不同使用方法会导致千奇百怪的结果，但
是不能因此认为此工具就是邪恶的。核能的发明不代表就是错误的。最后不能因为互联网上某些不&#8220;三水可&#8221;谐的东西就把所有用户的访问都可封闭，这种以偏概
全，一板砖拍死的行为是不可取的。最近再看《明朝那些事儿》第三遍，显然美好、正义的东西是不能被扑灭的，历史是不能掩盖的。更多的话就不能再说了，不然
我的这个小站很快就会被&#8220;三水可&#8221;谐掉的，而我本人可能就有某些不想看到的事情发生了，所以就此打住。<img src ="http://www.blogjava.net/xylz/aggbug/302375.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xylz/" target="_blank">imxylz</a> 2009-11-14 22:25 <a href="http://www.blogjava.net/xylz/archive/2009/11/14/302375.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>