逝者如斯夫

静而思之
数据加载中……

Building CouchDB 1.0.2 from source (CentOS/RHEL 5)

Dependencies

CouchDB

Runtime

Build

Spidermonkey

Erlang

ICU

cURL

Automake

Autoconf

0.9.x

==1.7

>=5.6.0

>= 3.0

>= 7.15.5

>= 1.6.3

>= 2.59

0.10.x

>=1.7 && <=1.8.0

>=5.6.5

>= 3.0

>= 7.18.0

>= 1.6.3

>= 2.59

0.11.x

>=1.7

>=5.6.5

>= 3.0

>= 7.18.0

>= 1.6.3

>= 2.59

1.0.2

>=1.7

>=5.6.5

>= 3.0

>= 7.18.0

>= 1.6.3

>= 2.59



wget http://mirror.centos.org/centos/5/os/x86_64/CentOS/libicu-3.6-5.16.x86_64.rpm
wget http://mirror.centos.org/centos/5/os/x86_64/CentOS/libicu-devel-3.6-5.16.x86_64.rpm
wget http://download.fedora.redhat.com/pub/epel/5/x86_64/js-1.70-8.el5.x86_64.rpm
wget http://download.fedora.redhat.com/pub/epel/5/SRPMS/js-1.70-8.el5.src.rpm
wget http://download.fedora.redhat.com/pub/epel/5/x86_64/js-devel-1.70-8.el5.x86_64.rpm

wget http://curl.haxx.se/download/curl-7.21.6.tar.gz
wget http://labs.renren.com/apache-mirror/couchdb/1.0.2/apache-couchdb-1.0.2.tar.gz

tar -xzf curl-7.21.6.tar.gz
cd curl-7.21.6
./configure --prefix=/usr/local
make
make install
cd ..

rpm -ivh *.rpm

tar -xzf apache-couchdb-1.0.2.tar.gz
cd apache-couchdb-1.0.2
./configure --prefix=/usr/local/couchdb --with-erlang=/usr/lib64/erlang/usr/include
make
make install
cd ..


rm -rf apache-couchdb-1.0.2 curl-7.21.6

/usr/sbin/useradd -r --home /usr/local/couchdb/var/lib/couchdb -M --shell /bin/bash --comment "CouchDB Administrator" couchdb

mkdir -p /var/www/apps/couchdb/data
mkdir -p /var/www/apps/couchdb/view
mkdir -p /usr/local/var/lib/couchdb
mkdir -p /usr/local/var/log

chown -R couchdb: /usr/local/couchdb/var/lib/couchdb /usr/local/couchdb/var/log/couchdb /var/www/apps/couchdb


# [httpd]
# port = 5984
# bind_address = 127.0.0.1 (your binding ip address here)
vi /usr/local/couchdb/etc/couchdb/default.ini

# -A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 5984 -j ACCEPT
vi /etc/sysconfig/iptables
/sbin/service iptables restart

ln -s /usr/local/couchdb/etc/rc.d/couchdb /etc/init.d/couchdb

/sbin/chkconfig --add couchdb
/sbin/service couchdb start

curl http://localhost{IP}:5984{PORT}/  
{"couchdb":"Welcome","version":"1.0.2"}


posted @ 2011-05-10 14:05 ideame 阅读(435) | 评论 (0)编辑 收藏

yum install mercurial (CentOS-5.4_x64)

wget ftp://ftp.univie.ac.at/systems/linux/dag/redhat/el5/en/x86_64/rpmforge/RPMS/rpmforge-release-0.3.6-1.el5.rf.x86_64.rpm
rpm -Uvh
rpmforge-release-0.3.6-1.el5.rf.x86_64.rpm

yum install mercurial

posted @ 2010-04-04 14:01 ideame 阅读(697) | 评论 (0)编辑 收藏

软件开发者面试百问


软件开发者面试百问

作者 Jurgen Appelo译者 李剑 发布于 2009年1月20日 上午2时2分


1月13日,著名博客作者Jurgen Appelo写了一篇博文:“软件开发者面试百问”。该文甚受读者欢迎,15日便登上了delicious,Popurls.com,Reddit的首页。InfoQ中文站在得到作者许可之后,将其全文翻译为中文,希望可以对国内读者有所助益。

以下为文章全文:

想雇到搞软件开发的聪明人可不容易。万一一不小心,就会搞到一堆低能大狒狒。我去年就碰到这种事了。你肯定不想这样吧。听我的,没错。在树上开站立会议门都没有。

问点有难度的问题能帮你把聪明人跟狒狒们分开。我决定把我自己整理出来的软件开发者面试百问发出来,希望能帮到你们的忙。

这个列表涵盖了软件开发知识体系中定义的大多数知识域。当然,如果你只想找出类拔萃的程序员,便只需涉及结构、算法、数据结构、测试这几个话题。如果想雇架构师,也可以只考虑需求、功能设计、技术设计这些地方。

不过不管你怎么做,都要牢记一点:

这里大多数问题的答案都没有对错之分!

你可以把我的这些问题作为引子,展开讨论。例如下面有个问题是使用静态方法或是单例的缘由。如果那个面试的就此展开长篇大论,那他很有可能是个聪明能干的家伙!如果他一脸茫然的看着你,发出这种声音,很明显这就是只狒狒了。同样,想知道一个数是不是2的乘方也有很多方法,不过要是面试的人想用mod运算符,嗯……你知道我的意思吧。(你不知道也没关系,来根香蕉?)

需求

1. 你能给出一些非功能性(或者质量)需求的例子么?
2. 如果客户需要高性能、使用极其方便而又高度安全,你会给他什么建议?
3. 你能给出一些用来描述需求的不同技术么?它们各自适用于什么场景?
4. 需求跟踪是什么意思?什么是向前追溯,什么是向后追溯?
5. 你喜欢用什么工具跟踪需求?
6. 你怎么看待需求变化?它是好是坏?给出你的理由。
7. 你怎样研究需求,发现需求?有哪些资源可以用到?
8. 你怎么给需求制定优先级?有哪些技术?
9. 在需求过程中,用户、客户、开发人员各自的职责是什么?
10. 你怎么对待不完整或是令人费解的需求?

