??xml version="1.0" encoding="utf-8" standalone="yes"?>亚洲人成影院在线无码按摩店,亚洲色成人WWW永久在线观看,亚洲一区精彩视频http://www.tkk7.com/tinysun/category/38052.htmlzh-cnSat, 07 Aug 2010 06:17:29 GMTSat, 07 Aug 2010 06:17:29 GMT60?Hadoop q行分布式ƈ行编E??/title><link>http://www.tkk7.com/tinysun/archive/2010/08/06/328098.html</link><dc:creator>何克?/dc:creator><author>何克?/author><pubDate>Fri, 06 Aug 2010 01:42:00 GMT</pubDate><guid>http://www.tkk7.com/tinysun/archive/2010/08/06/328098.html</guid><wfw:comment>http://www.tkk7.com/tinysun/comments/328098.html</wfw:comment><comments>http://www.tkk7.com/tinysun/archive/2010/08/06/328098.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/tinysun/comments/commentRss/328098.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/tinysun/services/trackbacks/328098.html</trackback:ping><description><![CDATA[Hadoop 是一个实C MapReduce 计算模型的开源分布式q行~程框架Q借助?Hadoop, E序员可以轻村֜~写分布式ƈ行程序,其q行于计机集群上,完成量数据的计。本文将介绍 MapReduce 计算模型Q分布式q行计算{基本概念,以及 Hadoop 的安装部|和基本q行Ҏ? <br /> Hadoop ? <br /> <br /> Hadoop 是一个开源的可运行于大规模集上的分布式q行~程框架Q由于分布式存储对于分布式编E来说是必不可少的,q个框架中还包含了一个分布式文gpȝ HDFS( Hadoop Distributed File System )。也许到目前为止QHadoop q不是那么广Zh知,其最新的版本号也仅仅?0.16Q距?1.0 g都还有很长的一D距,但提?Hadoop 一脉相承的另外两个开源项? Nutch ?Lucene ( 三者的创始人都?Doug Cutting ),那绝Ҏ大名鼎鼎。Lucene 是一个用 Java 开发的开源高性能全文索工具包Q它不是一个完整的应用E序Q而是一套简单易用的 API 。在全世界范围内Q已有无数的软gpȝQWeb |站Z Lucene 实现了全文检索功能,后来 Doug Cutting 又开创了W一个开源的 Web 搜烦引擎(<a target="_blank">http://www.nutch.org</a>) Nutch, 它在 Lucene 的基上增加了|络爬虫和一些和 Web 相关的功能,一些解析各cL档格式的插g{,此外QNutch 中还包含了一个分布式文gpȝ用于存储数据。从 Nutch 0.8.0 版本之后QDoug Cutting ?Nutch 中的分布式文件系l以及实?MapReduce 法的代码独立出来Ş成了一个新的开源项 Hadoop。Nutch 也演化ؓZ Lucene 全文索以?Hadoop 分布式计^台的一个开源搜索引擎? <br /> <br /> Z Hadoop,你可以轻村֜~写可处理v量数据的分布式ƈ行程序,q将其运行于由成百上千个l点l成的大规模计算机集上。从目前的情冉| 看,Hadoop 注定会有一个辉煌的未来Q?云计?是目前灸手可热的技术名词,全球各大 IT 公司都在投资和推q这U新一代的计算模式Q? Hadoop 又被其中几家主要的公司用作其"云计?环境中的重要基础软gQ如:雅虎正在借助 Hadoop 开源^台的力量Ҏ Google, 除了资助 Hadoop 开发团队外Q还在开发基?Hadoop 的开源项?Pig, q是一个专注于量数据集分析的分布式计程序。Amazon 公司Z Hadoop 推出?Amazon S3 ( Amazon Simple Storage Service )Q提供可靠,快速,可扩展的|络存储服务Q以及一个商用的云计^?Amazon EC2 ( Amazon Elastic Compute Cloud )。在 IBM 公司的云计算目--"蓝云计划"中,Hadoop 也是其中重要的基软g。Google 正在跟IBM合作Q共同推q基?Hadoop 的云计算? <br /> <br /> <br /> q接~程方式的变? <br /> <br /> 在摩定律的作用下,以前E序员根本不用考虑计算机的性能会跟不上软g的发展,因ؓU每?18 个月QCPU 的主频就会增加一倍,性能也将提升一倍,软gҎ不用做Q何改变,可以n受免费的性能提升。然而,׃晶体电路已l逐渐接近其物理上的性能极限Q摩? 定律?2005 q左叛_始失效了Qhcd也不能期待单?CPU 的速度每隔 18 个月q一倍,为我们提供越来越快的计算性能。Intel, AMD, IBM {芯片厂商开始从多核q个角度来挖?CPU 的性能潜力Q多核时代以及互联网时代的到来,软g~程方式发生重大变革Q基于多核的多线Eƈ发编E以及基于大规模计算机集的分布式ƈ行编E是来? 件性能提升的主要途径? <br /> <br /> 许多U编E方式的重大变化带来一ơY件的q发危机Q因为我们传l的软g方式基本上是单指令单数据的序执行Q这U顺序执行十分符合h cȝ思考习惯,却与q发q行~程格格不入。基于集的分布式ƈ行编E能够让软g与数据同时运行在q成一个网l的许多台计机?q里的每一台计机均可? 是一台普通的 PC 机。这L分布式ƈ行环境的最大优Ҏ可以很容易的通过增加计算机来扩充新的计算l点Qƈ由此获得不可思议的v量计能? 同时又具有相当强的容错能力,一批计结点失效也不会影响计算的正常进行以及结果的正确性。Google 是q么做的Q他们用了叫做 MapReduce 的ƈ行编E模型进行分布式q行~程Q运行在叫做 GFS ( Google File System )的分布式文gpȝ上,为全球亿万用h供搜索服务? <br /> <br /> Hadoop 实现?Google ?MapReduce ~程模型Q提供了单易用的~程接口Q也提供了它自己的分布式文gpȝ HDFS,?Google 不同的是QHadoop 是开源的QQ何h都可以用这个框架来q行q行~程。如果说分布式ƈ行编E的隑ֺ以让普通程序员望而生畏的话,开源的 Hadoop 的出现极大的降低了它的门槛,d本文Q你会发现基?Hadoop ~程非常单,无须Mq行开发经验,你也可以L的开发出分布式的q行E序Qƈ让其令h难以|信地同时运行在数百台机器上Q然后在短时间内完成量数据 的计。你可能会觉得你不可能会拥有数百台机器来q行你的q行E序Q而事实上Q随着"云计?的普及,M人都可以L获得q样的v量计能力。例如现? Amazon 公司的云计算q_ Amazon EC2 已经提供了这U按需计算的租用服务,有兴的读者可以去了解一下,q篇pd文章的第三部分将有所介绍? <br /> <br /> 掌握一点分布式q行~程的知识对来的程序员是必不可的QHadoop 是如此的便好用,何不试一下呢Q也怽已经急不可耐的惌一下基? Hadoop 的编E是怎么回事了,但毕竟这U编E模型与传统的顺序程序大不相同,掌握一点基知识才能更好地理解基?Hadoop 的分布式q行E序是如何编写和q行的。因此本文会先介l一?MapReduce 的计模型,Hadoop 中的分布式文件系l?HDFS, Hadoop 是如何实现ƈ行计的Q然后才介绍如何安装和部|?Hadoop 框架Q以及如何运?Hadoop E序? <br /> <br /> MapReduce 计算模型 <br /> <br /> MapReduce ?Google 公司的核心计模型,它将复杂的运行于大规模集上的ƈ行计过E高度的抽象C两个函数QMap ? Reduce, q是一个o人惊讶的单却又威力巨大的模型。适合?MapReduce 来处理的数据?或Q?有一个基本要? 待处理的数据集可以分解成许多的数据集,而且每一个小数据集都可以完全q行地进行处理? <br /> <br /> <br /> ?1. MapReduce 计算程 <br /> <img src="http://www.ibm.com/developerworks/cn/opensource/os-cn-hadoop1/figure1.jpg" alt="" /> <br /> 图一说明了用 MapReduce 来处理大数据集的q程, q个 MapReduce 的计过E简而言之,是大数据集分解ؓ成百上千的小数据集,每个(或若q个)数据集分别由集群中的一个结?一般就是一台普通的计算?q行处理q生 成中间结果,然后q些中间l果又由大量的结点进行合q? 形成最l结果? <br /> <br /> 计算模型的核心是 Map ?Reduce 两个函数Q这两个函数q戯责实玎ͼ功能是按一定的映射规则输入的 <key, value> 对{换成另一个或一?<key, value> 对输出? <br /> <br /> <br /> 表一 Map ?Reduce 函数 <br /> 函数 输入 输出 说明 <br /> Map <k1, v1> List(<k2,v2>) 1. 小数据集进一步解析成一?<key,value> 对,输入 Map 函数中进行处理? <br /> 2. 每一个输入的 <k1,v1> 会输Z?<k2,v2>?<k2,v2> 是计的中间l果?nbsp; <br /> Reduce <k2,List(v2)> <k3,v3> 输入的中间结?<k2,List(v2)> 中的 List(v2) 表示是一批属于同一?k2 ?value <br /> <br /> 以一个计文本文件中每个单词出现的次数的E序ZQ?lt;k1,v1> 可以?<行在文g中的偏移位置, 文g中的一?gt;Q经 Map 函数映射之后QŞ成一批中间结?<单词Q出现次?gt;, ?Reduce 函数则可以对中间l果q行处理Q将相同单词的出现次数进行篏加,得到每个单词的ȝ出现ơ数? <br /> <br /> Z MapReduce 计算模型~写分布式ƈ行程序非常简单,E序员的主要~码工作是实现 Map ?Reduce 函数Q其它的q行~程中的U种复杂问题Q如分布式存储,工作调度Q负载^衡,定w处理Q网l通信{,均由 MapReduce 框架(比如 Hadoop )负责处理Q程序员完全不用操心? <br /> <br /> ?集群上的q行计算 <br /> <br /> MapReduce 计算模型非常适合在大量计机l成的大规模集群上ƈ行运行。图一中的每一?Map d和每一?Reduce d均可以同时运行于一个单独的计算l点上,可想而知其运效率是很高的,那么q样的ƈ行计是如何做到的呢Q? <br /> <br /> 数据分布存储 <br /> <br /> Hadoop 中的分布式文件系l?HDFS ׃个管理结?( NameNode )和N个数据结?( DataNode )l成Q每个结点均是一台普通的计算机。在使用上同我们熟悉的单Z的文件系l非常类|一样可以徏目录Q创建,复制Q删除文Ӟ查看文g内容{。但其底 层实C是把文g切割?BlockQ然后这?Block 分散地存储于不同?DataNode 上,每个 Block q可以复制数份存储于不同? DataNode 上,辑ֈ定w容灾之目的。NameNode 则是整个 HDFS 的核心,它通过l护一些数据结构,记录了每一个文件被切割成了多少?BlockQ这?Block 可以从哪?DataNode 中获得,各个 DataNode 的状态等重要信息。如果你想了解更多的关于 HDFS 的信息,可进一步阅d考资料: [url]The Hadoop Distributed File System:Architecture and Design [/url] <br /> 分布式ƈ行计? <br /> <br /> Hadoop 中有一个作Z控的 JobTrackerQ用于调度和理其它?TaskTracker, JobTracker 可以q行于集中M台计机上。TaskTracker 负责执行dQ必运行于 DataNode 上,?DataNode 既是数据存储l点Q也是计结炏V?JobTracker ?Map d?Reduce d分发l空闲的 TaskTracker, 让这些Q务ƈ行运行,q负责监控Q务的q行情况。如果某一?TaskTracker 出故障了QJobTracker 会将其负责的d转交l另一个空闲的 TaskTracker 重新q行? <br /> <br /> 本地计算 <br /> <br /> 数据存储在哪一台计机上,qq台计算行这部分数据的计,q样可以减少数据在网l上的传输,降低对网l带宽的需求。在 Hadoop q样的基于集的分布式ƈ行系l中Q计结点可以很方便地扩充,而因它所能够提供的计能力近乎是无限的,但是由是数据需要在不同的计机之间动Q故|? l带宽变成了瓉Q是非常宝贵的,“本地计算”是最有效的一U节U网l带宽的手段Q业界把qŞ容ؓ“Ud计算比移动数据更l济”? <br /> <br /> ?2. 分布存储与ƈ行计? <br /> <img src="http://www.ibm.com/developerworks/cn/opensource/os-cn-hadoop1/figure2.jpg" alt="" /> <br /> <br /> d_度 <br /> <br /> 把原始大数据集切割成数据集Ӟ通常让小数据集小于或{于 HDFS 中一?Block 的大?~省? 64M)Q这栯够保证一个小数据集位于一台计机上,便于本地计算。有 M 个小数据集待处理Q就启动 M ?Map dQ注意这 M ?Map d分布?N 台计机上ƈ行运行,Reduce d的数?R 则可qh定? <br /> <br /> Partition <br /> <br /> ?Map d输出的中间结果按 key 的范围划分成 R ? R 是预先定义的 Reduce d的个?Q划分时通常使用 hash 函数? hash(key) mod RQ这样可以保证某一D范围内?keyQ一定是׃?Reduce d来处理,可以?Reduce 的过E? <br /> <br /> Combine <br /> <br /> ?partition 之前Q还可以对中间结果先?combineQ即中间结果中有相?key?<key, value> 对合q成一寏Vcombine 的过E与 Reduce 的过E类|很多情况下就可以直接使用 Reduce 函数Q但 combine 是作? Map d的一部分Q在执行?Map 函数后紧接着执行的。Combine 能够减少中间l果?<key, value> 对的数目Q从而减网l流量? <br /> <br /> Reduce d?Map dl点取中间结? <br /> <br /> Map d的中间结果在做完 Combine ?Partition 之后Q以文g形式存于本地盘。中间结果文件的位置会通知L JobTracker, JobTracker 再通知 Reduce d到哪一?DataNode 上去取中间结果。注意所有的 Map d产生中间l果均按?Key 用同一?Hash 函数划分成了 R 份,R ?Reduce d各自负责一D?Key 区间。每? Reduce 需要向许多?Map dl点取得落在其负责的 Key 区间内的中间l果Q然后执?Reduce 函数QŞ成一个最l的l果文g? <br /> <br /> d道 <br /> <br /> ?R ?Reduce dQ就会有 R 个最l结果,很多情况下这 R 个最l结果ƈ不需要合q成一个最l结果。因 R 个最l结果又可以做ؓ另一个计Q务的输入Q开始另一个ƈ行计Q务? <br /> <br /> ?Hadoop 初体? <br /> <br /> Hadoop 支持 Linux ?Windows 操作pȝ, 但其官方|站声明 Hadoop 的分布式操作?Windows 上未做严格测试,只把 Windows 作ؓ Hadoop 的开发^台。在 Windows 环境上的安装步骤如下( Linux q_cMQ且更简单一?: <br /> <br /> (1)?Windows 下,需要先安装 Cgywin, 安装 Cgywin 时注意一定要选择安装 openssh (?Net category )。安装完成之后,?Cgywin 的安装目录如 c:\cygwin\bin 加到pȝ环境变量 PATH 中,q是因ؓq行 Hadoop 要执行一?linux 环境下的脚本和命令? <br /> <br /> (2)安装 Java 1.5.xQƈ?JAVA_HOME 环境变量讄?Java 的安装根目录?C:\Program Files\Java\jdk1.5.0_01? <br /> <br /> (3)?Hadoop 官方|站[url] http://hadoop.apache.org[/url]下蝲Hadoop Core, 最新的E_版本?0.16.0. 下载后的安装包解压C个目录,本文假定解压?c:\hadoop-0.16.0? <br /> <br /> 4)修改 conf/hadoop-env.sh 文gQ在其中讄 JAVA_HOME 环境变量Q?export JAVA_HOME="C:\Program Files\Java\jdk1.5.0_01” (因ؓ路径?Program Files 中间有空|一定要用双引号\径引h) <br /> <br /> xQ一切就l,可以q行 Hadoop 了。以下的q行q程Q需要启?cygwin, q入模拟 Linux 环境。在下蝲?Hadoop Core 包中Q带有几个示例程序ƈ且已l打包成?hadoop-0.16.0-examples.jar。其中有一?WordCount E序Q功能是l计一Ҏ本文件中各个单词出现的次敎ͼ我们先来看看怎么q行q个E序。Hadoop 共有三种q行模式: 单机(非分布式)模式Q伪分布式运行模式,分布式运行模式,其中前两U运行模式体C?Hadoop 分布式计的优势Qƈ没有什么实际意义,但对E序的测试及调试很有帮助Q我们先从这两种模式入手Q了解基?Hadoop 的分布式q行E序是如何编写和q行的? <br /> <br /> 单机(非分布式)模式 <br /> <br /> q种模式在一台单Zq行Q没有分布式文gpȝQ而是直接d本地操作pȝ的文件系l? <br /> <br /> <br /> 代码清单1 <br /> <div id="r9rrvt1" class="dp-highlighter"> <div id="pvfplzh" class="bar"> <div id="rlpplbh" class="tools">Java代码 <embed src="http://mintelong.javaeye.com/javascripts/syntaxhighlighter/clipboard_new.swf" flashvars="clipboard=%24%20cd%20%2Fcygdrive%2Fc%2Fhadoop-0.16.0%0A%24%20mkdir%20test-in%20%20%0A%24%20cd%20test-in%0A%23%E5%9C%A8%20test-in%20%E7%9B%AE%E5%BD%95%E4%B8%8B%E5%88%9B%E5%BB%BA%E4%B8%A4%E4%B8%AA%E6%96%87%E6%9C%AC%E6%96%87%E4%BB%B6%2C%20WordCount%20%E7%A8%8B%E5%BA%8F%E5%B0%86%E7%BB%9F%E8%AE%A1%E5%85%B6%E4%B8%AD%E5%90%84%E4%B8%AA%E5%8D%95%E8%AF%8D%E5%87%BA%E7%8E%B0%E6%AC%A1%E6%95%B0%0A%24%20echo%20%22hello%20world%20bye%20world%22%20%3Efile1.txt%20%20%20%0A%24%20echo%20%22hello%20hadoop%20goodbye%20hadoop%22%20%3Efile2.txt%0A%24%20cd%20..%0A%24%20bin%2Fhadoop%20jar%20hadoop-0.16.0-examples.jar%20wordcount%20test-in%20test-out%0A%23%E6%89%A7%E8%A1%8C%E5%AE%8C%E6%AF%95%EF%BC%8C%E4%B8%8B%E9%9D%A2%E6%9F%A5%E7%9C%8B%E6%89%A7%E8%A1%8C%E7%BB%93%E6%9E%9C%EF%BC%9A%0A%24%20cd%20test-out%0A%24%20cat%20part-00000%0Abye%20%20%20%20%201%0Agoodbye%20%201%0Ahadoop%20%202%0Ahello%20%20%20%202%0Aworld%20%20%202" quality="high" allowscriptaccess="always" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" width="14" height="15"></div> </div> <ol class="dp-j" start="1"> <li><span><span>$ cd /cygdrive/c/hadoop-</span><span id="xrh9vjx" class="number">0.16</span><span>.</span><span id="1rbdltl" class="number">0</span><span>  </span></span></li> <li><span>$ mkdir test-in    </span></li> <li><span>$ cd test-in  </span></li> <li><span>#?nbsp;test-in 目录下创Z个文本文? WordCount E序统计其中各个单词出现次?nbsp; </span></li> <li><span>$ echo <span id="1ttl9xn" class="string">"hello world bye world"</span><span> >file1.txt     </span></span></li> <li><span>$ echo <span id="lvdnpff" class="string">"hello hadoop goodbye hadoop"</span><span> >file2.txt  </span></span></li> <li><span>$ cd ..  </span></li> <li><span>$ bin/hadoop jar hadoop-<span id="xp3zfv9" class="number">0.16</span><span>.</span><span id="dhphrn9" class="number">0</span><span>-examples.jar wordcount test-in test-out  </span></span></li> <li><span>#执行完毕Q下面查看执行结果:  </span></li> <li><span>$ cd test-out  </span></li> <li><span>$ cat part-<span id="nx9npfn" class="number">00000</span><span>  </span></span></li> <li><span>bye     <span id="fzt9d3n" class="number">1</span><span>  </span></span></li> <li><span>goodbye  <span id="7bbbrrr" class="number">1</span><span>  </span></span></li> <li><span>hadoop  <span id="dphhrt7" class="number">2</span><span>  </span></span></li> <li><span>hello    <span id="xtvn3br" class="number">2</span><span>  </span></span></li> <li><span>world   <span id="zrrjldt" class="number">2</span><span>  </span></span></li> </ol> </div> <pre style="display: none;" name="code" class="java">$ cd /cygdrive/c/hadoop-0.16.0 $ mkdir test-in $ cd test-in #?test-in 目录下创Z个文本文? WordCount E序统计其中各个单词出现次? $ echo "hello world bye world" >file1.txt $ echo "hello hadoop goodbye hadoop" >file2.txt $ cd .. $ bin/hadoop jar hadoop-0.16.0-examples.jar wordcount test-in test-out #执行完毕Q下面查看执行结果: $ cd test-out $ cat part-00000 bye 1 goodbye 1 hadoop 2 hello 2 world 2</pre> <br /> <br /> 注意事项Q运?bin/hadoop jar hadoop-0.16.0-examples.jar wordcount test-in test-out Ӟ务必注意W一个参数是 jar, 不是 -jar, 当你?-jar Ӟ不会告诉你是参数错了Q报告出来的错误信息是:Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/hadoop/util/ProgramDriver, W者当时以为是 classpath 的设|问题,费了不时间。通过分析 bin/hadoop 脚本可知Q?jar q不?bin/hadoop 脚本定义的参敎ͼ此脚本会?-jar 作ؓ Java 的参敎ͼJava ?jar 参数表示执行一?Jar 文g(q个 Jar 文g必须是一个可执行?Jar,卛_ MANIFEST 中定义了ȝ), 此时外部定义?classpath 是不起作用的Q因而会抛出 java.lang.NoClassDefFoundError 异常。?jar ?bin/hadoop 脚本定义的参敎ͼ会调?Hadoop 自己的一个工L RunJarQ这个工L也能够执行一?Jar 文gQƈ且外部定义的 classpath 有效? <br /> <br /> 伪分布式q行模式 <br /> <br /> q种模式也是在一台单Zq行Q但用不同的 Java q程模仿分布式运行中的各cȝ?( NameNode, DataNode, JobTracker, TaskTracker, Secondary NameNode )Q请注意分布式运行中的这几个l点的区别: <br /> <br /> 从分布式存储的角度来_集群中的l点׃?NameNode 和若q个 DataNode l成, 另有一?Secondary NameNode 作ؓ NameNode 的备份。从分布式应用的角度来说Q集中的结点由一?JobTracker 和若q个 TaskTracker l成QJobTracker 负责d的调度,TaskTracker 负责q行执行d。TaskTracker 必须q行? DataNode 上,q样便于数据的本地计。JobTracker ?NameNode 则无d同一台机器上? <br /> <br /> (1) 按代码清?修改 conf/hadoop-site.xml。注?conf/hadoop-default.xml 中是 Hadoop ~省的参敎ͼ你可以通过L文g了解 Hadoop 中有哪些参数可供配置Q但不要修改此文件。可通过修改 conf/hadoop-site.xml 改变~省参数|此文件中讄的参数g覆盖 conf/hadoop-default.xml 的同名参数? <br /> <br /> <br /> 代码清单 2 <br /> <div id="93t9hjt" class="dp-highlighter"> <div id="jj3nf9h" class="bar"> <div id="5bblbn3" class="tools">Java代码 <embed src="http://mintelong.javaeye.com/javascripts/syntaxhighlighter/clipboard_new.swf" flashvars="clipboard=%3Cconfiguration%3E%0A%20%20%3Cproperty%3E%0A%20%20%20%20%3Cname%3Efs.default.name%3C%2Fname%3E%0A%20%20%20%20%3Cvalue%3Elocalhost%3A9000%3C%2Fvalue%3E%0A%20%20%3C%2Fproperty%3E%0A%20%20%3Cproperty%3E%0A%20%20%20%20%3Cname%3Emapred.job.tracker%3C%2Fname%3E%0A%20%20%20%20%3Cvalue%3Elocalhost%3A9001%3C%2Fvalue%3E%0A%20%20%3C%2Fproperty%3E%0A%20%20%3Cproperty%3E%0A%20%20%20%20%3Cname%3Edfs.replication%3C%2Fname%3E%0A%20%20%20%20%3Cvalue%3E1%3C%2Fvalue%3E%0A%20%20%3C%2Fproperty%3E%0A%3C%2Fconfiguration%3E" quality="high" allowscriptaccess="always" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" width="14" height="15"></div> </div> <ol class="dp-j" start="1"> <li><span><span><configuration>  </span></span></li> <li><span>  <property>  </span></li> <li><span>    <name>fs.<span id="bbj39rz" class="keyword">default</span><span>.name</name>  </span></span></li> <li><span>    <value>localhost:<span id="prrjdbv" class="number">9000</span><span></value>  </span></span></li> <li><span>  </property>  </span></li> <li><span>  <property>  </span></li> <li><span>    <name>mapred.job.tracker</name>  </span></li> <li><span>    <value>localhost:<span id="xrlf7jb" class="number">9001</span><span></value>  </span></span></li> <li><span>  </property>  </span></li> <li><span>  <property>  </span></li> <li><span>    <name>dfs.replication</name>  </span></li> <li><span>    <value><span id="3fh9nld" class="number">1</span><span></value>  </span></span></li> <li><span>  </property>  </span></li> <li><span></configuration>  </span></li> </ol> </div> <pre style="display: none;" name="code" class="java"><configuration> <property> <name>fs.default.name</name> <value>localhost:9000</value> </property> <property> <name>mapred.job.tracker</name> <value>localhost:9001</value> </property> <property> <name>dfs.replication</name> <value>1</value> </property> </configuration></pre> <br /> <br /> 参数 fs.default.name 指定 NameNode ?IP 地址和端口号。缺省值是 file:///, 表示使用本地文gpȝ, 用于单机非分布式模式。此处我们指定用运行于本机 localhost 上的 NameNode? <br /> <br /> 参数 mapred.job.tracker 指定 JobTracker ?IP 地址和端口号。缺省值是 local, 表示在本地同一 Java q程内执?JobTracker ?TaskTracker, 用于单机非分布式模式。此处我们指定用运行于本机 localhost 上的 JobTracker ( 用一个单独的 Java q程?JobTracker )? <br /> <br /> 参数 dfs.replication 指定 HDFS 中每?Block 被复制的ơ数Qv数据冗余备䆾的作用。在典型的生产系l中Q这个数常常讄?? <br /> <br /> (2)配置 SSH,如代码清?所C? <br /> <br /> <br /> 代码清单 3 <br /> <div id="7bttt9p" class="dp-highlighter"> <div id="lpfhxzx" class="bar"> <div id="73xr9nh" class="tools">Java代码 <embed src="http://mintelong.javaeye.com/javascripts/syntaxhighlighter/clipboard_new.swf" flashvars="clipboard=%24%20ssh-keygen%20-t%20dsa%20-P%20''%20-f%20~%2F.ssh%2Fid_dsa%20%0A%24%20cat%20~%2F.ssh%2Fid_dsa.pub%20%3E%3E%20~%2F.ssh%2Fauthorized_keys" quality="high" allowscriptaccess="always" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" width="14" height="15"></div> </div> <ol class="dp-j" start="1"> <li><span><span>$ ssh-keygen -t dsa -P </span><span id="bdvlvbd" class="string">''</span><span> -f ~/.ssh/id_dsa   </span></span></li> <li><span>$ cat ~/.ssh/id_dsa.pub >> ~/.ssh/authorized_keys  </span></li> </ol> </div> <pre style="display: none;" name="code" class="java">$ ssh-keygen -t dsa -P '' -f ~/.ssh/id_dsa $ cat ~/.ssh/id_dsa.pub >> ~/.ssh/authorized_keys</pre> <br /> <br /> 配置完后Q执行一?ssh localhost, 认你的机器可以?SSH q接Qƈ且连接时不需要手工输入密码? <br /> <br /> (3)格式化一个新的分布式文gpȝ, 如代码清?所C? <br /> <br /> <br /> 代码清单 4 <br /> <div id="rd7zzjz" class="dp-highlighter"> <div id="1hpphn9" class="bar"> <div id="1hpprjh" class="tools">Java代码 <embed src="http://mintelong.javaeye.com/javascripts/syntaxhighlighter/clipboard_new.swf" flashvars="clipboard=%24%20cd%20%2Fcygdrive%2Fc%2Fhadoop-0.16.0%0A%24%20bin%2Fhadoop%20namenode%20%E2%80%93format%20" quality="high" allowscriptaccess="always" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" width="14" height="15"></div> </div> <ol class="dp-j" start="1"> <li><span><span>$ cd /cygdrive/c/hadoop-</span><span id="tnnndbl" class="number">0.16</span><span>.</span><span id="tzzppn3" class="number">0</span><span>  </span></span></li> <li><span>$ bin/hadoop namenode –format   </span></li> </ol> </div> <pre style="display: none;" name="code" class="java">$ cd /cygdrive/c/hadoop-0.16.0 $ bin/hadoop namenode –format </pre> <br /> <br /> (4) 启动 hadoop q程, 如代码清?所C。控制台上的输出信息应该昄启动?namenode, datanode, secondary namenode, jobtracker, tasktracker。启动完成之后,通过 ps –ef 应该可以看到启动?个新?java q程? <br /> <br /> 代码清单 5 <br /> <div id="9h99v9z" class="dp-highlighter"> <div id="n9trrb3" class="bar"> <div id="z1jjjpj" class="tools">Java代码 <embed src="http://mintelong.javaeye.com/javascripts/syntaxhighlighter/clipboard_new.swf" flashvars="clipboard=%24%20bin%2Fstart-all.sh%20%20%0A%24%20ps%20%E2%80%93ef" quality="high" allowscriptaccess="always" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" width="14" height="15"></div> </div> <ol class="dp-j" start="1"> <li><span><span>$ bin/start-all.sh    </span></span></li> <li><span>$ ps –ef  </span></li> </ol> </div> <pre style="display: none;" name="code" class="java">$ bin/start-all.sh $ ps –ef</pre> <br /> <br /> (5) q行 wordcount 应用, 如代码清?所C? <br /> <br /> 代码清单 6 <br /> <div id="jl9zr3h" class="dp-highlighter"> <div id="dxnfxzn" class="bar"> <div id="fzpnffd" class="tools">Java代码 <embed src="http://mintelong.javaeye.com/javascripts/syntaxhighlighter/clipboard_new.swf" flashvars="clipboard=%24%20bin%2Fhadoop%20dfs%20-put%20.%2Ftest-in%20input%20%20%0A%23%E5%B0%86%E6%9C%AC%E5%9C%B0%E6%96%87%E4%BB%B6%E7%B3%BB%E7%BB%9F%E4%B8%8A%E7%9A%84%20.%2Ftest-in%20%E7%9B%AE%E5%BD%95%E6%8B%B7%E5%88%B0%20HDFS%20%E7%9A%84%E6%A0%B9%E7%9B%AE%E5%BD%95%E4%B8%8A%EF%BC%8C%E7%9B%AE%E5%BD%95%E5%90%8D%E6%94%B9%E4%B8%BA%20input%0A%23%E6%89%A7%E8%A1%8C%20bin%2Fhadoop%20dfs%20%E2%80%93help%20%E5%8F%AF%E4%BB%A5%E5%AD%A6%E4%B9%A0%E5%90%84%E7%A7%8D%20HDFS%20%E5%91%BD%E4%BB%A4%E7%9A%84%E4%BD%BF%E7%94%A8%E3%80%82%0A%24%20bin%2Fhadoop%20jar%20hadoop-0.16.0-examples.jar%20wordcount%20input%20output%0A%23%E6%9F%A5%E7%9C%8B%E6%89%A7%E8%A1%8C%E7%BB%93%E6%9E%9C%3A%0A%23%E5%B0%86%E6%96%87%E4%BB%B6%E4%BB%8E%20HDFS%20%E6%8B%B7%E5%88%B0%E6%9C%AC%E5%9C%B0%E6%96%87%E4%BB%B6%E7%B3%BB%E7%BB%9F%E4%B8%AD%E5%86%8D%E6%9F%A5%E7%9C%8B%EF%BC%9A%0A%24%20bin%2Fhadoop%20dfs%20-get%20output%20output%20%0A%24%20cat%20output%2F*%0A%23%E4%B9%9F%E5%8F%AF%E4%BB%A5%E7%9B%B4%E6%8E%A5%E6%9F%A5%E7%9C%8B%0A%24%20bin%2Fhadoop%20dfs%20-cat%20output%2F*%0A%24%20bin%2Fstop-all.sh%20%23%E5%81%9C%E6%AD%A2%20hadoop%20%E8%BF%9B%E7%A8%8B" quality="high" allowscriptaccess="always" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" width="14" height="15"></div> </div> <ol class="dp-j" start="1"> <li><span><span>$ bin/hadoop dfs -put ./test-in input    </span></span></li> <li><span>#本地文件系l上?nbsp;./test-in 目录拷到 HDFS 的根目录上,目录名改?nbsp;input  </span></li> <li><span>#执行 bin/hadoop dfs –help 可以学习各种 HDFS 命o的用?nbsp; </span></li> <li><span>$ bin/hadoop jar hadoop-<span id="zvvvxdn" class="number">0.16</span><span>.</span><span id="hvnnnfx" class="number">0</span><span>-examples.jar wordcount input output  </span></span></li> <li><span>#查看执行l果:  </span></li> <li><span>#文件从 HDFS 拷到本地文gpȝ中再查看Q?nbsp; </span></li> <li><span>$ bin/hadoop dfs -get output output   </span></li> <li><span>$ cat output/*  </span></li> <li><span>#也可以直接查?nbsp; </span></li> <li><span>$ bin/hadoop dfs -cat output/*  </span></li> <li><span>$ bin/stop-all.sh #停止 hadoop q程  </span></li> </ol> </div> <pre style="display: none;" name="code" class="java">$ bin/hadoop dfs -put ./test-in input #本地文件系l上?./test-in 目录拷到 HDFS 的根目录上,目录名改?input #执行 bin/hadoop dfs –help 可以学习各种 HDFS 命o的用? $ bin/hadoop jar hadoop-0.16.0-examples.jar wordcount input output #查看执行l果: #文件从 HDFS 拷到本地文gpȝ中再查看Q? $ bin/hadoop dfs -get output output $ cat output/* #也可以直接查? $ bin/hadoop dfs -cat output/* $ bin/stop-all.sh #停止 hadoop q程</pre> <br /> <br /> 故障诊断 <br /> <br /> (1) 执行 $ bin/start-all.sh 启动 Hadoop q程后,会启??java q程, 同时会在 /tmp 目录下创Z?pid 文g记录q些q程 ID 受通过q五个文Ӟ可以得知 namenode, datanode, secondary namenode, jobtracker, tasktracker 分别对应于哪一?Java q程。当你觉?Hadoop 工作不正常时Q可以首先查看这5?java q程是否在正常运行? <br /> <br /> (2) 使用 web 接口。访?http://localhost:50030 可以查看 JobTracker 的运行状态。访? http://localhost:50060 可以查看 TaskTracker 的运行状态。访?http://localhost:50070 可以查看 NameNode 以及整个分布式文件系l的状态,览分布式文件系l中的文件以?log {? <br /> <br /> (3) 查看 ${HADOOP_HOME}/logs 目录下的 log 文gQnamenode, datanode, secondary namenode, jobtracker, tasktracker 各有一个对应的 log 文gQ每一ơ运行的计算d也有对应?log 文g。分析这?log 文g有助于找到故障原因? <br /> <br /> <br /> l束? <br /> <br /> 现在Q你已经了解?MapReduce 计算模型Q分布式文gpȝ HDFSQ分布式q行计算{的基本原理, q且有了一个可以运行的 Hadoop 环境Q运行了一个基?Hadoop 的ƈ行程序? <img src ="http://www.tkk7.com/tinysun/aggbug/328098.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/tinysun/" target="_blank">何克?/a> 2010-08-06 09:42 <a href="http://www.tkk7.com/tinysun/archive/2010/08/06/328098.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>OOP늅QLiskov替换原则--LSP http://www.tkk7.com/tinysun/archive/2010/04/13/318154.html何克?/dc:creator>何克?/author>Tue, 13 Apr 2010 06:00:00 GMThttp://www.tkk7.com/tinysun/archive/2010/04/13/318154.htmlhttp://www.tkk7.com/tinysun/comments/318154.htmlhttp://www.tkk7.com/tinysun/archive/2010/04/13/318154.html#Feedback0http://www.tkk7.com/tinysun/comments/commentRss/318154.htmlhttp://www.tkk7.com/tinysun/services/trackbacks/318154.html

]]>
L学习两台W记本无U互??/title><link>http://www.tkk7.com/tinysun/archive/2010/01/07/308561.html</link><dc:creator>何克?/dc:creator><author>何克?/author><pubDate>Thu, 07 Jan 2010 08:05:00 GMT</pubDate><guid>http://www.tkk7.com/tinysun/archive/2010/01/07/308561.html</guid><wfw:comment>http://www.tkk7.com/tinysun/comments/308561.html</wfw:comment><comments>http://www.tkk7.com/tinysun/archive/2010/01/07/308561.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/tinysun/comments/commentRss/308561.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/tinysun/services/trackbacks/308561.html</trackback:ping><description><![CDATA[<strong><font color="#004080"><a target="_blank"><strong>无线</strong></a>双机互连配置</font></strong> <p>      我们在一台机子的|上dQ右键点击选择“属?#8221;如下图?/p> <p align="center"><img src="http://www.9orange.com/uploadpic/20059794852890.jpg" border="0" alt="" /></p> <p><font color="#0000ff"><strong>     1Q?/strong></font><font color="#000000">选中要来讄?a target="_blank"><strong>无线</strong></a>|卡的连?#8220;|络q接”H口Q右L用来共享的<a target="_blank"><strong>无线</strong></a>|卡q且选择“属?#8221;Q会弹出以下的窗口?/font></p> <p align="center"><img src="http://www.9orange.com/uploadpic/20059794928316.jpg" border="0" alt="" /></p> <p>      讄W记本电脑(也可能是台式机)?a target="_blank"><strong>无线</strong></a>|卡TCP/<a target="_blank"><strong>IP</strong></a>属性。在<a target="_blank"><strong>无线</strong></a>|络q接属性对话框?“常规”选项卡中讄<a target="_blank"><strong>IP</strong></a>地址。两台机子设|成同网D늚Q例如:“192.168.1.X”QX是代表一个数|??55Q都可以Q,子网掩码讄?55.255.255.0?/p> <p>    <strong><font color="#0000ff">2Q?/font></strong>选择“<a target="_blank"><strong>无线</strong></a>|络配置”选项卡。选择“用Windows配置我的<a target="_blank"><strong>无线</strong></a>|络讄”复选项Q以ȀzM面的其他配置选项?/p> <p align="center"><img src="http://www.9orange.com/uploadpic/20059795010307.jpg" border="0" alt="" /></p> <p>   <strong><font color="#0000ff"> 3Q?/font></strong>如果要添加新?a target="_blank"><strong>无线</strong></a>|络Q可单击“d”按钮Q在打开的如下图所C对话框中进行。在下方选择“d”按钮Q会弹出下图的窗口,在服务名(SSID)中填写你喜欢的名Uͼ注意不能用中文,其他电脑在寻找这个点对点q接的时候就会看到这个名字,我们在此写grfwgr。然后在打开的页面里q行相关讄?/p> <p align="center"><img src="http://www.9orange.com/uploadpic/20059795043431.jpg" border="0" alt="" /></p> <p>      首先要配|的?a target="_blank"><strong>无线</strong></a>|络SSIDQ一定要与对应的<a target="_blank"><strong>无线</strong></a>|卡所配置的SSID一致。然后在下面?#8220;<a target="_blank"><strong>无线</strong></a>|络密钥”下配置与对?a target="_blank"><strong>无线</strong></a>|卡相同的安全选项。ƈ要选择“q是一个计机到计机Q特定的Q网l;没有使用<a target="_blank"><strong>无线</strong></a>讉K点(CQ?#8221;复选项?/p> <p>    <strong><font color="#0000ff">4Q?/font></strong>如果惌配置IEEE 802.1xw䆾验证Q则单击如(<font color="#0000ff">W??/font>Q所C对话框中的“验证”选项卡,如下图所C?/p> <p align="center"><img src="http://www.9orange.com/uploadpic/2005979519935.jpg" border="0" alt="" /></p> <p>      在其中就可以选择两种IEEE 802.1xw䆾验证Ҏ。当然如果选择的是“卡或其它证书”选项Q则一定安装了卡或计算书,通常不用配置IEEE 802.1xw䆾验证?/p> <p>    <font color="#0000ff"><strong>5Q?/strong></font>?#8220;q接”选项卡中仅配|是否允许计机当所配置?a target="_blank"><strong>无线</strong></a>|络在有效区域中卌动连接,非常单,不作详细介绍。配|好后单?#8220;定”按钮q回到如Q?font color="#0000ff">W??/font>Q所C对话框?/p>    <strong><font color="#0000ff">6Q?/font></strong>在(<font color="#0000ff">W??/font>Q所C对话框中单?#8220;高”按钮Q打开如下图所C对话框? <p align="center"><img src="http://www.9orange.com/uploadpic/20059795815215.jpg" border="0" alt="" /></p> <p>      在此对话框中要指定客L所q接?a target="_blank"><strong>无线</strong></a>|络cdQ将“M可用的网l?#8221;更改?#8220;仅计机到计机”Qƈ关闭“自动q接到非首选的|络”选项。完成后单击“定”按钮q回到如Q?font color="#0000ff">W??/font>Q所C对话框?/p> <p>    <strong><font color="#0000ff">7Q?/font></strong>在另一台笔记本电脑上,再次用鼠标右键单MQ务栏右侧?a target="_blank"><strong>无线</strong></a>|络q接状态指C图标,q时可以发现在弹出的“q接?a target="_blank"><strong>无线</strong></a>|络”对话框中已经有了一个另一台我们设|的标志Q本文里?#8220;grfwgz”的可?a target="_blank"><strong>无线</strong></a>|络Q选中它ƈ?#8220;允许我连接到选择?a target="_blank"><strong>无线</strong></a>|络Q即使它是不安全?#8221;选项前打?#8220;√”Q然后点?#8220;q接”按钮?/p> <p>      q时Q如果把鼠标指针指向d栏上?a target="_blank"><strong>无线</strong></a>|络q接状态指C图标,可以看到两台W记本电?a target="_blank"><strong>无线</strong></a>q接的有x况,如速度、信号强度等?/p> <p>    <strong><font color="#0000ff">8Q?/font></strong>Z使用方便Q把两台W记本电脑设|成同一工作l。打开|上dQ两台笔记本电脑均可看到包括Ҏ在内的两台机器的图标。把需要交换数据的盘或文件夹设成׃n之后Q两台笔记本电脑可以交换资料了?/p> <p>   <font color="#ff0000"><strong> 注:</strong></font><font color="#ff0000">如果是Windows XP之前的操作系l,q需要将两个<a target="_blank"><strong>无线</strong></a>|络适配器的通道讄l一。Windows 2000需要在|络适配器的属性里面修改channel的倹{?/font></p> <p>      其实也可以在<a target="_blank"><strong>无线</strong></a>|卡q接属性配|对话框中的“高”选项卡中选择“自动q接非首选网l?#8221;复选框。这L记本会自动搜索可用网l进行连接?/p> <p> </p> <p> </p> <p><strong><font style="background-color: #ffff66">两台</font></strong>机器都有无线|卡话,直接启用无线|卡的对接模式(只限<strong style="color: black; background-color: #ffff66">两台</strong>Q就可以?q种方式不用路由器的Q一般的无线|卡都有q种功能?<br /> Ҏ成功后,是标准的局域网Q所有的功能都可用,更别说简单的玩游戏了.Ҏ如下 <br /> 1?strong style="color: black; background-color: #ffff66">两台</strong>机器的无U网l连接上单击右键Q开启它的属性窗口,双击TCP/IP协议?<br /> 2. 输入W一台电脑的IP地址192.168.0.1和子|掩?55.255.255.0。同理另外一台设|ؓ192.168.0.2?55.255.255.0Q网兛_DNS参数不填?<br /> 3. 切换?#8220;无线|络配置”标签Q单?#8220;高”按钮Q在“高”H口选择“仅计机到计机Q特定)”选项Q单?#8220;关闭”按钮q回上一个窗口?<br /> 4. 在第一台电脑的“无线|络配置”标签中单?#8220;d”按钮d一个可用网l,输入服务名(SSIDQ,q个名称与在“|上d”中的工作l名UC样可让其他电脑检到Q其他参数用默认的即可。完成此操作后确认关闭所有窗口?<br /> 5. 在第二台“|络q接”H口选择无线|络q接Q单d键执?#8220;查看可用的无U连?#8221;功能QWindows便可到W一台电脑创建的无线|络,加入卛_?/p> <img src ="http://www.tkk7.com/tinysun/aggbug/308561.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/tinysun/" target="_blank">何克?/a> 2010-01-07 16:05 <a href="http://www.tkk7.com/tinysun/archive/2010/01/07/308561.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>大端法、小端法、网l字节序 ?/title><link>http://www.tkk7.com/tinysun/archive/2009/12/31/307952.html</link><dc:creator>何克?/dc:creator><author>何克?/author><pubDate>Thu, 31 Dec 2009 13:33:00 GMT</pubDate><guid>http://www.tkk7.com/tinysun/archive/2009/12/31/307952.html</guid><wfw:comment>http://www.tkk7.com/tinysun/comments/307952.html</wfw:comment><comments>http://www.tkk7.com/tinysun/archive/2009/12/31/307952.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/tinysun/comments/commentRss/307952.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/tinysun/services/trackbacks/307952.html</trackback:ping><description><![CDATA[<div id="9xz3t9x" class="motadou_spec_line"><font class="title">关于字节?大端法、小端法)的定?/font></div> 《UNXI|络~程》定义:术语“端”?#8220;大端”表示多字节值的哪一?端或大?存储在该值的起始地址。小端存在v始地址Q即是小端字节序Q大端存在v始地址Q即是大端字节序? <p> </p> <p>也可以说Q?<br /> 1.端?Little-Endian)是低位字节排放在内存的低地址端即该值的起始地址Q高位字节排攑֜内存的高地址端?<br /> 2.大端?Big-Endian)是高位字节排放在内存的低地址端即该值的起始地址Q低位字节排攑֜内存的高地址端?/p> <p>举个单的例子Q对于整?x12345678。它在大端法和小端法的系l内中,分别如图1所C的方式存放?/p> <p><a ><img title="zijiexu_pic_1" style="border-top-width: 0px; display: inline; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="378" alt="zijiexu_pic_1" src="http://images.cnblogs.com/cnblogs_com/motadou/WindowsLiveWriter/029908e67cac_BAC0/zijiexu_pic_1_thumb.jpg" width="603" border="0" /></a> </p> <p> </p> <div id="fxpxpfx" class="motadou_spec_line"><font class="title">|络字节?/font></div> <p>我们知道|络上的数据是字节,对于一个多字节数|在进行网l传输的时候,先传递哪个字节?也就是说Q当接收端收到第一个字节的时候,它是这个字节作为高位还是低位来处理呢? <br /> |络字节序定义:收到的第一个字节被当作高位看待Q这p求发送端发送的W一个字节应当是高位。而在发送端发送数据时Q发送的W一个字节是该数字在内存中v始地址对应的字节。可见多字节数值在发送前Q在内存中数值应该以大端法存放?<br /> |络字节序说是大端字节序?<br /> 比如我们l过|络发?x12345678q个整ŞQ在80X86q_中,它是以小端法存放的,在发送前需要用系l提供的htonl其转换成大端法存放Q如?所C?</p> <p><a ><img title="zijiexu_pic_2" style="border-top-width: 0px; display: inline; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="378" alt="zijiexu_pic_2" src="http://images.cnblogs.com/cnblogs_com/motadou/WindowsLiveWriter/029908e67cac_BAC0/zijiexu_pic_2_thumb.jpg" width="605" border="0" /></a> </p> <p> </p> <div id="bttblrt" class="motadou_spec_line"><font class="title">字节序测试程?<br /> </font></div> 不同cpuq_上字节序通常也不一P下面写个单的CE序Q它可以试不同q_上的字节序? <div style="font-size: 12px; line-height: 16px; font-family: courier new"> <table style="border-top-width: 0px; padding-right: 0px; padding-left: 0px; border-left-width: 0px; border-bottom-width: 0px; padding-bottom: 0px; width: 100%; padding-top: 0px; border-right-width: 0px" cellspacing="0"> <tbody> <tr> <td style="color: teal" valign="top" width="42">1  </td> <td width="700"><span style="color: #0000ff">#include</span><span style="color: #000000"> </span><span style="color: #800000"><</span><span style="color: #000000">stdio</span><span style="color: #000000">.</span><span style="color: #000000">h</span><span style="color: #800000">></span></td> </tr> <tr> <td style="color: teal" valign="top" width="42">2  </td> <td width="700"><span style="color: #0000ff">#include</span><span style="color: #000000"> </span><span style="color: #800000"><</span><span style="color: #000000">netinet</span><span style="color: #000000">/</span><span style="color: #000000">in</span><span style="color: #000000">.</span><span style="color: #000000">h</span><span style="color: #800000">></span></td> </tr> <tr> <td style="color: teal" valign="top" width="42">3  </td> <td width="700"><span style="color: #0000ff">int</span><span style="color: #000000"> </span><span style="color: #000000">main()</span></td> </tr> <tr> <td style="color: teal" valign="top" width="42">4  </td> <td width="700"><span style="color: #800000">{</span></td> </tr> <tr> <td style="color: teal" valign="top" width="42">5  </td> <td width="700"><span style="color: #000000">    </span><span style="color: #0000ff">int</span><span style="color: #000000"> </span><span style="color: #000000">i_num</span><span style="color: #000000"> </span><span style="color: #000000">=</span><span style="color: #000000"> </span><span style="color: #0000ff">0x12345678</span><span style="color: #000000">;</span></td> </tr> <tr> <td style="color: teal" valign="top" width="42">6  </td> <td width="700"><span style="color: #000000">    </span><span style="color: #0000ff">printf</span><span style="color: #000000">(</span><span style="color: #800000">"</span><span style="color: #800000">[0]:0x%x\n</span><span style="color: #800000">"</span><span style="color: #000000">,</span><span style="color: #000000"> </span><span style="color: #000000">*</span><span style="color: #000000">((</span><span style="color: #0000ff">char</span><span style="color: #000000"> </span><span style="color: #000000">*</span><span style="color: #000000">)</span><span style="color: #000000">&</span><span style="color: #000000">i_num</span><span style="color: #000000"> </span><span style="color: #000000">+</span><span style="color: #000000"> </span><span style="color: #0000ff">0</span><span style="color: #000000">));</span></td> </tr> <tr> <td style="color: teal" valign="top" width="42">7  </td> <td width="700"><span style="color: #000000">    </span><span style="color: #0000ff">printf</span><span style="color: #000000">(</span><span style="color: #800000">"</span><span style="color: #800000">[1]:0x%x\n</span><span style="color: #800000">"</span><span style="color: #000000">,</span><span style="color: #000000"> </span><span style="color: #000000">*</span><span style="color: #000000">((</span><span style="color: #0000ff">char</span><span style="color: #000000"> </span><span style="color: #000000">*</span><span style="color: #000000">)</span><span style="color: #000000">&</span><span style="color: #000000">i_num</span><span style="color: #000000"> </span><span style="color: #000000">+</span><span style="color: #000000"> </span><span style="color: #0000ff">1</span><span style="color: #000000">));</span></td> </tr> <tr> <td style="color: teal" valign="top" width="42">8  </td> <td width="700"><span style="color: #000000">    </span><span style="color: #0000ff">printf</span><span style="color: #000000">(</span><span style="color: #800000">"</span><span style="color: #800000">[2]:0x%x\n</span><span style="color: #800000">"</span><span style="color: #000000">,</span><span style="color: #000000"> </span><span style="color: #000000">*</span><span style="color: #000000">((</span><span style="color: #0000ff">char</span><span style="color: #000000"> </span><span style="color: #000000">*</span><span style="color: #000000">)</span><span style="color: #000000">&</span><span style="color: #000000">i_num</span><span style="color: #000000"> </span><span style="color: #000000">+</span><span style="color: #000000"> </span><span style="color: #0000ff">2</span><span style="color: #000000">));</span></td> </tr> <tr> <td style="color: teal" valign="top" width="42">9  </td> <td width="700"><span style="color: #000000">    </span><span style="color: #0000ff">printf</span><span style="color: #000000">(</span><span style="color: #800000">"</span><span style="color: #800000">[3]:0x%x\n</span><span style="color: #800000">"</span><span style="color: #000000">,</span><span style="color: #000000"> </span><span style="color: #000000">*</span><span style="color: #000000">((</span><span style="color: #0000ff">char</span><span style="color: #000000"> </span><span style="color: #000000">*</span><span style="color: #000000">)</span><span style="color: #000000">&</span><span style="color: #000000">i_num</span><span style="color: #000000"> </span><span style="color: #000000">+</span><span style="color: #000000"> </span><span style="color: #0000ff">3</span><span style="color: #000000">));</span></td> </tr> <tr> <td style="color: teal" valign="top" width="42">10  </td> <td width="700"> </td> </tr> <tr> <td style="color: teal" valign="top" width="42">11  </td> <td width="700"><span style="color: #000000">    </span><span style="color: #000000">i_num</span><span style="color: #000000"> </span><span style="color: #000000">=</span><span style="color: #000000"> </span><span style="color: #000000">htonl(i_num);</span></td> </tr> <tr> <td style="color: teal" valign="top" width="42">12  </td> <td width="700"><span style="color: #000000">    </span><span style="color: #0000ff">printf</span><span style="color: #000000">(</span><span style="color: #800000">"</span><span style="color: #800000">[0]:0x%x\n</span><span style="color: #800000">"</span><span style="color: #000000">,</span><span style="color: #000000"> </span><span style="color: #000000">*</span><span style="color: #000000">((</span><span style="color: #0000ff">char</span><span style="color: #000000"> </span><span style="color: #000000">*</span><span style="color: #000000">)</span><span style="color: #000000">&</span><span style="color: #000000">i_num</span><span style="color: #000000"> </span><span style="color: #000000">+</span><span style="color: #000000"> </span><span style="color: #0000ff">0</span><span style="color: #000000">));</span></td> </tr> <tr> <td style="color: teal" valign="top" width="42">13  </td> <td width="700"><span style="color: #000000">    </span><span style="color: #0000ff">printf</span><span style="color: #000000">(</span><span style="color: #800000">"</span><span style="color: #800000">[1]:0x%x\n</span><span style="color: #800000">"</span><span style="color: #000000">,</span><span style="color: #000000"> </span><span style="color: #000000">*</span><span style="color: #000000">((</span><span style="color: #0000ff">char</span><span style="color: #000000"> </span><span style="color: #000000">*</span><span style="color: #000000">)</span><span style="color: #000000">&</span><span style="color: #000000">i_num</span><span style="color: #000000"> </span><span style="color: #000000">+</span><span style="color: #000000"> </span><span style="color: #0000ff">1</span><span style="color: #000000">));</span></td> </tr> <tr> <td style="color: teal" valign="top" width="42">14  </td> <td width="700"><span style="color: #000000">    </span><span style="color: #0000ff">printf</span><span style="color: #000000">(</span><span style="color: #800000">"</span><span style="color: #800000">[2]:0x%x\n</span><span style="color: #800000">"</span><span style="color: #000000">,</span><span style="color: #000000"> </span><span style="color: #000000">*</span><span style="color: #000000">((</span><span style="color: #0000ff">char</span><span style="color: #000000"> </span><span style="color: #000000">*</span><span style="color: #000000">)</span><span style="color: #000000">&</span><span style="color: #000000">i_num</span><span style="color: #000000"> </span><span style="color: #000000">+</span><span style="color: #000000"> </span><span style="color: #0000ff">2</span><span style="color: #000000">));</span></td> </tr> <tr> <td style="color: teal" valign="top" width="42">15  </td> <td width="700"><span style="color: #000000">    </span><span style="color: #0000ff">printf</span><span style="color: #000000">(</span><span style="color: #800000">"</span><span style="color: #800000">[3]:0x%x\n</span><span style="color: #800000">"</span><span style="color: #000000">,</span><span style="color: #000000"> </span><span style="color: #000000">*</span><span style="color: #000000">((</span><span style="color: #0000ff">char</span><span style="color: #000000"> </span><span style="color: #000000">*</span><span style="color: #000000">)</span><span style="color: #000000">&</span><span style="color: #000000">i_num</span><span style="color: #000000"> </span><span style="color: #000000">+</span><span style="color: #000000"> </span><span style="color: #0000ff">3</span><span style="color: #000000">));</span></td> </tr> <tr> <td style="color: teal" valign="top" width="42">16  </td> <td width="700"> </td> </tr> <tr> <td style="color: teal" valign="top" width="42">17  </td> <td width="700"><span style="color: #000000">    </span><span style="color: #0000ff">return</span><span style="color: #000000"> </span><span style="color: #0000ff">0</span><span style="color: #000000">;</span></td> </tr> <tr> <td style="color: teal" valign="top" width="42">18  </td> <td width="700"><span style="color: #800000">}</span><span style="color: #000000"> </span></td> </tr> </tbody> </table> </div> <p><br /> ?0X86CPUq_上,执行该程序得到如下结果: <br /> [0]:0x78 <br /> [1]:0x56 <br /> [2]:0x34 <br /> [3]:0x12 </p> <p>[0]:0x12 <br /> [1]:0x34 <br /> [2]:0x56 <br /> [3]:0x78 </p> <p>分析l果Q在80X86q_上,pȝ多字节中的低位存储在变量v始地址Q用小端法。htonli_num转换成网l字节序Q可见网l字节序是大端法?/p> <p><font color="#ff0000"><strong>ȝ点:80X86使用端法,|络字节序用大端法?/strong></font></p> <img src ="http://www.tkk7.com/tinysun/aggbug/307952.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/tinysun/" target="_blank">何克?/a> 2009-12-31 21:33 <a href="http://www.tkk7.com/tinysun/archive/2009/12/31/307952.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>如何~写单元试用例Q白盒测试)http://www.tkk7.com/tinysun/archive/2009/12/05/304842.html何克?/dc:creator>何克?/author>Sat, 05 Dec 2009 04:50:00 GMThttp://www.tkk7.com/tinysun/archive/2009/12/05/304842.htmlhttp://www.tkk7.com/tinysun/comments/304842.htmlhttp://www.tkk7.com/tinysun/archive/2009/12/05/304842.html#Feedback0http://www.tkk7.com/tinysun/comments/commentRss/304842.htmlhttp://www.tkk7.com/tinysun/services/trackbacks/304842.html

