<?xml version="1.0" encoding="utf-8"?><?xml-stylesheet href='http://feed.feedsky.com/styles/podcast2.xsl' type='text/xsl' ?><!--这是一个由Feedsy提供技术支持的Feed，为了提高读者阅读的体验，以及满足用户美化自己Feed的需要，我们设计了多种精美的Feed模板，提供给大家选择，所有最终呈现出来的样式，皆由用户自愿选择使用，未经许可，任何团体和个人，请不要擅自修改样式或者盗用，这是对于用户选择权的尊重。--><rss xmlns:atom="http://www.w3.org/2005/Atom" xmlns:fs="http://www.feedsky.com/namespace/feed" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:dc="http://purl.org/dc/elements/1.1/" version="2.0"><channel><atom:link href="http://feed.feedsky.com/uini" type="application/rss+xml" rel="self"></atom:link><fs:self_link href="http://feed.feedsky.com/uini" type="application/rss+xml"></fs:self_link><lastBuildDate>Tue, 14 Feb 2012 08:45:30 GMT</lastBuildDate><title>传播、沟通、分享</title><description>一直“有你”</description><link>http://www.uini.net</link><sy:updatePeriod>hourly</sy:updatePeriod><sy:updateFrequency>1</sy:updateFrequency><language>en</language><pubDate>Tue, 14 Feb 2012 08:45:30 GMT</pubDate><item><title>FFmpegPHP ffmpeg的PHP封装</title><link>http://item.feedsky.com/~feedsky/uini/~8195296/605632904/6299073/1/item.html</link><content:encoded>&lt;p&gt;FFmpegPHP 是一个纯面向对象的 &lt;a href=&quot;http://www.oschina.net/p/ffmpeg&quot;&gt;ffmpeg&lt;/a&gt; 的 PHP封装。提供一些简单易用、面向对象的API用以访问视频和音频文件的信息，可直接从视频中获取帧的图片，这常用来做视频的缩略图。支持的视频格式包括： MOV, AVI, MPG, 和 WMV.&lt;/p&gt;
&lt;div id=&quot;OSChina_News_25588&quot;&gt;
&lt;p&gt;FFmpegPHP 2.6 发布了，该版本移除了 PHP 结束标签，支持最新版的 ffmpeg 以及其他小问题的修复和改进。&lt;/p&gt;
&lt;p&gt;FFmpegPHP 是一个纯面向对象的 &lt;a href=&quot;http://www.oschina.net/p/ffmpeg&quot;&gt;ffmpeg&lt;/a&gt; 的 PHP封装。提供一些简单易用、面向对象的API用以访问视频和音频文件的信息，可直接从视频中获取帧的图片，这常用来做视频的缩略图。支持的视频格式包括： MOV, AVI, MPG, 和 WMV.&lt;/p&gt;
&lt;p&gt;更多关于&lt;a href=&quot;http://www.oschina.net/p/ffmpegphp&quot;&gt;FFmpegPHP&lt;/a&gt;的详细信息，或者下载地址请点&lt;a href=&quot;http://www.oschina.net/action/project/go?id=12728&amp;amp;p=download&quot;&gt;这里&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div  class=&quot;related_post_title&quot;&gt;&lt;h4 style=\&quot;font-size:14px;color:#EEEEEE;\&quot;&gt;推荐阅读&lt;/h4&gt;&lt;style&gt;.related_post li{padding-top:10px !important;}&lt;/style&gt;&lt;/div&gt;&lt;ul class=&quot;related_post&quot;&gt;&lt;li&gt;&lt;a href=&quot;http://www.uini.net/2010/11/ffmpegphp.html&quot; title=&quot;FFmpegPHP&quot;&gt;FFmpegPHP&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://www.uini.net/2010/05/php-type-conversion-related-to-a-bug.html&quot; title=&quot;PHP类型转换相关的一个Bug&quot;&gt;PHP类型转换相关的一个Bug&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://www.uini.net/2011/11/php-interface-to-solr-solarium.html&quot; title=&quot;Solr的PHP接口 Solarium&quot;&gt;Solr的PHP接口 Solarium&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://www.uini.net/2011/10/online-barrage-player-abplayer.html&quot; title=&quot;在线弹幕播放器 ABPlayer&quot;&gt;在线弹幕播放器 ABPlayer&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://www.uini.net/2011/10/let-json-know-better-chinese-json_unescaped_unicode.html&quot; title=&quot;让Json更懂中文(JSON_UNESCAPED_UNICODE) &quot;&gt;让Json更懂中文(JSON_UNESCAPED_UNICODE) &lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;img src=&quot;http://www1.feedsky.com/t1/605632904/uini/feedsky/s.gif?r=http://item.feedsky.com/~feedsky/uini/~8195296/605632904/6299073/1/item.html&quot; border=&quot;0&quot; height=&quot;0&quot; width=&quot;0&quot; style=&quot;position:absolute&quot; /&gt;</content:encoded><wfw:commentRss>http://www.uini.net/2012/02/ffmpegphp-ffmpeg-php-package.html/feed</wfw:commentRss><slash:comments>0</slash:comments><description>FFmpegPHP 是一个纯面向对象的 ffmpeg 的 PHP封装。提供一些简单易用、面向对象的API用以访问视频和音频文件的信息，可直接从视频中获取帧的图片，这常用来做视频的缩略图。支持的视频格式包括： MOV, AVI, MPG, 和 WMV.

FFmpegPHP 2.6 发布了，该版本移除了 PHP 结束标签，支持最新版的 ffmpeg 以及其他小问题的修复和改进。
FFmpegPHP 是一个纯面向对象的 ffmpeg 的 PHP封装。提供一些简单易用、面向对象的API用以访问视频和音频文件的信息，可直接从视频中获取帧的图片，这常用来做视频的缩略图。支持的视频格式包括： MOV, AVI, MPG, 和 WMV.
更多关于FFmpegPHP的详细信息，或者下载地址请点这里