功能设计


1. 在功能设计中有哪些隐喻?给出几个成功的例子。
2. 如果有些功能的执行时间很长,怎么能让用户感觉不到太长的等待?
3. 如果用户必须要在一个很小的区域内,从一个常常的列表中选择多个条目,你会用什么控件?
4. 有哪些方法可以保证数据项的完整?
5. 建立系统原型有哪些技术?
6. 应用程序怎样建立对用户行为的预期?给出一些例子。
7. 如何入手设计一组数量庞大而又复杂的特性,你能举出一些设计思路吗?
8. 有一个列表,其中有10个元素,每个元素都有20个字段可以编辑,你怎样设计这种情况?如果是1000个元素,每个元素有3个字段呢?
9. 用不同的颜色对一段文本中的文字标记高亮,这种做法有什么问题?
10. Web环境和Windows环境各有些什么限制?

技术设计

1. 什么是低耦合和高聚合?封装原则又是什么意思?
2. 在Web应用中,你怎样避免几个人编辑同一段数据所造成的冲突?
3. 你知道设计模式吗?你用过哪些设计模式?在什么场合下用的?
4. 是否了解什么是无状态的业务层?长事务如何与之相适应?
5. 在搭建一个架构,或是技术设计时,你用过几种图?
6. 在N层架构中都有哪些层?它们各自的职责是什么?
7. 有哪些方法可以确保架构中数据的正确和健壮?
8. 面向对象设计和面向组件设计有哪些不同之处?
9. 怎样在数据库中对用户授权、用户配置、权限管理这几项功能建模?
10. 怎样按照等级制度给动物王国(包括各种物种和各自的行为)建模?

结构

1. 你怎样保证你的代码可以处理各种错误事件?
2. 解释一下什么是测试驱动开发,举出极限编程中的一些原则。
3. 看别人代码的时候,你最关心什么地方?
4. 什么时候使用抽象类,什么时候使用接口?
5. 除了IDE以外,你还喜欢哪些必不可少的工具?
6. 你怎么保证代码执行速度快,而又不出问题?
7. 什么时候用多态,什么时候用委派?
8. 什么时候使用带有静态成员的类,什么时候使用单例?
9. 你在代码里面怎么提前处理需求的变化?给一些例子。
10. 描述一下实现一段代码的过程,从需求到最终交付。

算法

1. 怎样知道一个数字是不是2的乘方?怎样判断一个数是不是奇数?
2. 怎样找出链表中间的元素?
3. 怎样改变10,000个静态HTML页面中所有电话号码的格式?
4. 举出一个你所用过的递归的例子。
5. 在哈希表和排序后的列表中找一个元素,哪个查找速度最快?
6. 不管是书、杂志还是网络,你从中所学到的最后一点算法知识是什么?
7. 怎样把字符串反转?你能不用临时的字符串么?
8. 你愿意用什么类型的语言来编写复杂的算法?
9. 有一个数组,里面是从1到1,000,000的整数,其中有一个数字出现了两次,你怎么找出那个重复的数字?
10. 你知道“旅行商问题(Traveling Salesman Problem)”么?

数据结构


1. 怎样在内存中实现伦敦地铁的结构?
2. 怎样以最有效的方式在数据库中存储颜色值?
3. 队列和堆栈区别是什么?
4. 用堆或者堆栈存储数据的区别是什么?
5. 怎样在数据库中存储N维向量?
6. 你倾向于用哪种类型的语言编写复杂的数据结构?
7. 21的二进制值是什么?十六制值呢?
8. 不管是书、杂志还是网络,你从中所学到的最后一点数据结构的知识是什么?
9. 怎样在XML文档中存储足球比赛结果(包括队伍和比分)?
10. 有哪些文本格式可以保存Unicode字符?

测试

1. 什么是回归测试?怎样知道新引入的变化没有给现有的功能造成破坏?
2. 如果业务层和数据层之间有依赖关系,你该怎么写单元测试?
3. 你用哪些工具测试代码质量?
4. 在产品部署之后,你最常碰到的是什么类型的问题?
5. 什么是代码覆盖率?有多少种代码覆盖率?
6. 功能测试和探索性测试的区别是什么?你怎么对网站进行测试?
7. 测试栈、测试用例、测试计划,这三者之间的区别是什么?你怎么组织测试?
8. 要对电子商务网站做冒烟测试,你会做哪些类型的测试?
9. 客户在验收测试中会发现不满意的东西,怎样减少这种情况的发生?
10. 你去年在测试和质量保证方面学到了哪些东西?

维护

1. 你用哪些工具在维护阶段对产品进行监控?
2. 要想对一个正在产品环境中被使用的产品进行升级,该注意哪些重要事项?
3. 如果在一个庞大的文件中有错误,而代码又无法逐步跟踪,你怎么找出错误?
4. 你怎样保证代码中的变化不会影响产品的其他部分?
5. 你怎样为产品编写技术文档?
6. 你用过哪些方式保证软件产品容易维护?
7. 怎样在产品运行的环境中进行系统调试?
8. 什么是负载均衡?负载均衡的方式有哪些种?
9. 为什么在应用程序的生命周期中,软件维护费用所占的份额最高?
10. re-engineering和reverse engineering的区别是什么?

配置管理