一?单元试的概?
        单元通俗的说是指一个实现简单功能的函数。单元测试就是只用一l特定的输入(试用例)试函数是否功能正常Qƈ且返回了正确的输出?
        试的覆盖种c?
        1.语句覆盖Q语句覆盖就是设计若q个试用例Q运行被试E序Q得每一条可执行语句臛_执行一ơ?
        2.判定覆盖Q也叫分支覆盖)Q设计若q个试用例Q运行所程序,使程序中每个判断的取真分支和取假分支臛_执行一ơ?
        3.条g覆盖Q设计够的试用例Q运行所程序,使程序中每个判断的每个条件的每个可能取D执行一ơ?
        4.判定——条件覆盖:设计_的测试用例,q行所程序,使程序中每个判断的每个条件的每个可能取D执行一ơ,q且每个可能的判断结果也臛_执行一ơ?
        5.条gl合试Q设计够的试用例Q运行所程序,使程序中每个判断的所有条件取值组合至执行一ơ?
        6.路径试Q设计够的试用例Q运行所程序,要覆盖程序中所有可能的路径?
        用例的设计方案主要的有下面几U:条g试Q基本\径测试,循环试。通过上面的方法可以实现测试用例对E序的逻辑覆盖Q和路径覆盖?
二、开始测试前的准?
        在开始测试时Q要先声明一下,无论你设计多测试用例,无论你的试Ҏ多么完美Q都不可能完?00%的发现所有BUGQ我们所需要做的是用最的资源Q做最多测试检查,L一个^衡点保证E序的正性。穷举测试是不可能的?nbsp;  所以现在进行单元测试我选用的是现在一般用的比较多的基本\径测试法?
