<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom"><title type="text">博客园_苦海无边</title><subtitle type="text">For anything about program</subtitle><id>http://feed.cnblogs.com/blog/u/15539/rss</id><updated>2010-05-14T12:00:58Z</updated><author><name>hyde</name><uri>http://www.cnblogs.com/hyde82/</uri></author><generator>CNBlogs BlogServer</generator><link rel="alternate" type="text/html" href="http://www.cnblogs.com/hyde82/"/><link rel="self" type="application/atom+xml" href="http://feed.cnblogs.com/blog/u/15539/rss"/><entry><id>http://www.cnblogs.com/hyde82/archive/2010/05/14/1735742.html</id><title type="text">(转)C++中extern “C”含义深层探索</title><summary type="text">1.引言 　　C++语言的创建初衷是&amp;#8220;a better C&amp;#8221;，但是这并不意味着C++中类似C语言的全局变量和函数所采用的编译和连接方式与C语言完全相同。作为一种欲与C兼容的语言，C++保留了一部分过程式语言的特点（被世人称为&amp;#8220;不彻底地面向对象&amp;#8221;），因而它可以定义不属于任何类的全局变量和函数。但是，C++毕竟是一种面向对象的程序设计语言，为了支持函数的...</summary><published>2010-05-14T12:01:00Z</published><updated>2010-05-14T12:01:00Z</updated><author><name>hyde</name><uri>http://www.cnblogs.com/hyde82/</uri></author><link rel="alternate" href="http://www.cnblogs.com/hyde82/archive/2010/05/14/1735742.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/hyde82/archive/2010/05/14/1735742.html"/><content type="html">1.引言 &#xD;
&lt;p&gt;C++语言的创建初衷是&amp;#8220;a better C&amp;#8221;，但是这并不意味着C++中类似C语言的全局变量和函数所采用的编译和连接方式与C语言完全相同。作为一种欲与C兼容的语言，C++保留了一部分过程式语言的特点（被世人称为&amp;#8220;不彻底地面向对象&amp;#8221;），因而它可以定义不属于任何类的全局变量和函数。但是，C++毕竟是一种面向对象的程序设计语言，为了支持函数的重载，C++对全局函数的处理方式与C有明显的不同。&lt;br /&gt;　　2.从标准头文件说起&lt;/p&gt;&#xD;
&lt;p&gt;某企业曾经给出如下的一道面试题：&lt;/p&gt;&#xD;
&lt;p&gt;面试题&lt;br /&gt;　　为什么标准头文件都有类似以下的结构？ &lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;br /&gt;#ifndef __INCvxWorksh&lt;br /&gt;#define __INCvxWorksh &lt;br /&gt;#ifdef __cplusplus&lt;br /&gt;extern "C" {&lt;br /&gt;#endif &lt;br /&gt;/*...*/ &lt;br /&gt;#ifdef __cplusplus&lt;br /&gt;}&lt;br /&gt;#endif &lt;br /&gt;#endif /* __INCvxWorksh */&lt;/p&gt;&#xD;
&lt;p&gt;&lt;br /&gt;　　分析&lt;br /&gt;　　显然，头文件中的编译宏&amp;#8220;#ifndef __INCvxWorksh、#define __INCvxWorksh、#endif&amp;#8221; 的作用是防止该头文件被重复引用。&lt;/p&gt;&#xD;
&lt;p&gt;那么&lt;/p&gt;&#xD;
&lt;p&gt;#ifdef __cplusplus&lt;br /&gt;extern "C" {&lt;br /&gt;#endif &lt;br /&gt;#ifdef __cplusplus&lt;br /&gt;}&lt;br /&gt;#endif &lt;/p&gt;&#xD;
&lt;p&gt;&lt;br /&gt;　　的作用又是什么呢？我们将在下文一一道来。&lt;br /&gt;&amp;nbsp;&lt;br /&gt;　　3.深层揭密extern "C"&lt;/p&gt;&#xD;
&lt;p&gt;extern "C" 包含双重含义，从字面上即可得到：首先，被它修饰的目标是&amp;#8220;extern&amp;#8221;的；其次，被它修饰的目标是&amp;#8220;C&amp;#8221;的。让我们来详细解读这两重含义。&lt;/p&gt;&#xD;
&lt;p&gt;被extern "C"限定的函数或变量是extern类型的；&lt;/p&gt;&#xD;
&lt;p&gt;extern是C/C++语言中表明函数和全局变量作用范围（可见性）的关键字，该关键字告诉编译器，其声明的函数和变量可以在本模块或其它模块中使用。记住，下列语句：&lt;/p&gt;&#xD;
&lt;p&gt;extern int a;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;br /&gt;　　仅仅是一个变量的声明，其并不是在定义变量a，并未为a分配内存空间。变量a在所有模块中作为一种全局变量只能被定义一次，否则会出现连接错误。&lt;/p&gt;&#xD;
&lt;p&gt;通常，在模块的头文件中对本模块提供给其它模块引用的函数和全局变量以关键字extern声明。例如，如果模块B欲引用该模块A中定义的全局变量和函数时只需包含模块A的头文件即可。这样，模块B中调用模块A中的函数时，在编译阶段，模块B虽然找不到该函数，但是并不会报错；它会在连接阶段中从模块A编译生成的目标代码中找到此函数。&lt;/p&gt;&#xD;
&lt;p&gt;与extern对应的关键字是static，被它修饰的全局变量和函数只能在本模块中使用。因此，一个函数或变量只可能被本模块使用时，其不可能被extern &amp;#8220;C&amp;#8221;修饰。&lt;/p&gt;&#xD;
&lt;p&gt;被extern "C"修饰的变量和函数是按照C语言方式编译和连接的；&lt;/p&gt;&#xD;
&lt;p&gt;未加extern &amp;#8220;C&amp;#8221;声明时的编译方式&lt;/p&gt;&#xD;
&lt;p&gt;首先看看C++中对类似C的函数是怎样编译的。&lt;/p&gt;&#xD;
&lt;p&gt;作为一种面向对象的语言，C++支持函数重载，而过程式语言C则不支持。函数被C++编译后在符号库中的名字与C语言的不同。例如，假设某个函数的原型为： &lt;/p&gt;&#xD;
&lt;p&gt;void foo( int x, int y );&lt;/p&gt;&#xD;
&lt;p&gt;&lt;br /&gt;　　该函数被C编译器编译后在符号库中的名字为_foo，而C++编译器则会产生像_foo_int_int之类的名字（不同的编译器可能生成的名字不同，但是都采用了相同的机制，生成的新名字称为&amp;#8220;mangled name&amp;#8221;）。&lt;/p&gt;&#xD;
&lt;p&gt;_foo_int_int这样的名字包含了函数名、函数参数数量及类型信息，C++就是靠这种机制来实现函数重载的。例如，在C++中，函数void foo( int x, int y )与void foo( int x, float y )编译生成的符号是不相同的，后者为_foo_int_float。&lt;br /&gt;　　同样地，C++中的变量除支持局部变量外，还支持类成员变量和全局变量。用户所编写程序的类成员变量可能与全局变量同名，我们以"."来区分。而本质上，编译器在进行编译时，与函数的处理相似，也为类中的变量取了一个独一无二的名字，这个名字与用户程序中同名的全局变量名字不同。&lt;/p&gt;&#xD;
&lt;p&gt;未加extern "C"声明时的连接方式&lt;/p&gt;&#xD;
&lt;p&gt;假设在C++中，模块A的头文件如下：&lt;/p&gt;&#xD;
&lt;p&gt;// 模块A头文件　moduleA.h&lt;br /&gt;#ifndef MODULE_A_H&lt;br /&gt;#define MODULE_A_H&lt;br /&gt;int foo( int x, int y );&lt;br /&gt;#endif&lt;/p&gt;&#xD;
&lt;p&gt;&lt;br /&gt;　　在模块B中引用该函数：&lt;/p&gt;&#xD;
&lt;p&gt;// 模块B实现文件　moduleB.cpp&lt;br /&gt;#include "moduleA.h"&lt;br /&gt;foo(2,3);&lt;/p&gt;&#xD;
&lt;p&gt;&lt;br /&gt;　　实际上，在连接阶段，连接器会从模块A生成的目标文件moduleA.obj中寻找_foo_int_int这样的符号！&lt;/p&gt;&#xD;
&lt;p&gt;加extern "C"声明后的编译和连接方式&lt;/p&gt;&#xD;
&lt;p&gt;加extern "C"声明后，模块A的头文件变为：&lt;/p&gt;&#xD;
&lt;p&gt;// 模块A头文件　moduleA.h&lt;br /&gt;#ifndef MODULE_A_H&lt;br /&gt;#define MODULE_A_H&lt;br /&gt;extern "C" int foo( int x, int y );&lt;br /&gt;#endif&lt;/p&gt;&#xD;
&lt;p&gt;&lt;br /&gt;　　在模块B的实现文件中仍然调用foo( 2,3 )，其结果是：&lt;/p&gt;&#xD;
&lt;p&gt;（1）模块A编译生成foo的目标代码时，没有对其名字进行特殊处理，采用了C语言的方式；&lt;/p&gt;&#xD;
&lt;p&gt;（2）连接器在为模块B的目标代码寻找foo(2,3)调用时，寻找的是未经修改的符号名_foo。&lt;/p&gt;&#xD;
&lt;p&gt;如果在模块A中函数声明了foo为extern "C"类型，而模块B中包含的是extern int foo( int x, int y ) ，则模块B找不到模块A中的函数；反之亦然。&lt;/p&gt;&#xD;
&lt;p&gt;所以，可以用一句话概括extern &amp;#8220;C&amp;#8221;这个声明的真实目的（任何语言中的任何语法特性的诞生都不是随意而为的，来源于真实世界的需求驱动。我们在思考问题时，不能只停留在这个语言是怎么做的，还要问一问它为什么要这么做，动机是什么，这样我们可以更深入地理解许多问题）：&lt;br /&gt;　　实现C++与C及其它语言的混合编程。&lt;br /&gt;　　明白了C++中extern "C"的设立动机，我们下面来具体分析extern "C"通常的使用技巧。&lt;br /&gt;　　4.extern "C"的惯用法&lt;/p&gt;&#xD;
&lt;p&gt;（1）在C++中引用C语言中的函数和变量，在包含C语言头文件（假设为cExample.h）时，需进行下列处理：&lt;/p&gt;&#xD;
&lt;p&gt;extern "C"&lt;br /&gt;{&lt;br /&gt;#include "cExample.h"&lt;br /&gt;}&lt;/p&gt;&#xD;
&lt;p&gt;&lt;br /&gt;　　而在C语言的头文件中，对其外部函数只能指定为extern类型，C语言中不支持extern "C"声明，在.c文件中包含了extern "C"时会出现编译语法错误。&lt;/p&gt;&#xD;
&lt;p&gt;笔者编写的C++引用C函数例子工程中包含的三个文件的源代码如下：&lt;/p&gt;&#xD;
&lt;p&gt;/* c语言头文件：cExample.h */&lt;br /&gt;#ifndef C_EXAMPLE_H&lt;br /&gt;#define C_EXAMPLE_H&lt;br /&gt;extern int add(int x,int y);&lt;br /&gt;#endif&lt;br /&gt;/* c语言实现文件：cExample.c */&lt;br /&gt;#include "cExample.h"&lt;br /&gt;int add( int x, int y )&lt;br /&gt;{&lt;br /&gt;return x + y;&lt;br /&gt;}&lt;br /&gt;// c++实现文件，调用add：cppFile.cpp&lt;br /&gt;extern "C" &lt;br /&gt;{&lt;br /&gt;#include "cExample.h"&lt;br /&gt;}&lt;br /&gt;int main(int argc, char* argv[])&lt;br /&gt;{&lt;br /&gt;add(2,3); &lt;br /&gt;return 0;&lt;br /&gt;}&lt;/p&gt;&#xD;
&lt;p&gt;&lt;br /&gt;　　如果C++调用一个C语言编写的.DLL时，当包括.DLL的头文件或声明接口函数时，应加extern "C" {　}。&lt;/p&gt;&#xD;
&lt;p&gt;（2）在C中引用C++语言中的函数和变量时，C++的头文件需添加extern "C"，但是在C语言中不能直接引用声明了extern "C"的该头文件，应该仅将C文件中将C++中定义的extern "C"函数声明为extern类型。&lt;br /&gt;　　笔者编写的C引用C++函数例子工程中包含的三个文件的源代码如下：&lt;/p&gt;&#xD;
&lt;p&gt;//C++头文件 cppExample.h&lt;br /&gt;#ifndef CPP_EXAMPLE_H&lt;br /&gt;#define CPP_EXAMPLE_H&lt;br /&gt;extern "C" int add( int x, int y );&lt;br /&gt;#endif&lt;br /&gt;//C++实现文件 cppExample.cpp&lt;br /&gt;#include "cppExample.h"&lt;br /&gt;int add( int x, int y )&lt;br /&gt;{&lt;br /&gt;return x + y;&lt;br /&gt;}&lt;br /&gt;/* C实现文件 cFile.c&lt;br /&gt;/* 这样会编译出错：#include "cExample.h" */&lt;br /&gt;extern int add( int x, int y );&lt;br /&gt;int main( int argc, char* argv[] )&lt;br /&gt;{&lt;br /&gt;add( 2, 3 ); &lt;br /&gt;return 0;&lt;br /&gt;}&lt;/p&gt;&#xD;
&lt;p&gt;&lt;br /&gt;　　如果深入理解了第3节中所阐述的extern "C"在编译和连接阶段发挥的作用，就能真正理解本节所阐述的从C++引用C函数和C引用C++函数的惯用法。对第4节给出的示例代码，需要特别留意各个细节。 &lt;br /&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/hyde82/aggbug/1735742.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/hyde82/archive/2010/05/14/1735742.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/hyde82/archive/2010/05/14/1735698.html</id><title type="text">Symbian中令人郁闷的错误【KESockDefaultMessageSlots|KErrServerBusy】</title><summary type="text">在s60下创建socket连接，当你创建某个链接时系统会抛出KErrServerBusy。这个时候的解决方案是：If you ﬁnd in testing that your code is getting KErrServerBusy errors then you can increase the number of message slots. 搞了半天，Symbian就是喜欢很隐晦的告诉你...</summary><published>2010-05-14T10:06:00Z</published><updated>2010-05-14T10:06:00Z</updated><author><name>hyde</name><uri>http://www.cnblogs.com/hyde82/</uri></author><link rel="alternate" href="http://www.cnblogs.com/hyde82/archive/2010/05/14/1735698.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/hyde82/archive/2010/05/14/1735698.html"/><content type="html">&lt;p&gt;在s60下创建socket连接，当你创建某个链接时系统会抛出KErrServerBusy。&lt;/p&gt;&#xD;
&lt;p&gt;这个时候的解决方案是：If you ﬁnd in testing that your code is getting KErrServerBusy errors then you can increase the number of message slots. &lt;/p&gt;&#xD;
&lt;p&gt;搞了半天，Symbian就是喜欢很隐晦的告诉你出错了。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font face="Courier New"&gt;RSocketServ::Connect(slots) ===》&amp;nbsp;increase the number of message slots&lt;/font&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/hyde82/aggbug/1735698.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/hyde82/archive/2010/05/14/1735698.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/hyde82/archive/2010/04/04/1704015.html</id><title type="text">集群Clustering方案</title><summary type="text">这几天一直在研究OP的集群方案，虽说有提供现成的方案，但配置起来一点也不简单。整了几天，终于有所突破。集群现在有几种不错的组件可以用，有Oracle Coherence，Terracotta等。我只都是闻其名，未见其码。基本都是采用IOC，功能强大，值得去深入研究。等研究有成果了，再发上来供大家踩踩</summary><published>2010-04-03T18:02:00Z</published><updated>2010-04-03T18:02:00Z</updated><author><name>hyde</name><uri>http://www.cnblogs.com/hyde82/</uri></author><link rel="alternate" href="http://www.cnblogs.com/hyde82/archive/2010/04/04/1704015.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/hyde82/archive/2010/04/04/1704015.html"/><content type="html">&lt;p&gt;这几天一直在研究OP的集群方案，虽说有提供现成的方案，但配置起来一点也不简单。&lt;/p&gt;&#xD;
&lt;p&gt;整了几天，终于有所突破。&lt;/p&gt;&#xD;
&lt;p&gt;集群现在有几种不错的组件可以用，有Oracle Coherence，Terracotta等。我只都是闻其名，未见其码。&lt;/p&gt;&#xD;
&lt;p&gt;基本都是采用IOC，功能强大，值得去深入研究。&lt;/p&gt;&#xD;
&lt;p&gt;等研究有成果了，再发上来供大家踩踩&lt;/p&gt;&lt;img src="http://www.cnblogs.com/hyde82/aggbug/1704015.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/hyde82/archive/2010/04/04/1704015.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/hyde82/archive/2010/04/02/1702773.html</id><title type="text">绝对郁闷到死的NHibernate2.0。。。</title><summary type="text">尝试配置了一下ActiveRecord[NHibernate2.0]。差点就放弃了。总是报代码Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/--&amp;gt;ERRORNHibernate.Cfg.Configuration[(null)]-Couldnotcompi...</summary><published>2010-04-01T21:30:00Z</published><updated>2010-04-01T21:30:00Z</updated><author><name>hyde</name><uri>http://www.cnblogs.com/hyde82/</uri></author><link rel="alternate" href="http://www.cnblogs.com/hyde82/archive/2010/04/02/1702773.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/hyde82/archive/2010/04/02/1702773.html"/><content type="html">&lt;p&gt;尝试配置了一下ActiveRecord[NHibernate2.0]。差点就放弃了。&lt;/p&gt;&#xD;
&lt;p&gt;总是报&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;" onclick="cnblogs_code_show('7934c480-e47f-46e1-b1d8-2d3395e0f430')"&gt;&lt;img  id="code_img_opened_7934c480-e47f-46e1-b1d8-2d3395e0f430" style="display: none" onclick="cnblogs_code_hide('7934c480-e47f-46e1-b1d8-2d3395e0f430',event)" src="http://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif"&gt;&#xD;
&lt;div  id="cnblogs_code_open_7934c480-e47f-46e1-b1d8-2d3395e0f430"&gt;&#xD;
&lt;div&gt;&lt;!--&lt;br/ /&gt;&lt;br/ /&gt;Code highlighting produced by Actipro CodeHighlighter (freeware)&lt;br/ /&gt;http://www.CodeHighlighter.com/&lt;br/ /&gt;&lt;br/ /&gt;--&gt;&lt;span style="color: #000000"&gt;ERROR&amp;nbsp;NHibernate.Cfg.Configuration&amp;nbsp;[(&lt;/span&gt;&lt;span style="color: #0000ff"&gt;null&lt;/span&gt;&lt;span style="color: #000000"&gt;)]&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000"&gt;-&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;Could&amp;nbsp;not&amp;nbsp;compile&amp;nbsp;the&amp;nbsp;mapping&amp;nbsp;document:&amp;nbsp;(&lt;/span&gt;&lt;span style="color: #0000ff"&gt;string&lt;/span&gt;&lt;span style="color: #000000"&gt;)&lt;br /&gt;NHibernate.MappingException:&amp;nbsp;Could&amp;nbsp;not&amp;nbsp;compile&amp;nbsp;the&amp;nbsp;mapping&amp;nbsp;document:&amp;nbsp;(&lt;/span&gt;&lt;span style="color: #0000ff"&gt;string&lt;/span&gt;&lt;span style="color: #000000"&gt;)&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000"&gt;---&amp;gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;System.InvalidOperationException:&amp;nbsp;Could&amp;nbsp;not&amp;nbsp;find&amp;nbsp;the&amp;nbsp;dialect&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;in&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;the&amp;nbsp;configuration&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;在&amp;nbsp;NHibernate.Dialect.Dialect.GetDialect(IDictionary`&lt;/span&gt;&lt;span style="color: #800080"&gt;2&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;props)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;在&amp;nbsp;NHibernate.Cfg.Configuration.AddValidatedDocument(NamedXmlDocument&amp;nbsp;doc)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;搞了2个小时。以为是Validator错误。一直改。。。&lt;/p&gt;&#xD;
&lt;p&gt;最后发现。是Config文件的配置多写了hibernate。。。。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;nhibernate.connection.provider &lt;br /&gt;nhibernate.dialect &lt;br /&gt;nhibernate.connection.connection_string &lt;br /&gt;之前的nhibernate在2.0版本里都要去掉。 &lt;br /&gt;&lt;/p&gt;&#xD;
&lt;p&gt;相当的无语。杯具啊。浪费生命啊。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;再次b4 castle的文档。。。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/hyde82/aggbug/1702773.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/hyde82/archive/2010/04/02/1702773.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/hyde82/archive/2010/03/31/1701608.html</id><title type="text">再见Castle</title><summary type="text">隔了一段漫长的时间，去了Castle看了一下，发现杯具了。Castle现在的发展可以用滞后来形容。文档还是一样的不成样子。基本上都是推荐LINQ和NHibernate，而且NHibernateFacility 已经没有更新了。</summary><published>2010-03-31T09:44:00Z</published><updated>2010-03-31T09:44:00Z</updated><author><name>hyde</name><uri>http://www.cnblogs.com/hyde82/</uri></author><link rel="alternate" href="http://www.cnblogs.com/hyde82/archive/2010/03/31/1701608.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/hyde82/archive/2010/03/31/1701608.html"/><content type="html">&lt;p&gt;隔了一段漫长的时间，去了Castle看了一下，发现杯具了。Castle现在的发展可以用滞后来形容。&lt;/p&gt;&#xD;
&lt;p&gt;文档还是一样的不成样子。&lt;/p&gt;&#xD;
&lt;p&gt;基本上都是推荐LINQ和NHibernate，而且&lt;span &gt;NHibernateFacility&lt;/span&gt; 已经没有更新了。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/hyde82/aggbug/1701608.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/hyde82/archive/2010/03/31/1701608.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/hyde82/archive/2010/03/31/1701348.html</id><title type="text">CentOS的配置</title><summary type="text">第一个JDK：虽然CentOS提供yum，但对JDK安装一点作用都没有。因为我要用到JDK1.6，所以只能手动自己的安装了。查看Linux自带的JDK是否已安装下载JDK，java -version去sun（ORACLE）注册下载一个。安装JDK　　 &amp;lt;1&amp;gt;从SUN下载jdk-1_6_0_14-linux-i586-rpm.bin或jdk-1_6_0_14-linux-i586.bin...</summary><published>2010-03-31T05:56:00Z</published><updated>2010-03-31T05:56:00Z</updated><author><name>hyde</name><uri>http://www.cnblogs.com/hyde82/</uri></author><link rel="alternate" href="http://www.cnblogs.com/hyde82/archive/2010/03/31/1701348.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/hyde82/archive/2010/03/31/1701348.html"/><content type="html">&lt;p&gt;第一个JDK：&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;虽然CentOS提供yum，但对JDK安装一点作用都没有。因为我要用到JDK1.6，所以只能手动自己的安装了。&lt;/p&gt;&#xD;
&lt;ol&gt;&lt;li&gt;查看Linux自带的JDK是否已安装下载JDK，java -version&lt;/li&gt;&lt;li&gt;去sun（ORACLE）注册下载一个。&lt;/li&gt;&lt;li&gt;安装JDK&lt;br /&gt;　　&#xD;
&lt;p&gt;&amp;lt;1&amp;gt;从SUN下载jdk-1_6_0_14-linux-i586-rpm.bin或jdk-1_6_0_14-linux-i586.bin &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 在/usr下新建java文件夹，将安装包放在/usr/java目录下 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; # mkdir /usr/java &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;2&amp;gt;安装JDK &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; # cd /usr/java &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;#9312;jdk-1_6_0_14-linux-i586-rpm.bin文件安装 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; # chmod 777 jdk-1_6_0_14-linux-i586-rpm.bin&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;#8592; 修改为可执行 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; # ./jdk-1_6_0_14-linux-i586-rpm.bin&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;#8592; 选择yes同意上面的协议 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; # rpm -ivh jdk-1_6_0_14-linux-i586.rpm&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;#8592; 选择yes直到安装完毕 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;#9313;jdk-1_6_0_14-linux-i586.bin文件安装 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; # chmod a+x jdk-1_6_0_14-linux-i586.bin&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;#8592; 使当前用户拥有执行权限 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; # ./jdk-1_6_0_14-linux-i586.bin&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;#8592; 选择yes直到安装完毕 &lt;/p&gt;　　&lt;/li&gt;&lt;li&gt;配置环境变量 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;1&amp;gt;# vi /etc/profile &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;2&amp;gt;在最后加入以下几行： &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; export JAVA_HOME=/usr/java/jdk1.6.0_10 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; export CLASSPATH=.:$JAVA_HOME/jre/lib/rt.jar:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; export PATH=$PATH:$JAVA_HOME/bin &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;3&amp;gt;# reboot&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;#8592; 重启机器配置生效&lt;/li&gt;&lt;/ol&gt;&#xD;
&lt;p&gt;第二：IPV6和防火墙&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;一般不用IPV6的情况下，建议关闭服务：&lt;/p&gt;&#xD;
&lt;blockquote dir="ltr" style="margin-right: 0px"&gt;&#xD;
&lt;p&gt;vi /etc/modprobe.conf　&amp;#8592; 修改相应配置文件，添加如下行到文尾：&lt;br /&gt;&lt;br /&gt;alias net-pf-10 off&lt;br /&gt;alias ipv6 off&lt;br /&gt;&lt;br /&gt;shutdown -r now　&amp;#8592; 重新启动系统，使设置生效&lt;/p&gt;&lt;/blockquote&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;CentOS默认是打开防火墙的（千万注意），设置防火墙开放端口方法如下：&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;blockquote dir="ltr" style="margin-right: 0px"&gt;&#xD;
&lt;p&gt;打开iptables的配置文件：&lt;br /&gt;vi /etc/sysconfig/iptables&lt;/p&gt;&#xD;
&lt;p&gt;注意：&lt;br /&gt;一定要给自己留好后路,留VNC一个管理端口和SSh的管理端口&lt;/p&gt;&#xD;
&lt;p&gt;下面是一个iptables的示例：&lt;/p&gt;&#xD;
&lt;p&gt;# Firewall configuration written by system-config-securitylevel&lt;br /&gt;# Manual customization of this file is not recommended.&lt;br /&gt;*filter&lt;br /&gt;:INPUT ACCEPT [0:0]&lt;br /&gt;:FORWARD ACCEPT [0:0]&lt;br /&gt;:OUTPUT ACCEPT [0:0]&lt;br /&gt;:RH-Firewall-1-INPUT - [0:0]&lt;br /&gt;-A INPUT -j RH-Firewall-1-INPUT&lt;br /&gt;-A FORWARD -j RH-Firewall-1-INPUT&lt;br /&gt;-A RH-Firewall-1-INPUT -i lo -j ACCEPT&lt;br /&gt;-A RH-Firewall-1-INPUT -p icmp &amp;#8211;icmp-type any -j ACCEPT&lt;br /&gt;-A RH-Firewall-1-INPUT -p 50 -j ACCEPT&lt;br /&gt;-A RH-Firewall-1-INPUT -p 51 -j ACCEPT&lt;br /&gt;-A RH-Firewall-1-INPUT -m state &amp;#8211;state ESTABLISHED,RELATED -j ACCEPT&lt;br /&gt;-A RH-Firewall-1-INPUT -m state &amp;#8211;state NEW -m tcp -p tcp &amp;#8211;dport 53 -j ACCEPT&lt;br /&gt;-A RH-Firewall-1-INPUT -m state &amp;#8211;state NEW -m udp -p udp &amp;#8211;dport 53 -j ACCEPT&lt;br /&gt;-A RH-Firewall-1-INPUT -m state &amp;#8211;state NEW -m tcp -p tcp &amp;#8211;dport 22 -j ACCEPT&lt;br /&gt;-A RH-Firewall-1-INPUT -m state &amp;#8211;state NEW -m tcp -p tcp &amp;#8211;dport 25 -j ACCEPT&lt;br /&gt;-A RH-Firewall-1-INPUT -m state &amp;#8211;state NEW -m tcp -p tcp &amp;#8211;dport 80 -j ACCEPT&lt;br /&gt;-A RH-Firewall-1-INPUT -m state &amp;#8211;state NEW -m tcp -p tcp &amp;#8211;dport 443 -j ACCEPT&lt;br /&gt;-A RH-Firewall-1-INPUT -j REJECT &amp;#8211;reject-with icmp-host-prohibited&lt;br /&gt;COMMIT &lt;/p&gt;&#xD;
&lt;p&gt;需要注意的是，你必须根据自己服务器的情况来修改这个文件。&lt;/p&gt;&#xD;
&lt;p&gt;举例来说，如果你不希望开放80端口提供web服务，那么应该相应的删除这一行：&lt;br /&gt;-A RH-Firewall-1-INPUT -m state &amp;#8211;state NEW -m tcp -p tcp &amp;#8211;dport 80 -j ACCEPT&lt;/p&gt;&#xD;
&lt;p&gt;全部修改完之后重启iptables:&lt;/p&gt;&#xD;
&lt;p&gt;service iptables restart&lt;/p&gt;&#xD;
&lt;p&gt;你可以验证一下是否规则都已经生效：&lt;/p&gt;&#xD;
&lt;p&gt;iptables -L&lt;/p&gt;&lt;/blockquote&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/hyde82/aggbug/1701348.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/hyde82/archive/2010/03/31/1701348.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/hyde82/archive/2008/04/29/1175600.html</id><title type="text">(比较纳闷)不知道是.net驱动问题还是Oracle客户端问题</title><summary type="text">Oracle,jdbc,.net</summary><published>2008-04-29T01:19:00Z</published><updated>2008-04-29T01:19:00Z</updated><author><name>hyde</name><uri>http://www.cnblogs.com/hyde82/</uri></author><link rel="alternate" href="http://www.cnblogs.com/hyde82/archive/2008/04/29/1175600.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/hyde82/archive/2008/04/29/1175600.html"/></entry><entry><id>http://www.cnblogs.com/hyde82/archive/2008/04/28/1174281.html</id><title type="text">注册VSS2005到IDE</title><summary type="text">重新注册vss2005</summary><published>2008-04-28T03:25:00Z</published><updated>2008-04-28T03:25:00Z</updated><author><name>hyde</name><uri>http://www.cnblogs.com/hyde82/</uri></author><link rel="alternate" href="http://www.cnblogs.com/hyde82/archive/2008/04/28/1174281.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/hyde82/archive/2008/04/28/1174281.html"/></entry><entry><id>http://www.cnblogs.com/hyde82/archive/2006/01/23/322141.html</id><title type="text">最近忙，没有上来更新。。</title><summary type="text">最近用NHM做了一个项目，赶鸭子似的。什么流程都没有，就把页面给套上去了。。。。感觉，很不爽。郁闷。唉。。。。。。。。。</summary><published>2006-01-23T08:35:00Z</published><updated>2006-01-23T08:35:00Z</updated><author><name>hyde</name><uri>http://www.cnblogs.com/hyde82/</uri></author><link rel="alternate" href="http://www.cnblogs.com/hyde82/archive/2006/01/23/322141.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/hyde82/archive/2006/01/23/322141.html"/></entry><entry><id>http://www.cnblogs.com/hyde82/archive/2006/01/07/313044.html</id><title type="text">近期关注：IronPython！|| 学习多线程</title><summary type="text">正在了解什么是IronPython。概念就一点点。就是可以用Console来写.net CLR的程序。多线程的回调函数，学习中。。。。。。有高人指条路吗？ 2006年1月23日 新增nvelocity； JSP+Oracle</summary><published>2006-01-07T15:23:00Z</published><updated>2006-01-07T15:23:00Z</updated><author><name>hyde</name><uri>http://www.cnblogs.com/hyde82/</uri></author><link rel="alternate" href="http://www.cnblogs.com/hyde82/archive/2006/01/07/313044.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/hyde82/archive/2006/01/07/313044.html"/></entry></feed>