推荐阅读.related_post li{padding-top:10px !important;}FFmpegPHPPHP类型转换相关的一个BugSolr的PHP接口 Solarium在线弹幕播放器 ABPlayer让Json更懂中文(JSON_UNESCAPED_UNICODE)&lt;img src=&quot;http://www1.feedsky.com/t1/605632904/uini/feedsky/s.gif?r=http://item.feedsky.com/~feedsky/uini/~8195296/605632904/6299073/1/item.html&quot; border=&quot;0&quot; height=&quot;0&quot; width=&quot;0&quot; style=&quot;position:absolute&quot; /&gt;</description><category>linux</category><category>视频</category><category>php</category><category>FFmpeg</category><category>转换</category><pubDate>Tue, 14 Feb 2012 16:45:30 +0800</pubDate><author>nick</author><comments>http://www.uini.net/2012/02/ffmpegphp-ffmpeg-php-package.html#comments</comments><guid isPermaLink="false">http://www.uini.net/?p=1878</guid><dc:creator>nick</dc:creator><fs:srclink>http://www.uini.net/2012/02/ffmpegphp-ffmpeg-php-package.html</fs:srclink><fs:srcfeed>http://www.uini.net/feed</fs:srcfeed><fs:itemid>feedsky/uini/~8195296/605632904/6299073</fs:itemid></item><item><title>基于开源Flash Server：Red5构建RTMP流媒体播放平台[转发]</title><link>http://item.feedsky.com/~feedsky/uini/~8195296/603763412/6299073/1/item.html</link><content:encoded>&lt;p&gt;[文章作者：张宴 本文版本：v1.0 最后修改：2009.04.13 转载请注明原文链接：&lt;a href=&quot;http://blog.s135.com/post/409/&quot; target=&quot;_blank&quot;&gt;http://blog.s135.com/post/409/&lt;/a&gt;]&lt;/p&gt;
&lt;p&gt;上周五，我们基于开源Flash Server：Red5（&lt;a href=&quot;http://osflash.org/red5&quot; target=&quot;_blank&quot;&gt;http://osflash.org/red5&lt;/a&gt;）的Flash流媒体服务平台上线，内容涉及视频上传、视频分发、调用接口、Flash播放器等。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;一、Flash RTMP流媒体播放演示&lt;/strong&gt;（播放时进度条可以自由拖动）：&lt;/p&gt;
&lt;p&gt;生产环境更多 Flash RTMP 流媒体视频演示：&lt;a href=&quot;http://jx3.xoyo.com/xgxz/video/&quot; target=&quot;_blank&quot;&gt;http://jx3.xoyo.com/xgxz/video/&lt;/a&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;strong&gt;二、安装步骤简要说明：&lt;/strong&gt;&lt;br /&gt;
①、安装JDK&lt;br /&gt;
打开&lt;a href=&quot;http://java.sun.com/javase/downloads/&quot; target=&quot;_blank&quot;&gt;http://java.sun.com/javase/downloads/&lt;/a&gt;，下载最新的Java SE Development Kit (JDK)，安装在/usr/local/jdk/下。&lt;/p&gt;
&lt;div&gt;chmod +x jdk-6u13-linux-i586.bin&lt;br /&gt;
./jdk-6u13-linux-i586.bin&lt;/div&gt;
&lt;p&gt;②、安装Red5&lt;br /&gt;
打开&lt;a href=&quot;http://osflash.org/red5/070final&quot; target=&quot;_blank&quot;&gt;http://osflash.org/red5/070final&lt;/a&gt;，下载red5-0.7.0.tar.gz，解压缩后执行./red5.sh，然后访问&lt;a href=&quot;http://yourdomain:5080/&quot; target=&quot;_blank&quot;&gt;http://yourdomain:5080/&lt;/a&gt;，有演示。&lt;/p&gt;
&lt;hr /&gt;
&lt;strong&gt;三、服务器带宽消耗比较：&lt;/strong&gt;&lt;br /&gt;
①、客户端 1.5M ADSL 环境，HTTP 方式播放单个视频，服务器所消耗的带宽：&lt;/p&gt;
&lt;div&gt;[root@localhost ~]# ./net.sh eth0 1&lt;br /&gt;
IN: 3318 Byte/s OUT: 259984 Byte/s&lt;br /&gt;
IN: 3486 Byte/s OUT: 249470 Byte/s&lt;br /&gt;
IN: 3332 Byte/s OUT: 259984 Byte/s&lt;br /&gt;
IN: 3090 Byte/s OUT: 252528 Byte/s&lt;br /&gt;
IN: 3000 Byte/s OUT: 252474 Byte/s&lt;br /&gt;
IN: 3000 Byte/s OUT: 253976 Byte/s&lt;br /&gt;
IN: 2940 Byte/s OUT: 255478 Byte/s&lt;br /&gt;
IN: 3004 Byte/s OUT: 252474 Byte/s&lt;br /&gt;
IN: 3452 Byte/s OUT: 252528 Byte/s&lt;br /&gt;
IN: 3270 Byte/s OUT: 260038 Byte/s&lt;br /&gt;
IN: 3586 Byte/s OUT: 252474 Byte/s&lt;/div&gt;
&lt;p&gt;②、客户端 1.5M ADSL 环境，RTMP 流媒体方式播放单个视频，服务器所消耗的带宽：&lt;/p&gt;
&lt;div&gt;[root@localhost ~]# ./net.sh eth0 1&lt;br /&gt;
IN: 3900 Byte/s OUT: 27878 Byte/s&lt;br /&gt;
IN: 4200 Byte/s OUT: 30868 Byte/s&lt;br /&gt;
IN: 4380 Byte/s OUT: 27801 Byte/s&lt;br /&gt;
IN: 4080 Byte/s OUT: 29965 Byte/s&lt;br /&gt;
IN: 4080 Byte/s OUT: 26450 Byte/s&lt;br /&gt;
IN: 3960 Byte/s OUT: 27143 Byte/s&lt;br /&gt;
IN: 3000 Byte/s OUT: 10061 Byte/s&lt;br /&gt;
IN: 3960 Byte/s OUT: 16166 Byte/s&lt;br /&gt;
IN: 3660 Byte/s OUT: 26480 Byte/s&lt;br /&gt;
IN: 4020 Byte/s OUT: 23127 Byte/s&lt;/div&gt;
&lt;p&gt;HTTP 方式播放，如果服务器端不限速，客户端的带宽越大，服务器消耗的带宽也越大，但限速又会影响用户体验；&lt;br /&gt;
RTMP 流媒体方式播放，只要客户端达到最低带宽要求，不管客户端的带宽如何，服务器消耗的带宽都一样。&lt;/p&gt;
&lt;p&gt;如果播放10M以内大小的视频，HTTP 能够在较短的时间内下载完视频，能够降低并发观看用户数；&lt;br /&gt;
如果播放10M以上大小的视频，RTMP 要比 HTTP 方式节省不少带宽。&lt;/p&gt;
&lt;p&gt;RTMP 播放时进度条可以自由拖动，虽然Lighttpd和Nginx目前也可以使用somevideo.flv?start=xxx的方式从指定位置下载视频，但还是不如 RTMP 灵活。&lt;br /&gt;
&lt;a name=&quot;entrymore&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;strong&gt;四、带宽测试Shell脚本（net.sh）：&lt;/strong&gt;&lt;/p&gt;
&lt;div&gt;#!/bin/bash&lt;/p&gt;
&lt;p&gt;# test network width&lt;/p&gt;
&lt;p&gt;function usage&lt;/p&gt;
&lt;p&gt;{&lt;/p&gt;
&lt;p&gt;echo &amp;#8220;Usage: $0  &amp;#8221;&lt;/p&gt;
&lt;p&gt;echo &amp;#8220;    e.g. $0 eth0 2&amp;#8243;&lt;/p&gt;
&lt;p&gt;exit 65&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;p&gt;if [ $# -lt 2 ];then&lt;br /&gt;
usage&lt;br /&gt;
fi&lt;br /&gt;
typeset in in_old dif_in&lt;br /&gt;
typeset out out_old dif_out&lt;br /&gt;
typeset timer&lt;br /&gt;
typeset eth&lt;/p&gt;
&lt;p&gt;eth=$1&lt;br /&gt;
timer=$2&lt;/p&gt;
&lt;p&gt;in_old=$(cat /proc/net/dev | grep $eth | sed -e &amp;#8220;s/\(.*\)\:\(.*\)/\2/g&amp;#8221; | awk &amp;#8216; { print $1 }&amp;#8217; )&lt;br id=&quot;__mce&quot; /&gt;out_old=$(cat /proc/net/dev | grep $eth | sed -e &amp;#8220;s/\(.*\)\:\(.*\)/\2/g&amp;#8221; | awk &amp;#8216; { print $9 }&amp;#8217; )&lt;/p&gt;
&lt;p&gt;while true&lt;br /&gt;
do&lt;br /&gt;
sleep ${timer}&lt;br /&gt;
in=$(cat /proc/net/dev | grep $eth | sed -e &amp;#8220;s/\(.*\)\:\(.*\)/\2/g&amp;#8221; | awk &amp;#8216; { print $1 }&amp;#8217; )&lt;br /&gt;
out=$(cat /proc/net/dev | grep $eth | sed -e &amp;#8220;s/\(.*\)\:\(.*\)/\2/g&amp;#8221; | awk &amp;#8216; { print $9 }&amp;#8217; )&lt;br /&gt;
dif_in=$(((in-in_old)/timer))&lt;br /&gt;
dif_out=$(((out-out_old)/timer))&lt;br /&gt;
echo &amp;#8220;IN: ${dif_in} Byte/s OUT: ${dif_out} Byte/s&amp;#8221;&lt;br /&gt;
in_old=${in}&lt;br /&gt;
out_old=${out}&lt;br /&gt;
done&lt;br /&gt;
exit 0&lt;/p&gt;&lt;/div&gt;
&lt;div  class=&quot;related_post_title&quot;&gt;&lt;h4 style=\&quot;font-size:14px;color:#EEEEEE;\&quot;&gt;推荐阅读&lt;/h4&gt;&lt;style&gt;.related_post li{padding-top:10px !important;}&lt;/style&gt;&lt;/div&gt;&lt;ul class=&quot;related_post&quot;&gt;&lt;li&gt;&lt;a href=&quot;http://www.uini.net/2010/09/as3-communication-under-red5-sharedobject.html&quot; title=&quot;As3下的通信(Red5、SharedObject)&quot;&gt;As3下的通信(Red5、SharedObject)&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://www.uini.net/2010/09/red5-streaming-media-server-and-as-another-example-of-calling-the-method-im.html&quot; title=&quot;red5流媒体服务器和as互相调用方法的例子（聊天室）&quot;&gt;red5流媒体服务器和as互相调用方法的例子（聊天室）&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://www.uini.net/2011/08/nginx-flv-video-servers-and-set-up-under-the-video-player-drag-the-progress-bar.html&quot; title=&quot;Nginx下搭建flv视频服务器且支持视频拖动进度条播放&quot;&gt;Nginx下搭建flv视频服务器且支持视频拖动进度条播放&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://www.uini.net/2010/11/system-monitor-api-call-winapioverride32.html&quot; title=&quot;系统API调用监控 WinAPIOverride32&quot;&gt;系统API调用监控 WinAPIOverride32&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://www.uini.net/2010/10/fcs-fms-tutorial-serial-switched-century-fleeting.html&quot; title=&quot;FCS/FMS教程连载[转自世纪流年] &quot;&gt;FCS/FMS教程连载[转自世纪流年] &lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;img src=&quot;http://www1.feedsky.com/t1/603763412/uini/feedsky/s.gif?r=http://item.feedsky.com/~feedsky/uini/~8195296/603763412/6299073/1/item.html&quot; border=&quot;0&quot; height=&quot;0&quot; width=&quot;0&quot; style=&quot;position:absolute&quot; /&gt;</content:encoded><wfw:commentRss>http://www.uini.net/2012/02/based-on-open-source-the-flash-server-red5-build-rtmp-streaming-media-player-platform-forwarded.html/feed</wfw:commentRss><slash:comments>0</slash:comments><description>[文章作者：张宴 本文版本：v1.0 最后修改：2009.04.13 转载请注明原文链接：http://blog.s135.com/post/409/]
上周五，我们基于开源Flash Server：Red5（http://osflash.org/red5）的Flash流媒体服务平台上线，内容涉及视频上传、视频分发、调用接口、Flash播放器等。
一、Flash RTMP流媒体播放演示（播放时进度条可以自由拖动）：
生产环境更多 Flash RTMP 流媒体视频演示：http://jx3.xoyo.com/xgxz/video/

二、安装步骤简要说明：
①、安装JDK
打开http://java.sun.com/javase/downloads/，下载最新的Java SE Development Kit (JDK)，安装在/usr/local/jdk/下。
chmod +x jdk-6u13-linux-i586.bin
./jdk-6u13-linux-i586.bin
②、安装Red5
打开http://osflash.org/red5/070final，下载red5-0.7.0.tar.gz，解压缩后执行./red5.sh，然后访问http://yourdomain:5080/，有演示。

三、服务器带宽消耗比较：
①、客户端 1.5M ADSL 环境，HTTP 方式播放单个视频，服务器所消耗的带宽：
[root@localhost ~]# ./net.sh eth0 1
IN: 3318 Byte/s OUT: 259984 Byte/s
IN: 3486 Byte/s OUT: 249470 Byte/s
IN: 3332 Byte/s OUT: 259984 Byte/s
IN: 3090 Byte/s OUT: 252528 Byte/s
IN: 3000 Byte/s OUT: 252474 Byte/s
IN: 3000 Byte/s OUT: 253976 Byte/s
IN: 2940 Byte/s [...]&lt;img src=&quot;http://www1.feedsky.com/t1/603763412/uini/feedsky/s.gif?r=http://item.feedsky.com/~feedsky/uini/~8195296/603763412/6299073/1/item.html&quot; border=&quot;0&quot; height=&quot;0&quot; width=&quot;0&quot; style=&quot;position:absolute&quot; /&gt;</description><category>流媒体</category><category>rtmp</category><category>Red5</category><category>进度</category><category>播放</category><pubDate>Wed, 08 Feb 2012 17:50:58 +0800</pubDate><author>nick</author><comments>http://www.uini.net/2012/02/based-on-open-source-the-flash-server-red5-build-rtmp-streaming-media-player-platform-forwarded.html#comments</comments><guid isPermaLink="false">http://www.uini.net/?p=1876</guid><dc:creator>nick</dc:creator><fs:srclink>http://www.uini.net/2012/02/based-on-open-source-the-flash-server-red5-build-rtmp-streaming-media-player-platform-forwarded.html</fs:srclink><fs:srcfeed>http://www.uini.net/feed</fs:srcfeed><fs:itemid>feedsky/uini/~8195296/603763412/6299073</fs:itemid></item><item><title>wddns/多线路/分省份智能DNS系统wddns 1.3发布</title><link>http://item.feedsky.com/~feedsky/uini/~8195296/603701312/6299073/1/item.html</link><content:encoded>&lt;p&gt;﻿&lt;/p&gt;
&lt;p&gt;一 系统概述&lt;br /&gt;
wddns是一套基于bind+mysql构建开发，web在线管理的智能DNS系统,安装方便,快速,让你可在最短时间内架构一套DNS/智能DNS系 统.目前支持电信/网通/教肓网/移动/铁通/广电/按省份解析(31个省份)/搜索引擎蜘蛛等多线路,具有强大的监控功能，可监控服务器健康状态，宕机 检测,故障切换，DNS服务器健康监控，故障切换，防攻击检测，可选自动屏蔽攻击者IP，易扩展DNS服务器，数据自动同步等&lt;br /&gt;
结合wdcdn,即可组建一个自己的CDN网络，甚至可以架构一套大型或N多节点的CDN系统以及一套功能强大，高防的智能DNS系统&lt;br /&gt;
&lt;a href=&quot;http://www.wdlinux.cn/wddns&quot; target=&quot;_blank&quot;&gt;wddns&lt;/a&gt;是做为wdcp的模块方式安装用的,也就是说,在安装wddns之前,需要安装好wdcp系统，最新版本是2.1，wddns1.3只支持wdcp2&lt;br /&gt;
支持系统wdlinux/CentOS5.5/5.6,推荐wdlinux&lt;/p&gt;
&lt;p&gt;相关介绍&lt;br /&gt;
&lt;a href=&quot;http://www.wdlinux.cn/wdcp&quot; target=&quot;_blank&quot;&gt;wdcp&lt;/a&gt;(WDlinux Control Panel) 是一套用PHP开发的Linux服务器管理系统,旨在易于使用和管理Linux服务器,可以在线管理Linux服务器和虚拟主机.简单,方便,易操作.&lt;br /&gt;
&lt;a href=&quot;http://www.wdlinux.cn/wdcdn&quot; target=&quot;_blank&quot;&gt;wdcdn&lt;/a&gt;是一套完整的CDN网页加速缓存系统,包括squid系统及web管理后台,可帮助中小站长或中小企业快速构建自己的CDN网络及服务器群,提供更好的服务,更快速的网站,我们也致力打造这样一个完善完美的CDN系统&lt;br /&gt;
&lt;a href=&quot;http://www.wdlinux.cn/wdlinux_CentOS_5.5&quot; target=&quot;_blank&quot;&gt;wdlinux&lt;/a&gt;是基于CentOS的面向应用服务器而做的精简版系统,安装方便,快速,稳定.&lt;br /&gt;
&lt;a href=&quot;http://www.wdlinux.cn/bind&quot; target=&quot;_blank&quot;&gt;bind&lt;/a&gt;是一个开源且稳定高性能的DNS系统,记录数据,可以文本或数据库等方式存储.本系统正是基于mysql数据库作为存储的.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;二功能列表&lt;/strong&gt;&lt;br /&gt;
1 可设置或扩展N多台NS服务器,默认是两台，如ns1.wddns.net,ns2.wddns.net&lt;br /&gt;
2 后台增加/修改/删除域名，实时生效&lt;br /&gt;
3 后台管理A记录,NS记录,MX记录,PTR记录,实时生效&lt;br /&gt;
4 多用户功能，可限制普通用户的域名数量，记录数量&lt;br /&gt;
5 健康检测，宕机检测和监控，报警可发邮件或短信&lt;br /&gt;
6 宕机切换，发现服务监控故障后，可选择故障切换(前提是有多台服务器)&lt;br /&gt;
7 多台DNS服务器数据自动同步，也可手动同步某一台DNS服务器数据&lt;br /&gt;
8 负载均衡，可设置多台服务器均衡解析&lt;br /&gt;
9 解析线路细分，按省划分,即是可以按省份解析，还有针对搜索引擎的蜘蛛解析&lt;br /&gt;
10 请求查询统计，可按小时，按天统计报表&lt;br /&gt;
11 防攻击检测，可设置攻击的请求查询频繁值，并可选是否屏蔽攻击者IP，有攻击时自动屏蔽攻击者IP&lt;br /&gt;
12 DNS服务器监控，并可设置是否故障切换，即DNS服务器故障时切换至其它NS服务器&lt;/p&gt;
&lt;p&gt;功能界面截图可看 &lt;a href=&quot;http://www.wdlinux.cn/bbs/thread-781-1-1.html&quot; target=&quot;_blank&quot;&gt;http://www.wdlinux.cn/bbs/thread-781-1-1.html&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;三 系统安装&lt;/strong&gt;&lt;br /&gt;
假设你已安装好wdcp系统,如没安装可看说明 &lt;a href=&quot;http://www.wdlinux.cn/bbs/thread-494-1-1.html&quot; target=&quot;_blank&quot;&gt;http://www.wdlinux.cn/bbs/thread-494-1-1.html&lt;/a&gt;&lt;br /&gt;
cd /tmp&lt;br /&gt;
wget &lt;a href=&quot;http://www.wdlinux.cn/in_scripts/wddns_ins&quot; target=&quot;_blank&quot;&gt;http://www.wdlinux.cn/in_scripts/wddns_ins&lt;/a&gt;&lt;br /&gt;
chmod 755 wddns_ins&lt;br /&gt;
./wddns_ins&lt;br /&gt;
正常情况下,5分钟左右就可以完成&lt;/p&gt;
&lt;p&gt;安装完后,登录后台&lt;br /&gt;
&lt;a title=&quot;/url.php?url=http://ip:8080&quot; href=&quot;http://www.wdlinux.cn/url.php?url=http://ip:8080&quot; target=&quot;_blank&quot;&gt;http://ip:8080&lt;/a&gt;&lt;br /&gt;
在系统设置 &amp;gt; 应用模块 后面加上dns,再刷新，就可以看到管理界面了&lt;/p&gt;
&lt;p&gt;更多介绍和资料请看 &lt;a href=&quot;http://www.wdlinux.cn/bbs/forum-18-1.html&quot;&gt;论坛http://www.wdlinux.cn/bbs/forum-18-1.html&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #888888;&quot;&gt;原文：http://www.wdlinux.cn/wddns&lt;/span&gt;&lt;/p&gt;
&lt;div  class=&quot;related_post_title&quot;&gt;&lt;h4 style=\&quot;font-size:14px;color:#EEEEEE;\&quot;&gt;推荐阅读&lt;/h4&gt;&lt;style&gt;.related_post li{padding-top:10px !important;}&lt;/style&gt;&lt;/div&gt;&lt;ul class=&quot;related_post&quot;&gt;&lt;li&gt;&lt;a href=&quot;http://www.uini.net/2011/01/insight-into-the-linux-system-software-and-hardware-configuration.html&quot; title=&quot;洞悉Linux系统软硬件配置&quot;&gt;洞悉Linux系统软硬件配置&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://www.uini.net/2010/11/linux-inotify-monitoring-changes-in-the-system-directory-under-the.html&quot; title=&quot;inotify监控linux系统下的目录变化&quot;&gt;inotify监控linux系统下的目录变化&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://www.uini.net/2010/06/ssh-key-authentication-by-the-different-systems-to-achieve-automation-scripts.html&quot; title=&quot;通过 SSH 密钥验证实现在不同系统之间的脚本自动化&quot;&gt;通过 SSH 密钥验证实现在不同系统之间的脚本自动化&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://www.uini.net/2012/02/making-use-of-simple-and-beautiful-sphinx-documentation.html&quot; title=&quot;使用 sphinx 制作简洁而又美观的文档&quot;&gt;使用 sphinx 制作简洁而又美观的文档&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://www.uini.net/2012/02/encrypt-the-file.html&quot; title=&quot;有关文件的加密 &quot;&gt;有关文件的加密 &lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;img src=&quot;http://www1.feedsky.com/t1/603701312/uini/feedsky/s.gif?r=http://item.feedsky.com/~feedsky/uini/~8195296/603701312/6299073/1/item.html&quot; border=&quot;0&quot; height=&quot;0&quot; width=&quot;0&quot; style=&quot;position:absolute&quot; /&gt;</content:encoded><wfw:commentRss>http://www.uini.net/2012/02/wddns-duo-xian-lu-fen-sheng-fen-zhi-neng-dns-xi-tong-wddns-1-3-fa-bu.html/feed</wfw:commentRss><slash:comments>0</slash:comments><description>﻿
一 系统概述
wddns是一套基于bind+mysql构建开发，web在线管理的智能DNS系统,安装方便,快速,让你可在最短时间内架构一套DNS/智能DNS系 统.目前支持电信/网通/教肓网/移动/铁通/广电/按省份解析(31个省份)/搜索引擎蜘蛛等多线路,具有强大的监控功能，可监控服务器健康状态，宕机 检测,故障切换，DNS服务器健康监控，故障切换，防攻击检测，可选自动屏蔽攻击者IP，易扩展DNS服务器，数据自动同步等
结合wdcdn,即可组建一个自己的CDN网络，甚至可以架构一套大型或N多节点的CDN系统以及一套功能强大，高防的智能DNS系统
wddns是做为wdcp的模块方式安装用的,也就是说,在安装wddns之前,需要安装好wdcp系统，最新版本是2.1，wddns1.3只支持wdcp2
支持系统wdlinux/CentOS5.5/5.6,推荐wdlinux
相关介绍
wdcp(WDlinux Control Panel) 是一套用PHP开发的Linux服务器管理系统,旨在易于使用和管理Linux服务器,可以在线管理Linux服务器和虚拟主机.简单,方便,易操作.
wdcdn是一套完整的CDN网页加速缓存系统,包括squid系统及web管理后台,可帮助中小站长或中小企业快速构建自己的CDN网络及服务器群,提供更好的服务,更快速的网站,我们也致力打造这样一个完善完美的CDN系统
wdlinux是基于CentOS的面向应用服务器而做的精简版系统,安装方便,快速,稳定.
bind是一个开源且稳定高性能的DNS系统,记录数据,可以文本或数据库等方式存储.本系统正是基于mysql数据库作为存储的.
二功能列表
1 可设置或扩展N多台NS服务器,默认是两台，如ns1.wddns.net,ns2.wddns.net
2 后台增加/修改/删除域名，实时生效
3 后台管理A记录,NS记录,MX记录,PTR记录,实时生效
4 多用户功能，可限制普通用户的域名数量，记录数量
5 健康检测，宕机检测和监控，报警可发邮件或短信
6 宕机切换，发现服务监控故障后，可选择故障切换(前提是有多台服务器)
7 多台DNS服务器数据自动同步，也可手动同步某一台DNS服务器数据
8 负载均衡，可设置多台服务器均衡解析
9 解析线路细分，按省划分,即是可以按省份解析，还有针对搜索引擎的蜘蛛解析
10 请求查询统计，可按小时，按天统计报表
11 防攻击检测，可设置攻击的请求查询频繁值，并可选是否屏蔽攻击者IP，有攻击时自动屏蔽攻击者IP
12 DNS服务器监控，并可设置是否故障切换，即DNS服务器故障时切换至其它NS服务器
功能界面截图可看 http://www.wdlinux.cn/bbs/thread-781-1-1.html
三 系统安装
假设你已安装好wdcp系统,如没安装可看说明 http://www.wdlinux.cn/bbs/thread-494-1-1.html
cd /tmp
wget http://www.wdlinux.cn/in_scripts/wddns_ins
chmod 755 wddns_ins
./wddns_ins
正常情况下,5分钟左右就可以完成
安装完后,登录后台
http://ip:8080
在系统设置 &amp;#62; 应用模块 后面加上dns,再刷新，就可以看到管理界面了
更多介绍和资料请看 论坛http://www.wdlinux.cn/bbs/forum-18-1.html
原文：http://www.wdlinux.cn/wddns
推荐阅读.related_post li{padding-top:10px !important;}洞悉Linux系统软硬件配置inotify监控linux系统下的目录变化通过 SSH 密钥验证实现在不同系统之间的脚本自动化使用 sphinx 制作简洁而又美观的文档有关文件的加密&lt;img src=&quot;http://www1.feedsky.com/t1/603701312/uini/feedsky/s.gif?r=http://item.feedsky.com/~feedsky/uini/~8195296/603701312/6299073/1/item.html&quot; border=&quot;0&quot; height=&quot;0&quot; width=&quot;0&quot; style=&quot;position:absolute&quot; /&gt;</description><category>系统</category><category>linux</category><category>智能</category><category>wddns</category><pubDate>Wed, 08 Feb 2012 13:53:42 +0800</pubDate><author>nick</author><comments>http://www.uini.net/2012/02/wddns-duo-xian-lu-fen-sheng-fen-zhi-neng-dns-xi-tong-wddns-1-3-fa-bu.html#comments</comments><guid isPermaLink="false">http://www.uini.net/?p=1874</guid><dc:creator>nick</dc:creator><fs:srclink>http://www.uini.net/2012/02/wddns-duo-xian-lu-fen-sheng-fen-zhi-neng-dns-xi-tong-wddns-1-3-fa-bu.html</fs:srclink><fs:srcfeed>http://www.uini.net/feed</fs:srcfeed><fs:itemid>feedsky/uini/~8195296/603701312/6299073</fs:itemid></item><item><title>使用 Sphinx 更好地进行 MySQL 搜索</title><link>http://item.feedsky.com/~feedsky/uini/~8195296/603577468/6299073/1/item.html</link><content:encoded>&lt;p&gt;&lt;em&gt;使用 Sphinx 进行非全文本搜索&lt;/em&gt;&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&lt;a rel=&quot;#authortip1&quot; href=&quot;http://www.ibm.com/developerworks/cn/opensource/os-sphinx/index.html?ca=drs-#author1&quot;&gt;Federico Kereki&lt;/a&gt;, 系统工程师, 自由职业者&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;简介：&lt;/strong&gt; 尽管 MySQL 是一个出色的通用数据库，但是如果您的应用程序需要进行大量搜索，那么使用  Sphinx 可获得更好的性能。尽管 Sphinx  是一种全文本搜索工具，但即使与非全文本查询一起使用，它仍然可以提高应用程序的速度。本文将介绍如何针对此任务配置  Sphinx，其中包括一些示例查询，度量其执行时间，本文还将演示在考虑以某种通用的、系统的方式使用 Sphinx 时，更改中涉及的一些权衡方法。&lt;/p&gt;
&lt;div id=&quot;dw-tag-this&quot;&gt;&lt;a href=&quot;http://www.ibm.com/developerworks/cn/opensource/os-sphinx/index.html?ca=drs-#&quot;&gt;标记本文！&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;p&gt;&lt;strong&gt;发布日期：&lt;/strong&gt; 2012 年 2 月 06 日&lt;br /&gt;
&lt;strong&gt;级别：&lt;/strong&gt; 中级&lt;br /&gt;
&lt;strong&gt;原创语言：&lt;/strong&gt; &lt;a href=&quot;http://www.ibm.com/developerworks/opensource/library/os-sphinx/index.html&quot;&gt;英文&lt;/a&gt;&lt;br /&gt;
&lt;strong&gt;访问情况 ：&lt;/strong&gt; 368 次浏览&lt;br /&gt;
&lt;strong&gt;评论：&lt;/strong&gt; 0 (&lt;a href=&quot;http://www.ibm.com/developerworks/cn/opensource/os-sphinx/index.html?ca=drs-#icomments&quot;&gt;查看&lt;/a&gt; | &lt;a href=&quot;http://www.ibm.com/developerworks/cn/opensource/os-sphinx/index.html?ca=drs-#&quot;&gt;添加评论&lt;/a&gt; &amp;#8211; 登录)&lt;/p&gt;
&lt;div id=&quot;art-rating-summary&quot;&gt;&lt;img src=&quot;http://dw1.s81c.com/developerworks/i/stars120x20-4b.jpg&quot; alt=&quot;平均分 4 星 共 1 个评分&quot; /&gt; 平均分 (1个评分)&lt;br /&gt;
&lt;a href=&quot;http://www.ibm.com/developerworks/cn/opensource/os-sphinx/index.html?ca=drs-#iratings&quot;&gt;为本文评分&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;a name=&quot;intro&quot;&gt;简介&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;MySQL 是一个出色的综合性数据库，但是，对于需要进行大量搜索的应用程序，考虑采用具体的搜索实用工具可能会更好一些。本文章将  Sphinx（一个著名的全文本搜索包）视为 MySQL  的替代品，用它来进行搜索，提高非全文本搜索的速度。本文章研究此更改中涉及的权衡方法和说明，演示一些具体测试，并考虑以通用方式使用 Sphinx  所需的内容。&lt;/p&gt;
&lt;p&gt;&lt;a name=&quot;mysqlOrSphinx&quot;&gt;MySQL 或 Sphinx？&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;为什么会考虑使用 Sphinx 替换  MySQL？比如说，以一个书店的搜索应用程序为例。用户可能会通过指定书名、作者、状态（新或旧）、版本（第一版或影印版）、封面（精装或平装）、出版 商、出版年份、是否有作者签名和价格等内容查找书籍。MySQL 通常不会使用多个索引（一个例外是索引合并优化；参阅 &lt;a href=&quot;http://www.ibm.com/developerworks/cn/opensource/os-sphinx/index.html?ca=drs-#resources&quot;&gt;参考资料&lt;/a&gt;），因此优化所有可能搜索的唯一方法就是使用限制数量的多列索引，但这样做效果并不是很好。&lt;/p&gt;
&lt;p&gt;但是，Sphinx 是一种搜索引擎，可以与 MySQL 很好地集成，也可以自己独立工作。它提供了高索引和搜索性能，支持通过  SphinxQL 进行查询。SphinxQL 是一种基于 Structured Query Language (SQL)  的语言。最后，Sphinx 能很好地向上扩展，能够使用分布式搜索功能处理包含几 TB 数据的数百万个文档。&lt;/p&gt;
&lt;p&gt;Sphinx 可处理文档（可在数据库表或视图中保存）、文本字段（它索引的内容，提供全文本搜索）和属性（非文本值，可用于对结果进行筛选、排序和分组）。属性保存在随机存取内存 (RAM) 中以提高效率；请参阅 &lt;a href=&quot;http://www.ibm.com/developerworks/cn/opensource/os-sphinx/index.html?ca=drs-#resources&quot;&gt;参考资料&lt;/a&gt; 中的 Sphinx 文档，了解实际大小计算公式。&lt;/p&gt;
&lt;p&gt;在处理查询时，Sphinx 依赖于特殊索引文件。您必须为索引过程定义数据源，然后运行 &lt;code&gt;indexer&lt;/code&gt; 程序。另一种可能性是使用实时索引文件，您可以在牺牲一些效率的情况下立即更新该文件。我将在本文后面详细介绍这些方法。&lt;/p&gt;
&lt;p&gt;&lt;a name=&quot;sampleProblem&quot;&gt;示例问题&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;为了测试 Sphinx 和 MySQL 的搜索速度，我找到了一些有趣的（在大小方面）数据集，以及一个包含 300 万条薪水记录的测试数据库，这似乎与我的目的非常相符。（请参阅 &lt;a href=&quot;http://www.ibm.com/developerworks/cn/opensource/os-sphinx/index.html?ca=drs-#resources&quot;&gt;参考资料&lt;/a&gt; 以获得此数据。）图表很简单：在部门中工作的具有工作职务的员工和年薪。此示例处理两个最大的表：&lt;code&gt;employees&lt;/code&gt; 和                 &lt;code&gt;salaries&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;安装了数据后，我发现需要修正 &lt;code&gt;salaries&lt;/code&gt; 表的一些细节。首先，&lt;code&gt;to_date&lt;/code&gt; 字段有时包含作为特殊标记的 &lt;code&gt;9999-01-01&lt;/code&gt;；我将其替换为 &lt;code&gt;2038-01-01&lt;/code&gt;，因为 UNIX® 的时间戳不得超过 2038。此外，Sphinx 要求每个记录都有一个 ID 字段，因此我必须为 &lt;code&gt;salaries&lt;/code&gt; 表添加一个 &lt;code&gt;salaries_id&lt;/code&gt; auto-increment 字段。参见 &lt;a href=&quot;http://www.ibm.com/developerworks/cn/opensource/os-sphinx/index.html?ca=drs-#listing1&quot;&gt;清单 1&lt;/a&gt;。&lt;br /&gt;
&lt;a name=&quot;listing1&quot;&gt;&lt;strong&gt;清单 1. 在 &lt;code&gt;salaries&lt;/code&gt; 表中修正一些细节&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;
&lt;table border=&quot;0&quot; cellspacing=&quot;0&quot; cellpadding=&quot;0&quot; width=&quot;100%&quot; summary=&quot;This table contains a code listing.&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;pre&gt;
ALTER TABLE salaries
  DROP PRIMARY KEY,
  ADD UNIQUE emp_from (emp_no, from_date) ;
ALTER TABLE salaries
  ADD salaries_id INT NOT NULL AUTO_INCREMENT PRIMARY KEY FIRST ;
UPDATE salaries
  SET to_date=&quot;2038-01-01&quot; WHERE to_date=&quot;9999-01-01&quot;;&lt;/pre&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;现在，考虑&lt;a href=&quot;http://www.ibm.com/developerworks/cn/opensource/os-sphinx/index.html?ca=drs-#listing2&quot;&gt;清单 2&lt;/a&gt; 中所示的查询。&lt;br /&gt;
&lt;a name=&quot;listing2&quot;&gt;&lt;strong&gt;清单 2. 比较 MySQL 和 Sphinx 的一些简单测试&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;
&lt;table border=&quot;0&quot; cellspacing=&quot;0&quot; cellpadding=&quot;0&quot; width=&quot;100%&quot; summary=&quot;This table contains a code listing.&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;pre&gt;
SELECT *
  FROM employees.employees
  WHERE birth_date BETWEEN '1960-09-01' AND '1960-09-30'
    AND hire_date &amp;gt;= '1998-01-01';
38 rows in set (0.19 sec)

SELECT *
  FROM employees.employees eee JOIN employees.salaries sss
  ON sss.emp_no=eee.emp_no
  WHERE eee.first_name='Yucel'
    AND sss.salary&amp;gt;120000
    AND sss.from_date &amp;gt;= '2000-01-01';
5 rows in set (0.15 sec)&lt;/pre&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;第一个搜索仅包含 &lt;code&gt;employees&lt;/code&gt; 并查找在 1960 年出生且在 1998 年及之后雇佣的人。MySQL 在大约 0.19 秒的时间内找到了 38 条记录。（当然，您的结果可能有所不同。）第二个搜索加入了 &lt;code&gt;employees&lt;/code&gt; 和 &lt;code&gt;salaries&lt;/code&gt; 以查找在 2000 年及之后年薪超过 120,000 且名为 Yucel 的男员工。MySQL 在大约 0.15 秒内找到了 5 条记录。&lt;/p&gt;
&lt;p&gt;要使用 Sphinx 运行这些搜索，您必须设置它，索引数据并运行守护程序。下一节将介绍这些任务。&lt;/p&gt;
&lt;p&gt;&lt;a name=&quot;configuringSphinx&quot;&gt;配置 Sphinx&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Sphinx 根据 &lt;code&gt;sphinx.conf&lt;/code&gt; 文件中的定义索引数据源，如 &lt;a href=&quot;http://www.ibm.com/developerworks/cn/opensource/os-sphinx/index.html?ca=drs-#listing3&quot;&gt;清单 3&lt;/a&gt; 所示。注意日期字段的类型转换。本文省略了一些主要的必备参数，但是您应该了解，此处可使用更多的配置设置。&lt;br /&gt;
&lt;a name=&quot;listing3&quot;&gt;&lt;strong&gt;清单 3. Sphinx 的源定义&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;
&lt;table border=&quot;0&quot; cellspacing=&quot;0&quot; cellpadding=&quot;0&quot; width=&quot;100%&quot; summary=&quot;This table contains a code listing.&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;pre&gt;
source employeesSource
{
  type = mysql
  sql_host = localhost
  sql_user = mysqluser
  sql_pass = mysqlpass
  sql_db = employees
  sql_query= SELECT \
    emp_no as id, \
    TO_DAYS(birth_date) AS birth_date_td, \
    first_name, \
    last_name, \
    gender, \
    TO_DAYS(hire_date) AS hire_date_td \
    FROM employees
  sql_attr_uint = birth_date_td
  sql_field_string = first_name
  sql_field_string = last_name
  sql_field_string = gender
  sql_attr_uint = hire_date_td
}

source employeesSalariesSource
{
  type = mysql
  sql_host = localhost
  sql_user = mysqluser
  sql_pass = mysqlpass
  sql_db = employees
  sql_query= SELECT \
    ss.salaries_id AS id, \
    ee.emp_no AS emp_no, \
    TO_DAYS(ee.birth_date) AS birth_date_td, \
    ee.first_name AS first_name, \
    ee.last_name AS last_name, \
    ee.gender AS gender, \
    TO_DAYS(ee.hire_date) AS hire_date_td, \
    ss.salary AS salary, \
    UNIX_TIMESTAMP(ss.from_date) AS from_date_ts, \
    UNIX_TIMESTAMP(ss.to_date) AS to_date_ts \
    FROM employees ee JOIN salaries ss \
    ON ss.emp_no=ee.emp_no
  sql_attr_uint = emp_no
  sql_attr_timestamp = birth_date_ts
  sql_field_string = first_name
  sql_field_string = last_name
  sql_field_string = gender
  sql_attr_uint = hire_date_td
  sql_attr_uint = salary
  sql_attr_timestamp = from_date_ts
  sql_attr_timestamp = to_date_ts
}&lt;/pre&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;配置文件可划分为许多小节。source 部分定义数据源。Sphinx 可处理多种类型的文件，包括文本、Hypertext  Markup Language (HTML) 和 Extensible Markup Language (XML)。但是，本示例仅使用  MySQL，因此 &lt;code&gt;type=mysql&lt;/code&gt;、&lt;code&gt;sql_host&lt;/code&gt;、&lt;code&gt;sql_user&lt;/code&gt;、&lt;code&gt;sql_pass&lt;/code&gt; 和 &lt;code&gt;sql_db&lt;/code&gt; 参数定义了访问数据库的方式和使用的架构。&lt;code&gt;sql_query&lt;/code&gt; 参数提供 SQL 语句，检索将引用的数据。实际上，此处的唯一限制是第一个字段必须是唯一的、无符号的正整数 ID 数字。这就是我之前不得不在 &lt;code&gt;salaries&lt;/code&gt; 表中添加 &lt;code&gt;salaries_id&lt;/code&gt; 字段的原因。您最多可以指定 32 个文本字段和任意数量的属性。Sphinx 全文本索引除 ID（第一个字段）和属性之外的所有列。&lt;/p&gt;
&lt;p&gt;如 &lt;a href=&quot;http://www.ibm.com/developerworks/cn/opensource/os-sphinx/index.html?ca=drs-#table1&quot;&gt;表 1&lt;/a&gt; 所示，Sphinx 支持几种属性类型，但并不支持所有可能的 MySQL 数据类型。还有一些特定于 Sphinx 的属性类型，但是如果您只是寻找 MySQL 的替代品，这些属性类型就不适合，因此我没有在这里介绍它们。&lt;br /&gt;
&lt;a name=&quot;table1&quot;&gt;&lt;strong&gt;表 1. Sphinx 仅支持几个属性类型&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;
&lt;table border=&quot;0&quot; cellspacing=&quot;0&quot; cellpadding=&quot;0&quot; summary=&quot;所有 Sphinx 属性的列表&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;th scope=&quot;col&quot;&gt;属性&lt;/th&gt;
&lt;th scope=&quot;col&quot;&gt;描述&lt;/th&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;sql_attr_uint&lt;/code&gt; 和                         &lt;code&gt;sql_attr_bigint&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;32 位无符号整数值和 64 位有符号整数值。可对所有整数数据库字段和 &lt;code&gt;DATE&lt;/code&gt; 使用这两种类型。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;sql_attr_float&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;32 位浮点值。如果您想要存储地理坐标，可使用此属性类型。还要注意的是，如果您需要更高的精确度，则没有解决方法；字段四舍五入到七位小数。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;sql_attr_bool&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;一个布尔型（单个位）值，类似于 MySQL 的 &lt;code&gt;tinyint&lt;/code&gt; 值。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;sql_attr_timestamp&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;一种 UNIX 时间戳，可表示从 1970-01-01 到 2038-01-19 的日期/时间值。您在 Sphinx 中无法直接使用 &lt;code&gt;DATE&lt;/code&gt; 或 &lt;code&gt;DATETIME&lt;/code&gt; 列类型。您必须使用 &lt;code&gt;UNIX_TIMESTAMP()&lt;/code&gt; 函数将它们转换为时间戳。如果您仅需要日期，可使用 &lt;code&gt;TO_DAYS()&lt;/code&gt; 函数将 &lt;code&gt;DATE&lt;/code&gt; 字段转换为一个整数。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;sql_attr_string&lt;/code&gt; 和                         &lt;code&gt;sql_field_string&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;字符串（很明显！），但前者仅用于检索，而后者可作为全文本被索引。&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;配置文件的 index 部分描述源中的属性（&lt;a href=&quot;http://www.ibm.com/developerworks/cn/opensource/os-sphinx/index.html?ca=drs-#listing4&quot;&gt;清单 4&lt;/a&gt;）。&lt;br /&gt;
&lt;a name=&quot;listing4&quot;&gt;&lt;strong&gt;清单 4. Sphinx 的索引定义&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;
&lt;table border=&quot;0&quot; cellspacing=&quot;0&quot; cellpadding=&quot;0&quot; width=&quot;100%&quot; summary=&quot;This table contains a code listing.&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;pre&gt;
index employeesIndex
{
  type = plain
  source = employeesSource
  path = /home/fkereki/bin/sphinx/var/data/sphinxFilesEI
  charset_type = utf-8
  preopen = 1
}

index employeesSalariesIndex
{
  type = plain
  source = employeesSalariesSource
  path = /home/fkereki/bin/sphinx/var/data/sphinxFilesESI
  charset_type = utf-8
  preopen = 1
}&lt;/pre&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Sphinx 使用的索引文件独立于 MySQL 使用的索引文件。&lt;code&gt;type=plain&lt;/code&gt; 行表示您正在使用标准的 Sphinx 索引文件。其他可能的索引是 &lt;code&gt;distributed&lt;/code&gt;（当您具有在网络的几个节点分布的索引文件时）和 &lt;code&gt;rt&lt;/code&gt;（表示 &lt;em&gt;real time&lt;/em&gt;），您可以立刻更新这些索引。&lt;code&gt;source=&lt;/code&gt; 行将一个数据源与一个索引相关联。您可以在一个索引中合并几个数据源，但是在本示例中没有这样做。&lt;code&gt;path=&lt;/code&gt; 行定义索引文件名称及其存储位置。&lt;code&gt;charset_type=&lt;/code&gt; 行指定您应该使用 Single Byte Character Set (&lt;code&gt;sbcs&lt;/code&gt;) 还是 Universal Character Set (UCS) Transformation Format-8 bit (&lt;code&gt;utf-8&lt;/code&gt;)。最后，&lt;code&gt;preopen=1&lt;/code&gt; 告诉搜索守护进程在加载时打开所有索引文件，而不是等待第一批查询到达。&lt;/p&gt;
&lt;p&gt;配置文件中的最后一小节处理 &lt;code&gt;indexer&lt;/code&gt; 和 &lt;code&gt;searchd&lt;/code&gt; 应用程序（&lt;a href=&quot;http://www.ibm.com/developerworks/cn/opensource/os-sphinx/index.html?ca=drs-#listing5&quot;&gt;清单 5&lt;/a&gt;）。&lt;br /&gt;
&lt;a name=&quot;listing5&quot;&gt;&lt;strong&gt;清单 5. Indexer 和搜索守护进程参数&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;
&lt;table border=&quot;0&quot; cellspacing=&quot;0&quot; cellpadding=&quot;0&quot; width=&quot;100%&quot; summary=&quot;This table contains a code listing.&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;pre&gt;
indexer
{
  mem_limit = 1024M
}

searchd
{
  listen = 127.0.0.1:9306:mysql41
  log = /home/fkereki/bin/sphinx/var/log/searchd.log
  query_log = /home/fkereki/bin/sphinx/var/log/query.log
  pid_file = /home/fkereki/bin/sphinx/var/log/searchd.pid
}&lt;/pre&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;您必须定义 &lt;code&gt;mem_limit&lt;/code&gt; RAM 大小，以便有足够的内存可供 &lt;code&gt;indexer&lt;/code&gt; 使用。&lt;code&gt;searchd&lt;/code&gt; 的定义不需要再加以说明，除了它使用了 &lt;code&gt;listen=&lt;/code&gt;。您可以使用此参数指定 SphinxQL 二进制网络协议可用的 IP 地址和端口。如果您想要与协议直接进行交互，可使用标准 MySQL 客户端，方法是输入 &lt;code&gt;mysql -P 9306&lt;/code&gt; 并运行查询，而不在机器上运行 MySQL &lt;code&gt;mysqld&lt;/code&gt; 程序。&lt;/p&gt;
&lt;p&gt;现在设置了所有内容，您可以索引数据并开始运行搜索守护进程（&lt;a href=&quot;http://www.ibm.com/developerworks/cn/opensource/os-sphinx/index.html?ca=drs-#listing6&quot;&gt;清单 6&lt;/a&gt;）。&lt;code&gt;--all&lt;/code&gt; 参数表示将生成所有索引文件。&lt;br /&gt;
&lt;a name=&quot;listing6&quot;&gt;&lt;strong&gt;清单 6. 索引数据和运行搜索守护进程 &lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;
&lt;table border=&quot;0&quot; cellspacing=&quot;0&quot; cellpadding=&quot;0&quot; width=&quot;100%&quot; summary=&quot;This table contains a code listing.&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;pre&gt;
~/bin/sphinx/etc&amp;gt; ../bin/indexer --all
Sphinx 2.0.1-beta (r2792)
Copyright (c) 2001-2011, Andrew Aksyonoff
Copyright (c) 2008-2011, Sphinx Technologies Inc (http://sphinxsearch.com)

using config file './sphinx.conf'...
indexing index 'employeesSalariesIndex'...
collected 2844047 docs, 40.9 MB
sorted 8.5 Mhits, 100.0% done
total 2844047 docs, 40877736 bytes
total 24.842 sec, 1645464 bytes/sec, 114482.32 docs/sec
indexing index 'employeesIndex'...
collected 300024 docs, 4.3 MB
sorted 0.9 Mhits, 100.0% done
total 300024 docs, 4311224 bytes
total 0.914 sec, 4714945 bytes/sec, 328119.56 docs/sec
total 7 reads, 0.274 sec, 19695.2 kb/call avg, 39.2 msec/call avg
total 110 writes, 0.528 sec, 2351.0 kb/call avg, 4.8 msec/call avg

~/bin/sphinx/etc&amp;gt; ../bin/searchd
Sphinx 2.0.1-beta (r2792)
Copyright (c) 2001-2011, Andrew Aksyonoff
Copyright (c) 2008-2011, Sphinx Technologies Inc (http://sphinxsearch.com)

using config file './sphinx.conf'...
listening on 127.0.0.1:9306
precaching index 'employeesSalariesIndex'
precaching index 'employeesIndex'
precached 2 indexes in 0.124 sec&lt;/pre&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;既然已经索引了数据，并且所需的守护进程正在运行，那么您可以准备运行一些搜索。&lt;/p&gt;
&lt;p&gt;&lt;a name=&quot;runningSearches&quot;&gt;运行搜索&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;查询 Sphinx 的首选方法是使用 SphinxQL，它适用于 MySQL 的语言，也适用于 SphinxQL。本示例使用的是 PHP，代码如 &lt;a href=&quot;http://www.ibm.com/developerworks/cn/opensource/os-sphinx/index.html?ca=drs-#listing7&quot;&gt;清单 7&lt;/a&gt; 所示。&lt;br /&gt;
&lt;a name=&quot;listing7&quot;&gt;&lt;strong&gt;清单 7. 一个查询 MySQL 和 Sphinx 的 PHP 程序，定时测试其性能&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;
&lt;table border=&quot;0&quot; cellspacing=&quot;0&quot; cellpadding=&quot;0&quot; width=&quot;100%&quot; summary=&quot;This table contains a code listing.&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;pre&gt;
$bd0 = mysql_connect('localhost:3306', 'mysqluser','mysqlpass');
$bd1 = mysql_connect('localhost:9306');

echo &quot;FIRST TEST ... SINGLE TABLE\n\n&quot;;

$td1 = to_days(&quot;1960-09-01&quot;);
$td2 = to_days(&quot;1960-09-30&quot;);
$td3 = to_days(&quot;1998-01-01&quot;);

do_time(&quot;test 1 - MySQL &quot;, &quot;SELECT * FROM employees.employees &quot;.
  &quot;WHERE birth_date BETWEEN '1960-09-01' AND '1960-09-30' &quot;.
  &quot;AND hire_date &amp;gt;= '1998-01-01'&quot;, $bd0);

do_time(&quot;test 1 - Sphinx&quot;, &quot;SELECT * FROM employeesIndex &quot;.
  &quot;WHERE birth_date_td BETWEEN {$td1} AND {$td2} &quot;.
  &quot;AND hire_date_td &amp;gt;= {$td3} LIMIT 0,10000 &quot;, $bd1);

echo &quot;\nSECOND TEST ... JOIN\n\n&quot;;

$ts1 = mktime(0,0,0,1,1,2000);

do_time(&quot;test 2 - MySQL &quot;, &quot;SELECT * &quot;.
  &quot;FROM employees.employees eee JOIN employees.salaries sss &quot;.
  &quot;ON sss.emp_no=eee.emp_no &quot;.
  &quot;WHERE eee.first_name='Yucel' &quot;.
  &quot;AND sss.salary&amp;gt;120000 &quot;.
  &quot;AND sss.from_date &amp;gt;= '2000-01-01'&quot;, $bd0);

do_time(&quot;test 2 - Sphinx&quot;, &quot;SELECT * FROM employeesSalariesIndex &quot;.
  &quot;WHERE MATCH('_cnnew1@first_name Yucel') &quot;.
  &quot;AND salary&amp;gt;120000 &quot;.
  &quot;AND from_date_ts&amp;gt;={$ts1} limit 0,10000 &quot;, $bd1);

function to_days($date) {
  return 719528 + floor(strtotime($date)/(60*60*24));
}

function do_time($description, $sentence, $bd) {
  $m0 = microtime(true);
  $res= @mysql_query($sentence, $bd);
  $m1 = microtime(true);
  $nr = mysql_num_rows($res);
  echo $description.&quot; &quot;.$nr.&quot; rows in &quot;.
    sprintf(&quot;%6.4f&quot;, $m1-$m0).&quot; secs\n&quot;;
}&lt;/pre&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;根据 &lt;a href=&quot;http://www.ibm.com/developerworks/cn/opensource/os-sphinx/index.html?ca=drs-#listing5&quot;&gt;清单 5&lt;/a&gt; 中的规范，必须将 SphinxQL 查询发送给端口 9306。因为 MySQL &lt;code&gt;TO_DAYS()&lt;/code&gt; 函数没有等效的 PHP 函数，所以我自己编写了一个函数，请注意，&lt;code&gt;mktime&lt;/code&gt; 适用于 UNIX_TIMESTAMP 转换。&lt;code&gt;do_time&lt;/code&gt; 函数执行并确定在指定服务器上指定查询的时间。&lt;/p&gt;
&lt;p&gt;SphinxQL 查询与 MySQL 查询的不同之处在于：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;您使用 &lt;code&gt;MATCH&lt;/code&gt; 来查询文本字段。&lt;/li&gt;
&lt;li&gt;您必须将所有日期转换为时间戳或整数。为了具有多样性，本示例使用了两种方法。&lt;/li&gt;
&lt;li&gt;Sphinx 可返回完整记录或仅 ID 字段，后者更高效。当然，如果您使用后一个选项，您必须使用 MySQL 来检索其他信息。&lt;/li&gt;
&lt;li&gt; &lt;code&gt;AND&lt;/code&gt; 和 &lt;code&gt;OR&lt;/code&gt; 运算符的优先级是相同的，因此使用它们时应小心，并在需要时使用括号。&lt;/li&gt;
&lt;li&gt;并不是所有 MySQL 数值、字符串和其他函数都是由 Sphinx 提供的。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;仅运行一些测试并不是彻底的概念证明，但是 &lt;a href=&quot;http://www.ibm.com/developerworks/cn/opensource/os-sphinx/index.html?ca=drs-#listing8&quot;&gt;清单 8&lt;/a&gt; 中所示的结果确实说明 MySQL 到 Sphinx 的改变可能很有用。&lt;br /&gt;
&lt;a name=&quot;listing8&quot;&gt;&lt;strong&gt;清单 8. MySQL 和 Sphinx 之间的比较结果&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;
&lt;table border=&quot;0&quot; cellspacing=&quot;0&quot; cellpadding=&quot;0&quot; width=&quot;100%&quot; summary=&quot;This table contains a code listing.&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;pre&gt;
~/bin/sphinx/etc&amp;gt; php test.php
FIRST TEST ... SINGLE TABLE

test 1 - MySQL  38 rows in 0.1912 secs
test 1 - Sphinx 38 rows in 0.0157 secs

SECOND TEST ... JOIN

test 2 - MySQL  5 rows in 0.1532 secs
test 2 - Sphinx 5 rows in 0.0020 secs&lt;/pre&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;这些结果很好，但是到目前为止，本示例仅考虑了静态搜索，它假定使用了常数表。您仍然需要查看更新索引文件的问题。&lt;/p&gt;
&lt;p&gt;&lt;a name=&quot;updating&quot;&gt;更新您的索引文件&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;如果更新原始数据，会出现什么情况？您必须更新索引文件，否则搜索将生成错误结果。在每次更新之后，就可以重新索引所有内容，但是这样做的成本可能太高了！Sphinx 提供了两种解决方案：增量索引文件和实时索引更新。&lt;/p&gt;
&lt;p&gt;通常，您拥有时常需要添加少数新记录的大数据集。对于本示例，我们假定旧数据在第一次写好之后没有进行任何修改。您可以通过实现  main+delta  方案来获得几乎实时的索引更新。这里采用的原理是：为旧数据和固定数据设置一个索引，为新数据设置另一个索引，这样就可以快速创建索引，因为数据比较小。 然后，您需要做的就是查询两种索引文件并使用两种结果的组合。考虑使用索引合并来重新创建主索引，方法是合并一个之前的索引和一个增量索引（参阅 &lt;a href=&quot;http://www.ibm.com/developerworks/cn/opensource/os-sphinx/index.html?ca=drs-#resources&quot;&gt;参考资料&lt;/a&gt; 中的 Sphinx 文档，了解有关的详细信息）。&lt;/p&gt;
&lt;p&gt;如果可以修改旧数据或者您真的需要实时更新，会出现什么情况？Sphinx 的 RT 索引文件是一种解决方案，因为它们支持 &lt;code&gt;INSERT&lt;/code&gt;、&lt;code&gt;REPLACE&lt;/code&gt; 和 &lt;code&gt;DELETE&lt;/code&gt; 命令实时影响索引文件。无论何时更新主表，都必须注意执行相应的索引更新，以确保 MySQL 和 Sphinx 数据之间没有任何差别。为了安全起见，请参阅 Sphinx 文档第 4.2 节中的说明和限制（参阅 &lt;a href=&quot;http://www.ibm.com/developerworks/cn/opensource/os-sphinx/index.html?ca=drs-#resources&quot;&gt;参考资料&lt;/a&gt;）。&lt;/p&gt;
&lt;p&gt;&lt;a name=&quot;finalEvaluation&quot;&gt;结束语&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;您可以得出什么样结论？首先，使用 Sphinx 代替 MySQL 可以提供显著的性能优势。Sphinx 十分适用于搜索静态表。但是，对于经常更新的表，则无法使用 &lt;code&gt;plain&lt;/code&gt; 索引文件。相反，您需要实施增量文件索引或更改为实时索引，这两种解决方案都会导致额外的性能成本。最后，高效使用 Sphinx 需要进行一些规划，因为您必须预定义所有必需的源和索引文件，当然，这不是一个缺点，只是普通常识。&lt;/p&gt;
&lt;p&gt;使用 Sphinx 代替 MySQL 并不简单，但也没有复杂到需要排除这种方法。如果快速搜索速度是必需的，则值得考虑将所用的搜索引擎从 MySQL 更改为 Sphinx，即使您不是正在进行全文搜索。&lt;/p&gt;
&lt;p&gt;&lt;a name=&quot;resources&quot;&gt;参考资料 &lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;学习&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt; &lt;a href=&quot;http://sphinxsearch.com/docs/current.html#features&quot;&gt;Sphinx 文档&lt;/a&gt;：了解有关其特性的更多信息。&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.ibm.com/developerworks/cn/opensource/os-php-sphinxsearch/&quot;&gt;用 PHP 构建自定义搜索引擎&lt;/a&gt;（developerWorks，2007 年 7 月）：了解有关全文本搜索的更多信息。&lt;/li&gt;
&lt;li&gt; &lt;a href=&quot;http://dev.mysql.com/doc/refman/5.6/en/index-merge-optimization.html&quot;&gt;MySQL：索引合并优化&lt;/a&gt;：查找有关此方法的更多信息。&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://twitter.com/developerworks&quot;&gt;developerWorks on                 Twitter&lt;/a&gt;：关注我们以了解最新新闻。&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.ibm.com/developerworks/cn/offers/lp/demos/&quot;&gt;developerWorks 演示中心&lt;/a&gt;：观看免费演示并了解 IBM 及开源技术和产品功能。&lt;/li&gt;
&lt;li&gt;随时关注 developerWorks &lt;a href=&quot;http://www.ibm.com/developerworks/cn/offers/techbriefings/&quot;&gt;技术活动&lt;/a&gt;和&lt;a href=&quot;http://www.ibm.com/developerworks/cn/swi/&quot;&gt;网络广播&lt;/a&gt;。&lt;/li&gt;
&lt;li&gt; 访问 developerWorks &lt;a href=&quot;http://www.ibm.com/developerworks/cn/opensource/&quot;&gt;Open source 专区&lt;/a&gt;获得丰富的 how-to 信息、工具和项目更新以及&lt;a href=&quot;http://www.ibm.com/developerworks/cn/opensource/best2009/index.html&quot;&gt;最受欢迎的文章和教程&lt;/a&gt;，帮助您用开放源码技术进行开发，并将它们与 IBM 产品结合使用。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;获得产品和技术&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt; &lt;a href=&quot;http://sphinxsearch.com/downloads/&quot;&gt;Sphinx&lt;/a&gt;：获得最新版本并尝试本文中的代码。&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://datacharmer.blogspot.com/2008/07/dont-guess-test-sample-database-with.html&quot;&gt;本文中使用的示例数据库&lt;/a&gt;：从 The Data Charmer 网站下载它。&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.ibm.com/developerworks/cn/downloads/&quot;&gt;IBM 产品评估试用版软件&lt;/a&gt;：从试用下载到云托管的产品，您可以使用针对开发人员的软件创新您的下一个开源开发项目。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;讨论&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;加入 &lt;a href=&quot;http://www.ibm.com/developerworks/cn/community/&quot;&gt;developerWorks 中文社区&lt;/a&gt;，developerWorks 社区是一个面向全球 IT 专业人员，可以提供博客、书签、wiki、群组、联系、共享和协作等社区功能的专业社交网络社区。&lt;/li&gt;
&lt;li&gt;加入 &lt;a href=&quot;https://www.ibm.com/developerworks/mydeveloperworks/groups/service/html/communityview?communityUuid=38997896-bb16-451a-aa97-189a27a3cd5a/?lang=zh&quot;&gt;IBM 软件下载与技术交流群组&lt;/a&gt;，参与在线交流。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a name=&quot;author&quot;&gt;关于作者&lt;/a&gt;&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;&lt;img src=&quot;http://www.ibm.com/developerworks/i/p-fkereki.jpg&quot; alt=&quot;http://www.ibm.com/developerworks/i/p-fkereki.jpg&quot; width=&quot;64&quot; height=&quot;80&quot; /&gt;&lt;a name=&quot;author1&quot;&gt; &lt;/a&gt;&lt;img src=&quot;http://www.ibm.com/developerworks/i/authorrecogbadge_cont_v3.jpg&quot; alt=&quot;developerWorks 投稿作者&quot; width=&quot;187&quot; height=&quot;30&quot; /&gt;Federico Kereki 是一名来自乌拉圭的系统工程师，拥有超过 20 年的开发、咨询和大学教学的经验。目前，他正在与各种各样的缩略词打交道：SOA、GWT、Ajax、PHP，当然还有 FLOSS！&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div  class=&quot;related_post_title&quot;&gt;&lt;h4 style=\&quot;font-size:14px;color:#EEEEEE;\&quot;&gt;推荐阅读&lt;/h4&gt;&lt;style&gt;.related_post li{padding-top:10px !important;}&lt;/style&gt;&lt;/div&gt;&lt;ul class=&quot;related_post&quot;&gt;&lt;li&gt;&lt;a href=&quot;http://www.uini.net/2011/12/sphinx-2-0-3-released-full-text-search-engine.html&quot; title=&quot;Sphinx 2.0.3 发布，全文搜索引擎&quot;&gt;Sphinx 2.0.3 发布，全文搜索引擎&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://www.uini.net/2011/09/fast-search-full-text-search-engine-xunsearch.html&quot; title=&quot;迅搜全文搜索引擎 XunSearch&quot;&gt;迅搜全文搜索引擎 XunSearch&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://www.uini.net/2011/09/service-engine-sgserver-search-tips.html&quot; title=&quot;搜索提示服务引擎 sgserver&quot;&gt;搜索提示服务引擎 sgserver&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://www.uini.net/2010/12/image-r3-content-based-image-search-engine.html&quot; title=&quot;image-r3 基于内容的图片搜索引擎 &quot;&gt;image-r3 基于内容的图片搜索引擎 &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://www.uini.net/2010/08/lucene-distributed-operating-framework-nut-1-0a4-test-case.html&quot; title=&quot;lucene 分布式运行框架 Nut 1.0a4 测试实例&quot;&gt;lucene 分布式运行框架 Nut 1.0a4 测试实例&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;img src=&quot;http://www1.feedsky.com/t1/603577468/uini/feedsky/s.gif?r=http://item.feedsky.com/~feedsky/uini/~8195296/603577468/6299073/1/item.html&quot; border=&quot;0&quot; height=&quot;0&quot; width=&quot;0&quot; style=&quot;position:absolute&quot; /&gt;</content:encoded><wfw:commentRss>http://www.uini.net/2012/02/mysql-search-with-sphinx.html/feed</wfw:commentRss><slash:comments>0</slash:comments><description>使用 Sphinx 进行非全文本搜索


Federico Kereki, 系统工程师, 自由职业者
简介： 尽管 MySQL 是一个出色的通用数据库，但是如果您的应用程序需要进行大量搜索，那么使用  Sphinx 可获得更好的性能。尽管 Sphinx  是一种全文本搜索工具，但即使与非全文本查询一起使用，它仍然可以提高应用程序的速度。本文将介绍如何针对此任务配置  Sphinx，其中包括一些示例查询，度量其执行时间，本文还将演示在考虑以某种通用的、系统的方式使用 Sphinx 时，更改中涉及的一些权衡方法。
标记本文！


发布日期： 2012 年 2 月 06 日
级别： 中级
原创语言： 英文
访问情况 ： 368 次浏览
评论： 0 (查看 &amp;#124; 添加评论 &amp;#8211; 登录)
 平均分 (1个评分)
为本文评分


简介
MySQL 是一个出色的综合性数据库，但是，对于需要进行大量搜索的应用程序，考虑采用具体的搜索实用工具可能会更好一些。本文章将  Sphinx（一个著名的全文本搜索包）视为 MySQL  的替代品，用它来进行搜索，提高非全文本搜索的速度。本文章研究此更改中涉及的权衡方法和说明，演示一些具体测试，并考虑以通用方式使用 Sphinx  所需的内容。
MySQL 或 Sphinx？
为什么会考虑使用 Sphinx 替换  MySQL？比如说，以一个书店的搜索应用程序为例。用户可能会通过指定书名、作者、状态（新或旧）、版本（第一版或影印版）、封面（精装或平装）、出版 商、出版年份、是否有作者签名和价格等内容查找书籍。MySQL 通常不会使用多个索引（一个例外是索引合并优化；参阅 参考资料），因此优化所有可能搜索的唯一方法就是使用限制数量的多列索引，但这样做效果并不是很好。
但是，Sphinx 是一种搜索引擎，可以与 [...]&lt;img src=&quot;http://www1.feedsky.com/t1/603577468/uini/feedsky/s.gif?r=http://item.feedsky.com/~feedsky/uini/~8195296/603577468/6299073/1/item.html&quot; border=&quot;0&quot; height=&quot;0&quot; width=&quot;0&quot; style=&quot;position:absolute&quot; /&gt;</description><category>搜索</category><category>Search</category><category>mysql</category><category>sphinx</category><category>引擎</category><pubDate>Wed, 08 Feb 2012 09:07:21 +0800</pubDate><author>nick</author><comments>http://www.uini.net/2012/02/mysql-search-with-sphinx.html#comments</comments><guid isPermaLink="false">http://www.uini.net/?p=1872</guid><dc:creator>nick</dc:creator><fs:srclink>http://www.uini.net/2012/02/mysql-search-with-sphinx.html</fs:srclink><fs:srcfeed>http://www.uini.net/feed</fs:srcfeed><fs:itemid>feedsky/uini/~8195296/603577468/6299073</fs:itemid></item><item><title>暂停页面资源占用(网页缩小检测)</title><link>http://item.feedsky.com/~feedsky/uini/~8195296/603577469/6299073/1/item.html</link><content:encoded>&lt;p&gt;“暂停页面资源占用”其实是个function，javascript也是可以用中文来写滴&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;function 暂停页面资源占用(){
  幻灯广告2.暂停();
  文字滚动5.暂停();
  啥啥啥动画.暂停();
  定时更新长链接.低迷模式();
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;为什么要这样做呢？ 装厚道，把资源让给别人，有些情况下还可以省自己服务器的资源。&lt;/p&gt;
&lt;p&gt;那什么时候调用他呢？ &lt;code&gt;onblur&lt;/code&gt;，那怎样变回正常呢？再写一个对应滴。&lt;/p&gt;
&lt;p&gt;但是这样看起来不是特别高级，怎样更高级呢？自定义事件 我记得好久好久前写过个task 让那些爱动的元素玩上 &lt;code&gt;onElementShow&lt;/code&gt; &lt;code&gt;onElementHide&lt;/code&gt; 这样的事件，然后就把上面的 function 分开了，让元素看不到时就可以开始暂停。&lt;/p&gt;
&lt;p&gt;其实还不够高级，我们还可以把 元素看不到 、页面 blur、窗口最小化 做进一步细分，不同阶段做不同深度的事。&lt;/p&gt;
&lt;p&gt;附窗口最小化检查&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;function isMinStatus() {
  var isMin = false;
  if(window.outerWidth != undefined){
    isMin = window.outerWidth &amp;lt;= 160 &amp;amp;&amp;amp; window.outerHeight &amp;lt;= 27;
  }else{
    isMin = window.screenTop &amp;lt; -30000 &amp;amp;&amp;amp; window.screenLeft &amp;lt; -30000;
  }
  return isMin;
} &lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这代码也不是我发明的。。很久前找到的，忘记出处了。win下基本都能用。mac 研究了发现没啥好办法发现最小化，最后用了个很土的办法，键盘控有效。囧rz&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;event.metaKey &amp;amp;&amp;amp; event.keyCode =='77' //⌘command + m&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;大家有其他好办法没？&lt;/p&gt;
&lt;p&gt;update&lt;br /&gt;
小光说的Page Visibility &lt;a title=&quot;Using the Page Visibility API&quot; href=&quot;http://www.samdutton.com/pageVisibility/&quot;&gt;测试地址&lt;/a&gt; &lt;a title=&quot;Page Visibility API&quot; href=&quot;http://ie.microsoft.com/testdrive/Performance/PageVisibility/Default.html&quot;&gt;M$测试地址&lt;/a&gt;，ie10 Chrome ff10+ 都支持， ff在mac支持得比较好，最小化算，但command+h 也不算，不知道为什么，突然在想显示桌面(F11/fn+F11) 要不要算。&lt;/p&gt;
&lt;p&gt;相关资料&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://www.w3.org/TR/page-visibility/&quot;&gt;w3c:Page Visibility&lt;/a&gt;&lt;/li&gt;
&lt;li&gt; &lt;a href=&quot;http://blogs.msdn.com/b/ie/archive/2011/07/08/using-pc-hardware-more-efficiently-in-html5-new-web-performance-apis-part-2.aspx&quot;&gt;Using PC Hardware more efficiently in HTML5: New Web Performance APIs&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;span style=&quot;color: #888888;&quot;&gt;转自：http://www.aoao.org.cn/blog/2012/01/pause-page/&lt;/span&gt;&lt;/p&gt;
&lt;div  class=&quot;related_post_title&quot;&gt;&lt;h4 style=\&quot;font-size:14px;color:#EEEEEE;\&quot;&gt;推荐阅读&lt;/h4&gt;&lt;style&gt;.related_post li{padding-top:10px !important;}&lt;/style&gt;&lt;/div&gt;&lt;ul class=&quot;related_post&quot;&gt;&lt;li&gt;&lt;a href=&quot;http://www.uini.net/2011/03/the-big-picture-please-do-not-leave-me-the-page-bursting-not-one-second-of-them.html&quot; title=&quot;大图片，请别把我的页面撑破了——不，一秒都不行。&quot;&gt;大图片，请别把我的页面撑破了——不，一秒都不行。&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://www.uini.net/2012/02/javascript-quatrains-enjoy.html&quot; title=&quot;Javascript绝句欣赏&quot;&gt;Javascript绝句欣赏&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://www.uini.net/2012/02/r-written-in-javascript-a-java-virtual-machine-talk-about-sensational.html&quot; title=&quot;(转)用JavaScript编写一个Java虚拟机？谈谈哗众取宠的&quot;&gt;(转)用JavaScript编写一个Java虚拟机？谈谈哗众取宠的&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://www.uini.net/2011/12/3-js-code-online-tools-and-practical-recommendations.html&quot; title=&quot;3 款实用的在线JS代码工具推荐&quot;&gt;3 款实用的在线JS代码工具推荐&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://www.uini.net/2011/10/js-libraries-handling-keyboard-events-kibo.html&quot; title=&quot;键盘事件处理的JS库 Kibo&quot;&gt;键盘事件处理的JS库 Kibo&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;img src=&quot;http://www1.feedsky.com/t1/603577469/uini/feedsky/s.gif?r=http://item.feedsky.com/~feedsky/uini/~8195296/603577469/6299073/1/item.html&quot; border=&quot;0&quot; height=&quot;0&quot; width=&quot;0&quot; style=&quot;position:absolute&quot; /&gt;</content:encoded><wfw:commentRss>http://www.uini.net/2012/02/suspension-of-the-page-footprint-web-narrow-detection.html/feed</wfw:commentRss><slash:comments>0</slash:comments><description>“暂停页面资源占用”其实是个function，javascript也是可以用中文来写滴
function 暂停页面资源占用(){
  幻灯广告2.暂停();
  文字滚动5.暂停();
  啥啥啥动画.暂停();
  定时更新长链接.低迷模式();
}
为什么要这样做呢？ 装厚道，把资源让给别人，有些情况下还可以省自己服务器的资源。
那什么时候调用他呢？ onblur，那怎样变回正常呢？再写一个对应滴。
但是这样看起来不是特别高级，怎样更高级呢？自定义事件 我记得好久好久前写过个task 让那些爱动的元素玩上 onElementShow onElementHide 这样的事件，然后就把上面的 function 分开了，让元素看不到时就可以开始暂停。
其实还不够高级，我们还可以把 元素看不到 、页面 blur、窗口最小化 做进一步细分，不同阶段做不同深度的事。
附窗口最小化检查
function isMinStatus() {
  var isMin = false;
  if(window.outerWidth != undefined){
    isMin = window.outerWidth &amp;#60;= 160 &amp;#38;&amp;#38; window.outerHeight &amp;#60;= 27;
  }else{
    isMin = window.screenTop &amp;#60; [...]&lt;img src=&quot;http://www1.feedsky.com/t1/603577469/uini/feedsky/s.gif?r=http://item.feedsky.com/~feedsky/uini/~8195296/603577469/6299073/1/item.html&quot; border=&quot;0&quot; height=&quot;0&quot; width=&quot;0&quot; style=&quot;position:absolute&quot; /&gt;</description><category>outerHeight</category><category>js</category><category>页面</category><category>资源</category><category>outerWidth</category><category>检测</category><category>最小化</category><category>占用</category><pubDate>Thu, 02 Feb 2012 16:18:40 +0800</pubDate><author>nick</author><comments>http://www.uini.net/2012/02/suspension-of-the-page-footprint-web-narrow-detection.html#comments</comments><guid isPermaLink="false">http://www.uini.net/?p=1870</guid><dc:creator>nick</dc:creator><fs:srclink>http://www.uini.net/2012/02/suspension-of-the-page-footprint-web-narrow-detection.html</fs:srclink><fs:srcfeed>http://www.uini.net/feed</fs:srcfeed><fs:itemid>feedsky/uini/~8195296/603577469/6299073</fs:itemid></item><item><title>Javascript绝句欣赏</title><link>http://item.feedsky.com/~feedsky/uini/~8195296/603577470/6299073/1/item.html</link><content:encoded>&lt;div&gt;
&lt;p&gt;转载自：&lt;a href=&quot;http://site.douban.com/widget/notes/22456/note/142716442/&quot; target=&quot;_blank&quot;&gt;http://site.douban.com/widget/notes/22456/note/142716442/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;1. 取整同时转成数值型：&lt;/p&gt;
&lt;p&gt;’10.567890′|0&lt;br /&gt;
结果: 10&lt;br /&gt;
’10.567890′^0&lt;br /&gt;
结果: 10&lt;br /&gt;
-2.23456789|0&lt;br /&gt;
结果: -2&lt;br /&gt;
~~-2.23456789&lt;br /&gt;
结果: -2&lt;/p&gt;
&lt;p&gt;2. 日期转数值：&lt;br /&gt;
var d = +new Date(); //1295698416792&lt;/p&gt;
&lt;p&gt;3. 类数组对象转数组：&lt;br /&gt;
var arr = [].slice.call(arguments)&lt;/p&gt;
&lt;p&gt;4. 漂亮的随机码：&lt;br /&gt;
Math.random().toString(16).substring(2); //14位&lt;br /&gt;
Math.random().toString(36).substring(2); //11位&lt;/p&gt;
&lt;p&gt;5. 合并数组：&lt;br /&gt;
var a = [1,2,3];&lt;br /&gt;
var b = [4,5,6];&lt;br /&gt;
Array.prototype.push.apply(a, b);&lt;br /&gt;
uneval(a); //[1,2,3,4,5,6]&lt;/p&gt;
&lt;p&gt;6. 用0补全位数：&lt;br /&gt;
function prefixInteger(num, length) {&lt;br /&gt;
return (num / Math.pow(10, length)).toFixed(length).substr(2);&lt;br /&gt;
}&lt;/p&gt;
&lt;p&gt;7. 交换值：&lt;br /&gt;
a= [b, b=a][0];&lt;/p&gt;
&lt;p&gt;8. 将一个数组插入另一个数组的指定位置：&lt;br /&gt;
var a = [1,2,3,7,8,9];&lt;br /&gt;
var b = [4,5,6];&lt;br /&gt;
var insertIndex = 3;&lt;br /&gt;
a.splice.apply(a, Array.concat(insertIndex, 0, b));&lt;br /&gt;
// a: 1,2,3,4,5,6,7,8,9&lt;/p&gt;
&lt;p&gt;9. 删除数组元素：&lt;br /&gt;
var a = [1,2,3,4,5];&lt;br /&gt;
a.splice(3,1);&lt;/p&gt;
&lt;p&gt;10. 快速取数组最大和最小值&lt;br /&gt;
Math.max.apply(Math, [1,2,3]) //3&lt;br /&gt;
Math.min.apply(Math, [1,2,3]) //1&lt;br /&gt;
(出自&lt;a rel=&quot;nofollow&quot; href=&quot;http://ejohn.org/blog/fast-javascript-maxmin/&quot; target=&quot;_blank&quot;&gt;http://ejohn.org/blog/fast-javascript-maxmin/&lt;/a&gt;)&lt;/p&gt;
&lt;p&gt;11. 条件判断：&lt;br /&gt;
var a = b &amp;amp;&amp;amp; 1;&lt;br /&gt;
相当于&lt;br /&gt;
if (b) {&lt;br /&gt;
a = 1&lt;br /&gt;
}&lt;/p&gt;
&lt;p&gt;var a = b || 1;&lt;br /&gt;
相当于&lt;br /&gt;
if (b) {&lt;br /&gt;
a = b;&lt;br /&gt;
} else {&lt;br /&gt;
a = 1;&lt;br /&gt;
}&lt;/p&gt;
&lt;p&gt;12. 判断IE:&lt;br /&gt;
var ie = /*@cc_on !@*/false;&lt;/p&gt;
&lt;p&gt;还有吗？欢迎回应&lt;/p&gt;
&lt;p&gt;声明: 本文采用 &lt;a title=&quot;署名-非商业性使用-相同方式共享&quot; rel=&quot;nofollow&quot; href=&quot;http://creativecommons.org/licenses/by-nc-sa/3.0/&quot;&gt;BY-NC-SA&lt;/a&gt; 协议进行授权 | &lt;a href=&quot;http://www.css88.com/&quot;&gt;WEB前端开发&lt;/a&gt;&lt;br /&gt;
转载请注明转自《&lt;a title=&quot;Javascript绝句欣赏&quot; rel=&quot;bookmark&quot; href=&quot;http://www.css88.com/archives/4419&quot;&gt;Javascript绝句欣赏&lt;/a&gt;》&lt;/p&gt;
&lt;/div&gt;
&lt;div  class=&quot;related_post_title&quot;&gt;&lt;h4 style=\&quot;font-size:14px;color:#EEEEEE;\&quot;&gt;推荐阅读&lt;/h4&gt;&lt;style&gt;.related_post li{padding-top:10px !important;}&lt;/style&gt;&lt;/div&gt;&lt;ul class=&quot;related_post&quot;&gt;&lt;li&gt;&lt;a href=&quot;http://www.uini.net/2012/02/r-written-in-javascript-a-java-virtual-machine-talk-about-sensational.html&quot; title=&quot;(转)用JavaScript编写一个Java虚拟机？谈谈哗众取宠的&quot;&gt;(转)用JavaScript编写一个Java虚拟机？谈谈哗众取宠的&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://www.uini.net/2011/07/visualsearch-js-super-search-box.html&quot; title=&quot;VisualSearch.js 超级搜索框&quot;&gt;VisualSearch.js 超级搜索框&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://www.uini.net/2011/03/javascript-sound-library-jsfx.html&quot; title=&quot;JavaScript声效库 Jsfx&quot;&gt;JavaScript声效库 Jsfx&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://www.uini.net/2010/05/jraiser-jiemi-event-listener-compatible-processing.html&quot; title=&quot;jRaiser揭秘——事件监听兼容处理&quot;&gt;jRaiser揭秘——事件监听兼容处理&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://www.uini.net/2012/02/suspension-of-the-page-footprint-web-narrow-detection.html&quot; title=&quot;暂停页面资源占用(网页缩小检测)&quot;&gt;暂停页面资源占用(网页缩小检测)&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;img src=&quot;http://www1.feedsky.com/t1/603577470/uini/feedsky/s.gif?r=http://item.feedsky.com/~feedsky/uini/~8195296/603577470/6299073/1/item.html&quot; border=&quot;0&quot; height=&quot;0&quot; width=&quot;0&quot; style=&quot;position:absolute&quot; /&gt;</content:encoded><wfw:commentRss>http://www.uini.net/2012/02/javascript-quatrains-enjoy.html/feed</wfw:commentRss><slash:comments>0</slash:comments><description>转载自：http://site.douban.com/widget/notes/22456/note/142716442/
1. 取整同时转成数值型：
’10.567890′&amp;#124;0
结果: 10
’10.567890′^0
结果: 10
-2.23456789&amp;#124;0
结果: -2
~~-2.23456789
结果: -2
2. 日期转数值：
var d = +new Date(); //1295698416792
3. 类数组对象转数组：
var arr = [].slice.call(arguments)
4. 漂亮的随机码：
Math.random().toString(16).substring(2); //14位
Math.random().toString(36).substring(2); //11位
5. 合并数组：
var a = [1,2,3];
var b = [4,5,6];
Array.prototype.push.apply(a, b);
uneval(a); //[1,2,3,4,5,6]
6. 用0补全位数：
function prefixInteger(num, length) {
return (num / Math.pow(10, length)).toFixed(length).substr(2);
}
7. 交换值：
a= [b, b=a][0];
8. 将一个数组插入另一个数组的指定位置：
var a = [1,2,3,7,8,9];
var b = [4,5,6];
var insertIndex = 3;
a.splice.apply(a, Array.concat(insertIndex, 0, b));
// a: 1,2,3,4,5,6,7,8,9
9. 删除数组元素：
var [...]&lt;img src=&quot;http://www1.feedsky.com/t1/603577470/uini/feedsky/s.gif?r=http://item.feedsky.com/~feedsky/uini/~8195296/603577470/6299073/1/item.html&quot; border=&quot;0&quot; height=&quot;0&quot; width=&quot;0&quot; style=&quot;position:absolute&quot; /&gt;</description><category>js</category><category>绝句</category><category>javascript</category><pubDate>Thu, 02 Feb 2012 16:12:11 +0800</pubDate><author>nick</author><comments>http://www.uini.net/2012/02/javascript-quatrains-enjoy.html#comments</comments><guid isPermaLink="false">http://www.uini.net/?p=1868</guid><dc:creator>nick</dc:creator><fs:srclink>http://www.uini.net/2012/02/javascript-quatrains-enjoy.html</fs:srclink><fs:srcfeed>http://www.uini.net/feed</fs:srcfeed><fs:itemid>feedsky/uini/~8195296/603577470/6299073</fs:itemid></item><item><title>通过分区（Partition）提升MySQL性能</title><link>http://item.feedsky.com/~feedsky/uini/~8195296/603577471/6299073/1/item.html</link><content:encoded>&lt;p&gt;什么是数据库分区？&lt;/p&gt;
&lt;p&gt;数据库分区是一种物理数据库设计技术，DBA和数据库建模人员对其相当熟悉。虽然分区技术可以实现很多效果，但其主要目的是为了在特定的SQL操作中减少数据读写的总量以缩减响应时间。&lt;/p&gt;
&lt;p&gt;分区主要有两种形式：//这里一定要注意行和列的概念（row是行，column是列）&lt;/p&gt;
&lt;p&gt;1.  水平分区（Horizontal  Partitioning）这种形式分区是对表的行进行分区，通过这样的方式不同分组里面的物理列分割的数据集得以组合，从而进行个体分割（单分区）或集 体分割（1个或多个分区）。所有在表中定义的列在每个数据集中都能找到，所以表的特性依然得以保持。&lt;/p&gt;
&lt;p&gt;举个简单例子：一个包含十年发票记录的表可以被分区为十个不同的分区，每个分区包含的是其中一年的记录。（朋奕注：这里具体使用的分区方式我们后面再说，可以先说一点，一定要通过某个属性列来分割，譬如这里使用的列就是年份）&lt;/p&gt;
&lt;p&gt;2. 垂直分区（Vertical Partitioning） 这种分区方式一般来说是通过对表的垂直划分来减少目标表的宽度，使某些特定的列 被划分到特定的分区，每个分区都包含了其中的列所对应的行。&lt;/p&gt;
&lt;p&gt;举个简单例子：一个包含了大text和BLOB列的表，这些text和BLOB列又不经常被访问，这时候就要把这些不经常使用的text和BLOB了划分到另一个分区，在保证它们数据相关性的同时还能提高访问速度。&lt;/p&gt;
&lt;p&gt;在 数据库供应商开始在他们的数据库引擎中建立分区（主要是水平分区）时，DBA和建模者必须设计好表的物理分区结构，不要保存冗余的数据（不同表中同时都包 含父表中的数据）或相互联结成一个逻辑父对象（通常是视图）。这种做法会使水平分区的大部分功能失效，有时候也会对垂直分区产生影响。&lt;/p&gt;
&lt;p&gt;在MySQL 5.1中进行分区&lt;/p&gt;
&lt;p&gt;MySQL5.1中最激动人心的新特性应该就是对水平分区的支持了。这对MySQL的使用者来说确实是个好消息，而且她已经支持分区大部分模式：&lt;/p&gt;
&lt;p&gt;Range（范围） – 这种模式允许DBA将数据划分不同范围。例如DBA可以将一个表通过年份划分成三个分区，80年代（1980’s）的数据，90年代（1990’s）的数据以及任何在2000年（包括2000年）后的数据。&lt;/p&gt;
&lt;p&gt;Hash（哈希） – 这中模式允许DBA通过对表的一个或多个列的Hash Key进行计算，最后通过这个Hash码不同数值对应的数据区域进行分区，。例如DBA可以建立一个对表主键进行分区的表。&lt;/p&gt;
&lt;p&gt;Key（键值） – 上面Hash模式的一种延伸，这里的Hash Key是MySQL系统产生的。&lt;/p&gt;
&lt;p&gt;List（预定义列表） – 这种模式允许系统通过DBA定义的列表的值所对应的行数据进行分割。例如：DBA建立了一个横跨三个分区的表，分别根据2004年2005年和2006年值所对应的数据。&lt;/p&gt;
&lt;p&gt;Composite（复合模式） &amp;#8211; 很神秘吧，哈哈，其实是以上模式的组合使用而已，就不解释了。举例：在初始化已经进行了Range范围分区的表上，我们可以对其中一个分区再进行hash哈希分区。&lt;/p&gt;
&lt;p&gt;分区带来的好处太多太多了，有多少？俺也不知道，自己猜去吧，要是觉得没有多少就别用，反正俺也不求你用。不过在这里俺强调两点好处：&lt;/p&gt;
&lt;p&gt;性 能的提升（Increased performance） &amp;#8211;  在扫描操作中，如果MySQL的优化器知道哪个分区中才包含特定查询中需要的数据，它就能直接去扫描那些分区的数据，而不用浪费很多时间扫描不需要的地方 了。需要举个例子？好啊，百万行的表划分为10个分区，每个分区就包含十万行数据，那么查询分区需要的时间仅仅是全表扫描的十分之一了，很明显的对比。同 时对十万行的表建立索引的速度也会比百万行的快得多得多。如果你能把这些分区建立在不同的磁盘上，这时候的I/O读写速度就“不堪设想”（没用错词，真的 太快了，理论上100倍的速度提升啊，这是多么快的响应速度啊，所以有点不堪设想了）了。&lt;/p&gt;
&lt;p&gt;对数据管理的简化（Simplified  data management） &amp;#8211;  分区技术可以让DBA对数据的管理能力提升。通过优良的分区，DBA可以简化特定数据操作的执行方式。例如：DBA在对某些分区的内容进行删除的同时能保 证余下的分区的数据完整性(这是跟对表的数据删除这种大动作做比较的)。&lt;/p&gt;
&lt;p&gt;此外分区是由MySQL系统直接管理的，DBA不需要手工的去划分和维护。例如：这个例如没意思，不讲了，如果你是DBA，只要你划分了分区，以后你就不用管了就是了。&lt;/p&gt;
&lt;p&gt;站在性能设计的观点上，俺们对以上的内容也是相当感兴趣滴。通过使用分区和对不同的SQL操作的匹配设计，数据库的性能一定能获得巨大提升。下面咱们一起用用这个MySQL 5.1的新功能看看。&lt;/p&gt;
&lt;p&gt;下面所有的测试都在Dell Optiplex box with a Pentium 4 3.00GHz processor, 1GB of RAM机器上（炫耀啊……），Fedora Core 4和MySQL 5.1.6 alpha上运行通过。&lt;/p&gt;
&lt;p&gt;如何进行实际分区&lt;/p&gt;
&lt;p&gt;看看分区的实际效果吧。我们建立几个同样的MyISAM引擎的表，包含日期敏感的数据，但只对其中一个分区。分区的表（表名为part_tab）我们采用Range范围分区模式，通过年份进行分区：&lt;/p&gt;
&lt;p&gt;1. mysql&amp;gt; CREATE TABLE part_tab&lt;br /&gt;
2. -&amp;gt; ( c1 int default NULL,&lt;br /&gt;
3. -&amp;gt; c2 varchar(30) default NULL,&lt;br /&gt;
4. -&amp;gt; c3 date default NULL&lt;br /&gt;
5. -&amp;gt;&lt;br /&gt;
6. -&amp;gt; ) engine=myisam&lt;br /&gt;
7. -&amp;gt; PARTITION BY RANGE (year(c3)) (PARTITION p0 VALUES LESS THAN (1995),&lt;br /&gt;
8. -&amp;gt; PARTITION p1 VALUES LESS THAN (1996) , PARTITION p2 VALUES LESS THAN (1997) ,&lt;br /&gt;
9. -&amp;gt; PARTITION p3 VALUES LESS THAN (1998) , PARTITION p4 VALUES LESS THAN (1999) ,&lt;br /&gt;
10. -&amp;gt; PARTITION p5 VALUES LESS THAN (2000) , PARTITION p6 VALUES LESS THAN (2001) ,&lt;br /&gt;
11. -&amp;gt; PARTITION p7 VALUES LESS THAN (2002) , PARTITION p8 VALUES LESS THAN (2003) ,&lt;br /&gt;
12. -&amp;gt; PARTITION p9 VALUES LESS THAN (2004) , PARTITION p10 VALUES LESS THAN (2010),&lt;br /&gt;
13. -&amp;gt; PARTITION p11 VALUES LESS THAN MAXVALUE );&lt;br /&gt;
14. Query OK, 0 rows affected (0.00 sec)&lt;/p&gt;
&lt;p&gt;注意到了这里的最后一行吗？这里把不属于前面年度划分的年份范围都包含了，这样才能保证数据不会出错，大家以后要记住啊，不然数据库无缘无故出错你就爽了。那下面我们建立没有分区的表（表名为no_part_tab）：&lt;/p&gt;
&lt;p&gt;1. mysql&amp;gt; create table no_part_tab&lt;br /&gt;
2. -&amp;gt; (c1 int(11) default NULL,&lt;br /&gt;
3. -&amp;gt; c2 varchar(30) default NULL,&lt;br /&gt;
4. -&amp;gt; c3 date default NULL) engine=myisam;&lt;br /&gt;
5. Query OK, 0 rows affected (0.02 sec)&lt;/p&gt;
&lt;p&gt;下 面咱写一个存储过程（感谢Peter Gulutzan给的代码，如果大家需要Peter  Gulutzan的存储过程教程的中文翻译也可以跟我要，chenpengyi◎gmail.com），它能向咱刚才建立的已分区的表中平均的向每个分区 插入共8百万条不同的数据。填满后，咱就给没分区的克隆表中插入相同的数据：&lt;/p&gt;
&lt;p&gt;1. mysql&amp;gt; delimiter //&lt;br /&gt;
2. mysql&amp;gt; CREATE PROCEDURE load_part_tab()&lt;br /&gt;
3. -&amp;gt; begin&lt;br /&gt;
4. -&amp;gt; declare v int default 0;&lt;br /&gt;
5. -&amp;gt; while v &amp;lt; 8000000&lt;br /&gt;
6. -&amp;gt; do&lt;br /&gt;
7. -&amp;gt; insert into part_tab&lt;br /&gt;
8. -&amp;gt; values (v,’testing partitions’,adddate(’1995-01-01′,(rand(v)*36520) mod 3652));&lt;br /&gt;
9. -&amp;gt; set v = v + 1;&lt;br /&gt;
10. -&amp;gt; end while;&lt;br /&gt;
11. -&amp;gt; end&lt;br /&gt;
12. -&amp;gt; //&lt;br /&gt;
13. Query OK, 0 rows affected (0.00 sec)&lt;br /&gt;
14. mysql&amp;gt; delimiter ;&lt;br /&gt;
15. mysql&amp;gt; call load_part_tab();&lt;br /&gt;
16. Query OK, 1 row affected (8 min 17.75 sec)&lt;br /&gt;
17. mysql&amp;gt; insert into no_part_tab select * from part_tab;&lt;br /&gt;
18. Query OK, 8000000 rows affected (51.59 sec)&lt;br /&gt;
19. Records: 8000000 Duplicates: 0 Warnings: 0&lt;/p&gt;
&lt;p&gt;表都准备好了。咱开始对这两表中的数据进行简单的范围查询吧。先分区了的，后没分区的，跟着有执行过程解析（MySQL Explain命令解析器），可以看到MySQL做了什么：&lt;/p&gt;
&lt;p&gt;1. mysql&amp;gt; select count(*) from no_part_tab where&lt;br /&gt;
2. -&amp;gt; c3 &amp;gt; date ‘1995-01-01′ and c3 &amp;lt; date ‘1995-12-31′;&lt;br /&gt;
3. +———-+&lt;br /&gt;
4. | count(*) |&lt;br /&gt;
5. +———-+&lt;br /&gt;
6. | 795181 |&lt;br /&gt;
7. +———-+&lt;br /&gt;
8. 1 row in set (38.30 sec)&lt;br /&gt;
9. mysql&amp;gt; select count(*) from part_tab where&lt;br /&gt;
10. -&amp;gt; c3 &amp;gt; date ‘1995-01-01′ and c3 &amp;lt; date ‘1995-12-31′;&lt;br /&gt;
11. +———-+&lt;br /&gt;
12. | count(*) |&lt;br /&gt;
13. +———-+&lt;br /&gt;
14. | 795181 |&lt;br /&gt;
15. +———-+&lt;br /&gt;
16. 1 row in set (3.88 sec)&lt;br /&gt;
17. mysql&amp;gt; explain select count(*) from no_part_tab where&lt;br /&gt;
18. -&amp;gt; c3 &amp;gt; date ‘1995-01-01′ and c3 &amp;lt; date ‘1995-12-31′\G&lt;br /&gt;
19. *************************** 1. row ***************************&lt;br /&gt;
20. id: 1&lt;br /&gt;
21. select_type: SIMPLE&lt;br /&gt;
22. table: no_part_tab&lt;br /&gt;
23. type: ALL&lt;br /&gt;
24. possible_keys: NULL&lt;br /&gt;
25. key: NULL&lt;br /&gt;
26. key_len: NULL&lt;br /&gt;
27. ref: NULL&lt;br /&gt;
28. rows: 8000000&lt;br /&gt;
29. Extra: Using where&lt;br /&gt;
30. 1 row in set (0.00 sec)&lt;br /&gt;
31. mysql&amp;gt; explain partitions select count(*) from part_tab where&lt;br /&gt;
32. -&amp;gt; c3 &amp;gt; date ‘1995-01-01′ and c3 &amp;lt; date ‘1995-12-31′\G&lt;br /&gt;
33. *************************** 1. row ***************************&lt;br /&gt;
34. id: 1&lt;br /&gt;
35. select_type: SIMPLE&lt;br /&gt;
36. table: part_tab&lt;br /&gt;
37. partitions: p1&lt;br /&gt;
38. type: ALL&lt;br /&gt;
39. possible_keys: NULL&lt;br /&gt;
40. key: NULL&lt;br /&gt;
41. key_len: NULL&lt;br /&gt;
42. ref: NULL&lt;br /&gt;
43. rows: 798458&lt;br /&gt;
44. Extra: Using where&lt;br /&gt;
45. 1 row in set (0.00 sec)&lt;/p&gt;
&lt;p&gt;从上面结果可以容易看出，设计恰当表分区能比非分区的减少90％的响应时间。而命令解析Explain程序也告诉我们在对已分区的表的查询过程中仅对第一个分区进行了扫描，其他都跳过了。&lt;br /&gt;
哔厉吧拉，说阿说……反正就是这个分区功能对DBA很有用拉，特别对VLDB和需要快速反应的系统。&lt;/p&gt;
&lt;p&gt;对Vertical Partitioning的一些看法&lt;/p&gt;
&lt;p&gt;虽然MySQL 5.1自动实现了水平分区，但在设计数据库的时候不要轻视垂直分区。虽然要手工去实现垂直分区，但在特定场合下你会收益不少的。例如在前面建立的表中，VARCHAR字段是你平常很少引用的，那么对它进行垂直分区会不会提升速度呢？咱们看看测试结果：&lt;/p&gt;
&lt;p&gt;1. mysql&amp;gt; desc part_tab;&lt;br /&gt;
2. +——-+————-+——+—–+———+——-+&lt;br /&gt;
3. | Field | Type | Null | Key | Default | Extra |&lt;br /&gt;
4. +——-+————-+——+—–+———+——-+&lt;br /&gt;
5. | c1 | int(11) | YES | | NULL | |&lt;br /&gt;
6. | c2 | varchar(30) | YES | | NULL | |&lt;br /&gt;
7. | c3 | date | YES | | NULL | |&lt;br /&gt;
8. +——-+————-+——+—–+———+——-+&lt;br /&gt;
9. 3 rows in set (0.03 sec)&lt;br /&gt;
10. mysql&amp;gt; alter table part_tab drop column c2;&lt;br /&gt;
11. Query OK, 8000000 rows affected (42.20 sec)&lt;br /&gt;
12. Records: 8000000 Duplicates: 0 Warnings: 0&lt;br /&gt;
13. mysql&amp;gt; desc part_tab;&lt;br /&gt;
14. +——-+———+——+—–+———+——-+&lt;br /&gt;
15. | Field | Type | Null | Key | Default | Extra |&lt;br /&gt;
16. +——-+———+——+—–+———+——-+&lt;br /&gt;
17. | c1 | int(11) | YES | | NULL | |&lt;br /&gt;
18. | c3 | date | YES | | NULL | |&lt;br /&gt;
19. +——-+———+——+—–+———+——-+&lt;br /&gt;
20. 2 rows in set (0.00 sec)&lt;br /&gt;
21. mysql&amp;gt; select count(*) from part_tab where&lt;br /&gt;
22. -&amp;gt; c3 &amp;gt; date ‘1995-01-01′ and c3 &amp;lt; date ‘1995-12-31′;&lt;br /&gt;
23. +———-+&lt;br /&gt;
24. | count(*) |&lt;br /&gt;
25. +———-+&lt;br /&gt;
26. | 795181 |&lt;br /&gt;
27. +———-+&lt;br /&gt;
28. 1 row in set (0.34 sec)&lt;/p&gt;
&lt;p&gt;在设计上去掉了VARCHAR字段后，不止是你，俺也发现查询响应速度上获得了另一个90％的时间节省。所以大家在设计表的时候，一定要考虑，表中的字段是否真正关联，又是否在你的查询中有用？&lt;/p&gt;
&lt;p&gt;补充说明&lt;/p&gt;
&lt;p&gt;这么简单的文章肯定不能说全MySQL 5.1 分区机制的所有好处和要点（虽然对自己写文章水平很有信心），下面就说几个感兴趣的：&lt;/p&gt;
&lt;p&gt;◆支持所有存储引擎(MyISAM, Archive, InnoDB, 等等)&lt;/p&gt;
&lt;p&gt;◆ 对分区的表支持索引，包括本地索引local indexes，对其进行的是一对一的视图镜像，假设一个表有十个分区，那么其本地索引也包含十个分区。&lt;/p&gt;
&lt;p&gt;◆关于分区的元数据Metadata的表可以在INFORMATION_SCHEMA数据库中找到，表名为PARTITIONS。&lt;/p&gt;
&lt;p&gt;◆All SHOW 命令支持返回分区表以及元数据的索引。&lt;/p&gt;
&lt;p&gt;◆对其操作的命令和实现的维护功能有（比对全表的操作还多）：&lt;/p&gt;
&lt;p&gt;1. o ADD PARTITION&lt;br /&gt;
2. o DROP PARTITION&lt;br /&gt;
3. o COALESCE PARTITION&lt;br /&gt;
4. o REORGANIZE PARTITION&lt;br /&gt;
5. o ANALYZE PARTITION&lt;br /&gt;
6. o CHECK PARTITION&lt;br /&gt;
7. o OPTIMIZE PARTITION&lt;br /&gt;
8. o REBUILD PARTITION&lt;br /&gt;
9. o REPAIR PARTITION&lt;/p&gt;
&lt;p&gt;站 在性能主导的观点上来说，MySQL  5.1的分区功能能给数据性能带来巨大的提升的同时减轻DBA的管理负担，如果分区合理的话。如果需要更多的资料可以去  http://dev.mysql.com/doc/refman/5.1/en/partitioning.html或  http://forums.mysql.com/list.php?106获得相关资料。&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #888888;&quot;&gt;原文：http://www.phpv.net/html/1708.html&lt;/span&gt;&lt;/p&gt;
&lt;div  class=&quot;related_post_title&quot;&gt;&lt;h4 style=\&quot;font-size:14px;color:#EEEEEE;\&quot;&gt;推荐阅读&lt;/h4&gt;&lt;style&gt;.related_post li{padding-top:10px !important;}&lt;/style&gt;&lt;/div&gt;&lt;ul class=&quot;related_post&quot;&gt;&lt;li&gt;&lt;a href=&quot;http://www.uini.net/2011/12/mysql-high-availability-big-killing-device-of-the-mha.html&quot; title=&quot;MySQL高可用性大杀器之MHA&quot;&gt;MySQL高可用性大杀器之MHA&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://www.uini.net/2010/05/mysqlsla-to-analyze-the-performance-and-the-index-mysql.html&quot; title=&quot;mysqlsla来分析MYSQL的性能及索引&quot;&gt;mysqlsla来分析MYSQL的性能及索引&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://www.uini.net/2012/02/mysql-search-with-sphinx.html&quot; title=&quot;使用 Sphinx 更好地进行 MySQL 搜索&quot;&gt;使用 Sphinx 更好地进行 MySQL 搜索&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://www.uini.net/2011/12/sphinx-2-0-3-released-full-text-search-engine.html&quot; title=&quot;Sphinx 2.0.3 发布，全文搜索引擎&quot;&gt;Sphinx 2.0.3 发布，全文搜索引擎&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://www.uini.net/2011/08/mysql-insert-delayed-detailed.html&quot; title=&quot;MYSQL INSERT DELAYED 详解&quot;&gt;MYSQL INSERT DELAYED 详解&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;img src=&quot;http://www1.feedsky.com/t1/603577471/uini/feedsky/s.gif?r=http://item.feedsky.com/~feedsky/uini/~8195296/603577471/6299073/1/item.html&quot; border=&quot;0&quot; height=&quot;0&quot; width=&quot;0&quot; style=&quot;position:absolute&quot; /&gt;</content:encoded><wfw:commentRss>http://www.uini.net/2012/02/through-the-partition-partition-to-enhance-the-performance-of-mysql.html/feed</wfw:commentRss><slash:comments>0</slash:comments><description>什么是数据库分区？
数据库分区是一种物理数据库设计技术，DBA和数据库建模人员对其相当熟悉。虽然分区技术可以实现很多效果，但其主要目的是为了在特定的SQL操作中减少数据读写的总量以缩减响应时间。
分区主要有两种形式：//这里一定要注意行和列的概念（row是行，column是列）
1.  水平分区（Horizontal  Partitioning）这种形式分区是对表的行进行分区，通过这样的方式不同分组里面的物理列分割的数据集得以组合，从而进行个体分割（单分区）或集 体分割（1个或多个分区）。所有在表中定义的列在每个数据集中都能找到，所以表的特性依然得以保持。
举个简单例子：一个包含十年发票记录的表可以被分区为十个不同的分区，每个分区包含的是其中一年的记录。（朋奕注：这里具体使用的分区方式我们后面再说，可以先说一点，一定要通过某个属性列来分割，譬如这里使用的列就是年份）
2. 垂直分区（Vertical Partitioning） 这种分区方式一般来说是通过对表的垂直划分来减少目标表的宽度，使某些特定的列 被划分到特定的分区，每个分区都包含了其中的列所对应的行。
举个简单例子：一个包含了大text和BLOB列的表，这些text和BLOB列又不经常被访问，这时候就要把这些不经常使用的text和BLOB了划分到另一个分区，在保证它们数据相关性的同时还能提高访问速度。
在 数据库供应商开始在他们的数据库引擎中建立分区（主要是水平分区）时，DBA和建模者必须设计好表的物理分区结构，不要保存冗余的数据（不同表中同时都包 含父表中的数据）或相互联结成一个逻辑父对象（通常是视图）。这种做法会使水平分区的大部分功能失效，有时候也会对垂直分区产生影响。
在MySQL 5.1中进行分区
MySQL5.1中最激动人心的新特性应该就是对水平分区的支持了。这对MySQL的使用者来说确实是个好消息，而且她已经支持分区大部分模式：
Range（范围） – 这种模式允许DBA将数据划分不同范围。例如DBA可以将一个表通过年份划分成三个分区，80年代（1980’s）的数据，90年代（1990’s）的数据以及任何在2000年（包括2000年）后的数据。
Hash（哈希） – 这中模式允许DBA通过对表的一个或多个列的Hash Key进行计算，最后通过这个Hash码不同数值对应的数据区域进行分区，。例如DBA可以建立一个对表主键进行分区的表。
Key（键值） – 上面Hash模式的一种延伸，这里的Hash Key是MySQL系统产生的。
List（预定义列表） – 这种模式允许系统通过DBA定义的列表的值所对应的行数据进行分割。例如：DBA建立了一个横跨三个分区的表，分别根据2004年2005年和2006年值所对应的数据。
Composite（复合模式） &amp;#8211; 很神秘吧，哈哈，其实是以上模式的组合使用而已，就不解释了。举例：在初始化已经进行了Range范围分区的表上，我们可以对其中一个分区再进行hash哈希分区。
分区带来的好处太多太多了，有多少？俺也不知道，自己猜去吧，要是觉得没有多少就别用，反正俺也不求你用。不过在这里俺强调两点好处：
性 能的提升（Increased performance） &amp;#8211;  在扫描操作中，如果MySQL的优化器知道哪个分区中才包含特定查询中需要的数据，它就能直接去扫描那些分区的数据，而不用浪费很多时间扫描不需要的地方 了。需要举个例子？好啊，百万行的表划分为10个分区，每个分区就包含十万行数据，那么查询分区需要的时间仅仅是全表扫描的十分之一了，很明显的对比。同 时对十万行的表建立索引的速度也会比百万行的快得多得多。如果你能把这些分区建立在不同的磁盘上，这时候的I/O读写速度就“不堪设想”（没用错词，真的 太快了，理论上100倍的速度提升啊，这是多么快的响应速度啊，所以有点不堪设想了）了。
对数据管理的简化（Simplified  data management） &amp;#8211;  分区技术可以让DBA对数据的管理能力提升。通过优良的分区，DBA可以简化特定数据操作的执行方式。例如：DBA在对某些分区的内容进行删除的同时能保 证余下的分区的数据完整性(这是跟对表的数据删除这种大动作做比较的)。
此外分区是由MySQL系统直接管理的，DBA不需要手工的去划分和维护。例如：这个例如没意思，不讲了，如果你是DBA，只要你划分了分区，以后你就不用管了就是了。
站在性能设计的观点上，俺们对以上的内容也是相当感兴趣滴。通过使用分区和对不同的SQL操作的匹配设计，数据库的性能一定能获得巨大提升。下面咱们一起用用这个MySQL 5.1的新功能看看。
下面所有的测试都在Dell Optiplex box with a Pentium 4 3.00GHz processor, 1GB of RAM机器上（炫耀啊……），Fedora Core 4和MySQL 5.1.6 [...]&lt;img src=&quot;http://www1.feedsky.com/t1/603577471/uini/feedsky/s.gif?r=http://item.feedsky.com/~feedsky/uini/~8195296/603577471/6299073/1/item.html&quot; border=&quot;0&quot; height=&quot;0&quot; width=&quot;0&quot; style=&quot;position:absolute&quot; /&gt;</description><category>mysql</category><category>分区</category><category>性能</category><category>db</category><category>partition</category><pubDate>Wed, 01 Feb 2012 14:14:20 +0800</pubDate><author>nick</author><comments>http://www.uini.net/2012/02/through-the-partition-partition-to-enhance-the-performance-of-mysql.html#comments</comments><guid isPermaLink="false">http://www.uini.net/?p=1866</guid><dc:creator>nick</dc:creator><fs:srclink>http://www.uini.net/2012/02/through-the-partition-partition-to-enhance-the-performance-of-mysql.html</fs:srclink><fs:srcfeed>http://www.uini.net/feed</fs:srcfeed><fs:itemid>feedsky/uini/~8195296/603577471/6299073</fs:itemid></item><item><title>使用 sphinx 制作简洁而又美观的文档</title><link>http://item.feedsky.com/~feedsky/uini/~8195296/603577472/6299073/1/item.html</link><content:encoded>&lt;p&gt;&lt;em&gt;使文档变得更有效并且可编写&lt;/em&gt;&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&lt;a rel=&quot;#authortip1&quot; href=&quot;http://www.ibm.com/developerworks/cn/opensource/os-sphinx-documentation/index.html?ca=drs-#author1&quot;&gt;Alfredo Deza&lt;/a&gt;, 软件工程师&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;简介：&lt;/strong&gt; 学习如何使用 Sphinx 工具创建能够以各种格式（如 HTML）自动进行分布的可维护的、样式支配的文档。&lt;/p&gt;
&lt;div id=&quot;dw-tag-this&quot;&gt;&lt;a href=&quot;http://www.ibm.com/developerworks/cn/opensource/os-sphinx-documentation/index.html?ca=drs-#&quot;&gt;标记本文！&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;p&gt;&lt;strong&gt;发布日期：&lt;/strong&gt; 2012 年 1 月 18 日&lt;br /&gt;
&lt;strong&gt;级别：&lt;/strong&gt; 中级&lt;br /&gt;
&lt;strong&gt;原创语言：&lt;/strong&gt; &lt;a href=&quot;http://www.ibm.com/developerworks/opensource/library/os-sphinx-documentation/index.html&quot;&gt;英文&lt;/a&gt;&lt;br /&gt;
&lt;strong&gt;访问情况 ：&lt;/strong&gt; 2523 次浏览&lt;br /&gt;
&lt;strong&gt;评论：&lt;/strong&gt; 0 (&lt;a href=&quot;http://www.ibm.com/developerworks/cn/opensource/os-sphinx-documentation/index.html?ca=drs-#icomments&quot;&gt;查看&lt;/a&gt; | &lt;a href=&quot;http://www.ibm.com/developerworks/cn/opensource/os-sphinx-documentation/index.html?ca=drs-#&quot;&gt;添加评论&lt;/a&gt; &amp;#8211; 登录)&lt;/p&gt;
&lt;div id=&quot;art-rating-summary&quot;&gt;&lt;img src=&quot;http://dw1.s81c.com/developerworks/i/stars120x20-5b.jpg&quot; alt=&quot;平均分 5 星 共 3 个评分&quot; /&gt; 平均分 (3个评分)&lt;br /&gt;
&lt;a href=&quot;http://www.ibm.com/developerworks/cn/opensource/os-sphinx-documentation/index.html?ca=drs-#iratings&quot;&gt;为本文评分&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;a name=&quot;N10067&quot;&gt;简介&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Sphinx 是一种工具，它允许开发人员以纯文本格式编写文档，以便采用满足不同需求的格式轻松生成输出。这在使用 Version  Control System 追踪变更时非常有用。纯文本文档对不同系统之间的协作者也非常有用。纯文本是当前可以采用的最便捷的格式之一。&lt;/p&gt;
&lt;p&gt;虽然 Sphinx 是用 Python 编写的，并且最初是为 Python 语言文档而创建，但它并不一定是以语言为中心，在某些情况下，甚至不是以程序员为中心。Sphinx 有许多用处，比如可以用它来编写整本书！&lt;/p&gt;
&lt;div&gt;&lt;a name=&quot; &quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;突出显示&lt;/h2&gt;
&lt;div&gt;
&lt;p&gt;默认情况下，Sphinx 会为 Python 突出显示代码，但它还允许定义其他编程语言，比如 C 和 Ruby。&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;可以将 Sphinx 想像成为一种&lt;em&gt;文档框架&lt;/em&gt;：它会抽象化比较单调的部分，并提供自动函数来解决一些常见问题，比如突出显示标题索引和特殊代码（在显示代码示例时），以及突出显示适当的语法。&lt;/p&gt;
&lt;p&gt;&lt;a name=&quot;N10085&quot;&gt;要求&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;您应该能轻车熟路地使用 Linux® 或 UNIX® 终端（也称为控制台或终端仿真器），因为命令行界面是与 Sphinx 进行互动的主要方式。&lt;/p&gt;
&lt;p&gt;您需要安装 Python。在所有主要的 Linux 发行版和一些基于 UNIX 的操作系统（如 Mac OSX）上预先安装  Python 并做好使用它的准备。Sphinx 支持 Python V 2.4、2.5 和 2.6。要确定您已经安装了 Python  并且安装的是有效版本，请运行  &lt;a href=&quot;http://www.ibm.com/developerworks/cn/opensource/os-sphinx-documentation/index.html?ca=drs-#listing1&quot;&gt;清单 1&lt;/a&gt; 中的代码。&lt;br /&gt;
&lt;a name=&quot;listing1&quot;&gt;&lt;strong&gt;清单 1. 检查 Python 的版本&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;
&lt;table border=&quot;0&quot; cellspacing=&quot;0&quot; cellpadding=&quot;0&quot; width=&quot;100%&quot; summary=&quot;This table contains a code listing.&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;pre&gt;
$ python --version
Python 2.6.1&lt;/pre&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;a name=&quot;N100A2&quot;&gt;语法&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Sphinx 使用 reStructuredText 标记语法（和其他一些语法）来提供文档控制。如果您之前编写过纯文本文件，那么您可能非常了解精通 Sphinx 所需的语法。&lt;/p&gt;
&lt;p&gt;标记允许为适当的输出实现文本的定义和结构。开始之前，请参见 &lt;a href=&quot;http://www.ibm.com/developerworks/cn/opensource/os-sphinx-documentation/index.html?ca=drs-#listing2&quot;&gt;清单 2&lt;/a&gt; 中的一个小的标记语法示例。&lt;br /&gt;
&lt;a name=&quot;listing2&quot;&gt;&lt;strong&gt;清单 2. Sphinx 标记语法示例&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;
&lt;table border=&quot;0&quot; cellspacing=&quot;0&quot; cellpadding=&quot;0&quot; width=&quot;100%&quot; summary=&quot;This table contains a code listing.&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;pre&gt;
This is a Title
===============
That has a paragraph about a main subject and is set when the '='
is at least the same length of the title itself.

Subject Subtitle
----------------
Subtitles are set with '-' and are required to have the same length
of the subtitle itself, just like titles.

Lists can be unnumbered like:

 * Item Foo
 * Item Bar

Or automatically numbered:

 #. Item 1
 #. Item 2

Inline Markup
-------------
Words can have *emphasis in italics* or be **bold** and you can define
code samples with back quotes, like when you talk about a command: ``sudo``
gives you super user powers!&lt;/pre&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;正如您所看到的，纯文本格式的语法非常容易读懂。在创建特定格式（如  HTML）时，标题会成为主要目标，其字体会比副标题大一些（理应如此），并且会对编号列表进行适当的编号。您已经拥有一些非常强大的功能。添加更多的项 或更改编号列表中的顺序不会影响到编号，而通过替换使用的下划线可以改变标题的重要性。&lt;/p&gt;
&lt;p&gt;&lt;a name=&quot;N100BE&quot;&gt; 安装和配置 &lt;/a&gt;&lt;/p&gt;
&lt;p&gt;安装是通过命令行进行的，非常简单明了，如 &lt;a href=&quot;http://www.ibm.com/developerworks/cn/opensource/os-sphinx-documentation/index.html?ca=drs-#listing3&quot;&gt;清单 3&lt;/a&gt; 所示。&lt;br /&gt;
&lt;a name=&quot;listing3&quot;&gt;&lt;strong&gt;清单 3.                     安装 Sphinx&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;
&lt;table border=&quot;0&quot; cellspacing=&quot;0&quot; cellpadding=&quot;0&quot; width=&quot;100%&quot; summary=&quot;This table contains a code listing.&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;pre&gt;
$ easy_install sphinx
Searching for sphinx
Reading http://pypi.python.org/simple/sphinx/
Reading http://sphinx.pocoo.org/
Best match: Sphinx 1.0.5
Downloading http://pypi.python.org/packages/[...]
Processing Sphinx-1.0.5-py2.5.egg
[...]
Finished processing dependencies for sphinx&lt;/pre&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;为了简便起见，&lt;a href=&quot;http://www.ibm.com/developerworks/cn/opensource/os-sphinx-documentation/index.html?ca=drs-#listing3&quot;&gt;清单 3&lt;/a&gt; 中的内容有所缩减，但它提供了在一个在安装 Sphinx 时应执行的操作的示例。&lt;/p&gt;
&lt;p&gt;框架使用了一个目录结构来分离源文件（纯文本文件）和构建（指生成的输出）。例如，如果使用 Sphinx 从文档源中生成一个 PDF，那么该文件会放置在构建目录中。您可以更改此行为，但为了获得一致性，我们还是保留了默认格式。&lt;/p&gt;
&lt;p&gt;让我们快速启动 &lt;a href=&quot;http://www.ibm.com/developerworks/cn/opensource/os-sphinx-documentation/index.html?ca=drs-#listing4&quot;&gt;清单 4&lt;/a&gt; 的一个新的文档项目，系统会通过一些问题提示您如何操作。请按下 &lt;strong&gt;Enter&lt;/strong&gt; 键接受所有的默认值。&lt;br /&gt;
&lt;a name=&quot;listing4&quot;&gt;&lt;strong&gt;清单 4.                     执行 sphinx-quickstart&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;
&lt;table border=&quot;0&quot; cellspacing=&quot;0&quot; cellpadding=&quot;0&quot; width=&quot;100%&quot; summary=&quot;This table contains a code listing.&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;pre&gt;
$ sphinx-quickstart
Welcome to the Sphinx 1.0.5 quickstart utility.

Please enter values for the following settings (just press Enter to
accept a default value, if one is given in brackets).
[...]&lt;/pre&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;我选择 &amp;#8220;My Project&amp;#8221; 作为项目名称，该名称会在多处被引用。您可以随意选择不同的名称。&lt;/p&gt;
&lt;p&gt;运行 &lt;code&gt;sphinx-quickstart&lt;/code&gt; 命令后，在工作目录中会出现类似 &lt;a href=&quot;http://www.ibm.com/developerworks/cn/opensource/os-sphinx-documentation/index.html?ca=drs-#listing5&quot;&gt;清单 5&lt;/a&gt; 的文件。&lt;br /&gt;
&lt;a name=&quot;listing5&quot;&gt;&lt;strong&gt;清单 5.                     工作目录的列表&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;
&lt;table border=&quot;0&quot; cellspacing=&quot;0&quot; cellpadding=&quot;0&quot; width=&quot;100%&quot; summary=&quot;This table contains a code listing.&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;pre&gt;
.
├── Makefile
├── _build
├── _static
├── conf.py
└── index.rst&lt;/pre&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;让我们详细研究一下每个文件。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt; &lt;strong&gt;Makefile&lt;/strong&gt;：编译过代码的开发人员应该非常熟悉这个文件，如果不熟悉，那么可以将它看作是一个包含指令的文件，在使用 &lt;code&gt;make&lt;/code&gt; 命令时，可以使用这些指令来构建文档输出。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;_build&lt;/strong&gt;：这是触发特定输出后用来存放所生成的文件的目录。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;_static&lt;/strong&gt;：所有不属于源代码（如图像）一部分的文件均存放于此处，稍后会在构建目录中将它们链接在一起。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;conf.py&lt;/strong&gt;：这是一个 Python 文件，用于存放 Sphinx 的配置值，包括在终端执行 &lt;code&gt;sphinx-quickstart&lt;/code&gt; 时选中的那些值。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;index.rst&lt;/strong&gt;：文档项目的 root 目录。如果将文档划分为其他文件，该目录会连接这些文件。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a name=&quot;N10134&quot;&gt; 入门指南 &lt;/a&gt;&lt;/p&gt;
&lt;p&gt;此时，我们已经正确安装了 Sphinx，查看了默认结构，并了解了一些基本语法。不要直接开始编写文档。缺乏布局和输出方面的知识会让您产生混淆，可能耽误您的整个进程。&lt;/p&gt;
&lt;p&gt;现在来深入了解一下 &lt;code&gt;index.rst&lt;/code&gt; 文件。它包含大量的信息和其他一些复杂的语法。为了更顺利地完成任务并避免干扰，我们将合并一个新文件，将它列在主要章节中。&lt;/p&gt;
&lt;p&gt;在 &lt;code&gt;index.rst&lt;/code&gt; 文件中的主标题之后，有一个内容清单，其中包括 &lt;code&gt;toctree&lt;/code&gt; 声明。&lt;code&gt;toctree&lt;/code&gt; 是将所有文档汇集到文档中的中心元素。如果有其他文件存在，但没有将它们列在此指令下，那么在构建的时候，这些文件不会随文档一起生成。&lt;/p&gt;
&lt;p&gt;我们想将一个新文件添加到文档中，并打算将其命名为 &lt;code&gt;example.rst&lt;/code&gt;。还需要将它列在 &lt;code&gt;toctree&lt;/code&gt; 中，但要谨慎操作。文件名后面需要有一个间隔，这样文件名清单才会有效，该文件不需要文件扩展名（在本例中为 &lt;code&gt;.rst&lt;/code&gt;）。&lt;a href=&quot;http://www.ibm.com/developerworks/cn/opensource/os-sphinx-documentation/index.html?ca=drs-#listing6&quot;&gt;清单 6&lt;/a&gt; 显示该列表的外观。在文件名距离左边距有三个空格的距离，&lt;code&gt;maxdepth&lt;/code&gt; 选项后面有一个空白行。&lt;br /&gt;
&lt;a name=&quot;listing6&quot;&gt;&lt;strong&gt;清单 6. index.rst 中的 toctree 示例&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;
&lt;table border=&quot;0&quot; cellspacing=&quot;0&quot; cellpadding=&quot;0&quot; width=&quot;100%&quot; summary=&quot;This table contains a code listing.&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;pre&gt;
Contents:

.. toctree::
   :maxdepth: 2

   example&lt;/pre&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;此时，不用担心其他选项。目前，注意到了有一个列出其他单独的文件的索引文件，该文件可存储有效文档，因此，该列表有一定的顺序和空格，才能使该列表变得有效。&lt;/p&gt;
&lt;p&gt;还记得 &lt;a href=&quot;http://www.ibm.com/developerworks/cn/opensource/os-sphinx-documentation/index.html?ca=drs-#listing2&quot;&gt;清单 2&lt;/a&gt; 中的示例语法吗? 请复制该示例，将它粘贴到 &lt;code&gt;example.rst&lt;/code&gt; 文件中并保存它。现在我们准备生成输出。&lt;/p&gt;
&lt;p&gt;运行 &lt;code&gt;make&lt;/code&gt; 命运，并将 HTML 指定为输出格式。可直接将该输出用作网站，因为它包含了生成的所有内容，包括 JavaScript 和 CSS 文件。请参见 &lt;a href=&quot;http://www.ibm.com/developerworks/cn/opensource/os-sphinx-documentation/index.html?ca=drs-#listing7&quot;&gt;清单 7&lt;/a&gt;。&lt;br /&gt;
&lt;a name=&quot;listing7&quot;&gt;&lt;strong&gt;清单 7. &lt;code&gt;make html&lt;/code&gt; 命令的输出&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;
&lt;table border=&quot;0&quot; cellspacing=&quot;0&quot; cellpadding=&quot;0&quot; width=&quot;100%&quot; summary=&quot;This table contains a code listing.&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;pre&gt;
$ make html
sphinx-build -b html -d _build/doctrees   . _build/html
Making output directory...
Running Sphinx v1.0.5
loading pickled environment... not yet created
building [html]: targets for 2 source files that are out of date
updating environment: 2 added, 0 changed, 0 removed
reading sources... [100%] index
looking for now-outdated files... none found
pickling environment... done
checking consistency... done
preparing documents... done
writing output... [100%] index
writing additional files... genindex search
copying static files... done
dumping search index... done
dumping object inventory... done
build succeeded.

Build finished. The HTML pages are in _build/html.&lt;/pre&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;如果您对 &lt;code&gt;make&lt;/code&gt; 命令提供的其他选项感兴趣，请参见 &lt;a href=&quot;http://www.ibm.com/developerworks/cn/opensource/os-sphinx-documentation/index.html?ca=drs-#listing8&quot;&gt;清单 8&lt;/a&gt;，将帮助标志传至此处，并查看完整的描述。&lt;br /&gt;
&lt;a name=&quot;listing8&quot;&gt;&lt;strong&gt;清单 8.                     列示 make 选项&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;
&lt;table border=&quot;0&quot; cellspacing=&quot;0&quot; cellpadding=&quot;0&quot; width=&quot;100%&quot; summary=&quot;This table contains a code listing.&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;pre&gt;
$ make -h
Usage: make [options] [target] ...
Options:
[...]&lt;/pre&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;a name=&quot;N101B1&quot;&gt;生成静态网站&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;随着我们完成第一步操作，从两个文件中生成 HTML 之后，我们就拥有一个完整的函数式（静态）网站。&lt;/p&gt;
&lt;p&gt;在 &lt;code&gt;_build&lt;/code&gt; 目录内，现在应该有两个目录：&lt;code&gt;doctrees&lt;/code&gt; 和                 &lt;code&gt;HTML&lt;/code&gt;。我们对于这个存储了文档网站所需的全部文件的 HTML 目录很感兴趣。使用浏览器打开 index.html 文件，就会发现如 &lt;a href=&quot;http://www.ibm.com/developerworks/cn/opensource/os-sphinx-documentation/index.html?ca=drs-#fig1&quot;&gt;图 1&lt;/a&gt; 所示的内容。&lt;br /&gt;
&lt;a name=&quot;fig1&quot;&gt;&lt;strong&gt;图 1. 静态 HTML 形式的主页&lt;/strong&gt;&lt;/a&gt;&lt;br /&gt;
&lt;img src=&quot;http://www.ibm.com/developerworks/cn/opensource/os-sphinx-documentation/figure001.jpg&quot; alt=&quot;浏览器中生成的 HTML 文档的屏幕截图。&quot; width=&quot;566&quot; height=&quot;525&quot; /&gt;&lt;/p&gt;
&lt;p&gt;虽然信息很少，但 Sphinx 能够创建很多内容。我们拥有一个基本布局，该布局包含有关项目文档、搜索部分、内容表、附带名称和日期的版权声明、页码的一些信息。&lt;/p&gt;
&lt;p&gt;搜索部分非常有趣，因为 Sphinx 已经为所有文件建立索引，并使用 JavaScript 的一些强大功能创建了一个可搜索的静态网站。&lt;/p&gt;
&lt;p&gt;还记得我们已将 &lt;code&gt;example&lt;/code&gt; 作为一个单独的文件添加至 &lt;a href=&quot;http://www.ibm.com/developerworks/cn/opensource/os-sphinx-documentation/index.html?ca=drs-#listing6&quot;&gt;清单 6&lt;/a&gt; 的 &lt;code&gt;toctree&lt;/code&gt; 中的文档吗？您可以看到，主标题显示为内容索引中的主要项目符号，副标题显示为二级项目符号。Sphinx 小心维护着让整个结构保持正确。&lt;/p&gt;
&lt;div&gt;&lt;a name=&quot; &quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;如果一开始就没有成功&amp;#8230;&lt;/h2&gt;
&lt;div&gt;
&lt;p&gt;进行一些修改后，只需再次运行 &lt;code&gt;make&lt;/code&gt; 命令，即可生成这些文件。&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;所有的链接都指向文档中的正确位置，并且标题和副标题均有定位点，允许直接进行链接。比如，&lt;code&gt;Subject Subtitle&lt;/code&gt; 部分在浏览器中有一个类似 &lt;code&gt;../example.html#subject-subtitle&lt;/code&gt; 的定位点。如前所述，该工具消除了我们对这些琐碎的、重复的需求的顾虑。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://www.ibm.com/developerworks/cn/opensource/os-sphinx-documentation/index.html?ca=drs-#fig2&quot;&gt;图 2&lt;/a&gt; 显示了 &lt;code&gt;example.rst&lt;/code&gt; 如何显示为静态网站中的 HTML 文件。&lt;br /&gt;
&lt;a name=&quot;fig2&quot;&gt;&lt;strong&gt;图2. HTML 页面示例&lt;/strong&gt;&lt;/a&gt;&lt;br /&gt;
&lt;img src=&quot;http://www.ibm.com/developerworks/cn/opensource/os-sphinx-documentation/figure002.jpg&quot; alt=&quot;屏幕截屏显示格式化为 HTML 页面的示例，带有明确定义的标题、段落和子弹目录列表&quot; width=&quot;554&quot; height=&quot;548&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;a name=&quot;N10224&quot;&gt;添加图形&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;简明的段落、图像和图形都为项目文档增加趣味性和可读性。Sphinx 有助于利用这些有可能添加了静态文件的主要元素来吸引读者的注意。&lt;/p&gt;
&lt;p&gt;添加静态文件的正确语法很容易记忆。只要将静态文件放置 &lt;code&gt;_static&lt;/code&gt; 目录（Sphinx 在创建文档布局时创建了该目录）中，就可以轻松地对其进行引用。在 &lt;a href=&quot;http://www.ibm.com/developerworks/cn/opensource/os-sphinx-documentation/index.html?ca=drs-#listing9&quot;&gt;清单 9&lt;/a&gt;，查看 reStructuredTex 文件中的引用应该是什么样子的。在本例中，我将其添加在 &lt;code&gt;example.rst&lt;/code&gt; 的底部。&lt;br /&gt;
&lt;a name=&quot;listing9&quot;&gt;&lt;strong&gt;清单 9.                     example.rst 的静态清单&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;
&lt;table border=&quot;0&quot; cellspacing=&quot;0&quot; cellpadding=&quot;0&quot; width=&quot;100%&quot; summary=&quot;This table contains a code listing.&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;pre&gt;
.. image:: _static/system_activity.jpg&lt;/pre&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;生成文档之后，应将图像正确放置在我们为有关系统活动的 JPEG 小图像指定的地方。它看上起应该类似于 &lt;a href=&quot;http://www.ibm.com/developerworks/cn/opensource/os-sphinx-documentation/index.html?ca=drs-#fig3&quot;&gt;图 3&lt;/a&gt;。&lt;br /&gt;
&lt;a name=&quot;fig3&quot;&gt;&lt;strong&gt;图 3. 系统活动图像&lt;/strong&gt;&lt;/a&gt;&lt;br /&gt;
&lt;img src=&quot;http://www.ibm.com/developerworks/cn/opensource/os-sphinx-documentation/figure003.jpg&quot; alt=&quot;HTML 文档的屏幕截屏，其中包含一个饼图&quot; width=&quot;566&quot; height=&quot;295&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;a name=&quot;N1025B&quot;&gt; 结束语 &lt;/a&gt;&lt;/p&gt;
&lt;p&gt;本文介绍了开始使用 Sphinx 的一些基础知识，但仍有许多内容有待我们探索。Sphinx 能够用不同的格式导出文档，但要求安装额外的库和软件。可生成的格式包括：PDF、epub、man (UNIX Manual Pages) 和 LaTeX。&lt;/p&gt;
&lt;p&gt;对于复杂的图形，有一个插件可将 Graphviz  图形添加至您的文档项目。我曾经不得不为一个小型办公网络地图创建一个插件，但它表现相当出色，无需使用其他工具，便可在同一文档中获取所有的东西。与  Graphviz 插件类似，有大量可用于 Sphinx 的插件（亦称为扩展）。Sphinx 提供了一些插件，比如  interSphinx，该插件允许您链接不同的 Sphinx 项目。&lt;/p&gt;
&lt;p&gt;如果生成的输出的外观不符合您的喜好，Sphinx 还提供了许多主题，可应用它们来完全改变 HTML  文件呈现文档的方式。一些重要的开源项目，如 Celery 和 Lettuce，通过更改 CSS 并扩展模板完全更改了 HTML 的外观。请参阅 &lt;a href=&quot;http://www.ibm.com/developerworks/cn/opensource/os-sphinx-documentation/index.html?ca=drs-#resources&quot;&gt;参考资料&lt;/a&gt; 部分，以获取这些项目的链接、解释如何扩展的文档的链接以及修改默认 CSS 和布局的链接。&lt;/p&gt;
&lt;p&gt;Sphinx 改变了我对编写文档的看法。从一开始的毫无灵感，到现在能够轻易编制我的几乎所有的个人开源项目以及少数内部项目，我感到非常兴奋。使用 Sphinx 可轻松检索遗忘在您自己文档中的信息。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://www.ibm.com/developerworks/cn/opensource/os-sphinx-documentation/index.html?ca=drs-#ibm-pcon&quot;&gt;回页首&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a name=&quot;download&quot;&gt;下载&lt;/a&gt;&lt;/p&gt;
&lt;table border=&quot;0&quot; cellspacing=&quot;0&quot; cellpadding=&quot;0&quot; width=&quot;100%&quot; summary=&quot;This table contains downloads for this document.&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;th scope=&quot;col&quot;&gt;描述&lt;/th&gt;
&lt;th scope=&quot;col&quot;&gt;名字&lt;/th&gt;
&lt;th scope=&quot;col&quot;&gt;大小&lt;/th&gt;
&lt;th scope=&quot;col&quot;&gt;下载方法&lt;/th&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td scope=&quot;row&quot;&gt;本文的样例 Sphinx 项目&lt;/td&gt;
&lt;td&gt;example_sphinx_project.zip&lt;/td&gt;
&lt;td&gt;142KB&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;http://www.ibm.com/developerworks/apps/download/index.jsp?contentid=788234&amp;amp;filename=example_sphinx_project.zip&amp;amp;method=http&amp;amp;locale=zh_CN&quot;&gt;HTTP&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;a href=&quot;http://www.ibm.com/developerworks/cn/whichmethod.html&quot;&gt;关于下载方法的信息&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a name=&quot;resources&quot;&gt;参考资料 &lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;学习&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt; &lt;a href=&quot;http://sphinx.pocoo.org/&quot;&gt;Sphinx 项目文档&lt;/a&gt;&lt;/li&gt;
&lt;li&gt; &lt;a href=&quot;http://sphinx.pocoo.org/extensions.html&quot;&gt;Sphinx 扩展&lt;/a&gt;：查找第三方扩展的完整列表和一些外部引用。&lt;/li&gt;
&lt;li&gt; &lt;a href=&quot;http://sphinx.pocoo.org/theming.html&quot;&gt;Theming and Templating&lt;/a&gt;：浏览解释扩展当前主题和应用新主题的部分。&lt;/li&gt;
&lt;li&gt; &lt;a href=&quot;http://celeryq.org/docs/&quot;&gt;Celery 项目文档&lt;/a&gt; 使用                 Sphinx 修改 CSS 和 Font 的默认值。&lt;/li&gt;
&lt;li&gt; &lt;a href=&quot;http://docs.python.org/&quot;&gt;Python Programming Language                     文档&lt;/a&gt;：构建 Sphinx 是为了支持 Python 上的完整文档。&lt;/li&gt;
&lt;li&gt; &lt;a href=&quot;http://lettuce.it/&quot;&gt;Lettuce&lt;/a&gt; 是另一个开源项目，它（极大地）修改了 Sphinx 生成 HTML 的方式。&lt;/li&gt;
&lt;li&gt; &lt;a href=&quot;http://pacha.cafepais.com/docs/index.html&quot;&gt;Pacha: System                     Configuration Engine&lt;/a&gt; 是我使用 Sphinx 实现的开源项目之一。&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.ibm.com/developerworks/cn/opensource/&quot;&gt;developerWorks 中国网站开源技术专区&lt;/a&gt;：获取大量 how-to 信息、工具和项目更新，以帮助您了解如何使用开源技术进行开发，以及如何同 IBM 产品相结合使用。&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.ibm.com/developerworks/views/opensource/events.jsp&quot;&gt;感兴趣的活动&lt;/a&gt;：查看面向 IBM 开源开发人员的即将召开的会议、贸易展览和网络广播。&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.ibm.com/developerworks/podcast/&quot;&gt;developerWorks 播客&lt;/a&gt;：收听面向软件开发人员的有趣访谈和讨论。&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.ibm.com/developerworks/cn/offers/lp/demos/&quot;&gt;developerWorks 演示中心&lt;/a&gt;：观看我们的免费演示，学习 IBM 与开源技术及产品功能。&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://twitter.com/developerworks&quot;&gt;Twitter 上的 developerWorks&lt;/a&gt;：关注我们最新的新闻。&lt;/li&gt;
&lt;li&gt;随时关注 developerWorks &lt;a href=&quot;http://www.ibm.com/developerworks/cn/offers/techbriefings/&quot;&gt;技术活动&lt;/a&gt;和&lt;a href=&quot;http://www.ibm.com/developerworks/cn/swi/&quot;&gt;网络广播&lt;/a&gt;。&lt;/li&gt;
&lt;li&gt; 访问 developerWorks &lt;a href=&quot;http://www.ibm.com/developerworks/cn/opensource/&quot;&gt;Open source 专区&lt;/a&gt;获得丰富的 how-to 信息、工具和项目更新以及&lt;a href=&quot;http://www.ibm.com/developerworks/cn/opensource/best2009/index.html&quot;&gt;最受欢迎的文章和教程&lt;/a&gt;，帮助您用开放源码技术进行开发，并将它们与 IBM 产品结合使用。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;获得产品和技术&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://www.ibm.com/developerworks/cn/downloads/&quot;&gt;IBM 产品评估试用版软件&lt;/a&gt;：从试用版下载到云托管产品，您可以使用专为开发人员设计的软件创新您的下一个开源项目。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;讨论&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;访问其作者的 &lt;a href=&quot;http://www.alfredodeza.com/&quot;&gt;主页&lt;/a&gt; 获取更多评论和交互。&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.ibm.com/developerworks/cn/community/&quot;&gt;developerWorks 中文社区&lt;/a&gt;：查看开发人员推动的博客、论坛、群组和 wikis，并与其他 developerWorks 用户交流。帮助构建 developerWorks 社区中的 &lt;a href=&quot;https://www.ibm.com/developerworks/mydeveloperworks/groups/service/html/communityview?communityUuid=6e6f6d1b-95c3-46df-8a26-b7efd8ee4b57&quot;&gt;真实世界开源&lt;/a&gt; 讨论组。&lt;/li&gt;
&lt;li&gt;加入 &lt;a href=&quot;http://www.ibm.com/developerworks/cn/community/&quot;&gt;developerWorks 中文社区&lt;/a&gt;，developerWorks 社区是一个面向全球 IT 专业人员，可以提供博客、书签、wiki、群组、联系、共享和协作等社区功能的专业社交网络社区。&lt;/li&gt;
&lt;li&gt;加入 &lt;a href=&quot;https://www.ibm.com/developerworks/mydeveloperworks/groups/service/html/communityview?communityUuid=38997896-bb16-451a-aa97-189a27a3cd5a/?lang=zh&quot;&gt;IBM 软件下载与技术交流群组&lt;/a&gt;，参与在线交流。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a name=&quot;author&quot;&gt;关于作者&lt;/a&gt;&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p&gt;&lt;a name=&quot;author1&quot;&gt; &lt;/a&gt; &lt;a href=&quot;http://www.alfredodeza.com/&quot; target=&quot;_blank&quot;&gt;Alfredo Deza&lt;/a&gt; 是一名软件工程师，以前曾是一名职业运动员，并且是一名具有强大的系统管理背景的奥林匹克参赛选手。他对开放源码软件充满热情，还是本地技术小组和国际会议（如 PyCon）的定期演讲者。在空闲时间里，他试图提高自己的摄影技巧，并且喜欢为开放源码项目做贡献。&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #888888;&quot;&gt;原文：http://www.ibm.com/developerworks/cn/opensource/os-sphinx-documentation/index.html?ca=drs-&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div  class=&quot;related_post_title&quot;&gt;&lt;h4 style=\&quot;font-size:14px;color:#EEEEEE;\&quot;&gt;推荐阅读&lt;/h4&gt;&lt;style&gt;.related_post li{padding-top:10px !important;}&lt;/style&gt;&lt;/div&gt;&lt;ul class=&quot;related_post&quot;&gt;&lt;li&gt;&lt;a href=&quot;http://www.uini.net/2012/02/wddns-duo-xian-lu-fen-sheng-fen-zhi-neng-dns-xi-tong-wddns-1-3-fa-bu.html&quot; title=&quot;wddns/多线路/分省份智能DNS系统wddns 1.3发布&quot;&gt;wddns/多线路/分省份智能DNS系统wddns 1.3发布&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://www.uini.net/2012/02/mysql-search-with-sphinx.html&quot; title=&quot;使用 Sphinx 更好地进行 MySQL 搜索&quot;&gt;使用 Sphinx 更好地进行 MySQL 搜索&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://www.uini.net/2012/02/encrypt-the-file.html&quot; title=&quot;有关文件的加密 &quot;&gt;有关文件的加密 &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://www.uini.net/2011/12/sphinx-2-0-3-released-full-text-search-engine.html&quot; title=&quot;Sphinx 2.0.3 发布，全文搜索引擎&quot;&gt;Sphinx 2.0.3 发布，全文搜索引擎&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://www.uini.net/2011/12/java-respectively-to-achieve-the-windows-platform-and-linux-platform-ip-access.html&quot; title=&quot;JAVA分别实现Windows平台和Linux平台下的ip获取&quot;&gt;JAVA分别实现Windows平台和Linux平台下的ip获取&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;img src=&quot;http://www1.feedsky.com/t1/603577472/uini/feedsky/s.gif?r=http://item.feedsky.com/~feedsky/uini/~8195296/603577472/6299073/1/item.html&quot; border=&quot;0&quot; height=&quot;0&quot; width=&quot;0&quot; style=&quot;position:absolute&quot; /&gt;</content:encoded><wfw:commentRss>http://www.uini.net/2012/02/making-use-of-simple-and-beautiful-sphinx-documentation.html/feed</wfw:commentRss><slash:comments>0</slash:comments><description>使文档变得更有效并且可编写


Alfredo Deza, 软件工程师
简介： 学习如何使用 Sphinx 工具创建能够以各种格式（如 HTML）自动进行分布的可维护的、样式支配的文档。
标记本文！


发布日期： 2012 年 1 月 18 日
级别： 中级
原创语言： 英文
访问情况 ： 2523 次浏览
评论： 0 (查看 &amp;#124; 添加评论 &amp;#8211; 登录)
 平均分 (3个评分)
为本文评分


简介
Sphinx 是一种工具，它允许开发人员以纯文本格式编写文档，以便采用满足不同需求的格式轻松生成输出。这在使用 Version  Control System 追踪变更时非常有用。纯文本文档对不同系统之间的协作者也非常有用。纯文本是当前可以采用的最便捷的格式之一。
虽然 Sphinx 是用 Python 编写的，并且最初是为 Python 语言文档而创建，但它并不一定是以语言为中心，在某些情况下，甚至不是以程序员为中心。Sphinx 有许多用处，比如可以用它来编写整本书！

突出显示

默认情况下，Sphinx 会为 Python 突出显示代码，但它还允许定义其他编程语言，比如 C 和 Ruby。


可以将 Sphinx 想像成为一种文档框架：它会抽象化比较单调的部分，并提供自动函数来解决一些常见问题，比如突出显示标题索引和特殊代码（在显示代码示例时），以及突出显示适当的语法。
要求
您应该能轻车熟路地使用 Linux® 或 UNIX® 终端（也称为控制台或终端仿真器），因为命令行界面是与 Sphinx 进行互动的主要方式。
您需要安装 Python。在所有主要的 Linux 发行版和一些基于 UNIX [...]&lt;img src=&quot;http://www1.feedsky.com/t1/603577472/uini/feedsky/s.gif?r=http://item.feedsky.com/~feedsky/uini/~8195296/603577472/6299073/1/item.html&quot; border=&quot;0&quot; height=&quot;0&quot; width=&quot;0&quot; style=&quot;position:absolute&quot; /&gt;</description><category>linux</category><category>文档</category><category>sphinx</category><pubDate>Wed, 01 Feb 2012 14:03:34 +0800</pubDate><author>nick</author><comments>http://www.uini.net/2012/02/making-use-of-simple-and-beautiful-sphinx-documentation.html#comments</comments><guid isPermaLink="false">http://www.uini.net/?p=1864</guid><dc:creator>nick</dc:creator><fs:srclink>http://www.uini.net/2012/02/making-use-of-simple-and-beautiful-sphinx-documentation.html</fs:srclink><fs:srcfeed>http://www.uini.net/feed</fs:srcfeed><fs:itemid>feedsky/uini/~8195296/603577472/6299073</fs:itemid></item><item><title>有关文件的加密</title><link>http://item.feedsky.com/~feedsky/uini/~8195296/603577473/6299073/1/item.html</link><content:encoded>&lt;p&gt;对于一个把电脑当成自己小三儿的人来说，自己的一些文件的加密很有意义。你看韩峰同志，就是因为不注意自己文件的保密，结果弄得现在上天无路入地无门的。由此可见，把自己私密的文件加好密，是多么的重要啊！&lt;/p&gt;
&lt;p&gt;所以，本文就着重讨论一些保护自己隐私文件的方法。&lt;/p&gt;
&lt;h2&gt;加密分区&lt;/h2&gt;
&lt;p&gt;使用Linux的用户，可以使用cryptsetup。&lt;/p&gt;
&lt;p&gt;使用它加密自己的整个分区，很容易。只需要四步，我再下面把这四步一齐写出来，然后加上详细的注释，读者一看就明白了。&lt;/p&gt;
&lt;pre&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&lt;strong&gt;[plain]&lt;/strong&gt; &lt;a title=&quot;view plain&quot; href=&quot;http://blog.csdn.net/naihe2010/article/details/7224971#&quot;&gt;view plain&lt;/a&gt;&lt;a title=&quot;copy&quot; href=&quot;http://blog.csdn.net/naihe2010/article/details/7224971#&quot;&gt;copy&lt;/a&gt;&lt;a title=&quot;print&quot; href=&quot;http://blog.csdn.net/naihe2010/article/details/7224971#&quot;&gt;print&lt;/a&gt;&lt;a title=&quot;?&quot; href=&quot;http://blog.csdn.net/naihe2010/article/details/7224971#&quot;&gt;?&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;ol&gt;
&lt;li&gt;# 在一个分区上，写入加密有关的信息&lt;/li&gt;
&lt;li&gt;# 下面这个命令，就是把'/dev/sda7'这个分区写入加密的信息&lt;/li&gt;
&lt;li&gt;# 在创建的过程中，会询问你是否执行，记着回答大写的YES&lt;/li&gt;
&lt;li&gt;# 然后就是输入加密的密码。这个密码要记好，当你打开这个设备的时候，要输入这个密码的&lt;/li&gt;
&lt;li&gt;# 当然，也可以加密别的分区&lt;/li&gt;
&lt;li&gt;cryptsetup luksFormat /dev/sda7&lt;/li&gt;
&lt;li&gt;&lt;/li&gt;
&lt;li&gt;# 把这个分区打开为一个块设备文件&lt;/li&gt;
&lt;li&gt;# 下面这个命令，将把'/dev/sda7'这个设备，打开到'/dev/mapper/pfile'上&lt;/li&gt;
&lt;li&gt;# 你以后所有的操作，都将在'/dev/mapper/pfile'上进行&lt;/li&gt;
&lt;li&gt;# 在打开的过程中，会询问你创建时的密码，如果密码不对，这个设备无法打开，也就无法使用&lt;/li&gt;
&lt;li&gt;# 当然，也可以打开到别的文件名，比如'pussy'，如果你够流氓的话&lt;/li&gt;
&lt;li&gt;cryptsetup luksOpen /dev/sda7 pfile&lt;/li&gt;
&lt;li&gt;&lt;/li&gt;
&lt;li&gt;# 格式化这个分区&lt;/li&gt;
&lt;li&gt;# 下面这个命令，就是把刚才创建的加密分区pfile，格式化为ext3格式&lt;/li&gt;
&lt;li&gt;# 当然，也可以格式成其它格式&lt;/li&gt;
&lt;li&gt;# 对于linux系统来说，'/dev/mapper/pfile'是一个和别的块设备一模一样的设备文件，你可以在上面一般的任何其它操作&lt;/li&gt;
&lt;li&gt;mkfs -t ext3 /dev/mapper/pfile&lt;/li&gt;
&lt;li&gt;&lt;/li&gt;
&lt;li&gt;# 打开这个加密的分区&lt;/li&gt;
&lt;li&gt;&lt;/li&gt;
&lt;li&gt;# 挂载这个分区&lt;/li&gt;
&lt;li&gt;# 下面这个命令，就是把刚才创建的文件系统'/dev/mapper/pfile'，挂载到'/home/user/pfile'这个目录上&lt;/li&gt;
&lt;li&gt;# 当然，也可以挂载到任何其它的目录上&lt;/li&gt;
&lt;li&gt;mount /dev/mapper/pfile /home/user/pfile&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;/pre&gt;
&lt;p&gt;至此，一个加密后挂载成功的分区就创建好了。你可以像使用不加密的分区一样使用它，完全没有区别。&lt;/p&gt;
&lt;p&gt;在实际的应用中，前面的两步，做好后就可以了。后面的两步，是每次挂载这个分区，都要这样使用的。&lt;/p&gt;
&lt;p&gt;有些Linux发行版，可能自动地支持创建加密分区的图形化的界面。但是我是不太喜欢的，因为它有时候唬不了人。比如，犯罪分子绑架了你，他们一打开 电脑，到了挂载加密分区的时候，肯定就会提示输入密码，这时候你不输入，也不行。当然，这个例子也适用于你是犯罪分子面对人民警察要你打开自己电脑的时 候。&lt;/p&gt;
&lt;p&gt;所以我是把这个操作，自己手动的写在/etc/rc.local里，在加密的分区的挂载上，加上一个询问，如果回答不对，就不挂载了，当然，也就不会提示输入密码。如：&lt;/p&gt;
&lt;pre&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&lt;strong&gt;[plain]&lt;/strong&gt; &lt;a title=&quot;view plain&quot; href=&quot;http://blog.csdn.net/naihe2010/article/details/7224971#&quot;&gt;view plain&lt;/a&gt;&lt;a title=&quot;copy&quot; href=&quot;http://blog.csdn.net/naihe2010/article/details/7224971#&quot;&gt;copy&lt;/a&gt;&lt;a title=&quot;print&quot; href=&quot;http://blog.csdn.net/naihe2010/article/details/7224971#&quot;&gt;print&lt;/a&gt;&lt;a title=&quot;?&quot; href=&quot;http://blog.csdn.net/naihe2010/article/details/7224971#&quot;&gt;?&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;ol&gt;
&lt;li&gt;echo &quot;If mount personal directory? YES/NO&quot;&lt;/li&gt;
&lt;li&gt;read ans&lt;/li&gt;
&lt;li&gt;if [ &quot;x$ans&quot; == &quot;xYESIAM&quot; ]; then&lt;/li&gt;
&lt;li&gt;    mkdir -vp /home/user/pfile &amp;amp;&amp;amp; cryptsetup luksOpen /dev/sda7 pfile &amp;amp;&amp;amp; mount /dev/mapper/pfile /home/user/pfile&lt;/li&gt;
&lt;li&gt;fi&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;/pre&gt;
&lt;h2&gt;用Vim加密文件&lt;/h2&gt;
&lt;p&gt;如果你使用Vim编辑器，它自身的-x命令，就是加密选项。&lt;/p&gt;
&lt;p&gt;比如，当你打开一个新文件时，用vim -x newfile，这时，vim会提示你输入密码，输入完成后，你的文件保存的时候，就会被保存成加密的。这个加密级别没有那么高，但是对于一般文件的隐私保护也够用了。&lt;/p&gt;
&lt;p&gt;并且，当你用vim打开一个用vim加密的文件时，无论是否提供-x选项，vim都会提示你输入密码的。很方便吧？&lt;/p&gt;
&lt;p&gt;其实，vim的加密，是通过set key=这个命令来实现的。比如，你并没有使用-x选项打开一个新文件，但是你在命令行敲入了&amp;#8217;set  key=abcde&amp;#8217;，当文件被保存的时候，就会用abcde做为密码加密了。注意，这时候的key后面的字符串，并不会以不可见的字符显示。&lt;/p&gt;
&lt;p&gt;所以，你明白了，有一种非常简单的办法取消文件的加密，就是&amp;#8217;set key=&amp;#8217;，把密码设为空就可以了。&lt;/p&gt;
&lt;p&gt;熟悉Vim的ex模式的朋友，可以直接使用Vim来加密文件，而不必打开Vim：&lt;/p&gt;
&lt;pre&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&lt;strong&gt;[plain]&lt;/strong&gt; &lt;a title=&quot;view plain&quot; href=&quot;http://blog.csdn.net/naihe2010/article/details/7224971#&quot;&gt;view plain&lt;/a&gt;&lt;a title=&quot;copy&quot; href=&quot;http://blog.csdn.net/naihe2010/article/details/7224971#&quot;&gt;copy&lt;/a&gt;&lt;a title=&quot;print&quot; href=&quot;http://blog.csdn.net/naihe2010/article/details/7224971#&quot;&gt;print&lt;/a&gt;&lt;a title=&quot;?&quot; href=&quot;http://blog.csdn.net/naihe2010/article/details/7224971#&quot;&gt;?&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;ol&gt;
&lt;li&gt;# -e，使用ex模式，可以理解为命令模式&lt;/li&gt;
&lt;li&gt;# -s，使用安静模式，可以理解为只执行命令，不打开Vim&lt;/li&gt;
&lt;li&gt;# -c，打开文件执行的操作&lt;/li&gt;
&lt;li&gt;vim -e -s -c &quot;:set key=password_phrase&quot; -c &quot;:wq&quot; filename&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;/pre&gt;
&lt;h2&gt;用openssl加密文件&lt;/h2&gt;
&lt;p&gt;如果你要加密的文件比较少，或者你要传给你的亲密的人，这个文件不能被其它人打开的话，你可以使用openssl做文件级的加密。&lt;/p&gt;
&lt;p&gt;openssl的enc命令，可以用于把文件加密及解密操作，它的参数就是要使用的加密算法。而参数-in、-out，是通用的，一个用于输入文件，一个用于输出文件。&lt;/p&gt;
&lt;p&gt;还是老规矩，我直接把命令写出来，加上详细一些的注释。&lt;/p&gt;
&lt;pre&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&lt;strong&gt;[plain]&lt;/strong&gt; &lt;a title=&quot;view plain&quot; href=&quot;http://blog.csdn.net/naihe2010/article/details/7224971#&quot;&gt;view plain&lt;/a&gt;&lt;a title=&quot;copy&quot; href=&quot;http://blog.csdn.net/naihe2010/article/details/7224971#&quot;&gt;copy&lt;/a&gt;&lt;a title=&quot;print&quot; href=&quot;http://blog.csdn.net/naihe2010/article/details/7224971#&quot;&gt;print&lt;/a&gt;&lt;a title=&quot;?&quot; href=&quot;http://blog.csdn.net/naihe2010/article/details/7224971#&quot;&gt;?&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;ol&gt;
&lt;li&gt;# 把文件diary.tex加密，用des3加密算法，加密完成后，输出文件为diary.tex.des3&lt;/li&gt;
&lt;li&gt;# des可以换成很多其它的加密算法。详细列表，请用openssl enc --help查看&lt;/li&gt;
&lt;li&gt;openssl enc -des3 -in diary.tex -out diary.tex.des3&lt;/li&gt;
&lt;li&gt;&lt;/li&gt;
&lt;li&gt;# 把文件diray.tex.des3解密，文件是用des3加密过的，解密完成后，输出文件为diary.tex&lt;/li&gt;
&lt;li&gt;openssl enc -d -des3 -in diary.tex.des3 -out diary.tex&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;/pre&gt;
&lt;p&gt;如果你像我一样，使用Vim做为编辑器，可以把这两行加入到你的配置脚本中去。&lt;/p&gt;
&lt;pre&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&lt;strong&gt;[plain]&lt;/strong&gt; &lt;a title=&quot;view plain&quot; href=&quot;http://blog.csdn.net/naihe2010/article/details/7224971#&quot;&gt;view plain&lt;/a&gt;&lt;a title=&quot;copy&quot; href=&quot;http://blog.csdn.net/naihe2010/article/details/7224971#&quot;&gt;copy&lt;/a&gt;&lt;a title=&quot;print&quot; href=&quot;http://blog.csdn.net/naihe2010/article/details/7224971#&quot;&gt;print&lt;/a&gt;&lt;a title=&quot;?&quot; href=&quot;http://blog.csdn.net/naihe2010/article/details/7224971#&quot;&gt;?&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;ol&gt;
&lt;li&gt;&quot; 打开.des3结尾的文件时，把它当做用openssl enc -des3加密过的文件，先解密，再打开显示。&lt;/li&gt;
&lt;li&gt;autocmd BufReadPost     *.des3          %!openssl enc -d -des3 -in &quot;%&quot;&lt;/li&gt;
&lt;li&gt;&lt;/li&gt;
&lt;li&gt;&quot; 保存.des3结尾的文件时，把当用openssl enc -des3先加密。&lt;/li&gt;
&lt;li&gt;autocmd BufWritePost     *.des3          %!openssl enc -des3 -out &quot;%&quot;&lt;/li&gt;
&lt;/ol&gt;

&lt;span style=&quot;color: #888888;&quot;&gt;原文：http://blog.csdn.net/naihe2010/article/details/7224971&lt;/span&gt;
&lt;/div&gt;
&lt;/pre&gt;
&lt;div  class=&quot;related_post_title&quot;&gt;&lt;h4 style=\&quot;font-size:14px;color:#EEEEEE;\&quot;&gt;推荐阅读&lt;/h4&gt;&lt;style&gt;.related_post li{padding-top:10px !important;}&lt;/style&gt;&lt;/div&gt;&lt;ul class=&quot;related_post&quot;&gt;&lt;li&gt;&lt;a href=&quot;http://www.uini.net/2012/02/wddns-duo-xian-lu-fen-sheng-fen-zhi-neng-dns-xi-tong-wddns-1-3-fa-bu.html&quot; title=&quot;wddns/多线路/分省份智能DNS系统wddns 1.3发布&quot;&gt;wddns/多线路/分省份智能DNS系统wddns 1.3发布&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://www.uini.net/2012/02/making-use-of-simple-and-beautiful-sphinx-documentation.html&quot; title=&quot;使用 sphinx 制作简洁而又美观的文档&quot;&gt;使用 sphinx 制作简洁而又美观的文档&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://www.uini.net/2011/12/java-respectively-to-achieve-the-windows-platform-and-linux-platform-ip-access.html&quot; title=&quot;JAVA分别实现Windows平台和Linux平台下的ip获取&quot;&gt;JAVA分别实现Windows平台和Linux平台下的ip获取&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://www.uini.net/2011/11/san-storage-using-the-dd-command-to-achieve-a-snapshot-of-data-migration.html&quot; title=&quot;使用 dd 命令实现 SAN 存储的快照数据迁移&quot;&gt;使用 dd 命令实现 SAN 存储的快照数据迁移&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://www.uini.net/2011/10/centos-nagios-alarms-fly-under-the-letter-four-step-deployment.html&quot; title=&quot;CentOS下nagios报警飞信部署四步走&quot;&gt;CentOS下nagios报警飞信部署四步走&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;img src=&quot;http://www1.feedsky.com/t1/603577473/uini/feedsky/s.gif?r=http://item.feedsky.com/~feedsky/uini/~8195296/603577473/6299073/1/item.html&quot; border=&quot;0&quot; height=&quot;0&quot; width=&quot;0&quot; style=&quot;position:absolute&quot; /&gt;</content:encoded><wfw:commentRss>http://www.uini.net/2012/02/encrypt-the-file.html/feed</wfw:commentRss><slash:comments>0</slash:comments><description>对于一个把电脑当成自己小三儿的人来说，自己的一些文件的加密很有意义。你看韩峰同志，就是因为不注意自己文件的保密，结果弄得现在上天无路入地无门的。由此可见，把自己私密的文件加好密，是多么的重要啊！
所以，本文就着重讨论一些保护自己隐私文件的方法。
加密分区
使用Linux的用户，可以使用cryptsetup。
使用它加密自己的整个分区，很容易。只需要四步，我再下面把这四步一齐写出来，然后加上详细的注释，读者一看就明白了。



[plain] view plaincopyprint?


# 在一个分区上，写入加密有关的信息
# 下面这个命令，就是把'/dev/sda7'这个分区写入加密的信息
# 在创建的过程中，会询问你是否执行，记着回答大写的YES
# 然后就是输入加密的密码。这个密码要记好，当你打开这个设备的时候，要输入这个密码的
# 当然，也可以加密别的分区
cryptsetup luksFormat /dev/sda7

# 把这个分区打开为一个块设备文件
# 下面这个命令，将把'/dev/sda7'这个设备，打开到'/dev/mapper/pfile'上
# 你以后所有的操作，都将在'/dev/mapper/pfile'上进行
# 在打开的过程中，会询问你创建时的密码，如果密码不对，这个设备无法打开，也就无法使用
# 当然，也可以打开到别的文件名，比如'pussy'，如果你够流氓的话
cryptsetup luksOpen /dev/sda7 pfile

# 格式化这个分区
# 下面这个命令，就是把刚才创建的加密分区pfile，格式化为ext3格式
# 当然，也可以格式成其它格式
# 对于linux系统来说，'/dev/mapper/pfile'是一个和别的块设备一模一样的设备文件，你可以在上面一般的任何其它操作
mkfs -t ext3 /dev/mapper/pfile

# 打开这个加密的分区

# 挂载这个分区
# 下面这个命令，就是把刚才创建的文件系统'/dev/mapper/pfile'，挂载到'/home/user/pfile'这个目录上
# 当然，也可以挂载到任何其它的目录上
mount /dev/mapper/pfile /home/user/pfile



至此，一个加密后挂载成功的分区就创建好了。你可以像使用不加密的分区一样使用它，完全没有区别。
在实际的应用中，前面的两步，做好后就可以了。后面的两步，是每次挂载这个分区，都要这样使用的。
有些Linux发行版，可能自动地支持创建加密分区的图形化的界面。但是我是不太喜欢的，因为它有时候唬不了人。比如，犯罪分子绑架了你，他们一打开 电脑，到了挂载加密分区的时候，肯定就会提示输入密码，这时候你不输入，也不行。当然，这个例子也适用于你是犯罪分子面对人民警察要你打开自己电脑的时 候。
所以我是把这个操作，自己手动的写在/etc/rc.local里，在加密的分区的挂载上，加上一个询问，如果回答不对，就不挂载了，当然，也就不会提示输入密码。如：



[plain] view plaincopyprint?


echo &quot;If mount personal directory? YES/NO&quot;
read ans
if [ &quot;x$ans&quot; == &quot;xYESIAM&quot; ]; then
    mkdir -vp /home/user/pfile &amp;#38;&amp;#38; cryptsetup luksOpen /dev/sda7 pfile &amp;#38;&amp;#38; mount /dev/mapper/pfile /home/user/pfile
fi



用Vim加密文件
如果你使用Vim编辑器，它自身的-x命令，就是加密选项。
比如，当你打开一个新文件时，用vim -x newfile，这时，vim会提示你输入密码，输入完成后，你的文件保存的时候，就会被保存成加密的。这个加密级别没有那么高，但是对于一般文件的隐私保护也够用了。
并且，当你用vim打开一个用vim加密的文件时，无论是否提供-x选项，vim都会提示你输入密码的。很方便吧？
其实，vim的加密，是通过set key=这个命令来实现的。比如，你并没有使用-x选项打开一个新文件，但是你在命令行敲入了&amp;#8217;set  key=abcde&amp;#8217;，当文件被保存的时候，就会用abcde做为密码加密了。注意，这时候的key后面的字符串，并不会以不可见的字符显示。
所以，你明白了，有一种非常简单的办法取消文件的加密，就是&amp;#8217;set key=&amp;#8217;，把密码设为空就可以了。
熟悉Vim的ex模式的朋友，可以直接使用Vim来加密文件，而不必打开Vim：



[plain] view plaincopyprint?


# -e，使用ex模式，可以理解为命令模式
# -s，使用安静模式，可以理解为只执行命令，不打开Vim
# -c，打开文件执行的操作
vim -e -s -c &quot;:set key=password_phrase&quot; -c &quot;:wq&quot; filename



用openssl加密文件
如果你要加密的文件比较少，或者你要传给你的亲密的人，这个文件不能被其它人打开的话，你可以使用openssl做文件级的加密。
openssl的enc命令，可以用于把文件加密及解密操作，它的参数就是要使用的加密算法。而参数-in、-out，是通用的，一个用于输入文件，一个用于输出文件。
还是老规矩，我直接把命令写出来，加上详细一些的注释。



[plain] view plaincopyprint?


# 把文件diary.tex加密，用des3加密算法，加密完成后，输出文件为diary.tex.des3
# des可以换成很多其它的加密算法。详细列表，请用openssl enc --help查看
openssl enc -des3 -in diary.tex -out diary.tex.des3

# 把文件diray.tex.des3解密，文件是用des3加密过的，解密完成后，输出文件为diary.tex
openssl enc -d -des3 -in diary.tex.des3 -out diary.tex



如果你像我一样，使用Vim做为编辑器，可以把这两行加入到你的配置脚本中去。



[plain] view plaincopyprint?


&quot; 打开.des3结尾的文件时，把它当做用openssl enc -des3加密过的文件，先解密，再打开显示。
autocmd BufReadPost     *.des3          %!openssl enc -d -des3 -in &quot;%&quot;

&quot; 保存.des3结尾的文件时，把当用openssl enc -des3先加密。
autocmd BufWritePost     *.des3          %!openssl enc -des3 -out &quot;%&quot;


原文：http://blog.csdn.net/naihe2010/article/details/7224971


推荐阅读.related_post li{padding-top:10px !important;}wddns/多线路/分省份智能DNS系统wddns 1.3发布使用 sphinx 制作简洁而又美观的文档JAVA分别实现Windows平台和Linux平台下的ip获取使用 dd 命令实现 SAN 存储的快照数据迁移CentOS下nagios报警飞信部署四步走&lt;img src=&quot;http://www1.feedsky.com/t1/603577473/uini/feedsky/s.gif?r=http://item.feedsky.com/~feedsky/uini/~8195296/603577473/6299073/1/item.html&quot; border=&quot;0&quot; height=&quot;0&quot; width=&quot;0&quot; style=&quot;position:absolute&quot; /&gt;</description><category>linux</category><category>crypt</category><category>加密</category><pubDate>Wed, 01 Feb 2012 13:55:20 +0800</pubDate><author>nick</author><comments>http://www.uini.net/2012/02/encrypt-the-file.html#comments</comments><guid isPermaLink="false">http://www.uini.net/?p=1861</guid><dc:creator>nick</dc:creator><fs:srclink>http://www.uini.net/2012/02/encrypt-the-file.html</fs:srclink><fs:srcfeed>http://www.uini.net/feed</fs:srcfeed><fs:itemid>feedsky/uini/~8195296/603577473/6299073</fs:itemid></item><item><title>Java 控制台中文问题(windows平台）</title><link>http://item.feedsky.com/~feedsky/uini/~8195296/603577474/6299073/1/item.html</link><content:encoded>&lt;p&gt;&lt;strong&gt;测试代码&lt;/strong&gt;&lt;/p&gt;

&lt;div class=&quot;wp_syntax&quot;&gt;&lt;span class=&quot;wp_syntax_lang&quot;&gt;java&lt;/span&gt;&lt;div class=&quot;code&quot;&gt;&lt;pre class=&quot;&quot; style=&quot;color: #FFF; font-family:&amp;quot;Consolas&amp;quot;,monospace,&amp;quot;Courier New&amp;quot;&quot;&gt;&lt;span style=&quot;color: #3D9EDD;&quot;&gt;import&lt;/span&gt; &lt;span style=&quot;color: #33CC66;&quot;&gt;java.io.Console&lt;/span&gt;&lt;span style=&quot;color: #CCC;&quot;&gt;;&lt;/span&gt;
  &lt;span style=&quot;color: #3D9EDD;&quot;&gt;import&lt;/span&gt; &lt;span style=&quot;color: #33CC66;&quot;&gt;java.lang.reflect.Constructor&lt;/span&gt;&lt;span style=&quot;color: #CCC;&quot;&gt;;&lt;/span&gt;
  &lt;span style=&quot;color: #3D9EDD;&quot;&gt;import&lt;/span&gt; &lt;span style=&quot;color: #33CC66;&quot;&gt;java.lang.reflect.Field&lt;/span&gt;&lt;span style=&quot;color: #CCC;&quot;&gt;;&lt;/span&gt;
  &lt;span style=&quot;color: #3D9EDD;&quot;&gt;import&lt;/span&gt; &lt;span style=&quot;color: #33CC66;&quot;&gt;java.nio.charset.Charset&lt;/span&gt;&lt;span style=&quot;color: #CCC;&quot;&gt;;&lt;/span&gt;
&amp;nbsp;
  &lt;span style=&quot;color: #3D9EDD;&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: #3D9EDD;&quot;&gt;class&lt;/span&gt; JsTest &lt;span style=&quot;color: #CCC;&quot;&gt;&amp;#123;&lt;/span&gt;
&amp;nbsp;
      @SuppressWarnings&lt;span style=&quot;color: #CCC;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #7ACC00;&quot;&gt;&amp;quot;rawtypes&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #CCC;&quot;&gt;&amp;#41;&lt;/span&gt;
      &lt;span style=&quot;color: #3D9EDD;&quot;&gt;private&lt;/span&gt; &lt;span style=&quot;color: #3D9EDD;&quot;&gt;static&lt;/span&gt; &lt;span style=&quot;color: #99FFFF;&quot;&gt;void&lt;/span&gt; outputCharset&lt;span style=&quot;color: #CCC;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #CCC;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: #CCC;&quot;&gt;&amp;#123;&lt;/span&gt;
         &lt;span style=&quot;color: #996699;&quot;&gt;Constructor&lt;/span&gt;&lt;span style=&quot;color: #CCC;&quot;&gt;&amp;#91;&lt;/span&gt;&lt;span style=&quot;color: #CCC;&quot;&gt;&amp;#93;&lt;/span&gt; ctors &lt;span style=&quot;color: #CCC;&quot;&gt;=&lt;/span&gt; Console.&lt;span style=&quot;color: #3D9EDD;&quot;&gt;class&lt;/span&gt;.&lt;span style=&quot;color: #FFF;&quot;&gt;getDeclaredConstructors&lt;/span&gt;&lt;span style=&quot;color: #CCC;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #CCC;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: #CCC;&quot;&gt;;&lt;/span&gt;
         &lt;span style=&quot;color: #996699;&quot;&gt;Constructor&lt;/span&gt; ctor &lt;span style=&quot;color: #CCC;&quot;&gt;=&lt;/span&gt; &lt;span style=&quot;color: #996600;&quot;&gt;null&lt;/span&gt;&lt;span style=&quot;color: #CCC;&quot;&gt;;&lt;/span&gt;
         &lt;span style=&quot;color: #3D9EDD;&quot;&gt;for&lt;/span&gt; &lt;span style=&quot;color: #CCC;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #99FFFF;&quot;&gt;int&lt;/span&gt; i &lt;span style=&quot;color: #CCC;&quot;&gt;=&lt;/span&gt; &lt;span style=&quot;color: #FFCC00;&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color: #CCC;&quot;&gt;;&lt;/span&gt; i &lt;span style=&quot;color: #CCC;&quot;&gt;&amp;amp;&lt;/span&gt;lt&lt;span style=&quot;color: #CCC;&quot;&gt;;&lt;/span&gt; ctors.&lt;span style=&quot;color: #FFF;&quot;&gt;length&lt;/span&gt;&lt;span style=&quot;color: #CCC;&quot;&gt;;&lt;/span&gt; i&lt;span style=&quot;color: #CCC;&quot;&gt;++&lt;/span&gt;&lt;span style=&quot;color: #CCC;&quot;&gt;&amp;#41;&lt;/span&gt; &lt;span style=&quot;color: #CCC;&quot;&gt;&amp;#123;&lt;/span&gt;
             ctor &lt;span style=&quot;color: #CCC;&quot;&gt;=&lt;/span&gt; ctors&lt;span style=&quot;color: #CCC;&quot;&gt;&amp;#91;&lt;/span&gt;i&lt;span style=&quot;color: #CCC;&quot;&gt;&amp;#93;&lt;/span&gt;&lt;span style=&quot;color: #CCC;&quot;&gt;;&lt;/span&gt;
             &lt;span style=&quot;color: #3D9EDD;&quot;&gt;if&lt;/span&gt; &lt;span style=&quot;color: #CCC;&quot;&gt;&amp;#40;&lt;/span&gt;ctor.&lt;span style=&quot;color: #FFF;&quot;&gt;getGenericParameterTypes&lt;/span&gt;&lt;span style=&quot;color: #CCC;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #CCC;&quot;&gt;&amp;#41;&lt;/span&gt;.&lt;span style=&quot;color: #FFF;&quot;&gt;length&lt;/span&gt; &lt;span style=&quot;color: #CCC;&quot;&gt;==&lt;/span&gt; &lt;span style=&quot;color: #FFCC00;&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color: #CCC;&quot;&gt;&amp;#41;&lt;/span&gt;
                 &lt;span style=&quot;color: #3D9EDD;&quot;&gt;break&lt;/span&gt;&lt;span style=&quot;color: #CCC;&quot;&gt;;&lt;/span&gt;
         &lt;span style=&quot;color: #CCC;&quot;&gt;&amp;#125;&lt;/span&gt;
         &lt;span style=&quot;color: #3D9EDD;&quot;&gt;try&lt;/span&gt; &lt;span style=&quot;color: #CCC;&quot;&gt;&amp;#123;&lt;/span&gt;
             ctor.&lt;span style=&quot;color: #FFF;&quot;&gt;setAccessible&lt;/span&gt;&lt;span style=&quot;color: #CCC;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #996600;&quot;&gt;true&lt;/span&gt;&lt;span style=&quot;color: #CCC;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: #CCC;&quot;&gt;;&lt;/span&gt;
             Console c &lt;span style=&quot;color: #CCC;&quot;&gt;=&lt;/span&gt; &lt;span style=&quot;color: #CCC;&quot;&gt;&amp;#40;&lt;/span&gt;Console&lt;span style=&quot;color: #CCC;&quot;&gt;&amp;#41;&lt;/span&gt; ctor.&lt;span style=&quot;color: #FFF;&quot;&gt;newInstance&lt;/span&gt;&lt;span style=&quot;color: #CCC;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #CCC;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: #CCC;&quot;&gt;;&lt;/span&gt;
             &lt;span style=&quot;color: #996699;&quot;&gt;Field&lt;/span&gt; f &lt;span style=&quot;color: #CCC;&quot;&gt;=&lt;/span&gt; c.&lt;span style=&quot;color: #FFF;&quot;&gt;getClass&lt;/span&gt;&lt;span style=&quot;color: #CCC;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #CCC;&quot;&gt;&amp;#41;&lt;/span&gt;.&lt;span style=&quot;color: #FFF;&quot;&gt;getDeclaredField&lt;/span&gt;&lt;span style=&quot;color: #CCC;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #7ACC00;&quot;&gt;&amp;quot;cs&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #CCC;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: #CCC;&quot;&gt;;&lt;/span&gt;
             f.&lt;span style=&quot;color: #FFF;&quot;&gt;setAccessible&lt;/span&gt;&lt;span style=&quot;color: #CCC;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #996600;&quot;&gt;true&lt;/span&gt;&lt;span style=&quot;color: #CCC;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: #CCC;&quot;&gt;;&lt;/span&gt;
             &lt;span style=&quot;color: #996699;&quot;&gt;System&lt;/span&gt;.&lt;span style=&quot;color: #FFF;&quot;&gt;out&lt;/span&gt;.&lt;span style=&quot;color: #FFF;&quot;&gt;println&lt;/span&gt;&lt;span style=&quot;color: #CCC;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #996699;&quot;&gt;String&lt;/span&gt;.&lt;span style=&quot;color: #FFF;&quot;&gt;format&lt;/span&gt;&lt;span style=&quot;color: #CCC;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #7ACC00;&quot;&gt;&amp;quot;Console charset:%s&amp;quot;&lt;/span&gt;,
                     f.&lt;span style=&quot;color: #FFF;&quot;&gt;get&lt;/span&gt;&lt;span style=&quot;color: #CCC;&quot;&gt;&amp;#40;&lt;/span&gt;c&lt;span style=&quot;color: #CCC;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: #CCC;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: #CCC;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: #CCC;&quot;&gt;;&lt;/span&gt;
             &lt;span style=&quot;color: #996699;&quot;&gt;System&lt;/span&gt;.&lt;span style=&quot;color: #FFF;&quot;&gt;out&lt;/span&gt;.&lt;span style=&quot;color: #FFF;&quot;&gt;println&lt;/span&gt;&lt;span style=&quot;color: #CCC;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #996699;&quot;&gt;String&lt;/span&gt;.&lt;span style=&quot;color: #FFF;&quot;&gt;format&lt;/span&gt;&lt;span style=&quot;color: #CCC;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #7ACC00;&quot;&gt;&amp;quot;Charset.defaultCharset():%s&amp;quot;&lt;/span&gt;,
                     Charset.&lt;span style=&quot;color: #FFF;&quot;&gt;defaultCharset&lt;/span&gt;&lt;span style=&quot;color: #CCC;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #CCC;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: #CCC;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: #CCC;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: #CCC;&quot;&gt;;&lt;/span&gt;
         &lt;span style=&quot;color: #CCC;&quot;&gt;&amp;#125;&lt;/span&gt; &lt;span style=&quot;color: #3D9EDD;&quot;&gt;catch&lt;/span&gt; &lt;span style=&quot;color: #CCC;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #996699;&quot;&gt;Exception&lt;/span&gt; x&lt;span style=&quot;color: #CCC;&quot;&gt;&amp;#41;&lt;/span&gt; &lt;span style=&quot;color: #CCC;&quot;&gt;&amp;#123;&lt;/span&gt;
             x.&lt;span style=&quot;color: #FFF;&quot;&gt;printStackTrace&lt;/span&gt;&lt;span style=&quot;color: #CCC;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #CCC;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: #CCC;&quot;&gt;;&lt;/span&gt;
         &lt;span style=&quot;color: #CCC;&quot;&gt;&amp;#125;&lt;/span&gt;
     &lt;span style=&quot;color: #CCC;&quot;&gt;&amp;#125;&lt;/span&gt;
&amp;nbsp;
     &lt;span style=&quot;color: #3D9EDD;&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: #3D9EDD;&quot;&gt;static&lt;/span&gt; &lt;span style=&quot;color: #99FFFF;&quot;&gt;void&lt;/span&gt; main&lt;span style=&quot;color: #CCC;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #996699;&quot;&gt;String&lt;/span&gt;&lt;span style=&quot;color: #CCC;&quot;&gt;&amp;#91;&lt;/span&gt;&lt;span style=&quot;color: #CCC;&quot;&gt;&amp;#93;&lt;/span&gt; args&lt;span style=&quot;color: #CCC;&quot;&gt;&amp;#41;&lt;/span&gt; &lt;span style=&quot;color: #CCC;&quot;&gt;&amp;#123;&lt;/span&gt;
         outputCharset&lt;span style=&quot;color: #CCC;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #CCC;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: #CCC;&quot;&gt;;&lt;/span&gt;
         &lt;span style=&quot;color: #996699;&quot;&gt;System&lt;/span&gt;.&lt;span style=&quot;color: #FFF;&quot;&gt;out&lt;/span&gt;.&lt;span style=&quot;color: #FFF;&quot;&gt;println&lt;/span&gt;&lt;span style=&quot;color: #CCC;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #7ACC00;&quot;&gt;&amp;quot;中文&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #CCC;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: #CCC;&quot;&gt;;&lt;/span&gt;
     &lt;span style=&quot;color: #CCC;&quot;&gt;&amp;#125;&lt;/span&gt;
 &lt;span style=&quot;color: #CCC;&quot;&gt;&amp;#125;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;编码&lt;/strong&gt;&lt;br /&gt;
有两个编码需要提及的是：&lt;br /&gt;
1. Console charset（控制台编码）&lt;/p&gt;
&lt;div&gt;控制台编码是windows的命令行窗口的编码，可以使用chcp来查看，也可以是窗口属性中看到。&lt;br /&gt;
我的是英文的Windows XP加上了中文支持。（在控制面板的Region中设置）&lt;br /&gt;
&lt;img src=&quot;http://www.blogjava.net/images/blogjava_net/sandy/encoding1.jpg&quot; border=&quot;0&quot; alt=&quot;&quot; width=&quot;385&quot; height=&quot;563&quot; /&gt;&lt;/div&gt;
&lt;p&gt;2. System default Charset（系统默认编码）&lt;br /&gt;
这个是系统默认编码，windows英文操作系统是cp1252(iso-8859-1)&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;试验&lt;/strong&gt;&lt;br /&gt;
编译：&lt;br /&gt;
javac -encoding utf8 JsTest.java&lt;br /&gt;
因为我的源代码用utf8存贮，所以编译的时候加上了utf8选项。&lt;/p&gt;
&lt;p&gt;测试1：&lt;br /&gt;
java  zzz.JsTest&lt;/p&gt;
&lt;div&gt;&lt;img src=&quot;data:image/png;base64,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&quot; alt=&quot;&quot; /&gt;&lt;/div&gt;
&lt;p&gt;Java把字符串直接通过default Charset[windows-1252(iso-8859-1)]转化后输出到控制台，但是这个控制台只能识别code936(gb2312)的编码，所以不能识别，&lt;br /&gt;
输出？？&lt;/p&gt;
&lt;div&gt;测试2：&lt;/div&gt;
&lt;p&gt;指定file.encoding来改变default charset为gb2312，这下okay了&lt;br /&gt;
java -Dfile.encoding=gb2312 zzz.JsTest&lt;/p&gt;
&lt;div&gt;&lt;img src=&quot;data:image/png;base64,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&quot; alt=&quot;&quot; /&gt;&lt;/div&gt;
&lt;p&gt;测试3：&lt;br /&gt;
换成utf8看看，变成乱码。&lt;br /&gt;
Java -Dfile.encoding=utf8 zzz.JsTest&lt;/p&gt;
&lt;div&gt;&lt;img src=&quot;data:image/png;base64,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&quot; alt=&quot;&quot; /&gt;&lt;/div&gt;
&lt;p&gt;测试4：&lt;br /&gt;
通过chcp来改变控制台编码，行不通。&lt;/p&gt;
&lt;div&gt;&lt;img src=&quot;data:image/png;base64,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&quot; alt=&quot;&quot; /&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;结论&lt;/strong&gt;&lt;br /&gt;
1. 只有console charset 和 system default charset保持一致才不会乱码&lt;br /&gt;
2. chcp 65001(utf8)不能正常工作&lt;br /&gt;
3. 可以通过-Dfile.encoding改变default charset&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;解决方案&lt;/strong&gt;&lt;br /&gt;
因为我们无法控制console的编码，如何能确保程序总是能正确输出，即使程序被放在日文OS上执行？&lt;/p&gt;
&lt;p&gt;native unicode output&lt;br /&gt;
这种方案使用Windows Native API WriteConsoleW来输出,这样总是以unicode输出。（使用了JNA)&lt;/p&gt;

&lt;div class=&quot;wp_syntax&quot;&gt;&lt;span class=&quot;wp_syntax_lang&quot;&gt;java&lt;/span&gt;&lt;div class=&quot;code&quot;&gt;&lt;pre class=&quot;&quot; style=&quot;color: #FFF; font-family:&amp;quot;Consolas&amp;quot;,monospace,&amp;quot;Courier New&amp;quot;&quot;&gt;&lt;span style=&quot;color: #3D9EDD;&quot;&gt;import&lt;/span&gt; &lt;span style=&quot;color: #33CC66;&quot;&gt;com.sun.jna.Native&lt;/span&gt;&lt;span style=&quot;color: #CCC;&quot;&gt;;&lt;/span&gt;
&lt;span style=&quot;color: #3D9EDD;&quot;&gt;import&lt;/span&gt; &lt;span style=&quot;color: #33CC66;&quot;&gt;com.sun.jna.Pointer&lt;/span&gt;&lt;span style=&quot;color: #CCC;&quot;&gt;;&lt;/span&gt;
&lt;span style=&quot;color: #3D9EDD;&quot;&gt;import&lt;/span&gt; &lt;span style=&quot;color: #33CC66;&quot;&gt;com.sun.jna.ptr.IntByReference&lt;/span&gt;&lt;span style=&quot;color: #CCC;&quot;&gt;;&lt;/span&gt;
&lt;span style=&quot;color: #3D9EDD;&quot;&gt;import&lt;/span&gt; &lt;span style=&quot;color: #33CC66;&quot;&gt;com.sun.jna.win32.StdCallLibrary&lt;/span&gt;&lt;span style=&quot;color: #CCC;&quot;&gt;;&lt;/span&gt;
&amp;nbsp;
&lt;span style=&quot;color: #008000; font-style: italic; font-weight: bold;&quot;&gt;/** For unicode output on windows platform
 * @author Sandy_Yin
 *
 */&lt;/span&gt;
&lt;span style=&quot;color: #3D9EDD;&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: #3D9EDD;&quot;&gt;class&lt;/span&gt; Console &lt;span style=&quot;color: #CCC;&quot;&gt;&amp;#123;&lt;/span&gt;
    &lt;span style=&quot;color: #3D9EDD;&quot;&gt;private&lt;/span&gt; &lt;span style=&quot;color: #3D9EDD;&quot;&gt;static&lt;/span&gt; Kernel32 INSTANCE &lt;span style=&quot;color: #CCC;&quot;&gt;=&lt;/span&gt; &lt;span style=&quot;color: #996600;&quot;&gt;null&lt;/span&gt;&lt;span style=&quot;color: #CCC;&quot;&gt;;&lt;/span&gt;
&amp;nbsp;
    &lt;span style=&quot;color: #3D9EDD;&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: #3D9EDD;&quot;&gt;interface&lt;/span&gt; Kernel32 &lt;span style=&quot;color: #3D9EDD;&quot;&gt;extends&lt;/span&gt; StdCallLibrary &lt;span style=&quot;color: #CCC;&quot;&gt;&amp;#123;&lt;/span&gt;
        &lt;span style=&quot;color: #3D9EDD;&quot;&gt;public&lt;/span&gt; Pointer GetStdHandle&lt;span style=&quot;color: #CCC;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #99FFFF;&quot;&gt;int&lt;/span&gt; nStdHandle&lt;span style=&quot;color: #CCC;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: #CCC;&quot;&gt;;&lt;/span&gt;
&amp;nbsp;
        &lt;span style=&quot;color: #3D9EDD;&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: #99FFFF;&quot;&gt;boolean&lt;/span&gt; WriteConsoleW&lt;span style=&quot;color: #CCC;&quot;&gt;&amp;#40;&lt;/span&gt;Pointer hConsoleOutput, &lt;span style=&quot;color: #99FFFF;&quot;&gt;char&lt;/span&gt;&lt;span style=&quot;color: #CCC;&quot;&gt;&amp;#91;&lt;/span&gt;&lt;span style=&quot;color: #CCC;&quot;&gt;&amp;#93;&lt;/span&gt; lpBuffer,
                &lt;span style=&quot;color: #99FFFF;&quot;&gt;int&lt;/span&gt; nNumberOfCharsToWrite,
                IntByReference lpNumberOfCharsWritten, Pointer lpReserved&lt;span style=&quot;color: #CCC;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: #CCC;&quot;&gt;;&lt;/span&gt;
    &lt;span style=&quot;color: #CCC;&quot;&gt;&amp;#125;&lt;/span&gt;
&amp;nbsp;
    &lt;span style=&quot;color: #3D9EDD;&quot;&gt;static&lt;/span&gt; &lt;span style=&quot;color: #CCC;&quot;&gt;&amp;#123;&lt;/span&gt;
        &lt;span style=&quot;color: #996699;&quot;&gt;String&lt;/span&gt; os &lt;span style=&quot;color: #CCC;&quot;&gt;=&lt;/span&gt; &lt;span style=&quot;color: #996699;&quot;&gt;System&lt;/span&gt;.&lt;span style=&quot;color: #FFF;&quot;&gt;getProperty&lt;/span&gt;&lt;span style=&quot;color: #CCC;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #7ACC00;&quot;&gt;&amp;quot;os.name&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #CCC;&quot;&gt;&amp;#41;&lt;/span&gt;.&lt;span style=&quot;color: #FFF;&quot;&gt;toLowerCase&lt;/span&gt;&lt;span style=&quot;color: #CCC;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #CCC;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: #CCC;&quot;&gt;;&lt;/span&gt;
        &lt;span style=&quot;color: #3D9EDD;&quot;&gt;if&lt;/span&gt; &lt;span style=&quot;color: #CCC;&quot;&gt;&amp;#40;&lt;/span&gt;os.&lt;span style=&quot;color: #FFF;&quot;&gt;startsWith&lt;/span&gt;&lt;span style=&quot;color: #CCC;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #7ACC00;&quot;&gt;&amp;quot;win&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #CCC;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: #CCC;&quot;&gt;&amp;#41;&lt;/span&gt; &lt;span style=&quot;color: #CCC;&quot;&gt;&amp;#123;&lt;/span&gt;
            INSTANCE &lt;span style=&quot;color: #CCC;&quot;&gt;=&lt;/span&gt; &lt;span style=&quot;color: #CCC;&quot;&gt;&amp;#40;&lt;/span&gt;Kernel32&lt;span style=&quot;color: #CCC;&quot;&gt;&amp;#41;&lt;/span&gt; &lt;span style=&quot;color: #3D9EDD;&quot;&gt;Native&lt;/span&gt;
                    .&lt;span style=&quot;color: #FFF;&quot;&gt;loadLibrary&lt;/span&gt;&lt;span style=&quot;color: #CCC;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #7ACC00;&quot;&gt;&amp;quot;kernel32&amp;quot;&lt;/span&gt;, Kernel32.&lt;span style=&quot;color: #3D9EDD;&quot;&gt;class&lt;/span&gt;&lt;span style=&quot;color: #CCC;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: #CCC;&quot;&gt;;&lt;/span&gt;
        &lt;span style=&quot;color: #CCC;&quot;&gt;&amp;#125;&lt;/span&gt;
    &lt;span style=&quot;color: #CCC;&quot;&gt;&amp;#125;&lt;/span&gt;
&amp;nbsp;
    &lt;span style=&quot;color: #3D9EDD;&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: #3D9EDD;&quot;&gt;static&lt;/span&gt; &lt;span style=&quot;color: #99FFFF;&quot;&gt;void&lt;/span&gt; println&lt;span style=&quot;color: #CCC;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #996699;&quot;&gt;String&lt;/span&gt; message&lt;span style=&quot;color: #CCC;&quot;&gt;&amp;#41;&lt;/span&gt; &lt;span style=&quot;color: #CCC;&quot;&gt;&amp;#123;&lt;/span&gt;
        &lt;span style=&quot;color: #99FFFF;&quot;&gt;boolean&lt;/span&gt; successful &lt;span style=&quot;color: #CCC;&quot;&gt;=&lt;/span&gt; &lt;span style=&quot;color: #996600;&quot;&gt;false&lt;/span&gt;&lt;span style=&quot;color: #CCC;&quot;&gt;;&lt;/span&gt;
        &lt;span style=&quot;color: #3D9EDD;&quot;&gt;if&lt;/span&gt; &lt;span style=&quot;color: #CCC;&quot;&gt;&amp;#40;&lt;/span&gt;INSTANCE &lt;span style=&quot;color: #CCC;&quot;&gt;!=&lt;/span&gt; &lt;span style=&quot;color: #996600;&quot;&gt;null&lt;/span&gt;&lt;span style=&quot;color: #CCC;&quot;&gt;&amp;#41;&lt;/span&gt; &lt;span style=&quot;color: #CCC;&quot;&gt;&amp;#123;&lt;/span&gt;
            Pointer handle &lt;span style=&quot;color: #CCC;&quot;&gt;=&lt;/span&gt; INSTANCE.&lt;span style=&quot;color: #FFF;&quot;&gt;GetStdHandle&lt;/span&gt;&lt;span style=&quot;color: #CCC;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #CCC;&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: #FFCC00;&quot;&gt;11&lt;/span&gt;&lt;span style=&quot;color: #CCC;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: #CCC;&quot;&gt;;&lt;/span&gt;
            &lt;span style=&quot;color: #99FFFF;&quot;&gt;char&lt;/span&gt;&lt;span style=&quot;color: #CCC;&quot;&gt;&amp;#91;&lt;/span&gt;&lt;span style=&quot;color: #CCC;&quot;&gt;&amp;#93;&lt;/span&gt; buffer &lt;span style=&quot;color: #CCC;&quot;&gt;=&lt;/span&gt; message.&lt;span style=&quot;color: #FFF;&quot;&gt;toCharArray&lt;/span&gt;&lt;span style=&quot;color: #CCC;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #CCC;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: #CCC;&quot;&gt;;&lt;/span&gt;
            IntByReference lpNumberOfCharsWritten &lt;span style=&quot;color: #CCC;&quot;&gt;=&lt;/span&gt; &lt;span style=&quot;color: #3D9EDD;&quot;&gt;new&lt;/span&gt; IntByReference&lt;span style=&quot;color: #CCC;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #CCC;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: #CCC;&quot;&gt;;&lt;/span&gt;
            successful &lt;span style=&quot;color: #CCC;&quot;&gt;=&lt;/span&gt; INSTANCE.&lt;span style=&quot;color: #FFF;&quot;&gt;WriteConsoleW&lt;/span&gt;&lt;span style=&quot;color: #CCC;&quot;&gt;&amp;#40;&lt;/span&gt;handle, buffer, buffer.&lt;span style=&quot;color: #FFF;&quot;&gt;length&lt;/span&gt;,
                    lpNumberOfCharsWritten, &lt;span style=&quot;color: #996600;&quot;&gt;null&lt;/span&gt;&lt;span style=&quot;color: #CCC;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: #CCC;&quot;&gt;;&lt;/span&gt;
            &lt;span style=&quot;color: #3D9EDD;&quot;&gt;if&lt;/span&gt;&lt;span style=&quot;color: #CCC;&quot;&gt;&amp;#40;&lt;/span&gt;successful&lt;span style=&quot;color: #CCC;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: #CCC;&quot;&gt;&amp;#123;&lt;/span&gt;
                &lt;span style=&quot;color: #996699;&quot;&gt;System&lt;/span&gt;.&lt;span style=&quot;color: #FFF;&quot;&gt;out&lt;/span&gt;.&lt;span style=&quot;color: #FFF;&quot;&gt;println&lt;/span&gt;&lt;span style=&quot;color: #CCC;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #CCC;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: #CCC;&quot;&gt;;&lt;/span&gt;
            &lt;span style=&quot;color: #CCC;&quot;&gt;&amp;#125;&lt;/span&gt;
        &lt;span style=&quot;color: #CCC;&quot;&gt;&amp;#125;&lt;/span&gt;
        &lt;span style=&quot;color: #3D9EDD;&quot;&gt;if&lt;/span&gt; &lt;span style=&quot;color: #CCC;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #CCC;&quot;&gt;!&lt;/span&gt;successful&lt;span style=&quot;color: #CCC;&quot;&gt;&amp;#41;&lt;/span&gt; &lt;span style=&quot;color: #CCC;&quot;&gt;&amp;#123;&lt;/span&gt;
            &lt;span style=&quot;color: #996699;&quot;&gt;System&lt;/span&gt;.&lt;span style=&quot;color: #FFF;&quot;&gt;out&lt;/span&gt;.&lt;span style=&quot;color: #FFF;&quot;&gt;println&lt;/span&gt;&lt;span style=&quot;color: #CCC;&quot;&gt;&amp;#40;&lt;/span&gt;message&lt;span style=&quot;color: #CCC;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: #CCC;&quot;&gt;;&lt;/span&gt;
        &lt;span style=&quot;color: #CCC;&quot;&gt;&amp;#125;&lt;/span&gt;
    &lt;span style=&quot;color: #CCC;&quot;&gt;&amp;#125;&lt;/span&gt;
&lt;span style=&quot;color: #CCC;&quot;&gt;&amp;#125;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;原文：http://www.blogjava.net/sandy/archive/2012/01/19/368747.html&lt;/p&gt;
&lt;div  class=&quot;related_post_title&quot;&gt;&lt;h4 style=\&quot;font-size:14px;color:#EEEEEE;\&quot;&gt;推荐阅读&lt;/h4&gt;&lt;style&gt;.related_post li{padding-top:10px !important;}&lt;/style&gt;&lt;/div&gt;&lt;ul class=&quot;related_post&quot;&gt;&lt;li&gt;&lt;a href=&quot;http://www.uini.net/2011/12/java-respectively-to-achieve-the-windows-platform-and-linux-platform-ip-access.html&quot; title=&quot;JAVA分别实现Windows平台和Linux平台下的ip获取&quot;&gt;JAVA分别实现Windows平台和Linux平台下的ip获取&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://www.uini.net/2011/08/flash-console-2-52.html&quot; title=&quot;Flash Console 2.52&quot;&gt;Flash Console 2.52&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://www.uini.net/2011/06/make-tomcat-run-php-in-several-ways-linux-aix-and-windows-environment.html&quot; title=&quot;让tomcat运行php的几种方式(linux,aix和windows环境)&quot;&gt;让tomcat运行php的几种方式(linux,aix和windows环境)&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://www.uini.net/2011/06/automatically-put-in-the-windows-of-your-revised-paper-stuffed-into-the-jar-file-specified.html&quot; title=&quot;在windows下自动把你修改过的文件塞到指定的jar文件中&quot;&gt;在windows下自动把你修改过的文件塞到指定的jar文件中&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://www.uini.net/2011/05/tomcat-apache-cluster-installation-guide-pdf-download-windows-and-linux-environment.html&quot; title=&quot;《Tomcat Apache集群安装指南》PDF下载&amp;#8211;windows和linux环境&quot;&gt;《Tomcat Apache集群安装指南》PDF下载&amp;#8211;windows和linux环境&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;img src=&quot;http://www1.feedsky.com/t1/603577474/uini/feedsky/s.gif?r=http://item.feedsky.com/~feedsky/uini/~8195296/603577474/6299073/1/item.html&quot; border=&quot;0&quot; height=&quot;0&quot; width=&quot;0&quot; style=&quot;position:absolute&quot; /&gt;</content:encoded><wfw:commentRss>http://www.uini.net/2012/02/java-console-chinese-problem-windows-platform.html/feed</wfw:commentRss><slash:comments>0</slash:comments><description>测试代码

javaimport java.io.Console;
  import java.lang.reflect.Constructor;
  import java.lang.reflect.Field;
  import java.nio.charset.Charset;
&amp;#160;
  public class JsTest &amp;#123;
&amp;#160;
      @SuppressWarnings&amp;#40;&amp;#34;rawtypes&amp;#34;&amp;#41;
      private static void outputCharset&amp;#40;&amp;#41;&amp;#123;
         Constructor&amp;#91;&amp;#93; ctors = Console.class.getDeclaredConstructors&amp;#40;&amp;#41;;
         Constructor ctor = null;
 [...]&lt;img src=&quot;http://www1.feedsky.com/t1/603577474/uini/feedsky/s.gif?r=http://item.feedsky.com/~feedsky/uini/~8195296/603577474/6299073/1/item.html&quot; border=&quot;0&quot; height=&quot;0&quot; width=&quot;0&quot; style=&quot;position:absolute&quot; /&gt;</description><category>编码</category><category>console</category><category>控制台</category><category>windows</category><category>java</category><pubDate>Wed, 01 Feb 2012 13:40:13 +0800</pubDate><author>nick</author><comments>http://www.uini.net/2012/02/java-console-chinese-problem-windows-platform.html#comments</comments><guid isPermaLink="false">http://www.uini.net/?p=1859</guid><dc:creator>nick</dc:creator><fs:srclink>http://www.uini.net/2012/02/java-console-chinese-problem-windows-platform.html</fs:srclink><fs:srcfeed>http://www.uini.net/feed</fs:srcfeed><fs:itemid>feedsky/uini/~8195296/603577474/6299073</fs:itemid></item></channel></rss>