三、开始测?
       基本路径试法:设计出的试用例要保证每一个基本独立\径至要执行一ơ?
        函数说明 Q当i_flag=0Q返?nbsp;    i_count+100
                                当i_flag=1Q返?nbsp;  i_count  *10
                                否则  q回   i_count  *20
        输入参数Qint i_count Q?nbsp; 
                            int i_flag
        输出参数Q?int  i_return; 
        代码Q?/font>

1 int Test(int i_count, int i_flag)
2         {
3 int i_temp = 0;
4 while (i_count>0)
5             {
6 if (0 == i_flag)
7                 {
8                     i_temp = i_count + 100;
9 break;
10                 }
11 else
12                 {
13 if (1 == i_flag)
14                     {
15                         i_temp = i_temp + 10;
16                     }
17 else
18                     {
19                         i_temp = i_temp + 20;
20                     }
21                 }
22                 i_count--;
23             }
24 return i_temp;
25         }

        1.dE序控制程?
    图例Q?
 
事例E序程图:
 
            圈中的数字代表的是语句的行号Q也许有人问Z么?,6,13,8......作ؓl点Q第2行,W?行ؓ什么不是结点,因ؓ选择l点是有规律的。让我们看程序中Q第2行,W?行是按顺序执行下来的。直到第4行才出现了@环操作。?Q?行没有什么判断,选择{分支操作,所以我们把2Q?Q?全部合ƈ成一个结炏V其他的也是照这个规则合qӞ然后有了上面的程图?/font>

            2.计算圈复杂度
            有了图以后我们要知道到底我们有写多少个测试用例,才能满基本路径试?
            q里有有了一个新概念——圈复杂?
            圈复杂度是一UؓE序逻辑复杂性提供定量测试的软g度量。将该度量用于计程序的基本独立路径数目。ؓ保所有语句至执行一ơ的试数量的上界?
            公式圈复杂度VQGQ?E-N+2QE是流图中边的数量QN是流图中l点的数量?
            公式圈复杂度VQGQ?P+1 QP是流图G中判定结点的数量?
            通俗的说圈负责度是判断单元是不是复杂,是不是好试的标准。一般来说如果圈复杂度如果大?0pC个单元的可测试性不好,太复杂(也许有h觉得无所谓,但是如果你们公司实行了CMMI5的话Q对q个是有规定的)?
            从图中我们可以看刎ͼ
            VQGQ?10条边-8l点+2=4
            VQGQ?3个判定结?1=4
            上图的圈复杂图是4。这个结果对我们来说有什么意义呢Q它表示我们只要最?个测试用例就可以辑ֈ基本路径覆盖?
            3.导出E序基本路径?
            现在我们知道了v码要?个测试用例,但是怎么设计q?个测试用例?
            导出E序基本路径Q根据程序基本\径设计测试用例子?
             E序基本路径Q基本独立\径就是从E序的开始结点到l束可以选择M的\径遍历,但是每条路径臛_应该包含一条已定义路径不曾用到的边。(看v来不好理解,让我们看例子Q?
             让我们看上面的流E图Q从l点4?4有几条\径呢Q?
             1 BQ?Q?4Q?
             2 CQEQJQ?Q?Q?Q?4Q?
             3 CQDQFQHQAQBQ?Q?Q?3Q?5Q?2Q?Q?4Q?
             4 CQDQGQIQAQBQ?Q?Q?3Q?9Q?2Q?Q?4Q?
             q有吗?Q?
             5 CQDQCQIQAQCQEQJQ?Q?Q?3Q?9Q?2Q?Q?Q?Q?4Q算吗?
            不算Qؓ什么?因ؓ上面?条\径已l包括了所有的辏V第5条\径已l不包含没有用过的边了。所有的路径都遍历过了?
            好了Q现在我们有?条基本独立\径根据独立\径我们可以设计测试用例?
            1 BQ?Q?4Q?
            输入数据Qi_flag=0Q或者是i_flag<0的某一个倹{?
            预期l果Qi_temp=0.
             2 CQEQJQ?Q?Q?Q?4Q?
            输入数据Q?i_count =1;i_flag=0 
            预期l果Qi_temp=101.
             3 CQDQFQHQAQBQ?Q?Q?3Q?5Q?2Q?Q?4Q?
            输入数据Q?i_count =1;i_flag=1 
            预期l果Qi_temp=10.
             4 CQDQGQIQAQBQ?Q?Q?3Q?9Q?2Q?Q?4Q?
             输入数据Q?i_count =1;i_flag=2     
             预期l果Qi_temp=20.
q里的输入数据是p\径和E序推论出来的。而要注意的是预期l果是从函数说明中导出,不能ҎE序l构中导出?
Z么这么说Q?
            让我们看E序中的W?行?
            int i_temp=0;假如开发h员一不小心写错了Q变成了int i_temp=1;ҎE序导出的预期结果就会是一个错误的|但是单元试不出来问题?
            那单元测试就失去了意义?
            有h也许会问q么单的函数有4个测试用例,如果q复杂一些的怎么办?上面的测试用例还可以化吗Q答案是可以?
            我们来看 路径    1 BQ?Q?4Q和   4 CQDQGQIQAQBQ?Q?Q?3Q?9Q?2Q?Q?4Q,路径1是\?的真子集Q?nbsp;    所?是可以不必要的。上囄圈复杂度?。这个结果对我们来说有什么意义呢Q它表示我们只要最?个测试用例就可以辑ֈ基本路径覆盖。所以说圈复杂度标示是最多的试用例个数Q不是一定要4个测试用例才可以。不q有一点要x的是试用例简化代表你的测试越,q样E序的安全性就低了?
四、完成测?
            接下来根据测试用例用工h试NUNITQVS2005都可以?
            接下来根据测试结果编写测试报告,试人,旉Q结果,用例Q是否通过Q格式网上一大把Q每个公司的格式也不一样就不说了。(来自cnblogsQ?/font>

 

本文来自CSDN博客Q{载请标明出处Qhttp://blog.csdn.net/Joe_wang/archive/2009/11/23/4857371.aspx



]]>
ORM技术概念与实例http://www.tkk7.com/tinysun/archive/2009/04/23/267150.html何克?/dc:creator>何克?/author>Thu, 23 Apr 2009 07:02:00 GMThttp://www.tkk7.com/tinysun/archive/2009/04/23/267150.htmlhttp://www.tkk7.com/tinysun/comments/267150.htmlhttp://www.tkk7.com/tinysun/archive/2009/04/23/267150.html#Feedback0http://www.tkk7.com/tinysun/comments/commentRss/267150.htmlhttp://www.tkk7.com/tinysun/services/trackbacks/267150.htmlObject Relational MappingORMORM本质上就是将数据从一UŞ式{换到另外一UŞ式?q也同时暗示者额外的执行开销Q然而,如果ORM作ؓ一U中间g实现Q则会有很多Z做优化,而这些在手写的持久层q不存在?.

对象关系映射Q?/span>Q简U?/span>Q,是随着面向对象的Y件开发方法发展而生的面向对象的开发方法是当今企业U应用开发环境中的主开发方法,关系数据库是企业U应用环境中怹存放数据的主数据存储系l?/span>面向对象是从软g工程基本原则(如耦合、聚合、封?的基上发展v来的Q而关pL据库则是从数学理论发展而来的,两套理论存在显著的区别。ؓ了解册个不匚w的现?对象关系映射技术应q而生?/span>

让我们从O/R开始。字母Oh?对象"(Object),而R则来自于"关系"(Relational)。几乎所有的E序里面Q都存在对象和关pL据库。在业务逻辑层和用户界面层中Q我们是面向对象的。当对象信息发生变化的时候,我们需要把对象的信息保存在关系数据库中?/span>

当你开发一个应用程序的时?不用O/R Mapping),你可能会写不数据访问层的代码,用来从数据库保存Q删除,d对象信息Q等{。你在DAL中写了很多的Ҏ来读取对象数据,改变状态对象等{Q务。而这些代码写hL重复的?/span>

u          CRUDAPIu          APIu          mapping metadatau          ORMdirty checking, lazy association fetchingORM,,,.

:

http://www.jeez.com.cn/jbf



何克?/a> 2009-04-23 15:02 发表评论
]]>
使用OpenVPN实现|通、电信机戉K快速、安全通信http://www.tkk7.com/tinysun/archive/2009/04/23/267118.html何克?/dc:creator>何克?/author>Thu, 23 Apr 2009 04:38:00 GMThttp://www.tkk7.com/tinysun/archive/2009/04/23/267118.htmlhttp://www.tkk7.com/tinysun/comments/267118.htmlhttp://www.tkk7.com/tinysun/archive/2009/04/23/267118.html#Feedback0http://www.tkk7.com/tinysun/comments/commentRss/267118.htmlhttp://www.tkk7.com/tinysun/services/trackbacks/267118.html

上半qؓ公司的南北互通工E研I实现的方式Q最后决定用openvpn来实现多个机房直接的互通。当时写了一?很详l的文档Q现在终于有旉发出来了。这份文档是完全Ҏopenvpn官方|站上的文档以及我的实际配置写成?br />
目录Q?br /> 1 现状
2 |络l构
3 服务器信息以及网l安?br /> 3.1 服务器信?br /> 3.2 |络安全
4 使用openvpn实现南北互?br /> 4.1 Openvpn?br /> 4.2 下蝲
4.3 安装
4.4 你的操作pȝ支持tun吗?
4.5 配置C/Sl构的VPN|络
4.5.1 如何生成ca和cert/key?
4.5.1.1 产生MASTER Certificate Authority(CA) 的公?certificate)和私?key)
4.5.1.2 创徏server端的cert和key文g
4.5.1.3 创徏3个client端cert和key文g
4.5.1.4 建立 Diffie Hellman文g
4.5.1.5 所有文件的列表及用的L
4.5.2 OpenVPN Server端的配置
4.5.3 OpenVPN Client端的配置
4.5.4 q行OpenVPN
5 其它配置
5.1 让多个client的子|间互?br /> 5.2 控制q行中的openvpnq程
5.3 windows下的配置Q?br /> 6 实际应用情况
7 参考文?

1 现状
假设现在的某公司的服务器存放在广州、河北、杭州三个机房中Q每个机房用不用的子网Q?br />
机房 子网Q内部)
q州 10.1.0.0/16
沛_ 10.2.0.0/16
杭州 10.3.0.0/16