1. 你知道配置管理中基线的含义么?怎样把项目中某个重要的时刻冻结?
2. 你一般会把哪些东西纳入版本控制?
3. 怎样可以保证团队中每个人都知道谁改变了哪些东西?
4. Tag和Branch的区别是什么?在什么情况下该使用tag,什么时候用branch?
5. 怎样管理技术文档——如产品架构文档——的变化?
6. 你用什么侗剧管理项目中所有数字信息的状态?你最喜欢哪种工具?
7. 如果客户想要对一款已经发布的产品做出变动,你怎么处理?
8. 版本管理和发布管理有什么差异?
9. 对文本文件的变化和二进制文件的变化进行管理,这二者有什么不同?
10. 同时处理多个变更请求,或是同时进行增量开发和维护,这种事情你怎么看待?

项目管理

1. 范围、时间、成本,这三项中哪些是可以由客户控制的?
2. 谁该对项目中所要付出的一切做出估算?谁有权设置最后期限?
3. 减少交付的次数,或是减少每个每个交付中的工作量,你喜欢哪种做法?
4. 你喜欢用哪种图来跟踪项目进度?
5. 迭代和增量的区别在哪里?
6. 试着解释一下风险管理中用到的实践。风险该如何管理?
7. 你喜欢任务分解还是滚动式计划?
8. 你需要哪些东西帮助你判断项目是否符合时间要求,在预算范围内运作?
9. DSDM、Prince2、Scrum,这三者之间有哪些区别?
10. 如果客户想要的东西太多,你在范围和时间上怎样跟他达成一致呢?

Powered by ScribeFire.

posted @ 2010-03-19 10:07 ideame 阅读(408) | 评论 (0)编辑 收藏

No more 'unable to find valid certification path to requested target'

From: http://blogs.sun.com/andreas/entry/no_more_unable_to_find

Some of you may be familiar with the (not very user friendly) exception message
javax.net.ssl.SSLHandshakeException:
sun.security.validator.ValidatorException:
PKIX path building failed:
sun.security.provider.certpath.SunCertPathBuilderException:
unable to find valid certification path to requested target

when trying to open an SSL connection to a host using JSSE. What this usually means is that the server is using a test certificate (possibly generated using keytool) rather than a certificate from a well known commercial Certification Authority such as Verisign or GoDaddy. Web browsers display warning dialogs in this case, but since JSSE cannot assume an interactive user is present it just throws an exception by default.

Certificate validation is a very important part of SSL security, but I am not writing this entry to explain the details. If you are interested, you can start by reading the Wikipedia blurb. I am writing this entry to show a simple way to talk to that host with the test certificate, if you really want to.

Basically, you want to add the server's certificate to the KeyStore with your trusted certificates. There are any number of ways to achieve that, but a simple solution is to compile and run the attached program as java InstallCert hostname, for example

% java InstallCert ecc.fedora.redhat.com
Loading KeyStore /usr/jdk/instances/jdk1
.5.0 /jre/lib/security/cacerts
Opening connection to ecc.fedora.redhat.com:
443
Starting SSL handshake

javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed:
sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
    at com.sun.net.ssl.internal.ssl.Alerts.getSSLException(Alerts.java:
150 )
    at com.sun.net.ssl.internal.ssl.SSLSocketImpl.fatal(SSLSocketImpl.java:
1476 )
    at com.sun.net.ssl.internal.ssl.Handshaker.fatalSE(Handshaker.java:
174 )
    at com.sun.net.ssl.internal.ssl.Handshaker.fatalSE(Handshaker.java:
168 )
    at com.sun.net.ssl.internal.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.java:
846 )
    at com.sun.net.ssl.internal.ssl.ClientHandshaker.processMessage(ClientHandshaker.java:
106 )
    at com.sun.net.ssl.internal.ssl.Handshaker.processLoop(Handshaker.java:
495 )
    at com.sun.net.ssl.internal.ssl.Handshaker.process_record(Handshaker.java:
433 )
    at com.sun.net.ssl.internal.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:
815 )
    at com.sun.net.ssl.internal.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:
1025 )
    at com.sun.net.ssl.internal.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:
1038 )
    at InstallCert.main(InstallCert.java:
63 )
Caused by: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException:
unable to find valid certification path to requested target
    at sun.security.validator.PKIXValidator.doBuild(PKIXValidator.java:
221 )
    at sun.security.validator.PKIXValidator.engineValidate(PKIXValidator.java:
145 )
    at sun.security.validator.Validator.validate(Validator.java:
203 )
    at com.sun.net.ssl.internal.ssl.X509TrustManagerImpl.checkServerTrusted(X509TrustManagerImpl.java:
172 )
    at InstallCert$SavingTrustManager.checkServerTrusted(InstallCert.java:
158 )
    at com.sun.net.ssl.internal.ssl.JsseX509TrustManager.checkServerTrusted(SSLContextImpl.java:
320 )
    at com.sun.net.ssl.internal.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.java:
839 )
     
7  more
Caused by: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
    at sun.security.provider.certpath.SunCertPathBuilder.engineBuild(SunCertPathBuilder.java:
236 )
    at java.security.cert.CertPathBuilder.build(CertPathBuilder.java:
194 )
    at sun.security.validator.PKIXValidator.doBuild(PKIXValidator.java:
216 )
     
13  more

Server sent 
2  certificate(s):

 
1  Subject CN = ecc.fedora.redhat.com ,  O = example.com ,  C = US
   Issuer  CN
= Certificate Shack ,  O = example.com ,  C = US
   sha1    2e 7f 
76  9b  52   91   09  2e 5d 8f 6b  61   39  2d 5e  06  e4 d8 e9 c7 
   md5     dd d1 a8 
03  d7 6c 4b  11  a7 3d  74   28   89  d0  67   54  

 
2  Subject CN = Certificate Shack ,  O = example.com ,  C = US
   Issuer  CN
= Certificate Shack ,  O = example.com ,  C = US
   sha1    fb 
58  a7  03  c4 4e 3b 0e e3 2c  40  2f  87   64   13  4d df e1 a1 a6 
   md5     
72  a0  95   43  7e  41   88   18  ae 2f 6d  98   01  2c  89   68  

