<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    java思維

    正在學(xué)習(xí)中:(

    2005年10月12日 #

    bcb6 中安裝 boost

    正則表達(dá)式是一種模式匹配形式,它通常用在處理的文本程序中。比如我們經(jīng)常使用的grep工具,還是perl語言都使用了正則表達(dá)式。傳統(tǒng)的C++處理正則表達(dá)式是非常麻煩的,這也成為很多其他語言愛好者的笑柄,現(xiàn)在情況不一樣了,因?yàn)橛辛薭oost。
    Boost是一個(gè)基于Template的開發(fā)源代碼庫,在這個(gè)庫中有很多子庫用來高效處理各方面的問題,比如字符串拆分,格式化,線程等等,Boost對于每一個(gè)C++愛好者都是應(yīng)該了解的,對于C++ Builder用戶如果能在熟練使用VCL的情況下再熟練使用Boost,我想一定如虎添翼。
    一般來說,使用Boost是非常簡單,和使用其他STL庫沒有太大區(qū)別,但使用Boost的正則表達(dá)式庫則不那么容易,因?yàn)檫@個(gè)庫還需要我們單獨(dú)編譯,下面我將詳細(xì)介紹如何使用。
    如果你還不知道或者還沒有Boost的話,你可以去www.boost.org下載最新版本,作者使用的是1.30版本。將下載下來的zip包[1]解壓到任何你喜歡的目錄,比如D:\boost。
    編譯正則表達(dá)式庫
    前面已經(jīng)提到,這個(gè)庫需要我們單獨(dú)編譯才能使用,為什么不編譯好一起發(fā)布呢?主要是考慮到不同的編譯器需要不同的鏈接庫文件和鏈接庫太大了。在命令行下,進(jìn)入[%Boost]\Libs\RegEx\Build目錄,直接敲入make –fbcb6.mak命令開始編譯,這里請大家注意了,如果你的計(jì)算機(jī)上同時(shí)安裝了BCB5,請一定要把path設(shè)置成為BCB6的bcc32.exe程序所在的目錄,否則可能使用BCB5的make程序,這樣雖然能編譯但最后不能使用。
    編譯過程相當(dāng)耗時(shí),你需要耐心等待,最終編譯完成,會在[%Boost]\Libs\RegEx\Build目錄生成一個(gè)BCB6目錄,在這個(gè)目錄生成了很多l(xiāng)ib文件和dll文件,把所有dll文件復(fù)制到windows系統(tǒng)目錄,所以lib文件復(fù)制到bcb6\lib目錄。如果你不想這么麻煩的復(fù)制文件,可以在編譯時(shí)加入install參數(shù),就像這樣make –fBcb6.mak install,不過作者還是比較喜歡前一種方式,這樣我可以知道到底生成了什么文件。現(xiàn)在編譯已經(jīng)完成了,你可以體現(xiàn)boost的神奇魅力了。
    #include<deque>
    #include<iostream>
    #include<algorithm>
    #include<boost/regex.hpp>
    int main()
    {
    using namespace boost;
    using namespace std;
    regex expression("\\s+href\\s*=\\s*\"([^\"]*)\"",regbase::normal|regbase::icase);
    string s="<a href=\"index.html\"><img src=\"logo.gif\"></a>";
    deque<string> result;
    regex_split(std::back_inserter(result),s,expression);
    copy(result.begin(),result.end(),ostream_iterator<string>(cout,"\n"));
    int c;
    cin>>c;
    return 0;
    }
    設(shè)置BCB6 Project屬性的Lib Path和Include Path為你安裝boost的目錄,運(yùn)行你會看到結(jié)果:
    index.html
    可以看到index.html已經(jīng)從字符串中提出出來了,那么為什么會是這樣呢?
    代碼的核心部分是:
    regex expression("\\s+href\\s*=\\s*\"([^\"]*)\"",regbase::normal|regbase::icase);
    它用來設(shè)置如何匹配字符串,上面亂七八糟的字符串很難看懂,如果不了解正則表達(dá)式的書寫規(guī)則,上
    面代碼可以和天書媲美。
    regbase::normal|regbase::icase 是解析參數(shù)設(shè)置,具體可以參考boost幫助文檔。
    正則表達(dá)式的書寫規(guī)則
    具體的書寫規(guī)則,大家可以參看boost的文檔,我這里做一下簡要說明:
    . (dot)
    用來匹配任何一個(gè)字符,但不包括新行上的字符
    *
    閉包,任意有限次的自重復(fù)連接
    +
    有限次自重復(fù)連接,但至少出現(xiàn)一次
    {}
    指定可能的重復(fù)次數(shù)
    例如:
    ba* 匹配 b ba baa baaa等
    ba+ 匹配 ba baa baaaaaaaaa等
    ba{1,5} 匹配 ba baa baaa baaaa baaaaa
    \
    轉(zhuǎn)義字符,有很多用途,根據(jù)參數(shù)設(shè)置而變化,最常見的就是類似于c語言\的用法
    \s
    匹配空格
    \w
    匹配一個(gè)單詞
    \d
    匹配數(shù)字
    ()
    有兩種用法:
    1是合并的作用,例如(ab)*匹配ab abab ababab等
    2是確定匹配,也就是說在()中的字符將被最終拆解出來
    根據(jù)上面這張表,我們可以很容易知道前面的那段天書如何解釋。
    一個(gè)實(shí)際的例子
    前一段時(shí)間在CSDN上有一篇帖子,問題是有一種文件結(jié)構(gòu)如(類似):
    @People{
    Age=19
    Speek=”Hay,{name},how are you”
    }
    問如何拆分字符串得到@后面的名字,=兩邊的屬性名和屬性值,引號里{}種的名字。
    解決這個(gè)問題用正則表達(dá)式再合適不過了。
    根據(jù)分析,我們可以這樣構(gòu)造匹配規(guī)則:
    "@(.*?)\s*\\{" 匹配@開始的字符創(chuàng),后面兩種類型如何構(gòu)造匹配規(guī)則留給大家思考吧。
    這樣我們可以輕易拆解這個(gè)例子。

    性能分析
    通過上面的討論,大家已經(jīng)了解到boost的強(qiáng)大威力,那個(gè)性能又如何呢?為此我們再實(shí)際來拆分一個(gè)
    復(fù)雜的html代碼,看看到底需要花費(fèi)多少時(shí)間。
    為了節(jié)省篇幅,這里就不列出html代碼了,不過可以告訴大家,這是一個(gè)又Word生成的大小為186K
    的html文件,這個(gè)文件中用到了很多<table>標(biāo)簽,所以我這里測試就來拆分所有<table>標(biāo)簽的
    width屬性。測試代碼如下:
    #include<deque>
    #include<iostream>
    #include<algorithm>
    #include<boost/regex.hpp>
    #include<vcl.h>
    int main()
    {
     using namespace boost;
     using namespace std;
     TStringList* html=new TStringList();
     html->LoadFromFile("D:\\1.htm");
     regex expression("\\s+width=([^\"]*)\s+",regbase::normal|regbase::icase);
    DWORD start=GetTickCount();
     for(int n=0;n<html->Count;n++)
     {
        string s=html->Strings[n].c_str(); 
        deque<string> result;
        regex_split(std::back_inserter(result),s,expression);
    copy(result.begin(),result.end(),ostream_iterator<string>(cout,"\n"));
    result.clear();
    }
     start=GetTickCount()-start;
     delete html;
     cout<<start;
    int c;
     cin>>c;
     return 0;
    }
    輸出結(jié)果為671毫秒,拆分得到1072個(gè)width屬性值,我們可以看到boost的效率是非常高的,雖然與一些角本語言比起來解析速度還是慢,但已經(jīng)可以滿足大多數(shù)編程要求了。另外作者的計(jì)算機(jī)配置并不是非常高,相信拿到現(xiàn)在任何一臺主流配置的計(jì)算機(jī)上都會優(yōu)于作者的結(jié)果。
    結(jié)束語

    其實(shí)上面的強(qiáng)大威力只是boost的冰山一角,如果你不自己去體會,你很難想象到boost的強(qiáng)大威力。在boost里還有很多使用的庫,比如格式化輸出,字符串拆解,類型轉(zhuǎn)換等,這些庫使用起來也比較方便,大家可以自行參考boost文檔。在這些庫中還有兩個(gè)庫需要自行編譯,他們是Python和thread庫,而且這些庫的編譯需要專門的工具Jam,所以我們在編譯這些庫的時(shí)候還要編譯jam工具,而編譯jam工具也不是一件快樂的事情,麻煩同樣出現(xiàn)在如果你安裝了多個(gè)編譯器,如果讀者有興趣可以自己試一下。
    不過BCB6并不支持全部boost庫,從boost提供的編譯器支持表可以看到[2],BCB6還是有相當(dāng)多的庫不支持的,支持最好的是gcc/g++的編譯器,但也不是全部支持。希望borland下一個(gè)將要發(fā)布的C++編譯器可以支持更多C++標(biāo)準(zhǔn)。
    [1] 其實(shí)還有其他類型的包,但在windows系統(tǒng)下,你最好下載zip包
    [2] Boost提供的編譯器支持表是針對BCB5的,對于BCB6的支持作者并沒有詳細(xì)測試,如果讀者有興趣可以自己測試boost附帶的測試代碼。

    posted @ 2008-12-07 21:22 john 閱讀(875) | 評論 (0)編輯 收藏

    RedHat LinuxAS4 cvs 服務(wù)器搭建步驟

    根據(jù)網(wǎng)上各種文檔整理而成.=號兩邊要空格的問題折磨了我好久.

     

    1:安裝

    先檢查是否安裝CVS包

    #>rpm -qa|grep cvs

    沒有安裝的話,用下面2種方法安裝

    (1):在安裝linux的時(shí)候可以選擇安裝CVS包
    (2):另外下載CVS RPM包 自行安裝

    2:建立cvs用戶和組

    #> groupadd cvs
    #> useradd -g cvs -G cvs –d /cvsroot cvsroot
    #> passwd cvsroot

    更改目錄屬性
    chmod –R 770 /cvsroot

    3:建立CVS服務(wù)

    #more /etc/services | grep cvspserver

    看看是否有
    cvspserver 2401/tcp #CVS client/server operations
    cvspserver 2401/udp #CVS client/server operations

    如果沒有需要到/etc/service文件中增加

    建立#vi /etc/xinet.d/cvspserver 文件內(nèi)容如下

    service cvspserver
    {
    disable = no
    flags = REUSE
    socket_type = stream
    wait = no
    user = root
    server = /usr/bin/cvs
    server_args = -f --allow-root=/cvsroot pserver
    }

    該文件有特別要注意的地方,所有=號兩邊都需要空一個(gè)空格,除了"root=/cvsroot" 所有要空格的地方,不要多加空格.否則會有CVS服務(wù)不能啟動的問題

    切換到cvsroot用戶

    #cvs -d /cvsroot init

    然后重新啟動xinetd服務(wù)或者重啟動機(jī)器

    #service xinetd restart

    然后用

    #netstat -l | grep cvspserver
    or
    #netstat -l | grep 2401

    看是否有下面tcp 0 0 *:cvspserver *:* LISTEN

    說明已經(jīng)正常啟動,沒有的話請重新檢查配置過程是否有錯(cuò)誤或者遺漏。最后還必須檢查防火墻的設(shè)置,把2401端口打開。

    4:用戶管理

    CVS默認(rèn)使用系統(tǒng)用戶登錄,所有系統(tǒng)用戶都可以登陸,但是這樣對系統(tǒng)不安全,我們需要獨(dú)立的用戶管理.CVS用戶名和密碼保存在CVSROOT目錄下的passwd文件中.格式

    用戶名:密碼:系統(tǒng)用戶

    #htpasswd passwd username

    用來設(shè)置用戶密碼并保存到passwd文件中.

    然后需要關(guān)閉系統(tǒng)用戶登陸使用cvs的權(quán)限,CVSROOT目錄下的config文件,把#SystemAuth=no的#去掉就可以了.

    測試登陸

    #cvs -d “:pserver:username@127.0.0.1:/cvsroot” login

    ok

     

    5 :源代碼倉庫的備份和移動
    基本上,CVS的源代碼倉庫沒有什么特別之處,完全可以用文件備份的方式進(jìn)行備份。需要注意的只是,應(yīng)該確認(rèn)備份的過程中沒有用戶提交修改,具體的做法可以是停止CVS服務(wù)器或者使用鎖等等。恢復(fù)時(shí)只需要把這些文件按原來的目錄結(jié)構(gòu)存放好,因?yàn)镃VS的每一個(gè)模塊都是單獨(dú)的一個(gè)目錄,與其他模塊和目錄沒有任何瓜葛,相當(dāng)方便。甚至只需要在倉庫中刪除一個(gè)目錄或者文件,便可以刪除該模塊的一些內(nèi)容,不過并不建議這么做,使用CVS的刪除功能將會有一個(gè)歷史記錄,而對倉庫的直接刪除不留任何痕跡,這對項(xiàng)目管理是不利的。移動倉庫與備份相似,只需要把該模塊的目錄移動到新的路徑,便可以使用了。
    如果不幸在備份之后有過一些修改并且執(zhí)行了提交,當(dāng)服務(wù)器出現(xiàn)問題需要恢復(fù)源代碼倉庫時(shí),開發(fā)者提交新的修改就會出現(xiàn)版本不一致的錯(cuò)誤。此時(shí)只需要把CVS相關(guān)的目錄和文件刪除,即可把新的修改提交。

    6.更進(jìn)一步的管理
    CVSROOT目錄下還有很多其他功能,其中最重要的就是modules文件。這個(gè)文件定義了源代碼庫的模塊,下面是一個(gè)例子:

    代碼:
    Linux    Linux
    Kernel   Linux/kernel


    這個(gè)文件的內(nèi)容按行排列,每一行定義一個(gè)模塊,首先是模塊名,然后是模塊路徑,這是相對于CVS根目錄的路徑。它定義了兩個(gè)模塊,第一個(gè)是Linux模塊,它位于Linux目錄中,第二個(gè)是Kernel模塊,這是Linux模塊的子模塊。
    modules文件并非必須的,它的作用相當(dāng)于一個(gè)索引,部分CVS客戶端軟件通過它可以快速找到相應(yīng)的模塊,比如WinCVS。

    7.協(xié)同開發(fā)的問題
    默認(rèn)方式下,CVS允許多個(gè)用戶編輯同一個(gè)文件,這對一個(gè)協(xié)作良好的團(tuán)隊(duì)來說不會有什么問題,因?yàn)槎鄠€(gè)開發(fā)者同時(shí)修改同一個(gè)文件的同一部分是不正常的,這在項(xiàng)目管理中就應(yīng)該避免,出現(xiàn)這種情況說明項(xiàng)目組內(nèi)部沒有統(tǒng)一意見。而多個(gè)開發(fā)者修改文件的不同部分,CVS可以很好的管理。
    如果覺得這種方式難以控制,CVS也提供了解決辦法,可以使用cvs admin -l進(jìn)行鎖定,這樣一個(gè)開發(fā)者正在做修改時(shí)CVS就不會允許其他用戶checkout。這里順便說明一下文件格式的問題,對于文本格式,CVS可以進(jìn)行歷史記錄比較、版本合并等工作,而二進(jìn)制文件不支持這個(gè)操作,比如word文檔、圖片等就應(yīng)該以二進(jìn)制方式提交。對于二進(jìn)制方式,由于無法進(jìn)行合并,在無法保證只有一個(gè)用戶修改文件的情況下,建議使用加鎖方式進(jìn)行修改。必須注意的是,修改完畢記得解鎖。
    從1.6版本開始,CVS引入了監(jiān)視的概念,這個(gè)功能可以讓用戶隨時(shí)了解當(dāng)前誰在修改文件,并且CVS可以自動發(fā)送郵件給每一個(gè)監(jiān)視的用戶告知最新的更新。

    8.建立多個(gè)源代碼倉庫
    如果需要管理多個(gè)開發(fā)組,而這些開發(fā)組之間不能互相訪問,可以有2個(gè)辦法:
    a.共用一個(gè)端口,需要修改cvspserver文件,給server_args指定多個(gè)源代碼路徑,即多個(gè)—allow-root參數(shù)。由于xinetd的server_args長度有限制,可以在cvspserver文件中把服務(wù)器的設(shè)置重定向到另外一個(gè)文件,如:

    代碼:
    server = /home/cvsroot/cvs.run


    然后創(chuàng)建/home/cvsroot/cvs.run文件,該文件必須可執(zhí)行,內(nèi)容格式為:

    代碼:
    #!/bin/bash
    /usr/bin/cvs -f \
    --allow-root=/home/cvsroot/src1 \
    --allow-root=/home/cvsroot/src2 \
    pserver


    注意此時(shí)源代碼倉庫不再是/home/cvsroot,進(jìn)行初始化的時(shí)候要分別對這兩個(gè)倉庫路徑進(jìn)行初始化,而不再對/home/cvsroot路徑進(jìn)行初始化。
    b.采用不同的端口提供服務(wù)
    重復(fù)第2步和第3步,為不同的源代碼倉庫創(chuàng)建不同服務(wù)名的啟動腳本,并為這些服務(wù)名指定不同的端口,初始化時(shí)也必須分別進(jìn)行初始化。
     
     

     

     

    posted @ 2008-05-25 02:04 john 閱讀(427) | 評論 (0)編輯 收藏

    Oracle 內(nèi)存分配建議


     Oracle 內(nèi)存分配建議
    關(guān)于SGA設(shè)置的一點(diǎn)總結(jié)
    本總結(jié)不針對特例,僅對服務(wù)器只存在OS + ORACLE 為例,如果存在其他應(yīng)用請酌情考慮
    寫這個(gè)也是因?yàn)榻鼇磉@種重復(fù)性的問題發(fā)生的太多所導(dǎo)致的

    首先不要迷信STS,SG,OCP,EXPERT 等給出的任何建議、內(nèi)存百分比的說法
    基本掌握的原則是, data buffer 通常可以盡可能的大,shared_pool_size 要適度,log_buffer 通常大到幾百K到1M就差不多了

    設(shè)置之前,首先要明確2個(gè)問題
    1: 除去OS和一些其他開銷,能給ORACLE使用的內(nèi)存有多大
    2:oracle是64bit or 32 bit,32bit 通常 SGA有 1.7G 的限制(某些OS的處理或者WINDOWS上有特定設(shè)定可以支持到2G以上甚至達(dá)到3.7G,本人無這方面經(jīng)驗(yàn))

    下面是我的windows2000下的oracle :

    SQL> select * from v$version;

    BANNER
    ----------------------------------------------------------------
    Oracle8i Enterprise Edition Release 8.1.7.0.0 - Production
    PL/SQL Release 8.1.7.0.0 - Production
    CORE 8.1.7.0.0 Production
    TNS for 32-bit Windows: Version 8.1.7.0.0 - Production
    NLSRTL Version 3.4.1.0.0 - Production

    SQL>

    windows上存在32bit的限制,如AIX、HP UNIX 等有明確的64BIT OS and ORACLE的版本,32bit oracle可以裝在64bit os 上,64 bit oracle不能裝在32 bit OS上

    不管oracle是32 bit ORACLE還是 64 bit 的,假定應(yīng)用存在沒有很好的使用bind var 的情況,也不能設(shè)置 shared_pool_size 過大,通常應(yīng)該控制在200M--300M,如果是 ORACLE ERP 一類的使用了很多存儲過程函數(shù)、包 ,或者很大的系統(tǒng),可以考慮增大shared_pool_size ,但是如果超過500M可能是危險(xiǎn)的,達(dá)到1G可能會造成CPU的嚴(yán)重負(fù)擔(dān),系統(tǒng)甚至癱瘓。所以shared_pool_size 如果超過300M還命中率不高,那么應(yīng)該從應(yīng)用上找原因而不是一味的增加內(nèi)存,shared_pool_size 過大主要增加了管理負(fù)擔(dān)和latch 的開銷。

    log_buffer : 128K ---- 1M 之間通常問題不大,不應(yīng)該太大

    large_pool_size :如果不設(shè)置MTS,通常在 RMAN 、OPQ 會使用到,但是在10M --- 50M 應(yīng)該差不多了。假如設(shè)置 MTS,則由于 UGA 放到large_pool_size 的緣故,這個(gè)時(shí)候依據(jù) session最大數(shù)量和 sort_ares_size 等參數(shù)設(shè)置,必須增大large_pool_size 的設(shè)置,可以考慮為 session * (sort_area_size + 2M)。這里要提醒一點(diǎn),不是必須使用MTS,我們都不主張使用MTS,尤其同時(shí)在線用戶數(shù)小于500的情況下。

    java_pool_size : 若不使用java,給30M通常就夠了

    data buffer ,在做了前面的設(shè)置后,凡可以提供給oracle的內(nèi)存,都應(yīng)該給data buffer = (db_block_size * db_block_buffers)
    在9i 中可以是 db_cache_size

    還有2個(gè)重要參數(shù)我們需要注意

    sort_area_size and hash_area_size
    這兩個(gè)參數(shù)在非MTS下都是屬于PGA ,不屬于SGA,是為每個(gè)session單獨(dú)分配的,在我們的服務(wù)器上除了OS + SGA,一定要考慮這兩部分

    (****) : OS 使用內(nèi)存+ SGA + session*(sort_area_size + hash_area_size + 2M) < 總物理RAM 為好


    這樣歸結(jié)過來,假定oracle是 32 bit ,服務(wù)器RAM大于2G ,注意你的PGA的情況,,則建議

    shared_pool_size + data buffer +large_pool_size + java_pool_size < 1.6G


    再具體化,注意滿足上面(****) 的原則的基礎(chǔ)上可以參考如下設(shè)置
    如果512M RAM
    建議 shared_pool_size = 50M, data buffer = 200M

    如果1G RAM
    shared_pool_size = 100M , data buffer = 500M

    如果2G
    shared_pool_size = 150M ,data buffer = 1.2G

    物理內(nèi)存再大已經(jīng)跟參數(shù)沒有關(guān)系了


    假定64 bit ORACLE

    內(nèi)存4G
    shared_pool_size = 200M , data buffer = 2.5G

    內(nèi)存8G
    shared_pool_size = 300M , data buffer = 5G

    內(nèi)存 12G
    shared_pool_size = 300M-----800M , data buffer = 8G



    以上僅為參考值,不同系統(tǒng)可能差異比較大,需要根據(jù)具體情況調(diào)整。建議在設(shè)置參數(shù)的同時(shí),init中使用 lock_sga ,在不同的平臺上可能有不同的方式,使得SGA鎖定在物理內(nèi)存中而不被放入 SWAP 中,這樣對效率有好處


    關(guān)于內(nèi)存的設(shè)置,要再進(jìn)行細(xì)致的調(diào)整,起的作用不大,但可根據(jù)statspack信息和v$system_event,v$sysstat,v$sesstat,v$latch 等view信息來考慮微調(diào)

    posted @ 2008-01-28 23:58 john 閱讀(795) | 評論 (0)編輯 收藏

    Oracle 回滾段空間回收步驟

         摘要:   是誰"偷偷的"用了那么多空間呢(本來有幾十個(gè)G的Free磁盤空間的)? 檢查數(shù)據(jù)庫表空間占用空間情況: SQL> select tablespace_name,sum(bytes)/1024/1024/1024 GB  2 from dba...  閱讀全文

    posted @ 2007-12-27 00:50 john 閱讀(2252) | 評論 (1)編輯 收藏

    常用的MQ命令

    最近在配置MQ,記下了一些常用的MQ命令,如下:

    創(chuàng)建隊(duì)列管理器
    crtmqm –q QMgrName
    -q是指創(chuàng)建缺省的隊(duì)列管理器

    刪除隊(duì)列管理器
    dltmqm QmgrName

    啟動隊(duì)列管理器
    strmqm QmgrName
    如果是啟動默認(rèn)的隊(duì)列管理器,可以不帶其名字

    停止隊(duì)列管理器
    endmqm QmgrName 受控停止

    endmqm –i QmgrName 立即停止

    endmqm –p QmgrName 強(qiáng)制停止

    顯示隊(duì)列管理器
    dspmq –m QmgrName

    運(yùn)行MQ命令
    runmqsc QmgrName
    如果是默認(rèn)隊(duì)列管理器,可以不帶其名字

    往隊(duì)列中放消息
    amqsput QName QmgrName
    如果隊(duì)列是默認(rèn)隊(duì)列管理器中的隊(duì)列,可以不帶其隊(duì)列管理器的名字

    從隊(duì)列中取出消息
    amqsget QName QmgrName
    如果隊(duì)列是默認(rèn)隊(duì)列管理器中的隊(duì)列,可以不帶其隊(duì)列管理器的名字

    啟動通道
    runmqchl –c ChlName –m QmgrName

    啟動偵聽
    runmqlsr –t TYPE –p PORT –m QMgrName

    停止偵聽
    endmqlsr -m QmgrName

    下面是在MQ環(huán)境中可以執(zhí)行的MQ命令(即在runmqsc環(huán)境下可以敲的命令)

    定義持久信隊(duì)列
    DEFINE QLOCAL(QNAME) DEFPSIST(YES) REPLACE

    設(shè)定隊(duì)列管理器的持久信隊(duì)列
    ALTER QMGR DEADQ(QNAME)

    定義本地隊(duì)列
    DEFINE QL(QNAME) REPLACE

    定義別名隊(duì)列
    DEFINE QALIAS(QALIASNAME) TARGQ(QNAME)

    遠(yuǎn)程隊(duì)列定義
    DEFINE QREMOTE(QRNAME) +
    RNAME(AAA) RQMNAME(QMGRNAME) +
    XMITQ(QTNAME)

    定義模型隊(duì)列
    DEFINE QMODEL(QNAME) DEFTYPE(TEMPDYN)

    定義本地傳輸隊(duì)列
    DEFINE QLOCAL(QTNAME) USAGE(XMITQ) DEFPSIST(YES) +
    INITQ(SYSTEM.CHANNEL.INITQ)+
    PROCESS(PROCESSNAME) REPLACE

    創(chuàng)建進(jìn)程定義
    DEFINE PROCESS(PRONAME) +
    DESCR(‘STRING’)+
    APPLTYPE(WINDOWSNT)+
    APPLICID(’ runmqchl -c SDR_TEST -m QM_ TEST’)
    其中APPLTYPE的值可以是:CICS、UNIX、WINDOWS、WINDOWSNT等

    創(chuàng)建發(fā)送方通道
    DEFINE CHANNEL(SDRNAME) CHLTYPE(SDR)+
    CONNAME(‘100.100.100.215(1418)’) XMITQ(QTNAME) REPLACE
    其中CHLTYPE可以是:SDR、SVR、RCVR、RQSTR、CLNTCONN、SVRCONN、CLUSSDR和CLUSRCVR。

    創(chuàng)建接收方通道
    DEFINE CHANNEL(SDR_ TEST) CHLTYPE(RCVR) REPLACE

    創(chuàng)建服務(wù)器連接通道
    DEFINE CHANNEL(SVRCONNNAME) CHLTYPE(SVRCONN) REPLACE

    顯示隊(duì)列的所有屬性
    DISPLAY QUEUE(QNAME) [ALL]

    顯示隊(duì)列的所選屬性
    DISPLAY QUEUE(QNAME) DESCR GET PUT
    DISPLAY QUEUE(QNAME)MAXDEPTH CURDEPTH

    顯示隊(duì)列管理器的所有屬性
    DISPLAY QMGR [ALL]

    顯示進(jìn)程定義
    DISPLAY PROCESS(PRONAME)

    更改屬性
    ALTER QMGR DESCR(‘NEW DESCRIPTION’)
    ALTER QLOCAL(QNAME) PUT(DISABLED)
    ALTER QALIAS(QNAME) TARGQ(TARGQNAME)

    刪除隊(duì)列
    DELETE QLOCAL(QNAME)
    DELETE QREMOTE(QRNAME)

    清除隊(duì)列中的所有消息
    CLEAR QLOCAL(QNAME)

    以下是一些高級配置的命令:

    amqmcert                  配置SSL證書

    amqmdain                配置windows上的MQ服務(wù)

    crtmqcvx                    轉(zhuǎn)換數(shù)據(jù)

    dmpmqaut                轉(zhuǎn)儲對象權(quán)限管理

    dmpmqlog                轉(zhuǎn)儲日志管理

    dspmq                         顯示隊(duì)列管理器

    dspmqaut                  顯示打開對象的權(quán)限

    dmpmqcap               顯示處理程序容量和處理程序數(shù)

    dspmqcsv                 顯示命令服務(wù)器狀態(tài)

    dspmqfls                   顯示文件名

    dspmqtrc                   跟蹤MQ輸出(HP-UNIX LINUX Solaris)

    dspmqrtn                   顯示事務(wù)的詳細(xì)信息

    endmqcsv                 停止隊(duì)列管理器上的命令服務(wù)器

    strmqcsv                    啟動隊(duì)列管理器上的命令服務(wù)器

    endmqtrc                   停止跟蹤

    rcdmqimg                  向日志寫對象的映像

    rcmqobj                      根據(jù)日志中的映像重新創(chuàng)建一個(gè)對象

    rsvmqtrn                     提交或逆序恢復(fù)事務(wù)

     


    posted @ 2007-12-26 17:26 john 閱讀(2590) | 評論 (0)編輯 收藏

    BCB UTF-8 格式轉(zhuǎn)換

    如果是字串轉(zhuǎn)換.BCB有多個(gè)方法(如TStringConverter,或API的 WideCharToMultiByte/MultiByteToWideChar,VCL的WideCharToString/StringToWideChar等)
    當(dāng)然,BCB本身就支持三種字串,前兩種可自動轉(zhuǎn),后一種有函數(shù):
    String x; //GBK
    WideString y; //unicode
    UTF8String z; //utf8

    x=y; //自動
    y=x; //自動
    z=AnsiToUtf8(x);
    x=Utf8ToAnsi(z);

    posted @ 2007-11-22 18:11 john 閱讀(2682) | 評論 (1)編輯 收藏

    Oracle安裝的一些問題收集

         摘要: 在安裝過程中出現(xiàn)的一些問題的解決辦法。值得收藏與學(xué)習(xí)。比如在安裝的時(shí)候如果有中文的路徑則會出現(xiàn)類似這樣的提示:加載數(shù)據(jù)庫時(shí)出錯(cuò):areasQueries Oracle的系統(tǒng)要求 企業(yè)版:CPU 最低PENTIUM 200M 推薦 PENTIUMIII 1G以上     內(nèi)存 最低128M 推薦 512M     硬盤空間 系統(tǒng)盤140M 安裝盤4.5G(FAT32)或2.75G(...  閱讀全文

    posted @ 2007-10-24 20:50 john 閱讀(1829) | 評論 (0)編輯 收藏

    東京愛情故事?

    在經(jīng)歷了一段時(shí)間的起起落落以后,開始靜下心來回顧近4年的往事,也想到了把東京愛情故事下載了下來看。用了1天時(shí)間把這部電視看完了。莉香的笑容確實(shí)讓人感到陽光燦爛;我覺得她最大的錯(cuò)誤,是喜歡了本來就不屬于她的“丸子”。從故事一開始,就可以知道,完治的心留在了同學(xué)“里美”那里了,對于完治來說,莉香的出現(xiàn),只是生命中的一個(gè)小小插曲。

    posted @ 2007-07-23 23:08 john 閱讀(272) | 評論 (0)編輯 收藏

    關(guān)于Bill Gates的一些評論,我喜歡

    比爾~蓋茨最聰明的地方不是他做了什么,而是他沒做什么。他可以做許許多多的事情,卻只專注在自己的操作系統(tǒng),軟件研發(fā)二不被市場中別的誘惑吸引。

    做人要謙卑,做事要學(xué)會不斷找問題--比爾·蓋茨
    在真理面前的謙卑,是比爾·蓋茨一種內(nèi)心態(tài)度,遠(yuǎn)比外面的風(fēng)光無限、備受世人崇敬更重要。
    有了在真理面前的謙卑,就可以在這個(gè)浮躁的世界中保持一顆安靜的心靈,有更大的創(chuàng)造力和影響力。

    posted @ 2007-07-23 22:55 john 閱讀(312) | 評論 (0)編輯 收藏

    Linux系統(tǒng)環(huán)境下的Socket編程詳細(xì)解析

    Linux系統(tǒng)環(huán)境下的Socket編程詳細(xì)解析

    什么是Socket

      Socket接口是TCP/IP網(wǎng)絡(luò)的API,Socket接口定義了許多函數(shù)或例程,程序員可以用它們來開發(fā)TCP/IP網(wǎng)絡(luò)上的應(yīng)用程序。要學(xué)Internet上的TCP/IP網(wǎng)絡(luò)編程,必須理解Socket接口。

      Socket接口設(shè)計(jì)者最先是將接口放在Unix操作系統(tǒng)里面的。如果了解Unix系統(tǒng)的輸入和輸出的話,就很容易了解Socket了。網(wǎng)絡(luò)的Socket數(shù)據(jù)傳輸是一種特殊的I/O,Socket也是一種文件描述符。Socket也具有一個(gè)類似于打開文件的函數(shù)調(diào)用Socket(),該函數(shù)返回一個(gè)整型的Socket描述符,隨后的連接建立、數(shù)據(jù)傳輸?shù)炔僮鞫际峭ㄟ^該Socket實(shí)現(xiàn)的。常用的Socket類型有兩種:流式Socket(SOCK_STREAM)和數(shù)據(jù)報(bào)式Socket(SOCK_DGRAM)。流式是一種面向連接的Socket,針對于面向連接的TCP服務(wù)應(yīng)用;數(shù)據(jù)報(bào)式Socket是一種無連接的Socket,對應(yīng)于無連接的UDP服務(wù)應(yīng)用。

      Socket建立

      為了建立Socket,程序可以調(diào)用Socket函數(shù),該函數(shù)返回一個(gè)類似于文件描述符的句柄。socket函數(shù)原型為:

      int socket(int domain, int type, int protocol);

      domain指明所使用的協(xié)議族,通常為PF_INET,表示互聯(lián)網(wǎng)協(xié)議族(TCP/IP協(xié)議族);type參數(shù)指定socket的類型:SOCK_STREAM 或SOCK_DGRAM,Socket接口還定義了原始Socket(SOCK_RAW),允許程序使用低層協(xié)議;protocol通常賦值"0"。Socket()調(diào)用返回一個(gè)整型socket描述符,你可以在后面的調(diào)用使用它。

      Socket描述符是一個(gè)指向內(nèi)部數(shù)據(jù)結(jié)構(gòu)的指針,它指向描述符表入口。調(diào)用Socket函數(shù)時(shí),socket執(zhí)行體將建立一個(gè)Socket,實(shí)際上"建立一個(gè)Socket"意味著為一個(gè)Socket數(shù)據(jù)結(jié)構(gòu)分配存儲空間。Socket執(zhí)行體為你管理描述符表。

      兩個(gè)網(wǎng)絡(luò)程序之間的一個(gè)網(wǎng)絡(luò)連接包括五種信息:通信協(xié)議、本地協(xié)議地址、本地主機(jī)端口、遠(yuǎn)端主機(jī)地址和遠(yuǎn)端協(xié)議端口。Socket數(shù)據(jù)結(jié)構(gòu)中包含這五種信息。

      Socket配置

      通過socket調(diào)用返回一個(gè)socket描述符后,在使用socket進(jìn)行網(wǎng)絡(luò)傳輸以前,必須配置該socket。面向連接的socket客戶端通過調(diào)用Connect函數(shù)在socket數(shù)據(jù)結(jié)構(gòu)中保存本地和遠(yuǎn)端信息。無連接socket的客戶端和服務(wù)端以及面向連接socket的服務(wù)端通過調(diào)用bind函數(shù)來配置本地信息。
    Bind函數(shù)將socket與本機(jī)上的一個(gè)端口相關(guān)聯(lián),隨后你就可以在該端口監(jiān)聽服務(wù)請求。Bind函數(shù)原型為:

      

    int bind(int sockfd,struct sockaddr *my_addr, int addrlen); 
      Sockfd是調(diào)用socket函數(shù)返回的socket描述符, my_addr是一個(gè)指向包含有本機(jī)IP地址及端口號等信息的sockaddr類型的指針; addrlen常被設(shè)置為sizeof(struct sockaddr)。
      struct sockaddr結(jié)構(gòu)類型是用來保存socket信息的:
      struct sockaddr {
       unsigned short sa_family; /* 地址族, AF_xxx */
    char sa_data[14]; /* 14 字節(jié)的協(xié)議地址 */
    };
      sa_family一般為AF_INET,代表Internet(TCP/IP)地址族;sa_data
    則包含該socket的IP地址和端口號。
      另外還有一種結(jié)構(gòu)類型:
      struct sockaddr_in {
       short int sin_family; /* 地址族 */
       unsigned short int sin_port; /* 端口號 */
       struct in_addr sin_addr; /* IP地址 */
       unsigned char sin_zero[8]; /* 填充0 以保持與struct sockaddr同樣大小 */
      };

     

      這個(gè)結(jié)構(gòu)更方便使用。sin_zero用來將sockaddr_in結(jié)構(gòu)填充到與struct sockaddr同樣的長度,可以用bzero()或memset()函數(shù)將其置為零。指向sockaddr_in 的指針和指向sockaddr的指針可以相互轉(zhuǎn)換,這意味著如果一個(gè)函數(shù)所需參數(shù)類型是sockaddr時(shí),你可以在函數(shù)調(diào)用的時(shí)候?qū)⒁粋€(gè)指向sockaddr_in的指針轉(zhuǎn)換為指向sockaddr的指針;或者相反。

      使用bind函數(shù)時(shí),可以用下面的賦值實(shí)現(xiàn)自動獲得本機(jī)IP地址和隨機(jī)獲取一個(gè)沒有被占用的端口號:

      my_addr.sin_port = 0; /* 系統(tǒng)隨機(jī)選擇一個(gè)未被使用的端口號 */
      my_addr.sin_addr.s_addr = INADDR_ANY; /* 填入本機(jī)IP地址 */
    通過將my_addr.sin_port置為0,函數(shù)會自動為你選擇一個(gè)未占用的端口來使用。同樣,通過將my_addr.sin_addr.s_addr置為INADDR_ANY,系統(tǒng)會自動填入本機(jī)IP地址。

      注意在使用bind函數(shù)是需要將sin_port和sin_addr轉(zhuǎn)換成為網(wǎng)絡(luò)字節(jié)優(yōu)先順序;而sin_addr則不需要轉(zhuǎn)換。

      計(jì)算機(jī)數(shù)據(jù)存儲有兩種字節(jié)優(yōu)先順序:高位字節(jié)優(yōu)先和低位字節(jié)優(yōu)先。Internet上數(shù)據(jù)以高位字節(jié)優(yōu)先順序在網(wǎng)絡(luò)上傳輸,所以對于在內(nèi)部是以低位字節(jié)優(yōu)先方式存儲數(shù)據(jù)的機(jī)器,在Internet上傳輸數(shù)據(jù)時(shí)就需要進(jìn)行轉(zhuǎn)換,否則就會出現(xiàn)數(shù)據(jù)不一致。

      下面是幾個(gè)字節(jié)順序轉(zhuǎn)換函數(shù):

    ·htonl():把32位值從主機(jī)字節(jié)序轉(zhuǎn)換成網(wǎng)絡(luò)字節(jié)序 
    ·htons():把16位值從主機(jī)字節(jié)序轉(zhuǎn)換成網(wǎng)絡(luò)字節(jié)序
    ·ntohl():把32位值從網(wǎng)絡(luò)字節(jié)序轉(zhuǎn)換成主機(jī)字節(jié)序
    ·ntohs():把16位值從網(wǎng)絡(luò)字節(jié)序轉(zhuǎn)換成主機(jī)字節(jié)序

     

      Bind()函數(shù)在成功被調(diào)用時(shí)返回0;出現(xiàn)錯(cuò)誤時(shí)返回"-1"并將errno置為相應(yīng)的錯(cuò)誤號。需要注意的是,在調(diào)用bind函數(shù)時(shí)一般不要將端口號置為小于1024的值,因?yàn)?到1024是保留端口號,你可以選擇大于1024中的任何一個(gè)沒有被占用的端口號。

    連接建立

     

      面向連接的客戶程序使用Connect函數(shù)來配置socket并與遠(yuǎn)端服務(wù)器建立一個(gè)TCP連接,其函數(shù)原型為:

      int connect(int sockfd, struct sockaddr *serv_addr,int addrlen);
    Sockfd是socket函數(shù)返回的socket描述符;serv_addr是包含遠(yuǎn)端主機(jī)IP地址和端口號的指針;addrlen是遠(yuǎn)端地質(zhì)結(jié)構(gòu)的長度。Connect函數(shù)在出現(xiàn)錯(cuò)誤時(shí)返回-1,并且設(shè)置errno為相應(yīng)的錯(cuò)誤碼。進(jìn)行客戶端程序設(shè)計(jì)無須調(diào)用bind(),因?yàn)檫@種情況下只需知道目的機(jī)器的IP地址,而客戶通過哪個(gè)端口與服務(wù)器建立連接并不需要關(guān)心,socket執(zhí)行體為你的程序自動選擇一個(gè)未被占用的端口,并通知你的程序數(shù)據(jù)什么時(shí)候到打斷口。

      Connect函數(shù)啟動和遠(yuǎn)端主機(jī)的直接連接。只有面向連接的客戶程序使用socket時(shí)才需要將此socket與遠(yuǎn)端主機(jī)相連。無連接協(xié)議從不建立直接連接。面向連接的服務(wù)器也從不啟動一個(gè)連接,它只是被動的在協(xié)議端口監(jiān)聽客戶的請求。

      Listen函數(shù)使socket處于被動的監(jiān)聽模式,并為該socket建立一個(gè)輸入數(shù)據(jù)隊(duì)列,將到達(dá)的服務(wù)請求保存在此隊(duì)列中,直到程序處理它們。

      int listen(int sockfd, int backlog);

      Sockfd是Socket系統(tǒng)調(diào)用返回的socket 描述符;backlog指定在請求隊(duì)列中允許的最大請求數(shù),進(jìn)入的連接請求將在隊(duì)列中等待accept()它們(參考下文)。Backlog對隊(duì)列中等待服務(wù)的請求的數(shù)目進(jìn)行了限制,大多數(shù)系統(tǒng)缺省值為20。如果一個(gè)服務(wù)請求到來時(shí),輸入隊(duì)列已滿,該socket將拒絕連接請求,客戶將收到一個(gè)出錯(cuò)信息。

      當(dāng)出現(xiàn)錯(cuò)誤時(shí)listen函數(shù)返回-1,并置相應(yīng)的errno錯(cuò)誤碼。

      accept()函數(shù)讓服務(wù)器接收客戶的連接請求。在建立好輸入隊(duì)列后,服務(wù)器就調(diào)用accept函數(shù),然后睡眠并等待客戶的連接請求。

      int accept(int sockfd, void *addr, int *addrlen);

      sockfd是被監(jiān)聽的socket描述符,addr通常是一個(gè)指向sockaddr_in變量的指針,該變量用來存放提出連接請求服務(wù)的主機(jī)的信息(某臺主機(jī)從某個(gè)端口發(fā)出該請求);addrten通常為一個(gè)指向值為sizeof(struct sockaddr_in)的整型指針變量。出現(xiàn)錯(cuò)誤時(shí)accept函數(shù)返回-1并置相應(yīng)的errno值。

      首先,當(dāng)accept函數(shù)監(jiān)視的socket收到連接請求時(shí),socket執(zhí)行體將建立一個(gè)新的socket,執(zhí)行體將這個(gè)新socket和請求連接進(jìn)程的地址聯(lián)系起來,收到服務(wù)請求的初始socket仍可以繼續(xù)在以前的 socket上監(jiān)聽,同時(shí)可以在新的socket描述符上進(jìn)行數(shù)據(jù)傳輸操作。

      數(shù)據(jù)傳輸

      Send()和recv()這兩個(gè)函數(shù)用于面向連接的socket上進(jìn)行數(shù)據(jù)傳輸。

      Send()函數(shù)原型為:

      int send(int sockfd, const void *msg, int len, int flags);
    Sockfd是你想用來傳輸數(shù)據(jù)的socket描述符;msg是一個(gè)指向要發(fā)送數(shù)據(jù)的指針;Len是以字節(jié)為單位的數(shù)據(jù)的長度;flags一般情況下置為0(關(guān)于該參數(shù)的用法可參照man手冊)。

      Send()函數(shù)返回實(shí)際上發(fā)送出的字節(jié)數(shù),可能會少于你希望發(fā)送的數(shù)據(jù)。在程序中應(yīng)該將send()的返回值與欲發(fā)送的字節(jié)數(shù)進(jìn)行比較。當(dāng)send()返回值與len不匹配時(shí),應(yīng)該對這種情況進(jìn)行處理。
    char *msg = "Hello!";
    int len, bytes_sent;
    ……
    len = strlen(msg);
    bytes_sent = send(sockfd, msg,len,0);
    ……
      recv()函數(shù)原型為:

      int recv(int sockfd,void *buf,int len,unsigned int flags);

      Sockfd是接受數(shù)據(jù)的socket描述符;buf 是存放接收數(shù)據(jù)的緩沖區(qū);len是緩沖的長度。Flags也被置為0。Recv()返回實(shí)際上接收的字節(jié)數(shù),當(dāng)出現(xiàn)錯(cuò)誤時(shí),返回-1并置相應(yīng)的errno值。

      Sendto()和recvfrom()用于在無連接的數(shù)據(jù)報(bào)socket方式下進(jìn)行數(shù)據(jù)傳輸。由于本地socket并沒有與遠(yuǎn)端機(jī)器建立連接,所以在發(fā)送數(shù)據(jù)時(shí)應(yīng)指明目的地址。
      Sendto()函數(shù)原型為:
      int sendto(int sockfd, const void *msg,int len,unsigned int flags,const struct sockaddr *to, int tolen);

      該函數(shù)比send()函數(shù)多了兩個(gè)參數(shù),to表示目地機(jī)的IP地址和端口號信息,而tolen常常被賦值為sizeof (struct sockaddr)。Sendto 函數(shù)也返回實(shí)際發(fā)送的數(shù)據(jù)字節(jié)長度或在出現(xiàn)發(fā)送錯(cuò)誤時(shí)返回-1。

      Recvfrom()函數(shù)原型為:

      int recvfrom(int sockfd,void *buf,int len,unsigned int flags,struct sockaddr *from,int *fromlen);

      from是一個(gè)struct sockaddr類型的變量,該變量保存源機(jī)的IP地址及端口號。fromlen常置為sizeof (struct sockaddr)。當(dāng)recvfrom()返回時(shí),fromlen包含實(shí)際存入from中的數(shù)據(jù)字節(jié)數(shù)。Recvfrom()函數(shù)返回接收到的字節(jié)數(shù)或當(dāng)出現(xiàn)錯(cuò)誤時(shí)返回

      1,并置相應(yīng)的errno。

      如果你對數(shù)據(jù)報(bào)socket調(diào)用了connect()函數(shù)時(shí),你也可以利用send()和recv()進(jìn)行數(shù)據(jù)傳輸,但該socket仍然是數(shù)據(jù)報(bào)socket,并且利用傳輸層的UDP服務(wù)。但在發(fā)送或接收數(shù)據(jù)報(bào)時(shí),內(nèi)核會自動為之加上目地和源地址信息。

      結(jié)束傳輸

      當(dāng)所有的數(shù)據(jù)操作結(jié)束以后,你可以調(diào)用close()函數(shù)來釋放該socket,從而停止在該socket上的任何數(shù)據(jù)操作:

      close(sockfd);

      你也可以調(diào)用shutdown()函數(shù)來關(guān)閉該socket。該函數(shù)允許你只停止在某個(gè)方向上的數(shù)據(jù)傳輸,而一個(gè)方向上的數(shù)據(jù)傳輸繼續(xù)進(jìn)行。如你可以關(guān)閉某socket的寫操作而允許繼續(xù)在該socket上接受數(shù)據(jù),直至讀入所有數(shù)據(jù)。

      int shutdown(int sockfd,int how);

      Sockfd是需要關(guān)閉的socket的描述符。參數(shù) how允許為shutdown操作選擇以下幾種方式:
    ·0-------不允許繼續(xù)接收數(shù)據(jù)
    ·1-------不允許繼續(xù)發(fā)送數(shù)據(jù)
    ·2-------不允許繼續(xù)發(fā)送和接收數(shù)據(jù),
    ·均為允許則調(diào)用close ()

      shutdown在操作成功時(shí)返回0,在出現(xiàn)錯(cuò)誤時(shí)返回-1并置相應(yīng)errno。

     面向連接的Socket實(shí)例

     

      代碼實(shí)例中的服務(wù)器通過socket連接向客戶端發(fā)送字符串"Hello, you are connected!"。只要在服務(wù)器上運(yùn)行該服務(wù)器軟件,在客戶端運(yùn)行客戶軟件,客戶端就會收到該字符串。

      該服務(wù)器軟件代碼如下:

    #include  
    #include
    #include
    #include
    #include
    #include
    #include
    #include
    #define SERVPORT 3333 /*服務(wù)器監(jiān)聽端口號 */
    #define BACKLOG 10 /* 最大同時(shí)連接請求數(shù) */
    main()
    {
    int sockfd,client_fd; /*sock_fd:監(jiān)聽socket;client_fd:數(shù)據(jù)傳輸socket */
     struct sockaddr_in my_addr; /* 本機(jī)地址信息 */
     struct sockaddr_in remote_addr; /* 客戶端地址信息 */
    if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1) {
      perror("socket創(chuàng)建出錯(cuò)!"); exit(1);
    }
    my_addr.sin_family=AF_INET;
     my_addr.sin_port=htons(SERVPORT);
     my_addr.sin_addr.s_addr = INADDR_ANY;
    bzero(&(my_addr.sin_zero),8);
     if (bind(sockfd, (struct sockaddr *)&my_addr, sizeof(struct sockaddr)) \
       == -1) {
    perror("bind出錯(cuò)!");
    exit(1);
    }
     if (listen(sockfd, BACKLOG) == -1) {
    perror("listen出錯(cuò)!");
    exit(1);
    }
    while(1) {
      sin_size = sizeof(struct sockaddr_in);
      if ((client_fd = accept(sockfd, (struct sockaddr *)&remote_addr, \
      &sin_size)) == -1) {
    perror("accept出錯(cuò)");
    continue;
    }
      printf("received a connection from %s\n", inet_ntoa(remote_addr.sin_addr));
      if (!fork()) { /* 子進(jìn)程代碼段 */
       if (send(client_fd, "Hello, you are connected!\n", 26, 0) == -1)
       perror("send出錯(cuò)!");
    close(client_fd);
    exit(0);
    }
      close(client_fd);
      }
     }
    }

     

      服務(wù)器的工作流程是這樣的:首先調(diào)用socket函數(shù)創(chuàng)建一個(gè)Socket,然后調(diào)用bind函數(shù)將其與本機(jī)地址以及一個(gè)本地端口號綁定,然后調(diào)用listen在相應(yīng)的socket上監(jiān)聽,當(dāng)accpet接收到一個(gè)連接服務(wù)請求時(shí),將生成一個(gè)新的socket。服務(wù)器顯示該客戶機(jī)的IP地址,并通過新的socket向客戶端發(fā)送字符串"Hello,you are connected!"。最后關(guān)閉該socket。

      代碼實(shí)例中的fork()函數(shù)生成一個(gè)子進(jìn)程來處理數(shù)據(jù)傳輸部分,fork()語句對于子進(jìn)程返回的值為0。所以包含fork函數(shù)的if語句是子進(jìn)程代碼部分,它與if語句后面的父進(jìn)程代碼部分是并發(fā)執(zhí)行的。

      客戶端程序代碼如下:

    #include 
    #include
    #include
    #include
    #include
    #include
    #include
    #include
    #define SERVPORT 3333
    #define MAXDATASIZE 100 /*每次最大數(shù)據(jù)傳輸量 */
    main(int argc, char *argv[]){
     int sockfd, recvbytes;
     char buf[MAXDATASIZE];
     struct hostent *host;
     struct sockaddr_in serv_addr;
     if (argc < 2) {
    fprintf(stderr,"Please enter the server's hostname!\n");
    exit(1);
    }
     if((host=gethostbyname(argv[1]))==NULL) {
    herror("gethostbyname出錯(cuò)!");
    exit(1);
    }
     if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1){
    perror("socket創(chuàng)建出錯(cuò)!");
    exit(1);
    }
     serv_addr.sin_family=AF_INET;
     serv_addr.sin_port=htons(SERVPORT);
     serv_addr.sin_addr = *((struct in_addr *)host->h_addr);
     bzero(&(serv_addr.sin_zero),8);
     if (connect(sockfd, (struct sockaddr *)&serv_addr, \
       sizeof(struct sockaddr)) == -1) {
    perror("connect出錯(cuò)!");
    exit(1);
    }
     if ((recvbytes=recv(sockfd, buf, MAXDATASIZE, 0)) ==-1) {
    perror("recv出錯(cuò)!");
    exit(1);
    }
     buf[recvbytes] = '\0';
     printf("Received: %s",buf);
     close(sockfd);
    }
    客戶端程序首先通過服務(wù)器域名獲得服務(wù)器的IP地址,然后創(chuàng)建一個(gè)socket,調(diào)用connect函數(shù)與服務(wù)器建立連接,連接成功之后接收從服務(wù)器發(fā)送過來的數(shù)據(jù),最后關(guān)閉socket。

      函數(shù)gethostbyname()是完成域名轉(zhuǎn)換的。由于IP地址難以記憶和讀寫,所以為了方便,人們常常用域名來表示主機(jī),這就需要進(jìn)行域名和IP地址的轉(zhuǎn)換。函數(shù)原型為:


      struct hostent *gethostbyname(const char *name); 
      函數(shù)返回為hosten的結(jié)構(gòu)類型,它的定義如下:
      struct hostent {
      char *h_name; /* 主機(jī)的官方域名 */
       char **h_aliases; /* 一個(gè)以NULL結(jié)尾的主機(jī)別名數(shù)組 */
       int h_addrtype; /* 返回的地址類型,在Internet環(huán)境下為AF-INET */
      int h_length; /* 地址的字節(jié)長度 */
       char **h_addr_list; /* 一個(gè)以0結(jié)尾的數(shù)組,包含該主機(jī)的所有地址*/
      };
      #define h_addr h_addr_list[0] /*在h-addr-list中的第一個(gè)地址*/

     

      當(dāng) gethostname()調(diào)用成功時(shí),返回指向struct hosten的指針,當(dāng)調(diào)用失敗時(shí)返回-1。當(dāng)調(diào)用gethostbyname時(shí),你不能使用perror()函數(shù)來輸出錯(cuò)誤信息,而應(yīng)該使用herror()函數(shù)來輸出。

      無連接的客戶/服務(wù)器程序的在原理上和連接的客戶/服務(wù)器是一樣的,兩者的區(qū)別在于無連接的客戶/服務(wù)器中的客戶一般不需要建立連接,而且在發(fā)送接收數(shù)據(jù)時(shí),需要指定遠(yuǎn)端機(jī)的地址。

      阻塞和非阻塞

      阻塞函數(shù)在完成其指定的任務(wù)以前不允許程序調(diào)用另一個(gè)函數(shù)。例如,程序執(zhí)行一個(gè)讀數(shù)據(jù)的函數(shù)調(diào)用時(shí),在此函數(shù)完成讀操作以前將不會執(zhí)行下一程序語句。當(dāng)服務(wù)器運(yùn)行到accept語句時(shí),而沒有客戶連接服務(wù)請求到來,服務(wù)器就會停止在accept語句上等待連接服務(wù)請求的到來。這種情況稱為阻塞(blocking)。而非阻塞操作則可以立即完成。比如,如果你希望服務(wù)器僅僅注意檢查是否有客戶在等待連接,有就接受連接,否則就繼續(xù)做其他事情,則可以通過將Socket設(shè)置為非阻塞方式來實(shí)現(xiàn)。非阻塞socket在沒有客戶在等待時(shí)就使accept調(diào)用立即返回。
      #include
      #include
      ……
    sockfd = socket(AF_INET,SOCK_STREAM,0);
    fcntl(sockfd,F_SETFL,O_NONBLOCK);
    ……

      通過設(shè)置socket為非阻塞方式,可以實(shí)現(xiàn)"輪詢"若干Socket。當(dāng)企圖從一個(gè)沒有數(shù)據(jù)等待處理的非阻塞Socket讀入數(shù)據(jù)時(shí),函數(shù)將立即返回,返回值為-1,并置errno值為EWOULDBLOCK。但是這種"輪詢"會使CPU處于忙等待方式,從而降低性能,浪費(fèi)系統(tǒng)資源。而調(diào)用select()會有效地解決這個(gè)問題,它允許你把進(jìn)程本身掛起來,而同時(shí)使系統(tǒng)內(nèi)核監(jiān)聽所要求的一組文件描述符的任何活動,只要確認(rèn)在任何被監(jiān)控的文件描述符上出現(xiàn)活動,select()調(diào)用將返回指示該文件描述符已準(zhǔn)備好的信息,從而實(shí)現(xiàn)了為進(jìn)程選出隨機(jī)的變化,而不必由進(jìn)程本身對輸入進(jìn)行測試而浪費(fèi)CPU開銷。Select函數(shù)原型為:
    int select(int numfds,fd_set *readfds,fd_set *writefds,
    fd_set *exceptfds,struct timeval *timeout);

      其中readfds、writefds、exceptfds分別是被select()監(jiān)視的讀、寫和異常處理的文件描述符集合。如果你希望確定是否可以從標(biāo)準(zhǔn)輸入和某個(gè)socket描述符讀取數(shù)據(jù),你只需要將標(biāo)準(zhǔn)輸入的文件描述符0和相應(yīng)的sockdtfd加入到readfds集合中;numfds的值是需要檢查的號碼最高的文件描述符加1,這個(gè)例子中numfds的值應(yīng)為sockfd+1;當(dāng)select返回時(shí),readfds將被修改,指示某個(gè)文件描述符已經(jīng)準(zhǔn)備被讀取,你可以通過FD_ISSSET()來測試。為了實(shí)現(xiàn)fd_set中對應(yīng)的文件描述符的設(shè)置、復(fù)位和測試,它提供了一組宏:
      FD_ZERO(fd_set *set)----清除一個(gè)文件描述符集;
      FD_SET(int fd,fd_set *set)----將一個(gè)文件描述符加入文件描述符集中;
      FD_CLR(int fd,fd_set *set)----將一個(gè)文件描述符從文件描述符集中清除;
      FD_ISSET(int fd,fd_set *set)----試判斷是否文件描述符被置位。
      Timeout參數(shù)是一個(gè)指向struct timeval類型的指針,它可以使select()在等待timeout長時(shí)間后沒有文件描述符準(zhǔn)備好即返回。struct timeval數(shù)據(jù)結(jié)構(gòu)為:
      struct timeval {
       int tv_sec; /* seconds */
       int tv_usec; /* microseconds */ };

      POP3客戶端實(shí)例

      下面的代碼實(shí)例基于POP3的客戶協(xié)議,與郵件服務(wù)器連接并取回指定用戶帳號的郵件。與郵件服務(wù)器交互的命令存儲在字符串?dāng)?shù)組POPMessage中,程序通過一個(gè)do-while循環(huán)依次發(fā)送這些命令。

    #include 
    #include
    #include
    #include
    #include
    #include
    #include
    #include
    #define POP3SERVPORT 110
    #define MAXDATASIZE 4096

     

    main(int argc, char *argv[]){
    int sockfd;
    struct hostent *host;
    struct sockaddr_in serv_addr;
    char *POPMessage[]={
    "USER userid\r\n",
    "PASS password\r\n",
    "STAT\r\n",
    "LIST\r\n",
    "RETR 1\r\n",
    "DELE 1\r\n",
    "QUIT\r\n",
    NULL
    };
    int iLength;
    int iMsg=0;
    int iEnd=0;
    char buf[MAXDATASIZE];

    if((host=gethostbyname("your.server"))==NULL) {
    perror("gethostbyname error");
    exit(1);
    }
    if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1){
    perror("socket error");
    exit(1);
    }
    serv_addr.sin_family=AF_INET;
    serv_addr.sin_port=htons(POP3SERVPORT);
    serv_addr.sin_addr = *((struct in_addr *)host->h_addr);
    bzero(&(serv_addr.sin_zero),8);
    if (connect(sockfd, (struct sockaddr *)&serv_addr,sizeof(struct sockaddr))==-1){
    perror("connect error");
    exit(1);
    }

    do {
    send(sockfd,POPMessage[iMsg],strlen(POPMessage[iMsg]),0);
    printf("have sent: %s",POPMessage[iMsg]);

    iLength=recv(sockfd,buf+iEnd,sizeof(buf)-iEnd,0);
    iEnd+=iLength;
    buf[iEnd]='\0';
    printf("received: %s,%d\n",buf,iMsg);

    iMsg++;
    } while (POPMessage[iMsg]);

    close(sockfd);
    }

    posted @ 2007-07-23 22:45 john 閱讀(656) | 評論 (0)編輯 收藏

    ORA-27121 錯(cuò)誤,找了好半天:(

    遇到 ORA-27121 錯(cuò)誤
    ORA-01034: ORACLE not available
    ORA-27121: unable to determine size of shared memory segment
    Linux Error: 13: Permission denied

    主要是因?yàn)閛racle安裝程序沒有給oracle這個(gè)可執(zhí)行程序設(shè)置正確的setuid。這樣設(shè)置一下:

    $ cd $ORACLE_HOME/bin
    $ chmod 6751 oracle

    結(jié)果類似這樣就行了。

    $ ls -l $ORACLE_HOME/bin/oracle
    -rwsr-s--x 1 oracle oinstall 23352783 Aug 14 2001 /home/oracle/app/oracle/product/8.1.6/bin/oracle



    這個(gè)錯(cuò)誤的典型現(xiàn)象:使用oracle用戶一切正常,但是在使用其它用戶時(shí),使用sqlplus無法登錄,報(bào)告上面的錯(cuò)誤!

    posted @ 2007-07-17 17:03 john 閱讀(2110) | 評論 (1)編輯 收藏

    Oracle 的Trigger 中不能操作基表(轉(zhuǎn))

    在將SYBASE的Trigger移植到ORACLE的時(shí)候發(fā)現(xiàn)一個(gè)問題,

    就是在一張表的Trigger中不能含有操作該基表的SQL,

    例如STOCKINFO的Trigger里不有操作STOCKINFO的SQL。

    那加權(quán)平均價(jià)如何取呢?

    現(xiàn)在只能在原平均價(jià)的基礎(chǔ)再與新價(jià)進(jìn)行加權(quán)平均,結(jié)果是一樣的。

    注意:

    AFTER UPDATE的Trigger不能操作基表,只有在BEFORE INSERT的Trigger里才能操作基表。

    BEFORE INSERT的Trigger只有用INSERT INTO T1(COL1) VALUES('1');才有效,

    INSERT INTO T1(COL1) SELECT '1' FROM DUAL;也是無效的。

    例如:

    SQL> insert into t1 values (1,'a'); --先插入一條數(shù)據(jù),避免ORA-01403: no data found 錯(cuò)誤。
    1 row inserted
    SQL> commit;

    SQL> create or replace trigger tri_t1
    2 before insert on t1 for each row
    3 declare
    4 cvar varchar2(10);
    5 begin
    6 select 'Y' into cvar from t1 WHERE ROWNUM=1;
    7 end;
    8 /
    Trigger created

    SQL> insert into t1 values (2,'b'); -- insert into ... values 沒有問題
    1 row inserted

    SQL> insert into t1 select '3','c' from dual; -- insert into ... select .. from 報(bào)錯(cuò)
    ORA-04091: table TEST.T1 is mutating, trigger/function may not see it
    ORA-06512: at "TEST.TRI_T1", line 4
    ORA-04088: error during execution of trigger 'TEST.TRI_T1'

     并且:old和:new只有在行級(for each row)的Trigger有效。

    網(wǎng)上原文:

    ORA-04091與 table mutating

    近日解決了一個(gè)trigger中報(bào)ORA-04091錯(cuò)誤的問題,補(bǔ)了關(guān)于Oracle table mutating的一課:

    mutating table 是指一個(gè)當(dāng)前正在被update,delete,insert語句修改的表,如果在一個(gè)行級別的trigger中讀取或修改一個(gè)mutating table,則往往會遇到ORA-04091錯(cuò)誤.例如,如果在trigger中使用了select或dml 語句訪問trigger所在的表,則就會收到這個(gè)錯(cuò)誤。

    然而,Oracle8i和9i文檔中都沒有解釋清楚before和after 類型的 row trigger 在對待兩種不同的insert語句(insert into ... values ... 與 insert into ... select ...)時(shí)的差別:

    1、對于after 類型的 for each row 級別的triggers,不論哪種insert語句觸發(fā)了trigger,都不允許在 trigger 中訪問本trigger所依賴的table的,測試如下:
    SQL> create table t1 ( c1 number,c2 varchar2(10));
    Table created
    SQL> create or replace trigger tri_t1
    2 after insert on t1 for each row
    3 declare
    4 cvar varchar2(10);
    5 begin
    6 select 'Y' into cvar from t1 WHERE ROWNUM=1; --這里訪問了trigger 本表
    7 end;
    8 /
    Trigger created

    SQL> insert into t1 values (1,'a');
    ORA-04091: table TEST.T1 is mutating, trigger/function may not see it
    ORA-06512: at "TEST.TRI_T1", line 4
    ORA-04088: error during execution of trigger 'TES.TRI_T1'

    SQL> insert into t1 select '1','a' from dual;
    ORA-04091: table TEST.T1 is mutating, trigger/function may not see it
    ORA-06512: at "TEST.TRI_T1", line 4
    ORA-04088: error during execution of trigger 'TEST.TRI_T1'

    2、對于before 類型的 for each row 級別的triggers,如果使用 insert into ... values 語句觸發(fā)此trigger ,則在trigger 中訪問本table沒有問題;
    但如果使用 insert into select .. from 語句觸發(fā)此trigger ,則在trigger 中訪問本table就報(bào)ora-04091錯(cuò)誤;
    只有在Oracle 7標(biāo)準(zhǔn)的開發(fā)文檔中有這樣的說明:
    From the Application Developers Guide
    "There is an exception to this restriction;
    For single row INSERTs, constraining tables are mutating for
    AFTER row triggers, but not for BEFORE row triggers.
    INSERT statements that involve more than 1 row are not considered
    single row inserts."
    "INSERT INTO <table_name> SELECT ..." are not considered single row
    inserts, even if they only result in 1 row being inserted.

    測試如下:
    SQL> drop trigger tri_t1;
    Trigger dropped

    SQL> insert into t1 values (1,'a'); --先插入一條數(shù)據(jù),避免ORA-01403: no data found 錯(cuò)誤。
    1 row inserted
    SQL> commit;

    SQL> create or replace trigger tri_t1
    2 before insert on t1 for each row
    3 declare
    4 cvar varchar2(10);
    5 begin
    6 select 'Y' into cvar from t1 WHERE ROWNUM=1;
    7 end;
    8 /
    Trigger created

    SQL> insert into t1 values (2,'b'); -- insert into ... values 沒有問題
    1 row inserted

    SQL> insert into t1 select '3','c' from dual; -- insert into ... select .. from 報(bào)錯(cuò)
    ORA-04091: table TEST.T1 is mutating, trigger/function may not see it
    ORA-06512: at "TEST.TRI_T1", line 4
    ORA-04088: error during execution of trigger 'TEST.TRI_T1'

    我們的開發(fā)人員因?yàn)椴恢肋@個(gè)特別情況,近日在修改一個(gè)存儲過程時(shí)候,將原來的insert values 寫法改成了insert select 寫法,而trigger 又是before類型的,導(dǎo)致出現(xiàn)了ORA-04091錯(cuò)誤,搞得分析了好久也沒有頭緒。

    其實(shí),在metalink中有一篇note說到了:

    文檔 ID: 注釋:132569.1
    主題: ORA-4091 on BEFORE ROW TRIGGER with INSERT statement
    類型: PROBLEM
    狀態(tài): PUBLISHED
    內(nèi)容類型: TEXT/X-HTML
    創(chuàng)建日期: 16-JAN-2001
    上次修訂日期: 09-AUG-2004

    Problem Description
    -------------------

    You want to do an insert into a table that has a BEFORE row Trigger.

    When you hard code the values into the INSERT statement, the trigger works fine.

    For example:

    INSERT
    INTO content (cont_name,cont_seg,cat_seq)
    VALUES('blah',100,200);

    1 row created.

    However, your trigger errors with ERROR ORA-4091 with
    INSERT INTO...select statement:

    INSERT
    INTO content (cont_name,cont_seq,cat_seq) (select....from category);

    ERROR at line 1:
    ORA-4091: table <schema>.CONTENT is mutating, trigger/function may not see it
    ORA-6512: at "<schema>.INS_CONTENT", line 4
    ORA-4088: error during execution of trigger '<schema>.INS_CONTENT'


    TRIGGER:

    CREATE OR REPLACE trigger INS_CONTENT
    BEFORE INSERT on CONTENT
    FOR EACH ROW
    DECLARE
    max_sort number;
    BEGIN
    SELECT max(cont_sort) INTO max_sort FROM CONTENT;
    IF max_sort IS NOT NULL AND max_sort!= 99999 THEN
    IF :new.cont_sort IS NULL THEN
    :new.cont_sort := max_sort +1;
    END IF;
    END IF;
    SELECT SEQ_CONT_SEQ.nextval INTO :new.CONT_SEQ from dual;
    END;


    Explanation
    -----------

    Error: ORA 4091
    Text: table %s.%s is mutating, trigger/function may not see it
    -------------------------------------------------------------------------------
    Cause: A trigger (or a user defined PL/SQL function that is referenced in
    this statement) attempted to look at (or modify) a table that was
    in the middle of being modified by the statement which fired it.

    Action: Rewrite the trigger (or function) so it does not read that table.

    Explanation:
    You cannot look at or modify the table that is mutating.

    Note:
    From the Application Developers Guide
    "There is an exception to this restriction;
    For single row INSERTs, constraining tables are mutating for
    AFTER row triggers, but not for BEFORE row triggers.
    INSERT statements that involve more than 1 row are not considered
    single row inserts."

    "INSERT INTO <table_name> SELECT ..." are not considered single row
    inserts, even if they only result in 1 row being inserted.


    RELATED DOCUMENTS
    -----------------

    Oracle Application Developer's Guide (A68003-01)
    Chapter 'Using Database Triggers', page 13-22)

    posted @ 2007-04-27 22:36 john 閱讀(4337) | 評論 (3)編輯 收藏

    房地產(chǎn)綁架了中國經(jīng)濟(jì)(轉(zhuǎn))

    搜狐博客 > 江湖一聲笑 > 日志 > 經(jīng)濟(jì)述評 2007-04-20 | 房地產(chǎn)綁架了中國經(jīng)濟(jì)(王超,轉(zhuǎn)) 房地產(chǎn)綁架了中國經(jīng)濟(jì),全國性的泡沫已經(jīng)形成!!!
    標(biāo)簽: 投資  呼和浩特  上海  深圳  房價(jià) 
          經(jīng)過幾年的持續(xù)上漲,深圳、上海、杭州、北京、廣州等一線城市的房價(jià),已達(dá)到“一套房消滅一個(gè)百萬富翁”的水平。
      高速膨脹的地產(chǎn),不但在不公正擠占社會財(cái)富,也擠占了其他產(chǎn)業(yè)的發(fā)展空間。
      價(jià)格高的商品房,不但抬高了社會生產(chǎn)、生活成本,削弱了中國在全球的競爭力,也讓中國經(jīng)濟(jì)變得脆弱,出口依賴度直線上升。
      經(jīng)過三級市場的成功滲透,在一些城市,房產(chǎn)市場形成了“先富起來的人對未富者進(jìn)行掠奪”的市場格局。
        
      地產(chǎn)綁架了中國經(jīng)濟(jì)
      十五期間,一些地方政府相繼將“地產(chǎn)”列為“支柱產(chǎn)業(yè)”的結(jié)果,導(dǎo)致這一行業(yè)迅速跨越它在產(chǎn)業(yè)鏈中本有的位置,成為中國經(jīng)濟(jì)中的一個(gè)“異數(shù)”。脫離社會實(shí)際支付水平的房價(jià)和龐大的開發(fā)規(guī)模,在使“地產(chǎn)行業(yè)”不正當(dāng)占用了過多社會財(cái)富的同時(shí),大大削弱了中國居民在其他領(lǐng)域的購買能力,并對其他產(chǎn)業(yè)的發(fā)展形成強(qiáng)硬擠壓。 “2005年,中國經(jīng)濟(jì)出口依賴度接近70%”這一數(shù)據(jù),實(shí)際也在傳遞這樣一個(gè)信號:在醫(yī)療、教育、尤其是價(jià)格居高不下的房產(chǎn)的交替作用下,中國本就不均衡的市場購買力在進(jìn)一步萎縮,以致不得不加重對國外市場的依賴,中國經(jīng)濟(jì)的脆弱性幾乎已到了“生死存亡”的危險(xiǎn)關(guān)頭。
      可以說,連續(xù)5年的“地產(chǎn)高燒”,已給中國經(jīng)濟(jì)、社會的可持續(xù)發(fā)展注入了多種隱患,近年各主要城市由地產(chǎn)開發(fā)支撐起來的、看起來讓人滿意的GDP增長數(shù)據(jù),一經(jīng)細(xì)分,完全可以成為這些隱患嚴(yán)重性、廣泛性、真實(shí)性的證據(jù)。而更為嚴(yán)峻的是,作為不動產(chǎn),房地產(chǎn)實(shí)際是一種終端行業(yè),牽涉著數(shù)十種上游產(chǎn)業(yè),比如從2004年開始,房地產(chǎn)就消耗了國內(nèi)差不多一半的水泥和鋼材,這意味著,由房地產(chǎn)直接按放在中國經(jīng)濟(jì)中的隱形炸彈,除了目前銀行已知的近4萬億房貸外,還有數(shù)十個(gè)相關(guān)行業(yè)為滿足房地產(chǎn)膨脹所帶來的硬性需求、擴(kuò)大產(chǎn)能所進(jìn)行的數(shù)目龐大的基礎(chǔ)投資。它的崩潰,不僅僅只關(guān)涉到我國的金融安全,同時(shí)也關(guān)涉到我國的產(chǎn)業(yè)安全。而2005、2006兩年,國內(nèi)絕大部分城市房價(jià)在國家連續(xù)出臺的宏觀調(diào)控政策下,繼續(xù)強(qiáng)硬上揚(yáng)的事實(shí),似乎在進(jìn)一步表明:地產(chǎn)綁架了中國經(jīng)濟(jì)。
        
      尋找“湯臣一品”
      2006年8月以11萬每平方米開盤的上海豪宅“湯臣一品”,在《上海證券報(bào)》爆出其地價(jià)僅為每平方米4000多元后,被眾多網(wǎng)絡(luò)人士一致推為“中國地產(chǎn)泡沫與暴利”的最佳代表。
      但是,另人沒想到的是,這個(gè)熱遍網(wǎng)絡(luò)、堪稱中國最知名的樓盤,竟是這樣難找。
      據(jù)悉,2007年1月7日,在上海外國語學(xué)院附近,一記者連續(xù)攔了5輛出租車,告知“去湯臣一品”,5位司機(jī)均一臉茫然,即使記者一再解釋這個(gè)小區(qū)“坐落在陸家嘴,距金茂不遠(yuǎn)、是中國最昂貴的樓盤”,這些本該對上海地理滾瓜爛熟的司機(jī)還是大搖其頭,表示“從沒聽說過,不知在哪里”,無奈之下,記者只好請出租司機(jī)先到陸家嘴,邊轉(zhuǎn)悠邊問。
      進(jìn)入陸家嘴地盤,出租司機(jī)連續(xù)三次下車,用本地話向路邊的賣店、飯店打聽“湯臣一品”在哪里?都失望而歸,在漫無目的地搜尋了幾條街后,司機(jī)才在一座快要竣工的寫字樓前,從一個(gè)負(fù)責(zé)施工的技術(shù)員那里打聽到了湯臣一品的確切位置。原來這座聲名在外的“中國最昂貴的樓盤”,在距金茂大約一站地的花園橋西路和拾步街之間。
      在“湯臣一品”小區(qū)的圍墻外,這個(gè)年近50歲的司機(jī)在瞇著眼仔細(xì)看了一番矗立在車窗外的“中國最昂貴的樓盤”后,突然沒有節(jié)制地大笑起來,邊笑邊搖頭,嘴里還不住叨咕:“湯臣一品,每平方米11萬”,每叨咕一遍就笑得更厲害,他瞅著湯臣一品裝飾豪華卻空空蕩蕩的售樓中心,最后竟笑趴在了方向盤上。出租司機(jī)的突然失態(tài),讓約10米外兩個(gè)本來筆直站著的保安變得非常尷尬,訕笑著望著我們。
      過了約3分鐘,出租司機(jī)才慢慢恢復(fù)常態(tài),他向記者表示歉意,說自己突然莫名其妙想起了《大腕》里那個(gè)說起話來滔滔不絕的神經(jīng)病。
      湯臣一品所在的區(qū)域,被稱為小陸家嘴,這個(gè)面積僅1.7平方公里的彈丸之地,密布著中國最昂貴的豪宅,半年前,一個(gè)當(dāng)?shù)赜浾哂?jì)算出,按照當(dāng)時(shí)該區(qū)域的平均房價(jià),僅在1/10的地面建造40層的高樓,其市值就與上海股票交易所的全部股票市值相當(dāng)。“任何一幢樓都抵得上幾家上市公司的流通市值”。
      一業(yè)內(nèi)人士告訴記者,雖然自己并不看好湯臣一品的銷售前景,但卻無法忽視這個(gè)樓盤為上海乃至中國地產(chǎn)帶來的強(qiáng)烈象征意味。
      “每平方米11萬”所傳播的地產(chǎn)價(jià)值暗示,在為上海現(xiàn)有高價(jià)樓盤的價(jià)格敏感度松了綁的同時(shí),可以拉高周邊、上海其他區(qū)域乃至全國多少高檔樓宇的售價(jià)?同時(shí)他認(rèn)為,湯臣一品在國家連續(xù)三年、一年比一年嚴(yán)厲的宏觀調(diào)控政策下橫空出世,是目前中國地產(chǎn)有些失控的最好注腳。
      雖然,上海號稱最近8個(gè)月商品房價(jià)格指數(shù)在連續(xù)下跌,但實(shí)際上,上海內(nèi)環(huán)的大多數(shù)一手房、二手房依然處于微升狀態(tài),2006年,上海商品房總竣工約3000萬平方米,而同期銷售僅1000萬平米出頭,當(dāng)年積壓近2000萬平米已成定局。
      由于民間輿論和宏觀調(diào)控帶來的雙重壓力,從2005年上半年開始,上海調(diào)整了自己對地產(chǎn)的宣傳定位,開發(fā)商與消費(fèi)者隨之進(jìn)入明顯相峙狀態(tài),但國內(nèi)其他城市卻迅速接過了上海手里的接力棒。首先是深圳,從2005年9月份開始,當(dāng)?shù)胤績r(jià)以每月5%左右的速度一路狂漲,有的月份上漲幅度甚至突破10%,到2006年初,深圳關(guān)內(nèi)已經(jīng)鮮有一萬以下的一手房,二手房價(jià)格也飆高到8000元每平方,隨后,北京開始發(fā)力,2006年6、7、8、9月,北京房價(jià)同比分別上升11.2%、11.1%、11.4%和10.3%,不斷“領(lǐng)跑”的結(jié)果是,至冬季房展,北京五環(huán)內(nèi)一萬以下的一手房幾乎絕跡,三環(huán)周邊的二手房均價(jià)追至8000,12月底,這些地域的二手房也突破萬元大關(guān)。
      廣州、南京、福州、武漢、成都、沈陽、哈爾濱、烏魯木齊、西安、大連、青島、寧波、蘇州……國內(nèi)幾乎所有區(qū)域經(jīng)濟(jì)中心城市,都跟在北京、深圳這兩部經(jīng)濟(jì)引擎后面,價(jià)格一路追高;這樣的氛圍,甚至讓公認(rèn)為是中國地產(chǎn)過熱的重災(zāi)區(qū)杭州,在2006年也開始蠢蠢欲動,雖然早在2004年,就有人指責(zé)“杭州開發(fā)商囤積的土地,足夠杭州開發(fā)五至十年”,但2006年初,當(dāng)?shù)孛襟w用“全線飄紅”來形容了政府當(dāng)年舉行的第一次土地拍賣;這表明,導(dǎo)致杭州房價(jià)上漲的市場機(jī)制并沒有改變,由地方政府、開發(fā)商及其附屬利益團(tuán)體組成的“鐵三角”,依然把控著當(dāng)?shù)厥袌龅墓?jié)奏和走向。
      2006年3月,一些與地產(chǎn)界關(guān)系密切的上海本土專家,以學(xué)者身份四處接受采訪,宣稱上海地產(chǎn)觀望期已經(jīng)結(jié)束;國內(nèi)包括上海當(dāng)?shù)夭煌囟伍g的區(qū)域差異是一種客觀存在,這種差異決定了上海黃金地段的高檔樓盤還有上漲空間;在市場經(jīng)濟(jì)環(huán)境下,投機(jī)是一種正常的經(jīng)濟(jì)行為,可以拉動產(chǎn)業(yè)的快速整合,打壓這種行為有違市場經(jīng)濟(jì)規(guī)則;政府不應(yīng)過多插手上海地產(chǎn)問題,而應(yīng)交由市場去自行調(diào)節(jié)。
      6月,呼和浩特市政府悍然反擊新華社關(guān)于“政府這只有形的手在拉高當(dāng)?shù)胤績r(jià)”的新聞報(bào)道,將其拔高到影響“民族和諧”這一政治高度,強(qiáng)調(diào)呼和浩特的地產(chǎn)開發(fā)完全是“按照中央核準(zhǔn)的規(guī)則在進(jìn)行”,呼和浩特的房價(jià)“是本地經(jīng)濟(jì)和城市化快速發(fā)展的結(jié)果”。呼和浩特政府從“2004年至今,投資于經(jīng)濟(jì)適用房的投資占整個(gè)房產(chǎn)開發(fā)投資的54%”,所以“呼和浩特商品房的結(jié)構(gòu)也是健康的”。不過,5個(gè)月后,由該市房產(chǎn)局提供的“2006年1-10月呼和浩特房地產(chǎn)市場形勢分析”卻顯示,呼和浩特這一時(shí)間段的“經(jīng)濟(jì)適用房施工面積占住宅施工面積的比重為8.72%”。且這一比例不但比去年同期“提高了1.13個(gè)百分點(diǎn)”;而且環(huán)比“也呈現(xiàn)較明顯的提高”;統(tǒng)計(jì)顯示,“發(fā)展健康”的呼和浩特地產(chǎn)開發(fā)市場,商品房均價(jià)已從“2004年的1590元每平方竄至2006年的3481元每平方”,短短兩年升幅高達(dá)218.89%。同時(shí),與高達(dá)3481元的均價(jià)形成鮮明對比的是,2006年1-10月該市的土地購置費(fèi)每平方米僅為509元,2005年更低至每平米374元。
      2006年1-10月,呼和浩特商品房竣工率僅13.02%,去年同期更低,為11.23%,不到全國平均竣工率的1/3,這意味著:呼和浩特房地產(chǎn)開發(fā)商囤積土地的跡象非常明顯。與這一低竣工率對比鮮明的是,呼和浩特住宅銷售速度遠(yuǎn)高于同期的竣工率,1-10月, “呼和浩特共竣工商業(yè)住宅竣工58.69萬平米,銷售76.98萬平米”,實(shí)際銷售率出現(xiàn)了國內(nèi)其它城市罕見的一個(gè)數(shù)字:131.16%,其中僅在10月份,呼和浩特商品房預(yù)售面積就達(dá)13.43萬平米,比去年同期狂增206.6%,有專家認(rèn)為,聯(lián)系它超低的竣工率來看,這一反常比例,除可能有呼和浩特市政府姿態(tài)強(qiáng)硬的聲明引起市場追風(fēng)效應(yīng)外,也不排除“開發(fā)商在人為控制市場供應(yīng)量”。

      房價(jià)上漲之源
      究竟是什么因素導(dǎo)致了最近幾年中國城市房價(jià)的持續(xù)上漲?
      在眾多關(guān)于房地產(chǎn)上漲因素的分析中,幾乎沒有人注意到深圳于2001年3月26日開始正式實(shí)施的《深圳市政府100號令》,事實(shí)上,由該法令所確立起來的國內(nèi)地產(chǎn)市場的運(yùn)作原則和模式,與最近幾年全國范圍房價(jià)一路追高有著極深的淵源。
      由于內(nèi)容主要是由“當(dāng)?shù)赝恋刂鞴懿块T在親自操刀”,加上具體參與者對“市場經(jīng)濟(jì)的復(fù)雜性知之甚少”,過于迷信香港經(jīng)驗(yàn),導(dǎo)致《深圳市政府100號令》這一有“國內(nèi)第一個(gè)規(guī)范地產(chǎn)市場運(yùn)作規(guī)則”之稱、本意為“防止劃撥、協(xié)議轉(zhuǎn)讓土地過程發(fā)生腐敗”的地方法規(guī),在客觀上幫助主管部門完成了對土地和房產(chǎn)開發(fā)的統(tǒng)控,并否定了其他市場主體的功能和作用,強(qiáng)行終止了此前存在于商品住宅市場的多樣化特征,將滿足居民住宅需求路徑高度統(tǒng)一在了“以商品房為主體的市場模式上”。
      2001年前,城鎮(zhèn)居民的住宅解決途徑有《城鎮(zhèn)個(gè)人建造住宅管理辦法》、《國務(wù)院關(guān)于進(jìn)一步深化城鎮(zhèn)住房制度改革、加快住房建設(shè)的通知》兩個(gè)法規(guī)可依,這兩個(gè)法規(guī)一個(gè)在“鼓勵(lì)城鎮(zhèn)個(gè)人建造住宅”,另一個(gè)則明確要求各地“建立和完善以經(jīng)濟(jì)適用住房為主的住房供應(yīng)體系”,也就是說。各地商品住宅的市場主體應(yīng)為“經(jīng)濟(jì)適用房”。
      各地依據(jù)這兩個(gè)法規(guī)形成的市場體系,讓當(dāng)時(shí)的城鎮(zhèn)居民至少可以通過以下幾種途徑滿足住房需求:集資建房、合作建房、經(jīng)濟(jì)適用房和純粹的商品房。
      但是,“100號令”通過確立“土地局是土地交易唯一合法的部門”,將土地交易、包括第二次、第三次土地交易大權(quán),收歸一個(gè)部門統(tǒng)控,要求深圳所有土地及其地上附屬物的交易,都必須由土地局直屬機(jī)構(gòu)----深圳市土地交易中心以“拍賣為主、掛賣為輔”的方式 “公開、公正、公平”進(jìn)行,這些規(guī)定,在符合了形式上的規(guī)范與透明外,也衍生出了“地產(chǎn)市場功能單一、難以承載城市多樣化的用房需求,土地局職能從此前以管理和監(jiān)督為主變成了坐莊城市地產(chǎn)開發(fā)的‘土地爺’、可以輕易調(diào)控房產(chǎn)開發(fā)的規(guī)模與節(jié)奏、權(quán)力一枝獨(dú)大,政府與開發(fā)商易形成市場同盟、直接與民爭利”等弊端;同時(shí),由于合作建房、集資建房的操作路徑與這一法規(guī)所確立的交易規(guī)則無法兼容,導(dǎo)致商品房市場的多元化特征被迫實(shí)際終止,加上本應(yīng)形成制約關(guān)系的房產(chǎn)、土地、規(guī)劃、甚至勘探部門,在深圳全部歸口在土地局,這無疑進(jìn)一步強(qiáng)化了土地局對整個(gè)市場的集權(quán)程度。有學(xué)者一針見血地指出,這一法規(guī)實(shí)質(zhì)具有這樣的含義:(深圳)政府把老百姓的住房利益整體出售給了開發(fā)商。
      基于當(dāng)?shù)馗鹘鐚Α渡钲谑姓?00號令》意見極大,當(dāng)時(shí)在新華社廣東分社就職的記者曾于2001年9月,三次前往深圳進(jìn)行專題調(diào)研,得到的情況反饋是:為了反擊社會負(fù)面評價(jià),鞏固這一政令,深圳土地局不惜耗費(fèi)巨資、以每月支付10多萬宣傳費(fèi)為代價(jià),邀請國內(nèi)外知名媒體前來為它“唱贊歌”,同時(shí)還廣邀其他省市的同行前來觀摩“這一經(jīng)驗(yàn)”,試圖通過“以最快的速度在國內(nèi)推廣”的方式,讓其成為既成事實(shí)。記者曾在深圳土地交易大廳的貴賓記事本上看到,沈陽、山西、安徽、河南等地的土地管理部門官員,已在那個(gè)豪華的記事本上留下了不少溢美之辭,此外“還有不少省市的主管部門官員也將陸續(xù)到深圳土地局來考察”。
      記者在隨后形成的內(nèi)參報(bào)告中,曾明確擔(dān)憂“這一法規(guī)實(shí)際終止了此前地產(chǎn)市場其他市場主體的合法地位,導(dǎo)致市場發(fā)育嚴(yán)重單極化,重新回到壟斷狀態(tài),實(shí)質(zhì)是市場經(jīng)濟(jì)的一個(gè)退步,并將給房產(chǎn)市場帶來不可預(yù)知的發(fā)展隱患”。
      不過,深圳市的“新舉措”,卻讓一些財(cái)力匱乏、當(dāng)?shù)胤康禺a(chǎn)市場又啟動艱難的地方政府如獲至寶。迅速按這一口徑調(diào)整了本地房地產(chǎn)市場的結(jié)構(gòu)與運(yùn)作模式:土地房產(chǎn)局坐莊房產(chǎn)開發(fā)市場,有購買需求的城市居民則幾乎全部被驅(qū)趕進(jìn)了商品房市場。
      效果立竿見影。
      以沈陽為例,2001年,沈陽房地產(chǎn)營業(yè)額約55億,虧損2億余元,這一年,整個(gè)遼寧省的土地轉(zhuǎn)讓收入僅為1.6億元。但從2002年實(shí)行“土地集中拍賣”政策后,沈陽地方財(cái)政來自房地產(chǎn)收入直線上升,當(dāng)年,沈陽地方財(cái)政近1/3來自土地出讓金和房地產(chǎn)稅收。牛刀小試嘗到甜頭后,沈陽——這個(gè)中國最重要的重型機(jī)械制造基地,索性將房地產(chǎn)列為了該市的支柱產(chǎn)業(yè),2003年,它把超過1/3的固定資產(chǎn)投資投向了地產(chǎn),同時(shí),約1/3的地方財(cái)政收入也來自房地產(chǎn)開發(fā),2005年,在遭遇宏觀調(diào)控之后,沈陽地產(chǎn)投資依然保持了超過20%的增長速度,僅收取的土地出讓金和配套費(fèi)用就高達(dá)42億。
      由于這一模式下的房地產(chǎn)開發(fā)能快速拉高當(dāng)?shù)谿DP、并迅速改善地方政府的財(cái)政狀況,相當(dāng)部分地方政府以前所未有的熱忱投入到了房地產(chǎn)大開發(fā)中,“以經(jīng)濟(jì)建設(shè)為中心”被實(shí)際壓縮成了“以房產(chǎn)開發(fā)為中心”。同時(shí),這一標(biāo)榜“公開、公平、公正”的市場模式,并沒有遏制住房地產(chǎn)領(lǐng)域的腐敗,反而讓腐敗愈演愈烈,據(jù)知名旅美學(xué)者徐滇慶介紹,經(jīng)不完全統(tǒng)計(jì),最近幾年,中國主要城市流通在房地產(chǎn)市場的資金,有高達(dá)1000多億不知去向。
      在市場經(jīng)濟(jì)里“后知后覺”的呼和浩特,由于開始階段沒有跟風(fēng),直到2004年當(dāng)?shù)厣唐贩烤鶅r(jià)才1590元/米,看到其他兄弟城市干得風(fēng)生水起,呼和浩特失落之余,終于琢磨出了這其中簡單的道理,于是2004年該市也如法炮制,將“土地收儲中心”調(diào)整為政府直屬機(jī)構(gòu),開始通過統(tǒng)一的“掛拍賣”坐莊房產(chǎn)開發(fā)市場,果然,遠(yuǎn)在內(nèi)蒙古大草原的呼和浩特,房產(chǎn)市場也頓時(shí)風(fēng)生水起,2005年,該市商品房均價(jià)達(dá)到2500元左右,2006年,均價(jià)接近3500元。在呼和浩特此輪漲價(jià)旋風(fēng)中,政府每年拿到了幾億的小頭,開發(fā)商拿到了十幾億的大頭,當(dāng)?shù)乩习傩談t得為“這一規(guī)范的市場運(yùn)作機(jī)制”多掏十幾億房款。

       一組可怕的數(shù)據(jù)
      在一個(gè)國家的產(chǎn)業(yè)鏈條中,房地產(chǎn)究竟應(yīng)該處在一個(gè)什么樣的位置?
      上海交通大學(xué)經(jīng)濟(jì)管理學(xué)院孟憲忠教授表示:在一個(gè)經(jīng)濟(jì)體系的產(chǎn)業(yè)鏈中,房地產(chǎn)既是一種基礎(chǔ)性產(chǎn)業(yè),也是一個(gè)對其它產(chǎn)業(yè)的發(fā)展具有嚴(yán)重依賴性的產(chǎn)業(yè)。后一個(gè)角度,表示房地產(chǎn)市場與其他經(jīng)濟(jì)活動所創(chuàng)造的財(cái)富值之間,存在一個(gè)對等的比值關(guān)系。通俗地說,就是一個(gè)社會創(chuàng)造財(cái)富的多少,決定它房地產(chǎn)市場的繁榮程度和房價(jià)高低。
      綜合世界各國的情況看,一個(gè)健康的房地產(chǎn)市場,其在社會總投資中所占的份額應(yīng)在10%左右,超過這個(gè)份額就會出現(xiàn)投資過熱,它帶來的負(fù)面影響是降低社會資源配置的合理程度,引起社會不必要的財(cái)富損耗,甚至成為社會財(cái)富的殺手,并損害產(chǎn)業(yè)間的平衡協(xié)調(diào)。從經(jīng)濟(jì)健康和可持續(xù)的角度,商品房價(jià)格與當(dāng)?shù)丶彝ツ昃杖胫g,也有一個(gè)比值,這個(gè)比值根據(jù)不同國情,在1:3至1:6之間,超過這一比值,房地產(chǎn)就不但在不正當(dāng)剝奪購買者的財(cái)富,也會從整體上削弱社會對其他產(chǎn)品的購買能力,給其他產(chǎn)業(yè)的發(fā)展帶來障礙。
      按照這一判斷標(biāo)準(zhǔn),最近幾年,國內(nèi)主要城市的經(jīng)濟(jì)發(fā)展數(shù)據(jù),傳達(dá)出的是一個(gè)社會資源長期配置錯(cuò)位、明顯存在嚴(yán)重經(jīng)濟(jì)隱患的信息——
      浙江經(jīng)濟(jì)圈的中心城市杭州,2003年社會固定資產(chǎn)投資1006.18億元,其中房地產(chǎn)開發(fā)328.54億元,占全部固定資產(chǎn)投資的32.6%,全市財(cái)政總收入達(dá)329.71億元,土地出讓所得109.29億元;2004年社會固定資產(chǎn)投資1205.18億元,其中房地產(chǎn)開發(fā)企業(yè)完成投資328.54億元,占當(dāng)年社會固定資產(chǎn)投資的27.26%。2005年,該市房地產(chǎn)開發(fā)投資更上層樓,達(dá)到410.57億元。
      珠三角重鎮(zhèn)廣州,2003年完成全社會固定資產(chǎn)投資1157.77億元,其中房地產(chǎn)開發(fā)投資405.94億元,占35.1%。2004年完成全社會固定資產(chǎn)投資1321.96億元,其中房地產(chǎn)開發(fā)投資440.81億元,占33.3%,2005年完成社會固定資產(chǎn)投資1445.33億元,其中房地產(chǎn)開發(fā)投資488.86億元,占33.7%。
      華東六省一市的經(jīng)濟(jì)龍頭上海,2003年完成固定資產(chǎn)投資2452.11億元,其中房地產(chǎn)開發(fā)投資901.24億元,比重為36.8%。2004年完成全社會固定資產(chǎn)投資3084.66億元,其中房地產(chǎn)開發(fā)投資1175.46億元。比重為38.1%,2005年完成全社會固定資產(chǎn)投資總額3542.55億元,其中房地產(chǎn)開發(fā)投資1246.86億元,比重為35.2%。
      中國改革的窗口深圳,2003年完成全社會固定資產(chǎn)投資額946.49億元,其中房地產(chǎn)開發(fā)投資410.06億元,占43.4%;2004年全社會固定資產(chǎn)投資額1090.14億元,其中房地產(chǎn)開發(fā)投資432.01億元,占39.6%,全年完成地方財(cái)政一般預(yù)算收入321.75億元,國土基金總收入128.46億元,2005年完成全社會固定資產(chǎn)投資1176.13億元,其中房地產(chǎn)開發(fā)投資418.76億元,占33.%。
      中國政治中心、中國北方重要的經(jīng)濟(jì)中心城市北京,2003年完成全社會固定資產(chǎn)投資2157.1億元,其中房地產(chǎn)開發(fā)投資1202.5億元,比重55.7%,且僅比上一年多了1.2個(gè)百分點(diǎn)。2004年,北京全社會固定資產(chǎn)投資2528.3億元,其中房地產(chǎn)開發(fā)投資1473.3億元,比重為58.2%,2005年完成全社會固定資產(chǎn)投資2827.2億元,其中房地產(chǎn)開發(fā)投資1525億元,比重為53.9%。
      中國北方重工制造中心沈陽,2003年完成全社會固定資產(chǎn)投資582.6億元,其中房地產(chǎn)開發(fā)投資177.3億元,比重為30.1%;2004年全社會固定資產(chǎn)投資971.4億元,其中房地產(chǎn)開發(fā)完成投資342.6億元,比重為35.2%,2005年固定資產(chǎn)投資完成1363.2億元,其中房地產(chǎn)完成投資413.6億元,比重為30.3%。
      中國經(jīng)濟(jì)大省省會南京,2003年完成全社會固定資產(chǎn)投資額954.04億元,其中房地產(chǎn)開發(fā)投資183.80億元,比重為19%;2004年完成全社會固定資產(chǎn)投資額1201.88億元,其中房地產(chǎn)開發(fā)投資292.88億元,比重為24.3%,2005年完成全社會固定資產(chǎn)投資額1402.72億元,其中房地產(chǎn)開發(fā)完成投資額296.14億元,比重為21.1%。
      華中樞紐武漢,2003年全社會固定資產(chǎn)投資完成645.06億元,其中房地產(chǎn)投資169.55億元,比重為26.2%,2004年全社會固定資產(chǎn)投資完成822.20億元,其中房地產(chǎn)投資233.30億元,比重為28.3%,2005年全市完成全社會固定資產(chǎn)投資1055.18億元,其中房地產(chǎn)開發(fā)投資297.99億元,比重為28.2%。
      這些城市,都是中國最重要的經(jīng)濟(jì)發(fā)動機(jī)或區(qū)域經(jīng)濟(jì)中心,但最近5年來,這些發(fā)動機(jī)都把自己的經(jīng)濟(jì)引擎按放在了“不動產(chǎn)”上,將超過30%的全社會固定資產(chǎn)投資投向了房地產(chǎn),有的這一比例更高達(dá)50%,遠(yuǎn)遠(yuǎn)高于10%的正常水平。由于房地產(chǎn)的強(qiáng)力拉動,它所必然引起的投資過熱也相應(yīng)凸現(xiàn),雖然從2002年開始,國家宏觀經(jīng)濟(jì)部門就開始不斷警告我國經(jīng)濟(jì)出現(xiàn)了投資過熱,但依然無法阻擋這股氣勢兇猛的洪流,2003年,我國全社會固定資產(chǎn)投資增26.7% ,2004年第一季度,全社會投資突然增速,同比增長高達(dá)43%,不但比上年同期加快了15.2個(gè)百分點(diǎn),也遠(yuǎn)高于1992和1993年我國經(jīng)濟(jì)過熱時(shí)全社會固定資產(chǎn)投資所創(chuàng)下的29.1%和35.2%這一增速;2004年全年,我國全社會固定資產(chǎn)投資達(dá)70073億元,增25.8%;2005年我國全社會固定資產(chǎn)投資88604億元,增25.7%;2006年上半年,全國固定資產(chǎn)投資較去年同期增31.3%。此外,我國在建項(xiàng)目規(guī)模2005年為27萬億元,2006年底則飆高至32萬億元。
      一從事宏觀經(jīng)濟(jì)研究的專家告訴記者:很難想象各地政府為什么會進(jìn)行這樣的投資分配,因?yàn)檫@給整個(gè)經(jīng)濟(jì)結(jié)構(gòu)帶來的破壞和隱患極其明顯,房地產(chǎn)膨脹所帶來的“真實(shí)而強(qiáng)勁”的市場需求,必然帶動與其相關(guān)的數(shù)十個(gè)產(chǎn)業(yè)的膨脹,所以房地產(chǎn)熱一定會引發(fā)整個(gè)社會投資的過熱。
      他表示,地方政府通過整合強(qiáng)大的政策和市場資源,可以在短時(shí)間內(nèi)維持房地產(chǎn)市場份額在整個(gè)社會產(chǎn)值中占到一個(gè)較高比例,但這樣的高比例絕不可能長期持續(xù),這是由房地產(chǎn)在產(chǎn)業(yè)鏈中本有的位置所決定的,于是問題出現(xiàn)了-------由房地產(chǎn)拉高的上游相關(guān)產(chǎn)業(yè)的產(chǎn)能很快就將被懸空,如果這個(gè)懸空的程度大到了產(chǎn)業(yè)自身無力消解,就會發(fā)生我們擔(dān)心的經(jīng)濟(jì)蕭條甚至產(chǎn)業(yè)崩潰。
      宏觀調(diào)控發(fā)生后,一些學(xué)者從房地產(chǎn)拉動了多少份額的產(chǎn)品消費(fèi),以此證明房地產(chǎn)對GDP的重要貢獻(xiàn),完全可以從另一個(gè)層面求得房地產(chǎn)膨脹導(dǎo)致的產(chǎn)業(yè)隱患規(guī)模。
      “最近幾年,各地政府對GDP的理解存在一個(gè)誤區(qū),就是只重?cái)?shù)字增長卻不分析經(jīng)濟(jì)行為的合理性,事實(shí)上,GDP的參考價(jià)值與被分析對象行為的理性程度是成正比的,經(jīng)濟(jì)行為愈理性,GDP的參考價(jià)值愈高,反之則愈低,所以,針對目前各地贊歌不斷的GDP,可能我們最該去關(guān)注的是,這些GDP背后的經(jīng)濟(jì)行為的理性程度究竟有多高?現(xiàn)在中央倡導(dǎo)的科學(xué)發(fā)展觀,不僅僅要求各地不得以‘經(jīng)濟(jì)發(fā)展’替代‘社會發(fā)展’,而且也內(nèi)含著提高決策、資源配置、經(jīng)濟(jì)行為理性的訴求”。

      一場危險(xiǎn)的游戲
      除投資規(guī)模過于龐大外,房地產(chǎn)另一個(gè)問題更為突出——主要城市的商品房價(jià)格已遠(yuǎn)高于社會實(shí)際購買能力。
      即使最堅(jiān)定支持“房地產(chǎn)價(jià)格應(yīng)由市場去調(diào)節(jié)”的人也會同意,房價(jià)與所在地居民收入之間,應(yīng)該存在一個(gè)合理的系數(shù),這個(gè)系數(shù),聯(lián)合國人居中心的上限是3:1,世界銀行的上限是5:1,意思是“一個(gè)擁有當(dāng)?shù)仄骄杖胨降募彝ィ?-5年的收入總和,可以購買到所在地平均價(jià)格、平均居住面積的住房”。
      按照這個(gè)標(biāo)準(zhǔn),中國幾乎所有主要城市的房價(jià),已連續(xù)數(shù)年嚴(yán)重超過這一標(biāo)準(zhǔn)。其中,“中國著名的經(jīng)濟(jì)中心長三角的各大城市,平均房價(jià)收入比超過理性房價(jià)收入比的1.93倍,杭州、上海、南京、寧波的比例更超過2倍甚至達(dá)到3倍的比例”。國務(wù)院發(fā)展研究中心一位部門負(fù)責(zé)人對記者坦陳:按照目前的房價(jià),他是買不起房子了。
      2001年,中國房地產(chǎn)被外界形容為“出現(xiàn)局部過熱”時(shí),全國房價(jià)只有深圳、杭州、溫州商品房均價(jià)超過了5000元/米,廣州、北京接近5000元/米,上海商品住宅均價(jià)3413元/米,內(nèi)環(huán)邊5年左右房齡的二手房價(jià)格保持在2500元左右,全國35個(gè)納入物價(jià)指數(shù)統(tǒng)計(jì)的大中城市中,廈門、杭州、南京、沈陽、大連、天津、哈爾濱、昆明、福州、海口等地商品房價(jià)格在2000-3000元/平方米之間;其他21個(gè)城市商品房價(jià)格在2000元/平方米以下。到2006年底,這些城市的商品房均價(jià)幾乎都翻了一倍。深圳、上海、杭州、北京、廣州的房價(jià),已達(dá)到“一套房消滅一個(gè)百萬富翁”的水平。
      2006年底,由中國金融網(wǎng)發(fā)起的“中國城市房價(jià)究竟高了多少”的網(wǎng)絡(luò)調(diào)查,截至2007年1月6日,有11%的網(wǎng)友認(rèn)為高了30%,24% 認(rèn)為高了30-50%,65%認(rèn)為高了50%以上。
      有學(xué)者認(rèn)為,這一調(diào)查數(shù)據(jù)顯示出的結(jié)果與現(xiàn)實(shí)情況比較吻合,他說,即使按照世界銀行公布的家庭收入與房價(jià)5:1這個(gè)上限來看,經(jīng)過最近幾年的漲價(jià)風(fēng)潮,我國絕大部分一、二線城市的房價(jià)已遠(yuǎn)遠(yuǎn)超標(biāo),比如上海,2005年其人均可支配收入為18645元,其家庭人均人口3.1人,年總收入為57799.5元,5年總收入為288997.5萬,這個(gè)數(shù)據(jù)體現(xiàn)的是當(dāng)?shù)貙?shí)際發(fā)展水平和實(shí)際購買力,當(dāng)年上海人均建筑面積達(dá)33.07平方米,按照這個(gè)實(shí)際購買力和當(dāng)?shù)厝司幼∶娣e之間形成的系數(shù),它的住房均價(jià)應(yīng)該為4171元/米,與它2002年上半年平均房價(jià)相當(dāng),但實(shí)際上,這個(gè)數(shù)據(jù)同期變?yōu)榱?627元;深圳2005年人均可支配收入21494元,按照當(dāng)時(shí)全國城鎮(zhèn)人均住房系數(shù),它的住房均價(jià)應(yīng)該為4578元/米,但深圳2001年的商品房均價(jià)就高出這個(gè)數(shù)字近千元,同期實(shí)際均價(jià)為6952元 ;北京2005年人均可支配收入17653元,理性房價(jià)上限為3760元,但實(shí)際為6232元;廣州2005年人均可支配收入18287元;理性均價(jià)上限為3895元,但實(shí)際為5660元;南京2005年人均可支配收入14997元,理性均價(jià)上限為3194元,但實(shí)際為4960元;杭州2005年人均可支配收入16601元,理性均價(jià)上限為3536元,但實(shí)際為7029元; 青島2005年人均可支配收入12920元,理性均價(jià)上限為2751元,但實(shí)際為4639元;成都2005年人均可支配收入11359元,理性均價(jià)上限為2419元,但五城區(qū)實(shí)際為4085元;武漢2005年人均可支配收入10850元,理性均價(jià)上限為2311元,但實(shí)際為3300元;沈陽2005年人均可支配收入10098元,理性均價(jià)上限為2151元,但實(shí)際為3330元;呼和浩特2005年人均可支配收入12150元,理性均價(jià)上限為2588元,但實(shí)際為3481元。
      他說,這其實(shí)意味著,我國大部分城市在進(jìn)行一場危險(xiǎn)的游戲,這場游戲以高昂的房地產(chǎn)為核心,在全面拉高中國固定資產(chǎn)投資的同時(shí),通過抬升城市辦公、居住、生活成本,大幅增加企業(yè)的運(yùn)轉(zhuǎn)經(jīng)費(fèi),以行業(yè)暴利的方式追漲企業(yè)成本。導(dǎo)致我們不惜以犧牲環(huán)境、一線工人合理工資收益和合理稅收等途徑積攢起來的成本方面的競爭優(yōu)勢,正在被這一行業(yè)暴利全部甚至超額吞噬。從而瓦解我們在全球范圍的競爭優(yōu)勢。
      這一態(tài)勢已得到一些國際機(jī)構(gòu)的調(diào)查印證,2006年9月26日,總部設(shè)在瑞士日內(nèi)瓦的世界經(jīng)濟(jì)論壇公布的《2006~2007年全球競爭力報(bào)告》就顯示出,2006年,中國的競爭力繼續(xù)下跌,相比2005年再后延了6個(gè)位次,已落后印度11個(gè)位次。
      在這樣嚴(yán)峻形勢下,如果依然以“穩(wěn)定房價(jià)”為指導(dǎo)思想來進(jìn)行宏觀調(diào)控,這場游戲完全可能“以房產(chǎn)暴利開始,以產(chǎn)業(yè)崩潰結(jié)束”。因?yàn)槟壳暗姆績r(jià)已不應(yīng)該得到“該去穩(wěn)定”的結(jié)論支持,這個(gè)觀點(diǎn)不是從一種市場博弈角度給出的,而是依照目前社會實(shí)際購買力進(jìn)行比較衡量的結(jié)果。
      房地產(chǎn)不但在吞噬城市競爭力,也在吞噬購房者的生活。
      2006年初,來自《半島晨報(bào)》的調(diào)查表明,由于超高的房價(jià),在大連,有4成購房者感到生活質(zhì)量明顯下降,有3%的購房者感到生活質(zhì)量嚴(yán)重下降,而幾乎就在這同一時(shí)間段,一篇名為《高房價(jià)導(dǎo)致中國90%白領(lǐng)消失》的網(wǎng)絡(luò)文章,在不少論壇成為一個(gè)被競相關(guān)注的熱點(diǎn),雖然該文所羅列的數(shù)據(jù)不一定全部真實(shí),但它提出的“(相當(dāng)部分)購房白領(lǐng)被房產(chǎn)套牢”的觀點(diǎn),被隨后《中國青年報(bào)》公開的一份統(tǒng)計(jì)資料證實(shí),該資料顯示,我國貸款買房的群體中,有54.1%月供占其收入的20%~50%,31.8%月供占到了其收入的50%以上。而在國際上,月收入的1/3是房貸按揭的一條被公認(rèn)的警戒線。美國銀行就明確規(guī)定,每月償還的按揭貸款以及與住房相關(guān)的稅費(fèi),不得超過貸款人稅前收入的28%。
      針對這一問題,知名房產(chǎn)問題專家章林曉曾撰文警告:根據(jù)聯(lián)合國《國民經(jīng)濟(jì)核算統(tǒng)計(jì)年鑒》和各國統(tǒng)計(jì)年鑒,以美、英、法、日為對象,分析它們GDP達(dá)1000美元時(shí)居民消費(fèi)結(jié)構(gòu)可以發(fā)現(xiàn),其住房消費(fèi)支出比例最大的英國為13.8%,最小的法國為8.3%,均低于我國同期水平數(shù)倍。他據(jù)此認(rèn)為,這意味著,房地產(chǎn)業(yè)在不正當(dāng)剝奪整個(gè)社會的財(cái)富。而“這破壞了社會的財(cái)富配置,既進(jìn)一步擴(kuò)大了社會的貧富分化,給社會帶來了不安定,也不利于其他產(chǎn)業(yè)的發(fā)展,因?yàn)樯鐣傮w購買力被這個(gè)必需品過多地?cái)D占了”。

      誰在分?jǐn)偢叻績r(jià)
      在國內(nèi)一些一線熱點(diǎn)城市,經(jīng)過一、二、三級市場整合后,當(dāng)?shù)馗甙旱姆績r(jià)正在從主要由購房者分?jǐn)偅饾u變成由全社會在分?jǐn)偂?br>  這一分?jǐn)偟穆窂街饕袃煞N,一是通過提高三級市場的房租,將高昂的房價(jià)直接轉(zhuǎn)給租房者,二是轉(zhuǎn)化為各類企業(yè)、尤其是服務(wù)性企業(yè)的經(jīng)營成本,再由這些企業(yè)通過提高服務(wù)或銷售價(jià)格轉(zhuǎn)嫁給社會。
      有專家認(rèn)為,這種轉(zhuǎn)嫁因素,或者說商品房的租售比,實(shí)際是深圳、北京兩個(gè)熱點(diǎn)城市2005年底以來房價(jià)持續(xù)上漲最重要的支撐點(diǎn)。
      在深圳關(guān)內(nèi),一個(gè)3-5年房齡、面積100平米的小區(qū)商品房,可以輕松租到3500-4000元/月,按一年出租10個(gè)月計(jì),年收益在3.5至4萬元之間,即使按一萬元/米購入,這一投資的年收益也在3.5%-4%之間,如果再加上保值預(yù)期,它的投資收益要大大高于同期發(fā)放的長期國債。
      而據(jù)記者所知,中國政府2006年所發(fā)放的1950億元長期國債,在全國范圍都受到了瘋狂追捧——
      上海,市民為買國債很早就在網(wǎng)點(diǎn)前排起了長隊(duì),中行位于徐家匯和陸家嘴地的支行,營業(yè)頭一個(gè)小時(shí)就售出國債近400萬元,農(nóng)行在對單筆大額做出限制后,竟然在短短半小時(shí)就把國債全部售光;重慶,短短幾個(gè)小時(shí),一億多國債就被搶購一空;昆明,商業(yè)銀行門口購買國債的市民排起了長隊(duì)。幾小時(shí)內(nèi)其所承銷的2.4億國債就全部脫手;南京,市民“手拿油條搶購國債”,商業(yè)銀行“只花了10多分鐘,就賣完了所承銷的全部1.5億元國債”,興業(yè)銀行也在十多分鐘內(nèi),在全國賣完了1.5億的國債配額;合肥,各銀行承銷網(wǎng)點(diǎn)都出現(xiàn)了排隊(duì)搶購場面。首發(fā)當(dāng)日上午10時(shí)許,大部分銀行承銷的國債就已售空。甚至蕪湖、大慶、蘇州這些二三線城市,國債也都出現(xiàn)了空前的熱銷。
      “這些國債,3年期票面年利率3.14%,5年期國債票面年利率3.49%,均低于投資深圳二手房的所得收益”,該專家問記者:“如果你手頭有足夠的錢,又找不到其他投資途徑,給你長期國債和投資深圳的房子賺取租金收益兩個(gè)投資途徑,你會怎么選擇”?
      北京、上海的情況與深圳類似,在北京,三環(huán)附近一間普通的、面積在65米左右的兩房一廳小區(qū)房,2005年年中的月租金在2300元左右,2006年漲到了2500元,10個(gè)月租金收益在2.3萬-2.5萬。按1萬/米計(jì)算,年收益在3.5%至3.8%之間。也高于熱銷全國的長期國債。
      上海,內(nèi)環(huán)邊45平米左右的一房一廳,租金價(jià)格一般在1500-1700之間,10個(gè)月資金收益1.5萬-1.7萬,按目前8000元/平方米的價(jià)位,回報(bào)在4.17%-4.71%之間。二房的租金收益,也大體與此相當(dāng)。
      于是,從房地產(chǎn)本身這個(gè)角度來判斷,上海2003-2005年、北京深圳2005-2006年房價(jià)漲幅之快,價(jià)格之高,雖令人乍舌,但與國內(nèi)其他一些房價(jià)明顯缺乏投資支撐的城市比,卻居然有了最充足也最合理的理由,畢竟二手房已把這一收益變實(shí),而既然3-5年、5-10年的二手房都有這樣的價(jià)格支撐,那么一手房均價(jià)過萬是再正常不過。這同時(shí)意味著,在深圳、北京、上海這樣的城市,高房價(jià)已被成功轉(zhuǎn)嫁給了租房者,實(shí)際也就是轉(zhuǎn)嫁給了社會來分擔(dān)。
      在高價(jià)位出手的購房者的投資心態(tài),也從實(shí)際的購買群體得到了印證,據(jù)《深圳特區(qū)報(bào)》報(bào)道,2006年,深圳的購房者有“50%不是自住,全額付款的購房者比例也超過了一半”,投資目的相當(dāng)明顯。
      這一狀況引起了不少學(xué)者的憂慮,有的甚至提出了這樣一個(gè)激進(jìn)的觀點(diǎn):高房價(jià)通過三級市場的成功滲透,讓這場地產(chǎn)高燒變成了“先富起來的人對未富起來的人的一種掠奪”。他說,市場運(yùn)作必須考慮公平原則,只有這樣經(jīng)濟(jì)才健康并可持續(xù),即使是新自由主義經(jīng)濟(jì)學(xué)大師哈耶克,晚年也在花很多時(shí)間研究“自由市場道德原則的缺失問題”,并承認(rèn)這是新自由主義經(jīng)濟(jì)學(xué)的一塊硬傷,自己一直沒能令人信服地從理論上找到解決依據(jù)。現(xiàn)在這個(gè)通過“市場自由調(diào)整”而出現(xiàn)的“由全社會來分?jǐn)偢叻績r(jià)”的局面,從技術(shù)層面無可指責(zé),但從它必然引起的不良后果這一角度權(quán)衡,這一局面必須扭轉(zhuǎn),如果不扭轉(zhuǎn),把房價(jià)拉回到正常水平無疑癡人說夢,因?yàn)楹芎唵危@是一個(gè)導(dǎo)致深圳、北京等一線城市高房價(jià)平穩(wěn)著陸的一塊實(shí)地,而這個(gè)實(shí)地的支撐點(diǎn)則是這些城市相較國內(nèi)其他城市的更高的競爭力,這個(gè)高租金則在“毫無創(chuàng)造地消耗這個(gè)競爭力”,并支撐這些城市房價(jià)繼續(xù)上揚(yáng)。
      而另一方面,“全國現(xiàn)在有近8萬億存款掌握在20%的人手上,只要這一模式持續(xù),并被愈來愈多的高收入者接受和認(rèn)同,就會有愈來愈多的人參與進(jìn)這一模式,一些學(xué)者提出的‘讓有錢人買了房子租給無錢買房的人居住’,在這一模式下就變成了不折不扣的‘先富起來的人對后富起來的人的掠奪’”。
      在談到城市房價(jià)與可持續(xù)發(fā)展的關(guān)系時(shí),有人打了一個(gè)“沙漠中馱金子”的比喻:兩個(gè)人穿行沙漠時(shí)發(fā)現(xiàn)了金子,一個(gè)貪心拿了自己拿不動的分量,最后渴死在了沙漠上,一個(gè)很理智地拿了一點(diǎn)點(diǎn),最后終于走出沙漠并致了富。
      “房產(chǎn)開發(fā)獲利”,可以看作是“金子”,這個(gè)“金子”對于處于發(fā)展進(jìn)程中的城市(穿越沙漠的人)而言,是真實(shí)的,但對這個(gè)“真實(shí)的金子”,城市管理者的理智態(tài)度應(yīng)該是“按照自己能輕松承載的能力”(即按城市可支配收入形成的購買力)去拿,這樣才能順路地一路走下去,否則“會被這個(gè)真實(shí)的寶物最終壓塌”。
      四川聯(lián)合大學(xué)南亞研究所歐東明副教授表示,如果建立了理性的產(chǎn)業(yè)發(fā)展判斷,即使“房產(chǎn)開發(fā)既得利益集團(tuán)”也應(yīng)該去支持健康的房價(jià),因?yàn)檫@才是行業(yè)可持續(xù)的根本,最近幾年一些城市客觀上存在的對宏觀調(diào)控的抵觸,一定程度在于這些城市的管理者和房產(chǎn)開發(fā)既得利益者對產(chǎn)業(yè)的平衡與可持續(xù)之間的關(guān)系認(rèn)識不足,假如他們通過量性分析得知再這樣走下去,不出幾年等著他們的就將是整個(gè)經(jīng)濟(jì)體系的絕對蕭條甚至崩潰,也許他們會重新考慮自己的整個(gè)決策。
      他說,在這場地產(chǎn)高燒中,最被誤導(dǎo)的其實(shí)還是那些擁有自己住房的普通居民,因?yàn)閺馁Y產(chǎn)來看,他們是絕對地增值了,這無法不高興。但另一方面,對大多數(shù)家庭而言,房子除了滿足居住外別無他用,房產(chǎn)增值除了給了他們一個(gè)數(shù)字財(cái)富外,同時(shí)還需要他們?nèi)シ謹(jǐn)偙厝桓邼q的生活支出和服務(wù)費(fèi)用,此外他們還要承擔(dān)未來可能的產(chǎn)業(yè)崩潰或經(jīng)濟(jì)蕭條。也就是說,這個(gè)對他們沒多大實(shí)際價(jià)值的數(shù)字財(cái)富,實(shí)際大大增加了他們的生活成本和未來風(fēng)險(xiǎn)。

      國內(nèi)經(jīng)濟(jì)已嚴(yán)重受損
      持續(xù)數(shù)年的高房價(jià)給中國經(jīng)濟(jì)帶來的嚴(yán)重隱患,正一一浮出水面。
      除直接增加了購房者的支付成本,拉高了中國全社會固定資產(chǎn)投資、使中國經(jīng)濟(jì)始終處于投資過熱狀態(tài)外,過多社會財(cái)富流向這一生活必需品,以及由此引發(fā)的消費(fèi)預(yù)期,使中國本就不均衡的內(nèi)需進(jìn)一步不足。最近幾年,中國每年的外貿(mào)依存度都以10%左右的速度持續(xù)上升,2005年達(dá)到80%左右,這引起了不少學(xué)者的憂慮——中國經(jīng)濟(jì)在結(jié)構(gòu)上已非常脆弱,而另一方面,世界各市場的貿(mào)易保護(hù)主義色彩卻越來越濃,這將使中國經(jīng)濟(jì)遭遇不測的可能性大增。
      外貿(mào)依存度體現(xiàn)的是一個(gè)國家進(jìn)出口貿(mào)易總額在本國國內(nèi)生產(chǎn)總值(GDP)中所占的比重,它反映的是一個(gè)國家經(jīng)濟(jì)對外貿(mào)的依賴程度和參與國際分工的程度。從1980年到2001年,美國、日本、德國這些發(fā)達(dá)市場經(jīng)濟(jì)國家,外貿(mào)依存度大體穩(wěn)定在14%~20%的范圍內(nèi)。
      但同一時(shí)期,在產(chǎn)業(yè)結(jié)構(gòu)失衡、第一次分配嚴(yán)重不公、社會保障不足、經(jīng)濟(jì)策略上過度依重國外市場等原因的交替作用下,中國的外貿(mào)依存度一路升高,2001年后,由于住房因素進(jìn)一步拉低了社會消費(fèi)能力,中國的外貿(mào)依存度更陡然提速,每年以10%左右的速度躥升。當(dāng)年突破50%大關(guān),2003年達(dá)到60.2%,2004年超過70%。2005年,中國全年進(jìn)出口總額超過1.4萬億美元,達(dá)到1978年的68倍左右,2006年1~10月份,中國外貿(mào)進(jìn)出口總值達(dá)14249.5億美元,同比增長24.1%,已超過2005年全年水平。
      有學(xué)者表示,從好的方面看,外貿(mào)依存度體現(xiàn)了中國經(jīng)濟(jì)的開放程度,表明中國參與全球一體化進(jìn)程加速,中國經(jīng)濟(jì)與世界經(jīng)濟(jì)已經(jīng)形成了相互依賴的伙伴關(guān)系;從不好的方面看,這其實(shí)是國內(nèi)市場需求不旺的一種必然選擇,也就是說,中國每年的高增長,很大程度上是建立在對外依賴的基礎(chǔ)上的,這一模式在相當(dāng)長的時(shí)期掩蓋了中國經(jīng)濟(jì)存在的問題。
      比如,即使在社會圍繞房地產(chǎn)爭論最激烈的時(shí)候,我們也沒有達(dá)成這樣一個(gè)共識:房地產(chǎn)“抽血”式的聚集社會財(cái)富,將強(qiáng)力擠壓其他產(chǎn)業(yè)的市場空間,其結(jié)果是中國經(jīng)濟(jì)整體走上了一條不歸路。這里面的道理很簡單-----假定社會總財(cái)富值是100,正常情況下我們拿20%支付住房費(fèi)用,30%用于儲蓄,50%用于其他消費(fèi),但現(xiàn)在住房占用了過多的財(cái)富,綜合值達(dá)到了40%甚至45%,由于這是一種必須的消費(fèi),所以它必然擠壓消費(fèi)者用于其他領(lǐng)域的消費(fèi)數(shù)額,于是其他行業(yè)分到的社會財(cái)富值就會大大縮水。購房的人由于財(cái)富值已經(jīng)入套,他得修改自己的消費(fèi)計(jì)劃和比例,沒購房的人呢?如果他需要買房,也不得不按現(xiàn)行的房價(jià)標(biāo)準(zhǔn)修改自己的消費(fèi)計(jì)劃。而購房一族,又是一個(gè)社會消費(fèi)力最旺盛的群體,損害了這個(gè)群體的購買力無疑意味著內(nèi)需市場必然遭遇大幅度縮水。
      由于房價(jià)過于畸形,國內(nèi)市場的縮水規(guī)模可以說達(dá)到了駭人聽聞的程度,以上海為例,按照世界銀行認(rèn)同的房價(jià)比上限5:1和上海這一時(shí)期由可支配收入形成的購買力計(jì)算,上海商品房均價(jià)應(yīng)該在4000元出頭,但它的實(shí)際均價(jià)卻是8000多元,二者相差4000元以上,按4000元計(jì),2004-2005年,上海大約銷售了4000萬平米的商品房,這是什么意思呢?等于說兩年中,僅上海房產(chǎn)市場就不正當(dāng)?shù)貜馁彉钦吣抢锒嗄米吡思s1600億元。
      “一個(gè)上海就擠占了這么龐大的數(shù)額,全國加起來是個(gè)什么數(shù)字?所以我不得不用‘駭人聽聞’這四個(gè)字來形容房地產(chǎn)對整個(gè)社會的掠奪,而這也必然導(dǎo)致國內(nèi)其他市場出現(xiàn)嚴(yán)重的需求不足,影響經(jīng)濟(jì)的良性與正常”。
      來自于央行的最新統(tǒng)計(jì)數(shù)據(jù),證明該學(xué)者所言非虛,2006年11月23日上午,中國人民銀行副行長蘇寧在接受一媒體采訪時(shí)透露,我國最終消費(fèi)占GDP的比重,已從上世紀(jì)80年代超過62%下降到2005年的52.1%,居民消費(fèi)率也從1991年的48.8%下降到2005年的38.2%,二者“均達(dá)歷史最低水平”,居民儲蓄率卻上升了9%。
      而同一時(shí)期,世界平均消費(fèi)率達(dá)78%—79%。是我國的2倍以上的水平。
      有“華東六省一市經(jīng)濟(jì)發(fā)展火車頭”之謂的上海,可能已率先感受到了由過分偏重房地產(chǎn)帶來的寒意,2005年底,當(dāng)?shù)厣缈圃涸谝环菽杲K報(bào)告里坦露:2005年1~9月,上海(經(jīng)濟(jì))出現(xiàn)了比較明顯的收縮,主要經(jīng)濟(jì)指標(biāo)增速不僅低于2004年同期,而且低于全國同期平均水平,出現(xiàn)了(上海罕見)的“雙低”現(xiàn)象。與此同時(shí),上海的工業(yè)增長速度也開始大幅度回落,效益下滑,2005年1~9月份,上海工業(yè)增長速度為12.4%,低了全國同期增速3.9個(gè)百分點(diǎn)。
      此外,顯示上海經(jīng)濟(jì)發(fā)達(dá)程度和結(jié)構(gòu)合理性的第三產(chǎn)業(yè)比重,最近幾年更是持續(xù)下降,上海第三產(chǎn)業(yè)的比重,2002年達(dá)到歷史最高,為51%,伴隨著房價(jià)上升。這一比例開始下滑,2003年為 48.4%,2004年為 47.3% ,2005更低至45.6%。
      這一情況,近幾年在另一個(gè)高房價(jià)城市-------深圳也類似存在。

      三板斧砍掉地產(chǎn)暴利
      基于上漲過快的房貸和開始在全國蔓延的炒房之風(fēng),2003年10月,央行正式祭出“121號文”,針對房地產(chǎn)發(fā)出了收緊銀根的信號,開始了本輪宏觀調(diào)控。
      但決策者很快發(fā)現(xiàn),與1993年那次“一控就靈”不同的是,這一次,這個(gè)帶有預(yù)警性的手段,一出手卻如入泥潭,不但悄無聲息,甚至還引起了強(qiáng)硬反彈:房地產(chǎn)開發(fā)資金規(guī)模在全社會投資總額中繼續(xù)高比例領(lǐng)跑,部分地方政府開始在一些公開場合揚(yáng)言本地房地產(chǎn)發(fā)展健康,不存在泡沫。
      宏觀調(diào)控得到的結(jié)果是:2004-2005年全國范圍房價(jià)持續(xù)大漲,在這場調(diào)控與反擊的較量過程,大連、青島、上海、深圳等熱點(diǎn)城市交替領(lǐng)跑,中國宏觀經(jīng)濟(jì)危機(jī)被進(jìn)一步加劇。
      2006年,中央悍然加大調(diào)控力度,從金融、信貸、土地、稅收等方面頻出重手,其中包括“加息”、“征稅”、“國六條”、“規(guī)定開發(fā)周期,打擊土地囤積”、“90平方米70%”、“限外”、“問責(zé)”等,一系列政策步步為營,從“宏觀”延伸到了“微觀”,從“市場”延伸到了“政府管理”。態(tài)度不可謂不堅(jiān)決,措施不可謂不嚴(yán)厲。
      但是,全國范圍房價(jià)繼續(xù)堅(jiān)挺,2006年10月的統(tǒng)計(jì)資顯示,雖然全國70城市房價(jià)漲幅放緩,但總體依然處于漲勢,當(dāng)月房價(jià)同比上漲5.5%,環(huán)比上漲0.4%,此前一個(gè)月,這些城市房價(jià)同比上漲5.3%,環(huán)比漲幅則與10月持平,其中漲幅較大的北京,三季度房價(jià)比上一個(gè)季度漲了上千元。對這一形勢,發(fā)改委官員給出的說法是,“未來的調(diào)控任務(wù)依然相當(dāng)艱巨”。
      為什么1993年一招“收緊銀根”就可以遏制當(dāng)時(shí)瘋狂膨脹的房地產(chǎn),而本輪調(diào)控使用了多得讓人眼花繚亂的手段,卻依然收效不大?
      有專家認(rèn)為,造成這種反差的主要原因在于,兩者有了截然不同的市場機(jī)制和金融環(huán)境。
      1993年,地產(chǎn)市場是一個(gè)以開發(fā)商為主體的市場,地方政府與開發(fā)商是一種博弈的關(guān)系,加上當(dāng)時(shí)金融體系內(nèi)外的流動性資本規(guī)模不大;中國經(jīng)濟(jì)剛剛走出調(diào)整期,城市住宅市場需求平穩(wěn);所以對房產(chǎn)開發(fā)“一控就靈”。但本輪調(diào)控,房地產(chǎn)市場,乃至金融體系的流動性資本數(shù)額與回報(bào)預(yù)期,都發(fā)生了劇烈變化。
        首先,地方政府與開發(fā)商之間已超越了一種單純的博弈關(guān)系,實(shí)際形成了利益高度一致的同盟,這一同盟對市場擁有絕對的控制權(quán)。導(dǎo)致調(diào)控環(huán)境變得復(fù)雜和微妙,如果調(diào)控過程地方政府嚴(yán)守一個(gè)市場底線,就會大大削弱調(diào)控效果。對此,前國家統(tǒng)計(jì)局副局長賀鏗甚至直言,不打掉(這種)官商勾結(jié),無法平抑房價(jià)。
      其次是經(jīng)過10余年發(fā)展,我國的金融環(huán)境也已發(fā)生巨變,從“資金短缺”變成了“流動性過剩”,據(jù)央行相關(guān)負(fù)責(zé)人透露,目前國內(nèi)有高達(dá)2.6萬億的資金處于流動狀態(tài),在資本貫有的追漲心態(tài)下,它們對房地產(chǎn)的支撐作用不容忽視,建行董事長、外管局前任局長郭樹清就曾公開表示,(目前)全國各大城市房價(jià)連續(xù)數(shù)月保持5%—7%的快速增幅,原因之一在于金融體系過剩的流動性。
      本次宏觀調(diào)控的失利還在于,調(diào)控的調(diào)子不到位,甚至部分調(diào)控手段是按照開發(fā)商持續(xù)數(shù)年的宣傳、將當(dāng)前城市商品住宅暗示為了“稀缺性公共資源”,這在一定程度上對房產(chǎn)市場“恰好起到了效果相反的刺激作用”。
      直到2006年三季度,發(fā)改委在談到調(diào)控目標(biāo)時(shí),依然將其定位于“穩(wěn)定房價(jià),抑制上漲”。“這樣的定位不但偏離了目前房產(chǎn)市場的真實(shí)狀況,也給了被調(diào)控者不恰當(dāng)?shù)陌凳?#8221;,緊箍咒不緊,無疑會“影響調(diào)控的執(zhí)行與效果”。
      此外,提高首付,限制外購、征收二手房交易所得稅這幾項(xiàng)調(diào)控措施,雖可以在一定程度上抑制炒家,提高商品房市場的真需求比例,但這幾個(gè)措施也同時(shí)釋放出了這樣的意思——商品房是一種稀缺公共資源。結(jié)果反而導(dǎo)致更多流動性過剩資本進(jìn)場,比如在深圳,2006年有過半的交易均非自住,這部分人“全款購買比例很高,投資目的非常明確”。類似的情況也出現(xiàn)在另一個(gè)房價(jià)突出的城市——上海,2004年,上海商品房銷售額2064.74億元,新增房貸約800億元,房貸額不足40%,已經(jīng)顯示出購房者高比例付款趨勢,2005年付款比例更大比例攀升,這一年,上海商品房銷售額1906.05億元,但僅新增房貸約200億元。這意味著,同樣有“相當(dāng)部分購買者在購買時(shí)是全額或高額付款,這是實(shí)力買家進(jìn)場給出的一個(gè)強(qiáng)信號”。
      介于這樣嚴(yán)重的局勢,未來的調(diào)控將走向何方?有專家建議——
      在嚴(yán)格執(zhí)行已頒布的措施,尤其是細(xì)化落實(shí)“回收閑置土地”以打擊土地囤積,落實(shí)“經(jīng)濟(jì)廉租房”制度、以給市場確立趨于正常的價(jià)格標(biāo)準(zhǔn)這兩個(gè)條款外,還應(yīng)該針對一些市場苗頭,啟動其他幾項(xiàng)措施,三板斧砍掉房產(chǎn)暴利。
      第一板斧,在北京、廣州、深圳、上海等熱點(diǎn)城市,啟動稅收杠桿,打掉這些城市已出現(xiàn)的由“三級市場將高房價(jià)坐實(shí)”的現(xiàn)實(shí),并遏制這一趨勢向其他城市蔓延。
      如果不打掉三級市場這一現(xiàn)狀,這些城市的房價(jià)永遠(yuǎn)掉不下來,而這幾個(gè)在中國具有標(biāo)向意義的城市房價(jià)掉不下來,其他城市也就有了高標(biāo)準(zhǔn)的攀比對象,要降房價(jià)困難重重。房地產(chǎn)現(xiàn)在的局面就會出現(xiàn)僵持,可能真只有經(jīng)濟(jì)全盤崩潰那一天才能抑制房價(jià)。
      由于這一措施是對市場進(jìn)行細(xì)部操作,所以啟動時(shí)需制定完善細(xì)則,同時(shí)須將不同的情況區(qū)分開來,比如對同一家庭擁有房屋套數(shù)的不同,征收額度不同的稅收:第一套出租房按所得的20%征收,第二套按所得的30%征收,第三套按所得40%征收,第四套按所得50%征收……超過500平米按60%標(biāo)準(zhǔn)征收,超過1000平米按80%征收。
      這一稅收征收的依據(jù)是“房地產(chǎn)已嚴(yán)重干擾中國正常市場秩序,國家不鼓勵(lì)私人過多占有這一公共資源”。如果出租房擁有者拒絕出租,那么應(yīng)對其收取同樣數(shù)額的資源閑置費(fèi),如果房主稱租不出去,可將該房納入政府專門機(jī)構(gòu),由政府按“本市實(shí)際購買力所確立的租房標(biāo)準(zhǔn)”統(tǒng)一對外出租,對于隱瞞擁有私房數(shù)量的情況,則可以通過“有獎舉報(bào),從重處罰”這一殺手锏予以有力還擊,無限度增加這些房主的博弈風(fēng)險(xiǎn),同時(shí)向社會開放這一領(lǐng)域的監(jiān)督權(quán)力,以強(qiáng)力保證這一措施順利推行。
      第二板斧砍向“假按揭”,一些城市在房價(jià)高漲后,出現(xiàn)了 “將房子賣給自己也能賺錢”的畸形市場格局,導(dǎo)致假按揭再次抬頭。而假按揭不但可以大大增加房產(chǎn)開發(fā)公司與市場抗衡的實(shí)力,形成巨大金融黑洞,實(shí)際也構(gòu)成了金融詐騙,所以必須從嚴(yán)、從重進(jìn)行處罰。
      第三板斧砍向“目前房地產(chǎn)市場由權(quán)錢結(jié)合所形成的市場聯(lián)盟”。
      在某種程度上,這個(gè)聯(lián)盟是近5年房地產(chǎn)持續(xù)上漲的罪魁,而且由它所衍生的市場運(yùn)作機(jī)制單一,不利于形成多極化的市場供應(yīng)。所以,要恢復(fù)房產(chǎn)市場的健康,應(yīng)同時(shí)重視其他市場主體的權(quán)利。給予其他市場主體以合法地位,比如近期在國內(nèi)各城市的合作建房聯(lián)盟,政府就應(yīng)給予明確支持引導(dǎo),打破由2001年《深圳100號令》后,各地政府所實(shí)際形成的壟斷型市場模式。
      事實(shí)證明,個(gè)人合作建房能有效撕開此前由地方政府和開發(fā)商組成的壟斷聯(lián)盟,形成新的、趨于合理的市場供給,比如2006年下半年,溫州個(gè)人建房合作聯(lián)盟在土地交易市場爭得一塊被當(dāng)?shù)亻_發(fā)商認(rèn)為價(jià)格過高、賺頭不大的“雞肋”地塊后,獲得了5300多元/平米的成品商品房造價(jià),而其周邊的房價(jià)為8000多元/平米。深圳,在商品房均價(jià)超過8000元/平米的情況下,由當(dāng)?shù)貍€(gè)人建房聯(lián)盟參與的投標(biāo),競得了一幢均價(jià)只有1600多元/米的二手房,2007年1月5日,記者在與競投負(fù)責(zé)人林先生通電話時(shí),他告訴記者,“他們所有參與競投的人都哭了”,同時(shí)他還透露,春節(jié)后,他們合作建房組織將以某種方式正式參與政府組織的土地拍賣。
      政府應(yīng)該大力支持個(gè)人合作建房的理由還在于,發(fā)生在溫州和深圳的事實(shí)表明,這一形式打掉的只是開發(fā)商的暴利,由政府主控的一級市場所損并不大。此外,由于目前個(gè)人合作建房與市場比較存在明顯的成本差異,一些不法商人也可能會打著合作建房的幌子套錢,政府的積極參與,有利于這一目前尚處于雛形的市場形態(tài)的良性發(fā)育。
      該學(xué)者還特別強(qiáng)調(diào)了調(diào)控措施中建設(shè)“廉價(jià)出租房”的重要性。他建議,未來中國城市的住宅供應(yīng),應(yīng)吸取新加坡模式,以“經(jīng)濟(jì)適用房和廉租屋”為手段,加大政府在這一市場領(lǐng)域的作為,使城市房產(chǎn)供應(yīng)重返1998年由《國務(wù)院關(guān)于進(jìn)一步深化城鎮(zhèn)住房制度改革、加快住房建設(shè)的通知》所確立的“以經(jīng)濟(jì)適用房為主體、以商品房為補(bǔ)充”的市場格局。
      他認(rèn)為,這不但可以為房產(chǎn)市場提供一個(gè)具有良性導(dǎo)向的新標(biāo)準(zhǔn),而且可以轉(zhuǎn)移因房地產(chǎn)市場變化而損失的財(cái)政收益,以上海為例,如果每年由政府按當(dāng)?shù)貙?shí)際購買力提供1000萬平米的廉價(jià)房,地方政府在房產(chǎn)領(lǐng)域的財(cái)政收益其實(shí)根本不會減少。
      “更重要的是,這一措施也可以使中國的城市化進(jìn)程得以實(shí)際啟動,困擾中國多年的產(chǎn)業(yè)轉(zhuǎn)型和社會轉(zhuǎn)型問題,將隨之被打開一個(gè)順暢的通道”。


     

    posted @ 2007-04-21 10:17 john 閱讀(619) | 評論 (0)編輯 收藏

    Oracle ---管理UNDO表空間

    10.管理UNDO表空間.

    UNDO表空間用于存放UNDO數(shù)據(jù),當(dāng)執(zhí)行DML操作(INSERT,UPDATEDELETE)時(shí),oracle會將這些操作的舊數(shù)據(jù)寫入到UNDO,oracle9i之前,管理UNDO數(shù)據(jù)時(shí)使用(Rollback Segment)完成的.oracle9i開始,管理UNDO數(shù)據(jù)不僅可以使用回滾段,還可以使用UNDO表空間.因?yàn)橐?guī)劃和管理回滾段比較復(fù)雜,所有oracle database 10g已經(jīng)完全丟棄用回滾段.并且使用UNDO表空間來管理UNDO數(shù)據(jù).

    UNDO數(shù)據(jù)也稱為回滾(ROLLBACK)數(shù)據(jù),它用于確保數(shù)據(jù)的一致性.當(dāng)執(zhí)行DML操作時(shí),事務(wù)操作前的數(shù)據(jù)被稱為UNDO記錄.UNDO段用于保存事務(wù)所修改數(shù)據(jù)的舊值,其中存儲著被修改數(shù)據(jù)塊的位置以及修改前數(shù)據(jù),

    UNDO數(shù)據(jù)的作用.

    1,回退事務(wù)

    當(dāng)執(zhí)行DML操作修改數(shù)據(jù)時(shí),UNDO數(shù)據(jù)被存放到UNDO,而新數(shù)據(jù)則被存放到數(shù)據(jù)段中,如果事務(wù)操作存在問題,舊需要回退事務(wù),以取消事務(wù)變化.假定用戶A執(zhí)行了語句UPDATE emp SET sal=1000 WHERE empno=7788后發(fā)現(xiàn),應(yīng)該修改雇員7963的工資,而不是雇員7788的工資,那么通過執(zhí)行ROLLBACK語句可以取消事務(wù)變化.當(dāng)執(zhí)行ROLLBACK命令時(shí),oracle會將UNDO段的UNDO數(shù)據(jù)800寫回的數(shù)據(jù)段中.

    2,讀一致性

    用戶檢索數(shù)據(jù)庫數(shù)據(jù)時(shí),oracle總是使用用戶只能看到被提交過的數(shù)據(jù)(讀取提交)或特定時(shí)間點(diǎn)的數(shù)據(jù)(SELECT語句時(shí)間點(diǎn)).這樣可以確保數(shù)據(jù)的一致性.例如,當(dāng)用戶A執(zhí)行語句UPDATE emp SET sal=1000 WHERE empno=7788時(shí),UNDO記錄會被存放到回滾段中,而新數(shù)據(jù)則會存放到EMP段中;假定此時(shí)該數(shù)據(jù)尚未提交,并且用戶B執(zhí)行SELECT sal FROM emp WHERE empno=7788,此時(shí)用戶B將取得UNDO數(shù)據(jù)800,而該數(shù)據(jù)正是在UNDO記錄中取得的.

    3,事務(wù)恢復(fù)

    事務(wù)恢復(fù)是例程恢復(fù)的一部分,它是由oracle server自動完成的.如果在數(shù)據(jù)庫運(yùn)行過程中出現(xiàn)例程失敗(如斷電,內(nèi)存故障,后臺進(jìn)程故障等),那么當(dāng)重啟oracle server時(shí),后臺進(jìn)程SMON會自動執(zhí)行例程恢復(fù),執(zhí)行例程恢復(fù)時(shí),oracl會重新做所有未應(yīng)用的記錄.回退未提交事務(wù).

    4,倒敘查詢(FlashBack Query)

    倒敘查詢用于取得特定時(shí)間點(diǎn)的數(shù)據(jù)庫數(shù)據(jù),它是9i新增加的特性,假定當(dāng)前時(shí)間為上午11:00,某用戶在上午10:00執(zhí)行UPDATE emp SET sal=3500 WHERE empno=7788語句,修改并提交了事務(wù)(雇員原工資為3000),為了取得10:00之前的雇員工資,用戶可以使用倒敘查詢特征.

    使用UNDO參數(shù)

    1,UNDO_MANAGEMENT

    該初始化參數(shù)用于指定UNDO數(shù)據(jù)的管理方式.如果要使用自動管理模式,必須設(shè)置該參數(shù)為AUTO,如果使用手工管理模式,必須設(shè)置該參數(shù)為MANUAL,使用自動管理模式時(shí),oracle會使用undo表空間管理undo管理,使用手工管理模式時(shí),oracle會使用回滾段管理undo數(shù)據(jù),

    需要注意,使用自動管理模式時(shí),如果沒有配置初始化參數(shù)UNDO_TABLESPACE,oracle會自動選擇第一個(gè)可用的UNDO表空間存放UNDO數(shù)據(jù),如果沒有可用的UNDO表空間,oracle會使用SYSTEM回滾段存放UNDO記錄,并在ALTER文件中記載警告.

    2,UNDO_TABLESPACE

    該初始化參數(shù)用于指定例程所要使用的UNDO表空間,使用自動UNDO管理模式時(shí),通過配置該參數(shù)可以指定例程所要使用的UNDO表空間.

    RAC(Real Application Cluster)結(jié)構(gòu)中,因?yàn)橐粋€(gè)UNDO表空間不能由多個(gè)例程同時(shí)使用,所有必須為每個(gè)例程配置一個(gè)獨(dú)立的UNDO表空間.

    3,UNDO_RETENTION

    該初始化參數(shù)用于控制UNDO數(shù)據(jù)的最大保留時(shí)間,其默認(rèn)值為900,9i開始,通過配置該初始化參數(shù),可以指定undo數(shù)據(jù)的保留時(shí)間,從而確定倒敘查詢特征(Flashback Query)可以查看到的最早時(shí)間點(diǎn).

    建立UNDO表空間,

    UNDO表空間專門用于存放UNDO數(shù)據(jù),并且在UNDO表空間尚不能建立任何數(shù)據(jù)對象(,索引,)

    1,使用CREATE DATABASE命令建立UNDO表空間.

    當(dāng)使用CREATE DATABASE命令建立數(shù)據(jù)庫時(shí),通過指定UNDO TABLESPACE選項(xiàng),可以建立UNDO表空間.示例如下:

    CREATE DATABASE db01

    UNDO TABLESPACE undotbs_01

    DATAFILE ‘/u01/oracle/rbdb1/undo0101.dbf’ SIZE 30M;

    注意:UNDO TABLESPACE 子句不是必須的,如果使用自動UNDO管理模式,并且沒有指定該子句,那么建立數(shù)據(jù)庫時(shí)會自動生成名為SYS_UNDOTBSUNDO表空間.

    2,使用CREATE UNDO TABLESPACE命令建立UNDO表空間.

    CREATE UNDO TABLESPACE undotbs3

    DATAFILE ‘D:demoundotbs3.dbf’ SIZE 10M;

    修改UNDO表空間,

    使用ALTER TABLESPACE命令修改UNDO表空間.

    當(dāng)事務(wù)用盡了UNDO表空間后,使用ALTER TABLESPACE … ADD DATAFILE增加數(shù)據(jù)文件

    當(dāng)UNDO表空間所在的磁盤填滿是,使用ALTER TABLESPACE … RENAME DATAFIEL 命令移動數(shù)據(jù)文件到其他磁盤上.

    使用ALTER DATABASE … OFFLINE/ONLINE使表空間脫機(jī)/聯(lián)機(jī).

    當(dāng)數(shù)據(jù)庫處于ARCHIVELOG模式時(shí),使用ALTER TABLESPACE …BEGIN BACKUP/END BACKUP命令備份UNDO表空間.

    切換UNDO表空間.

    啟動例程并打開數(shù)據(jù)庫后,同一時(shí)刻特定例程只能使用一個(gè)UNDO表空間,切換UNDO表空間是指停止例程當(dāng)前使用的UNDO表空間,并啟動其他UNDO表空間,下面以啟用undotbs2表空間為例,說明切換UNDO表空間的方法.

    ALTER SYSTEM SET undo_tablespace=undotbs02;

    RAC(Real Application Cluster)機(jī)構(gòu)中,不同例程必須使用獨(dú)立的UNDO表空間,而不能共用同一個(gè)UNDO表空間.

    刪除UNDO表空間.

    當(dāng)前例程正在使用的UNDO表空間是不能被刪除的,如果確定要刪除當(dāng)前例程正在使用的UNDO表空間,應(yīng)首先切換UNDO表空間.然后刪除相應(yīng)的UNDO表空間.

    DROP TABLESPACE undotbs3;

    1,確定當(dāng)前例程正在使用的UNDO表空間.

    Show parameter undo_tablespace

    2,顯示數(shù)據(jù)庫的所有UNDO表空間.

    SELECT tablespace_name FROMdba_tablespaces WHERE contents=’UNDO’;

    3,顯示UNDO表空間統(tǒng)計(jì)信息.

    使用自動UNDO管理模式時(shí),需要合理地設(shè)置UNDO表空間的尺寸,為例合理規(guī)劃UNDO表空間尺寸,應(yīng)在數(shù)據(jù)庫運(yùn)行的高峰階段搜集UNDO表空間的統(tǒng)計(jì)信息.最終根據(jù)該統(tǒng)計(jì)信息確定UNDO表空間的尺寸.通過查詢動態(tài)性能視圖V%UNDOSTAT,可以搜集UNDO統(tǒng)計(jì)信息.

    SELECT TO_CHAR(BEGIN_TIME,’HH24:MI:SS’) BEGIN_TIME,

    TO_CHAR(END_TIME,’HH24:MI:SS’) END_TIME,

    UNDOBLKS

    FROM V$UNDOSTAT;

    BEGIN_TIME用于標(biāo)識起始統(tǒng)計(jì)時(shí)間,END_TIME用于標(biāo)識結(jié)束統(tǒng)計(jì)時(shí)間,UNDOBLKS用于標(biāo)識UNDO數(shù)據(jù)所占用的數(shù)據(jù)塊個(gè)數(shù).oracle每隔10分鐘生成一行統(tǒng)計(jì)信息.

    4,顯示UNDO段統(tǒng)計(jì)信息.

    使用自動UNDO管理模式時(shí),oracle會在UNDO表空間上自動建立10個(gè)UNDO,通過查詢動態(tài)信息視圖V$ROLLNAME,可以顯示所有聯(lián)機(jī)UNDO段的名稱,通過查詢動態(tài)性能視圖V$ROLLLISTAT,可以顯示UNDO段的統(tǒng)計(jì)信息.通過在V$ROLLNAMEV$ROLLLISTAT之間執(zhí)行連接查詢,可以監(jiān)視特定UNDO段的特定信息.

    SELECT a.name, b.xacts, b.writes, b.extents

    FROM v$rollname a, v$rollstat b

    WHERE a.usn=b.usn;

    Name用于標(biāo)識UNDO段的名稱,xacts用于標(biāo)識UNDO段所包含的活動事務(wù)個(gè)數(shù),

    Writes用于標(biāo)識在undo段上所寫入的字節(jié)數(shù),extents用于標(biāo)識UNDO段的區(qū)個(gè)數(shù).

    5,顯示活動事務(wù)信息.

    當(dāng)執(zhí)行DML操作時(shí),oracle會將這些操作的舊數(shù)據(jù)放到UNDO段中,動態(tài)性能視圖v$session用于顯示會話的詳細(xì)信息,動態(tài)性能視圖v$transaction用于顯示事務(wù)的詳細(xì)信息,動態(tài)性能視圖v$rollname用于顯示聯(lián)機(jī)UNDO段的名稱.通過在這3個(gè)動態(tài)性能視圖之間執(zhí)行連接查詢,可以確定正在執(zhí)行事務(wù)操作的會話,事務(wù)所使用的UNDO,以及事務(wù)所占用的UNDO塊個(gè)數(shù).

    Col username format a10

    Col name format a10

    SELECT a.username, b.name, c.used_ublk

    FROM v$session a, v$rollname b, v$transaction c

    WHERE a.saddr=c.ses_addr AND b.usn=c.xidusn

    AND a.username=’SCOTT’;

    6,顯示UNDO區(qū)信息

    數(shù)據(jù)字典視圖dba_undo_extents用于顯示UNDO表空間所有區(qū)的詳細(xì)信息.包括UNDO區(qū)尺寸和狀態(tài)等信息.

    SELECT extend_id, bytes, status FROM dba_undo_extents

    WHERE segment_name’_SYSSMU5$’;

    其中,extent_id用于標(biāo)識區(qū)編號,bytes用于標(biāo)識區(qū)尺寸,status用于標(biāo)識區(qū)狀態(tài)(ACTIVE:表示該區(qū)處于活動狀態(tài),EXPIRED:標(biāo)識該區(qū)未用).


    posted @ 2007-04-03 10:52 john 閱讀(1060) | 評論 (0)編輯 收藏

    修改oracle監(jiān)聽占用的8080端口

    sqlplus /nolog
    ?
    SQL*Plus: Release 9.2.0.4.0 - Production on Sat Aug 6 14:24:49 2005
    ?
    Copyright (c) 1982, 2002, Oracle Corporation.? All rights reserved.
    ?
    SQL> connect / as sysdba;
    Connected.
    -- 把HTTP/WEBDAV端口從8080改到8081
    SQL> call dbms_xdb.cfg_update(updateXML(dbms_xdb.cfg_get(),
    ? 2? '/xdbconfig/sysconfig/protocolconfig/httpconfig/http-port/text()',8081))
    ? 3? /
    ?
    Call completed.
    -- 把FTP端口從2100改到2111
    SQL>? call dbms_xdb.cfg_update(updateXML(dbms_xdb.cfg_get(),
    ? 2? '/xdbconfig/sysconfig/protocolconfig/ftpconfig/ftp-port/text()',2111))
    ? 3? /
    ?
    Call completed.
    ?
    SQL> commit;
    ?
    Commit complete.
    ?
    SQL>? exec dbms_xdb.cfg_refresh;
    ?
    PL/SQL procedure successfully completed.
    -- 檢查修改是否已經(jīng)成功
    SQL> select dbms_xdb.cfg_get from dual;
    ?
    CFG_GET
    --------------------------------------------------------------------------------
    <xdbconfig xmlns="http://xmlns.oracle.com/xdb/xdbconfig.xsd" xmlns:xsi="http://w
    ?

    posted @ 2007-03-21 19:41 john 閱讀(763) | 評論 (0)編輯 收藏

    用Linux構(gòu)建最好的FTP服務(wù)器

    用Linux構(gòu)建最好的FTP服務(wù)器


    2005-01-10 15:03:32 來自:http://www.zhcedu.com.cn
    在眾多網(wǎng)絡(luò)應(yīng)用中,F(xiàn)TP(文件傳輸協(xié)議)有著非常重要的地位。Internet中一個(gè)十分重
    要的資源就是軟件資源,而各種各樣的軟件資源大多數(shù)都放在FTP服務(wù)器中。與大多數(shù)
    Internet服務(wù)一樣,F(xiàn)TP也是一個(gè)客戶機(jī)/服務(wù)器系統(tǒng)。用戶通過一個(gè)支持FTP協(xié)議的客戶
    機(jī)程序,連接到主機(jī)上的FTP服務(wù)器程序。用戶通過客戶機(jī)程序向服務(wù)器程序發(fā)出命令,
    服務(wù)器程序執(zhí)行用戶發(fā)出的命令,并將執(zhí)行結(jié)果返回給客戶機(jī)。FTP服務(wù)可以根據(jù)服務(wù)對
    象的不同分為兩類:系統(tǒng)FTP服務(wù)器只允許系統(tǒng)上的合法用戶使用;匿名FTP服務(wù)器
    (Anonymous FTP Server)允許任何人登錄到FTP服務(wù)器去獲取文件。

    FTP的數(shù)據(jù)傳輸模式針對FTP數(shù)據(jù)連接而言,分為主動傳輸模式、被動傳輸模式和單端口傳
    輸模式三種。

    1.主動傳輸模式
    當(dāng)FTP的控制連接建立,客戶提出目錄列表、傳輸文件時(shí),客戶端發(fā)出PORT命令與服務(wù)器
    進(jìn)行協(xié)商,F(xiàn)TP服務(wù)器使用一個(gè)標(biāo)準(zhǔn)端口20作為服務(wù)器端的數(shù)據(jù)連接端口(ftp-data),
    與客戶建立數(shù)據(jù)連接。端口20只用于連接源地址是服務(wù)器端的情況,并且端口20沒有監(jiān)聽
    進(jìn)程來監(jiān)聽客戶請求。

    在主動傳輸模式下,F(xiàn)TP的數(shù)據(jù)連接和控制連接方向相反,由服務(wù)器向客戶端發(fā)起一個(gè)用
    于數(shù)據(jù)傳輸?shù)倪B接。客戶端的連接端口由服務(wù)器端和客戶端通過協(xié)商確定。

    2.被動傳輸模式
    當(dāng)FTP的控制連接建立,客戶提出目錄列表、傳輸文件時(shí),客戶端發(fā)送PASV命令使服務(wù)器
    處于被動傳輸模式,F(xiàn)TP服務(wù)器等待客戶與其聯(lián)系。FTP服務(wù)器在非20端口的其它數(shù)據(jù)傳輸
    端口上監(jiān)聽客戶請求。

    在被動傳輸模式下,F(xiàn)TP的數(shù)據(jù)連接和控制連接方向一致,由客戶端向服務(wù)器發(fā)起一個(gè)用
    于數(shù)據(jù)傳輸?shù)倪B接。客戶端的連接端口是發(fā)起該數(shù)據(jù)連接請求時(shí)使用的端口。當(dāng)FTP客戶
    在防火墻之外訪問FTP服務(wù)器時(shí),需要使用被動傳輸模式。

    3.單端口模式
    除上述兩種模式之外,還有一種單端口模式。該模式的數(shù)據(jù)連接請求由FTP服務(wù)器發(fā)起。
    使用該傳輸模式時(shí),客戶端的控制連接端口和數(shù)據(jù)連接端口一致。因?yàn)檫@種模式無法在短
    時(shí)間連續(xù)輸入數(shù)據(jù)、傳輸命令,因此并不常用。

    Linux下有很多可用的FTP服務(wù)器,其中比較流行的有WU-FTP(Washington University
    FTP)和VSFTP。Red Hat 8.0中自帶了WU-FTP和VSFTP兩個(gè)軟件。WU-FTP是一個(gè)著名的FTP
    服務(wù)器軟件,它功能強(qiáng)大,能夠很好地運(yùn)行于眾多Unix操作系統(tǒng)中。不過作為后起之秀的
    VSFTP越來越流行,在Red Hat 9.0發(fā)行版中就只帶有VSFTP。

    VSFTP中VS的意思是“Very Secure”。從名稱可以看出,從一開始,軟件的編寫者就非常注
    重其安全性。除與生俱來的安全性外,VSFTP還具有高速、穩(wěn)定的性能特點(diǎn)。在穩(wěn)定性方
    面,VSFTP可以在單機(jī)(非集群)上支持4000個(gè)以上的并發(fā)用戶同時(shí)連接。據(jù)
    ftp.redhat.com的數(shù)據(jù),VSFTP最多可以支持15000個(gè)并發(fā)用戶。

    快速構(gòu)建FTP服務(wù)器

    FTP服務(wù)器實(shí)現(xiàn)的基本功能是上傳下載,下面就分幾個(gè)步驟來搭建一個(gè)可以實(shí)現(xiàn)下載功能
    的簡易FTP服務(wù)器。

    1.安裝FTP服務(wù)器
    如果在安裝系統(tǒng)時(shí)沒有選擇安裝FTP服務(wù)器,可以通過Red Hat 9.0中的“添加/刪除應(yīng)用程
    序”工具進(jìn)行安裝。具體方法是,選擇“主選單”→“系統(tǒng)設(shè)置”→“添加/刪除應(yīng)用程序”,在彈
    出的界面中選中FTP服務(wù)器,單擊“更新”即可。

    如果無法確認(rèn)是否安裝了該軟件,可以使用以下命令查看:

    #rpm -qa|grep vsftpd
    vsftpd-1.1.3-8

    2.啟動FTP服務(wù)器
    套用Red Hat 9.0的預(yù)設(shè)范例直接啟動VSFTP。
    # /sbin/service vsftpd start


    為vsftpd啟動vsftpd: [確定]

    3.在/var/ftp/pub目錄下創(chuàng)建一個(gè)名為test.txt的文件,文件內(nèi)容為“This is a test
    file”。

    4.測試
    使用FTP客戶端登錄到本地服務(wù)器,然后以匿名身份(anonymous)登錄:

    # ftp 127.0.0.1
    Connected to 127.0.0.1 (127.0.0.1).
    220 (vsFTPd 1.1.3)
    Name (127.0.0.1:root): anonymous
    331 Please specify the password.
    Password:
    230 Login successful. Have fun.
    Remote system type is UNIX.
    Using binary mode to transfer files.

    這樣就成功地登錄到FTP服務(wù)器。可以顯示服務(wù)器目錄列表如下:

    ftp> ls
    227 Entering Passive Mode (127,0,0,1,63,15)
    drwxr-xr-x 2 0 0 4096 Dec 04 01:35 pub
    226 Directory send OK.

    切換到pub目錄下,并顯示目錄內(nèi)容,可以找到剛才創(chuàng)建的文件test.txt:

    ftp> cd pub
    250 Directory successfully changed.
    ftp> ls
    227 Entering Passive Mode (127,0,0,1,232,34)
    150 Here comes the directory listing.
    -rw-r--r-- 1 0 0 21 Dec 04 01:35 test.txt
    226 Directory send OK.

    下載test.txt文件:

    ftp> mget test.txt
    mget test.txt? y
    227 Entering Passive Mode (127,0,0,1,186,210)
    150 Opening BINARY mode data connection for test.txt (21 bytes).
    226 File send OK.
    21 bytes received in 0.0108 secs (1.9 Kbytes/sec)

    查看本機(jī)目錄內(nèi)容,可以看到test.txt已成功下載到本機(jī)。

    ftp> !ls
    a EIO_Binders initrd mnt proc tftpboot ylg.txt
    bin etc lib mymnt root tmp
    boot home lost+found myshare sbin usr
    dev id_dsas.pub misc opt test.txt var

    嘗試上傳名為ylg.txt的文件,可以看到請求被拒絕了。

    ftp> put ylg.txt
    local: ylg.txt remote: ylg.txt
    227 Entering Passive Mode (127,0,0,1,243,10)
    550 Permission denied.

    退出登錄:

    ftp> bye
    221 Goodbye.

    由測試可以看出,已經(jīng)可以下載文件,但不能上傳文件(也不能在服務(wù)器上創(chuàng)建目錄和文
    件)。實(shí)際上這是一個(gè)專門提供下載服務(wù)的匿名FTP服務(wù)器。

    從上面的步驟可以看出,并不需要做什么配置就可以完成一個(gè)簡易FTP服務(wù)器的架設(shè)。這
    是因?yàn)镽ed Hat已經(jīng)配置好一個(gè)缺省的FTP服務(wù)器。不過在實(shí)際應(yīng)用中,大部分情況下這個(gè)
    簡易的服務(wù)器并不能滿足需求。

    進(jìn)一步配置FTP服務(wù)器

    下面將創(chuàng)建一個(gè)能夠滿足常用需求的FTP服務(wù)器。實(shí)際應(yīng)用中,F(xiàn)TP服務(wù)器一般要同時(shí)提供
    上傳和下載功能。此外,出于安全考慮,還需要有用戶身份驗(yàn)證、用戶權(quán)限設(shè)置及空間管
    理等。下面就來搭建這樣一個(gè)FTP服務(wù)器。

    1.創(chuàng)建歡迎語。如果希望使用者在進(jìn)入目錄時(shí),能夠看到歡迎語或?qū)Ρ灸夸浀慕榻B,可
    以通過以下方法來實(shí)現(xiàn)。

    確定/etc/vsftpd/vsftpd.conf文件中dirmessage_enable=YES,默認(rèn)情況下,Red Hat
    9.0有此設(shè)置。接著,在目錄中新增名為.message的文件。本例在/home/ylg目錄下創(chuàng)建一
    個(gè).message文件,其內(nèi)容為“歡迎來到我的FTP站點(diǎn)”。

    2.更換FTP服務(wù)器的默認(rèn)端口。將預(yù)設(shè)的21端口改為2121,這樣做是基于安全的考慮。更
    改方法為,使用vi打開/etc/vsftpd/vsftpd.conf:
    #vi /etc/vsftpd/vsftpd.conf

    在文件最后增加如下一行內(nèi)容:
    listen_port=2121

    3.取消anonymous登錄的功能。在vsftpd.conf文件中找到如下一行,并將其值改為“NO”:
    anonymous_enable=YES

    4.設(shè)定使用者不得更改目錄。這樣做的目的也是基于安全性的考慮。一般情況下,使用
    者的預(yù)設(shè)目錄為/home/username。若是不希望使用者在登錄后能夠切換至上一層目錄
    /home,則可通過以下設(shè)置來實(shí)現(xiàn)。在/etc/vsftpd/vsftpd.conf文件中找到以下三行內(nèi)容:

    #chroot_list_enable=YES
    # (default follows)
    #chroot_list_file=/etc/vsftpd.chroot_list

    將其改為:

    chroot_list_enable=YES
    # (default follows)
    chroot_list_file=/etc/vsftpd/chroot_list

    新增一個(gè)文件/etc/vsftpd/chroot_list,文件內(nèi)容為兩個(gè)用戶名:

    ylg
    user1

    5.針對不同的使用者限制不同的速度。假設(shè)用戶ylg所能使用的最高速度為500Kb/s,用
    戶user1所能使用的最高速度為250Kb/s,可以通過以下方法設(shè)置。在
    /etc/vsftpd/vsftpd.conf文件尾部新增以下一行:
    user_config_dir=/etc/vsftpd/userconf
    增加一個(gè)名為/etc/vsftpd/userconf的目錄:
    #mkdir /etc/vsftpd/userconf

    在/etc/vsftpd/userconf下新增一個(gè)名為ylg的文件,其內(nèi)容如下所示:
    local_max_rate=500000

    在/etc/vsftpd/userconf目錄下新增一個(gè)名為user1的文件,其內(nèi)容如下所示:
    local_max_rate=250000

    VSFTP對于速度的限制范圍大概在80%到120%之間,也就是限制最高速度為100Kb/s,但
    實(shí)際的速度可能在80Kb/s到120Kb/s之間。如果頻寬不足,數(shù)值會低于此限制。

    6.對于每一個(gè)聯(lián)機(jī)用戶,都以獨(dú)立的進(jìn)程來運(yùn)行。一般情況下,在啟動VSFTP時(shí),只會看
    到一個(gè)名為vsftpd的進(jìn)程在運(yùn)行。但若是讀者希望每一個(gè)聯(lián)機(jī)用戶都能以獨(dú)立的進(jìn)程來呈
    現(xiàn),則可通過在/etc/vsftpd/vsftpd.conf文件中增加以下一行來實(shí)現(xiàn):
    setproctitle_enable=YES

    7.保存/etc/vsftpd/vsftpd.conf文件,然后重新啟動vsftpd:
    #service vsftpd restart

    8.測試剛創(chuàng)建的FTP服務(wù)器。
    以缺省方式登錄會被拒絕,因?yàn)榇藭r(shí)的默認(rèn)端口號已經(jīng)更改為2121,所以登錄時(shí)需指定端
    口。

    # ftp 127.0.0.1
    ftp: connect: Connection refused

    此時(shí)也不能再使用匿名方式登錄:

    # ftp 127.0.0.1 2121
    Connected to 127.0.0.1 (127.0.0.1).
    220 (vsFTPd 1.1.3)
    Name (127.0.0.1:root): anonymous
    331 Please specify the password.
    Password:
    530 Login incorrect.
    Login failed.

    如果以用戶ylg則可以成功登錄(指定端口2121),并顯示歡迎信息:

    # ftp 127.0.0.1 2121
    Connected to 127.0.0.1 (127.0.0.1).
    220 (vsFTPd 1.1.3)
    Name (127.0.0.1:root): ylg
    331 Please specify the password.
    Password:
    230-歡迎來到我的FTP站點(diǎn)
    230 Login successful. Have fun.
    Remote system type is UNIX.
    Using binary mode to transfer files.

    因?yàn)樵谠O(shè)置中設(shè)定了不能切換目錄,所以下列命令無法正確執(zhí)行:

    ftp> cd /home
    550 Failed to change directory.

    再來測試一下上傳和下載。首先下載服務(wù)器目錄中的test.txt文件:

    ftp> get test.txt
    local: test.txt remote: test.txt
    227 Entering Passive Mode (127,0,0,1,243,215)
    150 Opening BINARY mode data connection for test.txt (21 bytes).
    226 File send OK.
    21 bytes received in 0.00308 secs (6.7 Kbytes/sec)

    可以通過!ls命令看到本機(jī)目錄中已成功下載該文件。然后上傳本機(jī)目錄中的ylg.txt文件
    到服務(wù)器:

    ftp> put ylg.txt
    local: ylg.txt remote: ylg.txt
    227 Entering Passive Mode (127,0,0,1,133,248)
    150 Ok to send data.
    226 File receive OK.
    19 bytes sent in 0.0401 secs (0.46 Kbytes/sec)

    用ls命令查看服務(wù)器目錄,會發(fā)現(xiàn)該文件已成功上傳。

    為了測試不同連機(jī)用戶使用的是不同進(jìn)程,可以使用ps -ef指令,顯示如下所示:

    # ps -ef|grep ftp
    root 12972 1356 0 13:44 pts/1 00:00:00 ftp 127.0.0.1 2121
    nobody 12973 12908 0 13:44 ? 00:00:00 [vsftpd]
    ylg 12975 12973 0 13:44 ? 00:00:00 [vsftpd]
    user1 13013 13011 0 13:46 ? 00:00:00 [vsftpd]
    root 13041 13015 0 13:47 pts/4 00:00:00 grep ftp

    到現(xiàn)在為止,一個(gè)基本可以滿足普通使用需求的FTP服務(wù)器就已經(jīng)架設(shè)完成。

    在實(shí)際應(yīng)用中,有時(shí)為了增加安全性,會將FTP服務(wù)器置于防火墻之后。如本文開頭所
    述,被動傳輸模式適合于帶有防火墻的情況。下面就來創(chuàng)建一個(gè)防火墻后的FTP服務(wù)器,
    該服務(wù)器FTP端口為2121,數(shù)據(jù)傳輸端口為2020。

    執(zhí)行以下兩行指令,只允許2121和2020端口打開,其余端口關(guān)閉:

    #iptables -A INPUT -p tcp -m multiport --dport 2121,2020 -j ACCEPT
    #iptables -A INPUT -p tcp -j REJECT --reject-with tcp-reset

    修改/etc/vsftpd/vsftpd.conf文件,在文本最后添加以下兩行:

    listen_port=2121
    ftp_data_port=2020

    重新啟動vsftpd:
    #service vsftpd restart

    有時(shí)希望直接在/etc/hosts.allow中定義允許或拒絕某一源地址,可以通過以下配置來實(shí)
    現(xiàn)。先確保/etc/vsftpd/vsftpd.conf中tcp_wrappers=YES,Red Hat 9.0中,這是默認(rèn)
    值。重新啟動vsftpd:
    #service vsftpd restart

    假設(shè)提供168.192.2.1和210.31.8.1到210.31.8.254的連接,則可對/etc/hosts.allow進(jìn)
    行如下設(shè)定:

    vsftpd : 168.192.2.1 210.31.8. : allow
    ALL : ALL : DENY

    配置虛擬用戶FTP

    上面配置的FTP服務(wù)器有一個(gè)特點(diǎn),就是FTP服務(wù)器的用戶本身也是系統(tǒng)用戶。這顯然是一
    個(gè)安全隱患,因?yàn)檫@些用戶不僅能夠訪問FTP,也能夠訪問其它的系統(tǒng)資源。如何解決這
    個(gè)問題呢?答案就是創(chuàng)建一個(gè)虛擬用戶的FTP服務(wù)器。虛擬用戶的特點(diǎn)是只能訪問服務(wù)器
    為其提供的FTP服務(wù),而不能訪問系統(tǒng)的其它資源。所以,如果想讓用戶對FTP服務(wù)器站內(nèi)
    具有寫權(quán)限,但又不允許訪問系統(tǒng)其它資源,可以使用虛擬用戶來提高系統(tǒng)的安全性。

    在VSFTP中,認(rèn)證這些虛擬用戶使用的是單獨(dú)的口令庫文件(pam_userdb),由可插入認(rèn)
    證模塊(PAM)認(rèn)證。使用這種方式更加安全,并且配置更加靈活。 下面介紹配置過程。

    1.生成虛擬用戶口令庫文件。為了建立此口令庫文件,先要生成一個(gè)文本文件。該文件
    的格式如下,單數(shù)行為用戶名,偶數(shù)行為口令:

    #vi account.txt
    ylg
    1234
    zhanghong
    4321
    gou
    5678

    2.生成口令庫文件,并修改其權(quán)限:

    #db_load -T -t hash -f ./account.txt /etc/vsftpd/account.db
    #chmod 600 /etc/vsftpd/account.db

    3.新建一個(gè)虛擬用戶的PAM文件。加上如下兩行內(nèi)容:

    #vi /etc/pam.d/vsftp.vu
    auth required /lib/security/pam_userdb.so db=/etc/vsftpd/account
    account required /lib/security/pam_userdb.so db=/etc/vsftpd/account

    4.建立虛擬用戶,設(shè)置該用戶所要訪問的目錄,并設(shè)置虛擬用戶訪問的權(quán)限:

    #useradd -d /ftpsite virtual_user
    #chmod 700 /ftpsite

    經(jīng)過該步驟的設(shè)置,/ftpsite就是virtual_user用戶的主目錄,該用戶也是/ftpsite目錄
    的擁有者。除root用戶之外,只有該用戶具有對該目錄的讀、寫和執(zhí)行的權(quán)限。

    5.生成一個(gè)測試文件。先切換至virtual_user用戶身份,然后在/ftpsite目錄下創(chuàng)建一
    個(gè)文件:

    #su -virtual_user
    $vi /ftpsite/mytest
    This is a test file.
    $su - root

    6.編輯/etc/vsftpd/vsftpd.conf文件,使其整個(gè)文件內(nèi)容如下所示(去掉了注釋內(nèi)容):

    anonymous_enable=NO
    local_enable=YES
    local_umask=022
    xferlog_enable=YES
    connect_from_port_20=YES
    xferlog_std_format=YES
    listen=YES
    write_enable=YES
    anon_upload_enable=YES
    anon_mkdir_write_enable=YES
    anon_other_write_enable=YES
    one_process_model=NO
    chroot_local_user=YES
    ftpd_banner=Welcom to my FTP server.
    anon_world_readable_only=NO
    guest_enable=YES
    guest_username=virtual_user
    pam_service_name=vsftp.vu

    上面代碼中,guest_enable=YES表示啟用虛擬用戶;guest_username=virtual則是將虛擬
    用戶映射為本地用戶,這樣虛擬用戶登錄后才能進(jìn)入本地用戶virtual的目錄/ftpsite;
    pam_service_name=vsftp.vu指定PAM的配置文件為vsftp.vu。

    7.重新啟動VSFTP:
    #service vsftpd restart

    8.以虛擬用戶gou(Linux中并無該賬號)進(jìn)行測試:

    # ftp 127.0.0.1
    Connected to 127.0.0.1 (127.0.0.1).
    220 Welcom to my FTP server.
    Name (127.0.0.1:root): gou
    331 Please specify the password.
    Password:
    230 Login successful. Have fun.
    Remote system type is UNIX.
    Using binary mode to transfer files.

    測試下載服務(wù)器目錄中的一個(gè)文件mytest:

    ftp> get mytest
    local: mytest remote: mytest
    227 Entering Passive Mode (127,0,0,1,159,19)
    150 Opening BINARY mode data connection for mytest (21 bytes).
    226 File send OK.
    21 bytes received in 0.00038 secs (54 Kbytes/sec)

    測試上傳本機(jī)目錄中的文件vsftpd.conf:

    ftp> !ls
    account.db chroot_list k mytest userconf vsftpd.conf
    ftp> put vsftpd.conf
    local: vsftpd.conf remote: vsftpd.conf
    227 Entering Passive Mode (127,0,0,1,117,203)
    150 Ok to send data.
    226 File receive OK.
    4229 bytes sent in 0.00195 secs (2.1e+03 Kbytes/sec)

    可以看到,使用沒有系統(tǒng)賬號的虛擬用戶可以成功完成上傳、下載的工作。但該FTP虛擬
    服務(wù)器只允許虛擬用戶登錄,其它系統(tǒng)用戶無法登錄,如系統(tǒng)用戶user1不是虛擬用戶,
    則不能登錄該虛擬服務(wù)器。

    # ftp 127.0.0.1
    Connected to 127.0.0.1 (127.0.0.1).
    220 Welcom to my FTP server.
    Name (127.0.0.1:root): user1
    331 Please specify the password.
    Password:
    530 Login incorrect.
    Login failed.

    在虛擬FTP服務(wù)器中,也可以對各個(gè)用戶的權(quán)限進(jìn)行設(shè)置。方法是在/etc/vsftpd.conf文
    件中添加如下一行:
    user_config_dir=用戶配置文件目錄

    然后在用戶配置文件目錄下創(chuàng)建相應(yīng)的用戶配置文件,比如為上述名為gou的用戶創(chuàng)建一
    個(gè)配置文件(假設(shè)配置文件目錄為/etc/user_config_dir):

    #vi /etc/user_config_dir/gou
    write_enable=NO
    anono_upload_enable=NO

    重啟FTP服務(wù)器,這時(shí)再使用賬號gou來登錄,就已經(jīng)沒有上傳的權(quán)限了。

    posted @ 2006-12-26 22:37 john 閱讀(428) | 評論 (0)編輯 收藏

    更改Oracle的默認(rèn)監(jiān)聽端口 1521

    如何更改Oracle的默認(rèn)監(jiān)聽端口(1521)
    Oracle 的默認(rèn)監(jiān)聽端口為1521,你可以方便的依照下列步驟修改為其他端口:
    [oracle@dbserver2 admin]$ cd $ORACLE_HOME/network/admin
    [oracle@dbserver2 admin]$ vi listener.ora
    修改這個(gè)文檔中的1521端口為你需要的端口your port
    [oracle@dbserver2 admin]$ lsnrctl stop
    [oracle@dbserver2 admin]$ lsnrctl start
    修改客戶端的連接

    posted @ 2006-12-26 22:05 john 閱讀(4180) | 評論 (0)編輯 收藏

    修改 Oracle9i 8080端口問題

    修改 Oracle9i 8080端口問題

    Oracle 9i開始,創(chuàng)建數(shù)據(jù)庫時(shí)默認(rèn)包含了XDB特性。一旦啟動了數(shù)據(jù)庫和Listener,Oracle XDB的http服務(wù)就占用8080端口,剛好和JBoss、Tomcat等默認(rèn)端口沖突。除了修改Tomcat等外,還可以修改XDB的配置。
    Oracle XDB的端口設(shè)置不在配置文件中,而是在數(shù)據(jù)庫里。修改XDB的http和ftp服務(wù)端口的方法有3種:

    1.使用sys登錄Oracle,利用dbms_xdb修改端口設(shè)置

    ? SQL> -- Change the HTTP/WEBDAV port from 8080 to 8081
    ? SQL> call dbms_xdb.cfg_update(updateXML(
    ??? 2??????? dbms_xdb.cfg_get()
    ??? 3????? , '/xdbconfig/sysconfig/protocolconfig/httpconfig/http-port/text()'
    ??? 4????? , 8081))
    ??? 5? /

    ? Call completed.


    ? SQL> -- Change the FTP port from 2100 to 2111
    ? SQL> call dbms_xdb.cfg_update(updateXML(
    ??? 2???????? dbms_xdb.cfg_get()
    ??? 3?????? , '/xdbconfig/sysconfig/protocolconfig/ftpconfig/ftp-port/text()'
    ??? 4?????? , 2111))
    ??? 5? /

    ? Call completed.


    ? SQL> COMMIT;

    ? Commit complete.


    ? SQL> EXEC dbms_xdb.cfg_refresh;

    ? PL/SQL procedure successfully completed.


    2.使用OEM console,選擇數(shù)據(jù)庫,XML Database,Configuration。更改XDB的有關(guān)設(shè)置。

    3.去掉數(shù)據(jù)庫的初始化參數(shù):? dispatchers='(PROTOCOL=TCP) (SERVICE=XDB)',將會禁止XDB的http和ftp服務(wù)。

    posted @ 2006-12-26 21:59 john 閱讀(390) | 評論 (0)編輯 收藏

    PCC-S-02014, Encountered the symbol "..." when expecting one of the following:

    proc cpp_suffix=cpp code=cpp txsPublic.pcc define=__linux UNSAFE_NULL=YES MODE=ORACLE DBMS=V8 CHAR_MAP=STRING INCLUDE=/home/tax/100/src/public/include INCLUDE=/home/tax/100/src/server/include INCLUDE=/usr/oracle/product/9.2.0/precomp/public

    Pro*C/C++: Release 9.2.0.6.0 - Production on Fri Nov 24 17:07:54 2006
    Syntax error at line 52, column 37, file /usr/include/c++/3.4.3/bits/concept_check.h:
    Error at line 52, column 37 in file /usr/include/c++/3.4.3/bits/concept_check.h
    #define __glibcxx_function_requires(...)
    ....................................1
    PCC-S-02014, Encountered the symbol "..." when expecting one of the following:

    ?? ) an identifier, define, elif, else, endif, error, if, ifdef,
    ?? ifndef,
    解決方法:
    1、配置好?$ORACLE_HOME/precomp/admin/pcscfg.cfg?文件
    ???根據(jù)你的系統(tǒng)不同,大概像這樣

    				
    sys_include=(/usr/lib/gcclib/i386redhatlinux/3.2.2/include,/u01/oracle/product/8.1.7/precomp/public,/usr/include,/usr/include/sys)
    include=(/u01/oracle/product/8.1.7/precomp/public)
    include=/u01/oracle/product/8.1.7/precomp/hdrs
    include=/u01/oracle/product/8.1.7/tpcc2x_2/src
    include=/u01/oracle/product/8.1.7/precomp/precomp/include
    include=/u01/oracle/product/8.1.7/precomp/oracore/include
    include=/u01/oracle/product/8.1.7/precomp/oracore/public
    include=/u01/oracle/product/8.1.7/precomp/rdbms/include
    include=/u01/oracle/product/8.1.7/precomp/rdbms/public
    include=/u01/oracle/product/8.1.7/precomp/rdbms/demo
    include=/u01/oracle/product/8.1.7/precomp/nlsrtl/include
    include=/u01/oracle/product/8.1.7/precomp/nlsrtl/public
    include=/u01/oracle/product/8.1.7/precomp/network_src/include
    include=/u01/oracle/product/8.1.7/precomp/network_src/public
    include=/u01/oracle/product/8.1.7/precomp/network/include
    include=/u01/oracle/product/8.1.7/precomp/network/public
    include=/u01/oracle/product/8.1.7/precomp/plsql/public
    ltype=short


    ???
    2、預(yù)編譯的時(shí)候加上?parse=none?選項(xiàng)
    ????proc?iname=***??parse=none

    3、編譯的時(shí)候要鏈接oracle的庫文件,?加選項(xiàng)?-lclntsh
    ?????下面是我參照別的網(wǎng)友的一個(gè)makefile文件,
    ???

    INCLDIR=?-I.?-I/u01/oracle/product/8.1.7/precomp/public?-I/u01/oracle/product/8.1.7/rdbms/public?-I/u01/oracle/product/8.1.7/rdbms/demo?-I/u01/oracle/product/8.1.7/plsql/public?-I/u01/oracle/product/8.1.7/network/public?

    DFLAGS=?-DPRECOMP?-DLINUX?-D_GNU_SOURCE?-DSLTS_ENABLE?-DSLMXMX_ENABLE?-D_REENTRANT?-DNS_THREADS

    CFLAGS=?-O3

    LIBPATH=?-L/u01/oracle/product/8.1.7/lib/

    LIBS=-lclntsh?`cat?/u01/oracle/product/8.1.7/lib/sysliblist`?-ldl?-lm

    myproc:myproc.pc
    proc?parse=no?iname=myproc.pc?include=$(ORACLE_HOME)/precomp/public
    gcc??-o?$@?$@.c?-I$(ORACLE_HOME)/precomp/public?-L$(ORACLE_HOME)/lib?-lclntsh?-lclient8?$(LIBPATH)?$(LIBS)

    clean:
    rm?*.lis?myproc.c?myproc

    posted @ 2006-11-24 11:04 john 閱讀(11484) | 評論 (6)編輯 收藏

    單點(diǎn)登錄簡單實(shí)現(xiàn)

    單點(diǎn)登錄的簡單實(shí)現(xiàn)

      在門戶項(xiàng)目中,經(jīng)常會遇到如何實(shí)現(xiàn)單點(diǎn)登錄的問題,下面就本人的經(jīng)驗(yàn)做個(gè)總結(jié)。歡迎大家進(jìn)行補(bǔ)充討論。

    單點(diǎn)登錄的具體實(shí)現(xiàn)有很多種選擇,包括:

    1. 采用專門的SSO商業(yè)軟件: 主要有:Netgrity的Siteminder,已經(jīng)被CA收購。Novell 公司的iChain。RSA公司的ClearTrust等。
    2. 采用門戶產(chǎn)品供應(yīng)商自己的SSO產(chǎn)品,如:BEA的WLES,IBM 的Tivoli Access Manager,Sun 公司的identity Server,Oracle公司的OID等。
    3. 這些商業(yè)軟件一般適用于客戶對SSO的需求很高,并且企業(yè)內(nèi)部采用COTS軟件如:Domino,SAP,Sieble的系統(tǒng)比較多的情況下采用。并結(jié)合身份管理。統(tǒng)一認(rèn)證等項(xiàng)目采用。采用這些軟件一般都要對要集成的系統(tǒng)做些改造,如在要集成的系統(tǒng)上安裝AGENT。現(xiàn)在一般只提供常見軟件如:Domino,SAP,Sieble,常見應(yīng)用服務(wù)器:weblogic,websphere等的AGENT。要先統(tǒng)一這些系統(tǒng)的認(rèn)證。一般采用LDAP或數(shù)據(jù)庫。然后才能實(shí)現(xiàn)SSO。比較麻煩。
    4. 另外,如果不想掏銀子,也有OPEN SOURCE的SSO軟件可選:主要有:http://www.josso.org/https://opensso.dev.java.net/http://www.sourceid.org 等。具體怎么樣就不清楚了。

      如果項(xiàng)目對SSO的要求比較低,又不想對要被集成的系統(tǒng)做任何改動,可采用下面介紹的方式簡單實(shí)現(xiàn):下面我們通過一個(gè)例子來說明。假如一個(gè)門戶項(xiàng)目要對下面的幾個(gè)系統(tǒng)做SSO。

    圖一

      用戶在這些系統(tǒng)中的用戶名,密碼各不相同,如:員工號為001的員工在這些系統(tǒng)中的用戶名,密碼分別如下:

    用戶 系統(tǒng) 用戶名 密碼
    001 Portal系統(tǒng) A 1234
    001 郵件系統(tǒng) B 2345
    001 DOMINO系統(tǒng) C AAAA
    001 報(bào)銷系統(tǒng) D CCCC
    001 工資系統(tǒng) E BBBB

    首先,建立員工在PORTAL系統(tǒng)中的用戶名和其他系統(tǒng)中的用戶名之間的對應(yīng)關(guān)系

      首先,要建立員工在PORTAL系統(tǒng)中的用戶名和其他系統(tǒng)中的用戶名之間的對應(yīng)關(guān)系并保存。可保存在表中或LDAP中或文件系統(tǒng)中。當(dāng)然要考慮這些系統(tǒng)之間的數(shù)據(jù)同步問題。比較好的方式是找到用戶在這些系統(tǒng)中的都存在的唯一信息(如員工號,MAIL地址,姓名等)。通過唯一信息實(shí)時(shí)到各個(gè)系統(tǒng)中去取認(rèn)證所需要的信息。就不需要考慮數(shù)據(jù)同步問題。比較實(shí)用。可以建立類似下面的表:密碼可采用加密保存。如果是采用BEA的Weblogic Portal,可采用UUP來保存這些信息。

    	(
    	
    	user	 varchar2(20),   	/*用戶名*/
    	app_name varchar2(20),  	/*應(yīng)用系統(tǒng)*/
    	architect varchar2(4),  		/*應(yīng)用系統(tǒng)的架構(gòu)BS或CS*/
    	app_company varchar2(50),          /*用戶所屬分公司*/
    	app_department varchar2(50),      /*用戶所在的部門*/
    	app_user varchar2(15),                 /*在該系統(tǒng)中的用戶名*/
    	app_passwd varchar2(15), 	/*在該系統(tǒng)中的密碼*/
    	app_cookie varchar2(30),              /*COOKIE名稱*/
    	form_user varchar2(20),                /*認(rèn)證頁面中FORM的用戶名字段*/
    	form_passwd varchar2(20),          /*認(rèn)證頁面中FORM的密碼字段*/
    	app_special  varchar2(20)           /*其他*/
    	);
    

    通過IFRAME或超連接方式集成目標(biāo)系統(tǒng),并進(jìn)行SSO

      通過IFRAME或超連接方式集成目標(biāo)系統(tǒng),并在URL中帶上用戶名和密碼。如集成DOMINO可采用如下方式:

      <IFRAME src=http://host1/names.nsf?Login&Username=admin&Password=pass&RedirectTo=/names.nsf
    width="100%" frameborder="0" align="middle" height="100%" hspace="0" marginheight="0" marginwidth="0" scrolling="yes" style="background-color:#f7f7ff;">
    </IFRAME>

      或:
    Href src=“http:// host1/names.nsf?Login&Username=admin&Password=pass&RedirectTo=/names.nsf
    以上采用的是在HTTP中直接傳遞明碼,為提高安全性,可采用HTTPS來傳遞用戶名和密碼。另外采用這種方式被集成的系統(tǒng)必須支持FORM方式認(rèn)證。J2EE應(yīng)用,DOMINO等都支持FORM認(rèn)證。

      這兩種方式如果SSO成功,就自動進(jìn)入目標(biāo)系統(tǒng)的界面,如果實(shí)現(xiàn)會顯示目標(biāo)系統(tǒng)的登錄界面。其效果圖如下:

    登錄界面

      這種方式,必須維護(hù)對應(yīng)關(guān)系表,如上面的sso_info。更好的方式是提供界面,讓最終用戶自己維護(hù)這種對應(yīng)關(guān)系,可模仿Compoze portlets for lotus的做法,在用戶第一次進(jìn)入要與之做SSO的系統(tǒng)時(shí),如DOMINO系統(tǒng),顯示一個(gè)界面,讓用戶自己輸入他在該系統(tǒng)中的用戶名/密碼等信息。并保存到表中或LDAP等其他數(shù)據(jù)源中。以后用戶要進(jìn)入這些系統(tǒng)時(shí),就直接從表中或其他數(shù)據(jù)源中取用戶的用戶名/密碼等信息,幫助用戶做認(rèn)證。建議采用這種方式。如下圖所示。如果用戶改變了自己在DOMINO系統(tǒng)中的用戶名,密碼。從門戶系統(tǒng)進(jìn)入DOMINO系統(tǒng)時(shí),認(rèn)證會失敗,就重新顯示類似下面的界面。讓用戶重新輸入他在DOMINO系統(tǒng)中新的用戶名,密碼并保存。

    認(rèn)證失敗

      以上這種實(shí)現(xiàn)方式,一般需要瀏覽器支持COOKIE,所以要注意瀏覽器的配置,在開發(fā)階段,為方便調(diào)試,可設(shè)置IE,讓它顯示COOKIE的名稱。如下所示:

    瀏覽器的配置

      采用這種方式,對要集成的系統(tǒng)不需要做任何的改動。如果PORTAL系統(tǒng)中的用戶在被集成的系統(tǒng)中的權(quán)限都一樣,可采用建立一個(gè)通用用戶的做法。也就是所有在PORTAL系統(tǒng)中的用戶都采用這個(gè)通用用戶進(jìn)入目標(biāo)系統(tǒng)。這種方式等于是采用頁面集成方式做集成。比較方便使用。另外,有時(shí)候需要采用調(diào)用API,或配置Adapter等應(yīng)用集成方式來集成其他系統(tǒng),一般也是通過定義一個(gè)連接專用的用戶。在API中或在配置Adapter的時(shí)候?qū)懰馈H绮捎肑AVA API方式集成DOMINO:

      lotus.domino.Session dominoSession = NotesFactory.createSession(dominoServer, “admin”, “password”);

    CS結(jié)構(gòu)實(shí)現(xiàn)方式

      經(jīng)常有人問CS結(jié)構(gòu)的應(yīng)用如何實(shí)現(xiàn)SSO,本人的建議是對這種系統(tǒng)不要自己去實(shí)現(xiàn)SSO。很麻煩,其實(shí)輸個(gè)用戶名,密碼沒什么大不了的。如果要實(shí)現(xiàn),一是采用商業(yè)軟件。另外也可以采用以下方式:在PORTAL的PORTLET上建立超連接。并通過APPLET方式啟動CS結(jié)構(gòu)的應(yīng)用系統(tǒng)的登錄界面。然后通過如下的方式把用戶名/密碼傳遞過去。

      -不能做任何改動的客戶端 - WIN消息(給登錄窗口發(fā)送用戶名,密碼等登錄所需要的信息),模擬鍵盤(java有模擬鍵盤輸入的API)

      -可以做改動的客戶端 - 參數(shù)傳遞,并讓登錄的EXE文件讀取參數(shù)進(jìn)行認(rèn)證。

      因?yàn)橐孉PPLET執(zhí)行本地的EXE文件,所以必須對IE中的JRE的安全進(jìn)行設(shè)置。

    對IE中的JRE的安全進(jìn)行設(shè)置

    其他:

      在采用以上方式實(shí)現(xiàn)了SSO后,要注意LOGOUT,可采用與LOGIN相同的方式。也可以通過被集成系統(tǒng)的超時(shí)設(shè)置來實(shí)現(xiàn)。

    單點(diǎn)登錄SSO技術(shù)資料收集

    posted @ 2006-11-16 00:23 john 閱讀(747) | 評論 (0)編輯 收藏

    UUID

    對UUID幾乎沒有了解,google了一下,才知道是128位整數(shù)(16字節(jié))的全局唯一標(biāo)識符(Universally Unique Identifier)。
    UUID是指在一臺機(jī)器上生成的數(shù)字,它保證對在同一時(shí)空中的所有機(jī)器都是唯一的。通常平臺會提供生成UUID的API。UUID按照開放軟件基金會(OSF)制定的標(biāo)準(zhǔn)計(jì)算,用到了以太網(wǎng)卡地址、納秒級時(shí)間、芯片ID碼和許多可能的數(shù)字。由以下幾部分的組合:當(dāng)前日期和時(shí)間(UUID的第一個(gè)部分與時(shí)間有關(guān),如果你在生成一個(gè)UUID之后,過幾秒又生成一個(gè)UUID,則第一個(gè)部分不同,其余相同),時(shí)鐘序列,全局唯一的IEEE機(jī)器識別號(如果有網(wǎng)卡,從網(wǎng)卡獲得,沒有網(wǎng)卡以其他方式獲得),UUID的唯一缺陷在于生成的結(jié)果串會比較長。關(guān)于UUID這個(gè)標(biāo)準(zhǔn)使用最普遍的是微軟的GUID(Globals Unique Identifiers)。
    在ColdFusion中可以用CreateUUID()函數(shù)很簡單的生成UUID,其格式為:xxxxxxxx-xxxx-xxxx-xxxxxxxxxxxxxxxx(8-4-4-16),其中每個(gè) x 是 0-9 或 a-f 范圍內(nèi)的一個(gè)十六進(jìn)制的數(shù)字。而標(biāo)準(zhǔn)的UUID格式為:xxxxxxxx-xxxx-xxxx-xxxxxx-xxxxxxxxxx (8-4-4-4-12)
    ,可以從cflib?下載CreateGUID() UDF進(jìn)行轉(zhuǎn)換。
    使用UUID的好處在分布式的軟件系統(tǒng)中(比如:DCE/RPC, COM+,CORBA)就能體現(xiàn)出來,它能保證每個(gè)節(jié)點(diǎn)所生成的標(biāo)識都不會重復(fù),并且隨著WEB服務(wù)等整合技術(shù)的發(fā)展,UUID的優(yōu)勢將更加明顯。
    關(guān)于UUID的更多信息可以多google?一下。

    posted @ 2006-11-16 00:18 john 閱讀(529) | 評論 (0)編輯 收藏

    Oracle9i 2.0.4在Red Hat Enterprise Linux AS 3上的安裝

    Oracle9i 2.0.4在Red Hat Enterprise Linux AS 3上的安裝

    Oracle9i 2.0.4在Red Hat Enterprise Linux AS 3上的安裝

    (我測試了兩遍都OK)

    1、確認(rèn)安裝了以下軟件包
       [oracle@Gledeson oracle]$ rpm -qa | grep openmotif
       openmotif21-2.1.30-8
       openmotif-devel-2.2.3-3.RHEL3
       openmotif-2.2.3-3.RHEL3
       [oracle@Gledeson oracle]$ rpm -qa |grep setarch
       setarch-1.3-1
       [oracle@Gledeson oracle]$ rpm -qa|grep compat
       compat-gcc-c++-7.3-2.96.128
       compat-glibc-7.x-2.2.4.32.6
       compat-slang-1.4.5-5
       compat-pwdb-0.62-3
       compat-libstdc++-devel-7.3-2.96.128
       compat-db-4.0.14-5
       compat-gcc-7.3-2.96.128
       compat-libstdc++-7.3-2.96.128

    2、建立Oracle帳號
       groupadd dba
       groupadd oinstall
       useradd -c "Oracle software owner" -g oinstall -G dba oracle
       passwd oracle

    3、建立文件目錄
       su root
       mkdir /u01
       mkdir /u01/oracle
       mkdir /u01/oracle/product
       mkdir /u01/oracle/product/9.2.0
       chown -R oracle.oinstall /u01/oracle
       mkdir /var/opt/oracle
       chown oracle.dba /var/opt/oracle
       chmod 755 /var/opt/oracle

    4、設(shè)置環(huán)境變量
       用Oracle帳號執(zhí)行下列命令:(或直接copy到.bash_profile文件中)
     # Set the LD_ASSUME_KERNEL environment variable only for Red Hat 9,
     # RHEL AS 3, and RHEL AS 4 !!
     # Use the "Linuxthreads with floating stacks" implementation instead of NPTL:
     #export LD_ASSUME_KERNEL=2.4.1    # for RH 9 and RHEL AS 3
     #export LD_ASSUME_KERNEL=2.4.19   # for RHEL AS 4
     export LD_ASSUME_KERNEL=2.4.1
     export ORACLE_BASE=/u01/oracle
     export ORACLE_HOME=$ORACLE_BASE/product/9.2.0
     export ORACLE_SID=ORADB01
     export ORACLE_TERM=xterm
     export ORA_NLS33=$ORACLE_HOME/ocommon/nls/admin/data
     LD_LIBRARY_PATH=$ORACLE_HOME/lib:/lib:/usr/lib
     LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib
     export LD_LIBRARY_PATH
     # Set shell search paths
     export PATH=$PATH:$ORACLE_HOME/bin
           保存后退出. 執(zhí)行: source .bash_profile
               然后。退出登錄,再次進(jìn)入,這時(shí)候oracle的環(huán)境就已經(jīng)生效了

    5、設(shè)置內(nèi)核參數(shù)
    su root
       修改 /etc/sysctl.conf 這個(gè)文件,加入以下的語句:
    kernel.shmmax = 2147483648
    kernel.shmmni = 4096 
    kernel.shmall = 2097152 
    kernel.sem = 250 32000 100 128 
    fs.file-max = 65536 
    net.ipv4.ip_local_port_range = 1024 65000 

    參數(shù)說明:
                     sem  4個(gè)參數(shù)依次為SEMMSL(每個(gè)用戶擁有信號量最大數(shù));
          SEMMNS(系統(tǒng)信號量最大數(shù));
           SEMOPM(每次semopm系統(tǒng)調(diào)用操作數(shù));
          SEMMNI(系統(tǒng)辛苦量集數(shù)最大數(shù)).
                     Shmmax 最大共享內(nèi)存2GB 物理內(nèi)存如果小的話可以設(shè)置成 536870912.
          Shmmni  最小共享內(nèi)存 4096KB.
          Shmall   所有內(nèi)存大小.

    6、安裝補(bǔ)丁
    (ORACLE9i 9204版,只需在運(yùn)行runInstall前打p3006854_9204_LINUX.zip 補(bǔ)丁即可,
    其他補(bǔ)丁不用再打)
       安裝補(bǔ)丁前,卻換到root用戶的控制臺,打補(bǔ)丁前執(zhí)行以下語句:
    su root
    mv /usr/bin/gcc   /usr/bin/gcc323
    ln -s /usr/bin/gcc296   /usr/bin/gcc
    mv /usr/bin/g++296   /usr/bin/g++
    ln -s /usr/bin/g++ /usr/bin/g++296

    [root@localhost /]# sh rhel3_pre_install.sh
    Applying patch...
    Ensuring permissions are correctly set...
    Done.
    Patch successfully applied

    7、解壓文件
      zcat ship_9204_linux_disk1.cpio | cpio -idmv
      zcat ship_9204_linux_disk2.cpio | cpio -idmv
      zcat ship_9204_linux_disk3.cpio | cpio -idmv
     
      這時(shí)生成三個(gè)目錄:Disk1、Disk2、Disk3

    8、cd到Disk1中
      cd /Disk1
      ./runInstall.sh

    posted @ 2006-02-09 23:22 john 閱讀(433) | 評論 (0)編輯 收藏

    對String的深刻理解

    對String的深刻理解

    剛開始玩java,對其String類,使用有些感觸;

    1、"abc"與new String("abc");
        經(jīng)常會問到的面試題:String s = new String("abc");創(chuàng)建了幾個(gè)String Object?【如這里創(chuàng)建了多少對象? 和一道小小的面試題 】

        這個(gè)問題比較簡單,涉及的知識點(diǎn)包括:

    引用變量與對象的區(qū)別;
    字符串文字"abc"是一個(gè)String對象;
    文字池[pool of literal strings]和堆[heap]中的字符串對象。
        一、引用變量與對象:除了一些早期的Java書籍和現(xiàn)在的垃圾書籍,人們都可以從中比較清楚地學(xué)習(xí)到兩者的區(qū)別。A aa;語句聲明一個(gè)類A的引用變量aa[我常常稱之為句柄],而對象一般通過new創(chuàng)建。所以題目中s僅僅是一個(gè)引用變量,它不是對象。[ref 句柄、引用與對象]

        二、Java中所有的字符串文字[字符串常量]都是一個(gè)String的對象。有人[特別是C程序員]在一些場合喜歡把字符串"當(dāng)作/看成"字符數(shù)組,這也沒有辦法,因?yàn)樽址c字符數(shù)組存在一些內(nèi)在的聯(lián)系。事實(shí)上,它與字符數(shù)組是兩種完全不同的對象。

            System.out.println("Hello".length());
            char[] cc={'H','i'};
            System.out.println(cc.length);

        三、字符串對象的創(chuàng)建:由于字符串對象的大量使用[它是一個(gè)對象,一般而言對象總是在heap分配內(nèi)存],Java中為了節(jié)省內(nèi)存空間和運(yùn)行時(shí)間[如比較字符串時(shí),==比equals()快],在編譯階段就把所有的字符串文字放到一個(gè)文字池[pool of literal strings]中,而運(yùn)行時(shí)文字池成為常量池的一部分。文字池的好處,就是該池中所有相同的字符串常量被合并,只占用一個(gè)空間。我們知道,對兩個(gè)引用變量,使用==判斷它們的值[引用]是否相等,即指向同一個(gè)對象:

    String s1 = "abc" ;
    String s2 = "abc" ;
    if( s1 == s2 )
        System.out.println("s1,s2 refer to the same object");
    else     System.out.println("trouble");



        這里的輸出顯示,兩個(gè)字符串文字保存為一個(gè)對象。就是說,上面的代碼只在pool中創(chuàng)建了一個(gè)String對象。

        現(xiàn)在看String s = new String("abc");語句,這里"abc"本身就是pool中的一個(gè)對象,而在運(yùn)行時(shí)執(zhí)行new String()時(shí),將pool中的對象復(fù)制一份放到heap中,并且把heap中的這個(gè)對象的引用交給s持有。ok,這條語句就創(chuàng)建了2個(gè)String對象。

    String s1 = new String("abc") ;
    String s2 = new String("abc") ;
    if( s1 == s2 ){ //不會執(zhí)行的語句}



        這時(shí)用==判斷就可知,雖然兩個(gè)對象的"內(nèi)容"相同[equals()判斷],但兩個(gè)引用變量所持有的引用不同,

        BTW:上面的代碼創(chuàng)建了幾個(gè)String Object? [三個(gè),pool中一個(gè),heap中2個(gè)。]
        [Java2 認(rèn)證考試學(xué)習(xí)指南 (第4版)( 英文版)p197-199有圖解。]


    2、字符串的+運(yùn)算和字符串轉(zhuǎn)換
        字符串轉(zhuǎn)換和串接是很基礎(chǔ)的內(nèi)容,因此我以為這個(gè)問題簡直就是送分題。事實(shí)上,我自己就答錯(cuò)了。

    String str = new String("jf"); // jf是接分
    str = 1+2+str+3+4;
    一共創(chuàng)建了多少String的對象?[我開始的答案:5個(gè)。jf、new、3jf、3jf3、3jf34]

        首先看JLS的有關(guān)論述:

        一、字符串轉(zhuǎn)換的環(huán)境[JLS 5.4 String Conversion]

        字符串轉(zhuǎn)換環(huán)境僅僅指使用雙元的+運(yùn)算符的情況,其中一個(gè)操作數(shù)是一個(gè)String對象。在這一特定情形下,另一操作數(shù)轉(zhuǎn)換成String,表達(dá)式的結(jié)果是這兩個(gè)String的串接。

        二、串接運(yùn)算符[JLS 15.18.1 String Concatenation Operator + ]

        如果一個(gè)操作數(shù)/表達(dá)式是String類型,則另一個(gè)操作數(shù)在運(yùn)行時(shí)轉(zhuǎn)換成一個(gè)String對象,并兩者串接。此時(shí),任何類型都可以轉(zhuǎn)換成String。[這里,我漏掉了"3"和"4"]

    如果是基本數(shù)據(jù)類型,則如同首先轉(zhuǎn)換成其包裝類對象,如int x視為轉(zhuǎn)換成Integer(x)。
    現(xiàn)在就全部統(tǒng)一到引用類型向String的轉(zhuǎn)換了。這種轉(zhuǎn)換如同[as if]調(diào)用該對象的無參數(shù)toString方法。[如果是null則轉(zhuǎn)換成"null"]。因?yàn)閠oString方法在Object中定義,故所有的類都有該方法,而且Boolean, Character, Integer, Long, Float, Double, and String改寫了該方法。
    關(guān)于+是串接還是加法,由操作數(shù)決定。1+2+str+3+4 就很容易知道是"3jf34"。[BTW :在JLS的15.18.1.3中舉的一個(gè)jocular little example,真的很無趣。]
        下面的例子測試了改寫toString方法的情況.。

    class A{
        int i = 10;
        public static void main(String []args){
            String str = new String("jf");
            str += new A();
            System.out.print(str);
        }

        public String toString(){
            return " a.i ="+i+"\n";
        }
    }



    三、字符串轉(zhuǎn)換的優(yōu)化

    按照上述說法,str = 1+2+str+3+4;語句似乎應(yīng)該就應(yīng)該生成5個(gè)String對象:

    1+2 =3,then 3→Integer(3)→"3" in pool? [假設(shè)如此]
    "3"+str(in heap) = "3jf"     (in heap)
    "3jf" +3 ,first 3→Integer(3)→"3" in pool? [則不創(chuàng)建] then "3jf3"
    "3jf3"+4 create "4"  in pool
    then "3jf34"

        這里我并不清楚3、4轉(zhuǎn)換成字符串后是否在池中,所以上述結(jié)果仍然是猜測。

        為了減少創(chuàng)建中間過渡性的字符串對象,提高反復(fù)進(jìn)行串接運(yùn)算時(shí)的性能,a Java compiler可以使用StringBuffer或者類似的技術(shù),或者把轉(zhuǎn)換與串接合并成一步。例如:對于 a + b + c ,Java編譯器就可以將它視為[as if]

        new StringBuffer().append(a).append(b).append(c).toString();

        注意,對于基本類型和引用類型,在append(a)過程中仍然要先將參數(shù)轉(zhuǎn)換,從這個(gè)觀點(diǎn)看,str = 1+2+str+3+4;創(chuàng)建的字符串可能是"3"、"4"和"3jf34"[以及一個(gè)StringBuffer對象]。

        現(xiàn)在我仍然不知道怎么回答str = 1+2+str+3+4;創(chuàng)建了多少String的對象,。或許,這個(gè)問題不需要過于研究,至少SCJP不會考它。

    3、這又不同:str = "3"+"jf"+"3"+"4";
        如果是一個(gè)完全由字符串文字組成的表達(dá)式,則在編譯時(shí),已經(jīng)被優(yōu)化而不會在運(yùn)行時(shí)創(chuàng)建中間字符串。測試代碼如下:

    String str1 ="3jf34";
            String str2 ="3"+"jf"+"3"+"4";
            if(str1 == str2) {
                System.out.println("str1 == str2");
            }else {
                System.out.println("think again");
            }
            if(str2.equals(str1))
                System.out.println("yet str2.equals(str1)");



        可見,str1與str2指向同一個(gè)對象,這個(gè)對象在pool中。所有遵循Java Language Spec的編譯器都必須在編譯時(shí)對constant expressions 進(jìn)行簡化。JLS規(guī)定:Strings computed by constant expressions (&yacute;15.28) are computed at compile time and then treated as if they were literals.

        對于String str2 ="3"+"jf"+"3"+"4";我們說僅僅創(chuàng)建一個(gè)對象。注意,“創(chuàng)建多少對象”的討論是說運(yùn)行時(shí)創(chuàng)建多少對象。

        BTW:編譯時(shí)優(yōu)化

        String x = "aaa " + "bbb ";
        if (false) {
            x = x + "ccc ";
        }
        x +=  "ddd ";

        等價(jià)于:

        String x = "aaa bbb ";
        x = x + "ddd ";



    4、不變類
        String對象是不可改變的(immutable)。有人對str = 1+2+str+3+4;語句提出疑問,怎么str的內(nèi)容可以改變?其實(shí)仍然是因?yàn)椴磺宄阂米兞颗c對象的區(qū)別。str僅僅是引用變量,它的值——它持有的引用可以改變。你不停地創(chuàng)建新對象,我就不斷地改變指向。[參考TIJ的Read-only classes。]

        不變類的關(guān)鍵是,對于對象的所有操作都不可能改變原來的對象[只要需要,就返回一個(gè)改變了的新對象]。這就保證了對象不可改變。為什么要將一個(gè)類設(shè)計(jì)成不變類?有一個(gè)OOD設(shè)計(jì)的原則:Law of Demeter。其廣義解讀是:

        使用不變類。只要有可能,類應(yīng)當(dāng)設(shè)計(jì)為不變類。

    posted @ 2006-02-07 22:29 john 閱讀(347) | 評論 (1)編輯 收藏

    tomcat 配置

     

    1、tomcat下配置虛擬目錄

       打開TOMCAT文件下的conf\server.xml文件 ,查找到<ContextManager>標(biāo)簽,并在該標(biāo)簽的結(jié)束標(biāo)簽</ContextManager>前面加上:

       <Context path="虛擬目錄" docBase="硬盤目錄" debug="0" reloadable="true" crossContext="true"/>  

       其中path的值是虛擬目錄,docbase的值是你的硬盤的的目錄的絕對路徑。

       如找不到<ContextManager>元素,可以找

          <Host name="localhost" debug="0" appBase="webapps"
           unpackWARs="true" autoDeploy="true"
           xmlValidation="false" xmlNamespaceAware="false">

       然后添加<Context path="虛擬目錄" docBase="硬盤目錄" debug="0" reloadable="true" crossContext="true"/>  

    2、禁止tomcat目錄瀏覽,將listings設(shè)為false

        <servlet>
            <servlet-name>default</servlet-name>
            <servlet-class>
              org.apache.catalina.servlets.DefaultServlet
            </servlet-class>
            <init-param>
                <param-name>debug</param-name>
                <param-value>0</param-value>
            </init-param>
            <init-param>
                <param-name>listings</param-name>
                <param-value>false</param-value>
            </init-param>
            <load-on-startup>1</load-on-startup>
        </servlet>

    3、設(shè)置友好錯(cuò)誤頁面,配置web.xml

       <error-page>
          <error-code>404</error-code>
          <location>/error.jsp</location>
       </error-page>
       <error-page>
          <error-code>500</error-code>
          <location>/error.jsp</location>
       </error-page>

    4、在IE中直接打開其他擴(kuò)展名的文件

       為了讓能在IE瀏覽器中自動打開其他擴(kuò)展文件名的文件的設(shè)置:
       需要在WEB.XML中進(jìn)行如下的設(shè)置:
       在WEB.XML中添加<mime-mapping>,其中: 
          <extension>: 文件的擴(kuò)展名 
          <mime-type>: 除了該類型文件的可執(zhí)行文件,同WINDOW注冊表中的 
     /HKEY_CLASSES_ROOT下該類文件的Content Type 的值一樣.

    如能在IE中自動打開DOC,XLS,PDF文件的配置如下:

    <?xml version="1.0" ?>
    <!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 1.2//EN"  "<web-app>
       <mime-mapping>
          <extension>doc</extension>
          <mime-type>application/msword</mime-type>
       </mime-mapping>

       <mime-mapping>
          <extension>xls</extension>
          <mime-type>application/msexcel</mime-type>
       </mime-mapping>

       <mime-mapping>
          <extension>pdf</extension>
          <mime-type>application/pdf</mime-type>
       </mime-mapping>
    </web-app>

    posted @ 2006-01-02 22:36 john 閱讀(240) | 評論 (0)編輯 收藏

    創(chuàng)建從MS SQLServer 采用創(chuàng)建鏈接服務(wù)器以訪問 Oracle 數(shù)據(jù)庫實(shí)例的步驟

    1. 確保運(yùn)行 SQL Server 的服務(wù)器上的 Oracle 客戶端軟件已達(dá)到提供程序所要求的級別。用于 Oracle 的 Microsoft OLE DB 提供程序要求 Oracle 客戶端軟件支持文件的版本為 7.3.3.4.0 或更高版本,并且 SQL*Net 的版本為 2.3.3.0.4。

    2. 在運(yùn)行 SQL Server 的服務(wù)器上創(chuàng)建指向 Oracle 數(shù)據(jù)庫實(shí)例的 SQL*Net 別名。有關(guān)更多信息,請參見 Oracle 文檔。

    3. 執(zhí)行 sp_addlinkedserver 創(chuàng)建鏈接服務(wù)器,指定 MSDAORAprovider_name,指定用于 Oracle 數(shù)據(jù)庫實(shí)例的 SQL*Net 別名為 data_ source

      以下示例假設(shè)已將一個(gè) SQL*Net 別名定義為 OracleDB

      sp_addlinkedserver 'OrclDB', 'Oracle', 'MSDAORA', 'OracleDB'
      
    4. 使用 sp_addlinkedsrvlogin 創(chuàng)建從 SQL Server 登錄到 Oracle 登錄的登錄映射。

      以下示例通過 Oracle 登錄名 OrclUsr 和密碼 OrclPwd 將 SQL Server 登錄 Joe 映射到步驟 3 中定義的鏈接服務(wù)器:

      sp_addlinkedsrvlogin 'OrclDB', false, 'Joe', 'OrclUsr', 'OrclPwd'
      
    5. 每個(gè) Oracle 數(shù)據(jù)庫實(shí)例僅有一個(gè)名稱為空的目錄。Oracle 鏈接服務(wù)器中的表必須使用四部分名稱格式 OracleLinkedServerName..OwnerUserName.TableName 進(jìn)行引用。例如,以下 SELECT 語句引用 Oracle 用戶 MARY 在 OrclDB 鏈接服務(wù)器映射的服務(wù)器上所擁有的表 SALES。

      SELECT *
      FROM OrclDB..MARY.SALES
    6. 注意需要 修改 注冊表 :對于win2k/oracle 8i ,修改的內(nèi)容為:
    7. [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSDTC\MTxOCI]
      "OracleXaLib"="oraclient8.dll"
      "OracleSqlLib"="orasql8.dll"
      "OracleOciLib"="oci.dll"
    8. 其它事項(xiàng):啟動mstdc服務(wù)
     
    Google

    posted @ 2005-10-12 16:36 john 閱讀(1061) | 評論 (0)編輯 收藏

    主站蜘蛛池模板: 一区二区三区免费精品视频| 亚洲伊人久久综合影院| 全免费a级毛片免费看无码| 亚洲女人影院想要爱| **实干一级毛片aa免费| 亚洲日韩涩涩成人午夜私人影院| 国产亚洲精品免费| 成人性生交大片免费看无遮挡| 亚洲乳大丰满中文字幕| 亚洲高清毛片一区二区| 2021国内精品久久久久精免费| 亚洲一区二区三区日本久久九| xxxxx做受大片视频免费| 亚洲欧洲国产成人综合在线观看| 亚洲欧美日韩自偷自拍| 国产成人精品免费午夜app| 亚洲人成网站在线观看播放青青| 中文在线观看免费网站| 亚洲国产精品VA在线观看麻豆 | 国产伦精品一区二区三区免费迷| 亚洲AV成人精品一区二区三区| 日本三级2019在线观看免费| 久久精品国产96精品亚洲| 亚洲视频在线观看免费| 亚洲国产第一站精品蜜芽| 亚洲免费视频网站| 亚洲午夜一区二区电影院| 夭天干天天做天天免费看| 美女一级毛片免费观看| 亚洲中文久久精品无码| 少妇无码一区二区三区免费| 亚洲国产精品久久人人爱| 成年在线网站免费观看无广告| 久久亚洲精品高潮综合色a片| 亚洲精品第一国产综合境外资源| 99久久免费国产精品热| 亚洲综合激情九月婷婷| 精品一区二区三区无码免费视频 | 日本免费污片中国特一级| 亚洲香蕉网久久综合影视 | 四虎精品亚洲一区二区三区|