各机房用不同的|段Qؓ使用vpnq接创造了有利条g?/span>

׃电信至网通间的网l速度是否~慢Q对q州与河北机戉K的数据同步带来非常大的困难。我们找C台即q接了网通的U\Q又q接了电信线路的服务器,但却不能直接用其作ؓ路由。如果用porxy的方式或转发的方式又会降低同步的效率?br /> 采用C/Sl构的vpn方式Q即解决了同步的问题Q又不会影响同步的效率?/p>

2 |络l构
下图是三个机房实Cq互通后的拓扑图Q?br />

从上囑֏以看刎ͼ该VPNpȝ是一个C/S的结构。中间ؓVPN SERVERQ广州、河北、杭州三个机房各取出一台服务器作ؓVPN CLIENT?/p>

VPN SERVER拥有两块|卡和两条线路(电信和网通)Q两个网卡均需要设|公|IP。根据实际的情况讄路由Q这里我是设|电信的U\为默认\由,讄到河北机房网D늚走网通的路由?/p>

VPN CLIENT可以有两块网卡也可以只用一块网卡,如果是电信的U\则连接vpn server的电信的IPQ如果是|通的U\则连接网通的vpn server 的网通方面的IP?/p>

3 服务器信息以及网l安?/strong>
3.1 服务器信?br /> 在本文中我们使用?台服务器分别作ؓvpn server和client。由于用vpn传输数据Ҏ务器的负载不大,所以除了vpn server需要一台新的服务器外,各机房的client服务器只需要找一台负载轻的服务器来担当即可?/p>