Enter certificate to add to trusted keystore or 'q' to quit: 
[ 1 ]

What happened was that the program opened a connection to the specified host and started an SSL handshake. It printed the exception stack trace of the error that occured and shows you the certificates used by the server. Now it prompts you for the certificate you want to add to your trusted KeyStore. You should only do this if you are sure that this is the certificate of the trusted host you want to connect to. You may want to check the MD5 and SHA1 certificate fingerprints against a fingerprint generated on the server (e.g. using keytool) to make sure it is the correct certificate.

If you've changed your mind, enter 'q'. If you really want to add the certificate, enter '1'. (You could also add a CA certificate by entering a different certificate, but you usually don't want to do that'). Once you have made your choice, the program will print the following:

...

Added certificate to keystore 'jssecacerts' using alias 'ecc.fedora.redhat.com-1'

It displayed the complete certificate and then added it to a Java KeyStore 'jssecacerts' in the current directory. To use it in your program, either configure JSSE to use it as its trust store (as explained in the documentation) or copy it into your $JAVA_HOME/jre/lib/security directory. If you want all Java applications to recognize the certificate as trusted and not just JSSE, you could also overwrite the cacerts file in that directory.

After all that, JSSE will be able to complete a handshake with the host, which you can verify by running the program again:

% java InstallCert ecc.fedora.redhat.com Loading KeyStore jssecacerts
 Opening connection to ecc.fedora.redhat.com:
443
 Starting SSL handshake
 No errors, certificate is already trusted Server sent 
2 certificate(s): 1 []

Enter certificate to add to trusted keystore or 'q' to quit: [
1] q KeyStore not changed 

posted @ 2010-02-09 14:55 ideame 阅读(1499) | 评论 (1)编辑 收藏

关于 Maven + Proguard

    以前试过在Ant下使用Proguard,感觉挺简单的,使用Maven后,明显复杂多了,复杂不在Proguard,而在proguard-maven-plugin。
    配置如下:

<plugin>
    
<groupId>com.pyx4me</groupId>
    
<artifactId>proguard-maven-plugin</artifactId>
    
<executions>
        
<execution>
            
<phase>package</phase>
            
<goals>
                
<goal>proguard</goal>
            
</goals>
        
</execution>
    
</executions>
    
<configuration>
        
<obfuscate>true</obfuscate>
        
<proguardInclude>${basedir}/proguard.pro</proguardInclude>
        
<libs>
            
<lib>${java.home}/lib/rt.jar</lib>
            
<lib>${java.home}/lib/jsse.jar</lib>
            
<lib>${java.home}/lib/jce.jar</lib>
        
</libs>
    
</configuration>
</plugin>

出现异常:


[proguard] Obfuscating
[proguard] Printing mapping to [D:\cces\linker\target\proguard_map.txt]
[proguard] Preverifying
[proguard] Unexpected error while performing partial evaluation:
[proguard]   Class = [net/sicross/tms/service/cces/SearchFlightOrderDetailService]
[proguard]   Method = [getRouteDetail(Ljava/util/Map;)Ljava/util/List;]
[proguard]   Exception = [java.lang.IllegalArgumentException] (Can't find common super class of [java/util/List] and [java/lang/StringBuffer])
[proguard] Unexpected error while preverifying:
[proguard]   Class  = [net/sicross/tms/service/cces/SearchFlightOrderDetailService] [proguard]   Method = [getRouteDetail(Ljava/util/Map;)Ljava/util/List;]
[proguard]   Exception = [java.lang.IllegalArgumentException] (Can't find common super class of [java/util/List] and [java/lang/StringBuffer])
[proguard] java.lang.IllegalArgumentException: Can't find common super class of [java/util/List] and [java/lang/StringBuffer]
[proguard]     at proguard.evaluation.value.ReferenceValue.generalize(ReferenceValue.java:330)
[proguard]     at proguard.evaluation.value.ReferenceValue.generalize(ReferenceValue.java:467)
[proguard]     at proguard.evaluation.Variables.generalize(Variables.java:137)
[proguard]     at proguard.evaluation.TracedVariables.generalize(TracedVariables.java:140)
[proguard]     at proguard.optimize.evaluation.PartialEvaluator.evaluateInstructionBlock(PartialEvaluator.java:637)

    根据异常,先是怀疑有什么jre的包没有导入,增加了另外几个也不行。在怀疑是jdk编译版本的问题,因为输出目标jdk版本是1.6的,在proguard-maven-plugin的configuration中增加下面的配置也没有。

<options>
    
<option>-target 1.6</option>
</options>

    最后,将maven的target=1.6改为1.5后,异常消失。


<plugin>
    
<groupId>org.apache.maven.plugins</groupId>
    
<version>2.0.2</version>
    
<artifactId>maven-compiler-plugin</artifactId>
    
<configuration>
        
<source>1.5</source>
        
<target>1.6</target>
        
<encoding>UTF-8</encoding>
    
</configuration>
</plugin>



Powered by ScribeFire.

posted @ 2010-02-01 11:53 ideame 阅读(6910) | 评论 (1)编辑 收藏

查看系统信息:Linux版本和内核对应

Red Hat 9                     2.4.20-8

Fedora Core 4              2.6.11-1.1369_FC4
Fedora Core 5              2.6.15-1.2054_FC5
Fedora Core 6              2.6.18-1.2798.fc6
Fedora 7                      2.6.21-1.3194.fc7
Fedora 8                      2.6.23.1-42.fc8

Ubuntu 7.10                2.6.22-14-generic

RedHat as4.0               2.6.9-11.EL

CentOS 5.1                  2.6.18
CentOS 5.2                  2.6.18


系统
    # uname -a # 查看内核/操作系统/CPU信息
    # head -n 1 /etc/issue # 查看操作系统版本
    # cat /proc/cpuinfo # 查看CPU信息
    # hostname # 查看计算机名
    # lspci -tv # 列出所有PCI设备
    # lsusb -tv # 列出所有USB设备
    # lsmod # 列出加载的内核模块
    # env # 查看环境变量

资源
    # free -m # 查看内存使用量和交换区使用量
    # df -h # 查看各分区使用情况
    # du -sh # 查看指定目录的大小
    # grep MemTotal /proc/meminfo # 查看内存总量
    # grep MemFree /proc/meminfo # 查看空闲内存量
    # uptime # 查看系统运行时间、用户数、负载
    # cat /proc/loadavg # 查看系统负载

磁盘和分区
    # mount | column -t # 查看挂接的分区状态
    # fdisk -l # 查看所有分区
    # swapon -s # 查看所有交换分区
    # hdparm -i /dev/hda # 查看磁盘参数(仅适用于IDE设备)
    # dmesg | grep IDE # 查看启动时IDE设备检测状况

网络
    # ifconfig # 查看所有网络接口的属性
    # iptables -L # 查看防火墙设置
    # route -n # 查看路由表
    # netstat -lntp # 查看所有监听端口
    # netstat -antp # 查看所有已经建立的连接
    # netstat -s # 查看网络统计信息

进程
    # ps -ef # 查看所有进程
    # top # 实时显示进程状态

用户
    # w # 查看活动用户
    # id # 查看指定用户信息
    # last # 查看用户登录日志
    # cut -d: -f1 /etc/passwd # 查看系统所有用户
    # cut -d: -f1 /etc/group # 查看系统所有组
    # crontab -l # 查看当前用户的计划任务

服务
    # chkconfig --list # 列出所有系统服务
    # chkconfig --list | grep on # 列出所有启动的系统服务

程序
    # rpm -qa # 查看所有安装的软件包

posted @ 2009-02-17 16:02 ideame 阅读(364) | 评论 (0)编辑 收藏

TCP连接的过程

编写:Leaf Zhou
EMAIL:leaf_zhou_8@hotmail.com

TCP是英文Transport Control Protocol的缩写。从字面理解,就是传输控制协议。因此,TCP是一种控制协议,他本身不能用来传输数据,它需要通过网络层的IP协议来进行实际数据的传输。这也就是我们常常看到,TCP/IP和TCP/UDP总是同时出现的原因。因此,也可以理解为TCP是很多的不同的协议组成,实际上是一个协议组。提供可靠的主机到主机层数据传输控制协议。这里要先强调一下,传输控制协议是OSI网络的第四层的叫法,TCP传输控制协议是TCP/IP传输的6个基本协议的一种。TCP是一种可靠的面向连接的传送服务。它在

一、TCP概述
TCP是英文Transport Control Protocol的缩写。从字面理解,就是传输控制协议。因此,TCP是一种控制协议,他本身不能用来传输数据,它需要通过网络层的IP协议来进行实际数据的传输。这也就是我们常常看到,TCP/IP和TCP/UDP总是同时出现的原因。因此,也可以理解为TCP是很多的不同的协议组成,实际上是一个协议组。提供可靠的主机到主机层数据传输控制协议。这里要先强调一下,传输控制协议是OSI网络的第四层的叫法,TCP传输控制协议是TCP/IP传输的6个基本协议的一种。TCP是一种可靠的面向连接的传送服务。它在传送数据时是分段进行的,主机交换数据必须先建立一个会话。它用比特流通信,即数据被作为无结构的字节流进行传输,没有数据边界。通过每个TCP传输的字段指定顺序号,以获得可靠性。是在OSI参考模型中的第四层,TCP是使用IP的网间互联功能而提供可靠的数据传输,IP不停的把报文放到网络上,而TCP是负责确信报文到达。在协同IP的操作中TCP负责:握手过程、报文管理、流量控制、错误检测和处理(控制),可以根据一定的编号顺序对非正常顺序的报文给予从新排列顺序。关于TCP的RFC文档有RFC793、RFC791、RFC1700。

二、TCP连接的建立
建立一个TCP连接,需要下面的步骤:
(1)服务器端通过listen来准备接受外来的连接,称为被动打开(passive open)。
(2) 客户端通过connect进行连接服务器,称为主动打开(active open)。在这个操作中,客户端需要发送一个同步数据报(SYN),用来通知服务器端开始发送数据的初始序列号。通常情况下,同步数据报不携带数据,它只包含一个IP头部、一个TCP头部和本次通信所使用的TCP的选项。
(3)服务器端必须对客户端发来的同步数据报SYN进行确认,同时自己也要发送一个同步数据报(SYN),它包含客户端发送数据的初始序列号。服务器端对在同一连接中发送的数据初始序号和对客户端发送的确认信息(ACK),都放在一个数据报中,一起发送给客户端。
(4)客户端也必须发送确认服务器端的同步数据报(SYN)。
由上面的步骤来看,建立一个TCP连接,至少需要服务器端和客户端进行三个分组数据的交换,因此,称之为TCP的三路握手(three-way handshake)。

            客户端                           服务器端
            connect()                        accept()
                      ---> SYN S ----->   
                      <--- SYN C
, ACK S+ 1  <---      
                      ---> ACK C+
1  ----->

第一次进行分组数据交换的过程中,分组数据中可能包含着本次通信中可能的TCP选项。这些选项有:
(1) 最大分组(MSS)选项。TCP发送的SYN中带有这个选项,用来告诉对方它的最大分组数据的大小MSS(Maximum Segment Size),即它能接收的每个TCP分组数据中的最大数据量。这个选项可以通过TCP_MAXSEG套接口选项获取与设置这个TCP选项。
(2) 窗口大小选项。这是TCP能提供流量控制的主要手段。TCP连接的每一方都有固定大小的缓冲空间,TCP的接收端只允许另一端发送接收端缓冲区所能接纳的数据。这将防止较快主机致使较慢主机的缓冲区溢出。TCP双方能够通知对方的最大窗口大小是64K(65535 bytes),因为TCP头部相应的标识字段值只用了16位来表示。每个套接口都有一个发送缓冲区和一个接收缓冲区,接收缓冲区被TCP和UDP用来将接收到的数据一直保存到由应用进程来读取。对于TCP,TCP通告另一端的窗口大小。 TCP套接口接收缓冲区不可能溢出,因为对方不允许发出超过所通告窗口大小的数据。这就是TCP的流量控制,如果对方无视窗口大小而发出了超过窗口大小的数据,则接收方TCP将丢弃它;而对于UDP,当套接口接收缓冲区放不下接收到的数据报时,此数据报就被丢弃。UDP是没有流量控制的,快的发送者可以很容易地就淹没慢的接收者,导致接收方的UDP丢弃数据报,使数据发生丢失。
(3)时间戳选项。时间戳选项使发送方在每个报文段中放置一个时间戳值。接收方在确认中返回这个数值,从而允许发送方为每一个收到的ACK计算RTT。

三、TCP连接的终止
终止TCP连接
TCP用三个分组数据建立一个连接,但要终止一个连接则通常需要需要四个分组数据。过程如下:
(1)先调用close的进程,称为主动关闭(active close)。这一端的TCP先发送一个FIN分组数据,告诉对方,数据发送完毕。
(2)接收到FIN分组数据的一端执行被动关闭(passive close),同时,发送对这个FIN的确认ACK分组数据给对方。确认序号为收到的序号加1。FIN分组数据的接收意味着在当前的连接上,再也不会收到额外的数据。
(3)接收到FIN分组数据的一端的应用进程,将调用close关闭自己的套接口,同时TCP 会发送一个FIN分组数据给另一端。
(4)收到这个FIN的分组数据,即执行主动关闭的一端对这个FIN分组数据进行确认。发回确认ACK分组数据,并将确认序号设置为收到序号加1

在这个过程中,执行被动关闭的一方可以把确认对方FIN分组数据的ACK分组数据和自己要发送的FIN分组数据可以放到一个分组数据中。TCP的连接终止的过程如下:

            客户端                           服务器端
            close()                          close()
                      ---> FIN S ----->   
                      <--- ACK S+
1  <---      
                      <--- FIN C   <---
                      ---> FIN C+
1  --->

四、TCP连的状态                 
TCP的连接的建立和终止,基本上已经清楚了,那么在这个过程中,是如何知道这个连接正处在什么状态呢?方法当然是有的,我们先运行如下命令,看看返回的结果:

[root@linux81 leaf]# netstat -an
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address           Foreign Address         State    
tcp        
0      0 0.0.0.0:3306            0.0.0.0:*               LISTEN    
tcp        
0      0 0.0.0.0:139             0.0.0.0:*               LISTEN    
tcp        
0      0 0.0.0.0:21              0.0.0.0:*               LISTEN    
tcp        
0      0 0.0.0.0:22              0.0.0.0:*               LISTEN    
tcp        
0      0 0.0.0.0:23              0.0.0.0:*               LISTEN    
tcp        
0      0 192.168.253.81:139      192.168.253.35:1201     ESTABLISHED
tcp        
0    272 192.168.253.81:22       192.168.253.59:1776     ESTABLISHED
udp        
0      0 192.168.253.81:137      0.0.0.0:*                         
udp        
0      0 0.0.0.0:137             0.0.0.0:*                         
udp        
0      0 192.168.253.81:138      0.0.0.0:*                         
udp        
0      0 0.0.0.0:138             0.0.0.0:*                         
udp        
0      0 127.0.0.1:36260         0.0.0.0:*          

在上面的返回结果中,State一列,就是说明连接的当前状态。
TCP的连接状态有:
(01)CLOSED  
(02)LISTEN    被动打开
(03)SYN_RCVD  
(04)SYN_SEND
(05)ESTABLISHED   数据传送状态
(06)CLOSE_WAIT
(07)LAST_ACK   被动关闭
(08)FIN_WAIT_1
(09)FIN_WAIT_2
(10)CLOSING
(11)TIME_WAIT

TCP连接状态转换示意图如下所示:

                              +---------+ ---------\      active OPEN
                              |  CLOSED |            \    -----------
                              +---------+<---------\   \   create TCB
                                |     ^              \   \  snd SYN  
                   passive OPEN |     |   CLOSE        \   \         
                   ------------ |     | ----------       \   \       
                    create TCB  |     | delete TCB         \   \     
                                V     |                      \   \   
                              +---------+            CLOSE    |    \ 
                              |  LISTEN |          ---------- |     |
                              +---------+          delete TCB |     |
                   rcv SYN      |     |     SEND              |     |
                  -----------   |     |    -------            |     V
+---------+      snd SYN
,ACK  /       \   snd SYN          +---------+
|         |<-----------------           ------------------>|         |
|   SYN   |                    rcv SYN                     |   SYN   |
|   RCVD  |<-----------------------------------------------|   SENT  |
|         |                    snd ACK                     |         |
|         |------------------           -------------------|         |
+---------+   rcv ACK of SYN  \       /  rcv SYN
,ACK       +---------+
   |           --------------   |     |   -----------                
   |                  x         |     |     snd ACK                  
   |                            V     V                              
   |  CLOSE                   +---------+                            
   | -------                  |  ESTAB  |                            
   | snd FIN                  +---------+                            
   |                   CLOSE    |     |    rcv FIN                   
   V                  -------   |     |    -------                   
+---------+          snd FIN  /       \   snd ACK          +---------+
|  FIN    |<-----------------           ------------------>|  CLOSE  |
| WAIT-
1  |------------------                              |   WAIT  |
+---------+          rcv FIN  \                            +---------+
   | rcv ACK of FIN   -------   |                            CLOSE  |
   | --------------   snd ACK   |                           ------- |
   V        x                   V                           snd FIN V
+---------+                  +---------+                   +---------+
|FINWAIT-
2|                  | CLOSING |                   | LAST-ACK|
+---------+                  +---------+                   +---------+
   |                rcv ACK of FIN |                 rcv ACK of FIN |
   |  rcv FIN       -------------- |    Timeout
=2MSL -------------- |
   |  -------              x       V    ------------        x       V
    \ snd ACK                 +---------+delete TCB         +---------+
     ------------------------>|TIME WAIT|------------------>| CLOSED  |
                              +---------+                   +---------+

                      TCP Connection State Diagram

从上面的图表中,可以做出如下总结:
服务器端的正常状态转换过程如下:
  CLOSED --> LISTEN --> SYN_RCVD --> ESTABLISHED --> CLOSE_WAIT --> LAST_ACK --> CLOSED
客户端的正常状态转换过程如下:
CLOSED --> SYN_SENT --> ESTABLISHED --> FIN_WAIT_1 --> FIN_WAIT_2 --> TIME_WAIT --> CLOSED
从上面的连接状态转换中可以看出,从ESTABLISHED状态的转换有两种,对于客户端和服务器端来说,是一样的,即当收到FIN数据报之前,主动关闭,则转换成FIN_WAIT_1;如果因为收到FIN数据报,而引起的被动关闭,则转换成CLOSE_WAIT状态。

posted @ 2009-02-09 18:11 ideame 阅读(2444) | 评论 (1)编辑 收藏

group install gnome

Install:

yum grouplist

sudo yum groupinstall "X Window System" "GNOME Desktop Environment"

or

sudo mount /dev/cdrom /media/cdrom

sudo yum --disablerepo=\* --enablerepo=c5-media groupinstall "X Window System" "GNOME Desktop Environment"


Error:

Missing Dependency: libgaim.so.0 is needed by package nautilus-sendto 

more detail: https://bugzilla.redhat.com/show_bug.cgi?id=250403

Resolved:

wget http://mirror.centos.org/centos/5/os/i386/CentOS/nautilus-sendto-0.7-5.fc6.i386.rpm ~

sudo rpm -Uvh --nodeps ~/nautilus-sendto-0.7-5.fc6.i386.rpm

 

repeat install.

 

posted @ 2009-02-09 15:38 ideame 阅读(318) | 评论 (0)编辑 收藏

Creating A Local Yum Repository (CentOS)


Creating A Local Yum Repository (CentOS)
摘自: www.howtoforge.com


Author & Content of this howto, Tim Haselaars (http://www.trinix.be)

Sometimes it can be handy to set up your own repository to prevent from downloading the remote repository over and over again. This tutorial shows how to create a CentOS mirror for your local network. If you have to install multiple systems in your local network then all needed packages can be downloaded over the fast LAN connection, thus saving your internet bandwidth.

Create the Directories:

mkdir -pv /var/www/html/centos/{base,updates}


The Base Repository

Copy the RPMs from the CDs/DVD to /var/www/html/centos/base.

Create the base repository headers:

createrepo /var/www/html/centos/base


The Updates Repository

Select an rsync mirror for updates: check out this list of aviable mirrors: Centos OS Mirror list and these are identified with rsync.

For example: rsync://ftp.belnet.be/packages/centos/

The mirrors share a common structure for updates. Simply append /updates//.

Rsync to create the updates-released repository:

rsync -avrt rsync://ftp.belnet.be/packages/centos/5.0/updates/i386 \ --exclude=debug/ /var/www/html/centos/updates

This will create a complete update repository at /var/www/html/centos/updates/i386. The repodata directory will be created with all of the headers.

Next I would advise to setup a cron job to run the rsync (above). In this manner your repository is kept updated and only new updates and headers will be downloaded to your repository.


Yum Configuration

Edit yum.conf:

vi /etc/yum.repos.d/CentOS-Base.repo

[base]
name=CentOS-$releasever - Base
baseurl=http://192.168.*.*/centos/$releasever/os/$basearch/
#mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=os
#baseurl=http://mirror.centos.org/centos/$releasever/os/$basearch/
gpgcheck=1
gpgkey=http://mirror.centos.org/centos/RPM-GPG-KEY-CentOS-5

#released updates
[update]
name=CentOS-$releasever - Updates
baseurl=http://192.168.*.*/centos/$releasever/updates/$basearch/
#mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=updates
#baseurl=http://mirror.centos.org/centos/$releasever/updates/$basearch/
gpgcheck=1
gpgkey=http://mirror.centos.org/centos/RPM-GPG-KEY-CentOS-5

That's it.

Powered by ScribeFire.

posted @ 2009-01-14 15:59 ideame 阅读(593) | 评论 (0)编辑 收藏

Linux设置DNS和主机名

Linux设置DNS和主机名

操作过程

配置文件位于:

/etc/sysconfig/network-scripts/ifcfg-eth0

DEVICE=eth0
ONBOOT=yes
BOOTPROTO=static
IPADDR=192.168.0.3
NETMASK=255.255.255.0
GATEWAY=192.168.0.1

使IP地址生效:

/sbin/ifdown eth0 /sbin/ifup eth0 

配置dns解析

echo "nameserver 211.98.1.28">> /etc/resolv.conf 

通知网关更新信息:

/etc/init.d/network restart 

DNS 简介

  DNS就是Domain Name System,它能够把形如www.21php.com这样的域名转换为211.152.50.35这样的IP地址;没有DNS,浏览21php.com 这个网站时,就必须用211.152.50.35这么难记的数字来访问。提供DNS服务的就是DNS服务器。DNS服务器可以分为三种,高速缓存服务器 (Cache-only server)、主服务器(Primary Name server)、辅助服务器(Second Name Server)。  DNS的详细原理、工作流程、术语、概念,限于篇幅,这里就不说了。可以阅读专门的文章,如DNS-HOWTO加以了解。

配置主DNS服务器

首先我们做以下假设:

  • A服务器为21php.com的主域名服务器,其IP地址为11.0.0.1
  • B服务器为21php.com的辅助域名服务器,其IP地址为11.0.0.2;

下面我们配置服务器11.0.0.1为 21PHP.COM 的主 DNS 服务器。Linux下的dns功能是通过bind软件实现的。bind软件安装后,会产生几个固有文件,分为两类,一类是配置文件在 /etc 目录下,一类是dns记录文件在 /var/named 目录下。加上其他相关文件,共同设置dns服务器。下面是所有和dns设置相关文件的列表与说明。

位于/etc目录下的有:

  • hosts
  • host.conf
  • resolv.conf
  • named.boot
  • named.conf

具体说明:

  1. hosts

    定义了主机名和ip地址的对应,其中也有将要运行dns这台电脑的ip地址和主机名。内容:

    127.0.0.1 localhost.localdomain localhost 
  2. host.conf “order hosts bind”语句,指定了对主机名的解析顺序是先到hosts中查找,然后到dns服务器的记录里查找。 “multi on”则是允许一个主机名对应多个ip地址。内容:

    order hosts, bind 
    multi on
    nospoof on
  3. “resolv.conf”

    “nameserver 10.0.0.211”指定了dns服务器的地址。注意,这个文件对普通非dns服务器的电脑(非windows的系统;Windows系统是在“网络属性”中设置这项的)来说,是必不可少的。你如果没有设置本机为dns服务器,你又要能够解析域名,就必须指定一个dns服务器的地址。你可以最多写上三个地址,作为前一个失败时的候选dns服务器。“domain zrs.com”指定默认的域。内容:

    domain 21php.com
    nameserver 11.0.0.1
  4. named.boot

    文件是早期版本的bind软件使用的配置文件,现在新版本中已经让位于“named.conf”。named.conf是 dns 服务器配置的核心文件。

    下面我们一段一段的来解说。

    # named.conf - configuration for bind # 
    # Generated automatically by bindconf, alchemist et al.

    controls {
    inet 127.0.0.1 allow {
    localhost;
    } keys {
    rndckey;
    };
    };
    include "/etc/rndc.key";
    options {
    directory "/var/named/";
    };
    zone "." {
    type hint;
    file "named.ca";
    };
    zone "0.0.127.in-addr.arpa" {
    type master;
    file "0.0.127.in-addr.arpa.zone";
    };
    zone "localhost" {
    type master;
    file "localhost.zone";
    };
    zone "21php.com" {
    type master; notify yes; file "21php.com";
    };

    上文中#为注释符号, 其他各行含义如下:

    diretory /var/named 

    指定named从 /var/named 目录下读取DNS数据文件,这个目录用户可自行指定并创建,指定后所有的DNS数据文件都存放在此目录下;

    zone "." { type hint; file "named.ca"; }; 

    指定named从 named.ca 文件中获得Internet的顶层“根”服务器地址 。

    zone "0.0.127.in-addr.arpa" {
    type master;
    file "0.0.127.in-addr.arpa.zone";
    };

    指定named作为127.0.0网段地址转换主服务器,named.local文件中包含了127.0.0.*形式的地址到域名的转换数据(127.0.0网段地址是局域网接口的内部 loopback地址);

    zone "localhost" { type master; file "localhost.zone"; }; 

    指定包含localhost的DNS文件数据存放在/var/named/localhost.zone中;

    zone "21php.com" { type master; notify yes; file "21php.com.zone"; }; 

    以上语句表明域21php.com的DNS数据存放在/var/named/目录下的21php.com.zone中;用文本编辑器打开/var/named/21php.com.zone,其内容如下:

    $TTL 86400 
    @ IN SOA @ root.localhost ( 2 ; serial 28800 ; refresh 7200 ; retry 604800 ; expire 86400 ; ttl )
    @ IN NS localhost
    www IN A 11.0.0.233
    www2 IN A 11.0.0.23
    forum IN A 11.0.0.10
    @ IN MX 5 mail.21php.com.

    该文件的前部分是相应的参数设置,此部分不需要改动,后面的部分就是具体的DNS数据;例如:

    www IN A 11.0.0.233 # 将www.21php.com 解析到地址11.0.0.233;
    www2 IN A 11.0.0.23 # 将www2.21php.com 解析到地址11.0.0.23;
    club IN A 11.0.0.10 # 将club.21php.com 解析到地址11.0.0.10;

配置辅助DNS服务器

辅助DNS服务器,可从主服务器中转移一整套域信息。区文件是从主服务器中转移出来的,并作为本地磁盘文件存储在辅助服务器中。在辅助服务器中有域信息的完整拷贝,所以也可以可以回答对该域的查询。这部分的配置内容如下:

zone "21php.com" IN {
type slave;
file "21php.com.zone";
masters {
11.0.0.1;
};
};

可以看到,和主DNS服务器不同地方就是:“type”改为了“slave”,然后指明了主DNS服务器的地址masters { 11.0.0.1; };。DNS服务启动时,就会自动连接11.0.0.1,读取21php.com域的信息,然后保存到本机的21php.com.zone文件里。

测试DNS服务器

改动过DNS的相应文件,用“ndc restart”命令重新启动服务,在redhat 7.1以上版本中使用命令:

/etc/rc.d/init.d/named restart 

或者

/etc/rc.d/init.d/named reload 

使改动生效。

要测试DNS,可以找一台客户机,把它的DNS地址设成新建立的DNS服务器地址,然后试试上网,收信,下载等。也可以使用nslookup命令:运行nslookup,输入要查询的主机名,看是否返回正确的ip地址,在redhat 7.1以上版本中推荐使用dig命令。

posted @ 2009-01-14 15:59 ideame 阅读(8721) | 评论 (0)编辑 收藏

仅列出标题
共4页: 上一页 1 2 3 4 下一页