本文使用的四台服务器的详l信息:
机房 Vpn 模式 操作pȝ 服务器IP
Vpn server RedHat 9.0 公网IP1 (|? /公网IP2(电信)
q州机房 Vpn client FreeBSD4.9 10.1.0.1
沛_机房 Vpn client RedHat9.0 10.2.0.1
杭州机房 Vpn client FreeBsd4.9 10.3.0.1


3.2 |络安全
除vpn server外,其它的机房中的vpn client均无需公网IPQ所以vpn server需要加强安全方面的讄?br /> 该服务器是RedHat9.0的操作系l,登陆界面使用的是grubQƈ讄的grub密码Q保证物理上的安全?br /> 使用Iptables讄包过滤防火墙Q只允许你的服务器对其进行访问:
iptables –F
iptables -A INPUT -s 10.0.0.0/8 -j ACCEPT
iptables -A INPUT -s YOURNETWORK -j ACCEPT
iptables -A INPUT -p udp --dport 1194 –j DROP


4 使用openvpn实现南北互?/strong>
4.1 Openvpn?br /> OpenVPN 是一个强大、高度可配置、基于ssl?VPN QVirtual Private NetworkQOpen Source 软g。它h多种的验证方式以及许多强大的功能?/span>

OpenVPN工作在OSI模型的第2或第3层,使用SSL/TLS协议q行|络传输。支持多U客戯证方法,如证书、smart cardsQ加上用户名密码的证书认证等。除此以外,q有强大的ACL功能限制客户的信息交换?/p>

OpenVPN可以q行在多U操作系l中Q包括:
Linux, Windows 2000/XP and higher, OpenBSD, FreeBSD, NetBSD, Mac OS X, and Solaris.

使用OpenVpnQ可以实?
?使用特定udp或tcp端口实现两台L的之间的vpnq接?br /> ?实现C/Sl构Q实现多台client通过server服务器互q互通?br /> ?通过TLS/SSL加密保证数据传输的安全?br /> ?通过数据的压~,提高数据传输的速度?/p>

Q由于其它功能在本文中ƈ不需要用,如想要详l了解请讉Khttp://openvpn.netQ?/p>

4.2 下蝲

从以下网址下蝲最新版本的openvpn source包?br /> http://nchc.dl.sourceforge.net/sourceforge/openvpn/openvpn-2.0_rc16.tar.gz

׃openvpn需要用数据压~,所以还需要安装lzo包:
http://www.oberhumer.com/opensource/lzo/download/lzo-1.08.tar.gz

4.3 安装
LinuxQ?/p>

软g ~译安装
Lzo ./configure && Make && make install

Openvpn ./configure -prefix=/opt/openvpn&&Make && make install

FreeBSDQ?/span>

Lzo ./configure &&Make && make install

Openvpn ./configure -prefix=/opt/openvpn --with-lzoQheaders=/usr/local/include --with-lzo-headers=/usr/local/include&& Make && make install

参照上面的安装方法分别在linux和freebsdL上安装好openvpn?/span>

4.4 你的操作pȝ支持tun吗?
从我安装q的操作pȝ看,RedHat9.0和FreeBSD4.9的内栔R认已l支持TUNQƈ且已l安装tun模块。RedHat AS3则没有该模块Q需要重新编译内核支持?/p>

加蝲tun模块Q?br /> ●Linux 2.4 or higher (with integrated TUN/TAP driver):
(1) make device node: mknod /dev/net/tun c 10 200
(2a) add to /etc/modules.conf: alias char-major-10-200 tun
(2b) load driver: modprobe tun
(3) enable routing: echo 1 >; /proc/sys/net/ipv4/ip_forward

●FreeBSD 4.1.1+:
kldload if_tap

4.5 配置C/Sl构的VPN|络
4.5.1 如何生成ca和cert/key?

Ca certificate
authorityQ认证授权)Q所有的server和client均用同一个ca文g?br /> cert certificateQ证书)。公钥,每一个server和client各自独立生成的公钥?br /> key U钥Q每一个server和client工作独立生成的私钥?/span>


?server端只需要知道它自己的cert和key。它不需要知道每一个可以连接到它的client的cert?br /> ?server端接受的client必须拥有以server的CA产生的cert。server能用它自己的CAU钥来确认client的cert中是否带有其CA的记受?/span>

4.5.1.1 产生MASTER Certificate Authority(CA) 的公?certificate)和私?key)
#######
In this section we will generate a master CA certificate/key, a server certificate/key, and certificates/keys for 3 separate clients
#######

在本节,我们会尝试徏立一对master CA的cert和keyQ一对server端的cert和keyQ和3个不同client的年的cert和keys?/p>

UNIXQ?br /> 在openvpn的源码中可以扑ֈeasy-rsa文g夏V?/p>

cd easy-rsa
. ./vars 建立环境变量
./clean-all 清除以前?br /> ./build-ca 建立CA

最后一个命令会调用openssl来创建CA的公钥和U钥:

Country Name (2 letter code) [KG]:
State or Province Name (full name) [NA]:
Locality Name (eg, city) [BISHKEK]:
Organization Name (eg, company) [OpenVPN-TEST]:yourcorp 在此输入公司?br /> Organizational Unit Name (eg, section) []:
Common Name (eg, your name or your server's hostname) []:hbroute 在此输入L名或随便输一个名?br /> Email Address [me@myhost.mydomain]:

其它的按默认卛_?/font>

完成后会在keys目录中创建ca.crt ca.key index.txt serial四个文g?/span>

4.5.1.2 创徏server端的cert和key文g

cd easy-rsa
./build-key-server server


Country Name (2 letter code) [KG]:
State or Province Name (full name) [NA]:
Locality Name (eg, city) [BISHKEK]:
Organization Name (eg, company) [OpenVPN-TEST]:yourcorp 输入公司?br /> Organizational Unit Name (eg, section) []:
Common Name (eg, your name or your server's hostname) []:hbrouteserver 输入L名或随便一个名?br /> Email Address [me@myhost.mydomain]:

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:

Sign the certificate? [y/n]:y 输入y

1 out of 1 certificate requests certified, commit? [y/n]y 输入y
Write out database with 1 new entries
Data Base Updated
其它的按回R?/font>

4.5.1.3 创徏3个client端cert和key文g
与创建server端的非常怼.

./build-key gz
./build-key hb
./build-key hz


注意gz、hb和hz不能一P否则两个相同名字的client只能有一个能q接q来?br /> 如果想用带密码的client keyQ可以用build-key-pass脚本?/span>

如徏立广州的Q?/p>

./build-key gz
Country Name (2 letter code) [KG]:
State or Province Name (full name) [NA]:
Locality Name (eg, city) [BISHKEK]:
Organization Name (eg, company) [OpenVPN-TEST]:mycorp
Organizational Unit Name (eg, section) []:
Common Name (eg, your name or your server's hostname) []:gz 键入"gz"
Email Address [me@myhost.mydomain]:

Certificate is to be certified until Mar 14 08:15:16 2015 GMT (3650 days)
Sign the certificate? [y/n]:y 键入“y”

1 out of 1 certificate requests certified, commit? [y/n]y 键入“y”
Write out database with 1 new entries
Data Base Updated

4.5.1.4 建立 Diffie Hellman文g
Diffie Hellman参数必须要在openvpn server中用?/span>

./build-dh

4.5.1.5 所有文件的列表及用的L

Filename Needed By Purpose Secret
ca.crt server + all clients Root CA certificate NO
ca.key key signing machine only Root CA key YES
Dh{n}.pem server only Diffie Hellman parameters NO
server.crt server only Server Certificate NO
server.key server only Server Key YES
gz.crt q州 only gz Certificate NO
Gz.key q州 only gz Key YES
hcrt 沛_ only hb Certificate NO
hb.key 沛_ only hb Key YES
hz.crt 杭州 only hz Certificate NO
hz.key 杭州 only hz Key YES


Ҏ上表Q将所有的文g拯到需要这些文件的L上?/span>

4.5.2 OpenVPN Server端的配置
刚安装完openvpn的时候,/opt/openvpn目录下只有sbin和man两个文g夹,为方便v见,我们可以在该目录下徏立其它的文g夏V?/p>

目录?作用
Sbin 攄openvpn的主E序“openvpn”
Conf 攄配置文g
Ccd 攄各client的独立配|文?br /> Log 攄server的日志文?br /> Keys 攄认证文g
Man 攄man文档


配置文gQ?/conf/server.conf

port 1194
proto udp
dev tun
ca /opt/openvpn/keys/ca.crt
cert /opt/openvpn/keys/server.crt
key /opt/openvpn/keys/server.key
dh /opt/openvpn/keys/dh1024.pem
server 10.99.0.0 255.255.255.0
ifconfig-pool-persist /opt/openvpn/log/ipp.txt
client-config-dir ccd
route 10.1.0.0 255.255.0.0
route 10.2.0.0 255.255.0.0
route 10.3.0 255.255.0.0
push "route 10.10.0 255.255.0.0"
push "route 10.2.0.0 255.255.0.0"
push "route 10.3.0.0 255.255.0.0"
client-to-client
keepalive 10 120
comp-lzo
user nobody
group nobody
persist-key
persist-tun
status /opt/openvpn/log/openvpn-status.log
log /opt/openvpn/log/openvpn.log
verb 6
mute 20
writepid /opt/openvpn/log/server.pid


Client的自定义配置Q?/ccd/

gz:
iroute 10.1.0.0 255.255.0.0

hz:
iroute 10.3.0.0 255.255.0.0

hb:
iroute 10.2.0.0 255.255.0.0


配置文g解释Q?/span>

;local a,b,c,d listen的IP
port 1194 listen的端?br /> proto udp 使用UDP协议
dev tun 使用tunnel的模?/span>

ca ca.crt 公钥Qs端和c端用相同的caQ?br /> cert server.crt server的公?br /> key server.key server的私钥(要保好Q(s端和c端用各自的cert和keyQ?br /> dh dh1024.pem 产生ҎQopenssl dhparam -out dh1024.pem 1024

server 10.99.0.0 255.255.255.0 讄为server模式Qƈ指定子网的IPD,server端默认会设ؓ.1的地址?br /> ifconfig-pool-persist ipp.txt 当vpn断开或重启后Q可以利用该文g重新建立相同IP地址的连接?br /> push "route 10.1.0.0 255.255.0.0" 让client端徏立到另一个子|的路由?/font>

client-to-client 让不同的client之间可以互相“看到”?br /> ;max-clients 100 最多的client数量?/font>

keepalive 10 120 ?0Uping一ơ,如果120U没有回应则认ؓҎ已经down?/font>

user nobody
group nobody 指定q行openvpn的用户和l。(减少危险Q?/font>

persist-key
persist-tun

status openvpn-status.log 每分钟记录一ơ连接的状态?/font>

log openvpn.log log记录到指定文件中

verb 3 讄日志要记录的U别?br /> 0只记录错误信息?br /> 4能记录普通的信息?br /> 5?在连接出现问题时能帮助调?br /> 9是极端的Q所有信息都会显C,甚至q包头等信息都显C(像tcpdumpQ?/font>

mute 20 相同信息的数量,如果q箋出现20条相同的信息Q将不记录到日志中?/font>

4.5.3 OpenVPN Client端的配置

目录?作用
Sbin 攄openvpn的主E序“openvpn”
Conf 攄配置文g
Keys 攄认证文g
Man 攄man文档


配置文gQ?/conf/client.conf
q州Q?/span>
Client
dev tun
proto udp
remote VPNSERVERIP11194
resolv-retry infinite
nobind
user nobody
group nobody
persist-key
persist-tun
ca /opt/openvpn/keys/ca.crt
cert /opt/openvpn/keys/gz.crt
key /opt/openvpn/keys/gz.key
comp-lzo
verb 3
mute 20


杭州Q?/span>
client
dev tun
proto udp
remote VPNSERVERIP1 1194
resolv-retry infinite
nobind
user nobody
group nobody
persist-key
persist-tun
ca /opt/openvpn/keys/ca.crt
cert /opt/openvpn/keys/hz.crt
key /opt/openvpn/keys/hz.key
comp-lzo
verb 3
mute 20


沛_Q?/span>
client
dev tun
proto udp
remote VPNSERVERIP2 1194
resolv-retry infinite
nobind
user nobody
group nobody
persist-key
persist-tun
ca /opt/openvpn/keys/ca.crt
cert /opt/openvpn/keys/hb.crt
key /opt/openvpn/keys/hb.key
comp-lzo
verb 3
mute 20


4.5.4 q行OpenVPN
建立脚本Q?br /> Server端:

#!/bin/sh
OPENVPN=/opt/openvpn/sbin/openvpn
CFG=/opt/openvpn/conf/server.conf
PID=`cat /opt/openvpn/log/server.pid`
case "$1" in
start)
$OPENVPN --config $CFG &
;;
stop)
kill $PID
;;
restart)
kill $PID
sleep 5
$OPENVPN --config $CFG &
;;
*)
echo "Usage: `basename $0` {start|stop|restart}"
;;
esac


Client?
#!/bin/sh
/opt/openvpn/sbin/openvpn --config /opt/openvpn/conf/client.conf &

5 其它配置
5.1 让多个client的子|间互?br /> ●client-config-dir ccd
d一个ccd的文件夹Q里面的文g名ؓclient的名字(如gzQhbQ。当一个新clientq接到server上时Q程序会查ccd文g夹,?是否有一个文件的名字与client的名字一致。如果有Q进E会读该文g里面的指令ƈ这些指令应用于该名字的client?/span>

●在ccd文g夹中创徏一个文件hzQ该文g中包括:
iroute 10.3.0.0 255.255.0.0 q会告诉hz clientQ不要在本机d10.3.0.0|段Q因为杭州本来就?0.23/16|段Q?/p>

●在server的配|文件中加入Q?br /> route 10.3.0.0 255.255.0.0

如果想两个client可以互通,请在server的配|文件中加入Q?br /> client-to-client
push "route 10.3.0.0 255.255.0.0"

记得在各子网内的机器上设|\由(如果server和client机器不是作ؓ默认|关的话Q?/p>

5.2 控制q行中的openvpnq程
在配|文件中加入writepid参数指定pid文g?br /> SIGUSR1--以非root的n份重启openvpnq程?br /> SIGHUP--重启
SIGUSR2--输出q接l计到log文g
SIGTERM,SIGINT--exit?/p>

5.3 windows下的配置Q?br /> windows版本的openvpn下蝲地址Q?br /> http://nchc.dl.sourceforge.net/sourceforge/openvpn/openvpn-2.0_rc17-install.exe

安装Ҏ很简单,和其它windows下的软g无异?br /> 我安装到c:\program file\openvpn下?br /> 在config中徏立配|文件win.ovpn
Client
dev tun
proto udp
remote VPNSERVER1 1194
resolv-retry infinite
nobind
persist-key
persist-tun
ca ../keys/ca.crt
cert ../keys/win.crt
key ../keys/win.key
comp-lzo
verb 3
mute 20


从server中生成ca.crt ,win.crt,win.key文gq拷贝到windows上。生成文件的Ҏ请参考章?.5.1.3?br /> 在命令行q行Q?br /> openvpn --config win.ovpn

如果要将openvpn做成服务Q运行:
openvpnsev.exe -install
q样可以在服务中找到openvpn服务了?br /> 当openvpn作ؓ服务Ӟ会到config文g夹寻找ovpn后缀的配|文件。生成的日志会放在log文g夹中?/p>

6 实际应用情况

从实际应用的情况看,VPN采用的加密的方式q没有媄响到数据传输的速度Q从量图中可以看出Q流量最大可以达?4Mbits/sQ电信的U\只有10Mbits/sQ?/p>

7 参考文?/strong>
OpenVPN Howto(2.0) http://openvpn.net/howto.html
OpenVPN Install http://openvpn.net/install.html
OpenVPN Install(Win32) http://openvpn.net/INSTALL-win32.html
OpenVPN Man Pages http://openvpn.net/man.html
OpenVPN FAQ http://openvpn.net/faq.html




]]>
整数除法(?http://www.tkk7.com/tinysun/archive/2009/04/12/265134.html何克?/dc:creator>何克?/author>Sun, 12 Apr 2009 08:30:00 GMThttp://www.tkk7.com/tinysun/archive/2009/04/12/265134.htmlhttp://www.tkk7.com/tinysun/comments/265134.htmlhttp://www.tkk7.com/tinysun/archive/2009/04/12/265134.html#Feedback0http://www.tkk7.com/tinysun/comments/commentRss/265134.htmlhttp://www.tkk7.com/tinysun/services/trackbacks/265134.html《高效程序的奥秘?/a>(Henry S.Warren,Jr.?W??#8220;整数除法”中说Q?br />     除法q算是一个复杂的q程Q含有除法的法通常都不很精巧。甚臌如何定义整数除法都是一个值得研究的问题。大多数高语言和大多数计算指o集将其定义ؓ有理数结果的向零截取。这一定义以及其他两种可能的定义叙q如下:
    --------- ---截取-- ---?-- --地板--
     7 /  3 =  2 ?nbsp;  2 ?1   2 ?nbsp; 1
    -7 /  3 = -2 ?-1  -3 ?2  -3 ?nbsp; 2
     7 / -3 = -2 ?nbsp; -2 ?1  -3 ?-2
    -7 / -3 =  2 ?-1   3 ?2   2 ?-1
    --------- --------- -------- --------

    对于所有三U可能的定义Q关p?#8220;被除敎ͼ?#215;除数Q余?#8221;都成立。在定义“?#8221;(modulus)除法Ӟ要求余数是非负数。在定义“地板”(floor)除法Ӟ要求商是有理数除法的l果?#8220;地板”。对于除数是正的情况Q模除法和地杉K法等仗很用的W四U可能定义是向最接近的整数舍入?br />     所以,“装配脑袋”所说的“数学上规?#8221;实际上是?#8220;地板”除法。而现有的高语言(如C、C++、C#、Java、Fortran、Ada、Pascal{?大多数都使用“截取”除法QIBM的PL.8语言使用“?#8221;除法QKnuth的MMIX计算机的除指令?#8220;地板”除法?
    [C#语言规范 7.7.2]中说Q?整数)除法结果舍入到Ӟq且l果的绝对值是于两个操作数的商的l对值的最大可能整数。当两个操作数符L同时Q结果ؓ零或正;当两个操作数W号相反Ӟl果为零或负?/div>

]]>一个不错的轻量UUML建模工具http://www.tkk7.com/tinysun/archive/2009/03/03/257647.html何克?/dc:creator>何克?/author>Tue, 03 Mar 2009 12:08:00 GMThttp://www.tkk7.com/tinysun/archive/2009/03/03/257647.htmlhttp://www.tkk7.com/tinysun/comments/257647.htmlhttp://www.tkk7.com/tinysun/archive/2009/03/03/257647.html#Feedback0http://www.tkk7.com/tinysun/comments/commentRss/257647.htmlhttp://www.tkk7.com/tinysun/services/trackbacks/257647.html用Violet UML ȝcdQ?br />
效果q不错,单易用?/p>

]]>
վ֩ģ壺 ҹƬ߹ۿ| AVƬ߹ۿ| av߹ۿַ| tvۺɫ| ùƷӰ˾þ| ˬˬˬƵ| þҹӰԺѹۿ| aëƬվ| ŷպɫ| ޾ƷӰԺþþþþ| ŷ޹Ʒ㽶| ݺۺϾþۺ88| av㽶ˬˬˬˬ| һaƵ| ѻɫëƬƵ| 18վڵ | þ޹Ʒ| ѹŮˬˮƵ| ŷͬgvվۿ| 114һëƬ| +ɫ++| 100018վ| ѹվ߹ۿ| һëƬ޶| ѹۿþþƵ| 9ᆱƷƵ| þaѹۿ| 19žžڵվ| ëƬȫ| þݺҹҹѹۿ| AVƬ߲Ψ| һƵ| һƵ߹ۿİ | ձɫѹۿ| þþѸӰԺ| ߹ۿվ| av˾Ʒ߲ | ߳ëƬڵƵ| Ʒۺվ| һŮëƬ| aëƬëƬѹۿ|